From 46f10b45ad181a00e8cfa3ba2540f2922e1553cd Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 18 Nov 2013 23:38:44 +0100 Subject: [PATCH] raylib basic folders structure and some files... ;) --- .gitattributes | 22 - .gitignore | 269 +- CHANGELOG | 17 + HELPME | 39 + LICENSE | 30 + README | 115 +- ROADMAP | 22 + examples/ex01_basic_window.c | 50 + examples/ex01_basic_window.png | Bin 0 -> 10297 bytes examples/ex02a_logo_raylib.c | 54 + examples/ex02a_logo_raylib.png | Bin 0 -> 12676 bytes examples/ex02b_shapes.c | 73 + examples/ex02c_color_palette.c | 95 + examples/ex02c_color_palette.png | Bin 0 -> 18166 bytes examples/ex03a_input_keys.c | 57 + examples/ex03a_input_keys.png | Bin 0 -> 10379 bytes examples/ex03b_input_mouse.c | 63 + examples/ex03b_input_mouse.png | Bin 0 -> 10644 bytes examples/ex03c_input_gamepad.c | 67 + examples/ex03c_input_gamepad.png | Bin 0 -> 10840 bytes examples/ex04a_textures.c | 57 + examples/ex04a_textures.png | Bin 0 -> 15442 bytes examples/resources/catsham.png | Bin 0 -> 315813 bytes examples/resources/catwhite.png | Bin 0 -> 308798 bytes examples/resources/coin.wav | Bin 0 -> 4776 bytes examples/resources/raylib_logo.png | Bin 0 -> 3760 bytes examples/resources/spring.wav | Bin 0 -> 10850 bytes external/glfw3/include/GLFW/glfw3.h | 2269 ++++++++ external/glfw3/lib/libglfw3.a | Bin 0 -> 81850 bytes external/openal_soft/include/AL/al.h | 656 +++ external/openal_soft/include/AL/alc.h | 237 + external/openal_soft/include/AL/alext.h | 355 ++ .../openal_soft/include/AL/efx-creative.h | 3 + external/openal_soft/include/AL/efx-presets.h | 402 ++ external/openal_soft/include/AL/efx.h | 761 +++ external/openal_soft/lib/libopenal32.a | Bin 0 -> 95688 bytes external/openal_soft/openal32.dll | Bin 0 -> 402553 bytes fonts/coming_soon | 0 logo/logo128x128.png | Bin 0 -> 1868 bytes logo/logo16x16.png | Bin 0 -> 293 bytes logo/logo24x24.png | Bin 0 -> 383 bytes logo/logo256x256.png | Bin 0 -> 3760 bytes logo/logo32x32.png | Bin 0 -> 552 bytes logo/logo48x4.png | Bin 0 -> 922 bytes logo/logo64x64.png | Bin 0 -> 1091 bytes logo/raylib.ico | Bin 0 -> 105907 bytes src/audio.c | 306 + src/core.c | 582 ++ src/models.c | 819 +++ src/raylib.h | 376 ++ src/shapes.c | 326 ++ src/stb_image.c | 4341 ++++++++++++++ src/stb_image.h | 334 ++ src/stb_vorbis.c | 5039 +++++++++++++++++ src/stb_vorbis.h | 352 ++ src/text.c | 515 ++ src/textures.c | 275 + src/vector3.c | 140 + src/vector3.h | 57 + 59 files changed, 18943 insertions(+), 232 deletions(-) delete mode 100644 .gitattributes create mode 100644 CHANGELOG create mode 100644 HELPME create mode 100644 LICENSE create mode 100644 ROADMAP create mode 100644 examples/ex01_basic_window.c create mode 100644 examples/ex01_basic_window.png create mode 100644 examples/ex02a_logo_raylib.c create mode 100644 examples/ex02a_logo_raylib.png create mode 100644 examples/ex02b_shapes.c create mode 100644 examples/ex02c_color_palette.c create mode 100644 examples/ex02c_color_palette.png create mode 100644 examples/ex03a_input_keys.c create mode 100644 examples/ex03a_input_keys.png create mode 100644 examples/ex03b_input_mouse.c create mode 100644 examples/ex03b_input_mouse.png create mode 100644 examples/ex03c_input_gamepad.c create mode 100644 examples/ex03c_input_gamepad.png create mode 100644 examples/ex04a_textures.c create mode 100644 examples/ex04a_textures.png create mode 100644 examples/resources/catsham.png create mode 100644 examples/resources/catwhite.png create mode 100644 examples/resources/coin.wav create mode 100644 examples/resources/raylib_logo.png create mode 100644 examples/resources/spring.wav create mode 100644 external/glfw3/include/GLFW/glfw3.h create mode 100644 external/glfw3/lib/libglfw3.a create mode 100644 external/openal_soft/include/AL/al.h create mode 100644 external/openal_soft/include/AL/alc.h create mode 100644 external/openal_soft/include/AL/alext.h create mode 100644 external/openal_soft/include/AL/efx-creative.h create mode 100644 external/openal_soft/include/AL/efx-presets.h create mode 100644 external/openal_soft/include/AL/efx.h create mode 100644 external/openal_soft/lib/libopenal32.a create mode 100644 external/openal_soft/openal32.dll create mode 100644 fonts/coming_soon create mode 100644 logo/logo128x128.png create mode 100644 logo/logo16x16.png create mode 100644 logo/logo24x24.png create mode 100644 logo/logo256x256.png create mode 100644 logo/logo32x32.png create mode 100644 logo/logo48x4.png create mode 100644 logo/logo64x64.png create mode 100644 logo/raylib.ico create mode 100644 src/audio.c create mode 100644 src/core.c create mode 100644 src/models.c create mode 100644 src/raylib.h create mode 100644 src/shapes.c create mode 100644 src/stb_image.c create mode 100644 src/stb_image.h create mode 100644 src/stb_vorbis.c create mode 100644 src/stb_vorbis.h create mode 100644 src/text.c create mode 100644 src/textures.c create mode 100644 src/vector3.c create mode 100644 src/vector3.h diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 412eeda78..000000000 --- a/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index b9d6bd92f..75d21c923 100644 --- a/.gitignore +++ b/.gitignore @@ -1,215 +1,66 @@ -################# -## Eclipse -################# +# Ignore generated files +# ... -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath +# Ignore compiled binaries +src/core.o +src/shapes.o +src/textures.o +src/text.o +src/models.o +src/audio.o +src/vector3.o +src/stb_image.o +src/*.exe +examples/*.o +examples/*.exe -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -sql/ -*.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches +# Ignore thumbnails created by windows Thumbs.db -ehthumbs.db -# Folder config file -Desktop.ini +# Ignore files build by Visual Studio +*.obj +*.exe +*.pdb +*.aps +*.vcproj.*.user +*.vcxproj* +*.sln +*.vspscc +*_i.c +*.i +*.icf +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.cache +*.ilk +*.log +[Bb]in +[Dd]ebug/ +[Dd]ebug.win32/ +*.sbr +*.sdf +obj/ +[Rr]elease/ +[Rr]elease.win32/ +_ReSharper*/ +[Tt]est[Rr]esult* +ipch/ +*.opensdf -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Mac crap +# Ignore files build by xcode +*.mode*v* +*.pbxuser +*.xcbkptlist +*.xcscheme +*.xcworkspacedata +*.xcuserstate +*.xccheckout +xcschememanagement.plist .DS_Store - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg +._.* +xcuserdata/ +DerivedData/ \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 000000000..dc47ee53d --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,17 @@ +changelog +--------- + +Current: raylib 1.0 (November 2013) + + +------------------------------------------- +Release: raylib 1.0.0 (18 November 2013) +------------------------------------------- +* Initial version +* 6 Modules provided: + - core: basic window/context creation functions, input management, timming functions + - shapes: basic shapes drawing functions + - textures: image data loading and conversion to OpenGL textures + - text: text drawing, sprite fonts loading, default font loading + - models: basic 3d shapes drawing, OBJ models loading and drawing + - audio: audio device initialization, WAV files loading and playing \ No newline at end of file diff --git a/HELPME b/HELPME new file mode 100644 index 000000000..98d1c7b36 --- /dev/null +++ b/HELPME @@ -0,0 +1,39 @@ +help me! +======== + +I’m working hard on raylib but my resources are quite limited. If you enjoy raylib and want to help / contribute in some way, +please, [let me know][raysan5]. + +The following help is highly appreciated: + + - C programming - Can you write / review / test / improve the code? + - Translators / Localizators - Can you translate raylib to another language? + - Documentation / Tutorials / Example writters - Can you write some tutorial / example? + - Web Development (I need a lot of help with this...) - Can you help with the web? + - Porting to Linux and OSX - Can you compile and test raylib on another OS? + - Testers of current features and multiple systems - Can you find some bug on raylib? + +If you can not help on any of the above points but you still want to contribute in some way... please, consider helping +with a small donation (just some euros...). It will really motivate to continue improving this project (and pay some bills… or some coffee). + +[Donation Page] (www.raylib.com/helpme.htm) + +raylib philosophy +------------------ + + * raylib is a tool to LEARN videogames programming, every single function in raylib should be a tutorial on itself. + * raylib is SIMPLE and EASY-TO-USE, I tried to keep it compact with a small set of functions, if a function is too complex or + has not a clear usefulness, better not to include it. + * raylib is open source and free; educators and institutions can use this tool to TEACH videogames programming completely by free. + * raylib is, hopefully, collaborative; contribution of tutorials / code-examples / bugs-solving / code-comments are highly appreciated. + * raylib's license (and its external libs respective licenses) allow using it for commercial products. + +contact +------- + + * Webpage: [http://www.raylib.com](http://www.raylib.com) + * Twitter: [http://www.twitter.com/raysan5](http://www.twitter.com/raysan5) + * Facebook: [http://www.facebook.com/raylibgames](http://www.facebook.com/raylibgames) + + +[raysan5]: mailto:raysan@raysanweb.com "Ramon Santamaria - Ray San" \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..2b608cecb --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +license +======= + +source code +----------- + +raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, +BSD-like license that allows static linking with closed source software: + +Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) + +This software is provided "as-is", without any express or implied warranty. In no event +will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial +applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you + wrote the original software. If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented + as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + +fonts +------ + +...soon... \ No newline at end of file diff --git a/README b/README index 01b405b1d..62527e270 100644 --- a/README +++ b/README @@ -1,2 +1,115 @@ -It's empy here... \ No newline at end of file + + +raylib +======= + +about +----- + +raylib is a simple and easy-to-use library to learn C videogames programming. + +raylib is highly inspired by Borland BGI graphics lib (more specifically WinBGI) and by XNA framework. +Allegro and SDL have also been analyzed for reference. + +Want to see how easy is making games with raylib? Jump to [code examples!] (http://www.raylib.com/examples.htm) + +history +------- + +I've developed videogames for some years and last year I had to taught videogames development +to young people with artistic profile, most of them had never written a single line of code. + +I started with C language basis and, after searching for the most simple and easy-to-use library to teach +videogames programming, I found WinBGI; it was great and it worked very well with students, in just a +couple of weeks that people that had never written a single line of code were able to program (and understand) +a simple PONG and some of them even a BREAKOUT! + +But WinBGI was not the clearer and most organized lib. There were a lot of things I found useless and +confusing and some function names were not clear enough for most of the students; not to mention points +like no transparencies support or no hardware acceleration. + +So, I decided to create my own lib, hardware accelerated, clear function names, quite organized, well structured, +plain C coding and, the most important, primarily intended to LEARN videogames programming. + +I've coded quite a lot in C# and XNA and I really love it (in fact, my students learn C# with XNA after C), +so, I decided to use C# language notation and XNA naming conventions. That way, students can jump from +raylib to XNA (or MonoGame) extremely easily. + +raylib started as a weekend project and after three months of hard work, here it is the first version. + +Enjoy it. + +features +-------- + + * Written in plain C code (C99) + * Uses C# PascalCase/camelCase notation + * Hardware accelerated using OpenGL 1.1 + * Transparencies support (RGBA Colors) + * Custom color palette for better use on white background + * Basic 3D Support (camera, basic models, OBJ models, etc) + * Powerful Text module with SpriteFonts support + +raylib uses on its core module the outstanding [GLFW3] (http://glfw.org/) library. The best option by far I found for +window/context and input management (clean, focused, great license, well documented, modern, ...). + +raylib is licensed under a zlib/libpng license like GLFW3. View [LICENSE] (link to license file). + +tool requirements +------------------ + +raylib has been developed using exclusively two tools: + + * Notepad++ (text editor) - [http://notepad-plus-plus.org/](http://notepad-plus-plus.org/) + * MinGW (GCC compiler) - [http://www.mingw.org/](http://www.mingw.org/) + +Those are the tools I recommended to develop with raylib, actually, my students develop using this tools. +I believe those are the best tools to train spartan-programmers. + +Someone could argue about debugging. raylib is a library intended for learning and I think C it's a clear enough language +to allow writing small-mid size programs with a printf-based debugging. All raylib examples have also been written this way. + +building +-------- + +raylib could be build with the following command lines (Using GCC compiler): + + cd raylib/src + gcc -c core.c -std=c99 -Wall + gcc -c shapes.c -std=c99 -Wall + gcc -c textures.c -std=c99 -Wall + gcc -c stb_image.c -std=c99 -Wall + gcc -c text.c -std=c99 -Wall + gcc -c models.c -std=c99 -Wall + gcc -c vector3.c -std=c99 -Wall + gcc -c audio.c -std=c99 -Wall + ar rcs raylib.a core.o shapes.o textures.o stb_image.o text.o models.o vector3.o audio.o + +To compile examples, make sure raylib.h is placed in include path and libraries raylib (libraylib.a) and glfw3 (libglfw3.a) +are placed in the libraries path. It's also recommended to link with file icon.o for fancy raylib icon usage. + + cd raylib/src/examples + gcc -o test_code.exe test_code.c icon.o -lraylib -lglfw3 -lopengl32 -lgdi32 -std=c99 -Wl,--subsystem,windows + +contact +------- + + * Webpage: [http://www.raylib.com](http://www.raylib.com) + * Twitter: [http://www.twitter.com/raysan5](http://www.twitter.com/raysan5) + * Facebook: [http://www.facebook.com/raylibgames](http://www.facebook.com/raylibgames) + +If you are using raylib and you enjoy it, please, [let me know][raysan5]. + +If you feel you can help, then, [helpme!] (http://www.raylib.com/helpme.htm) + +acknowledgments +--------------- + +The following people have contributed in some way to make raylib project a reality. Big thanks to them! + + - Zopokx + - Elendow + + +[raysan5]: mailto:raysan@raysanweb.com "Ramon Santamaria - Ray San" \ No newline at end of file diff --git a/ROADMAP b/ROADMAP new file mode 100644 index 000000000..dc22e5640 --- /dev/null +++ b/ROADMAP @@ -0,0 +1,22 @@ +roadmap +======= + +First version of raylib is quite complete and functional but there is still a lot of things I would like to improve. +Here it is a list of features I would like to add and functions to improve. + +Around the source code there are some TODO points with pending revisions/bugs and ere it is a list of features I would like to add. + +raylib v1.x + + - Review Billboard Drawing functions + - Review Heightmap Loading and Drawing functions + - Lighting support (only 3d mode) - CreateLight() + - Simple Collision Detection functions - CheckCollisionRects(), CheckCollisionCircles() + - Default scene Camera controls (zoom, pan, rotate) + - Basic Procedural Texture / Image generation (Gradient, Checked, Spot, Noise, Cellular) + - Software mipmapping generation and POT conversion (custom implementation) + - Comments / Functions translation (?) + +Any feature missing? Do you have a request? [Let me know!][raysan5] + +[raysan5]: mailto:raysan@raysanweb.com "Ramon Santamaria - Ray San" \ No newline at end of file diff --git a/examples/ex01_basic_window.c b/examples/ex01_basic_window.c new file mode 100644 index 000000000..7b40bbd05 --- /dev/null +++ b/examples/ex01_basic_window.c @@ -0,0 +1,50 @@ +/******************************************************************************************* +* +* raylib example 01 - Basic Window +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + int screenWidth = 800; + int screenHeight = 450; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 01a - basic window"); // Window and context initialization + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + // TODO: Update your variables here + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("Congrats! You created your first window!", 190, 200, 20, 1, LIGHTGRAY); + + EndDrawing(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //---------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/ex01_basic_window.png b/examples/ex01_basic_window.png new file mode 100644 index 0000000000000000000000000000000000000000..346184417a436343a769ba38a9ad9cfda0195181 GIT binary patch literal 10297 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 literal 0 HcmV?d00001 diff --git a/examples/ex02b_shapes.c b/examples/ex02b_shapes.c new file mode 100644 index 000000000..93a0bccdc --- /dev/null +++ b/examples/ex02b_shapes.c @@ -0,0 +1,73 @@ +/******************************************************************************************* +* +* raylib example 02b - Draw basic shapes 2d (rectangle, circle, line...) +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + int screenWidth = 800; + int screenHeight = 450; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 02b - basic shapes drawing"); // Window and context initialization + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + // TODO: Update your variables here + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + // TODO: draw some shapes... with names... :P +/* + void DrawPixel(int posX, int posY, Color color); // Draw a pixel + void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) + void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line + void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version) + void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle + void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle + void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) + void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline + void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle + void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle + void DrawRectangleGradient(int posX, int posY, int width, int height, Color color1, Color color2); // Draw a gradient-filled rectangle + void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) + void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline + void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle + void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline + void DrawPoly(Vector2 *points, int numPoints, Color color); // Draw a closed polygon defined by points + void DrawPolyLine(Vector2 *points, int numPoints, Color color); // Draw polygon lines +*/ + DrawRectangle(screenWidth/4 - 50, screenHeight/2 - 100, 100, 100, GOLD); + DrawCircle(3*screenWidth/4, screenHeight/2 - 50, 50, MAROON); + + DrawText("_____", 320, 280, 50, 1, BLACK); + + EndDrawing(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //---------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/ex02c_color_palette.c b/examples/ex02c_color_palette.c new file mode 100644 index 000000000..3a7352952 --- /dev/null +++ b/examples/ex02c_color_palette.c @@ -0,0 +1,95 @@ +/******************************************************************************************* +* +* raylib example 02c - Draw raylib custom color palette +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + int screenWidth = 800; + int screenHeight = 450; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 02c - raylib color palette"); // Window and context initialization + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + // TODO: Update your variables here + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("raylib color palette", 28, 42, 20, 2, BLACK); + + DrawRectangle(26, 80, 100, 100, DARKGRAY); + DrawRectangle(26, 188, 100, 100, GRAY); + DrawRectangle(26, 296, 100, 100, LIGHTGRAY); + DrawRectangle(134, 80, 100, 100, MAROON); + DrawRectangle(134, 188, 100, 100, RED); + DrawRectangle(134, 296, 100, 100, PINK); + DrawRectangle(242, 80, 100, 100, ORANGE); + DrawRectangle(242, 188, 100, 100, GOLD); + DrawRectangle(242, 296, 100, 100, YELLOW); + DrawRectangle(350, 80, 100, 100, DARKGREEN); + DrawRectangle(350, 188, 100, 100, LIME); + DrawRectangle(350, 296, 100, 100, GREEN); + DrawRectangle(458, 80, 100, 100, DARKBLUE); + DrawRectangle(458, 188, 100, 100, BLUE); + DrawRectangle(458, 296, 100, 100, SKYBLUE); + DrawRectangle(566, 80, 100, 100, DARKPURPLE); + DrawRectangle(566, 188, 100, 100, VIOLET); + DrawRectangle(566, 296, 100, 100, PURPLE); + DrawRectangle(674, 80, 100, 100, DARKBROWN); + DrawRectangle(674, 188, 100, 100, BROWN); + DrawRectangle(674, 296, 100, 100, BEIGE); + + + DrawText("DARKGRAY", 57, 166, 10, 2, BLACK); + DrawText("GRAY", 89, 274, 10, 2, BLACK); + DrawText("LIGHTGRAY", 51, 382, 10, 2, BLACK); + DrawText("MAROON", 180, 166, 10, 2, BLACK); + DrawText("RED", 207, 274, 10, 2, BLACK); + DrawText("PINK", 200, 382, 10, 2, BLACK); + DrawText("ORANGE", 290, 166, 10, 2, BLACK); + DrawText("GOLD", 306, 274, 10, 2, BLACK); + DrawText("YELLOW", 290, 382, 10, 2, BLACK); + DrawText("DARKGREEN", 374, 166, 10, 2, BLACK); + DrawText("LIME", 417, 274, 10, 2, BLACK); + DrawText("GREEN", 407, 382, 10, 2, BLACK); + DrawText("DARKBLUE", 491, 166, 10, 2, BLACK); + DrawText("BLUE", 523, 274, 10, 2, BLACK); + DrawText("SKYBLUE", 499, 382, 10, 2, BLACK); + DrawText("DARKPURPLE", 582, 166, 10, 2, BLACK); + DrawText("VIOLET", 617, 274, 10, 2, BLACK); + DrawText("PURPLE", 615, 382, 10, 2, BLACK); + DrawText("DARKBROWN", 695, 166, 10, 2, BLACK); + DrawText("BROWN", 728, 274, 10, 2, BLACK); + DrawText("BEIGE", 733, 382, 10, 2, BLACK); + + EndDrawing(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //---------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/ex02c_color_palette.png b/examples/ex02c_color_palette.png new file mode 100644 index 0000000000000000000000000000000000000000..04583e9a6e4e192df4a7fe994bf96c8e4ba27f49 GIT binary patch literal 18166 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%0AT2_?|SjR;m7Kiwg0oK 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 YwH_u;J1u&cfq{X+)78&qol`;+0L8M^H2?qr literal 0 HcmV?d00001 diff --git a/examples/ex03a_input_keys.c b/examples/ex03a_input_keys.c new file mode 100644 index 000000000..85deb2b4a --- /dev/null +++ b/examples/ex03a_input_keys.c @@ -0,0 +1,57 @@ +/******************************************************************************************* +* +* raylib example 03a - Keyboard input +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + int screenWidth = 800; + int screenHeight = 450; + + Vector2 ballPosition = { screenWidth/2, screenHeight/2 }; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 05 - keyboard input"); // Window and context initialization + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + if (IsKeyPressed(KEY_RIGHT)) ballPosition.x += 0.8; + if (IsKeyPressed(KEY_LEFT)) ballPosition.x -= 0.8; + if (IsKeyPressed(KEY_UP)) ballPosition.y -= 0.8; + if (IsKeyPressed(KEY_DOWN)) ballPosition.y += 0.8; + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("move the ball with arrow keys", 10, 10, 20, 1, DARKGRAY); + + DrawCircleV(ballPosition, 50, MAROON); + + EndDrawing(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //---------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/ex03a_input_keys.png b/examples/ex03a_input_keys.png new file mode 100644 index 0000000000000000000000000000000000000000..483703213145853a070c7a32f4f57e23fb723986 GIT binary patch literal 10379 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 Nc)I$ztaD0e0ssZ%qjCTM literal 0 HcmV?d00001 diff --git a/examples/ex03b_input_mouse.c b/examples/ex03b_input_mouse.c new file mode 100644 index 000000000..996cd73e0 --- /dev/null +++ b/examples/ex03b_input_mouse.c @@ -0,0 +1,63 @@ +/******************************************************************************************* +* +* raylib example 03b - Mouse input +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + int screenWidth = 800; + int screenHeight = 450; + + Vector2 ballPosition = { -100.0, -100.0 }; + int counter = 0; + int mouseX, mouseY; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 06 - mouse input"); // Window and context initialization + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + mouseX = GetMouseX(); + mouseY = GetMouseY(); + + ballPosition.x = (float)mouseX; + ballPosition.y = (float)mouseY; + } + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawCircleV(ballPosition, 40, GOLD); + + DrawText("mouse click to draw the ball", 10, 10, 20, 1, DARKGRAY); + + EndDrawing(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //---------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/ex03b_input_mouse.png b/examples/ex03b_input_mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..765672816d2fc07b845c0715155adca292cad5c5 GIT binary patch literal 10644 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ#=yWJp1k%10|NtNage(c!@6@aFBupZ zSkfJR9T^xl_H+M9WMyDrP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs( z@q#(K0&N%=7^F&EBT9nv(@M${i&7Z^5;OBk^!!{y6v~YCO!W*6-9I~-Gcahp@pN$v zsfc@f_hDc3&Wq~;pYuK6S8V(FcBi_T!R3v!s=e2Qhn_8Mc)&2fddtlxlVjV(TU9NjR}<;z?b3+eR3P^&bVnN&m+>i>K^{$2k6&x#HG|K5i)?)i28 zecbu0rT72tx_kfm-RJv%eGR`}|MhiT?D@s@`+oflec!z5?}uG=62{;V*>JysK~Uj; z$D&uf)zjuNIB?*)X@R9fU93#l|NqB3zusNH|5y3t z@b$kxE-L>1I{d}^efO?*Utf2<_M16-|GfW&_V3nh&aw}G?NM3t?RRx)eE9wUcNgsV zU3I?h@8b8>Tl@e0dHv6zXxq7IjBFAX#~T=a{?u<@u9vmC`}#WWxePy_@Bi{Y^!wL$ z-?#oM*bmnAs&+%va(nyd?Nc_FT?4zvxWL*$E;dL0@3DvP@=eNW|K8<3x0$i%t8d|V zbA{dU->+V;{$6+QYw6eDwbzQLPQUv4-re@Aua}#YDf0vcdUH$ym=k>pxPv5kPW|K%r*w^@xanmnt1$q4q;rr`af4^&e`Rd8{o7eyT zs9k%l{;SfzH`i@{*T&S|+q}O1>z{D(=jrqJTTQ?E+Aiw))%UOOp5On=E@JKF`RD&X ze9SXfk(tM!U>zglr$_sli@u&M{`zR^t_HhVGq@+5zkg&k_piGTD!$DLiwj$??Qrhz zhPay_pXY!RsE?t6nM0WLo?QX!{{6fiGK7`mopEpBLBtu+UCF z%D~JsCwqa7Ls;A1eleKAo)!%geHS6o*&(FKQ`uyIiiM3zm zT&-Jo?)63c{lE6Ddv|^F^UCkPqtQIul?WBxBAuBz2nzSfB!}@p`r078_S9A z|9mH2F>TwGu(#@CtZ!d<{l6FHf~&c|zxsXeZw%w7{rt1T_pY(q@_ydy)$#kQ>epO* zeg64>fugo^6F>>?{DG$ojgM_)&fS>_$!wq;^u`S2>vD%O`IhUSpQVAaH@Fb8I0(v! z^?$F*{olwA2_R4?aWXRH;(Kux8g5_axmn0RhZP!}%uFr~ z90JfX31oE=8w*E{VNU0wZ#WmUq0?Vvo%!huwB8ZtAnY?Cm%+;Q(R$MeTE(DF$k z5l8W-8+c`2ViC+*o-bw!4lErEpz;8wGtHslfY{+Qsf*Q84{PS|L#rF85V( zK@q^z0xQ=OVCDVnOqchWEuRbRpjJ&Vz~Pf=8d>KJc0#RXWUG?KQQjN(zOd~rusa8< zLWFSnM9B56q?$R@+5-;xxT0>E;NIne=Z^n`rUr*YID8VlXocIe;|Ef;rH`%9{)af@!sufwm5T8Wpq*W zeV`arYZ?Ab0kvQ%4mpIHgzQ=8eW`f5%I~!M5-UJ$yB`aglX=~KXT?h)#%TovRL8o zn(|mXo9joXH*V%dl4EDPggJ<4qNzMd(M zaj?03bb4bkvQB=sd!kJ5Yu259uyeX&`ujJRk#*kZ*<;Lf@9�sz*M@)JR%fZeS?< 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 My85}Sb4q9e0E18qcK`qY literal 0 HcmV?d00001 diff --git a/examples/ex04a_textures.c b/examples/ex04a_textures.c new file mode 100644 index 000000000..5c2bf6504 --- /dev/null +++ b/examples/ex04a_textures.c @@ -0,0 +1,57 @@ +/******************************************************************************************* +* +* raylib example 04a - Texture loading and drawing +* +* This example has been created using raylib 1.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + int screenWidth = 800; + int screenHeight = 450; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 04a - texture loading and drawing"); // Window and context initialization + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + Texture2D texture = LoadTexture("resources/raylib_logo.png"); // Texture loading + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + // TODO: Update your variables here + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawTexture(texture, screenWidth/2 - texture.width/2, screenHeight/2 - texture.height/2, WHITE); + + DrawText("this IS a texture!", 360, 370, 10, 1, GRAY); + + EndDrawing(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + UnloadTexture(texture); // Texture unloading + + CloseWindow(); // Close window and OpenGL context + //---------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/ex04a_textures.png b/examples/ex04a_textures.png new file mode 100644 index 0000000000000000000000000000000000000000..c18bf88079bf86f5b1fdb3983a857025e75cc9b3 GIT binary patch literal 15442 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 L^>bP0l+XkKo89tB literal 0 HcmV?d00001 diff --git a/examples/resources/catsham.png b/examples/resources/catsham.png new file mode 100644 index 0000000000000000000000000000000000000000..8d7978e06e6d4ce8d22fbf6125948bc03f58bd47 GIT binary patch literal 315813 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
  • alHKI(qq>$>gQm(6(UG8S0n^R9C4R8#&} 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%0AZegAV)Q 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/resources/catwhite.png b/examples/resources/catwhite.png new file mode 100644 index 0000000000000000000000000000000000000000..b849c4c0787a30f99e16fbd03b334b750cb78d53 GIT binary patch literal 308798 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

      *TJIH_6`f@jv$Rmfqe8XCG%@WII;4so#mE?f5dS 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

      ?|Acp6o?UP{dqcOPZSrBkzq`GfQm@yW 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 literal 0 HcmV?d00001 diff --git a/examples/resources/coin.wav b/examples/resources/coin.wav new file mode 100644 index 0000000000000000000000000000000000000000..6007509bf42e0b4623a13a00160ae1b96db0e784 GIT binary patch literal 4776 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 literal 0 HcmV?d00001 diff --git a/external/glfw3/include/GLFW/glfw3.h b/external/glfw3/include/GLFW/glfw3.h new file mode 100644 index 000000000..c54abde84 --- /dev/null +++ b/external/glfw3/include/GLFW/glfw3.h @@ -0,0 +1,2269 @@ +/************************************************************************* + * GLFW - An OpenGL library + * API version: 3.0 + * WWW: http://www.glfw.org/ + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @defgroup clipboard Clipboard support + */ +/*! @defgroup context Context handling + */ +/*! @defgroup error Error handling + */ +/*! @defgroup gamma Gamma ramp support + */ +/*! @defgroup init Initialization and version information + */ +/*! @defgroup input Input handling + */ +/*! @defgroup monitor Monitor handling + */ +/*! @defgroup time Time input + */ +/*! @defgroup window Window handling + * + * This is the reference documentation for the window handling API, including + * creation, deletion and event polling. For more information, see the + * [article on window handling](@ref window). + */ + + +/************************************************************************* + * Global definitions + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +/* Please report any problems that you find with your compiler, which may + * be solved in this section! There are several compilers that I have not + * been able to test this file with yet. + * + * First: If we are we on Windows, we want a single define for it (_WIN32) + * (Note: For Cygwin the compiler flag -mwin32 should be used, but to + * make sure that things run smoothly for Cygwin users, we add __CYGWIN__ + * to the list of "valid Win32 identifiers", which removes the need for + * -mwin32) + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* In order for extension support to be portable, we need to define an + * OpenGL function call method. We use the keyword APIENTRY, which is + * defined for Win32. (Note: Windows also needs this for ) + */ +#ifndef APIENTRY + #ifdef _WIN32 + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif +#endif /* APIENTRY */ + +/* The following three defines are here solely to make some Windows-based + * files happy. Theoretically we could include , but + * it has the major drawback of severely polluting our namespace. + */ + +/* Under Windows, we need WINGDIAPI defined */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) + /* Microsoft Visual C++, Borland C++ Builder and Pelles C */ + #define WINGDIAPI __declspec(dllimport) + #elif defined(__LCC__) + /* LCC-Win32 */ + #define WINGDIAPI __stdcall + #else + /* Others (e.g. MinGW, Cygwin) */ + #define WINGDIAPI extern + #endif + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some files also need CALLBACK defined */ +#if !defined(CALLBACK) && defined(_WIN32) + #if defined(_MSC_VER) + /* Microsoft Visual C++ */ + #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) + #define CALLBACK __stdcall + #else + #define CALLBACK + #endif + #else + /* Other Windows compilers */ + #define CALLBACK __stdcall + #endif + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Most variants on Windows need wchar_t */ +#if defined(_WIN32) + #include +#endif + + +/* ---------------- GLFW related system specific defines ----------------- */ + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + + /* We are building a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) + +#elif defined(_WIN32) && defined(GLFW_DLL) + + /* We are calling a Win32 DLL */ + #if defined(__LCC__) + #define GLFWAPI extern + #else + #define GLFWAPI __declspec(dllimport) + #endif + +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + + #define GLFWAPI __attribute__((visibility("default"))) + +#else + + /* We are either building/calling a static lib or we are non-win32 */ + #define GLFWAPI + +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + +/* Include the chosen client API headers. + */ +#if defined(__APPLE_CC__) + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif !defined(GLFW_INCLUDE_NONE) + #define GL_GLEXT_LEGACY + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#else + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #elif defined(GLFW_INCLUDE_ES2) + #include + #elif defined(GLFW_INCLUDE_ES3) + #include + #elif !defined(GLFW_INCLUDE_NONE) + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW library. + * + * This is incremented when the API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW library. + * + * This is incremented when features are added to the API but it remains + * backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 0 +/*! @brief The revision number of the GLFW library. + * + * This is incremented when a bug fix release is made that does not contain any + * API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 1 +/*! @} */ + +/*! @name Key and button actions + * @{ */ +/*! @brief The key or button was released. + * @ingroup input + */ +#define GLFW_RELEASE 0 +/*! @brief The key or button was pressed. + * @ingroup input + */ +#define GLFW_PRESS 1 +/*! @brief The key was held down until it repeated. + * @ingroup input + */ +#define GLFW_REPEAT 2 +/*! @} */ + +/*! @defgroup keys Keyboard keys + * + * These key codes are inspired by the *USB HID Usage Tables v1.12* (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup errors Error codes + * @ingroup error + * @{ */ +/*! @brief GLFW has not been initialized. + */ +#define GLFW_NOT_INITIALIZED 0x00010001 +/*! @brief No context is current for this thread. + */ +#define GLFW_NO_CURRENT_CONTEXT 0x00010002 +/*! @brief One of the enum parameters for the function was given an invalid + * enum. + */ +#define GLFW_INVALID_ENUM 0x00010003 +/*! @brief One of the parameters for the function was given an invalid value. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + */ +#define GLFW_OUT_OF_MEMORY 0x00010005 +/*! @brief GLFW could not find support for the requested client API on the + * system. + */ +#define GLFW_API_UNAVAILABLE 0x00010006 +/*! @brief The requested client API version is not available. + */ +#define GLFW_VERSION_UNAVAILABLE 0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + * more specific categories. + */ +#define GLFW_PLATFORM_ERROR 0x00010008 +/*! @brief The clipboard did not contain data in the requested format. + */ +#define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @} */ + +#define GLFW_FOCUSED 0x00020001 +#define GLFW_ICONIFIED 0x00020002 +#define GLFW_RESIZABLE 0x00020003 +#define GLFW_VISIBLE 0x00020004 +#define GLFW_DECORATED 0x00020005 + +#define GLFW_RED_BITS 0x00021001 +#define GLFW_GREEN_BITS 0x00021002 +#define GLFW_BLUE_BITS 0x00021003 +#define GLFW_ALPHA_BITS 0x00021004 +#define GLFW_DEPTH_BITS 0x00021005 +#define GLFW_STENCIL_BITS 0x00021006 +#define GLFW_ACCUM_RED_BITS 0x00021007 +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +#define GLFW_AUX_BUFFERS 0x0002100B +#define GLFW_STEREO 0x0002100C +#define GLFW_SAMPLES 0x0002100D +#define GLFW_SRGB_CAPABLE 0x0002100E +#define GLFW_REFRESH_RATE 0x0002100F + +#define GLFW_CLIENT_API 0x00022001 +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +#define GLFW_CONTEXT_REVISION 0x00022004 +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +#define GLFW_OPENGL_PROFILE 0x00022008 + +#define GLFW_OPENGL_API 0x00030001 +#define GLFW_OPENGL_ES_API 0x00030002 + +#define GLFW_NO_ROBUSTNESS 0 +#define GLFW_NO_RESET_NOTIFICATION 0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE 0 +#define GLFW_OPENGL_CORE_PROFILE 0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 + +#define GLFW_CURSOR 0x00033001 +#define GLFW_STICKY_KEYS 0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief The function signature for error callbacks. + * + * This is the function signature for error callback functions. + * + * @param[in] error An [error code](@ref errors). + * @param[in] description A UTF-8 encoded string describing the error. + * + * @sa glfwSetErrorCallback + * + * @ingroup error + */ +typedef void (* GLFWerrorfun)(int,const char*); + +/*! @brief The function signature for window position callbacks. + * + * This is the function signature for window position callback functions. + * + * @param[in] window The window that the user moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * + * @sa glfwSetWindowPosCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window resize callbacks. + * + * This is the function signature for window size callback functions. + * + * @param[in] window The window that the user resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa glfwSetWindowSizeCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window close callbacks. + * + * This is the function signature for window close callback functions. + * + * @param[in] window The window that the user attempted to close. + * + * @sa glfwSetWindowCloseCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow*); + +/*! @brief The function signature for window content refresh callbacks. + * + * This is the function signature for window refresh callback functions. + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa glfwSetWindowRefreshCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); + +/*! @brief The function signature for window focus/defocus callbacks. + * + * This is the function signature for window focus callback functions. + * + * @param[in] window The window that was focused or defocused. + * @param[in] focused `GL_TRUE` if the window was focused, or `GL_FALSE` if + * it was defocused. + * + * @sa glfwSetWindowFocusCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); + +/*! @brief The function signature for window iconify/restore callbacks. + * + * This is the function signature for window iconify/restore callback + * functions. + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GL_TRUE` if the window was iconified, or `GL_FALSE` + * if it was restored. + * + * @sa glfwSetWindowIconifyCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); + +/*! @brief The function signature for framebuffer resize callbacks. + * + * This is the function signature for framebuffer resize callback + * functions. + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa glfwSetFramebufferSizeCallback + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for mouse button callbacks. + * + * This is the function signature for mouse button callback functions. + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa glfwSetMouseButtonCallback + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); + +/*! @brief The function signature for cursor position callbacks. + * + * This is the function signature for cursor position callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xpos The new x-coordinate of the cursor. + * @param[in] ypos The new y-coordinate of the cursor. + * + * @sa glfwSetCursorPosCallback + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for cursor enter/leave callbacks. + * + * This is the function signature for cursor enter/leave callback functions. + * + * @param[in] window The window that received the event. + * @param[in] entered `GL_TRUE` if the cursor entered the window's client + * area, or `GL_FALSE` if it left it. + * + * @sa glfwSetCursorEnterCallback + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); + +/*! @brief The function signature for scroll callbacks. + * + * This is the function signature for scroll callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa glfwSetScrollCallback + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for keyboard key callbacks. + * + * This is the function signature for keyboard key callback functions. + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action @ref GLFW_PRESS, @ref GLFW_RELEASE or @ref GLFW_REPEAT. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa glfwSetKeyCallback + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); + +/*! @brief The function signature for Unicode character callbacks. + * + * This is the function signature for Unicode character callback functions. + * + * @param[in] window The window that received the event. + * @param[in] character The Unicode code point of the character. + * + * @sa glfwSetCharCallback + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); + +/*! @brief The function signature for monitor configuration callbacks. + * + * This is the function signature for monitor configuration callback functions. + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa glfwSetMonitorCallback + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @ingroup monitor + */ +typedef struct +{ + /*! The width, in screen coordinates, of the video mode. + */ + int width; + /*! The height, in screen coordinates, of the video mode. + */ + int height; + /*! The bit depth of the red channel of the video mode. + */ + int redBits; + /*! The bit depth of the green channel of the video mode. + */ + int greenBits; + /*! The bit depth of the blue channel of the video mode. + */ + int blueBits; + /*! The refresh rate, in Hz, of the video mode. + */ + int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + * This describes the gamma ramp for a monitor. + * + * @sa glfwGetGammaRamp glfwSetGammaRamp + * + * @ingroup gamma + */ +typedef struct +{ + /*! An array of value describing the response of the red channel. + */ + unsigned short* red; + /*! An array of value describing the response of the green channel. + */ + unsigned short* green; + /*! An array of value describing the response of the blue channel. + */ + unsigned short* blue; + /*! The number of elements in each array. + */ + unsigned int size; +} GLFWgammaramp; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before a program terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the program exits. + * + * Additional calls to this function after successful initialization but before + * termination will succeed but will do nothing. + * + * @return `GL_TRUE` if successful, or `GL_FALSE` if an error occurred. + * + * @par New in GLFW 3 + * This function no longer registers @ref glfwTerminate with `atexit`. + * + * @note This function may only be called from the main thread. + * + * @note This function may take several seconds to complete on some systems, + * while on other systems it may take only a fraction of a second to complete. + * + * @note **Mac OS X:** This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. + * + * @sa glfwTerminate + * + * @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + * This function destroys all remaining windows, frees any allocated resources + * and sets the library to an uninitialized state. Once this is called, you + * must again call @ref glfwInit successfully before you will be able to use + * most GLFW functions. + * + * If GLFW has been successfully initialized, this function should be called + * before the program exits. If initialization fails, there is no need to call + * this function, as it is called by @ref glfwInit before it returns failure. + * + * @remarks This function may be called before @ref glfwInit. + * + * @note This function may only be called from the main thread. + * + * @warning No window's context may be current on another thread when this + * function is called. + * + * @sa glfwInit + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * @param[out] major Where to store the major version number, or `NULL`. + * @param[out] minor Where to store the minor version number, or `NULL`. + * @param[out] rev Where to store the revision number, or `NULL`. + * + * @remarks This function may be called before @ref glfwInit. + * + * @remarks This function may be called from any thread. + * + * @sa glfwGetVersionString + * + * @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + * This function returns a static string generated at compile-time according to + * which configuration macros were defined. This is intended for use when + * submitting bug reports, to allow developers to see which code paths are + * enabled in a binary. + * + * The format of the string is as follows: + * - The version of GLFW + * - The name of the window system API + * - The name of the context creation API + * - Any additional options or APIs + * + * For example, when compiling GLFW 3.0 with MinGW using the Win32 and WGL + * back ends, the version string may look something like this: + * + * 3.0.0 Win32 WGL MinGW + * + * @return The GLFW version string. + * + * @remarks This function may be called before @ref glfwInit. + * + * @remarks This function may be called from any thread. + * + * @sa glfwGetVersion + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @remarks This function may be called before @ref glfwInit. + * + * @note The error callback is called by the thread where the error was + * generated. If you are using GLFW from multiple threads, your error callback + * needs to be written accordingly. + * + * @note Because the description string provided to the callback may have been + * generated specifically for that error, it is not guaranteed to be valid + * after the callback has returned. If you wish to use it after that, you need + * to make your own copy of it before returning. + * + * @ingroup error + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. + * + * @param[out] count Where to store the size of the returned array. This is + * set to zero if an error occurred. + * @return An array of monitor handles, or `NULL` if an error occurred. + * + * @note The returned array is allocated and freed by GLFW. You should not + * free it yourself. + * + * @note The returned array is valid only until the monitor configuration + * changes. See @ref glfwSetMonitorCallback to receive notifications of + * configuration changes. + * + * @sa glfwGetPrimaryMonitor + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + * This function returns the primary monitor. This is usually the monitor + * where elements like the Windows task bar or the OS X menu bar is located. + * + * @return The primary monitor, or `NULL` if an error occurred. + * + * @sa glfwGetMonitors + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * @param[in] monitor The monitor to query. + * @param[out] width Where to store the width, in mm, of the monitor's display + * area, or `NULL`. + * @param[out] height Where to store the height, in mm, of the monitor's + * display area, or `NULL`. + * + * @note Some operating systems do not provide accurate information, either + * because the monitor's EDID data is incorrect, or because the driver does not + * report it accurately. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* width, int* height); + +/*! @brief Returns the name of the specified monitor. + * + * This function returns a human-readable name, encoded as UTF-8, of the + * specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an error + * occurred. + * + * @note The returned string is allocated and freed by GLFW. You should not + * free it yourself. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @bug **X11:** This callback is not yet called on monitor configuration + * changes. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths) and then by resolution area (the + * product of width and height). + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an error occurred. + * + * @note The returned array is allocated and freed by GLFW. You should not + * free it yourself. + * + * @note The returned array is valid only until this function is called again + * for the specified monitor. + * + * @sa glfwGetVideoMode + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + * This function returns the current video mode of the specified monitor. If + * you are using a full screen window, the return value will therefore depend + * on whether it is focused. + * + * @param[in] monitor The monitor to query. + * @return The current mode of the monitor, or `NULL` if an error occurred. + * + * @note The returned struct is allocated and freed by GLFW. You should not + * free it yourself. + * + * @sa glfwGetVideoModes + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + * This function generates a 256-element gamma ramp from the specified exponent + * and then calls @ref glfwSetGammaRamp with it. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @ingroup gamma + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Retrieves the current gamma ramp for the specified monitor. + * + * This function retrieves the current gamma ramp of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The current gamma ramp, or `NULL` if an error occurred. + * + * @note The value arrays of the returned ramp are allocated and freed by GLFW. + * You should not free them yourself. + * + * @ingroup gamma + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + * This function sets the current gamma ramp for the specified monitor. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @note Gamma ramp sizes other than 256 are not supported by all hardware. + * + * @ingroup gamma + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + * This function resets all window hints to their + * [default values](@ref window_hints_values). + * + * @note This function may only be called from the main thread. + * + * @sa glfwWindowHint + * + * @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to @ref + * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is + * terminated with @ref glfwTerminate. + * + * @param[in] target The [window hint](@ref window_hints) to set. + * @param[in] hint The new value of the window hint. + * + * @par New in GLFW 3 + * Hints are no longer reset to their default values on window creation. To + * set default hint values, use @ref glfwDefaultWindowHints. + * + * @note This function may only be called from the main thread. + * + * @sa glfwDefaultWindowHints + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int target, int hint); + +/*! @brief Creates a window and its associated context. + * + * This function creates a window and its associated context. Most of the + * options controlling how the window and its context should be created are + * specified through @ref glfwWindowHint. + * + * Successful creation does not change which context is current. Before you + * can use the newly created context, you need to make it current using @ref + * glfwMakeContextCurrent. + * + * Note that the created window and context may differ from what you requested, + * as not all parameters and hints are + * [hard constraints](@ref window_hints_hard). This includes the size of the + * window, especially for full screen windows. To retrieve the actual + * attributes of the created window and context, use queries like @ref + * glfwGetWindowAttrib and @ref glfwGetWindowSize. + * + * To create the window at a specific position, make it initially invisible + * using the `GLFW_VISIBLE` window hint, set its position and then show it. + * + * If a fullscreen window is active, the screensaver is prohibited from + * starting. + * + * @param[in] width The desired width, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] height The desired height, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] title The initial, UTF-8 encoded window title. + * @param[in] monitor The monitor to use for full screen mode, or `NULL` to use + * windowed mode. + * @param[in] share The window whose context to share resources with, or `NULL` + * to not share resources. + * @return The handle of the created window, or `NULL` if an error occurred. + * + * @remarks **Windows:** If the executable has an icon resource named + * `GLFW_ICON,` it will be set as the icon for the window. If no such icon is + * present, the `IDI_WINLOGO` icon will be used instead. + * + * @remarks **Mac OS X:** The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * Also, the first time a window is opened the menu bar is populated with + * common commands like Hide, Quit and About. The (minimal) about dialog uses + * information from the application's bundle. For more information on bundles, + * see the Bundle Programming Guide provided by Apple. + * + * @note This function may only be called from the main thread. + * + * @sa glfwDestroyWindow + * + * @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + * This function destroys the specified window and its context. On calling + * this function, no further callbacks will be called for that window. + * + * @param[in] window The window to destroy. + * + * @note This function may only be called from the main thread. + * + * @note This function may not be called from a callback. + * + * @note If the window's context is current on the main thread, it is + * detached before being destroyed. + * + * @warning The window's context must not be current on any other thread. + * + * @sa glfwCreateWindow + * + * @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + * This function returns the value of the close flag of the specified window. + * + * @param[in] window The window to query. + * @return The value of the close flag. + * + * @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + * This function sets the value of the close flag of the specified window. + * This can be used to override the user's attempt to close the window, or + * to signal that it should be closed. + * + * @param[in] window The window whose flag to change. + * @param[in] value The new value. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + * This function sets the window title, encoded as UTF-8, of the specified + * window. + * + * @param[in] window The window whose title to change. + * @param[in] title The UTF-8 encoded window title. + * + * @note This function may only be called from the main thread. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Retrieves the position of the client area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the client area of the specified window. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the client area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the client area, or `NULL`. + * + * @sa glfwSetWindowPos + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the client area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the client area of the window. + * + * If the specified window is a full screen window, this function does nothing. + * + * If you wish to set an initial window position you should create a hidden + * window (using @ref glfwWindowHint and `GLFW_VISIBLE`), set its position and + * then show it. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the client area. + * @param[in] ypos The y-coordinate of the upper-left corner of the client area. + * + * @note It is very rarely a good idea to move an already visible window, as it + * will confuse and annoy the user. + * + * @note This function may only be called from the main thread. + * + * @note The window manager may put limits on what positions are allowed. + * + * @bug **X11:** Some window managers ignore the set position of hidden (i.e. + * unmapped) windows, instead placing them where it thinks is appropriate once + * they are shown. + * + * @sa glfwGetWindowPos + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the client area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the client area + * of the specified window. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * client area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * client area, or `NULL`. + * + * @sa glfwSetWindowSize + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size of the client area of the specified window. + * + * This function sets the size, in screen coordinates, of the client area of + * the specified window. + * + * For full screen windows, this function selects and switches to the resolution + * closest to the specified size, without affecting the window's context. As + * the context is unaffected, the bit depths of the framebuffer remain + * unchanged. + * + * @param[in] window The window to resize. + * @param[in] width The desired width of the specified window. + * @param[in] height The desired height of the specified window. + * + * @note This function may only be called from the main thread. + * + * @note The window manager may put limits on what window sizes are allowed. + * + * @sa glfwGetWindowSize + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + * This function retrieves the size, in pixels, of the framebuffer of the + * specified window. + * + * @param[in] window The window whose framebuffer to query. + * @param[out] width Where to store the width, in pixels, of the framebuffer, + * or `NULL`. + * @param[out] height Where to store the height, in pixels, of the framebuffer, + * or `NULL`. + * + * @sa glfwSetFramebufferSizeCallback + * + * @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Iconifies the specified window. + * + * This function iconifies/minimizes the specified window, if it was previously + * restored. If it is a full screen window, the original monitor resolution is + * restored until the window is restored. If the window is already iconified, + * this function does nothing. + * + * @param[in] window The window to iconify. + * + * @note This function may only be called from the main thread. + * + * @sa glfwRestoreWindow + * + * @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + * This function restores the specified window, if it was previously + * iconified/minimized. If it is a full screen window, the resolution chosen + * for the window is restored on the selected monitor. If the window is + * already restored, this function does nothing. + * + * @param[in] window The window to restore. + * + * @note This function may only be called from the main thread. + * + * @sa glfwIconifyWindow + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + * This function makes the specified window visible, if it was previously + * hidden. If the window is already visible or is in full screen mode, this + * function does nothing. + * + * @param[in] window The window to make visible. + * + * @note This function may only be called from the main thread. + * + * @sa glfwHideWindow + * + * @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + * This function hides the specified window, if it was previously visible. If + * the window is already hidden or is in full screen mode, this function does + * nothing. + * + * @param[in] window The window to hide. + * + * @note This function may only be called from the main thread. + * + * @sa glfwShowWindow + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Returns an attribute of the specified window. + * + * This function returns an attribute of the specified window. There are many + * attributes, some related to the window and others to its context. + * + * @param[in] window The window to query. + * @param[in] attrib The [window attribute](@ref window_attribs) whose value to + * return. + * @return The value of the attribute, or zero if an error occurred. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @sa glfwGetWindowUserPointer + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + * This function returns the current value of the user-defined pointer of the + * specified window. The initial value is `NULL`. + * + * @param[in] window The window whose pointer to return. + * + * @sa glfwSetWindowUserPointer + * + * @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + * This function sets the position callback of the specified window, which is + * called when the window is moved. The callback is provided with the screen + * position of the upper-left corner of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @remarks **Mac OS X:** Selecting Quit from the application menu will + * trigger the close callback for all windows. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the client area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz or Aqua, where the window + * contents are saved off-screen, this callback may be called only very + * infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @note On compositing window systems such as Aero, Compiz or Aqua, where the + * window contents are saved off-screen, this callback may be called only very + * infrequently or never at all. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses focus. + * + * After the focus callback is called for a window that lost focus, synthetic + * key and mouse button release events will be generated for all such that had + * been pressed. For more information, see @ref glfwSetKeyCallback and @ref + * glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); + +/*! @brief Processes all pending events. + * + * This function processes only those events that have already been received + * and then returns immediately. Processing events will cause the window and + * input callbacks associated with those events to be called. + * + * This function is not required for joystick input to work. + * + * @par New in GLFW 3 + * This function is no longer called by @ref glfwSwapBuffers. You need to call + * it or @ref glfwWaitEvents yourself. + * + * @note This function may only be called from the main thread. + * + * @note This function may not be called from a callback. + * + * @note On some platforms, certain callbacks may be called outside of a call + * to one of the event processing functions. + * + * @sa glfwWaitEvents + * + * @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are pending and processes them. + * + * This function puts the calling thread to sleep until at least one event has + * been received. Once one or more events have been recevied, it behaves as if + * @ref glfwPollEvents was called, i.e. the events are processed and the + * function then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * This function is not required for joystick input to work. + * + * @note This function may only be called from the main thread. + * + * @note This function may not be called from a callback. + * + * @note On some platforms, certain callbacks may be called outside of a call + * to one of the event processing functions. + * + * @sa glfwPollEvents + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Returns the value of an input option for the specified window. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @sa glfwSetInputMode + * + * @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * @param[in] value The new value of the specified input mode. + * + * If `mode` is `GLFW_CURSOR`, the value must be one of the supported input + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client + * area of the window. + * - `GLFW_CURSOR_DISABLED` disables the cursor and removes any limitations on + * cursor movement. + * + * If `mode` is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to + * enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns @ref + * GLFW_PRESS the next time it is called even if the key had been released + * before the call. This is useful when you are only interested in whether + * keys have been pressed but not when or in which order. + * + * If `mode` is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either `GL_TRUE` + * to enable sticky mouse buttons, or `GL_FALSE` to disable it. If sticky + * mouse buttons are enabled, a mouse button press will ensure that @ref + * glfwGetMouseButton returns @ref GLFW_PRESS the next time it is called even + * if the mouse button had been released before the call. This is useful when + * you are only interested in whether mouse buttons have been pressed but not + * when or in which order. + * + * @sa glfwGetInputMode + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns the last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The higher-level state `GLFW_REPEAT` is only reported to + * the key callback. + * + * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call this function after a key has been + * pressed, even if the key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * @param[in] window The desired window. + * @param[in] key The desired [keyboard key](@ref keys). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @note `GLFW_KEY_UNKNOWN` is not a valid key for this function. + * + * @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + * window. + * + * This function returns the last state reported for the specified mouse button + * to the specified window. + * + * If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function + * returns `GLFW_PRESS` the first time you call this function after a mouse + * button has been pressed, even if the mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the last reported cursor position, relative to the client + * area of the window. + * + * This function returns the last reported position of the cursor to the + * specified window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the client area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the client area, or `NULL`. + * + * @sa glfwSetCursorPos + * + * @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the client area of the window. + * + * This function sets the position of the cursor. The specified window must be + * focused. If the window does not have focus when this function is called, it + * fails silently. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * client area, or `NULL`. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * client area, or `NULL`. + * + * @sa glfwGetCursorPos + * + * @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Sets the key callback. + * + * This function sets the key callback of the specific window, which is called + * when a key is pressed, repeated or released. + * + * The key functions deal with physical keys, with layout independent + * [key tokens](@ref keys) named after their values in the standard US keyboard + * layout. If you want to input text, use the + * [character callback](@ref glfwSetCharCallback) instead. + * + * When a window loses focus, it will generate synthetic key release events + * for all pressed keys. You can tell these events from user-generated events + * by the fact that the synthetic ones are generated after the window has lost + * focus, i.e. `GLFW_FOCUSED` will be false and the focus callback will have + * already been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be retrieved with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specific window, which is + * called when a Unicode character is input. + * + * The character callback is intended for text input. If you want to know + * whether a specific key was pressed or released, use the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses focus, it will generate synthetic mouse button release + * events for all pressed mouse buttons. You can tell these events from + * user-generated events by the fact that the synthetic ones are generated + * after the window has lost focus, i.e. `GLFW_FOCUSED` will be false and the + * focus callback will have already been called. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position relative to the upper-left corner of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); + +/*! @brief Sets the cursor enter/exit callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the client area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * @param[in] joy The joystick to query. + * @return `GL_TRUE` if the joystick is present, or `GL_FALSE` otherwise. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int joy); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * + * @param[in] joy The joystick to query. + * @param[out] count Where to store the size of the returned array. This is + * set to zero if an error occurred. + * @return An array of axis values, or `NULL` if the joystick is not present. + * + * @note The returned array is allocated and freed by GLFW. You should not + * free it yourself. + * + * @note The returned array is valid only until the next call to @ref + * glfwGetJoystickAxes for that joystick. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * + * @param[in] joy The joystick to query. + * @param[out] count Where to store the size of the returned array. This is + * set to zero if an error occurred. + * @return An array of button states, or `NULL` if the joystick is not present. + * + * @note The returned array is allocated and freed by GLFW. You should not + * free it yourself. + * + * @note The returned array is valid only until the next call to @ref + * glfwGetJoystickButtons for that joystick. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * + * @param[in] joy The joystick to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present. + * + * @note The returned string is allocated and freed by GLFW. You should not + * free it yourself. + * + * @note The returned string is valid only until the next call to @ref + * glfwGetJoystickName for that joystick. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int joy); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. The string is copied before returning, so you don't have to retain + * it afterwards. + * + * @param[in] window The window that will own the clipboard contents. + * @param[in] string A UTF-8 encoded string. + * + * @note This function may only be called from the main thread. + * + * @sa glfwGetClipboardString + * + * @ingroup clipboard + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Retrieves the contents of the clipboard as a string. + * + * This function returns the contents of the system clipboard, if it contains + * or is convertible to a UTF-8 encoded string. + * + * @param[in] window The window that will request the clipboard contents. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an error occurred. + * + * @note This function may only be called from the main thread. + * + * @note The returned string is allocated and freed by GLFW. You should not + * free it yourself. + * + * @note The returned string is valid only until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString. + * + * @sa glfwSetClipboardString + * + * @ingroup clipboard + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the value of the GLFW timer. + * + * This function returns the value of the GLFW timer. Unless the timer has + * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW + * was initialized. + * + * @return The current value, in seconds, or zero if an error occurred. + * + * @remarks This function may be called from secondary threads. + * + * @note The resolution of the timer is system dependent, but is usually on the + * order of a few micro- or nanoseconds. It uses the highest-resolution + * monotonic time source on each supported platform. + * + * @ingroup time + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW timer. + * + * This function sets the value of the GLFW timer. It then continues to count + * up from that value. + * + * @param[in] time The new value, in seconds. + * + * @note The resolution of the timer is system dependent, but is usually on the + * order of a few micro- or nanoseconds. It uses the highest-resolution + * monotonic time source on each supported platform. + * + * @ingroup time + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Makes the context of the specified window current for the calling + * thread. + * + * This function makes the context of the specified window current on the + * calling thread. A context can only be made current on a single thread at + * a time and each thread can have only a single current context at a time. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @remarks This function may be called from secondary threads. + * + * @sa glfwGetCurrentContext + * + * @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + * This function returns the window whose context is current on the calling + * thread. + * + * @return The window whose context is current, or `NULL` if no window's + * context is current. + * + * @remarks This function may be called from secondary threads. + * + * @sa glfwMakeContextCurrent + * + * @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + * This function swaps the front and back buffers of the specified window. If + * the swap interval is greater than zero, the GPU driver waits the specified + * number of screen updates before swapping the buffers. + * + * @param[in] window The window whose buffers to swap. + * + * @remarks This function may be called from secondary threads. + * + * @par New in GLFW 3 + * This function no longer calls @ref glfwPollEvents. You need to call it or + * @ref glfwWaitEvents yourself. + * + * @sa glfwSwapInterval + * + * @ingroup context + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + * This function sets the swap interval for the current context, i.e. the + * number of screen updates to wait before swapping the buffers of a window and + * returning from @ref glfwSwapBuffers. This is sometimes called 'vertical + * synchronization', 'vertical retrace synchronization' or 'vsync'. + * + * Contexts that support either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, + * which allow the driver to swap even if a frame arrives a little bit late. + * You can check for the presence of these extensions using @ref + * glfwExtensionSupported. For more information about swap tearing, see the + * extension specifications. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @remarks This function may be called from secondary threads. + * + * @note Some GPU drivers do not honor the requested swap interval, either + * because of user settings that override the request or due to bugs in the + * driver. + * + * @sa glfwSwapBuffers + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [OpenGL or context creation API extension](@ref context_glext) is supported + * by the current context. For example, on Windows both the OpenGL and WGL + * extension strings are checked. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GL_TRUE` if the extension is available, or `GL_FALSE` otherwise. + * + * @remarks This function may be called from secondary threads. + * + * @note As this functions searches one or more extension strings on each call, + * it is recommended that you cache its results if it's going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. + * + * @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + * context. + * + * This function returns the address of the specified + * [client API or extension function](@ref context_glext), if it is supported + * by the current context. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if the function is + * unavailable. + * + * @remarks This function may be called from secondary threads. + * + * @note The addresses of these functions are not guaranteed to be the same for + * all contexts, especially if they use different client APIs or even different + * context creation hints. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/external/glfw3/lib/libglfw3.a b/external/glfw3/lib/libglfw3.a new file mode 100644 index 0000000000000000000000000000000000000000..2ea1554b19957368a0ccd86f2c746437713be80e GIT binary patch literal 81850 zcmY$iNi0gvu;bEKKm~@z=7uJQW~PRQ3JL~bDP&SX!NkbK0xYbMz{SA8FqeTra0dj7 zJYirU7VF3`FrZ`OOAHM7uw4%W12wRp4g&)+4sKy!AQz`fF))B|`Y#5C!G*%c*ej0!{?kB7%0SyQc4UY;P~{MwDRE866c)E zf~5S!qLkp0qRhN>2C%q07ICnIXK`3!PG*X8eqKpxMTv8MURq{4Lp)f@IU_&6IMvMw zMKCBetthoP1FGJ!q@*Y_sTisO)hwtW#1)=-t`#MzdBvIec@P1JvwRb?Q=vvVmlhSJ z=9NIiLC%Hnp|TL+;PS)*r_!{v)S_a9fM;GwYEfBY4nzcDO=&?veo;wk3PjvJwIrY@ zKiM%Qr6{!+=3vL1ocv_>#N6D(pv2q)sDs^#Qd5z{prHyDfg1(pLG&QYLqx!V=b2Yf zTH;z%lwSnVUoC~GEgm@cM+%GXV6*-)J^Yb!G@{61^67$kw63#`bi6yB}8K`2H z)Z&t&{7QU+u!IlE+F_X~srit|0;e74{M>@XqExsrOm%QUPG*TyKma_Jp;jQA9#E8- zn^=Uf8Wbbo*af>B9&t!Q8I{GE$%#3^nN`rFf{=swA7n%@D1m^DKn-qCo`Ja?;Rv|9 z;qDB{1cfBjBnSuWQE-|J&&*57FL%pNE`|9MNf_*8bhQx2qKkSa=jUanq2x5TqQu

      jo=bZfF)S%SD($r#TNdid(5M2;IyQHQi zmgbZ|ggi3yN}!>G5P+!zCl!b=L+^Q7W=fa7KPPGT$RJ1w|h221o@4 zF$XRPP2LbuxZ6UDQ;P!fGf|2=h#eR*a6JL}#i%J4E(1yzIHbU#k3$Yt{lcpOP?*3C z1t(@4I-voFA&VBusPX~%IXSLnsfcuxm{|hjgY!W^PGU(~eo-!{_(gAbpeO*<=!6s? z)v73ZgHub;r96v4g;joWCa6+!%}Y$mf!BbrT#=FrsX*O|@^eE&+$^A_Bt#k{0FnsL zgeikc!#o74SNe*rq zx|yKhg%$QlK?^F*Va*vNV?e@CRWQ-u)DkSBkaPgaz-Stv6)9FZcwU2+dg$JOXu|X% zTpy+syxakm3207%Yr`Ukt%yW%4m8U{oP=gDG>WmxA(x&g1|k=uC=$r!1d2pBz5)Z> zuEY!vP+0<&@`bk}AwgtpgyLLK27`7F90NR|{)6W*3>ip-LxrKLp)rjr=$Mz7Q&|P; zmq1m*5)-x_3yP0H1sz(~1w|gE4}&3t=**x2^_J=?+ohDBK0O+(m^0#5(Sx!otYF z$N(1ZEm33W-J=c?Z+;_#FhZe3pwmS~q4|gmTp36oNZoN36_EB9AhzLw<|8tPCx8JH z0|Ns$0|NsagDad>z`(%3%fP@O!XO0-0WixDE*8PSz`zF<(@V?DNd+0mz`*eDKLbNL zBT}qD#X%Gch+tq~U}R8WV1kAxR0vMVFfcGUz|=4x#|B6PGh-Fljd0}*3=GII0rCYi zNFlNUkQ$^|0L3{rH6Se}AOea(W-&0hL3yB9hlr$Oh*Y46%w%AIw;xFyk;%&}LG9DS z${tX`2+M+KO%23g1A4K5ZaEif)=^L(lvhkGEQ}$U1(a7Hv1cK~z@P^9FJ@kuz|Fw0 zg@J+L4k%eLFffGCD6i-hp=Q1rObiSzJYYw`2?quPhw!k@W5LaD6u^nS^+4xw{+6E% z3=FN`_**VAFfcUOG4QvXU|?Wq-m!s^fq|(mq1Q!429)QHv#7{6F))DjHNWBLc2SXO zJ;2`wDhCX2zvgT{%xE2>B2!!68Kc5-oJECMo`K>2^b?E>49#yiI!jboI$2b}dRq^a zUT!|3umhALqvPTaL)C)in%}U1oK#{3)?fqE(0RB-qtgV!W4vK`zl5uy`oBU6OXu;| z*Z8*yv|K7#*YHcBWM${^*T-P$nvW=eOb3+_;7B^oqQb(!2zCAu1;Ya%+1@e+q%wdB zCU1D)^??b!Tfk8o-26tO+eJm8J3yef>;L~h|C@g@md7^!Vq{=u==PB44iG8HX}!eX z=flXr(0Y=;!v*ByUyS@MhrtXc{uV7p28Qkch1N^_tu2fU3=I`B4E!zY85qD;gR~(# z&G5i$F(fB3Bb?NHL?Zfd+60hYTR{X zHKPJEL-TJ&{&tAtnCf_%e=(P;HveQyn@}$YvMvYY9HbC3Jn*`|cN-|-fSubqjRE8b z6>y}rUgB@b|NsAg<10o1W`^cpjQnj0|Ns978PmYXz<}(V<|7h@2ci!*|77Iv%lrTT zf2WTM52y?Wsa3$R@}=be|NmQ0^0%D(hpO}grqXx+{{No;enSk!D?Cg`wsp4|No``|NsBfCV<@D5ArTFJ-jsh z2l1;1#4e;5dKvle|NqeNFi`gDj#07c_E9l8?xG?93dYvk{4HBRRq8fJo#QSl68|Bt z5P{M>AiBdvMZVib#o{=N3P{UqTaf?wTe=t-7%W{>1o&M;R3!LaOH@SoU1PxEDA8G> zBGMV7!qd#6!q|MkraMH%#!^Iuzr_ob&T3TT8A{k1Ds&i1?ssSM7~XDuTgTNM0AgI? zpK`dnQlRyJ9eZ!mvG?g9n|~0>kj0Aa5=zS!%MAi>o_`J zX$SD|ufNp#zm7w@LV$n$f5uT!TgewE(DnPgj zP_7Dus{-NHsBpCY2b;&CU10zgYp66~C}D4?Fkx)I#9$qx!o%OZ5R}Y9R3t#b1`5GW z7Zri#1E3Iug)4vSwtxTscZ0;i#Yybp3DzYlB1IzBpr~k0`}hAph|k{|12W1*MW8c8 z1so|avta2Hk{)8f#oKWg6;P@HWqcn{3?Fw#p6-_mc>jA480{P7W;V_7#MbgjCd^%O`pxjSi0l>fRY=iHPI;pDK$Hf zch;zIfQsf$9f(Nlfzm6Ce|Ix6Ff;VJsQ7^V-dm#L((9t)(dnYX(^;az0m`NSK+b_{ z;cxK;l`AePI^7{EI^8}hI-N7tKtxZc|G)J> zY4~fEv;_p0E?FSu*^V~2u^)ecj4e42 zs%(z4sDz=`ZZ5V#O$-eDEh>x*47Q0)3=E~qxMaDpr!K@CXCdlP)Wm_*+0_Hc0*Ph6A8_Re_n|rQrYn|H1VW2NMH>;qBurDjcxl z9^nV5fB9R!FhC7$J;2`rD)5i9s2DRr#X!-~dZ4ojRNwNqyatulvp^B^vJ;drA+C}` z^WO@_Qo9vQC8Z!&9c$PN@>O>OBvP39`wjp9|Njz{z*jKxx1>XIfeys+pz7ph2uLVI zMdw)49+1x0TS3Mg2L}$505ikOGH5Y*g%RCvFQfnc{}1(6N!*SEkRQ^%gQ9}Jwc!8% z{~*6~gA>!sB1kC-tH9xnbckIb&w^3_C?z;x1mVjse<1}mSP4=KACzn%sqdu_s`>B+ z!0UOP-+Cc^2yp!$qXKC!bsp+=7O@1otwtP_t{F;L!S!;tw}fREC?V8-0J#QgB|9QI z!Sx_0J%XzTf$ka=h3*m+m9z<+H7YEyHcRV)&ch{YozQj<;|!JIH*f@fYCXvSF~IVUqUuSCHy zz*C_JGOLlA0!l_OdH;gcJa-?3vQ+TosDf&yo@yqtN;Gu^Mfso(D6$F$2I%020#veC zAwMstQX#b>v$#YdEx$+s%?@KdBZb7g6otg3{IXP#Tio)C$`gxH6p}$RVoZLSBA}LNRPMTOp|u=4#hq2JG(3EXJn?<{oH2P@yP4skFEx zFSWQ>AvZrI6)6Crq2n5?>+Gw*fW-4b;(=PV3~q^;IjJcMCHV?PsU=03sb#4OFymqI zR}5K=pqiowMhpyo`S5^9%P-AKQOL~0r71nfJ+%bV3gGoe~qwlvub}CS0r&E;bb|wgoPB04{bHF7^^G#>ot`LzEe2 zhbLSt6fRc53JZ-1tS}uj;H(93)(%z%21vMEhKqe-g@p?X8)(D?G=x!myc(fk7248_W$0XDnlbumN09F$>4w zb`Nyi57+1%$Yujj3k)=V2-a!Gz`&5e3>{Gfiv%+;Fch#Ni{vvfFc@$mi?o0Se^5jg zF)%PZKoQvm8oS~`)^(AAfgu1zv1|pb((a3MK#<;WPsEM8HA{3=okZ6p{GilA`2X(C9Eo5ll@o zhMMA%B9H=5NHQ=nfOO@g<{^oIm_;bMKq8Y-L_oUo;Ff{xiZ3osPRvUKDTSI0VlF|^ z1rj-kA@T@AKl5P(BR5C@7uW zblsp4x@yqKmPDsBM|X^h0I2iRTgCwD_kaxOW`+%ncRRz!$h)06V4}ytZaMA@4u<2- zkohiW@W4K}zXltp4i5`%d;{tQ!#XQ_R05b77;d(xgfM}IF+ip8&3E@-@;6H}GBDh* z)nEYi%X>>y4DQCLNTf};>!KoYHwHXLq;lIuMdgO64g&+jT^Yz|k>P=xF)BJYT~u^# zvKoM9Gfv(-d4m-+GXyfT-01epyEk`$#xTouZ`P=2@o#rg(b~e3*6E_6aWh9n<93XS z%FP@Vt!@_;mDjxBaof8$?%sIKboWMDCre!OVaCSapr#^!Yw3UZ*g)qN6$2&)hR!W2 zCJ@SkiGksGi;4}X_+?~ZC{gQnw`e_3V%ysSQD~zAnx_EwcN>p@f&$bfzIy|y{{`>r zBIJABbwIjco$lA0P&B}&43IQH<^@2bydto$26ePUx}9x$i)~=>*6r+oV7kDV$DM6J zY3jH$WNgpb1;PW53U-1fNuc4~d_<)4Lv-9>nA;7%p^k7tWFaG3z579iAo}5*F)AXU zl+{_HA^{p>C^790wrIUnBHLM_qS9TWA_3~ScE_lQz`FO~_~>o}{QmR5acv)tVLP5vbL{ zz|dgNz)1x(b*G@c5D|vQj0_B7V6pdb z9lznSpgIv^uMQK;edchM6P%UB1T&=r+V>D)Sjq&m_cdJhIuoc*0K&Y`zJ~|{W*ZS& z;({U@34_Z8Xd4kU;)^5&XM%cf0WdXSQC$WGh6N}h)}XLtg0;y&ihMz8;3AlwKk~Axx>J~zyeVU?pIP$YlEvhu&oFJv@!&})&`BK z>o7AgM1Yo}FfcHHMlT!~5*+kWic*tHAfs0x6F?&xZ(vylBmiDnVQ^rFj01EeUGvC7 zkbLJH6%hvphVCgUDh}W}NCL#0qoUxzz|eZ2#H#gDiFa>{iiQJtA_law1U|6|TB^}$ zqVgX!#=+2fpu!nqAf$Bvf1w*{@)i}4k&Q<{HXrVt{Qv*I|NB5LYW~GheyQ7JDrheC z^-1VprB zxNdAcP-1YLMFmuhLivk9-IfxAW8g?*1Ph{?Gr{0C7Ew^;WD0IZK&LMLi-LjAIK7;ZWk4v){`Y{$HA+hS}&Eb9S5~GKvB+i9MnQ#_za#^0*|4ChVy$N zvjp8CDlCv_1_!}m*PtN(AS;DXKW{((a6bhwS0TjT+tp7Yz%e-3)kPu1Ujei#4cvf- zjOBrb0HG_uiWR_PfD8;F8L0~HK5pR(IhjdCiA9y5fj!UwC@3Gp`Wqn`sYR&}358_H zT07XtAp>l5GqEVWG#50!3>xN5%`44SC`bgY$}dSRf~$el-5>=BIseiUh5R&y+|=Cs zqDlscd*H*<3P@wtnZ*jFd5L9-nK_`v$6$A3RRnw*)InXHfs z+AgG!pA7a>3cB5(W!8x$Aa5hv3yNY81~sTaYZ^Kj7#Kjail7xOH$W1M3=E*rk`QNGTfwsI>wSYlpUA z*cc|mS)ds}h%Cq@pwfdMAU zzyNBuZa`^Offg_(pp4FeC;s8BDv+%)ps_d<5zq(`sQ&_X50>?Qpjs9*Vhhp@!Q{2P zFl$%jdKK(1M$i}%s5XVz10s>@R8Wn<%m_*sAQ@B)%6lLYP-rnh2Q3&F9)OHxV1SOH z%>pTaVsJsrupG(*Q4o=xASM{YT4!g#JP-jBc?RNuF-+timP=z?uf%N3I7Shyi0_1Idj2^^5|rUYnW*8;cnslTQfIfsE#8mK%Ff!Yb; zgD_;gi3haA5;Q2#9ik!tTE5fmqaxBN1Mb4N9ssQ%C}nS`;qqZ932yueT0>JV-TZ^G zB&PL1X;4Fz4nv90F&8c$W@rntd)5!o3dP$cYMr392cXqJpoN_`x@AD)S)hRemQIlQ zA)pZ|p8pTJ!4|P}*QjtbAK^JXp~HpC=k+fBZ82P6V;LKMGwufE5Pp}#uNU{0F?74A zaDZAt%|HH^NcMU(Hvd#86Kwt=U&hnj1sYLqJz2u^|KaDuu<o-F|9L?E_E8Z54M;TqU@tdpJy~Mg;lt$8J?jO?h}$Ld(BTf2PS7$e zu(u%I;b}g?@&CaDsDGM|a2y7YcQjP#GL-B+=ECH{{CXF}{VaD~R5WF*M!%6AnG*-hy*npKOesN?&hi6ud4V;#crOw{p#+m zDxp$=*AMRAx_J^L|C$BFy5nE~w&;$7#oYjl*OL$}YDoBj>eyBs;Rj#)9-^WE8h9(w zw`DS5W+(}@Wd>1pwu~Uk9@L5lB|6YLT-bUQ$U+Dt8PLEFxaka$=`Ca6-{zzX8p`Z; zasW{i__sOffEmze1dWfGK%4yCF)9w-E-EhFB`O{z=3rOww>)5AV1T&91?&?3mieF+ zl`bmayo&6a<|8IZLt&@`VIUcBe71h$pL)Q;S(ks?g_3ivmr8vas$H1*TR>}A8>(HI zA&a6Ks@<6RTR_dPhH7_a{+6SlD!kf*nZIQdnB~a~aYaM57c+kgXb_;G+MBtgw!>K$ z;)ve1|NH;^2d!Fb4+1S!a(1vh#@`bC|Nnn$Sx|eEzoi${w<&gjCuxA_30Z7gUMldqwM*@wCG{V^A2ABNX2I)Zf|dXG7~FuZj9|Ns9n zXK#j=RbYk}!^>S{Qv*omKl_kB^&>N zX?;+Jf~^XC8T|kM|GTUSpn={P6`s4SpzRBHV^mmR3SM8l>uk{LqM~zG7A)m#(dnYX z(d(k3aaR_k3p{cv1L(Aj@5#mV1IN2gMhX`8e$dE&f1FxZq`9VD}w! z5q3egALe(Yj%SH<>!lLbyN(8TrCJYw7#4RW;Kd@Ly)IDmKt&j6zYM4tE0MNl1trQ7 zV^E>!|;n+X};1{Zx*oF$ewPrerJEn`40|Da_gxOBQ3U{SINx%dNjk5S9N z!>@TE1I17hF@n(@qM}eD((R+7(%l5AqdL1lB&aOG7UqTrUOxfF2X_6Snx+$6-;k#t zRGD;kfk^W7gX)6LE)Yqceo%Sd*##oW(+{doJG($6KK-C50F5j_yV|KK3fZaPp@mGy zVl+@bLzT}39fhHg1U{Jp)aOQ0$iQF^>feD@{;)Ar!dKQzhO;0IleOtXtXwS9bue?h#y_5gW{8cQ%-tpTfmN z;45%c*VFh;2*ZVprhmp2EdM;Ol8rIpF5O#T4Nygi7J8ebBL5Z1V}w z7BwickubRSh4o?KeIFzR&{-AKelBPg3aCPd^jJZvK?8%J0W*Y%H)s_KN?#b%5m!Lz z`GR(`A$qgIr@Bl>wRIe*=z|6s%If>z5U;ymYZ^7`)( zy~reT?*bH)%#5J^1+oeVy96m_5q)!r9IS8N23G^?FHgr10j<`9=z^&^hoS~F8U*R@ zf&0s&NAQ4-a49WLg`7x$7%c$xeL?#f!5h7?9g_h$oQJq0c)-1MP!}IILW~px;86;+ z(Ezx`kR9e=?XZqGTn=+%I%q>RcqcM=Gd|jmX2d>93moe~j19~|{dmZF5YQMA1H&06 z$c!zv{yAt=4^$R_W?Vrj4mAHt$;=YS40H^dSwd=8xTq+U7&QOjFXuttIE>UNfj2ZE zy&`Zs4@nx{PJ~E9`i;$RWI&xUP^0HK*nVikt;DSP7k{~6r;Cb8X9#GaK4hCRa=RDJ zI*57L?0bC=(N7!z`=CAo?+2ht_`SXlYOz2tXv7h;>xqp4wCfr)o-V=wn%jo3K-*h}Z!J$WC?2~Jm4&-2V=3x%xVRjZ^4ivDw zP{N{lA^LDPbGIP>dS@2?^?@vw7fRoBJBw&LibO-k>md6mb-HCiGr8TSpqX9dN$hT3 zkT_^(Ehx#fo&-;6^Y^U;jmDIy$fQkZz0KbTnvv+vQIRnG-(8|2bMPtCYrf{=jLpYb zEbsHToB{1)WCM+8ECdJ_@djQ^?!*KXw4XOH+!!;V#Sv`4@^fl zJB$TeR|eBB261SoK(mXA1f#W&iUef$GRQ%O|66a@)k4S5T2I!=ck6;&VtAliWS?~? zLn+7WNXw8`hLYgs1B{j@N zEd(9N(0ZT*yt|xTHY#s4YNePTNLDSP~F4` zwrUmFs)e99>U2?&XgS0v$pC zN(kM-9H7QZcQ6klXplKr089yYhNu{H2eWiXi*$yln6%#Rj8W0yZw2++_Jh`l?gbH` zWrZNx@EfEZ(;dLU9KgdIAfOF0NkThD#h~-z!JqPmr!-G>d$4HxsF?7tzsY1a?Er1KZ$1(O3X#KLhZ%l5?xJD?avIEuuZ?@lKwHLD zO659#wOlFzZ5WrZ3{kNuHy{P96Lu zZ+KDjVs`+Gb_mozml!X12Z(5gsOWUwKloqX@VDmg&g&q?FU?<;FG2gsi)QgpIbQ@GvnXJfWMq;R})BQFnm9g#)75r;`P= zVpit3iwbx>F=*`!Xh;yWND4e$+a1Q!DWU>lx~Rx>gSK`bcO67qhrH&YUX~!u zgRLh!#XE&N#p<}5nHigZGLhw5;@KcX33}=X9F`zR9HYW zT$tmNpp1{&Mi+!EH|i7smy39Z*bx1Q5^k{SZU(&S5shZ>Sx2CnvP2MeUIwUE0_Rsy z^ngk+P)P;qUVsI`2ACP(?fr0%LnR?S8VKnL-DSzf;16ek&I$tc0oWKo?QF=tLeTkI5HU~<3t@p) zI6+w3;kz+Gy&j0zW%$0#dvF#g-GD|;A?uDHEKqL-!UB!kLG*%FPD5B`jF7#CYz&~a zQxLI6xEN?BCq!&JT-V!k_Q|p_oM40b_dJ~SoDH%HL4@HeT-{%|tT;PNR*4;EN)nv4 z70$W_R|gs&2AxI5#_$okf0K>jJDerJ0W;5<17=l=n8E zi0oxxVEBL{as|}WMHwM}4jQpW5dryb1B!?^#<;RRBLf3sTp1KdPK*o;7x0WUgI1P! zgA~FswR-=MF-5qs(0)9qY=DVDdjFu+hY%4^KOV#at@i`bh!FzN+C79wJm#wXWQ>*l z#U({4rJxcJqz`5?=4~3>-WT0A0j1dL%jcD1PYR3-SrJ=t9r|XxxJ?D67#>21u}-sf%_;0g8IiO0rDo z!S1kCX5dJ}F?a)wORU4)a4#{GAP(gO54I2*l`%7iZleJ2qkxQdYd}XCv5j_vM*ToN z(KnE!$^dE!(PC5vsg(yl83kk=tjPlI1;bCwlezisa2o9NrMoUFEG3+vl_H>q1Os@> z9H=b~+9ZZJiF3jP&|wMC6Es14$Uq~rA`C|Gvot|t_@JJL2!j)J*Omwas9c7q!yHM4 zggVHL$QZefz_kMkw5k|XD?sW9%u&)<@akk_Q>j%>g3JWfjUXC?A*CY7Eg&AGqyn)( z&1_nQ{A23hFydVr&ZFvB+@eZ_~6zogdueJp3zHEWo33eJ}|BnM` zwVDe5wh$GQZWk2;PzM_{e_#n-KEvPA2Rcuy;|?PO!(z~Sn%0vg_59mFr{$S6A5n>p z`~Pr4L!ApFe+y{cd_$cpBYz8M?zExKjgh}49CQ?4ojW6c3n;%g)Oj#M4%}?0^JL_2 zIR#pFR_DdY-!dD_@@6bmLGGD>+z85#prI?+02in?3%2)gw<*Xumd8pzbhm+AcO2|q zke=29CA=VgAU0?((gnlYuld2-Y(X;>{4GA9ZMHRXK8&TWU?&u!TMIrc4tnV3>m%s0 zAj3h063kIA9YBL>(18R{pAuv@PFi^n&Do^0$3aHeC zE82`h5h#1X6}8|{1ghTQib8QH0(k(gNDVZK2p%Vd?6wUCok!f=1ZqsQ9w=ds{{H~h zuSSu-09qP~O&+vF3uFZUHV+odizNcx9S;~87&-!2T2GcR|9?0EzD%nZvcCvw-xHkX zg{Xi|nq%n*U`v2%NXc!Y}A80hN@eQa3 zf_A^V*QhK3&7-w!VqsuteaqiBiYRAd%{5&={U z#01U5E(FyYP%#h_G-J9Dl%=6!ASP(v`9jbz7E}zx1Rbil5VRu(Dh6g=>U2>t09y%i zYU{~P7ZnpQ7vg5{*c!-@Ag4Fj>VVUPi;7L>2mYxpDh}PYpmMx>3OE!xb5ufF|MPo- z_s2Kbg7(HU^wy{Zbb=PXwy3NCh2B&b6^{m6(B@l)&JeIv#6nP!1TrnA!4@>T2Ri&Q zVIinL0}_mFu+@iJnz9hoi2(`5HQ0jISb|h$ECj9Z014(a*n)--K!ODe!4slWT~u-n zZ+E(=lytYKfVwH2E-Dq>Eh?auJDn~nHL$6PmIM4PqL9-kSv){n>_NjF@X>GZBtxex zXqR3mXz;tD^*~7~)XUwVikhJ_TcleT6pP1PRALxAg9SQ2wVv$e1q~GQdxEyjFtols z=AshI*cmL*`H9~XyhE-tSf*PP6wR%dz+zzLNq$dLkhacXh0bD?PG=4NZ7wP?$DJJ* z9hez9oLNEKxDIDF@Zb^n;5-?X&SSlxl;onq0Tu-fTFZmZtb~qxg9Sl8%mN8QPu6QW zP!b0^WEHmOv-u5t#VahwcZaA{v|cLVZ9D?X1km#&8){Ty8A{$jvjl$&XirqPvqtNI z(i^a0r`PAeqeE~d!Hf(Hy^}%Z1b7=JD8QiGFf9-Bw}3WK!4?j$200MwYH*NHU?glx-1aU|G&P{|8QH{f9>_#p-_^*|?1g6a>r z`!<87bHMJ~336NKbtKn;5(><9??Dr3SX{^7k_j>s=DwGprO>@)3{dk+!g2c@RQ173 z2bCf)Zz21gzl9sJjTCPFZ%{#82C5f8DGqcxDtu7wf&}=$0&$=tRQW;7R*-0?C@7O3 zwq*v1v@B#`V5l#*Wn};v2O2*BrBD7oQ1Y;41giiY7-!1_Vzz?zi*cNK>aBGp1U9?aVRh`l!kVSf(p*Vwrn6{TR`gTs%<&I z9PrwZK1NV>1Xp07@ahDYRfju8K{0bUZGtT~SSe^rr!5bd3GxPVy9cyb2kazpezau< zdv7Yp0W1tm45e2(L_skLo9(k@0UH8Z7-7pQz{F6xrBf6XdvJLs1tx})Oj~A<<7ae= zf~tbUouZ)X2VCEGh=S^y!yTfais5kDgbqi)?i2;p!eBnAbU6%P%^x1z{08|n z6#f>_Y#-e8_0M~tOD;5-Z}B|-Z_ASFdfI<``xgmVI{d;ph^;B!tzqT|8A51H*a#?J71eHv&6 zxcN9!^CQNRMX%pr&jTXS@rTnUAX?I|dyh4PT+h(E`z#{^!zN?!ehY|Eub7&TGlBPL zfNB%i`MfU!{{R1vIhzE{QYE0783q1r4xs)vC=p|nW6;%Nkc> z88Zh!{EM!h)SENV^piUq1#>T0zjSkj21AJ!D3gFv87TNcH4`|NK!TtY1rmg3W{lY{ z#OxF;+^5}8!NO1~3w9-2XMjMbhX{rXK0{}lu(}siaAA)xu>VP!%|ndKfacyx6hKZZ z;Q~#hLE;zG5QZJZ1F{wrZs70(wcQY7Hir?jYw+D*pvfw*d8O1dPoO(MqxDjWBFKT@ z@(!1KP}~iv5YbLA0{d5>+e4%EBz4RKEhlhMQ7Or_1(l)vEsCJ(%N|@&l+;1%El{z_ z-vSzxw`GCX7f5~p73SdL$nd~xYfyND%kvV;`V3n}aKR30B-%283igxy+niWX?r;F5 zXQ*a)`0#IYVtxIwy9sob`0JNx6TsC}Nn{PbEx3AW>25l}$iVRWJpVTE@!GGCf$PT- zxf(G@z1tcOn!;}a9r68o6=XLa`|E}L+nm^5&jz{A@PM@_Xl#Ig%7NEiVEHD{0pBmH zK`o*ZHHPjc&|%dtb3ko3koxW>(7vdbF$g|rEd3>Dm;fA~i1b*(4T_;|2Mv&4kb(%w zm#?3|#tC8hzl5bTfCpcBg=szyUh@&^L37Qp-9w;qy0Z&J;?oTBFLwQ)?s{hzh$K%x zs6XA=1tQ7Q59+UXc7aIp^n=ELI=et5dHO+P5S?8hl05yO;fc;J5J|j#{HKhA%t4JW z!s9BK8AXjB66oW3(bSurtDNZg*P0dq)2p20PC+2}pQ%OoyD1cs`n3@7U^%&H! zVgsM>0AYc8@1SvO5eCr7PY^NCnIaGt=tMox*$*NNwu}tm@of=?Bsi-b&H`muh$)~m zG$5>Ra9L?4m|huX2Jq@;HU@WQ1_p>7{%}?}oD~aarNUV`a29CZ8ltxaF4hlc&49BO z!&z(KtnF~t0XXY4oCP``5n}RvxY!Fg>oc6i!~%1@Ae^NDXQ{zi7I2mioD~FT<-%Fj za8?_f1=*CoMT-g{HK&Ow0Fa)u| zQd2$~0|V%EU=fB|HkjYK*%%n?!6r|Di%o^IKr`E*o`49$F1Q_6*ccc{@PEy4nO6+YV>3@W5hUhzI5t4<1-dr}Dr|?trUX1Q)vmX9@Ab z)CIv=`Mj_kun8{q3C;@QgXx$GXI@Adm?>8TV7^opgqi0q2$Kzhi?za8%i*$H;bKqVVqf86Dnc+*Ood=3r@+NZ;bKeR zVq4*2PvBx-;bJPnaPx%W=E22E;bK$ZVoTv-N8n;dIANxQbHP~GxFI(siZC35$LcE{ z1_ozv3CG9_Q)k4>zyKOU5n*tLi`Bqc6XC2yybR#GA4M20@j~uB6k&J{msR0oU;rIr zD#G9hkKZCb1_sa|j0i(JTxN$eSA<(%}2ocbX zbOFkmDbRVFsOzdg`*l%w=YnpEyMUq#bVI}k6cNz*O#&z@tw1XiL3a)yYzOVd6+k(C zo{f=#!2y11Jjl(GpxwDVuzj{55zyIg3s6KrSD{@%5dn=x3h*N9Dqv(_2tW~OVq{?0 zfFd%Lk%8d@ipUC(EpyiT7V5GB5X_y3>Q#DKy5<> zL1bN^^V0%QL_lY&HK2%qR!nX{5vgZlVEBL{GK-0U!9WPv49y0?&0g8wnGXui{xCrJdj5ERv44~6PK`{xz)LMmsxi1>ja)Q_a zBeAb&^8-ygLzRFgmmzm6Km=gx#meAnU?Qz3BJmjO*FgF~YYjm(V#Noj)r~503B??c z+$#(bHduy-uV|CT5COHdLAnukIbf)X#1N@O5y4!S2QqOgiW-o}G7OR97$Q$FME+xl zNP%ZJKqkUM)eJ)<2t%Y8L!=)=WHpA!5e$*LC?eljQOo-n@jY4PuK+Vs2u3DyFz| zPJVG}5ae1Z$T@S);G?-Ax*#Ih&U*tbF@mV^$jmE&sVgoi%CCe7Lxdpg;EepzoD{HC z5Mjh^?Kowi*T#eFfo~@VhaX4;t{*M}R|5$e6h#OjY&XG!ltM!r;#!Ck(e8Z*sY1T) z9mGez;Hd_h3sJ0sr%-U_Ly>~(!<2&S0;N$j&%w1}k;9f{QS5{!K@^|E z{DGE3_UK9!B-^9#@*ncGld}QKQUK9g4)}l zyTQLe>vYgPQM6d)i`@DF)u*8Qlv$v5g7_c|Idf8{8?*o_Mn$GGM@6GMN5!DCL`9*q zMnwg-tqF8RC4UR(AO)DnaTXO&yQsH@feExE2XgFr^Ba!V1D(hCTTX)3jj%uuLkF$1 z0UbOEI$;jFe;Twn5w!Awp}Q5dg#e@iNpqjL4l)Aoh-d^x3 z6VRX_!|Th?SvMpjK<&rZyP=!4p|gI$&2Kc&9Ldsppri`4rnI{Odg>M%!!_{e0q7+1hYXOD&O{hM zX`LIqf*o|f34{f@wiwjQ7h%w0WPq;02b~EH%4}>5>CjU_*ccEefrHNf2JNL{V*vGa zA$sS*Z$DWHKRbLQBjgNpHU`jMKZxr=JzvmWD{Kr$;j*Bc#Xze@L>RunT>#1h5HT+3 zSwCzHLQF9C$uYrBGzaYtg!sb>E_N2~U(n_D5K}Ps2$X};Ts%BQKnF*_nSj8U2&nXR zz;lucXm=t=4JdU&FztG$?;sYSk)X5$69SdF4B&mCs3M@Wg(}ht3gS1dj^H8;5cbdvx`5v*Sax|{;UhxAV4 z%ae<9Q0~OT-tz>ltViequ`=McgG>g^yFq$fu!aKYFe_Llhn_2qssPmf!cYJ{O4}V= z=zuSK0o~XZk0j`mpPUVD{2_^j=H;M>f^Lg-hM9~|?3!CpQi%`;U8M&$1lgf3i6w~$ zDcSmFq~p8=r;*~eg;VE50#8p|oEkdSgK%FhiA zakGFn>M&ZJ5cMDxAeG^nFntVM`bN-35wsZv-z$Zq6=i5)ig8oiFBZ_bkf1omY(-6g z-V|2>&E%lcmL9DrP}9H#YA48LAPj0ng&Q6S+j)tBfg!l@4d^uS-YF^)Yzz$Db5u$= z85laRe_q|)qEY~2hNy5HZvjhsFf)J_GJ;muF*G0W0adRcDA`uoXz4 zJ@3%fXOL>U`Hev5@!k^1845@SaCF)r8WCU%Kr0-fEt+oY9iXE5J9Kp(sHlal&I29m z*m=tGS@u4d`oq9Vb>z<^>BXpIld zB+y25qD} zQTYG=KmT^I<`+!O$C%PO#X(E@K<6g&Z)*X2r+15rBohMzrba{PS{iiCk{|;?npqea zK$=;wX|@AthAipbU~5ggje2ubBz8A|TJASH-+x}( z3kitM;~)kL14DNaOXum04WE~G9`C%-UBm%R;9!yK8!v&=cLT_gG)v!yJ9AV(CoRBI zJO^?E`6XzV5v&P1VZsC#22X}yh5!a121oGjLTC#Se1VoiQDSZZczFo?(mEqkGY0U9 za-edAjiD62Td^9tN0E(TA_L?^IW`8+esEAovoU}c%Y)i#A`ETt_RJ(`8%Kn}fEjkS z9OzDINXsUg8FnjOE;H=@mP%&W?QpnSHt4s&!3rSo%n7{y0~H)B96K;0iy5zzW@R1t7S0tf1 z<~4-e%Zf~znV2Xj7#kQtM?4U_I6-FssztLC-I_kIeK#6c~h>A=n=!moCH!Q6O_+4UDWSWm?fY0lKl)Rub zXKKLbYdLh5s2FsE*8MPm4y!V}-I=3eaoj}(v``sTF@y3rhz3;*|2u0`I6y@#$mZiL zDlh*sF#NyP{6?Y`bQfs`W3P)Y{C2a>92F7JhDXqGQdqQg9tPc30n;qjd7~TTj2IQ2 zZjiHbAm`h3%E0#dyuODz-ay#>pk5Nl-Jsqkh$h893atl9JbN=3J9QvOKpl5cK`{>9 zZxGL52^f$;MEEUjLb&07&_-N=ZtzAzP`H7E*hPf{bUQhc$qWh%4F4}TzYzeb0hJf9 z))0~!Mz9)4oPtzB_TzxUnx*x?Vo-6--vT<`8EzR1C~!axrpt>#iFzSON%I?UOoI+B zfyjWC{~^nOwoO1}_J9U$ko15SZh>XGMM1`aM#L^H2925Uw}3`fx_LoHwVvc}X#?#p z76oZb%XKtl*%Gn?OVEC#JVJkFv5Is^lz5;U<6 zQ3)~>t`d|X7J`(6uL`*U8Rz-mdZ2_4%uL%4UokGw`2*Bkf+n-(H!^9>wxEUpLunXT zDVPBJA9R!;$O6!K0>g1ukjFuh)%=EKAvCghpb-PksGyBT3Jjp#iO^xY<~QJ*kkOj1 zpxawmj47m(? z3@Hpb44@h#E58y_-a0216o)fFxS)Y+ILoyHe4GPpUp+%9Loq`tLlJ{9gAtNB!Ko#n zTeVY*i(LXd9m^AoQW+Rh7|I!P84?)^7&4Jmx|HX77CYzX!j_b}=7FxnOJQ(l@L_Oc z2xl+`ujn+^Gte_s0JlXH!rgrod^7Xh!xen;6H|O3SN&;}XXfSRf-V_j0PX$;onXKQ zUTp_zWw0@T_M}5bm_RicWV8mfX9+S21G=>eA`4pA4Uq-iZVO7{Yz(*HH>8O|@1N;Gc6_2Jl(YFhPhe&Ee6?91=j^?wSq)I+af_U zC*R2tTH z22J;(2_fAehcX2RIv3MSma;?8n6O4onb;D z`EYd(#zru`!Ii}&sks5LTThEU^V0H>8|6qPZ#bgy?G7pR9aB<@Qj3cb&2-Q}8?>B8 zQS6(aQks+M0iK#bGA1;yC^bE^xFog6IVZ8WI2>#cs09xS6zF8NV}K_#ctC=n(^`s< z_^?x`VUy7Cpu^A&mqBRJH-k3oiS7r$jw?d+11@kv$}MdDfCFrh(_AV*6%_+yRXRQT z0ibfO1ZpQFO+)$t=%;5izmZu8+SLo2PFolN8v26Hqb&rT@eY>(ZT^9C1elQSDF$_* z;W87DWiB9dKg z2Re?U7j*Z4iwX;Ppb*k#1sww1x`By-p|?fl59n+N2nFis9dA)#V1}%}28}_2HGvwj z5J$9DGl9pfLO@$tZg>9ec2UVV_>`r)M}-A+Qizcu=;RHF&JY!u?kV7tMegUQNPy0r z?)Fj1>2)y$b;D!~Z-Yc{JcNoDbjGO27~Z~d03>?v5m>ZGg@c&^s`%c=n=kIXym|7b zOe@GsAXQ*BJ}M;;o!<^If&`%k_Nagy2aZo7khm!_2?{G7F^L@HSY`N2LZNa^oRL3@ie%0b%;Rhc{(fL5a54 zjk%NYHPhW2-wrXAWOnzcfc6i z8P<146Nb#=L-IomC?T#F?N3FXb}Xtpxe0DkI@ozDEqli?)rz&V|SV#7&QMd;BN)B|GQgM zK!P>kEh-kwpjIeY5h&O| zN#uBoiUTtP185rJ;47ZyU!ds;7iId zAS+iemQ;7X>U??d5!JfJY+GWKgYUKv-SU3bmRM*=mF+ z!s^misMQS3hZsS|cM2m}4cko}-1r6*)!lQzC19_MiUhns1r?v5#TuaEv-42%8y>?0 zt(Qub4?bq=Zbq(xdO?@3LTjK-uuS6-keSh-?kodCgFUFH2I)J1yb9{`i7h43-b;9+6M#v#zp#1<4b)Y^yL~Jo!-DowHpuC|A`Bbhvbg$?=(p5>iUUxa3f%XD_bWgm2n-rk1dWV> z)qsUTdk;Yqh6oYRY1W{Gj}QUf5Chr;iVy*fWhB5)%*E_O?uG7j1X}?nXxE2?`5SBv zn1FPGz)Uc~#DIN00%$M_tN^?YA2iDV(FtnKBiiB+F)WRAhy<*+1k(V&=LWrl1XDnb zOJ*Qe03arlp(hNU~XatQHtn4@Nq%TgT~f>xWEqSKimM-GYpU$8tKu02w`Ag zXo1=Zi8)CBq45o9?6Px<3TP~#yF~?b0&w>h6>xW8jtcmW(LE|Gp!V|`6%Hl_2E(_V zCMwOxd_a{wc!acfipn1b28NxW4ZWS$I}dlh_`JF^M1>;_RKYTWHo1UCbHS4WCh$pl zp6(VE(4L~+Ju09h06JU16zJ?WP;aG01+=ffyF~?ba6@N{3h0i}-WCDB|Ks+||QA%5zH`WNE0Ziv?! zkAQ;WaBql;Lgx#pe?G5HJMN;AatAb_kiozZ!_dv#?Jd&Tq5>Lz?sjJBY*7J?ICndP zZ~1W+=ABS*3=k7r-o&XgkATxPDc@R{ig5m_egcI!G z<~Jgs6W%;P2W%nE?E)>^1c$rfrI)(@|Nn1(16s#wfPAtgvXR&qSco(q(Se@s0%{)` z-fnzz2DEHripm2v28P}ql?q4;5p-e_LvM)+$av5pN+1`5s%QrAX+|I(=!_)>P%GZ> z0C*ip=l9R6kGrTCfSOOB2@9~dN>n&NCv2jPe+z(o2U>{N-J$}zqp|rgWAg*f<{ylu zn?aWuSca&`@VDrKE@i1vk$@WCI|b~t&#QZVR7^mrtdmFOcneqz*+x)`1KA82R&RbI z(7Q(kGz1A+vqK*rey&i52~ZmD>4CmM+|tPpff~8dai7^&Xymab-t|5Vn`>2S3 zQZC4NALyBW-99P`os6*K3OhkfaF9ou-+*q)Q0N7%SO)cknVJuPZZrWWgk~2N8OE12 zpkvoSr=5hT$ZP=373qMiYrRw=2=Wf7dB+Gk#Z~9v17?t&;5&U_S;a*~7yIfJ8xxKzC8Z zs6ej521N&G{1s)52Ix{Dr~{6>sDM)!NH4m1&^!G={snp5MMVL`glcSsi~z`hjxB@E zlQg~ol}3gKdP7u1AbEI?$`8=;j_aLsR6s+%-E&kpK;^_16;M;Edy5L_Ks4|=4$!(1 zP;QR^=XP+;1SK(O76O-Gh$YPet=~%6x?NNfI@wxpgIOt^%-v8cpk_mCZae~V5p2at zXn2_6x8TM%pp~kidpx@5sDPSppt;fR78TH%OxVR<@Ht3u_XFf>7Zs5S-8Cu#h6lht z>kU!Sft0n~Au1vumlxb&04*K|O$39JVDlSL&#eXI|LztQ&_Ds`I-nnXWjnj4K*}i= zmCh;P@aUeR0_t3KPEp|jrR^yyPe6e-MMVbG>zkq?0SdAZ6`tNHDxh_@pm6D(q5^8{ zfC@BlI_zd{Jy2)b4Zd^iHBUD)=(@3^5|%&e6nk61R)EqSY=X7*KJ;dPIH)s#r5kEr07o~}5dl2iP?rUO)PbDZ86eWk z%=q#eC^dt}kGfq{BpQ!^LK~7syM0t-T2Gc}UQ7XB@*~sB5`@SS5}nY5)h!IVx(j?} z&<;=+5fm4oskztJ!VM1ugG0aZ4JiG9l3Dj0a2kTHb_1oNPH_F_q5?@tETE(Via$i^ z0o8xtE;Dm?i^>sDNISE1Ln@U{XOUiK0dPI%%+q|B160j*x2S;n)SyBX=EBA!AnT*! zL47F1tl)$R;8`~0b?C*ZB?@JrQ{feI^HWk8&{qgyE?9@GOGjSo4LVx`vep|kCj#n+ zurYuV6J*v6)CPvkx=mz+w87aJKr5(0RU8`w=$vR!l_A3L9xhwL1Q}mtW4I4zfriQ; zI=Gk_7(l6)jRDlp22GEPFo5Qx#K5b*L5J^x_Lzt;%!J>oy$C)FwGTc=^`9Ab?+56v zZ6)wZ@(dQ(ilY)1*y`&B7DyXRgkdKO0|RLCTZF-g6*gOSlNHjxU}JED-d`fZP|OBf zi!Q_tv!j3=rfv)L))E|h*o}?i(Qp3%mD8Xy9^6L&wNyYHGz?m+jygL9>I;LKY+zkr z)u3MQ0+hR=Q$ROpqKJUfZ~@9KAD|H{1NdDWnEjE1(7U<8R)7iG^+$rh=A#p!dwyVI zkhvewz5rAa(4Cp6BA^>ZP(`$n!WLo<=tdD#HJ~#&QAJAOx)eac4O+i|Aumd2To%%jv*6T{lFYnx(3&&&R2SqP z66l&Vm;%>|a0es!a&aURAWP9e1`xMs4YZB|JbwkAbi-V)hGaCd-QXp0peZlsjQsrK zRJebkb6mj%IhiF+0Rd1hX!%4UuIpBiH#_3&v_e7{BJG=>msyezn@)pnqJ#<-Gw2%{ zpe#^_txw0bO3u*O5ZWC^^lr1DBSF}Dx1jkY&~RW3B!e-4>IHiAZb73npgk*~G!MfL z3=R&E*&|T34r|}Dv>qtcyvqve2_ItxO)D_ml?9FW{}%<-$BRM3@!-x8WYrvaWFA!g zF+dbE9%licZVuA}va9(G3rGjJ_1pZ$rok3$YN-muL_<)kTSl7|WH6{r0W$FpFUUsl zeQuCeFx+vV7BHyuqs)fKf}7uXKrOuMq7qQ*a5qLp0AlgY z8Wp{}E-C^yctO=F|Mn0Sy=^>cogpeZH*-{UZpWx-+{{tY1Ko6~c>(HekLbg_E-Drv zGr;p~P~U+}xnl})GRVyC5EUE#?Jg>MTX@ny=gfmHl?0i1zeYs?Y$E6m$QTtB%@dNh z7K41z3HC+v5s&D@6F{TAAXERW{CLSXDZrkAp$c>~4XBC50NF1FYG;7PTW{BK%;LE7HIhxLi6008NN6FfeSQ(>*eCSQ!|OC^ImGfV%Ju3=H<5 zvxyiC9D+L!cV1|I6LIi`z_%leB?`^2IU0Z8Vqjn>K#5HYRL}JQAe-m?f~_dUr*ZsYRJ9r-vL^G^txk*2S`cd4p6uHW%>XA|97}EGBCUZ z-6Ffg5yVOci8+HL4-D9=?~d zAeJRaOc=zH0hy|)bUV_f--vKJYUOohgftJ(0ybfZ4 z+VU^Yf>`g7%l3v?gm%k>}@Xi4nLr63k)4(sJ?5KA4TVp6%8DiL4a z1+g?iVwXWIEfDJ@hy`k=zuXUEfqLyPw}M!pVZfKGK`cFxx`iMXX#VTvbPx-464uLJ z5DT;>?PW8FWdu@J31S(8Sot8935b;nVwr+i(I6J+uFsc&AQtFeu9xm07HB5%r7egB zs+?XLgIKPhaMlE|K=sW_c@PV99@@w?qh6i|u|V@jFOPy)pn1!eyFsi#ki8p0EKu+0<#G@! z7$i0q!~)fGFDHXop!v<0ogfzICe@eqAQtFWt(T=B7HEgb%WMz}bm!R1L=X#9GrkN5 zu|T^^U;2Vr(V%c~2C-s5EK3jzl*eA`gIM6)qY7eyGTcjP5DTU1hGK7 zXI^dxu|Vq#UakePK)V)RE(WncGr%urf>@x5hnM{z7HD7k%T^Ezv>^RuHHZZoxO!O# zVu1!`UZ#Uspz+?9u^<-c&exa0AQotO{7X*|ix=c`dk_mW686#*#9{}DY5)HJAJl#V zm0zHm=QxWBsC0le-Z(&|SK}iFhX0HQe+gI~;-7MWf7^jxmR3-w^5wf<|Nny|85nm& zf-3*kyTAVbhiF9}y9b-=q5^83f`-?@HGC(iRb~P&EkRT5BCVHpgo2D|nfB}d|LzbK zi^gA|5H68v`~~u7iAduw&V+^_%tzqzP5GxE0t z|N8&mGDgK^*FVs1K9@r;oqqlQpEd#F+U8%3k_Va}{9y$xvwo@Z>;L~9pmDaBav&Dy z3c8mfaGycdZesNZ1=pXS|Nrj*EhK&U3B+0iO0+LPEO60#@8|#j(53g#k=xMlu+D42 zorjy>=TRwqKYJkbL^}49UfCkBWT~s1K zLyX;S8n8jKZa0>0J!RXu+(iXcGBg}_Q32I0 zAR1JXfl?l*q+;j<-Rb0`64Du>!ULNxLGqPAw~IVj=&2Lyhqtg z-5V^BX80B~Fb_-gEeA@Lf}9Czc0m$f+FnM`&Mim@1QBX}1Ii?*A}sLehN(e_K)eoG z)dmVAa8n*%QT88nj6XQx!_91dBZG)6jWpzb#)0{C0E{QLj^W!b;~|0jTMJ@1ZD zQ6SbR@a`9P-|Kqn2A=z|NdHgGwC zm?;3woGNsK)W@iZG#`-xoqxgrP7mENDk30><1Q*H;C$wyq5#ThFh#Jj56HBcK__T3 zFGj_pvqVLsyF|qVHq8V%tOqo~0SXeNsNsOla7n;txMVt+!Bc`IDxgz`4x`=s65Ra8 z0(6yqw~LBLcZiA$=(0NS00Fo#gcl#6+4T?=4M;HwEigfakphy{pn?T-H>3n8L&BCf z!qOI4r;CaLC@p}U?4rT}iDo1dWSWmyz^^HU+$#tP575jCWF;|LctFAd$p|w1AJHA7 zk^o5unZ3aR$T<*P5P+h>8BsgAfa@91IRc>i1yqlKf(0~r3mVS=Wh#_*05(rXL?7<< zQAvT8@ZiGzxQhz71KsJP;?eD+k^xFqy)G*70u5A{clxM+4qgBokK|=gxcg|ksJMU< z2k2y0&{Anod}_O>IJ`_i-H}G?@PyPW9J?f&|pCK9`Kss z&KQ-N&MhjSqPBaB3TQ2G=Nc8zHlFS^Dxh&5cp5^S7s1i^4^%#b&ZgpGV_+ytX#5AN zGWlE9uro05w@qVYU}*fu2ikAd0y<}(zs;KkB(fMRGJ^xemIJMtYw-uOLFXy(w}NgK zX#UI2-wHbR6kI@omw3EP0Ifd$C&AwWIwGFGt$_)o9n`AgZ!rWJ(w5E)5&<{iS}wAJ z*q{bCe+wH}9Mt6FZv}14>Ykzkn#t*W@gnuZ|NqTD{_(efmaTS!G7zZR0}W$=Gh~R0 z!T(GA`!6)VVLA9pzB5Dxbcz>fA>RKG6$8jJ0}ar)p3QL<&{5b7ofn!@V9D#*6pK&5Hxg7fI{b`d?(0tEGo#M0}%mDfp(s1KE(v8&OJ_n)WLiP zQ2-8*Q_ZJXFcg470~EHP_7;*J&>E0a&8Ij(ezxI<8VPn<^Bb1Ne~ciP`lzVzw`>8Y zDzN)o1UW$o0^}$D7H>`lhJ$Yf(whG=^0x?aF)*Yx|78LvGX7T3*+ro1oj_$Us09Fu zMNrBI^)BGGTZoFr%Zm&Q49)*o`CCAjaPzl;dfm^GiAlG!gDtZI zGXsCiZVm;@aqN**3aa|v`1&7s#*oBuKLw}9fN`5$xX`Nj$dh(|d=YpbBTWmFEn z04H4j?NAXH=qee*OD{o}EjIq+1}E6$zyJR?{sT?kLCS*0f1qQ;_*+Z=|Njq)=*}D! zyZbIGb~j9?K-!*nV^nx}0Au1NPT~sU%{t&p^3|cOD^W^Q9RZ^uAppF1Y z;%+mjX1jUv{>!^Js+dZg8mpnf0Xn?s?oF7on+I+lx;q_L_jsC2e`!ZQ3*KiqT&Nm53lBqHG}js zLRzn&5)@SOfP)M)8S?V%-~az%&1S<(FZccZ{~xlGqVt8}CDjlA85nFGJ~A-yx6EN? zV6ZI!Gbe(W3?OFfwZH%Wzw88sFSJPRW&&k3a6<*0V&Hqid0wvi`~N>`2~D5!2fZ}* zQBeVvX5hldr1J&8$0?}WK?U0jkyro!gUV@er2-nyLP!c6{3X!%2sEzS{8xa#1$1jp z^IskQmO{w#L2xSuv=#=`1c624%PoKY|8J~t0B8JG(0Eq&3{V_GGLq$C{#MX~rS|8X2r zq#t}Q4=R8=e>IOmI# zhH^lari+RWSOOYIV0O2QiViFlzjXQy8qYb_0800uya6irL7hLaO2bPpZ-K{q;L3%6 z|Nq}x#sDwAK7tlKK%#?x`xbDtbjqk4d@lex17jWY|0i?_8Y#n zywBfi3K}V@2H$X8Vhsr*sGA|2<~J-2yFpDW2L9Gy(1}tmDjD!>+YCO~r1cYM3zM^k z;agBJJo)+mf9p5?mTjPYaV#o^Z^15kdG;sBzunOqt+)AG|Ni{{AKYJhY5nW}f5S_b z;L3=<_2JL||L;76l|qoh>IP^>-Km$kpa3XQi2(Txt=ZWP8p#Kp&j6MK_as3syx#nV zqZhOo5Y)m)5rwbmZGOY@avNw_8Z8W-_Y*uc32HmBfcjjZ!Vr{sL5p2Mxdj#}pnMD} z18-b2~u*$qQnG?5@f#_UV14AQsM*2G$1LEDIgl=V#7->-+liN zI@AU}oCQ(>t{xC>ISo>RW(t~;72p5=hbGlhag;QCtQnMmLA6V7jYFcfmV#d{0uHFUw#LvLh}=*s*B&?W73eZ z6!d&q8sCeVCtIAp{r?Zz^x7Swk^@@z8=?X|ptt!Ahc!4i@VCl+Lo3C@Uvh)oB%|^| z_|yOY-Od^>tsn(GD8eB2hC%|9;dK{Q(?dh8+d(x4f9vbt|Nny`5@RecC%< z%cCGwpi4s;7$D{cK+S(S`S<_-6Oj6wppAcM86Px3c|-<$0WoyE8a6%zvKZuMNc6z% zgK$CPQ?S7tm`k~6;OLajN9n?LbmHd!CFytU0NJ8t4 zQSpHkTA=Y0kUNpGE4cp;azDrd(7AHgz?%+AT$*cC0)$Fc!S|E59w<2ivIZ2hE-D7# zA{KngGehfv(pRrnfb@X}RAp5DUvGZH@_HJiz0?gZ`CI?p6bOtVe3uvu#>$g(ghW(%|B#itmpcUJV_2Bku z2{)vd03Nk&*bi=+mc9XJ15jZPPJ!@9Z+^pZ+eM}1ChH7V28KH)Z`P>Tfx5DGw_Q{U z?wy3Jn6c?~QK;;(tOIXcsIPSWrDBPV7YDM35Q8BnXAKZ>^2RW7z$@!fzDp*ICz@<8LZsO(V zfB*mEQV1^IVG3`9Ycu!>Ma^$uouMN*fqT3-V7NDg>H&23t30#6e#ce?1oh&M#HA?6KV*^$Vn!rI17;yIjw2TST z!Dt4rMQVOy)9s?-(g`|GJw^p|Dw;`Wjfw@dM+%z3hW1lIhg91#IxsVofVMvvfCf*y zYar*9LE;6a0zhuWbb=PoyQqLh{2(g9jhK?1uw`DLEQMKEmd*rcNu*(JZ~=x~lzoeR7j};Pm_?`57J$t!h(>4Hd(-1y-`KsO%{kSD61g?l%*RKUM1j@ z4qkAqMmzHh{bgTGN1H6QlqK)wVDHK{S9$ zIEV&_9B5+iWjSb033MzM1FYyrl8lBXW5hkVC7_{L1xN(|9%KZswF5^AXyy@Ag+Nac zGd%G69&Gi!3L66h6Lf7jX#Erj^C0oRvM_*GmOo%+VEDnxzyP|r6Ql+kUe5wqV~#8b zTAzNHg@NHL3j@P-76yigEDQ{H~bERyV8Nm0tf(B7QXMlq4Zp~+AU;ynkZf0g+ z=w)VLn9j_=u#lO7VKp-Y!&YVnhW*S83@4cx7%nq2Fx+KEgac>?GU$A$-^>gQ7HkX* zpml0985tNBGcqu&Wn=)K(0-7Sf#EbG1H)BDh`#%viD*U!hR=))41XCJ7(ioXf=mny zpgYD?nHU)KnHU%>nHU(HnHU&+nHU(tnHU%nnHU(dnHU&KnHU)AK^q^L7#JoqF))C3 zPcLU;VA#mSz_6Q%f#E0<0|RIn47BzfGy{hoR_J`tx&qLubae5-#s^&*4qAf)S|bBm z>jhdR6wJuL5DN`cdbk&KW`7|g1Ng-LRz?Pfr_l58L3Zo0F))AzDnSE0)WpXb7#Kji z@HaCsFo0Hm&Szj?0L>AA_V+7tjiv>y%4mMhz)#41!!e4p8qcGwM> zf7l^=!r2%=i+dpU8gMW`@5*%HfSD2i7fa({U;v$I!^Qx*ix*diG!cdsoUr>ik8?7B?*M0G zxXH=D09qr=#_*bxfk7Lz{D$E#Cj$d$qHn5xEUBgD}^W zx7>o?VXMUp^N}qt0|RJ9od^Tywo{0k&+@|bYQgWOt>T0E{30LZR&q85D}Kni*dh$e z_!$^LE78~(+65RGK&$aY7)}Vl#F7OeC;qW9oDyVU0IkpyVbBqRg+aOy%q_)23=E)E zdm;?=LJSO`F=`QpIYJB!pjCS!3>?Ccd$`#ce1sVoKjiE#wv>P6j#v8>M7(nY$MHqU; zVR1fFoPi+@yytEyTp%!@N<-a z+2$t!xe1(&AzK1+<{BHrR0#%fSs=o&6RzW<1niF8?-H;Zg0&@Kdc7oJvH_AX*%r9$ z21!_G+<>$G!da?PFj+S#SWIWaSv_#pdN}J6ob?sX5|U;B-&D@VU@Q%Di={NoExFP# zm)1+e($!*Vm~AKFteeuXaCrvT@n0GiF7h&v+oRbStYu(v87Bj?w-zqDKn7NVtcI)G z2Uqt>29_(NWnnB`Sy;(nFAFOf0%c((Lls=z99dY|xkwgrY8o5E8d=bJ6QGjyi7YIB zf5^g8r;;2@%s>uuZ!sH#fIKXOWaVLbAx|C_R&DZ-+pXCcF3ZDW<`0}DssOnMnT?@c z0j6WV0!#;+A}sub6=5N6pa=^;A4ORB5Ef|FB7_B+M~ARLO3$%0u!UCOQ2VsG>dqG&B^(7D%sND!*fmUTeSfDW}2x|%4RiOP*5HZkB zF9-{CIuwKj+DQjtfzFA7ut593AuP~NBnS(%fgHjD9XbMGfzBs^ut4XNKvfa?GalR?Bl<6saLXq`NS z1v={%!b*Yb0Nv6A5zB##fo|Z2h?T&_D&VXdII989YJsyl;H(}v3$*7FV%`+E*bF#p z4x9xV>x8HS4RS(Qpfh+NtTk|T8{jO^@jDRN9dNNda29AkIz;veTO;4ILIMG$qMsR0NJ zv?2q-0?oTZSfHU%2n#f53So&b!OAAk@F_%01}>%mXMrw(gve^Z#dP2-&|UKoSrfRJ z1)OCAXF0%GE^w9yoCR9505Ju07%PMo0+)?|vtr<^1UL({b_JpXbTT=Fl>?Ur-E$8S z1D(SFVO79oYv3%T0v;0j@Z4poJ)K&Uyl8y@0dcz*(RZ z=pp8T?$U*@e!yk_z*(SXA4C>(@)U%{!2&DcK*t+F#6Tx9Ls%kkSqV5x2F?PVV+c{F z0vFSOvp~m9L1Yc!VkU4FXmJZf)&?%-0B3=2mV?N8z{PyvtN=JG1kQ?pvtr;Z&^a#< zQ&Qk!pc7vpVmWZJ0yqnF3JgRRv?L9}s)5UbPKJSqwZO$X;H(}v3v_NZL>=f9ObBZR zTy_qe1v;ArBD(}GwgS#t17~f3vq1O$Ky>VYi|v844!~JQ;H(pH7U&#Kh~5iuu`6)a z4LIu#ob>?CdID#?fV1AfSs&o6FL2fmI1AU__43TTl>Bl%__l5E8YJj0bkOKIsJDWS zLCb6dpl4-*7Aru;<`Os<7!bSJL3?Z;a3PC;#!3vhkwrl5`~@f?{h+Z+9%MDE7#J8f zpokm;so_Od^9bZXK4cM)%M(yU28IL_ z5l}mD0*VOerdk07WL@hR85j&uL{2g?FdRS;dCJJZa6t*C3-f#*4rRzra*)>`n0CAU zK|9GoGYSxUVB}BGlpT}l-Arg)uQiLHg2}5KphR9J2kq0Ou-`E)#;!BDW^NMp4OH#d4D;eUG!E;vO z;7Shdj1kDWOjxC$$1`D-3r;P8h=+it(9q0uhe=`{um#tLDFxRRoLQBMW+Gf07CHCS z61Sqn+|;Dfw6xSBEDAi6^Yb#(Dk1J=h=_nJKAQB?9tua$L(&^GeW<5(`hvEWs)Px^B9(s5rj}GkD-qzMz8=!7hV@n6VMu za_~W5zKI24nMEa~i8m5>W=z~Z3O(o&0y6Vp>cN6k3EPaq3OP0jX&NFX0f22zgw z4jtqq13Jvi1b%0xV@g(OF*IQWr6!lSRzQLnY(MB;A7`-VkQ@aP1jP@MP!M#o6na4q z{8k}E_#+NIb1KTrONV$rBtIm-0C5sdaB7KLeo<qeKz^}< z5!^#4SpbXbkkpD2B&R#)WTxhogyaV&7p11=A)E=h+dDO{1QaMJ!VpV+^7GP>jB!sb z@lLG_E=ep&MX}R4v7n^12uaK(H4S0_C^aMBp%hY-n4ImKUs{|BPG%^kKy*N?G=v{j z2g*h0;RR13@U(|8C@3{2HL*Aq<|MdM&_(BvSVpJ?c^@3{puk0mPjr#714O8q~T2z#pR{}K|ns!kQf);S-hyK9~1KsxpI*k=l#()bMumhn- z^g+%ugqjbQ09P-_>Pm}KopUmivyl}+V>Lgy6jl&|^+JR}xj!?l5?MXyIx%EEL?I%W z!McN!i}G`Fkd;9alW%@WW_})~xGU%&EM#Gbsm?k1#i>D{gS3ia0S7i7A{&-joSBrF zlUV|HAGZ4>A#Hc0FoZ?~YS6>vgUb^OJVA~rOGI%##739I+{AQP^#^td_R0+`1pw9#9(;f^%L-Z z8}NEcka~s^!G$3G@D-`ephfO7=;sGO)~|!+UAm{JfTmEo=cs_@RF1o-fF=zYx}9`d z50r3qH-LuULHn;D%Ttj}Z9UN03>v2AZ)xIVU})G4y2_J*zjY})18Cb5Xvz~rbAV5!E_O0GyXJ7#Bk}-S>QVDVZY=0E!n4ebAm0l+NeZM#u7!3a# zegmzK&pvL`e2kIVMa2YaF=#b$r;CaKf6EDwVPKc__Naj7qPi!8<_mh)sDP%Uj<;z81akBx@GZ>zEvXy~4BahYQ$cHM!$4e2 ztDpvhE((TP2R185MWoY*upNvbLm{pN+3^Xxcc2CfDuC}<0(lc`2a*1m3o;ZEI-v0H z195TsLl|NQDD=Q~5a|y~b_RyVJ>byRR$yS@Z`HtQ3&?0@h%Kb~q(rcB4>&edK{m7; z1MU6A=?~C41#kpF0vF~N&=w8cao!!GVgQ;DX5e>)XoDsyX!whR?jC092HOcqXVAz8 zn@&`0px6NNKEehNPZDH<6APLZpb&#vAppBCn`}==gRS5|vjSu})C$m6Z}46QBCP;v zMfHUe*a{vrE2!!VWv~?jXjXunLN#B=fvpfhvx2I=kOx~Kfo26&eW3uhLI%wWs`^3^ zY=r`v6;$;F=%}zxClxd+sOk$LurD;wtRTe~orgfzwDE770xqQZT@QgWdxw)w!){y9 z*c5;3W-d_GX$R)Cd<9(w0WM0QnFn5?fV{O5!A); zlb79~y)r%EvKeAWr;myV)KXXh1}Tq0Hbbq#C;>o~HK;^D)Q~0O-H=iev@aG~ySFO+ zfNU59tui{!qQb@i-OmBi4q7v0_zn3Cs>UOrR!Qdv@D{M%78THn70@X}peh;EmH<`B zkQf133*D>(zTO739tU)(5@=WKq2@=b&A(LnTR{uVI}bHJau8r(X#VBE-vT-suVD}P zjtvI>R?sSGSVuIGrbOy?Rn4m3Aoq-AmfuXxZ zMW@qck4NYG){_uXwTTQ2oj!X!dh3{*k1@4gf{2DSF)(z7z(hfZYl9B60GR?x;>TU~ zfR@C8j)&p^ohF3{ipiiQCE)vAI-5ZaV*ZvrY~bSvq17@xC4!sYpxs}f3$b7uu^@Xx zk2izXuYm1o2DL{aEYPYI2n)251;PSZ24Xe8;W*X|E+>vPgG-2G&EOa~)(pC3kl|Rf z6R6lY)(j5WW6hw&E)2(-!Od{cW=%#0hX0_gqM&v<$Z-CaTvi4KunQr3Rza@5)_J_U z0VE6AEGPH>LhFGN(5WIU$5~WBi=99zilOxYf9r1+28Ql-kb7GXlxTHN2Q~dcci&uq z=)|h$I1AK5f>wc6Nx`iGO#u^O6^b6v#5LG&1g!!cjRUvp6{yH1>?;&K+ZYj64^&Wt`V(_N=R}~z z9)C;QumArsHS@QCPBJ~tq5|5I1vUYmqCiQQzs3L8|NoFA$N19u7o?a66{+}&bnyPZ zZg4dRiYsUd&H_rNkh}$2fda~#pwmZZ`~jbbVgqtpClCBeI}VUfK*_%woF88nf_AgJ zsDSs;QHcOHq zIg+tqH^>kM{+8E&LAyo4xs<;ZwEYc-xg{B3Gn1fZf-)D(Og~7zW_&sSFZg^7SQ?#; zk@GsCx{+MO-%|Mh|Nob%pflvQfHtncb1r|2Kj<7BjQF<%9mM0J0?PGBuHbJ`{QLj^ zOORop${MuH6*Y8U`u+I-AGyMLss7{t|JMKft$M%y|KAIm&fE`5c%U;vL4}p!x0f!z z{{L^Nl40z;F8Qtb*}vvvY#^TG$>xXunh&yr*_WCh{cAqN+)yvWD0$%fh2{rL4fV1N zpw?5k0>A4=!;_$tG3)35|Bb&G6_^<|GV-_d{QUpl@MPmJCIw~&{wW6;Prj@I$^T~* zU}i|$mDp4wm}YosM^F<3L*suY0cHk%mkXUAUKam^Bw0|Mj^?q_@1R5hDs~xPF8K{& zgGyq?m%5p|NV;VB7Jw)3~d{Q)Ti6~v4$gFs1=MWu|9fdMt=fWnu*wdB|T z|1Sl;|NoCGX`tq4(7H)z(kP9CS6olXWXpM3!zi~~Jy0e1caB)_8_F$yX+ zK!$=&)B`)L^*{;QR%>u6a~v!QQON;5Ewu9+viUwLD%~L}3XPTEMoo!z!!B@sF5zw1 z1w-bS0$P4|oJ9p5aG)iV3}6$X$1EEjXsDE7DA9l#v4OEv7Niff+!90I>tksX zx+4`@ZwfGGL-N`1$ROO4|e;gXmm#!wBF|L zD+BFR-vvsn4E!ybU=FxRunVH}(92NJ{_KWbph#xmZ_xvtq7RaKJ+V7dqV;yk{MUWG zWuSOs0j-t9aO_L5|Df^+79Xv*OUxi~0xE?tN_7rM>PBu2fzS4kh&~Jo4p3B}Y%y3DS8BQ1`^BfKFnP=&n&w=qynYf!AQ2hmqS+(%^Dk z6ci@l%-;z;#-a58??c0F4Hto%a9@54dx{UXVEqPv7A2VNh^0!1mjNG7ZQe$oU~ivB3x{4UqTS zhr9b&DIl(|1K*65Sdyv`;uEZpnU|6Z+S7q$pJ+)@W@=fgf{U|4T7D69yC?(LEWdn( zg3OB49FRnAVo9+=8faz{B8RXiEi*4gAyJ{YG_xczDJK<03j=QZ0^D3c<|-7Y=Ai|g)t={b?&Jp0U#ka&=oQz5cg-6fjj_CV~(IiP@Y(nqL7@QTaZ|i2}(k! zai;*jbfy@TMv_WP6kryiI$0sJSfMm8u`Dq&2NbQKYy>tRY7{h3h%yQmI_O3so97x# zoKZ-DjcyzRsOJotW@2ODWq{qU2&w}?d(GIu`<6jGHt=p+&@N^X2GFi+h^#MM2WWRJ z=#D5h2GEWv&<&Jq46mW51F$iGb`XIE7DO1HaKLVn{J;U(6)nQ>11`n}-6<`?V95zN zDT0l`lnb)YQG_9w3$o8qgrSHFCOd@-a$_VL!(sTIMn}F_SxPPfw}pa2rOkYi^60@L}9YBqOkPrBnsQX8w!_=gUe=!LUsv@Ff4(~ z?uE-f7KMd|pcsthBL>Sysba8QxD&)+F2%CSJUs_oT&Gr)AQqW}wm^W2M#y?`P?HkO zLnT0^31}}WXvH?DLkQXH4%#J(5CPrvqaX}hMGevq+IQN3B2oxiK`w% zV0loEf=Gh)(?Ntlt6;IOEnW#x3N;6$`Z$WnBPIq0$m$u;LM!Nc8OH!ms9;EHQEp~l zVhL=46G8^19R^j6b-@$XRrlb^s8hzm9RiL$=?mh@tfR|K;mI%71mbf@0t(HqIPA^ky|ed3kzHa7JQLs!wKdNim8AklSvd!GX{a z1X-2n;*3y?6h&Zl*jM#|ms24x!-HIo>*nN~pO==I4vlt5N5eA@5rg2K2UOM*+uASy Dg7SY^ literal 0 HcmV?d00001 diff --git a/external/openal_soft/include/AL/al.h b/external/openal_soft/include/AL/al.h new file mode 100644 index 000000000..413b38331 --- /dev/null +++ b/external/openal_soft/include/AL/al.h @@ -0,0 +1,656 @@ +#ifndef AL_AL_H +#define AL_AL_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef AL_API + #if defined(AL_LIBTYPE_STATIC) + #define AL_API + #elif defined(_WIN32) + #define AL_API __declspec(dllimport) + #else + #define AL_API extern + #endif +#endif + +#if defined(_WIN32) + #define AL_APIENTRY __cdecl +#else + #define AL_APIENTRY +#endif + + +/** Deprecated macro. */ +#define OPENAL +#define ALAPI AL_API +#define ALAPIENTRY AL_APIENTRY +#define AL_INVALID (-1) +#define AL_ILLEGAL_ENUM AL_INVALID_ENUM +#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION + +/** Supported AL version. */ +#define AL_VERSION_1_0 +#define AL_VERSION_1_1 + +/** 8-bit boolean */ +typedef char ALboolean; + +/** character */ +typedef char ALchar; + +/** signed 8-bit 2's complement integer */ +typedef signed char ALbyte; + +/** unsigned 8-bit integer */ +typedef unsigned char ALubyte; + +/** signed 16-bit 2's complement integer */ +typedef short ALshort; + +/** unsigned 16-bit integer */ +typedef unsigned short ALushort; + +/** signed 32-bit 2's complement integer */ +typedef int ALint; + +/** unsigned 32-bit integer */ +typedef unsigned int ALuint; + +/** non-negative 32-bit binary integer size */ +typedef int ALsizei; + +/** enumerated 32-bit value */ +typedef int ALenum; + +/** 32-bit IEEE754 floating-point */ +typedef float ALfloat; + +/** 64-bit IEEE754 floating-point */ +typedef double ALdouble; + +/** void type (for opaque pointers only) */ +typedef void ALvoid; + + +/* Enumerant values begin at column 50. No tabs. */ + +/** "no distance model" or "no buffer" */ +#define AL_NONE 0 + +/** Boolean False. */ +#define AL_FALSE 0 + +/** Boolean True. */ +#define AL_TRUE 1 + + +/** + * Relative source. + * Type: ALboolean + * Range: [AL_TRUE, AL_FALSE] + * Default: AL_FALSE + * + * Specifies if the Source has relative coordinates. + */ +#define AL_SOURCE_RELATIVE 0x202 + + +/** + * Inner cone angle, in degrees. + * Type: ALint, ALfloat + * Range: [0 - 360] + * Default: 360 + * + * The angle covered by the inner cone, where the source will not attenuate. + */ +#define AL_CONE_INNER_ANGLE 0x1001 + +/** + * Outer cone angle, in degrees. + * Range: [0 - 360] + * Default: 360 + * + * The angle covered by the outer cone, where the source will be fully + * attenuated. + */ +#define AL_CONE_OUTER_ANGLE 0x1002 + +/** + * Source pitch. + * Type: ALfloat + * Range: [0.5 - 2.0] + * Default: 1.0 + * + * A multiplier for the frequency (sample rate) of the source's buffer. + */ +#define AL_PITCH 0x1003 + +/** + * Source or listener position. + * Type: ALfloat[3], ALint[3] + * Default: {0, 0, 0} + * + * The source or listener location in three dimensional space. + * + * OpenAL, like OpenGL, uses a right handed coordinate system, where in a + * frontal default view X (thumb) points right, Y points up (index finger), and + * Z points towards the viewer/camera (middle finger). + * + * To switch from a left handed coordinate system, flip the sign on the Z + * coordinate. + */ +#define AL_POSITION 0x1004 + +/** + * Source direction. + * Type: ALfloat[3], ALint[3] + * Default: {0, 0, 0} + * + * Specifies the current direction in local space. + * A zero-length vector specifies an omni-directional source (cone is ignored). + */ +#define AL_DIRECTION 0x1005 + +/** + * Source or listener velocity. + * Type: ALfloat[3], ALint[3] + * Default: {0, 0, 0} + * + * Specifies the current velocity in local space. + */ +#define AL_VELOCITY 0x1006 + +/** + * Source looping. + * Type: ALboolean + * Range: [AL_TRUE, AL_FALSE] + * Default: AL_FALSE + * + * Specifies whether source is looping. + */ +#define AL_LOOPING 0x1007 + +/** + * Source buffer. + * Type: ALuint + * Range: any valid Buffer. + * + * Specifies the buffer to provide sound samples. + */ +#define AL_BUFFER 0x1009 + +/** + * Source or listener gain. + * Type: ALfloat + * Range: [0.0 - ] + * + * A value of 1.0 means unattenuated. Each division by 2 equals an attenuation + * of about -6dB. Each multiplicaton by 2 equals an amplification of about + * +6dB. + * + * A value of 0.0 is meaningless with respect to a logarithmic scale; it is + * silent. + */ +#define AL_GAIN 0x100A + +/** + * Minimum source gain. + * Type: ALfloat + * Range: [0.0 - 1.0] + * + * The minimum gain allowed for a source, after distance and cone attenation is + * applied (if applicable). + */ +#define AL_MIN_GAIN 0x100D + +/** + * Maximum source gain. + * Type: ALfloat + * Range: [0.0 - 1.0] + * + * The maximum gain allowed for a source, after distance and cone attenation is + * applied (if applicable). + */ +#define AL_MAX_GAIN 0x100E + +/** + * Listener orientation. + * Type: ALfloat[6] + * Default: {0.0, 0.0, -1.0, 0.0, 1.0, 0.0} + * + * Effectively two three dimensional vectors. The first vector is the front (or + * "at") and the second is the top (or "up"). + * + * Both vectors are in local space. + */ +#define AL_ORIENTATION 0x100F + +/** + * Source state (query only). + * Type: ALint + * Range: [AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED] + */ +#define AL_SOURCE_STATE 0x1010 + +/** Source state value. */ +#define AL_INITIAL 0x1011 +#define AL_PLAYING 0x1012 +#define AL_PAUSED 0x1013 +#define AL_STOPPED 0x1014 + +/** + * Source Buffer Queue size (query only). + * Type: ALint + * + * The number of buffers queued using alSourceQueueBuffers, minus the buffers + * removed with alSourceUnqueueBuffers. + */ +#define AL_BUFFERS_QUEUED 0x1015 + +/** + * Source Buffer Queue processed count (query only). + * Type: ALint + * + * The number of queued buffers that have been fully processed, and can be + * removed with alSourceUnqueueBuffers. + * + * Looping sources will never fully process buffers because they will be set to + * play again for when the source loops. + */ +#define AL_BUFFERS_PROCESSED 0x1016 + +/** + * Source reference distance. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + * + * The distance in units that no attenuation occurs. + * + * At 0.0, no distance attenuation ever occurs on non-linear attenuation models. + */ +#define AL_REFERENCE_DISTANCE 0x1020 + +/** + * Source rolloff factor. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + * + * Multiplier to exaggerate or diminish distance attenuation. + * + * At 0.0, no distance attenuation ever occurs. + */ +#define AL_ROLLOFF_FACTOR 0x1021 + +/** + * Outer cone gain. + * Type: ALfloat + * Range: [0.0 - 1.0] + * Default: 0.0 + * + * The gain attenuation applied when the listener is outside of the source's + * outer cone. + */ +#define AL_CONE_OUTER_GAIN 0x1022 + +/** + * Source maximum distance. + * Type: ALfloat + * Range: [0.0 - ] + * Default: +inf + * + * The distance above which the source is not attenuated any further with a + * clamped distance model, or where attenuation reaches 0.0 gain for linear + * distance models with a default rolloff factor. + */ +#define AL_MAX_DISTANCE 0x1023 + +/** Source buffer position, in seconds */ +#define AL_SEC_OFFSET 0x1024 +/** Source buffer position, in sample frames */ +#define AL_SAMPLE_OFFSET 0x1025 +/** Source buffer position, in bytes */ +#define AL_BYTE_OFFSET 0x1026 + +/** + * Source type (query only). + * Type: ALint + * Range: [AL_STATIC, AL_STREAMING, AL_UNDETERMINED] + * + * A Source is Static if a Buffer has been attached using AL_BUFFER. + * + * A Source is Streaming if one or more Buffers have been attached using + * alSourceQueueBuffers. + * + * A Source is Undetermined when it has the NULL buffer attached using + * AL_BUFFER. + */ +#define AL_SOURCE_TYPE 0x1027 + +/** Source type value. */ +#define AL_STATIC 0x1028 +#define AL_STREAMING 0x1029 +#define AL_UNDETERMINED 0x1030 + +/** Buffer format specifier. */ +#define AL_FORMAT_MONO8 0x1100 +#define AL_FORMAT_MONO16 0x1101 +#define AL_FORMAT_STEREO8 0x1102 +#define AL_FORMAT_STEREO16 0x1103 + +/** Buffer frequency (query only). */ +#define AL_FREQUENCY 0x2001 +/** Buffer bits per sample (query only). */ +#define AL_BITS 0x2002 +/** Buffer channel count (query only). */ +#define AL_CHANNELS 0x2003 +/** Buffer data size (query only). */ +#define AL_SIZE 0x2004 + +/** + * Buffer state. + * + * Not for public use. + */ +#define AL_UNUSED 0x2010 +#define AL_PENDING 0x2011 +#define AL_PROCESSED 0x2012 + + +/** No error. */ +#define AL_NO_ERROR 0 + +/** Invalid name paramater passed to AL call. */ +#define AL_INVALID_NAME 0xA001 + +/** Invalid enum parameter passed to AL call. */ +#define AL_INVALID_ENUM 0xA002 + +/** Invalid value parameter passed to AL call. */ +#define AL_INVALID_VALUE 0xA003 + +/** Illegal AL call. */ +#define AL_INVALID_OPERATION 0xA004 + +/** Not enough memory. */ +#define AL_OUT_OF_MEMORY 0xA005 + + +/** Context string: Vendor ID. */ +#define AL_VENDOR 0xB001 +/** Context string: Version. */ +#define AL_VERSION 0xB002 +/** Context string: Renderer ID. */ +#define AL_RENDERER 0xB003 +/** Context string: Space-separated extension list. */ +#define AL_EXTENSIONS 0xB004 + + +/** + * Doppler scale. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + * + * Scale for source and listener velocities. + */ +#define AL_DOPPLER_FACTOR 0xC000 +AL_API void AL_APIENTRY alDopplerFactor(ALfloat value); + +/** + * Doppler velocity (deprecated). + * + * A multiplier applied to the Speed of Sound. + */ +#define AL_DOPPLER_VELOCITY 0xC001 +AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value); + +/** + * Speed of Sound, in units per second. + * Type: ALfloat + * Range: [0.0001 - ] + * Default: 343.3 + * + * The speed at which sound waves are assumed to travel, when calculating the + * doppler effect. + */ +#define AL_SPEED_OF_SOUND 0xC003 +AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value); + +/** + * Distance attenuation model. + * Type: ALint + * Range: [AL_NONE, AL_INVERSE_DISTANCE, AL_INVERSE_DISTANCE_CLAMPED, + * AL_LINEAR_DISTANCE, AL_LINEAR_DISTANCE_CLAMPED, + * AL_EXPONENT_DISTANCE, AL_EXPONENT_DISTANCE_CLAMPED] + * Default: AL_INVERSE_DISTANCE_CLAMPED + * + * The model by which sources attenuate with distance. + * + * None - No distance attenuation. + * Inverse - Doubling the distance halves the source gain. + * Linear - Linear gain scaling between the reference and max distances. + * Exponent - Exponential gain dropoff. + * + * Clamped variations work like the non-clamped counterparts, except the + * distance calculated is clamped between the reference and max distances. + */ +#define AL_DISTANCE_MODEL 0xD000 +AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel); + +/** Distance model value. */ +#define AL_INVERSE_DISTANCE 0xD001 +#define AL_INVERSE_DISTANCE_CLAMPED 0xD002 +#define AL_LINEAR_DISTANCE 0xD003 +#define AL_LINEAR_DISTANCE_CLAMPED 0xD004 +#define AL_EXPONENT_DISTANCE 0xD005 +#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006 + +/** Renderer State management. */ +AL_API void AL_APIENTRY alEnable(ALenum capability); +AL_API void AL_APIENTRY alDisable(ALenum capability); +AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability); + +/** State retrieval. */ +AL_API const ALchar* AL_APIENTRY alGetString(ALenum param); +AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values); +AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values); +AL_API void AL_APIENTRY alGetFloatv(ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetDoublev(ALenum param, ALdouble *values); +AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum param); +AL_API ALint AL_APIENTRY alGetInteger(ALenum param); +AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param); +AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param); + +/** + * Error retrieval. + * + * Obtain the first error generated in the AL context since the last check. + */ +AL_API ALenum AL_APIENTRY alGetError(void); + +/** + * Extension support. + * + * Query for the presence of an extension, and obtain any appropriate function + * pointers and enum values. + */ +AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname); +AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname); +AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename); + + +/** Set Listener parameters */ +AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value); +AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values); +AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value); +AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3); +AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values); + +/** Get Listener parameters */ +AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value); +AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetListeneri(ALenum param, ALint *value); +AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3); +AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values); + + +/** Create Source objects. */ +AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources); +/** Delete Source objects. */ +AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources); +/** Verify a handle is a valid Source. */ +AL_API ALboolean AL_APIENTRY alIsSource(ALuint source); + +/** Set Source parameters. */ +AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value); +AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values); +AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value); +AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); +AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values); + +/** Get Source parameters. */ +AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value); +AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value); +AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); +AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values); + + +/** Play, replay, or resume (if paused) a list of Sources */ +AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources); +/** Stop a list of Sources */ +AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources); +/** Rewind a list of Sources */ +AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources); +/** Pause a list of Sources */ +AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources); + +/** Play, replay, or resume a Source */ +AL_API void AL_APIENTRY alSourcePlay(ALuint source); +/** Stop a Source */ +AL_API void AL_APIENTRY alSourceStop(ALuint source); +/** Rewind a Source (set playback postiton to beginning) */ +AL_API void AL_APIENTRY alSourceRewind(ALuint source); +/** Pause a Source */ +AL_API void AL_APIENTRY alSourcePause(ALuint source); + +/** Queue buffers onto a source */ +AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers); +/** Unqueue processed buffers from a source */ +AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers); + + +/** Create Buffer objects */ +AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers); +/** Delete Buffer objects */ +AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers); +/** Verify a handle is a valid Buffer */ +AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer); + +/** Specifies the data to be copied into a buffer */ +AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); + +/** Set Buffer parameters, */ +AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value); +AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values); +AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value); +AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); +AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values); + +/** Get Buffer parameters. */ +AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value); +AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value); +AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); +AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values); + +/** Pointer-to-function type, useful for dynamically getting AL entry points. */ +typedef void (AL_APIENTRY *LPALENABLE)(ALenum capability); +typedef void (AL_APIENTRY *LPALDISABLE)(ALenum capability); +typedef ALboolean (AL_APIENTRY *LPALISENABLED)(ALenum capability); +typedef const ALchar* (AL_APIENTRY *LPALGETSTRING)(ALenum param); +typedef void (AL_APIENTRY *LPALGETBOOLEANV)(ALenum param, ALboolean *values); +typedef void (AL_APIENTRY *LPALGETINTEGERV)(ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALGETFLOATV)(ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETDOUBLEV)(ALenum param, ALdouble *values); +typedef ALboolean (AL_APIENTRY *LPALGETBOOLEAN)(ALenum param); +typedef ALint (AL_APIENTRY *LPALGETINTEGER)(ALenum param); +typedef ALfloat (AL_APIENTRY *LPALGETFLOAT)(ALenum param); +typedef ALdouble (AL_APIENTRY *LPALGETDOUBLE)(ALenum param); +typedef ALenum (AL_APIENTRY *LPALGETERROR)(void); +typedef ALboolean (AL_APIENTRY *LPALISEXTENSIONPRESENT)(const ALchar *extname); +typedef void* (AL_APIENTRY *LPALGETPROCADDRESS)(const ALchar *fname); +typedef ALenum (AL_APIENTRY *LPALGETENUMVALUE)(const ALchar *ename); +typedef void (AL_APIENTRY *LPALLISTENERF)(ALenum param, ALfloat value); +typedef void (AL_APIENTRY *LPALLISTENER3F)(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +typedef void (AL_APIENTRY *LPALLISTENERFV)(ALenum param, const ALfloat *values); +typedef void (AL_APIENTRY *LPALLISTENERI)(ALenum param, ALint value); +typedef void (AL_APIENTRY *LPALLISTENER3I)(ALenum param, ALint value1, ALint value2, ALint value3); +typedef void (AL_APIENTRY *LPALLISTENERIV)(ALenum param, const ALint *values); +typedef void (AL_APIENTRY *LPALGETLISTENERF)(ALenum param, ALfloat *value); +typedef void (AL_APIENTRY *LPALGETLISTENER3F)(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +typedef void (AL_APIENTRY *LPALGETLISTENERFV)(ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETLISTENERI)(ALenum param, ALint *value); +typedef void (AL_APIENTRY *LPALGETLISTENER3I)(ALenum param, ALint *value1, ALint *value2, ALint *value3); +typedef void (AL_APIENTRY *LPALGETLISTENERIV)(ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALGENSOURCES)(ALsizei n, ALuint *sources); +typedef void (AL_APIENTRY *LPALDELETESOURCES)(ALsizei n, const ALuint *sources); +typedef ALboolean (AL_APIENTRY *LPALISSOURCE)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEF)(ALuint source, ALenum param, ALfloat value); +typedef void (AL_APIENTRY *LPALSOURCE3F)(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +typedef void (AL_APIENTRY *LPALSOURCEFV)(ALuint source, ALenum param, const ALfloat *values); +typedef void (AL_APIENTRY *LPALSOURCEI)(ALuint source, ALenum param, ALint value); +typedef void (AL_APIENTRY *LPALSOURCE3I)(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); +typedef void (AL_APIENTRY *LPALSOURCEIV)(ALuint source, ALenum param, const ALint *values); +typedef void (AL_APIENTRY *LPALGETSOURCEF)(ALuint source, ALenum param, ALfloat *value); +typedef void (AL_APIENTRY *LPALGETSOURCE3F)(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +typedef void (AL_APIENTRY *LPALGETSOURCEFV)(ALuint source, ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETSOURCEI)(ALuint source, ALenum param, ALint *value); +typedef void (AL_APIENTRY *LPALGETSOURCE3I)(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); +typedef void (AL_APIENTRY *LPALGETSOURCEIV)(ALuint source, ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALSOURCEPLAYV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCESTOPV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCEREWINDV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCEPAUSEV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCEPLAY)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCESTOP)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEREWIND)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEPAUSE)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEQUEUEBUFFERS)(ALuint source, ALsizei nb, const ALuint *buffers); +typedef void (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERS)(ALuint source, ALsizei nb, ALuint *buffers); +typedef void (AL_APIENTRY *LPALGENBUFFERS)(ALsizei n, ALuint *buffers); +typedef void (AL_APIENTRY *LPALDELETEBUFFERS)(ALsizei n, const ALuint *buffers); +typedef ALboolean (AL_APIENTRY *LPALISBUFFER)(ALuint buffer); +typedef void (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); +typedef void (AL_APIENTRY *LPALBUFFERF)(ALuint buffer, ALenum param, ALfloat value); +typedef void (AL_APIENTRY *LPALBUFFER3F)(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +typedef void (AL_APIENTRY *LPALBUFFERFV)(ALuint buffer, ALenum param, const ALfloat *values); +typedef void (AL_APIENTRY *LPALBUFFERI)(ALuint buffer, ALenum param, ALint value); +typedef void (AL_APIENTRY *LPALBUFFER3I)(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); +typedef void (AL_APIENTRY *LPALBUFFERIV)(ALuint buffer, ALenum param, const ALint *values); +typedef void (AL_APIENTRY *LPALGETBUFFERF)(ALuint buffer, ALenum param, ALfloat *value); +typedef void (AL_APIENTRY *LPALGETBUFFER3F)(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +typedef void (AL_APIENTRY *LPALGETBUFFERFV)(ALuint buffer, ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETBUFFERI)(ALuint buffer, ALenum param, ALint *value); +typedef void (AL_APIENTRY *LPALGETBUFFER3I)(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); +typedef void (AL_APIENTRY *LPALGETBUFFERIV)(ALuint buffer, ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALDOPPLERFACTOR)(ALfloat value); +typedef void (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value); +typedef void (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value); +typedef void (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel); + +#if defined(__cplusplus) +} /* extern "C" */ +#endif + +#endif /* AL_AL_H */ diff --git a/external/openal_soft/include/AL/alc.h b/external/openal_soft/include/AL/alc.h new file mode 100644 index 000000000..294e8b33c --- /dev/null +++ b/external/openal_soft/include/AL/alc.h @@ -0,0 +1,237 @@ +#ifndef AL_ALC_H +#define AL_ALC_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef ALC_API + #if defined(AL_LIBTYPE_STATIC) + #define ALC_API + #elif defined(_WIN32) + #define ALC_API __declspec(dllimport) + #else + #define ALC_API extern + #endif +#endif + +#if defined(_WIN32) + #define ALC_APIENTRY __cdecl +#else + #define ALC_APIENTRY +#endif + + +/** Deprecated macro. */ +#define ALCAPI ALC_API +#define ALCAPIENTRY ALC_APIENTRY +#define ALC_INVALID 0 + +/** Supported ALC version? */ +#define ALC_VERSION_0_1 1 + +/** Opaque device handle */ +typedef struct ALCdevice_struct ALCdevice; +/** Opaque context handle */ +typedef struct ALCcontext_struct ALCcontext; + +/** 8-bit boolean */ +typedef char ALCboolean; + +/** character */ +typedef char ALCchar; + +/** signed 8-bit 2's complement integer */ +typedef signed char ALCbyte; + +/** unsigned 8-bit integer */ +typedef unsigned char ALCubyte; + +/** signed 16-bit 2's complement integer */ +typedef short ALCshort; + +/** unsigned 16-bit integer */ +typedef unsigned short ALCushort; + +/** signed 32-bit 2's complement integer */ +typedef int ALCint; + +/** unsigned 32-bit integer */ +typedef unsigned int ALCuint; + +/** non-negative 32-bit binary integer size */ +typedef int ALCsizei; + +/** enumerated 32-bit value */ +typedef int ALCenum; + +/** 32-bit IEEE754 floating-point */ +typedef float ALCfloat; + +/** 64-bit IEEE754 floating-point */ +typedef double ALCdouble; + +/** void type (for opaque pointers only) */ +typedef void ALCvoid; + + +/* Enumerant values begin at column 50. No tabs. */ + +/** Boolean False. */ +#define ALC_FALSE 0 + +/** Boolean True. */ +#define ALC_TRUE 1 + +/** Context attribute: Hz. */ +#define ALC_FREQUENCY 0x1007 + +/** Context attribute: Hz. */ +#define ALC_REFRESH 0x1008 + +/** Context attribute: AL_TRUE or AL_FALSE. */ +#define ALC_SYNC 0x1009 + +/** Context attribute: requested Mono (3D) Sources. */ +#define ALC_MONO_SOURCES 0x1010 + +/** Context attribute: requested Stereo Sources. */ +#define ALC_STEREO_SOURCES 0x1011 + +/** No error. */ +#define ALC_NO_ERROR 0 + +/** Invalid device handle. */ +#define ALC_INVALID_DEVICE 0xA001 + +/** Invalid context handle. */ +#define ALC_INVALID_CONTEXT 0xA002 + +/** Invalid enum parameter passed to an ALC call. */ +#define ALC_INVALID_ENUM 0xA003 + +/** Invalid value parameter passed to an ALC call. */ +#define ALC_INVALID_VALUE 0xA004 + +/** Out of memory. */ +#define ALC_OUT_OF_MEMORY 0xA005 + + +/** Runtime ALC version. */ +#define ALC_MAJOR_VERSION 0x1000 +#define ALC_MINOR_VERSION 0x1001 + +/** Context attribute list properties. */ +#define ALC_ATTRIBUTES_SIZE 0x1002 +#define ALC_ALL_ATTRIBUTES 0x1003 + +/** String for the default device specifier. */ +#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004 +/** + * String for the given device's specifier. + * + * If device handle is NULL, it is instead a null-char separated list of + * strings of known device specifiers (list ends with an empty string). + */ +#define ALC_DEVICE_SPECIFIER 0x1005 +/** String for space-separated list of ALC extensions. */ +#define ALC_EXTENSIONS 0x1006 + + +/** Capture extension */ +#define ALC_EXT_CAPTURE 1 +/** + * String for the given capture device's specifier. + * + * If device handle is NULL, it is instead a null-char separated list of + * strings of known capture device specifiers (list ends with an empty string). + */ +#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310 +/** String for the default capture device specifier. */ +#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311 +/** Number of sample frames available for capture. */ +#define ALC_CAPTURE_SAMPLES 0x312 + + +/** Enumerate All extension */ +#define ALC_ENUMERATE_ALL_EXT 1 +/** String for the default extended device specifier. */ +#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER 0x1012 +/** + * String for the given extended device's specifier. + * + * If device handle is NULL, it is instead a null-char separated list of + * strings of known extended device specifiers (list ends with an empty string). + */ +#define ALC_ALL_DEVICES_SPECIFIER 0x1013 + + +/** Context management. */ +ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint* attrlist); +ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context); +ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context); +ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context); +ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context); +ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void); +ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context); + +/** Device management. */ +ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename); +ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device); + + +/** + * Error support. + * + * Obtain the most recent Device error. + */ +ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device); + +/** + * Extension support. + * + * Query for the presence of an extension, and obtain any appropriate + * function pointers and enum values. + */ +ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname); +ALC_API void* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname); +ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname); + +/** Query function. */ +ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param); +ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); + +/** Capture function. */ +ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); +ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device); +ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device); +ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device); +ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); + +/** Pointer-to-function type, useful for dynamically getting ALC entry points. */ +typedef ALCcontext* (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist); +typedef ALCboolean (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context); +typedef void (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context); +typedef void (ALC_APIENTRY *LPALCSUSPENDCONTEXT)(ALCcontext *context); +typedef void (ALC_APIENTRY *LPALCDESTROYCONTEXT)(ALCcontext *context); +typedef ALCcontext* (ALC_APIENTRY *LPALCGETCURRENTCONTEXT)(void); +typedef ALCdevice* (ALC_APIENTRY *LPALCGETCONTEXTSDEVICE)(ALCcontext *context); +typedef ALCdevice* (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename); +typedef ALCboolean (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device); +typedef ALCenum (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device); +typedef ALCboolean (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname); +typedef void* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname); +typedef ALCenum (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname); +typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param); +typedef void (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); +typedef ALCdevice* (ALC_APIENTRY *LPALCCAPTUREOPENDEVICE)(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); +typedef ALCboolean (ALC_APIENTRY *LPALCCAPTURECLOSEDEVICE)(ALCdevice *device); +typedef void (ALC_APIENTRY *LPALCCAPTURESTART)(ALCdevice *device); +typedef void (ALC_APIENTRY *LPALCCAPTURESTOP)(ALCdevice *device); +typedef void (ALC_APIENTRY *LPALCCAPTURESAMPLES)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); + +#if defined(__cplusplus) +} +#endif + +#endif /* AL_ALC_H */ diff --git a/external/openal_soft/include/AL/alext.h b/external/openal_soft/include/AL/alext.h new file mode 100644 index 000000000..0447f2bb4 --- /dev/null +++ b/external/openal_soft/include/AL/alext.h @@ -0,0 +1,355 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2008 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#ifndef AL_ALEXT_H +#define AL_ALEXT_H + +#include +/* Define int64_t and uint64_t types */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif + +#include "alc.h" +#include "al.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef AL_LOKI_IMA_ADPCM_format +#define AL_LOKI_IMA_ADPCM_format 1 +#define AL_FORMAT_IMA_ADPCM_MONO16_EXT 0x10000 +#define AL_FORMAT_IMA_ADPCM_STEREO16_EXT 0x10001 +#endif + +#ifndef AL_LOKI_WAVE_format +#define AL_LOKI_WAVE_format 1 +#define AL_FORMAT_WAVE_EXT 0x10002 +#endif + +#ifndef AL_EXT_vorbis +#define AL_EXT_vorbis 1 +#define AL_FORMAT_VORBIS_EXT 0x10003 +#endif + +#ifndef AL_LOKI_quadriphonic +#define AL_LOKI_quadriphonic 1 +#define AL_FORMAT_QUAD8_LOKI 0x10004 +#define AL_FORMAT_QUAD16_LOKI 0x10005 +#endif + +#ifndef AL_EXT_float32 +#define AL_EXT_float32 1 +#define AL_FORMAT_MONO_FLOAT32 0x10010 +#define AL_FORMAT_STEREO_FLOAT32 0x10011 +#endif + +#ifndef AL_EXT_double +#define AL_EXT_double 1 +#define AL_FORMAT_MONO_DOUBLE_EXT 0x10012 +#define AL_FORMAT_STEREO_DOUBLE_EXT 0x10013 +#endif + +#ifndef AL_EXT_MULAW +#define AL_EXT_MULAW 1 +#define AL_FORMAT_MONO_MULAW_EXT 0x10014 +#define AL_FORMAT_STEREO_MULAW_EXT 0x10015 +#endif + +#ifndef AL_EXT_ALAW +#define AL_EXT_ALAW 1 +#define AL_FORMAT_MONO_ALAW_EXT 0x10016 +#define AL_FORMAT_STEREO_ALAW_EXT 0x10017 +#endif + +#ifndef ALC_LOKI_audio_channel +#define ALC_LOKI_audio_channel 1 +#define ALC_CHAN_MAIN_LOKI 0x500001 +#define ALC_CHAN_PCM_LOKI 0x500002 +#define ALC_CHAN_CD_LOKI 0x500003 +#endif + +#ifndef AL_EXT_MCFORMATS +#define AL_EXT_MCFORMATS 1 +#define AL_FORMAT_QUAD8 0x1204 +#define AL_FORMAT_QUAD16 0x1205 +#define AL_FORMAT_QUAD32 0x1206 +#define AL_FORMAT_REAR8 0x1207 +#define AL_FORMAT_REAR16 0x1208 +#define AL_FORMAT_REAR32 0x1209 +#define AL_FORMAT_51CHN8 0x120A +#define AL_FORMAT_51CHN16 0x120B +#define AL_FORMAT_51CHN32 0x120C +#define AL_FORMAT_61CHN8 0x120D +#define AL_FORMAT_61CHN16 0x120E +#define AL_FORMAT_61CHN32 0x120F +#define AL_FORMAT_71CHN8 0x1210 +#define AL_FORMAT_71CHN16 0x1211 +#define AL_FORMAT_71CHN32 0x1212 +#endif + +#ifndef AL_EXT_MULAW_MCFORMATS +#define AL_EXT_MULAW_MCFORMATS 1 +#define AL_FORMAT_MONO_MULAW 0x10014 +#define AL_FORMAT_STEREO_MULAW 0x10015 +#define AL_FORMAT_QUAD_MULAW 0x10021 +#define AL_FORMAT_REAR_MULAW 0x10022 +#define AL_FORMAT_51CHN_MULAW 0x10023 +#define AL_FORMAT_61CHN_MULAW 0x10024 +#define AL_FORMAT_71CHN_MULAW 0x10025 +#endif + +#ifndef AL_EXT_IMA4 +#define AL_EXT_IMA4 1 +#define AL_FORMAT_MONO_IMA4 0x1300 +#define AL_FORMAT_STEREO_IMA4 0x1301 +#endif + +#ifndef AL_EXT_STATIC_BUFFER +#define AL_EXT_STATIC_BUFFER 1 +typedef ALvoid (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei); +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq); +#endif +#endif + +#ifndef ALC_EXT_EFX +#define ALC_EXT_EFX 1 +#include "efx.h" +#endif + +#ifndef ALC_EXT_disconnect +#define ALC_EXT_disconnect 1 +#define ALC_CONNECTED 0x313 +#endif + +#ifndef ALC_EXT_thread_local_context +#define ALC_EXT_thread_local_context 1 +typedef ALCboolean (ALC_APIENTRY*PFNALCSETTHREADCONTEXTPROC)(ALCcontext *context); +typedef ALCcontext* (ALC_APIENTRY*PFNALCGETTHREADCONTEXTPROC)(void); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context); +ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void); +#endif +#endif + +#ifndef AL_EXT_source_distance_model +#define AL_EXT_source_distance_model 1 +#define AL_SOURCE_DISTANCE_MODEL 0x200 +#endif + +#ifndef AL_SOFT_buffer_sub_data +#define AL_SOFT_buffer_sub_data 1 +#define AL_BYTE_RW_OFFSETS_SOFT 0x1031 +#define AL_SAMPLE_RW_OFFSETS_SOFT 0x1032 +typedef ALvoid (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei); +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length); +#endif +#endif + +#ifndef AL_SOFT_loop_points +#define AL_SOFT_loop_points 1 +#define AL_LOOP_POINTS_SOFT 0x2015 +#endif + +#ifndef AL_EXT_FOLDBACK +#define AL_EXT_FOLDBACK 1 +#define AL_EXT_FOLDBACK_NAME "AL_EXT_FOLDBACK" +#define AL_FOLDBACK_EVENT_BLOCK 0x4112 +#define AL_FOLDBACK_EVENT_START 0x4111 +#define AL_FOLDBACK_EVENT_STOP 0x4113 +#define AL_FOLDBACK_MODE_MONO 0x4101 +#define AL_FOLDBACK_MODE_STEREO 0x4102 +typedef void (AL_APIENTRY*LPALFOLDBACKCALLBACK)(ALenum,ALsizei); +typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTART)(ALenum,ALsizei,ALsizei,ALfloat*,LPALFOLDBACKCALLBACK); +typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTOP)(void); +#ifdef AL_ALEXT_PROTOTYPES +AL_API void AL_APIENTRY alRequestFoldbackStart(ALenum mode,ALsizei count,ALsizei length,ALfloat *mem,LPALFOLDBACKCALLBACK callback); +AL_API void AL_APIENTRY alRequestFoldbackStop(void); +#endif +#endif + +#ifndef ALC_EXT_DEDICATED +#define ALC_EXT_DEDICATED 1 +#define AL_DEDICATED_GAIN 0x0001 +#define AL_EFFECT_DEDICATED_DIALOGUE 0x9001 +#define AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT 0x9000 +#endif + +#ifndef AL_SOFT_buffer_samples +#define AL_SOFT_buffer_samples 1 +/* Channel configurations */ +#define AL_MONO_SOFT 0x1500 +#define AL_STEREO_SOFT 0x1501 +#define AL_REAR_SOFT 0x1502 +#define AL_QUAD_SOFT 0x1503 +#define AL_5POINT1_SOFT 0x1504 +#define AL_6POINT1_SOFT 0x1505 +#define AL_7POINT1_SOFT 0x1506 + +/* Sample types */ +#define AL_BYTE_SOFT 0x1400 +#define AL_UNSIGNED_BYTE_SOFT 0x1401 +#define AL_SHORT_SOFT 0x1402 +#define AL_UNSIGNED_SHORT_SOFT 0x1403 +#define AL_INT_SOFT 0x1404 +#define AL_UNSIGNED_INT_SOFT 0x1405 +#define AL_FLOAT_SOFT 0x1406 +#define AL_DOUBLE_SOFT 0x1407 +#define AL_BYTE3_SOFT 0x1408 +#define AL_UNSIGNED_BYTE3_SOFT 0x1409 + +/* Storage formats */ +#define AL_MONO8_SOFT 0x1100 +#define AL_MONO16_SOFT 0x1101 +#define AL_MONO32F_SOFT 0x10010 +#define AL_STEREO8_SOFT 0x1102 +#define AL_STEREO16_SOFT 0x1103 +#define AL_STEREO32F_SOFT 0x10011 +#define AL_QUAD8_SOFT 0x1204 +#define AL_QUAD16_SOFT 0x1205 +#define AL_QUAD32F_SOFT 0x1206 +#define AL_REAR8_SOFT 0x1207 +#define AL_REAR16_SOFT 0x1208 +#define AL_REAR32F_SOFT 0x1209 +#define AL_5POINT1_8_SOFT 0x120A +#define AL_5POINT1_16_SOFT 0x120B +#define AL_5POINT1_32F_SOFT 0x120C +#define AL_6POINT1_8_SOFT 0x120D +#define AL_6POINT1_16_SOFT 0x120E +#define AL_6POINT1_32F_SOFT 0x120F +#define AL_7POINT1_8_SOFT 0x1210 +#define AL_7POINT1_16_SOFT 0x1211 +#define AL_7POINT1_32F_SOFT 0x1212 + +/* Buffer attributes */ +#define AL_INTERNAL_FORMAT_SOFT 0x2008 +#define AL_BYTE_LENGTH_SOFT 0x2009 +#define AL_SAMPLE_LENGTH_SOFT 0x200A +#define AL_SEC_LENGTH_SOFT 0x200B + +typedef void (AL_APIENTRY*LPALBUFFERSAMPLESSOFT)(ALuint,ALuint,ALenum,ALsizei,ALenum,ALenum,const ALvoid*); +typedef void (AL_APIENTRY*LPALBUFFERSUBSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,const ALvoid*); +typedef void (AL_APIENTRY*LPALGETBUFFERSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,ALvoid*); +typedef ALboolean (AL_APIENTRY*LPALISBUFFERFORMATSUPPORTEDSOFT)(ALenum); +#ifdef AL_ALEXT_PROTOTYPES +AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, ALuint samplerate, ALenum internalformat, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); +AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); +AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data); +AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format); +#endif +#endif + +#ifndef AL_SOFT_direct_channels +#define AL_SOFT_direct_channels 1 +#define AL_DIRECT_CHANNELS_SOFT 0x1033 +#endif + +#ifndef ALC_SOFT_loopback +#define ALC_SOFT_loopback 1 +#define ALC_FORMAT_CHANNELS_SOFT 0x1990 +#define ALC_FORMAT_TYPE_SOFT 0x1991 + +/* Sample types */ +#define ALC_BYTE_SOFT 0x1400 +#define ALC_UNSIGNED_BYTE_SOFT 0x1401 +#define ALC_SHORT_SOFT 0x1402 +#define ALC_UNSIGNED_SHORT_SOFT 0x1403 +#define ALC_INT_SOFT 0x1404 +#define ALC_UNSIGNED_INT_SOFT 0x1405 +#define ALC_FLOAT_SOFT 0x1406 + +/* Channel configurations */ +#define ALC_MONO_SOFT 0x1500 +#define ALC_STEREO_SOFT 0x1501 +#define ALC_QUAD_SOFT 0x1503 +#define ALC_5POINT1_SOFT 0x1504 +#define ALC_6POINT1_SOFT 0x1505 +#define ALC_7POINT1_SOFT 0x1506 + +typedef ALCdevice* (ALC_APIENTRY*LPALCLOOPBACKOPENDEVICESOFT)(const ALCchar*); +typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice*,ALCsizei,ALCenum,ALCenum); +typedef void (ALC_APIENTRY*LPALCRENDERSAMPLESSOFT)(ALCdevice*,ALCvoid*,ALCsizei); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName); +ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type); +ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); +#endif +#endif + +#ifndef AL_EXT_STEREO_ANGLES +#define AL_EXT_STEREO_ANGLES 1 +#define AL_STEREO_ANGLES 0x1030 +#endif + +#ifndef AL_EXT_SOURCE_RADIUS +#define AL_EXT_SOURCE_RADIUS 1 +#define AL_SOURCE_RADIUS 0x1031 +#endif + +#ifndef AL_SOFT_source_latency +#define AL_SOFT_source_latency 1 +#define AL_SAMPLE_OFFSET_LATENCY_SOFT 0x1200 +#define AL_SEC_OFFSET_LATENCY_SOFT 0x1201 +typedef int64_t ALint64SOFT; +typedef uint64_t ALuint64SOFT; +typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble); +typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble); +typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*); +typedef void (AL_APIENTRY*LPALGETSOURCEDSOFT)(ALuint,ALenum,ALdouble*); +typedef void (AL_APIENTRY*LPALGETSOURCE3DSOFT)(ALuint,ALenum,ALdouble*,ALdouble*,ALdouble*); +typedef void (AL_APIENTRY*LPALGETSOURCEDVSOFT)(ALuint,ALenum,ALdouble*); +typedef void (AL_APIENTRY*LPALSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT); +typedef void (AL_APIENTRY*LPALSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT,ALint64SOFT,ALint64SOFT); +typedef void (AL_APIENTRY*LPALSOURCEI64VSOFT)(ALuint,ALenum,const ALint64SOFT*); +typedef void (AL_APIENTRY*LPALGETSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT*); +typedef void (AL_APIENTRY*LPALGETSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT*,ALint64SOFT*,ALint64SOFT*); +typedef void (AL_APIENTRY*LPALGETSOURCEI64VSOFT)(ALuint,ALenum,ALint64SOFT*); +#ifdef AL_ALEXT_PROTOTYPES +AL_API void AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value); +AL_API void AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3); +AL_API void AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values); +AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value); +AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3); +AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values); +AL_API void AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value); +AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3); +AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values); +AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value); +AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3); +AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values); +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/external/openal_soft/include/AL/efx-creative.h b/external/openal_soft/include/AL/efx-creative.h new file mode 100644 index 000000000..0a04c982e --- /dev/null +++ b/external/openal_soft/include/AL/efx-creative.h @@ -0,0 +1,3 @@ +/* The tokens that would be defined here are already defined in efx.h. This + * empty file is here to provide compatibility with Windows-based projects + * that would include it. */ diff --git a/external/openal_soft/include/AL/efx-presets.h b/external/openal_soft/include/AL/efx-presets.h new file mode 100644 index 000000000..86dcbda2f --- /dev/null +++ b/external/openal_soft/include/AL/efx-presets.h @@ -0,0 +1,402 @@ +/* Reverb presets for EFX */ + +#ifndef EFX_PRESETS_H +#define EFX_PRESETS_H + +#ifndef EFXEAXREVERBPROPERTIES_DEFINED +#define EFXEAXREVERBPROPERTIES_DEFINED +typedef struct { + float flDensity; + float flDiffusion; + float flGain; + float flGainHF; + float flGainLF; + float flDecayTime; + float flDecayHFRatio; + float flDecayLFRatio; + float flReflectionsGain; + float flReflectionsDelay; + float flReflectionsPan[3]; + float flLateReverbGain; + float flLateReverbDelay; + float flLateReverbPan[3]; + float flEchoTime; + float flEchoDepth; + float flModulationTime; + float flModulationDepth; + float flAirAbsorptionGainHF; + float flHFReference; + float flLFReference; + float flRoomRolloffFactor; + int iDecayHFLimit; +} EFXEAXREVERBPROPERTIES, *LPEFXEAXREVERBPROPERTIES; +#endif + +/* Default Presets */ + +#define EFX_REVERB_PRESET_GENERIC \ + { 1.0000f, 1.0000f, 0.3162f, 0.8913f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PADDEDCELL \ + { 0.1715f, 1.0000f, 0.3162f, 0.0010f, 1.0000f, 0.1700f, 0.1000f, 1.0000f, 0.2500f, 0.0010f, { 0.0000f, 0.0000f, 0.0000f }, 1.2691f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ROOM \ + { 0.4287f, 1.0000f, 0.3162f, 0.5929f, 1.0000f, 0.4000f, 0.8300f, 1.0000f, 0.1503f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 1.0629f, 0.0030f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_BATHROOM \ + { 0.1715f, 1.0000f, 0.3162f, 0.2512f, 1.0000f, 1.4900f, 0.5400f, 1.0000f, 0.6531f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 3.2734f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_LIVINGROOM \ + { 0.9766f, 1.0000f, 0.3162f, 0.0010f, 1.0000f, 0.5000f, 0.1000f, 1.0000f, 0.2051f, 0.0030f, { 0.0000f, 0.0000f, 0.0000f }, 0.2805f, 0.0040f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_STONEROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.7079f, 1.0000f, 2.3100f, 0.6400f, 1.0000f, 0.4411f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1003f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_AUDITORIUM \ + { 1.0000f, 1.0000f, 0.3162f, 0.5781f, 1.0000f, 4.3200f, 0.5900f, 1.0000f, 0.4032f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.7170f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CONCERTHALL \ + { 1.0000f, 1.0000f, 0.3162f, 0.5623f, 1.0000f, 3.9200f, 0.7000f, 1.0000f, 0.2427f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.9977f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CAVE \ + { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 1.0000f, 2.9100f, 1.3000f, 1.0000f, 0.5000f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.7063f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_ARENA \ + { 1.0000f, 1.0000f, 0.3162f, 0.4477f, 1.0000f, 7.2400f, 0.3300f, 1.0000f, 0.2612f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.0186f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_HANGAR \ + { 1.0000f, 1.0000f, 0.3162f, 0.3162f, 1.0000f, 10.0500f, 0.2300f, 1.0000f, 0.5000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2560f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CARPETEDHALLWAY \ + { 0.4287f, 1.0000f, 0.3162f, 0.0100f, 1.0000f, 0.3000f, 0.1000f, 1.0000f, 0.1215f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 0.1531f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_HALLWAY \ + { 0.3645f, 1.0000f, 0.3162f, 0.7079f, 1.0000f, 1.4900f, 0.5900f, 1.0000f, 0.2458f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.6615f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_STONECORRIDOR \ + { 1.0000f, 1.0000f, 0.3162f, 0.7612f, 1.0000f, 2.7000f, 0.7900f, 1.0000f, 0.2472f, 0.0130f, { 0.0000f, 0.0000f, 0.0000f }, 1.5758f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ALLEY \ + { 1.0000f, 0.3000f, 0.3162f, 0.7328f, 1.0000f, 1.4900f, 0.8600f, 1.0000f, 0.2500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.9954f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.9500f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FOREST \ + { 1.0000f, 0.3000f, 0.3162f, 0.0224f, 1.0000f, 1.4900f, 0.5400f, 1.0000f, 0.0525f, 0.1620f, { 0.0000f, 0.0000f, 0.0000f }, 0.7682f, 0.0880f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY \ + { 1.0000f, 0.5000f, 0.3162f, 0.3981f, 1.0000f, 1.4900f, 0.6700f, 1.0000f, 0.0730f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.1427f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_MOUNTAINS \ + { 1.0000f, 0.2700f, 0.3162f, 0.0562f, 1.0000f, 1.4900f, 0.2100f, 1.0000f, 0.0407f, 0.3000f, { 0.0000f, 0.0000f, 0.0000f }, 0.1919f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_QUARRY \ + { 1.0000f, 1.0000f, 0.3162f, 0.3162f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0000f, 0.0610f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0250f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.7000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PLAIN \ + { 1.0000f, 0.2100f, 0.3162f, 0.1000f, 1.0000f, 1.4900f, 0.5000f, 1.0000f, 0.0585f, 0.1790f, { 0.0000f, 0.0000f, 0.0000f }, 0.1089f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PARKINGLOT \ + { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 1.0000f, 1.6500f, 1.5000f, 1.0000f, 0.2082f, 0.0080f, { 0.0000f, 0.0000f, 0.0000f }, 0.2652f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_SEWERPIPE \ + { 0.3071f, 0.8000f, 0.3162f, 0.3162f, 1.0000f, 2.8100f, 0.1400f, 1.0000f, 1.6387f, 0.0140f, { 0.0000f, 0.0000f, 0.0000f }, 3.2471f, 0.0210f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_UNDERWATER \ + { 0.3645f, 1.0000f, 0.3162f, 0.0100f, 1.0000f, 1.4900f, 0.1000f, 1.0000f, 0.5963f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 7.0795f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 1.1800f, 0.3480f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRUGGED \ + { 0.4287f, 0.5000f, 0.3162f, 1.0000f, 1.0000f, 8.3900f, 1.3900f, 1.0000f, 0.8760f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 3.1081f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 1.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DIZZY \ + { 0.3645f, 0.6000f, 0.3162f, 0.6310f, 1.0000f, 17.2300f, 0.5600f, 1.0000f, 0.1392f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.4937f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.8100f, 0.3100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PSYCHOTIC \ + { 0.0625f, 0.5000f, 0.3162f, 0.8404f, 1.0000f, 7.5600f, 0.9100f, 1.0000f, 0.4864f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 2.4378f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 4.0000f, 1.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +/* Castle Presets */ + +#define EFX_REVERB_PRESET_CASTLE_SMALLROOM \ + { 1.0000f, 0.8900f, 0.3162f, 0.3981f, 0.1000f, 1.2200f, 0.8300f, 0.3100f, 0.8913f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_SHORTPASSAGE \ + { 1.0000f, 0.8900f, 0.3162f, 0.3162f, 0.1000f, 2.3200f, 0.8300f, 0.3100f, 0.8913f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_MEDIUMROOM \ + { 1.0000f, 0.9300f, 0.3162f, 0.2818f, 0.1000f, 2.0400f, 0.8300f, 0.4600f, 0.6310f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1550f, 0.0300f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_LARGEROOM \ + { 1.0000f, 0.8200f, 0.3162f, 0.2818f, 0.1259f, 2.5300f, 0.8300f, 0.5000f, 0.4467f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1850f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_LONGPASSAGE \ + { 1.0000f, 0.8900f, 0.3162f, 0.3981f, 0.1000f, 3.4200f, 0.8300f, 0.3100f, 0.8913f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_HALL \ + { 1.0000f, 0.8100f, 0.3162f, 0.2818f, 0.1778f, 3.1400f, 0.7900f, 0.6200f, 0.1778f, 0.0560f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_CUPBOARD \ + { 1.0000f, 0.8900f, 0.3162f, 0.2818f, 0.1000f, 0.6700f, 0.8700f, 0.3100f, 1.4125f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 3.5481f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_COURTYARD \ + { 1.0000f, 0.4200f, 0.3162f, 0.4467f, 0.1995f, 2.1300f, 0.6100f, 0.2300f, 0.2239f, 0.1600f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0360f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.3700f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_CASTLE_ALCOVE \ + { 1.0000f, 0.8900f, 0.3162f, 0.5012f, 0.1000f, 1.6400f, 0.8700f, 0.3100f, 1.0000f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +/* Factory Presets */ + +#define EFX_REVERB_PRESET_FACTORY_SMALLROOM \ + { 0.3645f, 0.8200f, 0.3162f, 0.7943f, 0.5012f, 1.7200f, 0.6500f, 1.3100f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.1190f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_SHORTPASSAGE \ + { 0.3645f, 0.6400f, 0.2512f, 0.7943f, 0.5012f, 2.5300f, 0.6500f, 1.3100f, 1.0000f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.1350f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_MEDIUMROOM \ + { 0.4287f, 0.8200f, 0.2512f, 0.7943f, 0.5012f, 2.7600f, 0.6500f, 1.3100f, 0.2818f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1740f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_LARGEROOM \ + { 0.4287f, 0.7500f, 0.2512f, 0.7079f, 0.6310f, 4.2400f, 0.5100f, 1.3100f, 0.1778f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.2310f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_LONGPASSAGE \ + { 0.3645f, 0.6400f, 0.2512f, 0.7943f, 0.5012f, 4.0600f, 0.6500f, 1.3100f, 1.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0370f, { 0.0000f, 0.0000f, 0.0000f }, 0.1350f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_HALL \ + { 0.4287f, 0.7500f, 0.3162f, 0.7079f, 0.6310f, 7.4300f, 0.5100f, 1.3100f, 0.0631f, 0.0730f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_CUPBOARD \ + { 0.3071f, 0.6300f, 0.2512f, 0.7943f, 0.5012f, 0.4900f, 0.6500f, 1.3100f, 1.2589f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.1070f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_COURTYARD \ + { 0.3071f, 0.5700f, 0.3162f, 0.3162f, 0.6310f, 2.3200f, 0.2900f, 0.5600f, 0.2239f, 0.1400f, { 0.0000f, 0.0000f, 0.0000f }, 0.3981f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2900f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_ALCOVE \ + { 0.3645f, 0.5900f, 0.2512f, 0.7943f, 0.5012f, 3.1400f, 0.6500f, 1.3100f, 1.4125f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.1140f, 0.1000f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +/* Ice Palace Presets */ + +#define EFX_REVERB_PRESET_ICEPALACE_SMALLROOM \ + { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 0.2818f, 1.5100f, 1.5300f, 0.2700f, 0.8913f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1640f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_SHORTPASSAGE \ + { 1.0000f, 0.7500f, 0.3162f, 0.5623f, 0.2818f, 1.7900f, 1.4600f, 0.2800f, 0.5012f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.1770f, 0.0900f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_MEDIUMROOM \ + { 1.0000f, 0.8700f, 0.3162f, 0.5623f, 0.4467f, 2.2200f, 1.5300f, 0.3200f, 0.3981f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.1860f, 0.1200f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_LARGEROOM \ + { 1.0000f, 0.8100f, 0.3162f, 0.5623f, 0.4467f, 3.1400f, 1.5300f, 0.3200f, 0.2512f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.2140f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_LONGPASSAGE \ + { 1.0000f, 0.7700f, 0.3162f, 0.5623f, 0.3981f, 3.0100f, 1.4600f, 0.2800f, 0.7943f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0250f, { 0.0000f, 0.0000f, 0.0000f }, 0.1860f, 0.0400f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_HALL \ + { 1.0000f, 0.7600f, 0.3162f, 0.4467f, 0.5623f, 5.4900f, 1.5300f, 0.3800f, 0.1122f, 0.0540f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0520f, { 0.0000f, 0.0000f, 0.0000f }, 0.2260f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_CUPBOARD \ + { 1.0000f, 0.8300f, 0.3162f, 0.5012f, 0.2239f, 0.7600f, 1.5300f, 0.2600f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1430f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_COURTYARD \ + { 1.0000f, 0.5900f, 0.3162f, 0.2818f, 0.3162f, 2.0400f, 1.2000f, 0.3800f, 0.3162f, 0.1730f, { 0.0000f, 0.0000f, 0.0000f }, 0.3162f, 0.0430f, { 0.0000f, 0.0000f, 0.0000f }, 0.2350f, 0.4800f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_ALCOVE \ + { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 0.2818f, 2.7600f, 1.4600f, 0.2800f, 1.1220f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1610f, 0.0900f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +/* Space Station Presets */ + +#define EFX_REVERB_PRESET_SPACESTATION_SMALLROOM \ + { 0.2109f, 0.7000f, 0.3162f, 0.7079f, 0.8913f, 1.7200f, 0.8200f, 0.5500f, 0.7943f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0130f, { 0.0000f, 0.0000f, 0.0000f }, 0.1880f, 0.2600f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_SHORTPASSAGE \ + { 0.2109f, 0.8700f, 0.3162f, 0.6310f, 0.8913f, 3.5700f, 0.5000f, 0.5500f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1720f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_MEDIUMROOM \ + { 0.2109f, 0.7500f, 0.3162f, 0.6310f, 0.8913f, 3.0100f, 0.5000f, 0.5500f, 0.3981f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0350f, { 0.0000f, 0.0000f, 0.0000f }, 0.2090f, 0.3100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_LARGEROOM \ + { 0.3645f, 0.8100f, 0.3162f, 0.6310f, 0.8913f, 3.8900f, 0.3800f, 0.6100f, 0.3162f, 0.0560f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0350f, { 0.0000f, 0.0000f, 0.0000f }, 0.2330f, 0.2800f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_LONGPASSAGE \ + { 0.4287f, 0.8200f, 0.3162f, 0.6310f, 0.8913f, 4.6200f, 0.6200f, 0.5500f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0310f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_HALL \ + { 0.4287f, 0.8700f, 0.3162f, 0.6310f, 0.8913f, 7.1100f, 0.3800f, 0.6100f, 0.1778f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0470f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2500f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_CUPBOARD \ + { 0.1715f, 0.5600f, 0.3162f, 0.7079f, 0.8913f, 0.7900f, 0.8100f, 0.5500f, 1.4125f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0180f, { 0.0000f, 0.0000f, 0.0000f }, 0.1810f, 0.3100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_ALCOVE \ + { 0.2109f, 0.7800f, 0.3162f, 0.7079f, 0.8913f, 1.1600f, 0.8100f, 0.5500f, 1.4125f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0180f, { 0.0000f, 0.0000f, 0.0000f }, 0.1920f, 0.2100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +/* Wooden Galleon Presets */ + +#define EFX_REVERB_PRESET_WOODEN_SMALLROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.1122f, 0.3162f, 0.7900f, 0.3200f, 0.8700f, 1.0000f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_SHORTPASSAGE \ + { 1.0000f, 1.0000f, 0.3162f, 0.1259f, 0.3162f, 1.7500f, 0.5000f, 0.8700f, 0.8913f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_MEDIUMROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.1000f, 0.2818f, 1.4700f, 0.4200f, 0.8200f, 0.8913f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_LARGEROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.0891f, 0.2818f, 2.6500f, 0.3300f, 0.8200f, 0.8913f, 0.0660f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_LONGPASSAGE \ + { 1.0000f, 1.0000f, 0.3162f, 0.1000f, 0.3162f, 1.9900f, 0.4000f, 0.7900f, 1.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.4467f, 0.0360f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_HALL \ + { 1.0000f, 1.0000f, 0.3162f, 0.0794f, 0.2818f, 3.4500f, 0.3000f, 0.8200f, 0.8913f, 0.0880f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0630f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_CUPBOARD \ + { 1.0000f, 1.0000f, 0.3162f, 0.1413f, 0.3162f, 0.5600f, 0.4600f, 0.9100f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_COURTYARD \ + { 1.0000f, 0.6500f, 0.3162f, 0.0794f, 0.3162f, 1.7900f, 0.3500f, 0.7900f, 0.5623f, 0.1230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1000f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_ALCOVE \ + { 1.0000f, 1.0000f, 0.3162f, 0.1259f, 0.3162f, 1.2200f, 0.6200f, 0.9100f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +/* Sports Presets */ + +#define EFX_REVERB_PRESET_SPORT_EMPTYSTADIUM \ + { 1.0000f, 1.0000f, 0.3162f, 0.4467f, 0.7943f, 6.2600f, 0.5100f, 1.1000f, 0.0631f, 0.1830f, { 0.0000f, 0.0000f, 0.0000f }, 0.3981f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_SQUASHCOURT \ + { 1.0000f, 0.7500f, 0.3162f, 0.3162f, 0.7943f, 2.2200f, 0.9100f, 1.1600f, 0.4467f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1260f, 0.1900f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_SMALLSWIMMINGPOOL \ + { 1.0000f, 0.7000f, 0.3162f, 0.7943f, 0.8913f, 2.7600f, 1.2500f, 1.1400f, 0.6310f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_SPORT_LARGESWIMMINGPOOL \ + { 1.0000f, 0.8200f, 0.3162f, 0.7943f, 1.0000f, 5.4900f, 1.3100f, 1.1400f, 0.4467f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 0.5012f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2220f, 0.5500f, 1.1590f, 0.2100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_SPORT_GYMNASIUM \ + { 1.0000f, 0.8100f, 0.3162f, 0.4467f, 0.8913f, 3.1400f, 1.0600f, 1.3500f, 0.3981f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.5623f, 0.0450f, { 0.0000f, 0.0000f, 0.0000f }, 0.1460f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_FULLSTADIUM \ + { 1.0000f, 1.0000f, 0.3162f, 0.0708f, 0.7943f, 5.2500f, 0.1700f, 0.8000f, 0.1000f, 0.1880f, { 0.0000f, 0.0000f, 0.0000f }, 0.2818f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_STADIUMTANNOY \ + { 1.0000f, 0.7800f, 0.3162f, 0.5623f, 0.5012f, 2.5300f, 0.8800f, 0.6800f, 0.2818f, 0.2300f, { 0.0000f, 0.0000f, 0.0000f }, 0.5012f, 0.0630f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +/* Prefab Presets */ + +#define EFX_REVERB_PRESET_PREFAB_WORKSHOP \ + { 0.4287f, 1.0000f, 0.3162f, 0.1413f, 0.3981f, 0.7600f, 1.0000f, 1.0000f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PREFAB_SCHOOLROOM \ + { 0.4022f, 0.6900f, 0.3162f, 0.6310f, 0.5012f, 0.9800f, 0.4500f, 0.1800f, 1.4125f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.0950f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PREFAB_PRACTISEROOM \ + { 0.4022f, 0.8700f, 0.3162f, 0.3981f, 0.5012f, 1.1200f, 0.5600f, 0.1800f, 1.2589f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.0950f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PREFAB_OUTHOUSE \ + { 1.0000f, 0.8200f, 0.3162f, 0.1122f, 0.1585f, 1.3800f, 0.3800f, 0.3500f, 0.8913f, 0.0240f, { 0.0000f, 0.0000f, -0.0000f }, 0.6310f, 0.0440f, { 0.0000f, 0.0000f, 0.0000f }, 0.1210f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PREFAB_CARAVAN \ + { 1.0000f, 1.0000f, 0.3162f, 0.0891f, 0.1259f, 0.4300f, 1.5000f, 1.0000f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +/* Dome and Pipe Presets */ + +#define EFX_REVERB_PRESET_DOME_TOMB \ + { 1.0000f, 0.7900f, 0.3162f, 0.3548f, 0.2239f, 4.1800f, 0.2100f, 0.1000f, 0.3868f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 1.6788f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.1770f, 0.1900f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PIPE_SMALL \ + { 1.0000f, 1.0000f, 0.3162f, 0.3548f, 0.2239f, 5.0400f, 0.1000f, 0.1000f, 0.5012f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 2.5119f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DOME_SAINTPAULS \ + { 1.0000f, 0.8700f, 0.3162f, 0.3548f, 0.2239f, 10.4800f, 0.1900f, 0.1000f, 0.1778f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0420f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1200f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PIPE_LONGTHIN \ + { 0.2560f, 0.9100f, 0.3162f, 0.4467f, 0.2818f, 9.2100f, 0.1800f, 0.1000f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PIPE_LARGE \ + { 1.0000f, 1.0000f, 0.3162f, 0.3548f, 0.2239f, 8.4500f, 0.1000f, 0.1000f, 0.3981f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PIPE_RESONANT \ + { 0.1373f, 0.9100f, 0.3162f, 0.4467f, 0.2818f, 6.8100f, 0.1800f, 0.1000f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } + +/* Outdoors Presets */ + +#define EFX_REVERB_PRESET_OUTDOORS_BACKYARD \ + { 1.0000f, 0.4500f, 0.3162f, 0.2512f, 0.5012f, 1.1200f, 0.3400f, 0.4600f, 0.4467f, 0.0690f, { 0.0000f, 0.0000f, -0.0000f }, 0.7079f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.2180f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_ROLLINGPLAINS \ + { 1.0000f, 0.0000f, 0.3162f, 0.0112f, 0.6310f, 2.1300f, 0.2100f, 0.4600f, 0.1778f, 0.3000f, { 0.0000f, 0.0000f, -0.0000f }, 0.4467f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_DEEPCANYON \ + { 1.0000f, 0.7400f, 0.3162f, 0.1778f, 0.6310f, 3.8900f, 0.2100f, 0.4600f, 0.3162f, 0.2230f, { 0.0000f, 0.0000f, -0.0000f }, 0.3548f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_CREEK \ + { 1.0000f, 0.3500f, 0.3162f, 0.1778f, 0.5012f, 2.1300f, 0.2100f, 0.4600f, 0.3981f, 0.1150f, { 0.0000f, 0.0000f, -0.0000f }, 0.1995f, 0.0310f, { 0.0000f, 0.0000f, 0.0000f }, 0.2180f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_VALLEY \ + { 1.0000f, 0.2800f, 0.3162f, 0.0282f, 0.1585f, 2.8800f, 0.2600f, 0.3500f, 0.1413f, 0.2630f, { 0.0000f, 0.0000f, -0.0000f }, 0.3981f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +/* Mood Presets */ + +#define EFX_REVERB_PRESET_MOOD_HEAVEN \ + { 1.0000f, 0.9400f, 0.3162f, 0.7943f, 0.4467f, 5.0400f, 1.1200f, 0.5600f, 0.2427f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0800f, 2.7420f, 0.0500f, 0.9977f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_MOOD_HELL \ + { 1.0000f, 0.5700f, 0.3162f, 0.3548f, 0.4467f, 3.5700f, 0.4900f, 2.0000f, 0.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1100f, 0.0400f, 2.1090f, 0.5200f, 0.9943f, 5000.0000f, 139.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_MOOD_MEMORY \ + { 1.0000f, 0.8500f, 0.3162f, 0.6310f, 0.3548f, 4.0600f, 0.8200f, 0.5600f, 0.0398f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.4740f, 0.4500f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +/* Driving Presets */ + +#define EFX_REVERB_PRESET_DRIVING_COMMENTATOR \ + { 1.0000f, 0.0000f, 3.1623f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_PITGARAGE \ + { 0.4287f, 0.5900f, 0.3162f, 0.7079f, 0.5623f, 1.7200f, 0.9300f, 0.8700f, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DRIVING_INCAR_RACER \ + { 0.0832f, 0.8000f, 0.3162f, 1.0000f, 0.7943f, 0.1700f, 2.0000f, 0.4100f, 1.7783f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_INCAR_SPORTS \ + { 0.0832f, 0.8000f, 0.3162f, 0.6310f, 1.0000f, 0.1700f, 0.7500f, 0.4100f, 1.0000f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_INCAR_LUXURY \ + { 0.2560f, 1.0000f, 0.3162f, 0.1000f, 0.5012f, 0.1300f, 0.4100f, 0.4600f, 0.7943f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_FULLGRANDSTAND \ + { 1.0000f, 1.0000f, 0.3162f, 0.2818f, 0.6310f, 3.0100f, 1.3700f, 1.2800f, 0.3548f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 0.1778f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10420.2002f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DRIVING_EMPTYGRANDSTAND \ + { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 0.7943f, 4.6200f, 1.7500f, 1.4000f, 0.2082f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10420.2002f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DRIVING_TUNNEL \ + { 1.0000f, 0.8100f, 0.3162f, 0.3981f, 0.8913f, 3.4200f, 0.9400f, 1.3100f, 0.7079f, 0.0510f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0470f, { 0.0000f, 0.0000f, 0.0000f }, 0.2140f, 0.0500f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 155.3000f, 0.0000f, 0x1 } + +/* City Presets */ + +#define EFX_REVERB_PRESET_CITY_STREETS \ + { 1.0000f, 0.7800f, 0.3162f, 0.7079f, 0.8913f, 1.7900f, 1.1200f, 0.9100f, 0.2818f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 0.1995f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY_SUBWAY \ + { 1.0000f, 0.7400f, 0.3162f, 0.7079f, 0.8913f, 3.0100f, 1.2300f, 0.9100f, 0.7079f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.2100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY_MUSEUM \ + { 1.0000f, 0.8200f, 0.3162f, 0.1778f, 0.1778f, 3.2800f, 1.4000f, 0.5700f, 0.2512f, 0.0390f, { 0.0000f, 0.0000f, -0.0000f }, 0.8913f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 0.1300f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_CITY_LIBRARY \ + { 1.0000f, 0.8200f, 0.3162f, 0.2818f, 0.0891f, 2.7600f, 0.8900f, 0.4100f, 0.3548f, 0.0290f, { 0.0000f, 0.0000f, -0.0000f }, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.1300f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_CITY_UNDERPASS \ + { 1.0000f, 0.8200f, 0.3162f, 0.4467f, 0.8913f, 3.5700f, 1.1200f, 0.9100f, 0.3981f, 0.0590f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0370f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1400f, 0.2500f, 0.0000f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY_ABANDONED \ + { 1.0000f, 0.6900f, 0.3162f, 0.7943f, 0.8913f, 3.2800f, 1.1700f, 0.9100f, 0.4467f, 0.0440f, { 0.0000f, 0.0000f, 0.0000f }, 0.2818f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9966f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +/* Misc. Presets */ + +#define EFX_REVERB_PRESET_DUSTYROOM \ + { 0.3645f, 0.5600f, 0.3162f, 0.7943f, 0.7079f, 1.7900f, 0.3800f, 0.2100f, 0.5012f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0060f, { 0.0000f, 0.0000f, 0.0000f }, 0.2020f, 0.0500f, 0.2500f, 0.0000f, 0.9886f, 13046.0000f, 163.3000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CHAPEL \ + { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 1.0000f, 4.6200f, 0.6400f, 1.2300f, 0.4467f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.1100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SMALLWATERROOM \ + { 1.0000f, 0.7000f, 0.3162f, 0.4477f, 1.0000f, 1.5100f, 1.2500f, 1.1400f, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#endif /* EFX_PRESETS_H */ diff --git a/external/openal_soft/include/AL/efx.h b/external/openal_soft/include/AL/efx.h new file mode 100644 index 000000000..57766983f --- /dev/null +++ b/external/openal_soft/include/AL/efx.h @@ -0,0 +1,761 @@ +#ifndef AL_EFX_H +#define AL_EFX_H + + +#include "alc.h" +#include "al.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ALC_EXT_EFX_NAME "ALC_EXT_EFX" + +#define ALC_EFX_MAJOR_VERSION 0x20001 +#define ALC_EFX_MINOR_VERSION 0x20002 +#define ALC_MAX_AUXILIARY_SENDS 0x20003 + + +/* Listener properties. */ +#define AL_METERS_PER_UNIT 0x20004 + +/* Source properties. */ +#define AL_DIRECT_FILTER 0x20005 +#define AL_AUXILIARY_SEND_FILTER 0x20006 +#define AL_AIR_ABSORPTION_FACTOR 0x20007 +#define AL_ROOM_ROLLOFF_FACTOR 0x20008 +#define AL_CONE_OUTER_GAINHF 0x20009 +#define AL_DIRECT_FILTER_GAINHF_AUTO 0x2000A +#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO 0x2000B +#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO 0x2000C + + +/* Effect properties. */ + +/* Reverb effect parameters */ +#define AL_REVERB_DENSITY 0x0001 +#define AL_REVERB_DIFFUSION 0x0002 +#define AL_REVERB_GAIN 0x0003 +#define AL_REVERB_GAINHF 0x0004 +#define AL_REVERB_DECAY_TIME 0x0005 +#define AL_REVERB_DECAY_HFRATIO 0x0006 +#define AL_REVERB_REFLECTIONS_GAIN 0x0007 +#define AL_REVERB_REFLECTIONS_DELAY 0x0008 +#define AL_REVERB_LATE_REVERB_GAIN 0x0009 +#define AL_REVERB_LATE_REVERB_DELAY 0x000A +#define AL_REVERB_AIR_ABSORPTION_GAINHF 0x000B +#define AL_REVERB_ROOM_ROLLOFF_FACTOR 0x000C +#define AL_REVERB_DECAY_HFLIMIT 0x000D + +/* EAX Reverb effect parameters */ +#define AL_EAXREVERB_DENSITY 0x0001 +#define AL_EAXREVERB_DIFFUSION 0x0002 +#define AL_EAXREVERB_GAIN 0x0003 +#define AL_EAXREVERB_GAINHF 0x0004 +#define AL_EAXREVERB_GAINLF 0x0005 +#define AL_EAXREVERB_DECAY_TIME 0x0006 +#define AL_EAXREVERB_DECAY_HFRATIO 0x0007 +#define AL_EAXREVERB_DECAY_LFRATIO 0x0008 +#define AL_EAXREVERB_REFLECTIONS_GAIN 0x0009 +#define AL_EAXREVERB_REFLECTIONS_DELAY 0x000A +#define AL_EAXREVERB_REFLECTIONS_PAN 0x000B +#define AL_EAXREVERB_LATE_REVERB_GAIN 0x000C +#define AL_EAXREVERB_LATE_REVERB_DELAY 0x000D +#define AL_EAXREVERB_LATE_REVERB_PAN 0x000E +#define AL_EAXREVERB_ECHO_TIME 0x000F +#define AL_EAXREVERB_ECHO_DEPTH 0x0010 +#define AL_EAXREVERB_MODULATION_TIME 0x0011 +#define AL_EAXREVERB_MODULATION_DEPTH 0x0012 +#define AL_EAXREVERB_AIR_ABSORPTION_GAINHF 0x0013 +#define AL_EAXREVERB_HFREFERENCE 0x0014 +#define AL_EAXREVERB_LFREFERENCE 0x0015 +#define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR 0x0016 +#define AL_EAXREVERB_DECAY_HFLIMIT 0x0017 + +/* Chorus effect parameters */ +#define AL_CHORUS_WAVEFORM 0x0001 +#define AL_CHORUS_PHASE 0x0002 +#define AL_CHORUS_RATE 0x0003 +#define AL_CHORUS_DEPTH 0x0004 +#define AL_CHORUS_FEEDBACK 0x0005 +#define AL_CHORUS_DELAY 0x0006 + +/* Distortion effect parameters */ +#define AL_DISTORTION_EDGE 0x0001 +#define AL_DISTORTION_GAIN 0x0002 +#define AL_DISTORTION_LOWPASS_CUTOFF 0x0003 +#define AL_DISTORTION_EQCENTER 0x0004 +#define AL_DISTORTION_EQBANDWIDTH 0x0005 + +/* Echo effect parameters */ +#define AL_ECHO_DELAY 0x0001 +#define AL_ECHO_LRDELAY 0x0002 +#define AL_ECHO_DAMPING 0x0003 +#define AL_ECHO_FEEDBACK 0x0004 +#define AL_ECHO_SPREAD 0x0005 + +/* Flanger effect parameters */ +#define AL_FLANGER_WAVEFORM 0x0001 +#define AL_FLANGER_PHASE 0x0002 +#define AL_FLANGER_RATE 0x0003 +#define AL_FLANGER_DEPTH 0x0004 +#define AL_FLANGER_FEEDBACK 0x0005 +#define AL_FLANGER_DELAY 0x0006 + +/* Frequency shifter effect parameters */ +#define AL_FREQUENCY_SHIFTER_FREQUENCY 0x0001 +#define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION 0x0002 +#define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION 0x0003 + +/* Vocal morpher effect parameters */ +#define AL_VOCAL_MORPHER_PHONEMEA 0x0001 +#define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING 0x0002 +#define AL_VOCAL_MORPHER_PHONEMEB 0x0003 +#define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING 0x0004 +#define AL_VOCAL_MORPHER_WAVEFORM 0x0005 +#define AL_VOCAL_MORPHER_RATE 0x0006 + +/* Pitchshifter effect parameters */ +#define AL_PITCH_SHIFTER_COARSE_TUNE 0x0001 +#define AL_PITCH_SHIFTER_FINE_TUNE 0x0002 + +/* Ringmodulator effect parameters */ +#define AL_RING_MODULATOR_FREQUENCY 0x0001 +#define AL_RING_MODULATOR_HIGHPASS_CUTOFF 0x0002 +#define AL_RING_MODULATOR_WAVEFORM 0x0003 + +/* Autowah effect parameters */ +#define AL_AUTOWAH_ATTACK_TIME 0x0001 +#define AL_AUTOWAH_RELEASE_TIME 0x0002 +#define AL_AUTOWAH_RESONANCE 0x0003 +#define AL_AUTOWAH_PEAK_GAIN 0x0004 + +/* Compressor effect parameters */ +#define AL_COMPRESSOR_ONOFF 0x0001 + +/* Equalizer effect parameters */ +#define AL_EQUALIZER_LOW_GAIN 0x0001 +#define AL_EQUALIZER_LOW_CUTOFF 0x0002 +#define AL_EQUALIZER_MID1_GAIN 0x0003 +#define AL_EQUALIZER_MID1_CENTER 0x0004 +#define AL_EQUALIZER_MID1_WIDTH 0x0005 +#define AL_EQUALIZER_MID2_GAIN 0x0006 +#define AL_EQUALIZER_MID2_CENTER 0x0007 +#define AL_EQUALIZER_MID2_WIDTH 0x0008 +#define AL_EQUALIZER_HIGH_GAIN 0x0009 +#define AL_EQUALIZER_HIGH_CUTOFF 0x000A + +/* Effect type */ +#define AL_EFFECT_FIRST_PARAMETER 0x0000 +#define AL_EFFECT_LAST_PARAMETER 0x8000 +#define AL_EFFECT_TYPE 0x8001 + +/* Effect types, used with the AL_EFFECT_TYPE property */ +#define AL_EFFECT_NULL 0x0000 +#define AL_EFFECT_REVERB 0x0001 +#define AL_EFFECT_CHORUS 0x0002 +#define AL_EFFECT_DISTORTION 0x0003 +#define AL_EFFECT_ECHO 0x0004 +#define AL_EFFECT_FLANGER 0x0005 +#define AL_EFFECT_FREQUENCY_SHIFTER 0x0006 +#define AL_EFFECT_VOCAL_MORPHER 0x0007 +#define AL_EFFECT_PITCH_SHIFTER 0x0008 +#define AL_EFFECT_RING_MODULATOR 0x0009 +#define AL_EFFECT_AUTOWAH 0x000A +#define AL_EFFECT_COMPRESSOR 0x000B +#define AL_EFFECT_EQUALIZER 0x000C +#define AL_EFFECT_EAXREVERB 0x8000 + +/* Auxiliary Effect Slot properties. */ +#define AL_EFFECTSLOT_EFFECT 0x0001 +#define AL_EFFECTSLOT_GAIN 0x0002 +#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO 0x0003 + +/* NULL Auxiliary Slot ID to disable a source send. */ +#define AL_EFFECTSLOT_NULL 0x0000 + + +/* Filter properties. */ + +/* Lowpass filter parameters */ +#define AL_LOWPASS_GAIN 0x0001 +#define AL_LOWPASS_GAINHF 0x0002 + +/* Highpass filter parameters */ +#define AL_HIGHPASS_GAIN 0x0001 +#define AL_HIGHPASS_GAINLF 0x0002 + +/* Bandpass filter parameters */ +#define AL_BANDPASS_GAIN 0x0001 +#define AL_BANDPASS_GAINLF 0x0002 +#define AL_BANDPASS_GAINHF 0x0003 + +/* Filter type */ +#define AL_FILTER_FIRST_PARAMETER 0x0000 +#define AL_FILTER_LAST_PARAMETER 0x8000 +#define AL_FILTER_TYPE 0x8001 + +/* Filter types, used with the AL_FILTER_TYPE property */ +#define AL_FILTER_NULL 0x0000 +#define AL_FILTER_LOWPASS 0x0001 +#define AL_FILTER_HIGHPASS 0x0002 +#define AL_FILTER_BANDPASS 0x0003 + + +/* Effect object function types. */ +typedef void (AL_APIENTRY *LPALGENEFFECTS)(ALsizei, ALuint*); +typedef void (AL_APIENTRY *LPALDELETEEFFECTS)(ALsizei, const ALuint*); +typedef ALboolean (AL_APIENTRY *LPALISEFFECT)(ALuint); +typedef void (AL_APIENTRY *LPALEFFECTI)(ALuint, ALenum, ALint); +typedef void (AL_APIENTRY *LPALEFFECTIV)(ALuint, ALenum, const ALint*); +typedef void (AL_APIENTRY *LPALEFFECTF)(ALuint, ALenum, ALfloat); +typedef void (AL_APIENTRY *LPALEFFECTFV)(ALuint, ALenum, const ALfloat*); +typedef void (AL_APIENTRY *LPALGETEFFECTI)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETEFFECTIV)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETEFFECTF)(ALuint, ALenum, ALfloat*); +typedef void (AL_APIENTRY *LPALGETEFFECTFV)(ALuint, ALenum, ALfloat*); + +/* Filter object function types. */ +typedef void (AL_APIENTRY *LPALGENFILTERS)(ALsizei, ALuint*); +typedef void (AL_APIENTRY *LPALDELETEFILTERS)(ALsizei, const ALuint*); +typedef ALboolean (AL_APIENTRY *LPALISFILTER)(ALuint); +typedef void (AL_APIENTRY *LPALFILTERI)(ALuint, ALenum, ALint); +typedef void (AL_APIENTRY *LPALFILTERIV)(ALuint, ALenum, const ALint*); +typedef void (AL_APIENTRY *LPALFILTERF)(ALuint, ALenum, ALfloat); +typedef void (AL_APIENTRY *LPALFILTERFV)(ALuint, ALenum, const ALfloat*); +typedef void (AL_APIENTRY *LPALGETFILTERI)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETFILTERIV)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETFILTERF)(ALuint, ALenum, ALfloat*); +typedef void (AL_APIENTRY *LPALGETFILTERFV)(ALuint, ALenum, ALfloat*); + +/* Auxiliary Effect Slot object function types. */ +typedef void (AL_APIENTRY *LPALGENAUXILIARYEFFECTSLOTS)(ALsizei, ALuint*); +typedef void (AL_APIENTRY *LPALDELETEAUXILIARYEFFECTSLOTS)(ALsizei, const ALuint*); +typedef ALboolean (AL_APIENTRY *LPALISAUXILIARYEFFECTSLOT)(ALuint); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, const ALint*); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, const ALfloat*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*); + +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects); +AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects); +AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect); +AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue); +AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues); +AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue); +AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues); +AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue); +AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues); +AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue); +AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues); + +AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters); +AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters); +AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter); +AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue); +AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues); +AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue); +AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues); +AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue); +AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues); +AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue); +AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues); + +AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots); +AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots); +AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues); +#endif + +/* Filter ranges and defaults. */ + +/* Lowpass filter */ +#define AL_LOWPASS_MIN_GAIN (0.0f) +#define AL_LOWPASS_MAX_GAIN (1.0f) +#define AL_LOWPASS_DEFAULT_GAIN (1.0f) + +#define AL_LOWPASS_MIN_GAINHF (0.0f) +#define AL_LOWPASS_MAX_GAINHF (1.0f) +#define AL_LOWPASS_DEFAULT_GAINHF (1.0f) + +/* Highpass filter */ +#define AL_HIGHPASS_MIN_GAIN (0.0f) +#define AL_HIGHPASS_MAX_GAIN (1.0f) +#define AL_HIGHPASS_DEFAULT_GAIN (1.0f) + +#define AL_HIGHPASS_MIN_GAINLF (0.0f) +#define AL_HIGHPASS_MAX_GAINLF (1.0f) +#define AL_HIGHPASS_DEFAULT_GAINLF (1.0f) + +/* Bandpass filter */ +#define AL_BANDPASS_MIN_GAIN (0.0f) +#define AL_BANDPASS_MAX_GAIN (1.0f) +#define AL_BANDPASS_DEFAULT_GAIN (1.0f) + +#define AL_BANDPASS_MIN_GAINHF (0.0f) +#define AL_BANDPASS_MAX_GAINHF (1.0f) +#define AL_BANDPASS_DEFAULT_GAINHF (1.0f) + +#define AL_BANDPASS_MIN_GAINLF (0.0f) +#define AL_BANDPASS_MAX_GAINLF (1.0f) +#define AL_BANDPASS_DEFAULT_GAINLF (1.0f) + + +/* Effect parameter ranges and defaults. */ + +/* Standard reverb effect */ +#define AL_REVERB_MIN_DENSITY (0.0f) +#define AL_REVERB_MAX_DENSITY (1.0f) +#define AL_REVERB_DEFAULT_DENSITY (1.0f) + +#define AL_REVERB_MIN_DIFFUSION (0.0f) +#define AL_REVERB_MAX_DIFFUSION (1.0f) +#define AL_REVERB_DEFAULT_DIFFUSION (1.0f) + +#define AL_REVERB_MIN_GAIN (0.0f) +#define AL_REVERB_MAX_GAIN (1.0f) +#define AL_REVERB_DEFAULT_GAIN (0.32f) + +#define AL_REVERB_MIN_GAINHF (0.0f) +#define AL_REVERB_MAX_GAINHF (1.0f) +#define AL_REVERB_DEFAULT_GAINHF (0.89f) + +#define AL_REVERB_MIN_DECAY_TIME (0.1f) +#define AL_REVERB_MAX_DECAY_TIME (20.0f) +#define AL_REVERB_DEFAULT_DECAY_TIME (1.49f) + +#define AL_REVERB_MIN_DECAY_HFRATIO (0.1f) +#define AL_REVERB_MAX_DECAY_HFRATIO (2.0f) +#define AL_REVERB_DEFAULT_DECAY_HFRATIO (0.83f) + +#define AL_REVERB_MIN_REFLECTIONS_GAIN (0.0f) +#define AL_REVERB_MAX_REFLECTIONS_GAIN (3.16f) +#define AL_REVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) + +#define AL_REVERB_MIN_REFLECTIONS_DELAY (0.0f) +#define AL_REVERB_MAX_REFLECTIONS_DELAY (0.3f) +#define AL_REVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) + +#define AL_REVERB_MIN_LATE_REVERB_GAIN (0.0f) +#define AL_REVERB_MAX_LATE_REVERB_GAIN (10.0f) +#define AL_REVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) + +#define AL_REVERB_MIN_LATE_REVERB_DELAY (0.0f) +#define AL_REVERB_MAX_LATE_REVERB_DELAY (0.1f) +#define AL_REVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) + +#define AL_REVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) +#define AL_REVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) +#define AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) + +#define AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) +#define AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) +#define AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + +#define AL_REVERB_MIN_DECAY_HFLIMIT AL_FALSE +#define AL_REVERB_MAX_DECAY_HFLIMIT AL_TRUE +#define AL_REVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + +/* EAX reverb effect */ +#define AL_EAXREVERB_MIN_DENSITY (0.0f) +#define AL_EAXREVERB_MAX_DENSITY (1.0f) +#define AL_EAXREVERB_DEFAULT_DENSITY (1.0f) + +#define AL_EAXREVERB_MIN_DIFFUSION (0.0f) +#define AL_EAXREVERB_MAX_DIFFUSION (1.0f) +#define AL_EAXREVERB_DEFAULT_DIFFUSION (1.0f) + +#define AL_EAXREVERB_MIN_GAIN (0.0f) +#define AL_EAXREVERB_MAX_GAIN (1.0f) +#define AL_EAXREVERB_DEFAULT_GAIN (0.32f) + +#define AL_EAXREVERB_MIN_GAINHF (0.0f) +#define AL_EAXREVERB_MAX_GAINHF (1.0f) +#define AL_EAXREVERB_DEFAULT_GAINHF (0.89f) + +#define AL_EAXREVERB_MIN_GAINLF (0.0f) +#define AL_EAXREVERB_MAX_GAINLF (1.0f) +#define AL_EAXREVERB_DEFAULT_GAINLF (1.0f) + +#define AL_EAXREVERB_MIN_DECAY_TIME (0.1f) +#define AL_EAXREVERB_MAX_DECAY_TIME (20.0f) +#define AL_EAXREVERB_DEFAULT_DECAY_TIME (1.49f) + +#define AL_EAXREVERB_MIN_DECAY_HFRATIO (0.1f) +#define AL_EAXREVERB_MAX_DECAY_HFRATIO (2.0f) +#define AL_EAXREVERB_DEFAULT_DECAY_HFRATIO (0.83f) + +#define AL_EAXREVERB_MIN_DECAY_LFRATIO (0.1f) +#define AL_EAXREVERB_MAX_DECAY_LFRATIO (2.0f) +#define AL_EAXREVERB_DEFAULT_DECAY_LFRATIO (1.0f) + +#define AL_EAXREVERB_MIN_REFLECTIONS_GAIN (0.0f) +#define AL_EAXREVERB_MAX_REFLECTIONS_GAIN (3.16f) +#define AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) + +#define AL_EAXREVERB_MIN_REFLECTIONS_DELAY (0.0f) +#define AL_EAXREVERB_MAX_REFLECTIONS_DELAY (0.3f) +#define AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) + +#define AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ (0.0f) + +#define AL_EAXREVERB_MIN_LATE_REVERB_GAIN (0.0f) +#define AL_EAXREVERB_MAX_LATE_REVERB_GAIN (10.0f) +#define AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) + +#define AL_EAXREVERB_MIN_LATE_REVERB_DELAY (0.0f) +#define AL_EAXREVERB_MAX_LATE_REVERB_DELAY (0.1f) +#define AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) + +#define AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ (0.0f) + +#define AL_EAXREVERB_MIN_ECHO_TIME (0.075f) +#define AL_EAXREVERB_MAX_ECHO_TIME (0.25f) +#define AL_EAXREVERB_DEFAULT_ECHO_TIME (0.25f) + +#define AL_EAXREVERB_MIN_ECHO_DEPTH (0.0f) +#define AL_EAXREVERB_MAX_ECHO_DEPTH (1.0f) +#define AL_EAXREVERB_DEFAULT_ECHO_DEPTH (0.0f) + +#define AL_EAXREVERB_MIN_MODULATION_TIME (0.04f) +#define AL_EAXREVERB_MAX_MODULATION_TIME (4.0f) +#define AL_EAXREVERB_DEFAULT_MODULATION_TIME (0.25f) + +#define AL_EAXREVERB_MIN_MODULATION_DEPTH (0.0f) +#define AL_EAXREVERB_MAX_MODULATION_DEPTH (1.0f) +#define AL_EAXREVERB_DEFAULT_MODULATION_DEPTH (0.0f) + +#define AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) +#define AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) +#define AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) + +#define AL_EAXREVERB_MIN_HFREFERENCE (1000.0f) +#define AL_EAXREVERB_MAX_HFREFERENCE (20000.0f) +#define AL_EAXREVERB_DEFAULT_HFREFERENCE (5000.0f) + +#define AL_EAXREVERB_MIN_LFREFERENCE (20.0f) +#define AL_EAXREVERB_MAX_LFREFERENCE (1000.0f) +#define AL_EAXREVERB_DEFAULT_LFREFERENCE (250.0f) + +#define AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) +#define AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) +#define AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + +#define AL_EAXREVERB_MIN_DECAY_HFLIMIT AL_FALSE +#define AL_EAXREVERB_MAX_DECAY_HFLIMIT AL_TRUE +#define AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + +/* Chorus effect */ +#define AL_CHORUS_WAVEFORM_SINUSOID (0) +#define AL_CHORUS_WAVEFORM_TRIANGLE (1) + +#define AL_CHORUS_MIN_WAVEFORM (0) +#define AL_CHORUS_MAX_WAVEFORM (1) +#define AL_CHORUS_DEFAULT_WAVEFORM (1) + +#define AL_CHORUS_MIN_PHASE (-180) +#define AL_CHORUS_MAX_PHASE (180) +#define AL_CHORUS_DEFAULT_PHASE (90) + +#define AL_CHORUS_MIN_RATE (0.0f) +#define AL_CHORUS_MAX_RATE (10.0f) +#define AL_CHORUS_DEFAULT_RATE (1.1f) + +#define AL_CHORUS_MIN_DEPTH (0.0f) +#define AL_CHORUS_MAX_DEPTH (1.0f) +#define AL_CHORUS_DEFAULT_DEPTH (0.1f) + +#define AL_CHORUS_MIN_FEEDBACK (-1.0f) +#define AL_CHORUS_MAX_FEEDBACK (1.0f) +#define AL_CHORUS_DEFAULT_FEEDBACK (0.25f) + +#define AL_CHORUS_MIN_DELAY (0.0f) +#define AL_CHORUS_MAX_DELAY (0.016f) +#define AL_CHORUS_DEFAULT_DELAY (0.016f) + +/* Distortion effect */ +#define AL_DISTORTION_MIN_EDGE (0.0f) +#define AL_DISTORTION_MAX_EDGE (1.0f) +#define AL_DISTORTION_DEFAULT_EDGE (0.2f) + +#define AL_DISTORTION_MIN_GAIN (0.01f) +#define AL_DISTORTION_MAX_GAIN (1.0f) +#define AL_DISTORTION_DEFAULT_GAIN (0.05f) + +#define AL_DISTORTION_MIN_LOWPASS_CUTOFF (80.0f) +#define AL_DISTORTION_MAX_LOWPASS_CUTOFF (24000.0f) +#define AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF (8000.0f) + +#define AL_DISTORTION_MIN_EQCENTER (80.0f) +#define AL_DISTORTION_MAX_EQCENTER (24000.0f) +#define AL_DISTORTION_DEFAULT_EQCENTER (3600.0f) + +#define AL_DISTORTION_MIN_EQBANDWIDTH (80.0f) +#define AL_DISTORTION_MAX_EQBANDWIDTH (24000.0f) +#define AL_DISTORTION_DEFAULT_EQBANDWIDTH (3600.0f) + +/* Echo effect */ +#define AL_ECHO_MIN_DELAY (0.0f) +#define AL_ECHO_MAX_DELAY (0.207f) +#define AL_ECHO_DEFAULT_DELAY (0.1f) + +#define AL_ECHO_MIN_LRDELAY (0.0f) +#define AL_ECHO_MAX_LRDELAY (0.404f) +#define AL_ECHO_DEFAULT_LRDELAY (0.1f) + +#define AL_ECHO_MIN_DAMPING (0.0f) +#define AL_ECHO_MAX_DAMPING (0.99f) +#define AL_ECHO_DEFAULT_DAMPING (0.5f) + +#define AL_ECHO_MIN_FEEDBACK (0.0f) +#define AL_ECHO_MAX_FEEDBACK (1.0f) +#define AL_ECHO_DEFAULT_FEEDBACK (0.5f) + +#define AL_ECHO_MIN_SPREAD (-1.0f) +#define AL_ECHO_MAX_SPREAD (1.0f) +#define AL_ECHO_DEFAULT_SPREAD (-1.0f) + +/* Flanger effect */ +#define AL_FLANGER_WAVEFORM_SINUSOID (0) +#define AL_FLANGER_WAVEFORM_TRIANGLE (1) + +#define AL_FLANGER_MIN_WAVEFORM (0) +#define AL_FLANGER_MAX_WAVEFORM (1) +#define AL_FLANGER_DEFAULT_WAVEFORM (1) + +#define AL_FLANGER_MIN_PHASE (-180) +#define AL_FLANGER_MAX_PHASE (180) +#define AL_FLANGER_DEFAULT_PHASE (0) + +#define AL_FLANGER_MIN_RATE (0.0f) +#define AL_FLANGER_MAX_RATE (10.0f) +#define AL_FLANGER_DEFAULT_RATE (0.27f) + +#define AL_FLANGER_MIN_DEPTH (0.0f) +#define AL_FLANGER_MAX_DEPTH (1.0f) +#define AL_FLANGER_DEFAULT_DEPTH (1.0f) + +#define AL_FLANGER_MIN_FEEDBACK (-1.0f) +#define AL_FLANGER_MAX_FEEDBACK (1.0f) +#define AL_FLANGER_DEFAULT_FEEDBACK (-0.5f) + +#define AL_FLANGER_MIN_DELAY (0.0f) +#define AL_FLANGER_MAX_DELAY (0.004f) +#define AL_FLANGER_DEFAULT_DELAY (0.002f) + +/* Frequency shifter effect */ +#define AL_FREQUENCY_SHIFTER_MIN_FREQUENCY (0.0f) +#define AL_FREQUENCY_SHIFTER_MAX_FREQUENCY (24000.0f) +#define AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY (0.0f) + +#define AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION (0) +#define AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION (2) +#define AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION (0) + +#define AL_FREQUENCY_SHIFTER_DIRECTION_DOWN (0) +#define AL_FREQUENCY_SHIFTER_DIRECTION_UP (1) +#define AL_FREQUENCY_SHIFTER_DIRECTION_OFF (2) + +#define AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION (0) +#define AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION (2) +#define AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION (0) + +/* Vocal morpher effect */ +#define AL_VOCAL_MORPHER_MIN_PHONEMEA (0) +#define AL_VOCAL_MORPHER_MAX_PHONEMEA (29) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA (0) + +#define AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING (-24) +#define AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING (24) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING (0) + +#define AL_VOCAL_MORPHER_MIN_PHONEMEB (0) +#define AL_VOCAL_MORPHER_MAX_PHONEMEB (29) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB (10) + +#define AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING (-24) +#define AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING (24) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING (0) + +#define AL_VOCAL_MORPHER_PHONEME_A (0) +#define AL_VOCAL_MORPHER_PHONEME_E (1) +#define AL_VOCAL_MORPHER_PHONEME_I (2) +#define AL_VOCAL_MORPHER_PHONEME_O (3) +#define AL_VOCAL_MORPHER_PHONEME_U (4) +#define AL_VOCAL_MORPHER_PHONEME_AA (5) +#define AL_VOCAL_MORPHER_PHONEME_AE (6) +#define AL_VOCAL_MORPHER_PHONEME_AH (7) +#define AL_VOCAL_MORPHER_PHONEME_AO (8) +#define AL_VOCAL_MORPHER_PHONEME_EH (9) +#define AL_VOCAL_MORPHER_PHONEME_ER (10) +#define AL_VOCAL_MORPHER_PHONEME_IH (11) +#define AL_VOCAL_MORPHER_PHONEME_IY (12) +#define AL_VOCAL_MORPHER_PHONEME_UH (13) +#define AL_VOCAL_MORPHER_PHONEME_UW (14) +#define AL_VOCAL_MORPHER_PHONEME_B (15) +#define AL_VOCAL_MORPHER_PHONEME_D (16) +#define AL_VOCAL_MORPHER_PHONEME_F (17) +#define AL_VOCAL_MORPHER_PHONEME_G (18) +#define AL_VOCAL_MORPHER_PHONEME_J (19) +#define AL_VOCAL_MORPHER_PHONEME_K (20) +#define AL_VOCAL_MORPHER_PHONEME_L (21) +#define AL_VOCAL_MORPHER_PHONEME_M (22) +#define AL_VOCAL_MORPHER_PHONEME_N (23) +#define AL_VOCAL_MORPHER_PHONEME_P (24) +#define AL_VOCAL_MORPHER_PHONEME_R (25) +#define AL_VOCAL_MORPHER_PHONEME_S (26) +#define AL_VOCAL_MORPHER_PHONEME_T (27) +#define AL_VOCAL_MORPHER_PHONEME_V (28) +#define AL_VOCAL_MORPHER_PHONEME_Z (29) + +#define AL_VOCAL_MORPHER_WAVEFORM_SINUSOID (0) +#define AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE (1) +#define AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH (2) + +#define AL_VOCAL_MORPHER_MIN_WAVEFORM (0) +#define AL_VOCAL_MORPHER_MAX_WAVEFORM (2) +#define AL_VOCAL_MORPHER_DEFAULT_WAVEFORM (0) + +#define AL_VOCAL_MORPHER_MIN_RATE (0.0f) +#define AL_VOCAL_MORPHER_MAX_RATE (10.0f) +#define AL_VOCAL_MORPHER_DEFAULT_RATE (1.41f) + +/* Pitch shifter effect */ +#define AL_PITCH_SHIFTER_MIN_COARSE_TUNE (-12) +#define AL_PITCH_SHIFTER_MAX_COARSE_TUNE (12) +#define AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE (12) + +#define AL_PITCH_SHIFTER_MIN_FINE_TUNE (-50) +#define AL_PITCH_SHIFTER_MAX_FINE_TUNE (50) +#define AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE (0) + +/* Ring modulator effect */ +#define AL_RING_MODULATOR_MIN_FREQUENCY (0.0f) +#define AL_RING_MODULATOR_MAX_FREQUENCY (8000.0f) +#define AL_RING_MODULATOR_DEFAULT_FREQUENCY (440.0f) + +#define AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF (0.0f) +#define AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF (24000.0f) +#define AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF (800.0f) + +#define AL_RING_MODULATOR_SINUSOID (0) +#define AL_RING_MODULATOR_SAWTOOTH (1) +#define AL_RING_MODULATOR_SQUARE (2) + +#define AL_RING_MODULATOR_MIN_WAVEFORM (0) +#define AL_RING_MODULATOR_MAX_WAVEFORM (2) +#define AL_RING_MODULATOR_DEFAULT_WAVEFORM (0) + +/* Autowah effect */ +#define AL_AUTOWAH_MIN_ATTACK_TIME (0.0001f) +#define AL_AUTOWAH_MAX_ATTACK_TIME (1.0f) +#define AL_AUTOWAH_DEFAULT_ATTACK_TIME (0.06f) + +#define AL_AUTOWAH_MIN_RELEASE_TIME (0.0001f) +#define AL_AUTOWAH_MAX_RELEASE_TIME (1.0f) +#define AL_AUTOWAH_DEFAULT_RELEASE_TIME (0.06f) + +#define AL_AUTOWAH_MIN_RESONANCE (2.0f) +#define AL_AUTOWAH_MAX_RESONANCE (1000.0f) +#define AL_AUTOWAH_DEFAULT_RESONANCE (1000.0f) + +#define AL_AUTOWAH_MIN_PEAK_GAIN (0.00003f) +#define AL_AUTOWAH_MAX_PEAK_GAIN (31621.0f) +#define AL_AUTOWAH_DEFAULT_PEAK_GAIN (11.22f) + +/* Compressor effect */ +#define AL_COMPRESSOR_MIN_ONOFF (0) +#define AL_COMPRESSOR_MAX_ONOFF (1) +#define AL_COMPRESSOR_DEFAULT_ONOFF (1) + +/* Equalizer effect */ +#define AL_EQUALIZER_MIN_LOW_GAIN (0.126f) +#define AL_EQUALIZER_MAX_LOW_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_LOW_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_LOW_CUTOFF (50.0f) +#define AL_EQUALIZER_MAX_LOW_CUTOFF (800.0f) +#define AL_EQUALIZER_DEFAULT_LOW_CUTOFF (200.0f) + +#define AL_EQUALIZER_MIN_MID1_GAIN (0.126f) +#define AL_EQUALIZER_MAX_MID1_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_MID1_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_MID1_CENTER (200.0f) +#define AL_EQUALIZER_MAX_MID1_CENTER (3000.0f) +#define AL_EQUALIZER_DEFAULT_MID1_CENTER (500.0f) + +#define AL_EQUALIZER_MIN_MID1_WIDTH (0.01f) +#define AL_EQUALIZER_MAX_MID1_WIDTH (1.0f) +#define AL_EQUALIZER_DEFAULT_MID1_WIDTH (1.0f) + +#define AL_EQUALIZER_MIN_MID2_GAIN (0.126f) +#define AL_EQUALIZER_MAX_MID2_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_MID2_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_MID2_CENTER (1000.0f) +#define AL_EQUALIZER_MAX_MID2_CENTER (8000.0f) +#define AL_EQUALIZER_DEFAULT_MID2_CENTER (3000.0f) + +#define AL_EQUALIZER_MIN_MID2_WIDTH (0.01f) +#define AL_EQUALIZER_MAX_MID2_WIDTH (1.0f) +#define AL_EQUALIZER_DEFAULT_MID2_WIDTH (1.0f) + +#define AL_EQUALIZER_MIN_HIGH_GAIN (0.126f) +#define AL_EQUALIZER_MAX_HIGH_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_HIGH_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_HIGH_CUTOFF (4000.0f) +#define AL_EQUALIZER_MAX_HIGH_CUTOFF (16000.0f) +#define AL_EQUALIZER_DEFAULT_HIGH_CUTOFF (6000.0f) + + +/* Source parameter value ranges and defaults. */ +#define AL_MIN_AIR_ABSORPTION_FACTOR (0.0f) +#define AL_MAX_AIR_ABSORPTION_FACTOR (10.0f) +#define AL_DEFAULT_AIR_ABSORPTION_FACTOR (0.0f) + +#define AL_MIN_ROOM_ROLLOFF_FACTOR (0.0f) +#define AL_MAX_ROOM_ROLLOFF_FACTOR (10.0f) +#define AL_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + +#define AL_MIN_CONE_OUTER_GAINHF (0.0f) +#define AL_MAX_CONE_OUTER_GAINHF (1.0f) +#define AL_DEFAULT_CONE_OUTER_GAINHF (1.0f) + +#define AL_MIN_DIRECT_FILTER_GAINHF_AUTO AL_FALSE +#define AL_MAX_DIRECT_FILTER_GAINHF_AUTO AL_TRUE +#define AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO AL_TRUE + +#define AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_FALSE +#define AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE +#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE + +#define AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_FALSE +#define AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE +#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE + + +/* Listener parameter value ranges and defaults. */ +#define AL_MIN_METERS_PER_UNIT FLT_MIN +#define AL_MAX_METERS_PER_UNIT FLT_MAX +#define AL_DEFAULT_METERS_PER_UNIT (1.0f) + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* AL_EFX_H */ diff --git a/external/openal_soft/lib/libopenal32.a b/external/openal_soft/lib/libopenal32.a new file mode 100644 index 0000000000000000000000000000000000000000..5f7352acabf82dad8b8d9a08b13517b244ef1f0f GIT binary patch literal 95688 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 literal 0 HcmV?d00001 diff --git a/external/openal_soft/openal32.dll b/external/openal_soft/openal32.dll new file mode 100644 index 0000000000000000000000000000000000000000..71ced6a21f8add6fdbd7571a81d4c4a36eca3418 GIT binary patch literal 402553 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 literal 0 HcmV?d00001 diff --git a/fonts/coming_soon b/fonts/coming_soon new file mode 100644 index 000000000..e69de29bb diff --git a/logo/logo128x128.png b/logo/logo128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..99ba5437467d000717a2782ad404210d81ae934d GIT binary patch literal 1868 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4kiW$2A`O3a~K#H7>k44ofy`glX=O&z`&C3 z=mn(udr^Ozyq%a5JRuWQ^hVGVa+;rDWgJ*<6d%bu|tyb@^=8%8#qAugA;(IZP1@FQiU67h=+HyDP&W>NsuYcTc z+59Nv-dd2`#M~@TEHAk3nmzxMwo}}RP?ow?AY-PtMf+TK8VI`F7sWV==Rhln7{jcs=n@?bH&`ng&9{B&+A>NO_;i77weW|DZCFaf_(PZ z-kv)$f5E92;xXSL!N{C`bY;rda{h-Y7j|9PEAUBA*`V4UtYHmzSmD?9u>S(*gyx2Z zF9oL~u{-SNgl1fokNUl%y+AB-(PE1&dUu>H9<12~4vf4_F5ewq|8Ta@_IrAFS4M7U zUdx`lDV>Fn-|?@lz2j`*{UxLH;wtBRADHg`of|3+irRK`Z? zovyX+a81AJnk`?-v3dvpqDiHNf}mt%#1wjESM_h_>@zQ%BcAFsx;w6}=UBbtXph#e zfa|W=-X+RU<{sl<+Rtrc|M73A{>MFHYZ|WEy%PABng2j)^SSnndGlw~|7v({|NrBg zT@CNt1uM%M-*sCHwOfy59Q@FXky<+w!AV@sC$6-y-P? zw~pJk%wKq1&PBds{=fU*jz@{^ujj}Yu5?_@S2->I>!CXjj?Ip*IC8GE@?OfV_k#9^ z`>(b5{oc6j=;jS#dw4H$AC(8C zKZ{;?C4Z>;(F?gQ_~AMm;LYV#~EZh*06H_pJsKxC6YT#{lY5ed4Ha1 zUr4_5RJb^Hk$EA1;xd6uTIwEL zJ!EsSf4iUeV)jQJAMcL>_u5{t{X84q{$ZZ^euw_T>7p**6@Ho4J$}^jPx`;q@k3Fo zZN7KxSx~yLTJcHbOz9e#8P9c}HJ@2%yX@~jHJ=ZQL+7~&?-kp>C&K3V!HcZIdjs@X z)*628op61@zMtzkX`nIgT=nXZn1jDz2g_f1waL7XWjDy9Pb>zq-*?LXzC_=Nb5bvokz=$ zFT85saurlufYS1aEU5VPKCByX_x&1+EysH7S~eFzGT5W#U)!&V z{d9A=^LyorQup`zy{kEVtdEBtSu(Lyp#1LYInK|t*gb_Sii?XUAH9D4zhJ-6W7Ct3 R)eH;_44$rjF6*2UngC78rw0H4 literal 0 HcmV?d00001 diff --git a/logo/logo16x16.png b/logo/logo16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ee22d023dc6b8b26a56f814ac8fa4496582890a7 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL7>k44ofy`glX=O&z`&C3 z=h~uu<7?8y?BD-t)_1BaJaP$V3^-lM*}3b|ht(VSL!!>K#x`I7*Y=pz zL5BI+>&4T9xdT+*ZjEcWE^hPKLHxj7zw{wns_)}=f!t!y-94`RxIb33hKo~ sa<0aHcz5eE=PNH}R`FVdQ&MBb@0HX(LBLDyZ literal 0 HcmV?d00001 diff --git a/logo/logo24x24.png b/logo/logo24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..7acea950d11d5ba59ebf64196b6609595f29fba5 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4kiW$hJ4Xg>lqjr7>k44ofy`glX=O&z`&C3 z=^#pW#{EJ>=frpuVcA0x$a}lTg&hpGiUD#YMFgN^tz*{!r2{hB_G_LGZxH^ z6`dd|S-=_)!nm}9$D%Tn_5Z^8?yfKF9$wo1tTDtvbV4HkoY$)wf?T2$yB$OyEaO?i zqygfx&DpbxX^CWetOWw{$}Z4Y?GIAu(CRfx*+&&t;ucLK6V4Z=6K{ literal 0 HcmV?d00001 diff --git a/logo/logo256x256.png b/logo/logo256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..66545627719a2ab9aa73a0a801d94a0ea078b278 GIT binary patch literal 3760 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 B?mqwk literal 0 HcmV?d00001 diff --git a/logo/logo48x4.png b/logo/logo48x4.png new file mode 100644 index 0000000000000000000000000000000000000000..72713a973d1767d18987faa0bf8806571a28fad6 GIT binary patch literal 922 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4kiW$h8qca7Z?~A7>k44ofy`glX=O&z`&C3 z=^if=j%~{_o+@5(JhgEOV@K|F6^2g) z&Q*DSw)?Q4;p$%hRY$lDozF~KuBpvvEyKLyddta8PQ8H-0xlaDzPw<$ENNcN%BLc8 zH7rd07;RPvX?k!JaV)-f<(cM^W|j{j%t?%PuA9_m^+p)7PG;-dr`h0T=rxHwb86=s z=Bo<}udrlo+H}G0>Y`Im>{KV`b1|9zS^DmZLj$0$4}%FI}?Bhry|-YgmHUdoo|%cG4#EfXTiYO4=tAe1TXC_7XThb@FAJYMXP}xURlQQj{8u` zyZc(s_kENfaQUpvXlT`J@Y=3?#r~$#x5if&W?Wj_e@pdgcjO0i(+OuAX8mCK=*bZM zN;rXs-|-sHP4*?sGlDK25RT_dyy9`zqEz5r?WS2ZK`-uWt)CspWRcaN{ow#p%x$|H z9|MdVf)5un9B0~4V(;|-%tAZ1hO4jV{@2^PamALOw-&P5g@?^aD^XG9uUU6g=BRXh zbK06)uOsy}wU0lD&|lo7t!wJkczwGrtAF>EsHv76-~L87-Y8!BjAK!_+T5qztL~mt z+QR?td2xl<%UMPpTW5Yg`eoxDx!g8}YszX7v2tel=NGQcvb#S0X3`Cw%SCJdFKy@G ze_+da>B1`U0^KPaj`Zq=HLo}pG1aZ)*6l+w3+{!8tO{?AvRNdoyr4Spz4C@Fc8eZ% zcLaWTP@yc|z4cC8g#0JUpG$@dGXCO<{>EeF?hQAxvXU|>mi z^mSxl*x1kgCy|wbfq}EYBeIx*f$uN~Gak=hk;1^hAXVZTQ4*Y=R#Ki=l*$m0n3-3i z=jR%tP-d)Ws%L2E{@KZ#fq{9Gr;B4qhV$FWjz!UiJkD=_$8W#cF8U*}_W*xzmw4op zvnHt?0!_M49q0Y5XLOGe*t~Ae&llIcbFO)8EW0SF8Eto@CoV@)a$}_W{7*mU1UBo+ z3qLk>`ug?jSN(rm4U_t|aXm6s&iSglLh$7rM=Luw=XWNO;U|B(J~y~p!d0Y}XS-0> zeW|k9ITzEwo(-Z|OMbh!yZKm26)iuxBViw3kA2axGc%8s7!`iz6f_Pxcf{rT^Q4xw zH;k0hmXut(FO?SaVHazqlkBhMY|+ZeGYaefwS+kL+z>g^?S6x^j?YxdN^9-GY5XtO zH217dSmXBUhbFJ#>z27aujdOG%F0gcYs>lRVt6QQMc__;tE8hj6Svz*mMiKhJ{MPG z|LL*7!PIR|=WPEI1!5lD%~^|#5Ba_9EW8rzon7!OnXAd~SnLDgR}vF<8#8TQ`eK@< z(Z)EZGa6?(?37Z4e^6V6!`drrRkni0f{6|J}Wq@+C;PghZ zd-J9iiuUYW&-yas#I$A3$G-Y^lvr_@Mkl$}E|N%G{w3u)$Bd>qo$pWV;5ruF=k~{0 zeo@<>cXx$vX>~|W>}#9i-m_u3zsExl?xPu2uN59Q{Vaa+XVK#oQlhgL+^^6}Md!xccH(^x+=v3huxse;%z3T%dgU<&TmhGjG^0T-%hB z*-_@9>2}MscEY5tbCPb(A#0-ZYmL@5eY_?qYiPLm_~*_?mR&zqCY2eztKnRcw9K++ z;=vzNSc`<~XSInB?#{H(GW?Is}Q;QEgPi$W>xsdU)yWz6!*{U)}%eM)f zU8DD5ubZKn(4STQ8H~XbI=>1frEQuNw0Vx>S)I1FNXA()@g@=d&vGmdg`H_{tmM6u z`OMhEMBGW(zS!o$)-!e&E)>Mhth{^Zudvabxq^3|Mojq;I$vP>74^rz)Q=o8$etD< zG1cuxZ)wmbb9R>CwxsJX_^y^*3oTYZx5HungiDrFb2>TQ z=PC(n8!mofKDlt}oc~ou@8s+Me5|n9$2je`*xG#)gU}oXkrG1_qXNM_)$E)e-c?47#KJU zJR*x382Ao@Fyrz36)6l1d`_M&jv*CsZ|~kMy0cBlHSzb~c=Mg-I{PPgrRv_S?zT@z z4qLUayQDE?Hyf{z?UXN1-~a!2>s)w;XZcLi{{|fUoO1T97q~3^*7Cm`L-VDWXgkKZ zZ45~P?mJj7dfokV_yO}yR>{Mx1wuTp3S$^bIeD1W7ldu%tPtdRC9D2G!i-T`VoKd3 zrX89*uhh&Kw@R?3e-$u zp1`19-S-DB`L0mQ&t(b}X?8>M4u-ys>B1K{ zHSRWLZE86vp?dWLpG_zwijhBZt!ZCRUI9578fQ_sey!Vh{us#(k! zkAL8^Y4df^eJWdFw(6u1Tk@2U!<-habI@eQ07ZNdTCA7NfMozrmXd7$q!1Bt~;)@^()8xd?%{4dZq>`&nX%{xs!g^$4s z1wf7w-+1iCX3iCcZw{VuGmSiy&@(B^f^qo<_Rnx9TQF|Dw9MCmBSb^<<(2S4}2gKEvxW#{c7uAj1HzVGaYeVi7p(Gv`Fn6fmtDi@R>hTu0lS!ecTUAoVyG54IB!lEV9KJ%@a3Q{Y6V7ep3MMX^KHm34FYYl+- zNXm?Hc>!aM62y)xrZuQxI;SD(n{C_k(#g!Ua6v4^+uPbc7t{Tro9= zsmQ?1)ARR6&JK;0(0Ewjd%$u|L+}q>j)jmUWXbq^1G}*_D5MR&Ry|~ybIAIGFf3dj zvRv^xKc_xqvS__bg!av5OK>W9FuNi7MsuYk#D|(^6ZzBNQR#j_^N-k*PH4zo{~%bv zBYxmE)K}9sb6T|dHyj6XIdYi#9x_=RyU02L60BR*k)7}E@bWX%kV|!DxlF&*7KDA` z{2&4HUZd{;!)-APZx0H9c*#?yJlnu&f$+f;yZ)?8`}uU{o-=0@RNXqK8j*ezgbR4~ zvq~OTdmwSI@v9BQ11pbB6TYC^k>>=7iCv&%c9X?r%9WyfjmJO0?5vka;X#S6MBxIs zuQ@Fsc_;6e+JY^Ud>vdob)So+@KhThdG&`8)IWX>FXf;%xA`8>ywhYO2nqdHQui9S zUNU|ze>LSOD6O1PTQIGNu?A~6uYb7Y{Nh<(%9*^D-`>K>(a5E`bg zi_Br&6Q>tIBDs=%+B;}M%ev7z?~v{ZL=?+LXoGw^<;x{dimWzBmbu#miXe%_OTIl3 zb2;w}36`uIXh}mhLOb^s%a`MgODErCxe}z;ko@K*%NB0iHrpA95=nhQ`2$1rbeN$! zyCLe7?gtIhTt8nm6+L0baq4V4u-x& z;Q;TQ3^2`C=G|d_T?vg%Ua$%~cof=!l68gjs*_#52Q*_C5M@}jUV{?EI?c0aX(xJu z`XWd~dH%i$i%s7HhJU1ffD`<|dA<(n4@B}DIUqjG@<&R&Z4h7At1p21dc{;&aShI> zEQkd35UI>v|8Us{zCZB5MwEanpYCDqM@dJl1wD&lh2K{7?FxuO#`=TEy~g<+S(nTi zmtM97m%lZ_1zh3>KqcWyU2z9NXmFP&prrX6CPaYUYdl`SxQF*@O6qB~2h;X2zqSSG z0p;-=roO@w#wC!Dd3(}&!@PD#QE|0^DNA*BgG^6g(De*Ji2Gtm93#M&CE>h+kQUg_ukje&BD9$!x z{9E`yGl%JwE!egBOno1jd=IRT-@niKu}4*oRh}wHJbB8L_`@%=+`Eiz&1AO=L1J&! zL*)k|=c5?VLko8w6Ga1f8yAmrHgPHu(B7`v%LL$8U5w zd}nR``)yZ!eOUg#|0?_UzSBRp)XwhyZPpKu3-?c#^L~8J?RqY>h=^Or{a5hUg!5(3 zO8?gis!fcWer)Nb&r2VBRO$3uOUG`9l{#;(u`J>LnUlTl^nBCarG+cM)V#Eqgl3dv z?TPg2U!|EbTDI|4eM^q-ll{Dxv%+jwUUSx_N3$EAFXI0x^WXPC_4?oQzw9!3r)+P} zxa_(2@rhp|q{<Cy}Om()Oq@{?w67;7p~lV{yQ%s;65y0|1jgu<-arjm;Z^}FJJCIamnKo z{m1Y8e0(5%{(EU?pqr-c;V3@ZzQ^g;`vZmS+Y~DHF+cXGdUMV5AsVwxcl zyYoX`zk@$pzvt>oQmSJy7yWB z+yTe6_r;$%Ono2Us42vnKb+klFF(7_dv5K%d_?*4{KvkrP)I(7+R?9y{~_st>2 z&C2kyqwRARyq>4KSFhK5DLBM#Y){T%Qu4~$sXM!2|GlOQrRS%`O+Qwfa%*;j$vfHE z4aIZzvhIB3?6+slU2=-j;i_rDr=ID)c>Ug@`=`=Dii>|t}p`loMRgW?mKe%{s z#2ffv2`O6m!~eJ+(GwQGi(>${8hvLsNIgElRPmi@LiICY1&F$=ox1N2ROdO`{Z@Oh z_^t)G-OjR))8bgK@C2@JIrrD6^0z^=+#crrd|Ed)Uo8D93(>o3<5SrR?>!7b2j}&! ztDdGiyFr!*)DW*=uTugmd=F{Q-~8n3uw7yM!X{hk*zo(HHXcWfa6u35V)|PQLoT=t z8GG1zL)a}y&7`__i}dybpl}3rByKcIK7JtvEmEJd%t<~icZR!`8`_r2vS8dg$=8AJ zn1*Ji{cJPFTHyk&?Fz|vp#C#sJYK+U)aL8pIUm+A&-ux*0;$2Ek!df%a))KkIo1Ge z+k}6KA7;G!K8b(hbEX}t&*Pb!tqy@3lrl96>JKEM^%`auvCcW9+o9L!_&_$o>h?Te zhfLLK17034`;VLjJ$Z~r7UVq=bMfBErq<`gtI>er?elF{r5}GtX9b%9GBdCk20AevP zFfc)B6zV?%1H&jD4TI4%Fq#HN)4*sNpgavQ(z8BcB;CEE?!yQ(MzYgA8R1WcU37IH z8R>(3_mPoT2D|%E;+H<@gZwru8SWz^{K(~EZaKsU@=>}K&r%BwC5&pRR zM-%tq2us@7Mce!Zi+^143zNr1)5g!#&wq4HA9PK>WTX!y_u-0HV#S9_{L{{zWQ6}9 zDnAIvGye7g)^J5iUs&a__@DgzNk;gS;XY#hK^1j$bRXgP$KSpttNlku{|$ckQNOOk zmIiUNl-10{6?%k1_u1`ODKJi)xILb&9qAYSi^~o z@JDwaayr3k2N_{Ni8<)*gPBDreqr*s+6ORmaMSq9AFTSQ5dK)rrB;{|;Xd^E#})oG zbte)2B^19fd0aHT-46~|21uDpirujA2kR%P4aa~ow?UMCsQX}Qk=+RsL#JWx1F1!p z1My)PSscN}-~NEFRpmSD~>e3iefIF^oHy|V)bBChwwKeO1xlGi%kq!Ke23N zb1?Pb4}Xw)4E<>71FITn8pY5H6$j}d1{12EvBon}{1R#(AiIwqY-B%^V;@*QmhcCQ z;|N=1d+@2lB}a^Y6g5chLlMW}K3w*K#F6!5V-t#Btmy-3ewtAF!e-}Jr1A%=Jf3m{ z^HdFtR$Z7&Lz(i=(r_>Y(`* zSq_&tZZ(MZGckHW<`An6q?S&M_Y{QKZ1V4 zQ+I&eiL9SkHb@@~BkO^Pp}G$uMtc0i^nqwhJ0RawjfvWc|3*;1WmH3u0qa2Ma%t zJTfLWp2=_jA=NuL@;fa)p0kR*4af!p^K{PHk$l}DZLFQp#r2K^|Uh#^P(f)&lKZaW{@+0na4bn@jzme5} z^uaK)II(P)UJ#9}2gJu!|6!_w_zNr!O}`NR5OHKSSPe8y!^A=1hb&Gk8<+cF=HiWK zaQhGc{24v;SxvIPfYs{*&Gm? z0f(QE&Bewh9RD;}|3_k;2f3Tr^Z`;!F-9sMDK-nuub{YsVN%V8=>yTE>ctg)#Ku3a z_5opcAlfg4)k4ccGQuC1|A@8|EuQe|Bg1_#^FVP2!!R-YG$Q<9`am>(J2D>rm^>~T=KjIz zzv1sbGRilkw1g{O@ron04`AU-JDM{8(av44@|HgCqgDRG8_z_v1F(iKUCT!@!k-NH zVf80cKEf?OxZOv2{L{yOv`YV2zVq2**GEaX_-h|H$wk zUCR%;x{r+XNJaM%8~?c42Nb1qT=hE{{-cRIsOUcO(=Qq61DCt8h{NI^SNy`{anZ1F zAFTcx5ciRhe(4&1NbbWGuXx4j+Ww<$`iG?t@@X>KA4uU(ti9x?5B%=K8qY}ai&Y-n zE`+oTu)2Q``Hx!e!)gwe@)T1Y{_w|C|Mfp;{V-N>Job^BJ_yAxA^E}I{v)IOplkXi z!+m(t0j_j|D}4}(Uzj|u_5m*YC=wrr;ZJ^ekWqe+kUj{-FH9a64f7YS^aYb2Xqv9> zBP0EiA3l_&4_xtzR~)H*K&-pT4}Z%1N38qES2x(*hrfQo8qY}ai&cKK{YS#tLu8~6 zGRhBf^B1A@orL3`4F8c(Kf&@Px&DLcCy6E_{7EvO4F6MVKCbX16u&U}!QTF(G<*iH ze%j_QLh%ce$3?@!4OjYt$y1dkBY%#%4|_WRSG?jCM`|As8?WStKW)=LvF^vMjtuwF zHT~juAKrKdxAVxD|D~({u%~O>@kQSF8ea3LU7yo2{05}`M@RpSj!#1J2d?s$aQ=sk z^AGm+A1?pVHQ!RZ8~~e#zx<}uf5gT=E_E>b2YdL_)qO*#e8Uy5c*RHCe@Np$WaLjW z(g!S`QJcmZ&q(o$RUX_fgwzXI-9v`|$j_f-gg>}kh182!-9OOsWP~5N{vZ^;gyaW* z`-+V8K}PtKpMJ?mhg5VQq4A~2**F9osUZ$S@kEe;ee!$uH^?A;ZMH%$VeYZ;X-V_!R0<&@ro`! z*xP@&{6{!^@RyH-^%EC=)yehK8W=PraJnh5Awqgzx#-dXI$zq!-Kr}Ra*IvTJFPY4pH?m{_w|YE>ix) zDo>QX#MK)^W&W4e;XtYR7iQ2YdQOav!dEC03l+a2xFDgIIrHs-tcGgxN=a_~CaS zvGI&c9n5_wG*bFP5yw+5(aL{V?I**1Sk1xXAB1}R;g3*<)D9rSedLDUfVBUJ3OA(i z_zJoI5NlWwG>eSzCuk5&nZceIU6HSG?jCM_M07Y`oGn{7Fdv#JV51 zy1|}4u#{g&;e$7xk=FU)QinBMkkS`cc_jN`^20ZM;17S8|50c%!Vg71mhiMCr7x`VR4qR#OaHWY-{3AkVDU&UO;-DljPyZ%`AwhnLB9LwlRj{{kJxy})jps} z{-JC7AS3*#T7D6-pN#ZNg8N|ck1Kv*^0;VN{NqYrF!_O|>FPc*(l7bpLq_^Qav!dE zC03kRcatCfWcZJS^iQn&ajT<``^XPJ{N)R=@r+9y)^I^eUs&a_#1HxYBP0CDa38V$ zz*I*c_mLZZLuLLKGhFefYlM3Ggg?SQV%#Kto&b)>t8w&fX7 z?iobkkJY_oxR2cQiz{A<6{pwyFV=7(BcIdC9CE{-R_;MJ7nl2pjb~i#19W?+!Y3pB zlW#Bn@{xRVQOh}8;ZH5|$u$QS|G458CXb7T*-Kadk&!;gcOQMy2P_;(r^#?1QuyJD zS7OD9buanhkD8B&wU2)4C<}jL-AR7<;ddY5cpe@9BQ}nxrVc58Qq4>pZKdHq{)a#P zV+~(2!k_&7Nk;ibMfVZT|D)r7SknlO{Dey_`RRj<^h<)Q7?h zi7M*o=sv>n52^ogsUvIrkFMzhfBMH7Uu1+ot@0;U_fawYaK$USIIi{qVfT?yJ`VQq zr>pzO2tN|i2P~d(#V<^rb~OI_g?9GhFV{xx#S=bA`+tcIC%UFDGTcY3KL$!2`Qb-K z{-QMe$k0z$|Btb-(gX|AnY-GL2YLLZ|*~n^;*~n^ev60n7*tq=c=nv61zD1&0A79*9#9QHyE@#GkM< zkL-7d7&bkaV#xL*n~y9GVT0ljHT)prATvR7*f2;vHgQHq25|WVkwdWYn}zJYuXyTC zNLYZ(0@)9tL3$DHMTmjKabZ;TAh%-bgQ$VXLD&#AU*K^J^D9goM8niWXpsHL>M_$U zL>;pE*!&OiH!NL%?15lZeGoB_oy1^-UWgm8=|Q+1IlN)&VKlP6Ffrt?L5P9;kFXbH zCQJ^*hM5ENCxk}zJ4g&!EldxDMl~BE2J#oOIEW9!5OIhbAZ&ylh#HU_HVkqDNE}l= za+-&j2~meXERoFt`4KyYgat$`#B2x~;#T}@-0C6jLpK9iJu(|n#v#Ws%x;)jFd8Hd zW235vmZh`%A?pfm(?E3!VA7>LFt4w8dmgc^{$K<+@tAork)LHNjV z3^NZxgXAIlAZj3Nh?_xj*f2;9GKTmQQr08(kRieV6h_GEv9l5WLzO2+9G4o1A0g%; ztHET0{E6yL?CBq37R+3TIjH`Jg#(C&gaJekL@jOY8o(Zd6~8OY`#vtj0fXk>9>*dRUFFtT23@}M#Td-_LB6UcfI zW}^BRGYk;^N7j$dMwo|NJ+c~PHo95Z_{i#Uv61y5t3ejWWTW~Ylk!gNu!<7g-Iq@*kEK zAT-3SAU(LvK&Sz!!-k2`ON<(9W`o3V=>^HbFtQp18`0(m`4teV$>t60qKEZT;ec!1dZ%hR5m0mAaRS!JW|CG_Cm~s@sZ6zX2az1(Zr}nR)fk$ z_!;6~1Rs;u6`NsP-WIi!6?;9+{1-2APel2ANHa8f5hdHmZMNVF06%{g2Rt z@C!_geEU(u6=ohfjmvye#nH{hHvR{RcUZXq@hh@D$ZSmWsH+~?E@Ifo?!l!VRSjzV z!~71Takc+Z&4BnBSq#L+Wj`h2Aah|DmpL$b5KUMOs{aw`9wttD`b4%9DfLAIY5^~9(_HWL>c*&JjwgxWvI=^xn)WHz#SxY)SV zBa0)mk{DJ}M1yAIMx}GjOp%>R^}{H88axnpE{5 zJur-{7bXUxk;SpIvBf#8?gz=CrX`S>*f6r$*yQnv5u+Db4Kf>_xiC5W>Op?QhavHg zYz8tLW(SBy7Dr}-XF5XVdJs~Sue60qlOsuxXi&Nj%g;ke-V60dVs_mvU$j6 z5W^-$FR~g^*_60}l=P2m53(DP#c{E5sV7Dpml|Zdkk#N~BdbTS5%CSG_aJeOEQY)M z$7K&LafF?yW+JOcR)fsOrG^-BTxuZZBl{JV4G9bU=^vNb$l}Osh@B8Kk=e*27vN$puSq&~WvU+4TF7?RbxYQ$y<7Q*}9pZ0@I5F*iWVhgABioNl z4YD}3)Z;P-ArA2;tlUHPJ46gMo#S#N!aPWNfvH0lCx#8vhfd?ti>?kEA6YM^JgWa8 zeujua!UEzSWHX3iBin=^x|<7)EvrObkRLizBl^axjcb93~H97%vR-61 zvVL6RxYQu42eXmS0vKhFun+*96Jfx>z>t7^PJ{>6KtS3%fSk5Q*^v5jG#rQx2S^(T zx$QDI*|_{OJly}~Km6_k___GVZAkLt1hhX19g`DgDB+KE_8;8cNarEI#qj!tfdAln zk^KGzwBHCaE&{g$o4r`XP~6YJ_#bxGA0jNUy9eDKl)YVWH$wKjp@uU9I8M>U7#Jb$ zX9T$c#)i>QF_0ZFeK7Z7^betN0FwvPaQC2w8CdQs#D5@jA$*7$nEw#skhBQq!^0b* z7o-m?{uLAt5dWcyLHq_1`wG_!u?IE$5#=*XEtviau^Y^W`vqY)!c0^#kb2}W1Gy1| zLE^CR2C+dHqz>d~usqZbkQhV`$^Bm;aS9R#*$Z<&EZuAHAra=!bfr=T<*(% zboW5iLc$1S4~!2}2TCUpF-X{e-3<%~FkBtTe5hKG z7^Yt!@eh(i#&C6Ty-4bi#Nc|MVxYK!iNXAWECz}zm^_GvxfhuR`3EG2tQONfNZ|*y z8zqf_{0+v~;@~T|3`MnrIRAm{0P6#p{RKAGf++W4{(!3isYAio>_Ku5idv{2vH1_1 z7+fzlJFtbr7kGUI&Id?&0W-V_m`T7r@bG}EgZd5RW+XAVy&!Qg#^!EBc!AvwE^|Qr zTo8uT0f@ANJaWh*o)mfbbCSh7nWv_X|OwB?!{&g zOb)qjgNq@#2b&m@c_{XP)gt*1%m?`cdl-WBBD)#J9`5-U3 z81}HmW*#;%P*{V*9h7%L7@8O0YC-mcF*bX!$2HvDV14-GAFLMcKO{S_iD5AhHUC2L zF33M%bHVD7%mnj6?m@O#TAmf zG0npsUT}42dO=~0jzMV(t{%xvU@Wwum6$jC%7At%)=`NHxFS4BL5=tE+{S#_8`~ zNO20+iY1%(AH{iB9G zIQ&8OBB_Pz2Z^I&Z0g`*NO6Uv57Rs(cf-{Y5QDd$akw8kwg3(vB=>;%a63TZfZdI7 zb#T4d(g}9GaQ`9cg_{Sr8&~@od;Z0ypExm)AE6kVd*EW&!W+rYaCalbKxqYmv9+I} z_9E#8xfwHjkirq0dyvH7df{dw>4l3S*$dZ;a5t=cLAV_?4T0PU$8i1F?7=36X%9;N zMKX_MJK%aD{=@5jG__#6h!sN$N6hdh)_)K;g6)Nyhm^+P`4^IIKsO=2Gc-qe}x5CmMC{4h{knF)0-f(qryRrKZ zt{1KjTlz$Z!NMCtBgP@{yAdgTu-StohUspE-EcYNJ}6u-Hvb{n3k@%byHWElNDN^% za+?LoZn!;2Vo)8lb~7>?#m(?A!{#1DSRm_x`vsd`Y+~@R!E_@i3^C1v*o*9D7#ozPkllj9hT9E` zA8M6P*v&(+8|+7j7jAa|>qJK->)#$GRwJRFFO)09vO7y2S@{rw{x-ACLg1^`q;w7?A5o zq_PuSM$(24%_H!z$1Iy^V=v4ebo=3T8fcv43#2}SsQrR6&Ib{L%-e(JWMLR4PArYE zA5vx@^kK0N#XacZg0uz#9AA(+4Yz+F`qAx&sRz$5qt(lxIdjlj0Ek~1z~O<+2Z@99 zgJ_t3kUYpwAU;SxL=Lvr0eP$q;(w5Sn0iDz4B}RheuO+D+(OWAi^Ic4{9HQ#1ZyG{EXXv#{ZzUHb@?% z51akS;Q^KhwN;?&kwErA?1iLB5Fex-RSc4zVPYVA5dMeQ4-x}mkQ!wFg2fm>Y7qB} zfW-*dkMKXJjz#DP=>@qDVLt|AX|y+ymAJia&UJ1Csv1;z<5O@F8ttgnmf+ zM&~2cL+nS9M=w86>_<)iU~};LAK_oHT2Ofjb~j8MyZsQgFg3{GPpbbRW+40r;UmmP z4~scVn0fHgZKwwK14ry_#@;Y>JjEa)T7Iz@bQK}BzzF+(Ze6z{}6e+_M@kFEPRB0 zgzSgpKNR&S`418v2zm7IKzA>?eOUCv=XxP_BiBE$@{^GN5$=K5hfoi(55b4H51}67 zew6rUK&(>*+mF}(=;mXwA8&eqxCh;SgnQA=gSZ#n{V04Q;vZo?A^Rcrp{PgCPw4(b zw;x?S3Lj!Vy8lu9gA)D_^(gK^w+{;+uX!lx50d{7<`W8kNcqN}ih78Bgv>*cM+px|d?U<<@KM4aK1K|Y1GN`W%tMbq6!Wq8AI1F;Gg0ivQvV~y zHz4tWn-2*uggm7Egu-V4wfP|GQ2YsQ^MKldXmarJA*eVbvVL^;K-GZFg0fN6L)?R6 zFN!>d{g@*HbQA%NQ%Eo{Fo5=y!N)0tusHw{4!G7>p!gR#Y=~x~n~#eR4RcVRfM~N} zdJz3Aa5)c7$B^`kNbivJipj^W4&C3F`e5ck^dpBKL@h)d(>)MzZ03W+VCq3^7>1Y! zu@7Vqh!3KXOdGGhAk8Br+jqDy&dm!c_ibs&3@F)TiD(~$IuDGw8e(GdHP z%?7bi-2_q#QHK!6#YYzh=>^3HBwj&ggD|GMVESM*L?3Q-sPZ5)kuk!ZsOm7y!zB+B zhtLSKA^8kp4n!W44-<#cFn^)b5P49(K-dAv6R3WG>4T_8l|vT8t`6C35F6oMn0j;? zW+pCiRC$n@$Qa>1bp0?sOg}n}E)U@&n+;+k%qLDirhifO5g+~#_aN+t@zH5?^Kqqr zRCNe<5)wzX58eF;J|w+@!VH4Z`7n3E#BtFubub#H4#tPkFmZGmT^`2Aps_WIs3rz# zhY2t+Fo33r;O#IDtj5FVEFj^A;Z7ptL16&HApIaVh$a>z*D=WP4Pt{ZavFi~(cKD3 zrw};^8>9zx-V@Ah5F6wk2p^GdU}7M>APmw6!yr8%^$>B8ov?I^&=2t|#7>Yp5JuGx zQVY_DT|dZvP&o+F2g4x!$ZQB7q94Qt)iV%#L1GZ|A>tr=AZ`KiL1w^c7#qY#)(`g#_0M%VFXeS!XR}Z8iYY?Y#5{;;%|uiLH>uS2hlJL(hFn5Xowid&oI3p zHm3VQ>TqFn`?0wnSuf0P5DgMX)(;Cmh&X2WBa4IBAPmwE(FbxnvOgevkQ@jjhY^Sm i!XPma4Zd=N&L1Mxu^BnQGEHr6tMXh8r=C?ItJ literal 0 HcmV?d00001 diff --git a/src/audio.c b/src/audio.c new file mode 100644 index 000000000..41ba6fed1 --- /dev/null +++ b/src/audio.c @@ -0,0 +1,306 @@ +/********************************************************************************************* +* +* raylib.audio +* +* Basic functions to manage Audio: InitAudioDevice, LoadAudioFiles, PlayAudioFiles +* +* Uses external lib: +* OpenAL - Audio device management lib +* TODO: stb_vorbis - Ogg audio files loading +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "raylib.h" + +#include // OpenAL basic header +#include // OpenAL context header (like OpenGL, OpenAL requires a context to work) + +#include // To use exit() function +#include // Used for .WAV loading + +//#include "stb_vorbis.h" // TODO: OGG loading functions + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Nop... + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- + +// Wave file data +typedef struct Wave { + unsigned char *data; // Buffer data pointer + unsigned int sampleRate; + unsigned int dataSize; + short channels; + short format; +} Wave; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +// Nop... + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +static Wave LoadWAV(char *fileName); +static void UnloadWAV(Wave wave); +//static Ogg LoadOGG(char *fileName); + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Window and OpenGL Context Functions +//---------------------------------------------------------------------------------- + +// Initialize audio device and context +void InitAudioDevice() +{ + // Open and initialize a device with default settings + ALCdevice *device = alcOpenDevice(NULL); + + if(!device) + { + fprintf(stderr, "Could not open a device!\n"); + exit(1); + } + + ALCcontext *context = alcCreateContext(device, NULL); + + if(context == NULL || alcMakeContextCurrent(context) == ALC_FALSE) + { + if(context != NULL) alcDestroyContext(context); + + alcCloseDevice(device); + + fprintf(stderr, "Could not set a context!\n"); + exit(1); + } + + printf("Opened \"%s\"\n", alcGetString(device, ALC_DEVICE_SPECIFIER)); + + // Listener definition (just for 2D) + alListener3f(AL_POSITION, 0, 0, 0); + alListener3f(AL_VELOCITY, 0, 0, 0); + alListener3f(AL_ORIENTATION, 0, 0, -1); +} + +// Close the audio device for the current context, and destroys the context +void CloseAudioDevice() +{ + ALCdevice *device; + ALCcontext *context = alcGetCurrentContext(); + + if (context == NULL) return; + + device = alcGetContextsDevice(context); + + alcMakeContextCurrent(NULL); + alcDestroyContext(context); + alcCloseDevice(device); +} + +// Load sound to memory +Sound LoadSound(char *fileName) +{ + Sound sound; + + // NOTE: The entire file is loaded to memory to play it all at once (no-streaming) + + // WAV file loading + // NOTE: Buffer space is allocated inside LoadWAV, Wave must be freed + Wave wave = LoadWAV(fileName); + + ALenum format; + // The OpenAL format is worked out by looking at the number of channels and the bits per sample + if (wave.channels == 1) + { + if (wave.sampleRate == 8 ) format = AL_FORMAT_MONO8; + else if (wave.sampleRate == 16) format = AL_FORMAT_MONO16; + } + else if (wave.channels == 2) + { + if (wave.sampleRate == 8 ) format = AL_FORMAT_STEREO8; + else if (wave.sampleRate == 16) format = AL_FORMAT_STEREO16; + } + + // Create an audio source + ALuint source; + alGenSources(1, &source); // Generate pointer to audio source + + alSourcef(source, AL_PITCH, 1); + alSourcef(source, AL_GAIN, 1); + alSource3f(source, AL_POSITION, 0, 0, 0); + alSource3f(source, AL_VELOCITY, 0, 0, 0); + alSourcei(source, AL_LOOPING, AL_FALSE); + + // Convert loaded data to OpenAL buffer + //---------------------------------------- + ALuint buffer; + alGenBuffers(1, &buffer); // Generate pointer to buffer + + // Upload sound data to buffer + alBufferData(buffer, format, wave.data, wave.dataSize, wave.sampleRate); + + // Attach sound buffer to source + alSourcei(source, AL_BUFFER, buffer); + + // Unallocate WAV data + UnloadWAV(wave); + + printf("Sample rate: %i\n", wave.sampleRate); + printf("Channels: %i\n", wave.channels); + printf("Format: %i\n", wave.format); + + printf("Audio file loaded...!\n"); + + sound.source = source; + sound.buffer = buffer; + + return sound; +} + +// Unload sound +void UnloadSound(Sound sound) +{ + alDeleteSources(1, &sound.source); + alDeleteBuffers(1, &sound.buffer); +} + +// Play a sound +void PlaySound(Sound sound) +{ + alSourcePlay(sound.source); // Play the sound + + printf("Playing sound!\n"); + + // Find the current position of the sound being played + // NOTE: Only work when the entire file is in a single buffer + //int byteOffset; + //alGetSourcei(sound.source, AL_BYTE_OFFSET, &byteOffset); + //float seconds = (float)byteOffset / sampleRate; // Number of seconds since the beginning of the sound +} + +// Play a sound with extended options +void PlaySoundEx(Sound sound, float timePosition, bool loop) +{ + // TODO: Review + + // Change the current position (e.g. skip some part of the sound) + // NOTE: Only work when the entire file is in a single buffer + //alSourcei(sound.source, AL_BYTE_OFFSET, int(position * sampleRate)); + + alSourcePlay(sound.source); // Play the sound + + if (loop) alSourcei(sound.source, AL_LOOPING, AL_TRUE); + else alSourcei(sound.source, AL_LOOPING, AL_FALSE); +} + +// Pause a sound +void PauseSound(Sound sound) +{ + alSourcePause(sound.source); +} + +// Stop reproducing a sound +void StopSound(Sound sound) +{ + alSourceStop(sound.source); +} + +// Load WAV file into Wave structure +static Wave LoadWAV(char *fileName) +{ + Wave wave; + FILE *wavFile; + + wavFile = fopen(fileName, "rb"); + + if (!wavFile) + { + printf("Could not load WAV file.\n"); + exit(1); + } + + unsigned char id[4]; // Four bytes to hold 'RIFF' and 'WAVE' (and other ids) + + unsigned int size = 0; // File size (useless) + + short format; + short channels; + short blockAlign; + short bitsPerSample; + + unsigned int formatLength; + unsigned int sampleRate; + unsigned int avgBytesSec; + unsigned int dataSize; + + fread(id, sizeof(unsigned char), 4, wavFile); // Read the first four bytes + + if ((id[0] != 'R') || (id[1] != 'I') || (id[2] != 'F') || (id[3] != 'F')) + { + printf("Invalid RIFF file.\n"); // If not "RIFF" id, exit + exit(1); + } + + fread(&size, sizeof(unsigned int), 1, wavFile); // Read file size + fread(id, sizeof(unsigned char), 4, wavFile); // Read the next id + + if ((id[0] != 'W') || (id[1] != 'A') || (id[2] != 'V') || (id[3] != 'E')) + { + printf("Invalid WAVE file.\n"); // If not "WAVE" id, exit + exit(1); + } + + fread(id, sizeof(unsigned char), 4, wavFile); // Read 4 bytes id "fmt " + fread(&formatLength, sizeof(unsigned int),1,wavFile); // Read format lenght + fread(&format, sizeof(short), 1, wavFile); // Read format tag + fread(&channels, sizeof(short), 1, wavFile); // Read num channels (1 mono, 2 stereo) + fread(&sampleRate, sizeof(unsigned int), 1, wavFile); // Read sample rate (44100, 22050, etc...) + fread(&avgBytesSec, sizeof(short), 1, wavFile); // Read average bytes per second (probably won't need this) + fread(&blockAlign, sizeof(short), 1, wavFile); // Read block alignment (probably won't need this) + fread(&bitsPerSample, sizeof(short), 1, wavFile); // Read bits per sample (8 bit or 16 bit) + + fread(id, sizeof(unsigned char), 4, wavFile); // Read 4 bytes id "data" + fread(&dataSize, sizeof(unsigned int), 1, wavFile); // Read data size (in bytes) + + wave.sampleRate = sampleRate; + wave.dataSize = dataSize; + wave.channels = channels; + wave.format = format; + + wave.data = (unsigned char *)malloc(sizeof(unsigned char) * dataSize); // Allocate the required bytes to store data + + fread(wave.data, sizeof(unsigned char), dataSize, wavFile); // Read the whole sound data chunk + + return wave; +} + +// Unload WAV file data +static void UnloadWAV(Wave wave) +{ + free(wave.data); +} + +// TODO: Ogg data loading +//static Ogg LoadOGG(char *fileName) { } + diff --git a/src/core.c b/src/core.c new file mode 100644 index 000000000..c835cb5b3 --- /dev/null +++ b/src/core.c @@ -0,0 +1,582 @@ +/********************************************************************************************* +* +* raylib.core +* +* Basic functions to manage Windows, OpenGL context and Input +* +* Uses external lib: +* GLFW3 - Window, context and Input management (static lib version) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "raylib.h" + +#include // GLFW3 lib: Windows, OpenGL context and Input management +//#include // OpenGL functions (GLFW3 already includes gl.h) +#include // Standard input / output lib +#include // Declares malloc() and free() for memory management +#include // Math related functions, tan() on SetPerspective +#include "vector3.h" // Basic Vector3 functions + +//#define GLFW_DLL // Using GLFW DLL on Windows -> No, we use static version! + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Nop... + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef Color pixel; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static GLFWwindow* window; // Main window +static bool fullscreen; // Fullscreen mode track + +static double currentTime, previousTime; // Used to track timmings +static double updateTime, drawTime; // Time measures for update and draw +static double frameTime; // Time measure for one frame +static double targetTime = 0; // Desired time for one frame, if 0 not applied + +static int windowWidth, windowHeight; // Required to switch between windowed/fullscren mode (F11) +static char *windowTitle; // Required to switch between windowed/fullscren mode (F11) + +//---------------------------------------------------------------------------------- +// Other Modules Functions Declaration (required by core) +//---------------------------------------------------------------------------------- +extern void LoadDefaultFont(); // [Module: text] Loads default font on InitWindow() +extern void UnloadDefaultFont(); // [Module: text] Unloads default font from GPU memory +extern void WriteBitmap(const char *fileName, const pixel *imgDataPixel, int width, int height); // [Module: textures] Writes a bitmap (BMP) file + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +static void InitGraphicsDevice(); // Initialize Graphics Device (OpenGL stuff) +static void ErrorCallback(int error, const char *description); // GLFW3 Error Callback, runs on GLFW3 error +static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); // GLFW3 Keyboard Callback, runs on key pressed +static void WindowSizeCallback(GLFWwindow* window, int width, int height); // GLFW3 WindowSize Callback, runs when window is resized +static void CameraLookAt(Vector3 position, Vector3 target, Vector3 up); // Setup camera view (updates MODELVIEW matrix) +static void SetPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); // Setup view projection (updates PROJECTION matrix) +static void TakeScreenshot(); // Takes a bitmap (BMP) screenshot and saves it in the same folder as executable + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Window and OpenGL Context Functions +//---------------------------------------------------------------------------------- + +// Initialize Window and Graphics Context (OpenGL) +void InitWindow(int width, int height, char* title) +{ + glfwSetErrorCallback(ErrorCallback); + + if (!glfwInit()) exit(1); + + //glfwWindowHint(GLFW_SAMPLES, 4); // If called before windows creation, enables multisampling x4 (MSAA), default is 0 + + window = glfwCreateWindow(width, height, title, NULL, NULL); + + windowWidth = width; + windowHeight = height; + windowTitle = title; + + if (!window) + { + glfwTerminate(); + exit(1); + } + + glfwSetWindowSizeCallback(window, WindowSizeCallback); + + glfwMakeContextCurrent(window); + glfwSetKeyCallback(window, KeyCallback); + glfwSwapInterval(0); // Disables GPU v-sync (if set), so frames are not limited to screen refresh rate (60Hz -> 60 FPS) + // If not set, swap interval uses GPU v-sync configuration + // Framerate can be setup using SetTargetFPS() + InitGraphicsDevice(); + + previousTime = glfwGetTime(); + + LoadDefaultFont(); +} + +// Close Window and Terminate Context +void CloseWindow() +{ + UnloadDefaultFont(); + + glfwDestroyWindow(window); + glfwTerminate(); +} + +// Detect if KEY_ESCAPE pressed or Close icon pressed +bool WindowShouldClose() +{ + return (glfwWindowShouldClose(window)); +} + +// Fullscreen toggle (by default F11) +void ToggleFullscreen() +{ + if (glfwGetKey(window, GLFW_KEY_F11)) + { + fullscreen = !fullscreen; // Toggle fullscreen flag + + glfwDestroyWindow(window); // Destroy the current window (we will recreate it!) + + // NOTE: Window aspect ratio is always windowWidth / windowHeight + if (fullscreen) window = glfwCreateWindow(windowWidth, windowHeight, windowTitle, glfwGetPrimaryMonitor(), NULL); // Fullscreen mode + else window = glfwCreateWindow(windowWidth, windowHeight, windowTitle, NULL, NULL); + + if (!window) + { + glfwTerminate(); + exit(1); + } + + glfwMakeContextCurrent(window); + glfwSetKeyCallback(window, KeyCallback); + + InitGraphicsDevice(); + } +} + +// Sets Background Color +void ClearBackground(Color color) +{ + // Color values clamp to 0.0f(0) and 1.0f(255) + float r = (float)color.r / 255; + float g = (float)color.g / 255; + float b = (float)color.b / 255; + float a = (float)color.a / 255; + + glClearColor(r, g, b, a); +} + +// Setup drawing canvas to start drawing +void BeginDrawing() +{ + currentTime = glfwGetTime(); // glfwGetTime() returns a 'double' containing the number of elapsed seconds since glfwInit() was called + updateTime = currentTime - previousTime; + previousTime = currentTime; + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear used buffers, Depth Buffer is used for 3D + + glLoadIdentity(); // Reset current matrix (MODELVIEW) + + glTranslatef(0.375, 0.375, 0); // HACK to have 2D pixel-perfect drawing on OpenGL +} + +// End canvas drawing and Swap Buffers (Double Buffering) +void EndDrawing() +{ + glfwSwapBuffers(window); // Swap back and front buffers + glfwPollEvents(); // Register keyboard/mouse events + + currentTime = glfwGetTime(); + drawTime = currentTime - previousTime; + previousTime = currentTime; + + frameTime = updateTime + drawTime; + + double extraTime = 0; + + while (frameTime < targetTime) + { + // Implement a delay + currentTime = glfwGetTime(); + extraTime = currentTime - previousTime; + previousTime = currentTime; + frameTime += extraTime; + } +} + +// Initializes 3D mode for drawing (Camera setup) +void Begin3dMode(Camera camera) +{ + //glEnable(GL_LIGHTING); // TODO: Setup proper lighting system (raylib 1.x) + + glMatrixMode(GL_PROJECTION); // Switch to projection matrix + + glPushMatrix(); // Save previous matrix, which contains the settings for the 2d ortho projection + glLoadIdentity(); // Reset current matrix (PROJECTION) + + SetPerspective(45.0f, (GLfloat)windowWidth/(GLfloat)windowHeight, 0.1f, 100.0f); // Setup perspective projection + + glMatrixMode(GL_MODELVIEW); // Switch back to modelview matrix + glLoadIdentity(); // Reset current matrix (MODELVIEW) + + CameraLookAt(camera.position, camera.target, camera.up); // Setup Camera view +} + +// Ends 3D mode and returns to default 2D orthographic mode +void End3dMode() +{ + glMatrixMode(GL_PROJECTION); // Switch to projection matrix + glPopMatrix(); // Restore previous matrix (PROJECTION) from matrix stack + + glMatrixMode(GL_MODELVIEW); // Get back to modelview matrix + glLoadIdentity(); // Reset current matrix (MODELVIEW) + + glTranslatef(0.375, 0.375, 0); // HACK to ensure pixel-perfect drawing on OpenGL (after exiting 3D mode) + + //glDisable(GL_LIGHTING); // TODO: Setup proper lighting system (raylib 1.x) +} + +// Set target FPS for the game +void SetTargetFPS(int fps) +{ + targetTime = 1 / (float)fps; + + printf("TargetTime per Frame: %f seconds\n", (float)targetTime); +} + +// Returns current FPS +float GetFPS() +{ + return (1/(float)frameTime); +} + +// Returns time in seconds for one frame +float GetFrameTime() +{ + // As we are operating quite a lot with frameTime, it could be no stable + // so we round it before before passing around to be used + // NOTE: There are still problems with high framerates (>500fps) + double roundedFrameTime = round(frameTime*10000) / 10000; + + return (float)roundedFrameTime; // Time in seconds to run a frame +} + +// Returns a Color struct from hexadecimal value +Color GetColor(int hexValue) +{ + Color color; + + color.r = (unsigned char)(hexValue >> 24) & 0xFF; + color.g = (unsigned char)(hexValue >> 16) & 0xFF; + color.b = (unsigned char)(hexValue >> 8) & 0xFF; + color.a = (unsigned char)hexValue & 0xFF; + + return color; +} + +// Returns hexadecimal value for a Color +int GetHexValue(Color color) +{ + return ((color.a << 24) + (color.r << 16) + (color.g << 8) + color.b); +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Input (Keyboard, Mouse, Gamepad) Functions +//---------------------------------------------------------------------------------- + +// Detect if a key is being pressed (key held down) +bool IsKeyPressed(int key) +{ + if (glfwGetKey(window, key) == GLFW_PRESS) return true; + else return false; +} + +// Detect if a key is NOT being pressed (key not held down) +bool IsKeyReleased(int key) +{ + if (glfwGetKey(window, key) == GLFW_RELEASE) return true; + else return false; +} + +// Detect if a mouse button is being pressed +bool IsMouseButtonPressed(int button) +{ + if (glfwGetMouseButton(window, button) == GLFW_PRESS) return true; + else return false; +} + +// Detect if a mouse button is NOT being pressed +bool IsMouseButtonReleased(int button) +{ + if (glfwGetMouseButton(window, button) == GLFW_RELEASE) return true; + else return false; +} + +// Returns mouse position X +int GetMouseX() +{ + double mouseX; + double mouseY; + + glfwGetCursorPos(window, &mouseX, &mouseY); + + return (int)mouseX; +} + +// Returns mouse position Y +int GetMouseY() +{ + double mouseX; + double mouseY; + + glfwGetCursorPos(window, &mouseX, &mouseY); + + return (int)mouseY; +} + +// Returns mouse position XY +Vector2 GetMousePosition() +{ + double mouseX; + double mouseY; + + glfwGetCursorPos(window, &mouseX, &mouseY); + + Vector2 position = { (float)mouseX, (float)mouseY }; + + return position; +} + +// Detect if a gamepad is available +bool IsGamepadAvailable(int gamepad) +{ + int result = glfwJoystickPresent(gamepad); + + if (result == 1) return true; + else return false; +} + +// Return axis movement vector for a gamepad +Vector2 GetGamepadMovement(int gamepad) +{ + Vector2 vec = { 0, 0 }; + + const float *axes; + int axisCount; + + axes = glfwGetJoystickAxes(gamepad, &axisCount); + + if (axisCount >= 2) + { + vec.x = axes[0]; // Left joystick X + vec.y = axes[1]; // Left joystick Y + + //vec.x = axes[2]; // Right joystick X + //vec.x = axes[3]; // Right joystick Y + } + + return vec; +} + +// Detect if a gamepad button is being pressed +bool IsGamepadButtonPressed(int gamepad, int button) +{ + const unsigned char* buttons; + int buttonsCount; + + buttons = glfwGetJoystickButtons(gamepad, &buttonsCount); + + if (buttons[button] == GLFW_PRESS) + { + return true; + } + else return false; +} + +// Detect if a gamepad button is NOT being pressed +bool IsGamepadButtonReleased(int gamepad, int button) +{ + const unsigned char* buttons; + int buttonsCount; + + buttons = glfwGetJoystickButtons(gamepad, &buttonsCount); + + if (buttons[button] == GLFW_RELEASE) + { + return true; + } + else return false; +} + +//---------------------------------------------------------------------------------- +// Module specific Functions Definition +//---------------------------------------------------------------------------------- + +// GLFW3 Error Callback, runs on GLFW3 error +static void ErrorCallback(int error, const char *description) +{ + printf(description); + //fprintf(stderr, description); +} + +// GLFW3 Keyboard Callback, runs on key pressed +static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) +{ + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + { + glfwSetWindowShouldClose(window, GL_TRUE); + + // NOTE: Before closing window, while loop must be left! + } + else if (key == GLFW_KEY_F11 && action == GLFW_PRESS) + { + ToggleFullscreen(); + } + else if (key == GLFW_KEY_F12 && action == GLFW_PRESS) + { + TakeScreenshot(); + } +} + +// GLFW3 WindowSize Callback, runs when window is resized +static void WindowSizeCallback(GLFWwindow* window, int width, int height) +{ + InitGraphicsDevice(); // If window is resized, graphics device is re-initialized + // NOTE: Aspect ratio does not change, so, image can be deformed +} + +// Initialize Graphics Device (OpenGL stuff) +static void InitGraphicsDevice() +{ + int fbWidth, fbHeight; + + glfwGetFramebufferSize(window, &fbWidth, &fbHeight); // Get framebuffer size of current window + + glViewport(0, 0, fbWidth, fbHeight); // Set viewport width and height + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear used buffers, depth buffer is used for 3D + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Set background color (black) + glClearDepth(1.0f); // Clear depth buffer + + glEnable(GL_DEPTH_TEST); // Enables depth testing (required for 3D) + glDepthFunc(GL_LEQUAL); // Type of depth testing to apply + + glEnable(GL_BLEND); // Enable color blending (required to work with transparencies) + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Color blending function (how colors are mixed) + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Improve quality of color and texture coordinate interpolation (Deprecated in OGL 3.0) + // Other options: GL_FASTEST, GL_DONT_CARE (default) + + glMatrixMode(GL_PROJECTION); // Switch to PROJECTION matrix + glLoadIdentity(); // Reset current matrix (PROJECTION) + glOrtho(0, fbWidth, fbHeight, 0, 0, 1); // Config orthographic mode: top-left corner --> (0,0) + glMatrixMode(GL_MODELVIEW); // Switch back to MODELVIEW matrix + glLoadIdentity(); // Reset current matrix (MODELVIEW) + + glDisable(GL_LIGHTING); // Lighting Disabled... + + // TODO: Create an efficient Lighting System with proper functions (raylib 1.x) +/* + glEnable(GL_COLOR_MATERIAL); // Enable materials, causes some glMaterial atributes to track the current color (glColor)... + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // Material types and where to apply them + // NOTE: ONLY works with lighting; defines how light interacts with material + + glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient); // Define ambient light color property + glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse); // Define diffuse light color property + glLightfv(GL_LIGHT1, GL_POSITION, lightPosition); // Define light position + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT1); // Enable light one (8 lights available at the same time) +*/ + // TODO: Review all shapes/models are drawn CCW and enable backface culling + + //glEnable(GL_CULL_FACE); // Enable backface culling (Disabled by default) + //glCullFace(GL_BACK); // Cull the Back face (default) + //glFrontFace(GL_CCW); // Front face are defined counter clockwise (default) + + glShadeModel(GL_SMOOTH); // Smooth shading between vertex (vertex colors interpolation) + // Possible options: GL_SMOOTH (Color interpolation) or GL_FLAT (no interpolation) +} + +// Setup camera view (updates MODELVIEW matrix) +static void CameraLookAt(Vector3 position, Vector3 target, Vector3 up) +{ + float rotMatrix[16]; // Matrix to store camera rotation + + Vector3 rotX, rotY, rotZ; // Vectors to calculate camera rotations X, Y, Z (Euler) + + // Construct rotation matrix from vectors + rotZ = VectorSubtract(position, target); + VectorNormalize(&rotZ); + rotY = up; // Y rotation vector + rotX = VectorCrossProduct(rotY, rotZ); // X rotation vector = Y cross Z + rotY = VectorCrossProduct(rotZ, rotX); // Recompute Y rotation = Z cross X + VectorNormalize(&rotX); // X rotation vector normalization + VectorNormalize(&rotY); // Y rotation vector normalization + + rotMatrix[0] = rotX.x; + rotMatrix[1] = rotY.x; + rotMatrix[2] = rotZ.x; + rotMatrix[3] = 0.0f; + rotMatrix[4] = rotX.y; + rotMatrix[5] = rotY.y; + rotMatrix[6] = rotZ.y; + rotMatrix[7] = 0.0f; + rotMatrix[8] = rotX.z; + rotMatrix[9] = rotY.z; + rotMatrix[10] = rotZ.z; + rotMatrix[11] = 0.0f; + rotMatrix[12] = 0.0f; + rotMatrix[13] = 0.0f; + rotMatrix[14] = 0.0f; + rotMatrix[15] = 1.0f; + + glMultMatrixf(rotMatrix); // Multiply MODELVIEW matrix by rotation matrix + + glTranslatef(-position.x, -position.y, -position.z); // Translate eye to position +} + +// Setup view projection (updates PROJECTION matrix) +static void SetPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) +{ + double xmin, xmax, ymin, ymax; + + ymax = zNear * tan(fovy * PI / 360.0); + ymin = -ymax; + xmin = ymin * aspect; + xmax = ymax * aspect; + + glFrustum(xmin, xmax, ymin, ymax, zNear, zFar); +} + +// Takes a bitmap (BMP) screenshot and saves it in the same folder as executable +static void TakeScreenshot() +{ + static int shotNum = 0; // Screenshot number, increments every screenshot take during program execution + + char buffer[20]; // Buffer to store file name + int fbWidth, fbHeight; + + Color *imgDataPixel; // Pixel image data array + + glfwGetFramebufferSize(window, &fbWidth, &fbHeight); // Get framebuffer size of current window + + imgDataPixel = (Color *)malloc(fbWidth * fbHeight * sizeof(Color)); + + // NOTE: glReadPixels returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer + glReadPixels(0, 0, fbWidth, fbHeight, GL_RGBA, GL_UNSIGNED_BYTE, imgDataPixel); + + sprintf(buffer, "screenshot%03i.bmp", shotNum); + + // NOTE: BMP directly stores data flipped vertically + WriteBitmap(buffer, imgDataPixel, fbWidth, fbHeight); // Writes pixel data array into a bitmap (BMP) file + + free(imgDataPixel); + + shotNum++; +} \ No newline at end of file diff --git a/src/models.c b/src/models.c new file mode 100644 index 000000000..af5012ebf --- /dev/null +++ b/src/models.c @@ -0,0 +1,819 @@ +/********************************************************************************************* +* +* raylib.models +* +* Basic functions to draw 3d shapes and load/draw 3d models (.OBJ) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "raylib.h" + +#include // OpenGL functions +#include // Standard input/output functions, used to read model files data +#include // Declares malloc() and free() for memory management +#include // Used for sin, cos, tan +#include "vector3.h" // Basic Vector3 functions + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Nop... + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +// ... + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +// It's lonely here... + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +// No private (static) functions in this module + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- + +// Draw cube +// NOTE: Cube position is de center position +void DrawCube(Vector3 position, float width, float height, float lenght, Color color) +{ + glPushMatrix(); + glTranslatef(position.x, position.y, position.z); + //glRotatef(rotation, 0.0f, 1.0f, 0.0f); + //glScalef(1.0f, 1.0f, 1.0f); + + glBegin(GL_QUADS); + glColor4ub(color.r, color.g, color.b, color.a); + + // Front Face + glNormal3f(0.0f, 0.0f, 1.0f); // Normal Pointing Towards Viewer + glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2, -height/2, lenght/2); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2, -height/2, lenght/2); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2, height/2, lenght/2); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2, height/2, lenght/2); // Top Left Of The Texture and Quad + // Back Face + glNormal3f( 0.0f, 0.0f,-1.0f); // Normal Pointing Away From Viewer + glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2, -height/2, -lenght/2); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2, height/2, -lenght/2); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2, height/2, -lenght/2); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2, -height/2, -lenght/2); // Bottom Left Of The Texture and Quad + // Top Face + glNormal3f( 0.0f, 1.0f, 0.0f); // Normal Pointing Up + glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2, height/2, -lenght/2); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2, height/2, lenght/2); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2, height/2, lenght/2); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2, height/2, -lenght/2); // Top Right Of The Texture and Quad + // Bottom Face + glNormal3f( 0.0f,-1.0f, 0.0f); // Normal Pointing Down + glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2, -height/2, -lenght/2); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2, -height/2, -lenght/2); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2, -height/2, lenght/2); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2, -height/2, lenght/2); // Bottom Right Of The Texture and Quad + // Right face + glNormal3f( 1.0f, 0.0f, 0.0f); // Normal Pointing Right + glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2, -height/2, -lenght/2); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2, height/2, -lenght/2); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2, height/2, lenght/2); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2, -height/2, lenght/2); // Bottom Left Of The Texture and Quad + // Left Face + glNormal3f(-1.0f, 0.0f, 0.0f); // Normal Pointing Left + glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2, -height/2, -lenght/2); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2, -height/2, lenght/2); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2, height/2, lenght/2); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2, height/2, -lenght/2); // Top Left Of The Texture and Quad + glEnd(); + glPopMatrix(); +} + +// Draw cube (Vector version) +void DrawCubeV(Vector3 position, Vector3 size, Color color) +{ + DrawCube(position, size.x, size.y, size.z, color); +} + +// Draw cube wires +void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color) +{ + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + DrawCube(position, width, height, lenght, color); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} + +// Draw sphere +void DrawSphere(Vector3 centerPos, float radius, Color color) +{ + DrawSphereEx(centerPos, radius, 16, 16, color); +} + +// Draw sphere with extended parameters +void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color) +{ + float lat0, z0, zr0; + float lat1, z1, zr1; + float lng, x, y; + + glPushMatrix(); + glTranslatef(centerPos.x, centerPos.y, centerPos.z); + glRotatef(90, 1, 0, 0); + glScalef(radius, radius, radius); + + glBegin(GL_QUAD_STRIP); + + glColor4ub(color.r, color.g, color.b, color.a); + + for(int i = 0; i <= rings; i++) + { + lat0 = PI * (-0.5 + (float)(i - 1) / rings); + z0 = sin(lat0); + zr0 = cos(lat0); + + lat1 = PI * (-0.5 + (float)i / rings); + z1 = sin(lat1); + zr1 = cos(lat1); + + for(int j = 0; j <= slices; j++) + { + lng = 2 * PI * (float)(j - 1) / slices; + x = cos(lng); + y = sin(lng); + + glNormal3f(x * zr0, y * zr0, z0); + glVertex3f(x * zr0, y * zr0, z0); + + glNormal3f(x * zr1, y * zr1, z1); + glVertex3f(x * zr1, y * zr1, z1); + } + } + glEnd(); + glPopMatrix(); +} + +// Draw sphere wires +void DrawSphereWires(Vector3 centerPos, float radius, Color color) +{ + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + DrawSphere(centerPos, radius, color); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} + +// Draw a cylinder/cone +void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color) // Could be used for pyramid and cone! +{ + static int count = 0; + + Vector3 a = { position.x, position.y + height, position.z }; + Vector3 d = { 0.0f, 1.0f, 0.0f }; + Vector3 p; + Vector3 c = { a.x + (-d.x * height), a.y + (-d.y * height), a.z + (-d.z * height) }; //= a + (-d * h); + Vector3 e0 = VectorPerpendicular(d); + Vector3 e1 = VectorCrossProduct(e0, d); + float angInc = 360.0 / slices * DEG2RAD; + + if (radiusTop == 0) // Draw pyramid or cone + { + //void drawCone(const Vector3 &d, const Vector3 &a, const float h, const float rd, const int n) + //d – axis defined as a normalized vector from base to apex + //a – position of apex (top point) + //h – height + //rd – radius of directrix + //n – number of radial "slices" + + glPushMatrix(); + //glTranslatef(centerPos.x, centerPos.y, centerPos.z); + glRotatef(DEG2RAD*count, 0.0f, 1.0f, 0.0f); + //glScalef(1.0f, 1.0f, 1.0f); + + // Draw cone top + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex3f(a.x, a.y, a.z); + for (int i = 0; i <= slices; i++) + { + float rad = angInc * i; + p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); + p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); + p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); + glVertex3f(p.x, p.y, p.z); + } + glEnd(); + + // Draw cone bottom + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex3f(c.x, c.y, c.z); + for (int i = slices; i >= 0; i--) + { + float rad = angInc * i; + p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); + p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); + p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); + glVertex3f(p.x, p.y, p.z); + } + glEnd(); + + glPopMatrix(); + } + else // Draw cylinder + { + glPushMatrix(); + //glTranslatef(centerPos.x, centerPos.y, centerPos.z); + glRotatef(DEG2RAD*count, 0.0f, 1.0f, 0.0f); + //glScalef(1.0f, 1.0f, 1.0f); + + // Draw cylinder top (pointed cap) + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex3f(c.x, c.y + height, c.z); + for (int i = slices; i >= 0; i--) + { + float rad = angInc * i; + p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusTop); + p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusTop) + height; + p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusTop); + glVertex3f(p.x, p.y, p.z); + } + glEnd(); + + // Draw cylinder sides + glBegin(GL_TRIANGLE_STRIP); + glColor4ub(color.r, color.g, color.b, color.a); + for (int i = slices; i >= 0; i--) + { + float rad = angInc * i; + p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusTop); + p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusTop) + height; + p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusTop); + glVertex3f(p.x, p.y, p.z); + + p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); + p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); + p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); + glVertex3f(p.x, p.y, p.z); + } + glEnd(); + + // Draw cylinder bottom + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex3f(c.x, c.y, c.z); + for (int i = slices; i >= 0; i--) + { + float rad = angInc * i; + p.x = c.x + (((e0.x * cos(rad)) + (e1.x * sin(rad))) * radiusBottom); + p.y = c.y + (((e0.y * cos(rad)) + (e1.y * sin(rad))) * radiusBottom); + p.z = c.z + (((e0.z * cos(rad)) + (e1.z * sin(rad))) * radiusBottom); + glVertex3f(p.x, p.y, p.z); + } + glEnd(); + + glPopMatrix(); + } + + count += 1; +} + +// Draw a cylinder/cone wires +void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color) +{ + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + DrawCylinder(position, radiusTop, radiusBottom, height, slices, color); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} + +// Draw a plane +void DrawPlane(Vector3 centerPos, Vector2 size, Vector3 rotation, Color color) +{ + // NOTE: Plane is always created on XZ ground and then rotated + glPushMatrix(); + glTranslatef(centerPos.x, centerPos.y, centerPos.z); + + // TODO: Review multiples rotations Gimbal-Lock... use matrix or quaternions... + glRotatef(rotation.x, 1, 0, 0); + glRotatef(rotation.y, 0, 1, 0); + glRotatef(rotation.z, 0, 0, 1); + glScalef(size.x, 1.0f, size.y); + + glBegin(GL_QUADS); + glColor4ub(color.r, color.g, color.b, color.a); + glNormal3f(0.0f, 1.0f, 0.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.0f, -0.5f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.0f, -0.5f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.0f, 0.5f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.0f, 0.5f); + glEnd(); + + glPopMatrix(); +} + +// Draw a plane with divisions +void DrawPlaneEx(Vector3 centerPos, Vector2 size, Vector3 rotation, int slicesX, int slicesZ, Color color) +{ + float quadWidth = size.x / slicesX; + float quadLenght = size.y / slicesZ; + + float texPieceW = 1 / size.x; + float texPieceH = 1 / size.y; + + // NOTE: Plane is always created on XZ ground and then rotated + glPushMatrix(); + glTranslatef(-size.x / 2, 0.0f, -size.y / 2); + glTranslatef(centerPos.x, centerPos.y, centerPos.z); + + // TODO: Review multiples rotations Gimbal-Lock... use matrix or quaternions... + glRotatef(rotation.x, 1, 0, 0); + glRotatef(rotation.y, 0, 1, 0); + glRotatef(rotation.z, 0, 0, 1); + + glBegin(GL_QUADS); + glColor4ub(color.r, color.g, color.b, color.a); + glNormal3f(0.0f, 1.0f, 0.0f); + + for (int z = 0; z < slicesZ; z++) + { + for (int x = 0; x < slicesX; x++) + { + // Draw the plane quad by quad (with textcoords) + glTexCoord2f((float)x * texPieceW, (float)z * texPieceH); + glVertex3f((float)x * quadWidth, 0.0f, (float)z * quadLenght); + + glTexCoord2f((float)x * texPieceW + texPieceW, (float)z * texPieceH); + glVertex3f((float)x * quadWidth + quadWidth, 0.0f, (float)z * quadLenght); + + glTexCoord2f((float)x * texPieceW + texPieceW, (float)z * texPieceH + texPieceH); + glVertex3f((float)x * quadWidth + quadWidth, 0.0f, (float)z * quadLenght + quadLenght); + + glTexCoord2f((float)x * texPieceW, (float)z * texPieceH + texPieceH); + glVertex3f((float)x * quadWidth, 0.0f, (float)z * quadLenght + quadLenght); + } + } + glEnd(); + + glPopMatrix(); +} + +// Draw a grid centered at (0, 0, 0) +void DrawGrid(int slices, float spacing) +{ + int halfSlices = slices / 2; + + //glEnable(GL_LINE_SMOOTH); // Smoothies circle outline (anti-aliasing applied) + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Best quality for line smooth (anti-aliasing best algorithm) + + glPushMatrix(); + glScalef(spacing, 1.0f, spacing); + + glBegin(GL_LINES); + for(int i = -halfSlices; i <= halfSlices; i++) + { + if (i == 0) glColor3f(0.5f, 0.5f, 0.5f); + else glColor3f(0.75f, 0.75f, 0.75f); + + glVertex3f((float)i, 0.0f, (float)-halfSlices); + glVertex3f((float)i, 0.0f, (float)halfSlices); + + glVertex3f((float)-halfSlices, 0.0f, (float)i); + glVertex3f((float)halfSlices, 0.0f, (float)i); + } + glEnd(); + + glPopMatrix(); + + //glDisable(GL_LINE_SMOOTH); +} + +// Draw gizmo (with or without orbits) +void DrawGizmo(Vector3 position, bool orbits) +{ + // NOTE: RGB = XYZ + float lenght = 1.0f; + float radius = 1.0f; + + //glEnable(GL_LINE_SMOOTH); // Smoothies circle outline (anti-aliasing applied) + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Best quality for line smooth (anti-aliasing best algorithm) + + glPushMatrix(); + glTranslatef(position.x, position.y, position.z); + //glRotatef(rotation, 0, 1, 0); + glScalef(lenght, lenght, lenght); + + glBegin(GL_LINES); + glColor3f(1.0f, 0.0f, 0.0f); + glVertex3f(0.0f, 0.0f, 0.0f); + glVertex3f(1.0f, 0.0f, 0.0f); + + glColor3f(0.0f, 1.0f, 0.0f); + glVertex3f(0.0f, 0.0f, 0.0f); + glVertex3f(0.0f, 1.0f, 0.0f); + + glColor3f(0.0f, 0.0f, 1.0f); + glVertex3f(0.0f, 0.0f, 0.0f); + glVertex3f(0.0f, 0.0f, 1.0f); + glEnd(); + + if (orbits) + { + glBegin(GL_LINE_LOOP); + glColor4f(1.0f, 0.0f, 0.0f, 0.4f); + for (int i=0; i < 360; i++) glVertex3f(sin(DEG2RAD*i) * radius, 0, cos(DEG2RAD*i) * radius); + glEnd(); + + glBegin(GL_LINE_LOOP); + glColor4f(0.0f, 1.0f, 0.0f, 0.4f); + for (int i=0; i < 360; i++) glVertex3f(sin(DEG2RAD*i) * radius, cos(DEG2RAD*i) * radius, 0); + glEnd(); + + glBegin(GL_LINE_LOOP); + glColor4f(0.0f, 0.0f, 1.0f, 0.4f); + for (int i=0; i < 360; i++) glVertex3f(0, sin(DEG2RAD*i) * radius, cos(DEG2RAD*i) * radius); + glEnd(); + } + + glPopMatrix(); + + //glDisable(GL_LINE_SMOOTH); +} + +// Load a 3d model (.OBJ) +// TODO: Add comments explaining this function process +Model LoadModel(const char *fileName) +{ + Model model; + + char dataType; + char comments[200]; + + int numVertex = 0; + int numNormals = 0; + int numTexCoords = 0; + int numTriangles = 0; + + FILE* objfile; + + objfile = fopen(fileName, "rt"); + + while(!feof(objfile)) + { + fscanf(objfile, "%c", &dataType); + + switch(dataType) + { + case '#': // It's a comment + { + fgets(comments, 200, objfile); + } break; + case 'v': + { + fscanf(objfile, "%c", &dataType); + + if (dataType == 't') // Read texCoord + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + + while (dataType == 'v') + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + } + + if (dataType == '#') + { + fscanf(objfile, "%i", &numTexCoords); + } + else printf("Ouch! Something was wrong..."); + + fgets(comments, 200, objfile); + } + else if (dataType == 'n') // Read normals + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + + while (dataType == 'v') + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + } + + if (dataType == '#') + { + fscanf(objfile, "%i", &numNormals); + } + else printf("Ouch! Something was wrong..."); + + fgets(comments, 200, objfile); + } + else // Read vertex + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + + while (dataType == 'v') + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + } + + if (dataType == '#') + { + fscanf(objfile, "%i", &numVertex); + } + else printf("Ouch! Something was wrong..."); + + fgets(comments, 200, objfile); + } + } break; + case 'f': + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + + while (dataType == 'f') + { + fgets(comments, 200, objfile); + fscanf(objfile, "%c", &dataType); + } + + if (dataType == '#') + { + fscanf(objfile, "%i", &numTriangles); + } + else printf("Ouch! Something was wrong..."); + + fgets(comments, 200, objfile); + + } break; + default: break; + } + } + + Vector3 midVertices[numVertex]; + Vector3 midNormals[numNormals]; + Vector2 midTexCoords[numTexCoords]; + + model.numVertices = numTriangles*3; + + model.vertices = (Vector3 *)malloc(model.numVertices * sizeof(Vector3)); + model.normals = (Vector3 *)malloc(model.numVertices * sizeof(Vector3)); + model.texcoords = (Vector2 *)malloc(model.numVertices * sizeof(Vector2)); + + int countVertex = 0; + int countNormals = 0; + int countTexCoords = 0; + + int countMaxVertex = 0; + + rewind(objfile); + + while(!feof(objfile)) + { + fscanf(objfile, "%c", &dataType); + + switch(dataType) + { + case '#': + { + fgets(comments, 200, objfile); + } break; + case 'v': + { + fscanf(objfile, "%c", &dataType); + + if (dataType == 't') // Read texCoord + { + float useless = 0; + + fscanf(objfile, "%f %f %f", &midTexCoords[countTexCoords].x, &midTexCoords[countTexCoords].y, &useless); + countTexCoords++; + + fscanf(objfile, "%c", &dataType); + } + else if (dataType == 'n') // Read normals + { + fscanf(objfile, "%f %f %f", &midNormals[countNormals].x, &midNormals[countNormals].y, &midNormals[countNormals].z ); + countNormals++; + + fscanf(objfile, "%c", &dataType); + } + else // Read vertex + { + fscanf(objfile, "%f %f %f", &midVertices[countVertex].x, &midVertices[countVertex].y, &midVertices[countVertex].z ); + countVertex++; + + fscanf(objfile, "%c", &dataType); + } + } break; + case 'f': + { + int vNum, vtNum, vnNum; + fscanf(objfile, "%c", &dataType); + fscanf(objfile, "%i/%i/%i", &vNum, &vtNum, &vnNum); + + model.vertices[countMaxVertex] = midVertices[vNum-1]; + model.normals[countMaxVertex] = midNormals[vnNum-1]; + model.texcoords[countMaxVertex].x = midTexCoords[vtNum-1].x; + model.texcoords[countMaxVertex].y = -midTexCoords[vtNum-1].y; + countMaxVertex++; + + fscanf(objfile, "%i/%i/%i", &vNum, &vtNum, &vnNum); + + model.vertices[countMaxVertex] = midVertices[vNum-1]; + model.normals[countMaxVertex] = midNormals[vnNum-1]; + model.texcoords[countMaxVertex].x = midTexCoords[vtNum-1].x; + model.texcoords[countMaxVertex].y = -midTexCoords[vtNum-1].y; + countMaxVertex++; + + fscanf(objfile, "%i/%i/%i", &vNum, &vtNum, &vnNum); + + model.vertices[countMaxVertex] = midVertices[vNum-1]; + model.normals[countMaxVertex] = midNormals[vnNum-1]; + model.texcoords[countMaxVertex].x = midTexCoords[vtNum-1].x; + model.texcoords[countMaxVertex].y = -midTexCoords[vtNum-1].y; + countMaxVertex++; + } break; + default: break; + } + } + + fclose(objfile); + + return model; +} + +// Unload 3d model from memory +void UnloadModel(Model model) +{ + free(model.vertices); + free(model.texcoords); + free(model.normals); +} + +// Draw a model +void DrawModel(Model model, Vector3 position, float scale, Color color) +{ + // NOTE: For models we use Vertex Arrays (OpenGL 1.1) + static float rotation = 0; + + glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex array + glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Enable texture coords array + glEnableClientState(GL_NORMAL_ARRAY); // Enable normals array + + glVertexPointer(3, GL_FLOAT, 0, model.vertices); // Pointer to vertex coords array + glTexCoordPointer(2, GL_FLOAT, 0, model.texcoords); // Pointer to texture coords array + glNormalPointer(GL_FLOAT, 0, model.normals); // Pointer to normals array + //glColorPointer(4, GL_UNSIGNED_BYTE, 0, model.colors); // Pointer to colors array (NOT USED) + + glPushMatrix(); + glTranslatef(position.x, position.y, position.z); + glRotatef(rotation * GetFrameTime(), 0, 1, 0); + glScalef(scale, scale, scale); + + glColor4ub(color.r, color.g, color.b, color.a); + + glDrawArrays(GL_TRIANGLES, 0, model.numVertices); + glPopMatrix(); + + glDisableClientState(GL_VERTEX_ARRAY); // Disable vertex array + glDisableClientState(GL_TEXTURE_COORD_ARRAY); // Disable texture coords array + glDisableClientState(GL_NORMAL_ARRAY); // Disable normals array + + rotation += 10; +} + +// Draw a textured model +void DrawModelEx(Model model, Texture2D texture, Vector3 position, float scale, Color tint) +{ + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texture.glId); + + DrawModel(model, position, scale, tint); + + glDisable(GL_TEXTURE_2D); +} + +// Draw a model wires +void DrawModelWires(Model model, Vector3 position, float scale, Color color) +{ + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + DrawModel(model, position, scale, color); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} + +// Draw a billboard +void DrawBillboard(Camera camera, Texture2D texture, Vector3 basePos, float size, Color tint) +{ + // NOTE: Billboard size will represent the width, height maintains aspect ratio + Vector3 centerPos = { basePos.x, basePos.y + size * (float)texture.height/(float)texture.width/2, basePos.z }; + Vector2 sizeRatio = { size, size * (float)texture.height/texture.width }; + Vector3 rotation = { 90, 0, 0 }; + + // TODO: Calculate Y rotation to face always camera (use matrix) + // OPTION: Lock Y-axis + + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texture.glId); + + DrawPlane(centerPos, sizeRatio, rotation, tint); // TODO: Review this function... + + glDisable(GL_TEXTURE_2D); +} + +// Draw a billboard (part of a texture defined by a rectangle) +void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 basePos, float size, Color tint) +{ + // NOTE: Billboard size will represent the width, height maintains aspect ratio + Vector3 centerPos = { basePos.x, basePos.y + size * (float)texture.height/(float)texture.width/2, basePos.z }; + Vector2 sizeRatio = { size, size * (float)texture.height/texture.width }; + Vector3 rotation = { 90, 0, 0 }; + + // TODO: Calculate Y rotation to face always camera (use matrix) + // OPTION: Lock Y-axis + + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texture.glId); + + // TODO: DrawPlane with correct textcoords for source rec. + + glDisable(GL_TEXTURE_2D); +} + +// Draw a heightmap using a provided image data +void DrawHeightmap(Image heightmap, Vector3 centerPos, Vector3 scale, Color color) +{ + // NOTE: Pixel-data is interpreted as grey-scale (even being a color image) + // NOTE: Heightmap resolution will depend on image size (one quad per pixel) + + // TODO: Review how this function works... probably we need: + // Model LoadHeightmap(Image image, Vector3 resolution); + + // NOTE: We are allocating and de-allocating vertex data every frame! --> framerate drops 80%! CRAZY! + Vector3 *terrainVertex = (Vector3 *)malloc(heightmap.width * heightmap.height * sizeof(Vector3)); + + for (int z = 0; z < heightmap.height; z++) + { + for (int x = 0; x < heightmap.width; x++) + { + terrainVertex[z*heightmap.height + x].x = (float)(x*scale.x); + terrainVertex[z*heightmap.height + x].y = ((float)heightmap.pixels[z*heightmap.height + x].r + + (float)heightmap.pixels[z*heightmap.height + x].g + + (float)heightmap.pixels[z*heightmap.height + x].b) / 3 * scale.y; + terrainVertex[z*heightmap.height + x].z = (float)(-z*scale.z); + } + } + + // TODO: Texture coordinates and normals computing + + for (int z = 0; z < heightmap.height-1; z++) + { + glBegin(GL_TRIANGLE_STRIP); + for (int x = 0; x < heightmap.width; x++) + { + glColor3f((float)heightmap.pixels[z*heightmap.height + x].r / 255.0f, + (float)heightmap.pixels[z*heightmap.height + x].g / 255.0f, + (float)heightmap.pixels[z*heightmap.height + x].b / 255.0f); + + glVertex3f(terrainVertex[z*heightmap.height + x].x, terrainVertex[z*heightmap.height + x].y, terrainVertex[z*heightmap.height + x].z); + glVertex3f(terrainVertex[(z+1)*heightmap.height + x].x, terrainVertex[(z+1)*heightmap.height + x].y, terrainVertex[(z+1)*heightmap.height + x].z); + } + glEnd(); + } + + free(terrainVertex); +} + +void DrawHeightmapEx(Image heightmap, Texture2D texture, Vector3 centerPos, Vector3 scale, Color tint) +{ + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texture.glId); + + // NOTE: No texture coordinates or normals defined at this moment... + DrawHeightmap(heightmap, centerPos, scale, tint); + + glDisable(GL_TEXTURE_2D); +} \ No newline at end of file diff --git a/src/raylib.h b/src/raylib.h new file mode 100644 index 000000000..fc9f5a5aa --- /dev/null +++ b/src/raylib.h @@ -0,0 +1,376 @@ +/********************************************************************************************* +* +* raylib 1.0.0 (www.raylib.com) +* +* A simple and easy-to-use library to learn C videogames programming +* +* Features: +* Library written in plain C code (C99) +* Uses C# PascalCase/camelCase notation +* Hardware accelerated with OpenGL 1.1 +* Powerful fonts module with SpriteFonts support +* Basic 3d support for Shapes and Models +* Audio loading and playing +* +* Used external libs: +* GLFW3 (www.glfw.org) for window/context management and input +* stb_image (Sean Barret) for images loading (JPEG, PNG, BMP, TGA, PSD, GIF, HDR, PIC) +* OpenAL Soft for audio device/context management +* +* Some design decisions: +* 32bit Colors - All defined color are always RGBA +* 32bit Textures - All loaded images are converted automatically to RGBA textures +* SpriteFonts - All loaded sprite-font images are converted to RGBA and POT textures +* One custom default font is loaded automatically when InitWindow() +* +* -- LICENSE (raylib v1.0, November 2013) -- +* +* raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software: +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYLIB_H +#define RAYLIB_H + +//#define NO_AUDIO // Audio is still being tested, deactivated by default + +//---------------------------------------------------------------------------------- +// Some basic Defines +//---------------------------------------------------------------------------------- +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +#define DEG2RAD (PI / 180.0) +#define RAD2DEG (180.0 / PI) + +// Keyboard Function Keys +#define KEY_SPACE 32 +#define KEY_ESCAPE 256 +#define KEY_ENTER 257 +#define KEY_RIGHT 262 +#define KEY_LEFT 263 +#define KEY_DOWN 264 +#define KEY_UP 265 +#define KEY_F1 290 +#define KEY_F2 291 +#define KEY_F3 292 +#define KEY_F4 293 +#define KEY_F5 294 +#define KEY_F6 295 +#define KEY_F7 296 +#define KEY_F8 297 +#define KEY_F9 298 +#define KEY_F10 299 +#define KEY_LEFT_SHIFT 340 +#define KEY_LEFT_CONTROL 341 +#define KEY_LEFT_ALT 342 +#define KEY_RIGHT_SHIFT 344 +#define KEY_RIGHT_CONTROL 345 +#define KEY_RIGHT_ALT 346 + +// Mouse Buttons +#define MOUSE_LEFT_BUTTON 0 +#define MOUSE_RIGHT_BUTTON 1 +#define MOUSE_MIDDLE_BUTTON 2 + +// Gamepad Number +#define GAMEPAD_PLAYER1 0 +#define GAMEPAD_PLAYER2 1 +#define GAMEPAD_PLAYER3 2 +#define GAMEPAD_PLAYER4 3 + +// Gamepad Buttons +// NOTE: Adjusted for a PS3 USB Controller +#define GAMEPAD_BUTTON_A 2 +#define GAMEPAD_BUTTON_B 1 +#define GAMEPAD_BUTTON_X 3 +#define GAMEPAD_BUTTON_Y 4 +#define GAMEPAD_BUTTON_R1 7 +#define GAMEPAD_BUTTON_R2 5 +#define GAMEPAD_BUTTON_L1 6 +#define GAMEPAD_BUTTON_L2 8 +#define GAMEPAD_BUTTON_SELECT 9 +#define GAMEPAD_BUTTON_START 10 + +// TODO: Review Xbox360 USB Controller Buttons + +// Some Basic Colors +// NOTE: Custom raylib color palette for amazing visuals on WHITE background +#define LIGHTGRAY (Color){ 200, 200, 200, 255 } // Light Gray +#define GRAY (Color){ 130, 130, 130, 255 } // Gray +#define DARKGRAY (Color){ 80, 80, 80, 255 } // Dark Gray +#define YELLOW (Color){ 253, 249, 0, 255 } // Yellow +#define GOLD (Color){ 255, 203, 0, 255 } // Gold +#define ORANGE (Color){ 255, 161, 0, 255 } // Orange +#define PINK (Color){ 255, 109, 194, 255 } // Pink +#define RED (Color){ 230, 41, 55, 255 } // Red +#define MAROON (Color){ 190, 33, 55, 255 } // Maroon +#define GREEN (Color){ 0, 228, 48, 255 } // Green +#define LIME (Color){ 0, 158, 47, 255 } // Lime +#define DARKGREEN (Color){ 0, 117, 44, 255 } // Dark Green +#define SKYBLUE (Color){ 102, 191, 255, 255 } // Sky Blue +#define BLUE (Color){ 0, 121, 241, 255 } // Blue +#define DARKBLUE (Color){ 0, 82, 172, 255 } // Dark Blue +#define PURPLE (Color){ 200, 122, 255, 255 } // Purple +#define VIOLET (Color){ 135, 60, 190, 255 } // Violet +#define DARKPURPLE (Color){ 112, 31, 126, 255 } // Dark Purple +#define BEIGE (Color){ 211, 176, 131, 255 } // Beige +#define BROWN (Color){ 127, 106, 79, 255 } // Brown +#define DARKBROWN (Color){ 76, 63, 47, 255 } // Dark Brown + +#define WHITE (Color){ 255, 255, 255, 255 } // White +#define BLACK (Color){ 0, 0, 0, 255 } // Black +#define BLANK (Color){ 0, 0, 0, 0 } // Blank (Transparent) +#define MAGENTA (Color){ 255, 0, 255, 255 } // Magenta +#define RAYWHITE (Color){ 245, 245, 245, 255 } // My own White (raylib logo) + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- + +// Boolean type +typedef enum { false, true } bool; + +// Color type, RGBA (32bit) +typedef struct Color { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; +} Color; + +// Rectangle type +typedef struct Rectangle { + int x; + int y; + int width; + int height; +} Rectangle; + +// Image type, bpp always RGBA (32bit) +// NOTE: Data stored in CPU memory (RAM) +typedef struct Image { + Color *pixels; + int width; + int height; +} Image; + +// Texture2D type, bpp always RGBA (32bit) +// NOTE: Data stored in GPU memory +typedef struct Texture2D { + unsigned int glId; + int width; + int height; +} Texture2D; + +// SpriteFont one Character (Glyph) data, defined in text module +typedef struct Character Character; + +// SpriteFont type, includes texture and charSet array data +typedef struct SpriteFont { + Texture2D texture; + int numChars; + Character *charSet; +} SpriteFont; + +// Vector2 type +typedef struct Vector2 { + float x; + float y; +} Vector2; + +// Vector3 type +typedef struct Vector3 { + float x; + float y; + float z; +} Vector3; + +// Camera type, defines a camera position/orientation in 3d space +typedef struct Camera { + Vector3 position; + Vector3 target; + Vector3 up; +} Camera; + +// Basic 3d Model type +typedef struct Model { + int numVertices; + Vector3 *vertices; + Vector2 *texcoords; + Vector3 *normals; +} Model; + +// Basic Sound source and buffer +typedef struct Sound { + unsigned int source; + unsigned int buffer; +} Sound; + +#ifdef __cplusplus +extern "C" { // Prevents name mangling of functions +#endif + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ +void InitWindow(int width, int height, char* title); // Initialize Window and Graphics Context (OpenGL) +void CloseWindow(); // Close Window and Terminate Context +bool WindowShouldClose(); // Detect if KEY_ESCAPE pressed or Close icon pressed +void ToggleFullscreen(); // Fullscreen toggle (by default F11) + +void ClearBackground(Color color); // Sets Background Color +void BeginDrawing(); // Setup drawing canvas to start drawing +void EndDrawing(); // End canvas drawing and Swap Buffers (Double Buffering) + +void Begin3dMode(Camera cam); // Initializes 3D mode for drawing (Camera setup) +void End3dMode(); // Ends 3D mode and returns to default 2D orthographic mode + +void SetTargetFPS(int fps); // Set target FPS (maximum) +float GetFPS(); // Returns current FPS +float GetFrameTime(); // Returns time in seconds for one frame + +Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value +int GetHexValue(Color color); // Returns hexadecimal value for a Color + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ +bool IsKeyPressed(int key); // Detect if a key is being pressed +bool IsKeyReleased(int key); // Detect if a key is NOT being pressed + +bool IsMouseButtonPressed(int button); // Detect if a mouse button is being pressed +bool IsMouseButtonReleased(int button); // Detect if a mouse button is NOT being pressed +int GetMouseX(); // Returns mouse position X +int GetMouseY(); // Returns mouse position Y +Vector2 GetMousePosition(); // Returns mouse position XY + +bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available +Vector2 GetGamepadMovement(int gamepad); // Return axis movement vector for a gamepad +bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button is being pressed +bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button is NOT being pressed + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ +void DrawPixel(int posX, int posY, Color color); // Draw a pixel +void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) +void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version) +void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle +void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +void DrawRectangleGradient(int posX, int posY, int width, int height, Color color1, Color color2); // Draw a gradient-filled rectangle +void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle +void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline +void DrawPoly(Vector2 *points, int numPoints, Color color); // Draw a closed polygon defined by points +void DrawPolyLine(Vector2 *points, int numPoints, Color color); // Draw polygon lines + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ +Image LoadImage(const char *fileName); // Load an image into CPU memory (RAM) +void UnloadImage(Image image); // Unload image from CPU memory (RAM) +Texture2D LoadTexture(const char *fileName); // Load an image as texture into GPU memory +//Texture2D LoadTextureEx(const char *fileName, bool createPOT, bool mipmaps); // Load an image as texture (and convert to POT with mipmaps) (raylib 1.x) +void UnloadTexture(Texture2D texture); // Unload texture from GPU memory +void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, float scale, Color tint); // Draw a part of a texture defined by a rectangle + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ +SpriteFont LoadSpriteFont(const char *fileName); // Load a SpriteFont image into GPU memory +void UnloadSpriteFont(SpriteFont spriteFont); // Unload SpriteFont from GPU memory +void DrawText(const char *text, int posX, int posY, int fontSize, int spacing, Color color); // Draw text (using default font) +void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, int fontSize, int spacing, Color tint); // Draw text using SpriteFont +int MeasureText(const char *text, int fontSize, int spacing); // Measure string width for default font +Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing); // Measure string size for SpriteFont +int GetFontBaseSize(SpriteFont spriteFont); // Returns the base size for a SpriteFont (chars height) +void DrawFps(int posX, int posY); // Shows current FPS on top-left corner +const char *FormatText(const char *text, ...); // Formatting of text with variables to 'embed' + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ +void DrawCube(Vector3 position, float width, float height, float lenght, Color color); // Draw cube +void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color); // Draw cube wires +void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +void DrawSphereWires(Vector3 centerPos, float radius, Color color); // Draw sphere wires +void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +void DrawPlane(Vector3 centerPos, Vector2 size, Vector3 rotation, Color color); // Draw a plane +void DrawPlaneEx(Vector3 centerPos, Vector2 size, Vector3 rotation, int slicesX, int slicesZ, Color color); // Draw a plane with divisions +void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) +void DrawGizmo(Vector3 position, bool orbits); // Draw gizmo (with or without orbits) +//DrawTorus(), DrawTeapot() are useless... + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ +Model LoadModel(const char *fileName); // Load a 3d model (.OBJ) +void UnloadModel(Model model); // Unload 3d model from memory +void DrawModel(Model model, Vector3 position, float scale, Color color); // Draw a model +void DrawModelEx(Model model, Texture2D texture, Vector3 position, float scale, Color tint); // Draw a textured model +void DrawModelWires(Model model, Vector3 position, float scale, Color color); // Draw a model wires + +// NOTE: The following functions work but are incomplete or require some revision +// DrawHeightmap is extremely inefficient and can impact performance up to 60% +void DrawBillboard(Camera camera, Texture2D texture, Vector3 basePos, float size, Color tint); // REVIEW: Draw a billboard (raylib 1.x) +void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vector3 basePos, float size, Color tint); // REVIEW: Draw a billboard (raylib 1.x) +void DrawHeightmap(Image heightmap, Vector3 centerPos, Vector3 scale, Color color); // REVIEW: Draw heightmap using image map (raylib 1.x) +void DrawHeightmapEx(Image heightmap, Texture2D texture, Vector3 centerPos, Vector3 scale, Color tint); // REVIEW: Draw textured heightmap (raylib 1.x) + +#ifndef NO_AUDIO + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ +void InitAudioDevice(); // Initialize audio device and context +void CloseAudioDevice(); // Close the audio device and context +Sound LoadSound(char *fileName); // Load sound to memory +void UnloadSound(Sound sound); // Unload sound +void PlaySound(Sound sound); // Play a sound +void PlaySoundEx(Sound sound, float timePosition, bool loop); // Play a sound with extended parameters +void PauseSound(Sound sound); // Pause a sound +void StopSound(Sound sound); // Stop playing a sound + +#endif // NO_AUDIO + +#ifdef __cplusplus +} +#endif + +#endif // RAYLIB_H \ No newline at end of file diff --git a/src/shapes.c b/src/shapes.c new file mode 100644 index 000000000..705cd3ab2 --- /dev/null +++ b/src/shapes.c @@ -0,0 +1,326 @@ +/********************************************************************************************* +* +* raylib.shapes +* +* Basic functions to draw 2d Shapes +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "raylib.h" + +#include // OpenGL functions +#include // Math related functions, sin() and cos() used on DrawCircle* + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Nop... + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +// Not here... + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +// It's lonely here... + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +// No private (static) functions in this module (.c file) + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- + +// Draw a pixel +void DrawPixel(int posX, int posY, Color color) +{ + glBegin(GL_POINTS); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2i(posX, posY); + glEnd(); + + // NOTE: Alternative method to draw a pixel (point) +/* + glEnable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Deprecated on OGL 3.0 + + glPointSize(1.0f); + glPoint((float)posX, (float)posY, 0.0f); +*/ +} + +// Draw a pixel (Vector version) +void DrawPixelV(Vector2 position, Color color) +{ + glBegin(GL_POINTS); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2f(position.x, position.y); + glEnd(); +} + +// Draw a line +void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color) +{ + glBegin(GL_LINES); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2i(startPosX, startPosY); + glVertex2i(endPosX, endPosY); + glEnd(); +} + +// Draw a line (Vector version) +void DrawLineV(Vector2 startPos, Vector2 endPos, Color color) +{ + glBegin(GL_LINES); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2f(startPos.x, startPos.y); + glVertex2f(endPos.x, endPos.y); + glEnd(); +} + +// Draw a color-filled circle +void DrawCircle(int centerX, int centerY, float radius, Color color) +{ + glEnable(GL_POLYGON_SMOOTH); + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2i(centerX, centerY); + + for (int i=0; i <= 360; i++) //i++ --> Step = 1.0 pixels + { + float degInRad = i*DEG2RAD; + //glVertex2f(cos(degInRad)*radius,sin(degInRad)*radius); + + glVertex2f(centerX + sin(degInRad) * radius, centerY + cos(degInRad) * radius); + } + glEnd(); + + glDisable(GL_POLYGON_SMOOTH); + + // NOTE: Alternative method to draw a circle (point) +/* + glEnable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Deprecated on OGL 3.0 + + glPointSize(radius); + glPoint((float)centerX, (float)centerY, 0.0f); +*/ +} + +// Draw a gradient-filled circle +// NOTE: Gradient goes from center (color1) to border (color2) +void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2) +{ + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color1.r, color1.g, color1.b, color1.a); + glVertex2i(centerX, centerY); + glColor4ub(color2.r, color2.g, color2.b, color2.a); + + for (int i=0; i <= 360; i++) //i++ --> Step = 1.0 pixels + { + glVertex2f(centerX + sin(DEG2RAD*i) * radius, centerY + cos(DEG2RAD*i) * radius); + } + glEnd(); +} + +// Draw a color-filled circle (Vector version) +void DrawCircleV(Vector2 center, float radius, Color color) +{ + glEnable(GL_POLYGON_SMOOTH); + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + glBegin(GL_TRIANGLE_FAN); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2f(center.x, center.y); + + for (int i=0; i <= 360; i++) //i++ --> Step = 1.0 pixels + { + glVertex2f(center.x + sin(DEG2RAD*i) * radius, center.y + cos(DEG2RAD*i) * radius); + } + glEnd(); + + glDisable(GL_POLYGON_SMOOTH); +} + +// Draw circle outline +void DrawCircleLines(int centerX, int centerY, float radius, Color color) +{ + glEnable(GL_LINE_SMOOTH); // Smoothies circle outline (anti-aliasing applied) + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Best quality for line smooth (anti-aliasing best algorithm) + + glBegin(GL_LINE_LOOP); + glColor4ub(color.r, color.g, color.b, color.a); + + // NOTE: Circle outline is drawn pixel by pixel every degree (0 to 360) + for (int i=0; i < 360; i++) + { + glVertex2f(centerX + sin(DEG2RAD*i) * radius, centerY + cos(DEG2RAD*i) * radius); + } + glEnd(); + +// NOTE: Alternative method to draw circle outline +/* + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + DrawCircle(centerX, centerY, radius, color); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +*/ + glDisable(GL_LINE_SMOOTH); +} + +// Draw a color-filled rectangle +void DrawRectangle(int posX, int posY, int width, int height, Color color) +{ + glBegin(GL_QUADS); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2i(posX, posY); + glVertex2i(posX + width, posY); + glVertex2i(posX + width, posY + height); + glVertex2i(posX, posY + height); + glEnd(); +} + +// Draw a color-filled rectangle +void DrawRectangleRec(Rectangle rec, Color color) +{ + DrawRectangle(rec.x, rec.y, rec.width, rec.height, color); +} + +// Draw a gradient-filled rectangle +// NOTE: Gradient goes from bottom (color1) to top (color2) +void DrawRectangleGradient(int posX, int posY, int width, int height, Color color1, Color color2) +{ + glBegin(GL_QUADS); + glColor4ub(color1.r, color1.g, color1.b, color1.a); + glVertex2i(posX, posY); + glVertex2i(posX + width, posY); + glColor4ub(color2.r, color2.g, color2.b, color2.a); + glVertex2i(posX + width, posY + height); + glVertex2i(posX, posY + height); + glEnd(); +} + +// Draw a color-filled rectangle (Vector version) +void DrawRectangleV(Vector2 position, Vector2 size, Color color) +{ + glBegin(GL_QUADS); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2i(position.x, position.y); + glVertex2i(position.x + size.x, position.y); + glVertex2i(position.x + size.x, position.y + size.y); + glVertex2i(position.x, position.y + size.y); + glEnd(); +} + +// Draw rectangle outline +void DrawRectangleLines(int posX, int posY, int width, int height, Color color) +{ + //glEnable(GL_LINE_SMOOTH); // Smoothies circle outline (anti-aliasing applied) + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Best quality for line smooth (anti-aliasing best algorithm) + + // NOTE: Lines are rasterized using the "Diamond Exit" rule so, it's nearly impossible to obtain a pixel-perfect engine + // NOTE: Recommended trying to avoid using lines, at least >1.0f pixel lines with anti-aliasing (glLineWidth function) + + glBegin(GL_LINE_LOOP); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2i(posX, posY); + glVertex2i(posX + width - 1, posY); + glVertex2i(posX + width - 1, posY + height - 1); + glVertex2i(posX, posY + height - 1); + glEnd(); + +// NOTE: Alternative method to draw rectangle outline +/* + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + DrawRectangle(posX, posY, width - 1, height - 1, color); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +*/ + //glDisable(GL_LINE_SMOOTH); +} + +// Draw a triangle +void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color) +{ + glBegin(GL_TRIANGLES); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2f(v1.x, v1.y); + glVertex2f(v2.x, v2.y); + glVertex2f(v3.x, v3.y); + glEnd(); +} + +void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color) +{ + glBegin(GL_LINE_LOOP); + glColor4ub(color.r, color.g, color.b, color.a); + glVertex2f(v1.x, v1.y); + glVertex2f(v2.x, v2.y); + glVertex2f(v3.x, v3.y); + glEnd(); +} + +// Draw a closed polygon defined by points +// NOTE: Array num elements MUST be passed as parameter to function +void DrawPoly(Vector2 *points, int numPoints, Color color) +{ + if (numPoints >= 3) + { + glEnable(GL_POLYGON_SMOOTH); + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + glBegin(GL_POLYGON); + glColor4ub(color.r, color.g, color.b, color.a); + + for (int i = 0; i < numPoints; i++) + { + glVertex2f(points[i].x, points[i].y); + } + glEnd(); + + glDisable(GL_POLYGON_SMOOTH); + } +} + +// Draw polygon lines +// NOTE: Array num elements MUST be passed as parameter to function +void DrawPolyLine(Vector2 *points, int numPoints, Color color) +{ + if (numPoints >= 2) + { + //glEnable(GL_LINE_SMOOTH); // Smoothies circle outline (anti-aliasing applied) + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Best quality for line smooth (anti-aliasing best algorithm) + + glBegin(GL_LINE_LOOP); + glColor4ub(color.r, color.g, color.b, color.a); + + for (int i = 0; i < numPoints; i++) + { + glVertex2f(points[i].x, points[i].y); + } + glEnd(); + + //glDisable(GL_LINE_SMOOTH); + } +} diff --git a/src/stb_image.c b/src/stb_image.c new file mode 100644 index 000000000..b11e44ffd --- /dev/null +++ b/src/stb_image.c @@ -0,0 +1,4341 @@ +#include "stb_image.h" + +#ifndef STBI_HEADER_FILE_ONLY + +#ifndef STBI_NO_HDR +#include // ldexp +#include // strcmp, strtok +#endif + +#ifndef STBI_NO_STDIO +#include +#endif +#include +#include +#include +#include + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +// implementation: +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; +typedef unsigned int uint; + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1]; + +#if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) +#define STBI_NO_WRITE +#endif + +#define STBI_NOTUSED(v) (void)sizeof(v) + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +/////////////////////////////////////////////// +// +// stbi struct and start_xxx functions + +// stbi structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + 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; + uint8 buffer_start[128]; + + uint8 *img_buffer, *img_buffer_end; + uint8 *img_buffer_original; +} stbi; + + +static void refill_buffer(stbi *s); + +// initialize a memory-decode context +static void start_mem(stbi *s, uint8 const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (uint8 *) buffer; + s->img_buffer_end = (uint8 *) buffer+len; +} + +// initialize a callback-based context +static void start_callbacks(stbi *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + refill_buffer(s); +} + +#ifndef STBI_NO_STDIO + +static int stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stdio_skip(void *user, unsigned n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi_stdio_callbacks = +{ + stdio_read, + stdio_skip, + stdio_eof, +}; + +static void start_file(stbi *s, FILE *f) +{ + start_callbacks(s, &stbi_stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi_rewind(stbi *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; +} + +static int stbi_jpeg_test(stbi *s); +static stbi_uc *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp); +static int stbi_png_test(stbi *s); +static stbi_uc *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_png_info(stbi *s, int *x, int *y, int *comp); +static int stbi_bmp_test(stbi *s); +static stbi_uc *stbi_bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_tga_test(stbi *s); +static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_tga_info(stbi *s, int *x, int *y, int *comp); +static int stbi_psd_test(stbi *s); +static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_hdr_test(stbi *s); +static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_pic_test(stbi *s); +static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_gif_test(stbi *s); +static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp); +static int stbi_gif_info(stbi *s, int *x, int *y, int *comp); + + +// this is not threadsafe +static const char *failure_reason; + +const char *stbi_failure_reason(void) +{ + return failure_reason; +} + +static int e(const char *str) +{ + failure_reason = str; + return 0; +} + +// e - error +// epf - error returning pointer to float +// epuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define e(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define e(x,y) e(y) +#else + #define e(x,y) e(x) +#endif + +#define epf(x,y) ((float *) (e(x,y)?NULL:NULL)) +#define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL)) + +void stbi_image_free(void *retval_from_stbi_load) +{ + free(retval_from_stbi_load); +} + +#ifndef STBI_NO_HDR +static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static unsigned char *stbi_load_main(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + if (stbi_jpeg_test(s)) return stbi_jpeg_load(s,x,y,comp,req_comp); + if (stbi_png_test(s)) return stbi_png_load(s,x,y,comp,req_comp); + if (stbi_bmp_test(s)) return stbi_bmp_load(s,x,y,comp,req_comp); + if (stbi_gif_test(s)) return stbi_gif_load(s,x,y,comp,req_comp); + if (stbi_psd_test(s)) return stbi_psd_load(s,x,y,comp,req_comp); + if (stbi_pic_test(s)) return stbi_pic_load(s,x,y,comp,req_comp); + + #ifndef STBI_NO_HDR + if (stbi_hdr_test(s)) { + float *hdr = stbi_hdr_load(s, x,y,comp,req_comp); + return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + // test tga last because it's a crappy test! + if (stbi_tga_test(s)) + return stbi_tga_load(s,x,y,comp,req_comp); + return epuc("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + unsigned char *result; + if (!f) return epuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_file(&s,f); + return stbi_load_main(&s,x,y,comp,req_comp); +} +#endif //!STBI_NO_STDIO + +unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_mem(&s,buffer,len); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_HDR + +float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi_hdr_test(s)) + return stbi_hdr_load(s,x,y,comp,req_comp); + #endif + data = stbi_load_main(s, x, y, comp, req_comp); + if (data) + return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return epf("unknown image type", "Image not of any known type, or corrupt"); +} + +float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_mem(&s,buffer,len); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + float *result; + if (!f) return epf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi s; + start_file(&s,f); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_HDR + +// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is +// defined, for API simplicity; if STBI_NO_HDR is defined, it always +// reports false! + +int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi s; + start_mem(&s,buffer,len); + return stbi_hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +extern int stbi_is_hdr (char const *filename) +{ + FILE *f = fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +extern int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi s; + start_file(&s,f); + return stbi_hdr_test(&s); + #else + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_hdr_test(&s); + #else + return 0; + #endif +} + +#ifndef STBI_NO_HDR +static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; +static float l2h_gamma=2.2f, l2h_scale=1.0f; + +void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } +void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } + +void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } +void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } +#endif + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + SCAN_load=0, + SCAN_type, + SCAN_header +}; + +static void refill_buffer(stbi *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_end-1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static int get8(stbi *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int at_eof(stbi *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; +} + +stbi_inline static uint8 get8u(stbi *s) +{ + return (uint8) get8(s); +} + +static void skip(stbi *s, int n) +{ + if (s->io.read) { + int blen = s->img_buffer_end - s->img_buffer; + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int getn(stbi *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = s->img_buffer_end - s->img_buffer; + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int get16(stbi *s) +{ + int z = get8(s); + return (z << 8) + get8(s); +} + +static uint32 get32(stbi *s) +{ + uint32 z = get16(s); + return (z << 16) + get16(s); +} + +static int get16le(stbi *s) +{ + int z = get8(s); + return z + (get8(s) << 8); +} + +static uint32 get32le(stbi *s) +{ + uint32 z = get16le(s); + return z + (get16le(s) << 16); +} + +////////////////////////////////////////////////////////////////////////////// +// +// 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 uint8 compute_y(int r, int g, int b) +{ + return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + assert(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) malloc(req_comp * x * y); + if (good == NULL) { + free(data); + return epuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define COMBO(a,b) ((a)*8+(b)) + #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (COMBO(img_n, req_comp)) { + CASE(1,2) dest[0]=src[0], dest[1]=255; break; + CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; + CASE(2,1) dest[0]=src[0]; break; + CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; + CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; + CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; + CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; + CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; + CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; + CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + default: assert(0); + } + #undef CASE + } + + free(data); + return good; +} + +#ifndef STBI_NO_HDR +static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output = (float *) malloc(x * y * comp * sizeof(float)); + if (output == NULL) { free(data); return epf("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, l2h_gamma) * l2h_scale; + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + free(data); + return output; +} + +#define float2int(x) ((int) (x)) +static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output = (stbi_uc *) malloc(x * y * comp); + if (output == NULL) { free(data); return epuc("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]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (uint8) 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] = (uint8) float2int(z); + } + } + free(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) +// +// simple implementation +// - channel subsampling of at most 2 in each dimension +// - 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 +// - uses a lot of intermediate memory, could cache poorly +// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 +// stb_jpeg: 1.34 seconds (MSVC6, default release build) +// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) +// IJL11.dll: 1.08 seconds (compiled by intel) +// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) +// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + uint8 fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + uint16 code[256]; + uint8 values[256]; + uint8 size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} huffman; + +typedef struct +{ + #ifdef STBI_SIMD + unsigned short dequant2[4][64]; + #endif + stbi *s; + huffman huff_dc[4]; + huffman huff_ac[4]; + uint8 dequant[4][64]; + +// 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; + uint8 *data; + void *raw_data; + uint8 *linebuf; + } img_comp[4]; + + 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 scan_n, order[4]; + int restart_interval, todo; +} jpeg; + +static int build_huffman(huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (uint8) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (uint16) (code++); + if (code-1 >= (1 << j)) return e("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] = (uint8) i; + } + } + } + return 1; +} + +static void grow_buffer_unsafe(jpeg *j) +{ + do { + int b = j->nomore ? 0 : get8(j->s); + if (b == 0xff) { + int c = get8(j->s); + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static uint32 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 decode(jpeg *j, huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) 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)) & bmask[k]) + h->delta[k]; + assert((((j->code_buffer) >> (32 - h->size[c])) & 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]; +} + +// combined JPEG 'receive' and JPEG 'extend', since baseline +// always extends everything it receives. +stbi_inline static int extend_receive(jpeg *j, int n) +{ + unsigned int m = 1 << (n-1); + unsigned int k; + if (j->code_bits < n) grow_buffer_unsafe(j); + + #if 1 + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~bmask[n]; + k &= bmask[n]; + j->code_bits -= n; + #else + k = (j->code_buffer >> (32 - n)) & bmask[n]; + j->code_bits -= n; + j->code_buffer <<= n; + #endif + // the following test is probably a random branch that won't + // predict well. I tried to table accelerate it but failed. + // maybe it's compiling as a conditional move? + if (k < m) + return (-1 << n) + k + 1; + else + return k; +} + +// 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 uint8 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 decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b) +{ + int diff,dc,k; + int t = decode(j, hdc); + if (t < 0) return e("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 ? extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) dc; + + // decode AC components, see JPEG spec + k = 1; + do { + int r,s; + int rs = decode(j, hac); + if (rs < 0) return e("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 + data[dezigzag[k++]] = (short) extend_receive(j,s); + } + } while (k < 64); + return 1; +} + +// take a -128..127 value and clamp it and convert to 0..255 +stbi_inline static uint8 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 (uint8) x; +} + +#define f2f(x) (int) (((x) * 4096 + 0.5)) +#define fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define 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) * f2f(0.5411961f); \ + t2 = p1 + p3*f2f(-1.847759065f); \ + t3 = p1 + p2*f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = fsh(p2+p3); \ + t1 = 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)*f2f( 1.175875602f); \ + t0 = t0*f2f( 0.298631336f); \ + t1 = t1*f2f( 2.053119869f); \ + t2 = t2*f2f( 3.072711026f); \ + t3 = t3*f2f( 1.501321110f); \ + p1 = p5 + p1*f2f(-0.899976223f); \ + p2 = p5 + p2*f2f(-2.562915447f); \ + p3 = p3*f2f(-1.961570560f); \ + p4 = p4*f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +#ifdef STBI_SIMD +typedef unsigned short stbi_dequantize_t; +#else +typedef uint8 stbi_dequantize_t; +#endif + +// .344 seconds on 3*anemones.jpg +static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) +{ + int i,val[64],*v=val; + stbi_dequantize_t *dq = dequantize; + uint8 *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d,++dq, ++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] * dq[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], + d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[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 + 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] = clamp((x0+t3) >> 17); + o[7] = clamp((x0-t3) >> 17); + o[1] = clamp((x1+t2) >> 17); + o[6] = clamp((x1-t2) >> 17); + o[2] = clamp((x2+t1) >> 17); + o[5] = clamp((x2-t1) >> 17); + o[3] = clamp((x3+t0) >> 17); + o[4] = clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SIMD +static stbi_idct_8x8 stbi_idct_installed = idct_block; + +void stbi_install_idct(stbi_idct_8x8 func) +{ + stbi_idct_installed = func; +} +#endif + +#define 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 uint8 get_marker(jpeg *j) +{ + uint8 x; + if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; } + x = get8u(j->s); + if (x != 0xff) return MARKER_none; + while (x == 0xff) + x = get8u(j->s); + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, reset the entropy decoder and +// the dc prediction +static void reset(jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->marker = MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + // 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 parse_entropy_coded_data(jpeg *z) +{ + reset(z); + if (z->scan_n == 1) { + int i,j; + #ifdef STBI_SIMD + __declspec(align(16)) + #endif + 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) { + if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; + #ifdef STBI_SIMD + stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); + #else + idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); + #endif + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!RESTART(z->marker)) return 1; + reset(z); + } + } + } + } else { // interleaved! + int i,j,k,x,y; + 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; + if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; + #ifdef STBI_SIMD + stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); + #else + idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); + #endif + } + } + } + // 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) grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!RESTART(z->marker)) return 1; + reset(z); + } + } + } + } + return 1; +} + +static int process_marker(jpeg *z, int m) +{ + int L; + switch (m) { + case MARKER_none: // no marker found + return e("expected marker","Corrupt JPEG"); + + case 0xC2: // SOF - progressive + return e("progressive jpeg","JPEG format not supported (progressive)"); + + case 0xDD: // DRI - specify restart interval + if (get16(z->s) != 4) return e("bad DRI len","Corrupt JPEG"); + z->restart_interval = get16(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = get16(z->s)-2; + while (L > 0) { + int q = get8(z->s); + int p = q >> 4; + int t = q & 15,i; + if (p != 0) return e("bad DQT type","Corrupt JPEG"); + if (t > 3) return e("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) + z->dequant[t][dezigzag[i]] = get8u(z->s); + #ifdef STBI_SIMD + for (i=0; i < 64; ++i) + z->dequant2[t][i] = z->dequant[t][i]; + #endif + L -= 65; + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = get16(z->s)-2; + while (L > 0) { + uint8 *v; + int sizes[16],i,m=0; + int q = get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = get8(z->s); + m += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < m; ++i) + v[i] = get8u(z->s); + L -= m; + } + return L==0; + } + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + skip(z->s, get16(z->s)-2); + return 1; + } + return 0; +} + +// after we see SOS +static int process_scan_header(jpeg *z) +{ + int i; + int Ls = get16(z->s); + z->scan_n = get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return e("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = get8(z->s), which; + int q = 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; + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); + get8(z->s); // should be 63, but might be 0 + if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG"); + + return 1; +} + +static int process_frame_header(jpeg *z, int scan) +{ + stbi *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG + p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires + c = get8(s); + if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG"); + + for (i=0; i < s->img_n; ++i) { + z->img_comp[i].id = get8(s); + if (z->img_comp[i].id != i+1) // JFIF requires + if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! + return e("bad component ID","Corrupt JPEG"); + q = get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); + z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); + } + + if (scan != SCAN_load) return 1; + + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + if (z->img_comp[i].raw_data == NULL) { + for(--i; i >= 0; --i) { + free(z->img_comp[i].raw_data); + z->img_comp[i].data = NULL; + } + return e("outofmem", "Out of memory"); + } + // align blocks for installable-idct using mmx/sse + z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define DNL(x) ((x) == 0xdc) +#define SOI(x) ((x) == 0xd8) +#define EOI(x) ((x) == 0xd9) +#define SOF(x) ((x) == 0xc0 || (x) == 0xc1) +#define SOS(x) ((x) == 0xda) + +static int decode_jpeg_header(jpeg *z, int scan) +{ + int m; + z->marker = MARKER_none; // initialize cached marker to empty + m = get_marker(z); + if (!SOI(m)) return e("no SOI","Corrupt JPEG"); + if (scan == SCAN_type) return 1; + m = get_marker(z); + while (!SOF(m)) { + if (!process_marker(z,m)) return 0; + m = get_marker(z); + while (m == MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (at_eof(z->s)) return e("no SOF", "Corrupt JPEG"); + m = get_marker(z); + } + } + if (!process_frame_header(z, scan)) return 0; + return 1; +} + +static int decode_jpeg_image(jpeg *j) +{ + int m; + j->restart_interval = 0; + if (!decode_jpeg_header(j, SCAN_load)) return 0; + m = get_marker(j); + while (!EOI(m)) { + if (SOS(m)) { + if (!process_scan_header(j)) return 0; + if (!parse_entropy_coded_data(j)) return 0; + if (j->marker == MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!at_eof(j->s)) { + int x = get8(j->s); + if (x == 255) { + j->marker = get8u(j->s); + break; + } else if (x != 0) { + return 0; + } + } + // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0 + } + } else { + if (!process_marker(j, m)) return 0; + } + m = get_marker(j); + } + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1, + int w, int hs); + +#define div4(x) ((uint8) ((x) >> 2)) + +static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *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] = div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + uint8 *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] = div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = div4(n+input[i-1]); + out[i*2+1] = div4(n+input[i+1]); + } + out[i*2+0] = 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 div16(x) ((uint8) ((x) >> 4)) + +static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *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] = div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = div16(3*t0 + t1 + 8); + out[i*2 ] = div16(3*t1 + t0 + 8); + } + out[w*2-1] = div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + in_far = in_far; + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) + +// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) +// VC6 without processor=Pro is generating multiple LEAs per multiply! +static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 16) + 32768; // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr*float2fixed(1.40200f); + g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); + b = y_fixed + cb*float2fixed(1.77200f); + r >>= 16; + g >>= 16; + b >>= 16; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (uint8)r; + out[1] = (uint8)g; + out[2] = (uint8)b; + out[3] = 255; + out += step; + } +} + +#ifdef STBI_SIMD +static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row; + +void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) +{ + stbi_YCbCr_installed = func; +} +#endif + + +// clean up the temporary component buffers +static void cleanup_jpeg(jpeg *j) +{ + int i; + for (i=0; i < j->s->img_n; ++i) { + if (j->img_comp[i].data) { + free(j->img_comp[i].raw_data); + j->img_comp[i].data = NULL; + } + if (j->img_comp[i].linebuf) { + free(j->img_comp[i].linebuf); + j->img_comp[i].linebuf = NULL; + } + } +} + +typedef struct +{ + resample_row_func resample; + uint8 *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi_resample; + +static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n; + // validate req_comp + if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); + z->s->img_n = 0; + + // load a jpeg image from whichever source + if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n; + + if (z->s->img_n == 3 && n < 3) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + uint i,j; + uint8 *output; + uint8 *coutput[4]; + + stbi_resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi_resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (uint8 *) malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("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 = resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2; + else r->resample = resample_row_generic; + } + + // can't error after this so, this is safe + output = (uint8 *) malloc(n * z->s->img_x * z->s->img_y + 1); + if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + uint8 *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) { + uint8 *y = coutput[0]; + if (z->s->img_n == 3) { + #ifdef STBI_SIMD + stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n); + #else + YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); + #endif + } 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 { + uint8 *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; + } + } + cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n; // report original components, not output + return output; + } +} + +static unsigned char *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + jpeg j; + j.s = s; + return load_jpeg_image(&j, x,y,comp,req_comp); +} + +static int stbi_jpeg_test(stbi *s) +{ + int r; + jpeg j; + j.s = s; + r = decode_jpeg_header(&j, SCAN_type); + stbi_rewind(s); + return r; +} + +static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp) +{ + if (!decode_jpeg_header(j, SCAN_header)) { + stbi_rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n; + return 1; +} + +static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp) +{ + jpeg j; + j.s = s; + return stbi_jpeg_info_raw(&j, x, y, comp); +} + +// 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 + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define ZFAST_BITS 9 // accelerate all cases in default tables +#define ZFAST_MASK ((1 << ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + uint16 fast[1 << ZFAST_BITS]; + uint16 firstcode[16]; + int maxcode[17]; + uint16 firstsymbol[16]; + uint8 size[288]; + uint16 value[288]; +} zhuffman; + +stbi_inline static int 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 bit_reverse(int v, int bits) +{ + assert(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return bitreverse16(v) >> (16-bits); +} + +static int zbuild_huffman(zhuffman *z, uint8 *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, 255, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + assert(sizes[i] <= (1 << i)); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (uint16) code; + z->firstsymbol[i] = (uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); + 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]; + z->size[c] = (uint8)s; + z->value[c] = (uint16)i; + if (s <= ZFAST_BITS) { + int k = bit_reverse(next_code[s],s); + while (k < (1 << ZFAST_BITS)) { + z->fast[k] = (uint16) c; + k += (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 +{ + uint8 *zbuffer, *zbuffer_end; + int num_bits; + uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + zhuffman z_length, z_distance; +} zbuf; + +stbi_inline static int zget8(zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void fill_bits(zbuf *z) +{ + do { + assert(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int zreceive(zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +stbi_inline static int zhuffman_decode(zbuf *a, zhuffman *z) +{ + int b,s,k; + if (a->num_bits < 16) fill_bits(a); + b = z->fast[a->code_buffer & ZFAST_MASK]; + if (b < 0xffff) { + s = z->size[b]; + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; + } + + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = bit_reverse(a->code_buffer, 16); + for (s=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]; + assert(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +static int expand(zbuf *z, int n) // need to make room for n bytes +{ + char *q; + int cur, limit; + if (!z->z_expandable) return e("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) realloc(z->zout_start, limit); + if (q == NULL) return e("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int length_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int length_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int dist_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 parse_huffman_block(zbuf *a) +{ + for(;;) { + int z = zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes + if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0; + *a->zout++ = (char) z; + } else { + uint8 *p; + int len,dist; + if (z == 256) return 1; + z -= 257; + len = length_base[z]; + if (length_extra[z]) len += zreceive(a, length_extra[z]); + z = zhuffman_decode(a, &a->z_distance); + if (z < 0) return e("bad huffman code","Corrupt PNG"); + dist = dist_base[z]; + if (dist_extra[z]) dist += zreceive(a, dist_extra[z]); + if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG"); + if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; + p = (uint8 *) (a->zout - dist); + while (len--) + *a->zout++ = *p++; + } + } +} + +static int compute_huffman_codes(zbuf *a) +{ + static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + zhuffman z_codelength; + uint8 lencodes[286+32+137];//padding for maximum single op + uint8 codelength_sizes[19]; + int i,n; + + int hlit = zreceive(a,5) + 257; + int hdist = zreceive(a,5) + 1; + int hclen = zreceive(a,4) + 4; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (uint8) s; + } + if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < hlit + hdist) { + int c = zhuffman_decode(a, &z_codelength); + assert(c >= 0 && c < 19); + if (c < 16) + lencodes[n++] = (uint8) c; + else if (c == 16) { + c = zreceive(a,2)+3; + memset(lencodes+n, lencodes[n-1], c); + n += c; + } else if (c == 17) { + c = zreceive(a,3)+3; + memset(lencodes+n, 0, c); + n += c; + } else { + assert(c == 18); + c = zreceive(a,7)+11; + memset(lencodes+n, 0, c); + n += c; + } + } + if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); + if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int parse_uncompressed_block(zbuf *a) +{ + uint8 header[4]; + int len,nlen,k; + if (a->num_bits & 7) + zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns? + a->code_buffer >>= 8; + a->num_bits -= 8; + } + assert(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = (uint8) zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!expand(a, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int parse_zlib_header(zbuf *a) +{ + int cmf = zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = zget8(a); + if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +// @TODO: should statically initialize these for optimal thread safety +static uint8 default_length[288], default_distance[32]; +static void init_defaults(void) +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) default_length[i] = 8; + for ( ; i <= 255; ++i) default_length[i] = 9; + for ( ; i <= 279; ++i) default_length[i] = 7; + for ( ; i <= 287; ++i) default_length[i] = 8; + + for (i=0; i <= 31; ++i) default_distance[i] = 5; +} + +int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead +static int parse_zlib(zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = zreceive(a,1); + type = zreceive(a,2); + if (type == 0) { + if (!parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!default_distance[31]) init_defaults(); + if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0; + if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0; + } else { + if (!compute_huffman_codes(a)) return 0; + } + if (!parse_huffman_block(a)) return 0; + } + if (stbi_png_partial && a->zout - a->zout_start > 65536) + break; + } while (!final); + return 1; +} + +static int do_zlib(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 parse_zlib(a, parse_header); +} + +char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + zbuf a; + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (uint8 *) buffer; + a.zbuffer_end = (uint8 *) buffer + len; + if (do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + zbuf a; + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (uint8 *) buffer; + a.zbuffer_end = (uint8 *) buffer + len; + if (do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + zbuf a; + a.zbuffer = (uint8 *) ibuffer; + a.zbuffer_end = (uint8 *) ibuffer + ilen; + if (do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + zbuf a; + char *p = (char *) malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (uint8 *) buffer; + a.zbuffer_end = (uint8 *) buffer+len; + if (do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + zbuf a; + a.zbuffer = (uint8 *) ibuffer; + a.zbuffer_end = (uint8 *) ibuffer + ilen; + if (do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +// 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 + + +typedef struct +{ + uint32 length; + uint32 type; +} chunk; + +#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static chunk get_chunk_header(stbi *s) +{ + chunk c; + c.length = get32(s); + c.type = get32(s); + return c; +} + +static int check_png_header(stbi *s) +{ + static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (get8u(s) != png_sig[i]) return e("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi *s; + uint8 *idata, *expanded, *out; +} png; + + +enum { + F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, + F_avg_first, F_paeth_first +}; + +static uint8 first_row_filter[5] = +{ + F_none, F_sub, F_none, F_avg_first, F_paeth_first +}; + +static int 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; +} + +// create the png data from post-deflated data +static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y) +{ + stbi *s = a->s; + uint32 i,j,stride = x*out_n; + int k; + int img_n = s->img_n; // copy it into a local for later + assert(out_n == s->img_n || out_n == s->img_n+1); + if (stbi_png_partial) y = 1; + a->out = (uint8 *) malloc(x * y * out_n); + if (!a->out) return e("outofmem", "Out of memory"); + if (!stbi_png_partial) { + if (s->img_x == x && s->img_y == y) { + if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); + } else { // interlaced: + if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); + } + } + for (j=0; j < y; ++j) { + uint8 *cur = a->out + stride*j; + uint8 *prior = cur - stride; + int filter = *raw++; + if (filter > 4) return e("invalid filter","Corrupt PNG"); + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + // handle first pixel explicitly + for (k=0; k < img_n; ++k) { + switch (filter) { + case F_none : cur[k] = raw[k]; break; + case F_sub : cur[k] = raw[k]; break; + case F_up : cur[k] = raw[k] + prior[k]; break; + case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; + case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; + case F_avg_first : cur[k] = raw[k]; break; + case F_paeth_first: cur[k] = raw[k]; break; + } + } + if (img_n != out_n) cur[img_n] = 255; + raw += img_n; + cur += out_n; + prior += out_n; + // this is a little gross, so that we don't switch per-pixel or per-component + if (img_n == out_n) { + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(F_none) cur[k] = raw[k]; break; + CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; + CASE(F_up) cur[k] = raw[k] + prior[k]; break; + CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; + CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; + CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; + CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; + } + #undef CASE + } else { + assert(img_n+1 == out_n); + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(F_none) cur[k] = raw[k]; break; + CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; + CASE(F_up) cur[k] = raw[k] + prior[k]; break; + CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; + CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; + CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; + CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; + } + #undef CASE + } + } + return 1; +} + +static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced) +{ + uint8 *final; + int p; + int save; + if (!interlaced) + return create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); + save = stbi_png_partial; + stbi_png_partial = 0; + + // de-interlacing + final = (uint8 *) malloc(a->s->img_x * a->s->img_y * out_n); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) { + free(final); + return 0; + } + for (j=0; j < y; ++j) + for (i=0; i < x; ++i) + memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, + a->out + (j*x+i)*out_n, out_n); + free(a->out); + raw += (x*out_n+1)*y; + raw_len -= (x*out_n+1)*y; + } + } + a->out = final; + + stbi_png_partial = save; + return 1; +} + +static int compute_transparency(png *z, uint8 tc[3], int out_n) +{ + stbi *s = z->s; + uint32 i, pixel_count = s->img_x * s->img_y; + uint8 *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + 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 expand_palette(png *a, uint8 *palette, int len, int pal_img_n) +{ + uint32 i, pixel_count = a->s->img_x * a->s->img_y; + uint8 *p, *temp_out, *orig = a->out; + + p = (uint8 *) malloc(pixel_count * pal_img_n); + if (p == NULL) return e("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; + } + } + free(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi_unpremultiply_on_load = 0; +static int stbi_de_iphone_flag = 0; + +void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply; +} +void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi_de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi_de_iphone(png *z) +{ + stbi *s = z->s; + uint32 i, pixel_count = s->img_x * s->img_y; + uint8 *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + uint8 t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + assert(s->img_out_n == 4); + if (stbi_unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + uint8 a = p[3]; + uint8 t = p[0]; + if (a) { + p[0] = p[2] * 255 / a; + p[1] = p[1] * 255 / a; + p[2] = t * 255 / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + uint8 t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +static int parse_png_file(png *z, int scan, int req_comp) +{ + uint8 palette[1024], pal_img_n=0; + uint8 has_trans=0, tc[3]; + uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, iphone=0; + stbi *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!check_png_header(s)) return 0; + + if (scan == SCAN_type) return 1; + + for (;;) { + chunk c = get_chunk_header(s); + switch (c.type) { + case PNG_TYPE('C','g','B','I'): + iphone = stbi_de_iphone_flag; + skip(s, c.length); + break; + case PNG_TYPE('I','H','D','R'): { + int depth,color,comp,filter; + if (!first) return e("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); + s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); + s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); + depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); + color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); + comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG"); + filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG"); + interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return e("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 e("too large", "Image too large to decode"); + if (scan == SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case PNG_TYPE('P','L','T','E'): { + if (first) return e("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = get8u(s); + palette[i*4+1] = get8u(s); + palette[i*4+2] = get8u(s); + palette[i*4+3] = 255; + } + break; + } + + case PNG_TYPE('t','R','N','S'): { + if (first) return e("first not IHDR", "Corrupt PNG"); + if (z->idata) return e("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = get8u(s); + } else { + if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); + if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG"); + has_trans = 1; + for (k=0; k < s->img_n; ++k) + tc[k] = (uint8) get16(s); // non 8-bit images will be larger + } + break; + } + + case PNG_TYPE('I','D','A','T'): { + if (first) return e("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); + if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } + if (ioff + c.length > idata_limit) { + uint8 *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); + z->idata = p; + } + if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case PNG_TYPE('I','E','N','D'): { + uint32 raw_len; + if (first) return e("first not IHDR", "Corrupt PNG"); + if (scan != SCAN_load) return 1; + if (z->idata == NULL) return e("no IDAT","Corrupt PNG"); + z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone); + if (z->expanded == NULL) return 0; // zlib should set error + 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 (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; + if (has_trans) + if (!compute_transparency(z, tc, s->img_out_n)) return 0; + if (iphone && 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 (!expand_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } + free(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return e("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX chunk not known"; + invalid_chunk[0] = (uint8) (c.type >> 24); + invalid_chunk[1] = (uint8) (c.type >> 16); + invalid_chunk[2] = (uint8) (c.type >> 8); + invalid_chunk[3] = (uint8) (c.type >> 0); + #endif + return e(invalid_chunk, "PNG not supported: unknown chunk type"); + } + skip(s, c.length); + break; + } + // end of chunk, read and skip CRC + get32(s); + } +} + +static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp) +{ + unsigned char *result=NULL; + if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); + if (parse_png_file(p, SCAN_load, req_comp)) { + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + result = convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + free(p->out); p->out = NULL; + free(p->expanded); p->expanded = NULL; + free(p->idata); p->idata = NULL; + + return result; +} + +static unsigned char *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + png p; + p.s = s; + return do_png(&p, x,y,comp,req_comp); +} + +static int stbi_png_test(stbi *s) +{ + int r; + r = check_png_header(s); + stbi_rewind(s); + return r; +} + +static int stbi_png_info_raw(png *p, int *x, int *y, int *comp) +{ + if (!parse_png_file(p, 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 *s, int *x, int *y, int *comp) +{ + png p; + p.s = s; + return stbi_png_info_raw(&p, x, y, comp); +} + +// Microsoft/Windows BMP image + +static int bmp_test(stbi *s) +{ + int sz; + if (get8(s) != 'B') return 0; + if (get8(s) != 'M') return 0; + get32le(s); // discard filesize + get16le(s); // discard reserved + get16le(s); // discard reserved + get32le(s); // discard data offset + sz = get32le(s); + if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; + return 0; +} + +static int stbi_bmp_test(stbi *s) +{ + int r = bmp_test(s); + stbi_rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + uint8 *out; + unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; + stbi_uc pal[256][4]; + int psize=0,i,j,compress=0,width; + int bpp, flip_vertically, pad, target, offset, hsz; + if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP"); + get32le(s); // discard filesize + get16le(s); // discard reserved + get16le(s); // discard reserved + offset = get32le(s); + hsz = get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = get16le(s); + s->img_y = get16le(s); + } else { + s->img_x = get32le(s); + s->img_y = get32le(s); + } + if (get16le(s) != 1) return epuc("bad BMP", "bad BMP"); + bpp = get16le(s); + if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit"); + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + if (hsz == 12) { + if (bpp < 24) + psize = (offset - 14 - 24) / 3; + } else { + compress = get32le(s); + if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE"); + get32le(s); // discard sizeof + get32le(s); // discard hres + get32le(s); // discard vres + get32le(s); // discard colorsused + get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + get32le(s); + get32le(s); + get32le(s); + get32le(s); + } + if (bpp == 16 || bpp == 32) { + mr = mg = mb = 0; + if (compress == 0) { + if (bpp == 32) { + mr = 0xffu << 16; + mg = 0xffu << 8; + mb = 0xffu << 0; + ma = 0xffu << 24; + fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 + } else { + mr = 31u << 10; + mg = 31u << 5; + mb = 31u << 0; + } + } else if (compress == 3) { + mr = get32le(s); + mg = get32le(s); + mb = get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (mr == mg && mg == mb) { + // ?!?!? + return epuc("bad BMP", "bad BMP"); + } + } else + return epuc("bad BMP", "bad BMP"); + } + } else { + assert(hsz == 108); + mr = get32le(s); + mg = get32le(s); + mb = get32le(s); + ma = get32le(s); + get32le(s); // discard color space + for (i=0; i < 12; ++i) + get32le(s); // discard color space parameters + } + if (bpp < 16) + psize = (offset - 14 - hsz) >> 2; + } + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + out = (stbi_uc *) malloc(target * s->img_x * s->img_y); + if (!out) return epuc("outofmem", "Out of memory"); + if (bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = get8u(s); + pal[i][1] = get8u(s); + pal[i][0] = get8u(s); + if (hsz != 12) get8(s); + pal[i][3] = 255; + } + skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); + if (bpp == 4) width = (s->img_x + 1) >> 1; + else if (bpp == 8) width = s->img_x; + else { free(out); return epuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=get8(s),v2=0; + if (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 = (bpp == 8) ? get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + 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; + skip(s, offset - 14 - hsz); + if (bpp == 24) width = 3 * s->img_x; + else if (bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (bpp == 24) { + easy = 1; + } else if (bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { free(out); return epuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = high_bit(mr)-7; rcount = bitcount(mr); + gshift = high_bit(mg)-7; gcount = bitcount(mr); + bshift = high_bit(mb)-7; bcount = bitcount(mr); + ashift = high_bit(ma)-7; acount = bitcount(mr); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + int a; + out[z+2] = get8u(s); + out[z+1] = get8u(s); + out[z+0] = get8u(s); + z += 3; + a = (easy == 2 ? get8(s) : 255); + if (target == 4) out[z++] = (uint8) a; + } + } else { + for (i=0; i < (int) s->img_x; ++i) { + uint32 v = (bpp == 16 ? get16le(s) : get32le(s)); + int a; + out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount); + out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount); + out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount); + a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); + if (target == 4) out[z++] = (uint8) a; + } + } + skip(s, pad); + } + } + 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 = convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} + +static stbi_uc *stbi_bmp_load(stbi *s,int *x, int *y, int *comp, int req_comp) +{ + return bmp_load(s, x,y,comp,req_comp); +} + + +// Targa Truevision - TGA +// by Jonathan Dummer + +static int tga_info(stbi *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp; + int sz; + get8u(s); // discard Offset + sz = get8u(s); // color type + if( sz > 1 ) { + stbi_rewind(s); + return 0; // only RGB or indexed allowed + } + sz = get8u(s); // image type + // only RGB or grey allowed, +/- RLE + if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; + skip(s,9); + tga_w = get16le(s); + if( tga_w < 1 ) { + stbi_rewind(s); + return 0; // test width + } + tga_h = get16le(s); + if( tga_h < 1 ) { + stbi_rewind(s); + return 0; // test height + } + sz = get8(s); // bits per pixel + // only RGB or RGBA or grey allowed + if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { + stbi_rewind(s); + return 0; + } + tga_comp = sz; + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp / 8; + return 1; // seems to have passed everything +} + +int stbi_tga_info(stbi *s, int *x, int *y, int *comp) +{ + return tga_info(s, x, y, comp); +} + +static int tga_test(stbi *s) +{ + int sz; + get8u(s); // discard Offset + sz = get8u(s); // color type + if ( sz > 1 ) return 0; // only RGB or indexed allowed + sz = get8u(s); // image type + if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE + get16(s); // discard palette start + get16(s); // discard palette length + get8(s); // discard bits per palette color entry + get16(s); // discard x origin + get16(s); // discard y origin + if ( get16(s) < 1 ) return 0; // test width + if ( get16(s) < 1 ) return 0; // test height + sz = get8(s); // bits per pixel + if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed + return 1; // seems to have passed everything +} + +static int stbi_tga_test(stbi *s) +{ + int res = tga_test(s); + stbi_rewind(s); + return res; +} + +static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + // read in the TGA header stuff + int tga_offset = get8u(s); + int tga_indexed = get8u(s); + int tga_image_type = get8u(s); + int tga_is_RLE = 0; + int tga_palette_start = get16le(s); + int tga_palette_len = get16le(s); + int tga_palette_bits = get8u(s); + int tga_x_origin = get16le(s); + int tga_y_origin = get16le(s); + int tga_width = get16le(s); + int tga_height = get16le(s); + int tga_bits_per_pixel = get8u(s); + int tga_inverted = get8u(s); + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4]; + unsigned char trans_data[4]; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + /* int tga_alpha_bits = tga_inverted & 15; */ + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // error check + if ( //(tga_indexed) || + (tga_width < 1) || (tga_height < 1) || + (tga_image_type < 1) || (tga_image_type > 3) || + ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && + (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) + ) + { + return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA + } + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) + { + tga_bits_per_pixel = tga_palette_bits; + } + + // tga info + *x = tga_width; + *y = tga_height; + if ( (req_comp < 1) || (req_comp > 4) ) + { + // just use whatever the file was + req_comp = tga_bits_per_pixel / 8; + *comp = req_comp; + } else + { + // force a new number of components + *comp = tga_bits_per_pixel/8; + } + tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); + if (!tga_data) return epuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + skip(s, tga_offset ); + // do I need to load a palette? + if ( tga_indexed ) + { + // any data to skip? (offset usually = 0) + skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); + if (!tga_palette) return epuc("outofmem", "Out of memory"); + if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { + free(tga_data); + free(tga_palette); + return epuc("bad palette", "Corrupt TGA"); + } + } + // load the data + trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0; + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE chunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = get8u(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 1 byte, then perform the lookup + int pal_idx = get8u(s); + if ( pal_idx >= tga_palette_len ) + { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_bits_per_pixel / 8; + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else + { + // read in the data raw + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = get8u(s); + } + } + // convert raw to the intermediate format + switch (tga_bits_per_pixel) + { + case 8: + // Luminous => RGBA + trans_data[0] = raw_data[0]; + trans_data[1] = raw_data[0]; + trans_data[2] = raw_data[0]; + trans_data[3] = 255; + break; + case 16: + // Luminous,Alpha => RGBA + trans_data[0] = raw_data[0]; + trans_data[1] = raw_data[0]; + trans_data[2] = raw_data[0]; + trans_data[3] = raw_data[1]; + break; + case 24: + // BGR => RGBA + trans_data[0] = raw_data[2]; + trans_data[1] = raw_data[1]; + trans_data[2] = raw_data[0]; + trans_data[3] = 255; + break; + case 32: + // BGRA => RGBA + trans_data[0] = raw_data[2]; + trans_data[1] = raw_data[1]; + trans_data[2] = raw_data[0]; + trans_data[3] = raw_data[3]; + break; + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + // convert to final format + switch (req_comp) + { + case 1: + // RGBA => Luminance + tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); + break; + case 2: + // RGBA => Luminance,Alpha + tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); + tga_data[i*req_comp+1] = trans_data[3]; + break; + case 3: + // RGBA => RGB + tga_data[i*req_comp+0] = trans_data[0]; + tga_data[i*req_comp+1] = trans_data[1]; + tga_data[i*req_comp+2] = trans_data[2]; + break; + case 4: + // RGBA => RGBA + tga_data[i*req_comp+0] = trans_data[0]; + tga_data[i*req_comp+1] = trans_data[1]; + tga_data[i*req_comp+2] = trans_data[2]; + tga_data[i*req_comp+3] = trans_data[3]; + break; + } + // 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 * req_comp; + int index2 = (tga_height - 1 - j) * tga_width * req_comp; + for (i = tga_width * req_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 ) + { + free( tga_palette ); + } + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} + +static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return tga_load(s,x,y,comp,req_comp); +} + + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +static int psd_test(stbi *s) +{ + if (get32(s) != 0x38425053) return 0; // "8BPS" + else return 1; +} + +static int stbi_psd_test(stbi *s) +{ + int r = psd_test(s); + stbi_rewind(s); + return r; +} + +static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + int pixelCount; + int channelCount, compression; + int channel, i, count, len; + int w,h; + uint8 *out; + + // Check identifier + if (get32(s) != 0x38425053) // "8BPS" + return epuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (get16(s) != 1) + return epuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = get16(s); + if (channelCount < 0 || channelCount > 16) + return epuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = get32(s); + w = get32(s); + + // Make sure the depth is 8 bits. + if (get16(s) != 8) + return epuc("unsupported bit depth", "PSD bit depth is not 8 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 (get16(s) != 3) + return epuc("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.) + skip(s,get32(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + skip(s, get32(s) ); + + // Skip the reserved data. + skip(s, get32(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = get16(s); + if (compression > 1) + return epuc("bad compression", "PSD has an unknown compression format"); + + // Create the destination image. + out = (stbi_uc *) malloc(4 * w*h); + if (!out) return epuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + uint8 *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; + } else { + // Read the RLE data. + count = 0; + while (count < pixelCount) { + len = get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + count += len; + while (len) { + *p = get8u(s); + p += 4; + len--; + } + } else if (len > 128) { + uint8 val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len ^= 0x0FF; + len += 2; + val = get8u(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + uint8 *p; + + p = out + channel; + if (channel > channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; + } else { + // Read the data. + for (i = 0; i < pixelCount; i++) + *p = get8u(s), p += 4; + } + } + } + + if (req_comp && req_comp != 4) { + out = convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // convert_format frees input on failure + } + + if (comp) *comp = channelCount; + *y = h; + *x = w; + + return out; +} + +static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return psd_load(s,x,y,comp,req_comp); +} + +// ************************************************************************************************* +// 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/ + +static int pic_is4(stbi *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int pic_test(stbi *s) +{ + int i; + + if (!pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + get8(s); + + if (!pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} pic_packet_t; + +static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (at_eof(s)) return epuc("bad file","PIC file too short"); + dest[i]=get8u(s); + } + } + + return dest; +} + +static void pic_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 *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + pic_packet_t packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + pic_packet_t *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return epuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = get8(s); + packet->size = get8u(s); + packet->type = get8u(s); + packet->channel = get8u(s); + + act_comp |= packet->channel; + + if (at_eof(s)) return epuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return epuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return epuc("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=get8u(s); + if (at_eof(s)) return epuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (uint8) left; + + if (!pic_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 = get8(s), i; + if (at_eof(s)) return epuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + int i; + + if (count==128) + count = get16(s); + else + count -= 127; + if (count > left) + return epuc("bad file","scanline overrun"); + + if (!pic_readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return epuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp) +{ + stbi_uc *result; + int i, x,y; + + for (i=0; i<92; ++i) + get8(s); + + x = get16(s); + y = get16(s); + if (at_eof(s)) return epuc("bad file","file too short (pic header)"); + if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode"); + + get32(s); //skip `ratio' + get16(s); //skip `fields' + get16(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) malloc(x*y*4); + memset(result, 0xff, x*y*4); + + if (!pic_load2(s,x,y,comp, result)) { + free(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi_pic_test(stbi *s) +{ + int r = pic_test(s); + stbi_rewind(s); + return r; +} + +static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return pic_load(s,x,y,comp,req_comp); +} + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb +typedef struct stbi_gif_lzw_struct { + int16 prefix; + uint8 first; + uint8 suffix; +} stbi_gif_lzw; + +typedef struct stbi_gif_struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags; + uint8 pal[256][4]; + uint8 lpal[256][4]; + stbi_gif_lzw codes[4096]; + uint8 *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi_gif; + +static int gif_test(stbi *s) +{ + int sz; + if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0; + sz = get8(s); + if (sz != '9' && sz != '7') return 0; + if (get8(s) != 'a') return 0; + return 1; +} + +static int stbi_gif_test(stbi *s) +{ + int r = gif_test(s); + stbi_rewind(s); + return r; +} + +static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = get8u(s); + pal[i][1] = get8u(s); + pal[i][0] = get8u(s); + pal[i][3] = transp ? 0 : 255; + } +} + +static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info) +{ + uint8 version; + if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') + return e("not GIF", "Corrupt GIF"); + + version = get8u(s); + if (version != '7' && version != '9') return e("not GIF", "Corrupt GIF"); + if (get8(s) != 'a') return e("not GIF", "Corrupt GIF"); + + failure_reason = ""; + g->w = get16le(s); + g->h = get16le(s); + g->flags = get8(s); + g->bgindex = get8(s); + g->ratio = get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp) +{ + stbi_gif g; + if (!stbi_gif_header(s, &g, comp, 1)) { + stbi_rewind( s ); + return 0; + } + if (x) *x = g.w; + if (y) *y = g.h; + return 1; +} + +static void stbi_out_gif_code(stbi_gif *g, uint16 code) +{ + uint8 *p, *c; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi_out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g) +{ + uint8 lzw_cs; + int32 len, code; + uint32 first; + int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi_gif_lzw *p; + + lzw_cs = get8u(s); + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (code = 0; code < clear; code++) { + g->codes[code].prefix = -1; + g->codes[code].first = (uint8) code; + g->codes[code].suffix = (uint8) code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (int32) get8(s) << valid_bits; + valid_bits += 8; + } else { + 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 + skip(s, len); + while ((len = get8(s)) > 0) + skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return epuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return epuc("too many codes", "Corrupt GIF"); + p->prefix = (int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return epuc("illegal code in raster", "Corrupt GIF"); + + stbi_out_gif_code(g, (uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return epuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi_fill_gif_background(stbi_gif *g) +{ + int i; + uint8 *c = g->pal[g->bgindex]; + // @OPTIMIZE: write a dword at a time + for (i = 0; i < g->w * g->h * 4; i += 4) { + uint8 *p = &g->out[i]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp) +{ + int i; + uint8 *old_out = 0; + + if (g->out == 0) { + if (!stbi_gif_header(s, g, comp,0)) return 0; // failure_reason set by stbi_gif_header + g->out = (uint8 *) malloc(4 * g->w * g->h); + if (g->out == 0) return epuc("outofmem", "Out of memory"); + stbi_fill_gif_background(g); + } else { + // animated-gif-only path + if (((g->eflags & 0x1C) >> 2) == 3) { + old_out = g->out; + g->out = (uint8 *) malloc(4 * g->w * g->h); + if (g->out == 0) return epuc("outofmem", "Out of memory"); + memcpy(g->out, old_out, g->w*g->h*4); + } + } + + for (;;) { + switch (get8(s)) { + case 0x2C: /* Image Descriptor */ + { + int32 x, y, w, h; + uint8 *o; + + x = get16le(s); + y = get16le(s); + w = get16le(s); + h = get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return epuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = 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 = (uint8 *) g->lpal; + } else if (g->flags & 0x80) { + for (i=0; i < 256; ++i) // @OPTIMIZE: reset only the previous transparent + g->pal[i][3] = 255; + if (g->transparent >= 0 && (g->eflags & 0x01)) + g->pal[g->transparent][3] = 0; + g->color_table = (uint8 *) g->pal; + } else + return epuc("missing color table", "Corrupt GIF"); + + o = stbi_process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (req_comp && req_comp != 4) + o = convert_format(o, 4, req_comp, g->w, g->h); + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (get8(s) == 0xF9) { // Graphic Control Extension. + len = get8(s); + if (len == 4) { + g->eflags = get8(s); + get16le(s); // delay + g->transparent = get8(s); + } else { + skip(s, len); + break; + } + } + while ((len = get8(s)) != 0) + skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (uint8 *) 1; + + default: + return epuc("unknown code", "Corrupt GIF"); + } + } +} + +static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + uint8 *u = 0; + stbi_gif g={0}; + + u = stbi_gif_load_next(s, &g, comp, req_comp); + if (u == (void *) 1) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + } + + return u; +} + +static int stbi_gif_info(stbi *s, int *x, int *y, int *comp) +{ + return stbi_gif_info_raw(s,x,y,comp); +} + + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int hdr_test(stbi *s) +{ + const char *signature = "#?RADIANCE\n"; + int i; + for (i=0; signature[i]; ++i) + if (get8(s) != signature[i]) + return 0; + return 1; +} + +static int stbi_hdr_test(stbi* s) +{ + int r = hdr_test(s); + stbi_rewind(s); + return r; +} + +#define HDR_BUFLEN 1024 +static char *hdr_gettoken(stbi *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) get8(z); + + while (!at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == HDR_BUFLEN-1) { + // flush to end of line + while (!at_eof(z) && get8(z) != '\n') + ; + break; + } + c = (char) get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void 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 *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + char buffer[HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + + + // Check identifier + if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + return epf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return epf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = strtol(token, NULL, 10); + + *x = width; + *y = height; + + *comp = 3; + if (req_comp == 0) req_comp = 3; + + // Read data + hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + getn(s, rgbe, 4); + 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 = get8(s); + c2 = get8(s); + len = 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) + uint8 rgbe[4]; + rgbe[0] = (uint8) c1; + rgbe[1] = (uint8) c2; + rgbe[2] = (uint8) len; + rgbe[3] = (uint8) get8u(s); + hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + free(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= get8(s); + if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); + + for (k = 0; k < 4; ++k) { + i = 0; + while (i < width) { + count = get8u(s); + if (count > 128) { + // Run + value = get8u(s); + count -= 128; + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = get8u(s); + } + } + } + for (i=0; i < width; ++i) + hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + free(scanline); + } + + return hdr_data; +} + +static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) +{ + return hdr_load(s,x,y,comp,req_comp); +} + +static int stbi_hdr_info(stbi *s, int *x, int *y, int *comp) +{ + char buffer[HDR_BUFLEN]; + char *token; + int valid = 0; + + if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { + stbi_rewind( s ); + return 0; + } + + for(;;) { + token = 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 = hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi_rewind( s ); + return 0; + } + token += 3; + *y = strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi_rewind( s ); + return 0; + } + token += 3; + *x = strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +static int stbi_bmp_info(stbi *s, int *x, int *y, int *comp) +{ + int hsz; + if (get8(s) != 'B' || get8(s) != 'M') { + stbi_rewind( s ); + return 0; + } + skip(s,12); + hsz = get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) { + stbi_rewind( s ); + return 0; + } + if (hsz == 12) { + *x = get16le(s); + *y = get16le(s); + } else { + *x = get32le(s); + *y = get32le(s); + } + if (get16le(s) != 1) { + stbi_rewind( s ); + return 0; + } + *comp = get16le(s) / 8; + return 1; +} + +static int stbi_psd_info(stbi *s, int *x, int *y, int *comp) +{ + int channelCount; + if (get32(s) != 0x38425053) { + stbi_rewind( s ); + return 0; + } + if (get16(s) != 1) { + stbi_rewind( s ); + return 0; + } + skip(s, 6); + channelCount = get16(s); + if (channelCount < 0 || channelCount > 16) { + stbi_rewind( s ); + return 0; + } + *y = get32(s); + *x = get32(s); + if (get16(s) != 8) { + stbi_rewind( s ); + return 0; + } + if (get16(s) != 3) { + stbi_rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi_pic_info(stbi *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained; + pic_packet_t packets[10]; + + skip(s, 92); + + *x = get16(s); + *y = get16(s); + if (at_eof(s)) return 0; + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi_rewind( s ); + return 0; + } + + skip(s, 8); + + do { + pic_packet_t *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = get8(s); + packet->size = get8u(s); + packet->type = get8u(s); + packet->channel = get8u(s); + act_comp |= packet->channel; + + if (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; +} + +static int stbi_info_main(stbi *s, int *x, int *y, int *comp) +{ + if (stbi_jpeg_info(s, x, y, comp)) + return 1; + if (stbi_png_info(s, x, y, comp)) + return 1; + if (stbi_gif_info(s, x, y, comp)) + return 1; + if (stbi_bmp_info(s, x, y, comp)) + return 1; + if (stbi_psd_info(s, x, y, comp)) + return 1; + if (stbi_pic_info(s, x, y, comp)) + return 1; + #ifndef STBI_NO_HDR + if (stbi_hdr_info(s, x, y, comp)) + return 1; + #endif + // test tga last because it's a crappy test! + if (stbi_tga_info(s, x, y, comp)) + return 1; + return e("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = fopen(filename, "rb"); + int result; + if (!f) return e("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi s; + long pos = ftell(f); + start_file(&s, f); + r = stbi_info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi s; + start_mem(&s,buffer,len); + return stbi_info_main(&s,x,y,comp); +} + +int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi s; + start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi_info_main(&s,x,y,comp); +} + +#endif // STBI_HEADER_FILE_ONLY + +/* + revision history: + 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-uint8 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.e. Janez (U+017D)emva) + 1.21 fix use of 'uint8' 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 - 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 first released version +*/ diff --git a/src/stb_image.h b/src/stb_image.h new file mode 100644 index 000000000..900e0c207 --- /dev/null +++ b/src/stb_image.h @@ -0,0 +1,334 @@ +/* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c + when you control the images you're loading + no warranty implied; use at your own risk + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline (no JPEG progressive) + PNG 8-bit-per-channel only + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) + + Latest revisions: + 1.33 (2011-07-14) minor fixes suggested by Dave Moore + 1.32 (2011-07-13) info support for all filetypes (SpartanJ) + 1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger) + 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-uint8 to fix warnings (Laurent Gomila) + allow trailing 0s at end of image data (Laurent Gomila) + 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ + + See end of file for full revision history. + + TODO: + stbi_info support for BMP,PSD,HDR,PIC + + + ============================ Contributors ========================= + + Image formats Optimizations & bugfixes + Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen + Nicolas Schulz (hdr, psd) + Jonathan Dummer (tga) Bug fixes & warning fixes + Jean-Marc Lienher (gif) Marc LeBlanc + Tom Seddon (pic) Christpher Lloyd + Thatcher Ulrich (psd) Dave Moore + Won Chun + the Horde3D community + Extensions, features Janez Zemva + Jetro Lauha (stbi_info) Jonathan Blow + James "moose2000" Brown (iPhone PNG) Laurent Gomila + Ben "Disch" Wenger (io callbacks) Aruelien Pocheville + Martin "SpartanJ" Golini Ryamond Barbiero + David Woo + + + If your name should be here but isn't, let Sean know. + +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// To get a header file for this, either cut and paste the header, +// or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and +// then include stb_image.c from it. + +//// begin header file //////////////////////////////////////////////////// +// +// Limitations: +// - no jpeg progressive support +// - non-HDR formats support 8-bit samples only (jpeg, png) +// - no delayed line count (jpeg) -- IJG doesn't support either +// - no 1-bit BMP +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below): +// 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 *comp -- outputs # of image components in image file +// int req_comp -- 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. 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 'req_comp' if req_comp is non-zero, or *comp otherwise. +// If req_comp is non-zero, *comp has the number of components that _would_ +// have been output otherwise. E.g. if you set req_comp to 4, you will always +// get RGBA output, but you can check *comp to easily see if it's opaque. +// +// 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, *comp 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. +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB; nominally they +// would silently load as BGR, except the existing code should have just +// failed on such iPhone PNGs. But you can disable this conversion by +// by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through. +// +// 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). +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. 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); +// +// =========================================================================== +// +// 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). + + +#define STBI_NO_HDR // RaySan: not required by raylib + +#ifndef STBI_NO_STDIO + +#if defined(_MSC_VER) && _MSC_VER >= 0x1400 +#define _CRT_SECURE_NO_WARNINGS // suppress bogus warnings about fopen() +#endif + +#include +#endif + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for req_comp + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; + +#ifdef __cplusplus +extern "C" { +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_STDIO +extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); +extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +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,unsigned n); // skip the next 'n' bytes + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +extern stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_HDR + extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + + #ifndef STBI_NO_STDIO + extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); + extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + #endif + + extern float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + + extern void stbi_hdr_to_ldr_gamma(float gamma); + extern void stbi_hdr_to_ldr_scale(float scale); + + extern void stbi_ldr_to_hdr_gamma(float gamma); + extern void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_HDR + +// stbi_is_hdr is always defined +extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +extern int stbi_is_hdr (char const *filename); +extern int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +extern const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +extern void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +extern int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +extern int stbi_info (char const *filename, int *x, int *y, int *comp); +extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +extern 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" +extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + + +// ZLIB client - used by PNG, available for other purposes + +extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +// define faster low-level operations (typically SIMD support) +#ifdef STBI_SIMD +typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); +// compute an integer IDCT on "input" +// input[x] = data[x] * dequantize[x] +// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' +// CLAMP results to 0..255 +typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); +// compute a conversion from YCbCr to RGB +// 'count' pixels +// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B +// y: Y input channel +// cb: Cb input channel; scale/biased to be 0..255 +// cr: Cr input channel; scale/biased to be 0..255 + +extern void stbi_install_idct(stbi_idct_8x8 func); +extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); +#endif // STBI_SIMD + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H \ No newline at end of file diff --git a/src/stb_vorbis.c b/src/stb_vorbis.c new file mode 100644 index 000000000..cf7ad1d43 --- /dev/null +++ b/src/stb_vorbis.c @@ -0,0 +1,5039 @@ +// Ogg Vorbis I audio decoder -- version 0.99996 +// +// Written in April 2007 by Sean Barrett, sponsored by RAD Game Tools. +// +// Placed in the public domain April 2007 by the author: no copyright is +// claimed, and you may use it for any purpose you like. +// +// No warranty for any purpose is expressed or implied by the author (nor +// by RAD Game Tools). Report bugs and send enhancements to the author. +// +// Get the latest version and other information at: +// http://nothings.org/stb_vorbis/ + +// Todo: +// +// - seeking (note you can seek yourself using the pushdata API) +// +// Limitations: +// +// - floor 0 not supported (used in old ogg vorbis files) +// - lossless sample-truncation at beginning ignored +// - cannot concatenate multiple vorbis streams +// - sample positions are 32-bit, limiting seekable 192Khz +// files to around 6 hours (Ogg supports 64-bit) +// +// All of these limitations may be removed in future versions. + +#ifndef STB_VORBIS_HEADER_ONLY + +// global configuration settings (e.g. set these in the project/makefile), +// or just set them in this file at the top (although ideally the first few +// should be visible when the header file is compiled too, although it's not +// crucial) + +// STB_VORBIS_NO_PUSHDATA_API +// does not compile the code for the various stb_vorbis_*_pushdata() +// functions +// #define STB_VORBIS_NO_PUSHDATA_API + +// STB_VORBIS_NO_PULLDATA_API +// does not compile the code for the non-pushdata APIs +// #define STB_VORBIS_NO_PULLDATA_API + +// STB_VORBIS_NO_STDIO +// does not compile the code for the APIs that use FILE *s internally +// or externally (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_STDIO + +// STB_VORBIS_NO_INTEGER_CONVERSION +// does not compile the code for converting audio sample data from +// float to integer (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_INTEGER_CONVERSION + +// STB_VORBIS_NO_FAST_SCALED_FLOAT +// does not use a fast float-to-int trick to accelerate float-to-int on +// most platforms which requires endianness be defined correctly. +//#define STB_VORBIS_NO_FAST_SCALED_FLOAT + + +// STB_VORBIS_MAX_CHANNELS [number] +// globally define this to the maximum number of channels you need. +// The spec does not put a restriction on channels except that +// the count is stored in a byte, so 255 is the hard limit. +// Reducing this saves about 16 bytes per value, so using 16 saves +// (255-16)*16 or around 4KB. Plus anything other memory usage +// I forgot to account for. Can probably go as low as 8 (7.1 audio), +// 6 (5.1 audio), or 2 (stereo only). +#ifndef STB_VORBIS_MAX_CHANNELS +#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone? +#endif + +// STB_VORBIS_PUSHDATA_CRC_COUNT [number] +// after a flush_pushdata(), stb_vorbis begins scanning for the +// next valid page, without backtracking. when it finds something +// that looks like a page, it streams through it and verifies its +// CRC32. Should that validation fail, it keeps scanning. But it's +// possible that _while_ streaming through to check the CRC32 of +// one candidate page, it sees another candidate page. This #define +// determines how many "overlapping" candidate pages it can search +// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas +// garbage pages could be as big as 64KB, but probably average ~16KB. +// So don't hose ourselves by scanning an apparent 64KB page and +// missing a ton of real ones in the interim; so minimum of 2 +#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT +#define STB_VORBIS_PUSHDATA_CRC_COUNT 4 +#endif + +// STB_VORBIS_FAST_HUFFMAN_LENGTH [number] +// sets the log size of the huffman-acceleration table. Maximum +// supported value is 24. with larger numbers, more decodings are O(1), +// but the table size is larger so worse cache missing, so you'll have +// to probe (and try multiple ogg vorbis files) to find the sweet spot. +#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH +#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10 +#endif + +// STB_VORBIS_FAST_BINARY_LENGTH [number] +// sets the log size of the binary-search acceleration table. this +// is used in similar fashion to the fast-huffman size to set initial +// parameters for the binary search + +// STB_VORBIS_FAST_HUFFMAN_INT +// The fast huffman tables are much more efficient if they can be +// stored as 16-bit results instead of 32-bit results. This restricts +// the codebooks to having only 65535 possible outcomes, though. +// (At least, accelerated by the huffman table.) +#ifndef STB_VORBIS_FAST_HUFFMAN_INT +#define STB_VORBIS_FAST_HUFFMAN_SHORT +#endif + +// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH +// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls +// back on binary searching for the correct one. This requires storing +// extra tables with the huffman codes in sorted order. Defining this +// symbol trades off space for speed by forcing a linear search in the +// non-fast case, except for "sparse" codebooks. +// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + +// STB_VORBIS_DIVIDES_IN_RESIDUE +// stb_vorbis precomputes the result of the scalar residue decoding +// that would otherwise require a divide per chunk. you can trade off +// space for time by defining this symbol. +// #define STB_VORBIS_DIVIDES_IN_RESIDUE + +// STB_VORBIS_DIVIDES_IN_CODEBOOK +// vorbis VQ codebooks can be encoded two ways: with every case explicitly +// stored, or with all elements being chosen from a small range of values, +// and all values possible in all elements. By default, stb_vorbis expands +// this latter kind out to look like the former kind for ease of decoding, +// because otherwise an integer divide-per-vector-element is required to +// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can +// trade off storage for speed. +//#define STB_VORBIS_DIVIDES_IN_CODEBOOK + +// STB_VORBIS_CODEBOOK_SHORTS +// The vorbis file format encodes VQ codebook floats as ax+b where a and +// b are floating point per-codebook constants, and x is a 16-bit int. +// Normally, stb_vorbis decodes them to floats rather than leaving them +// as 16-bit ints and computing ax+b while decoding. This is a speed/space +// tradeoff; you can save space by defining this flag. +#ifndef STB_VORBIS_CODEBOOK_SHORTS +#define STB_VORBIS_CODEBOOK_FLOATS +#endif + +// STB_VORBIS_DIVIDE_TABLE +// this replaces small integer divides in the floor decode loop with +// table lookups. made less than 1% difference, so disabled by default. + +// STB_VORBIS_NO_INLINE_DECODE +// disables the inlining of the scalar codebook fast-huffman decode. +// might save a little codespace; useful for debugging +// #define STB_VORBIS_NO_INLINE_DECODE + +// STB_VORBIS_NO_DEFER_FLOOR +// Normally we only decode the floor without synthesizing the actual +// full curve. We can instead synthesize the curve immediately. This +// requires more memory and is very likely slower, so I don't think +// you'd ever want to do it except for debugging. +// #define STB_VORBIS_NO_DEFER_FLOOR + + + + +////////////////////////////////////////////////////////////////////////////// + +#ifdef STB_VORBIS_NO_PULLDATA_API + #define STB_VORBIS_NO_INTEGER_CONVERSION + #define STB_VORBIS_NO_STDIO +#endif + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) + #define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + + // only need endianness for fast-float-to-int, which we don't + // use for pushdata + + #ifndef STB_VORBIS_BIG_ENDIAN + #define STB_VORBIS_ENDIAN 0 + #else + #define STB_VORBIS_ENDIAN 1 + #endif + +#endif +#endif + + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifndef STB_VORBIS_NO_CRT +#include +#include +#include +#include +#if !(defined(__APPLE__) || defined(MACOSX) || defined(macintosh) || defined(Macintosh)) +#include +#endif +#else +#define NULL 0 +#endif + +#ifndef _MSC_VER + #if __GNUC__ + #define __forceinline inline + #else + #define __forceinline + #endif +#endif + +#if STB_VORBIS_MAX_CHANNELS > 256 +#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range" +#endif + +#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24 +#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range" +#endif + + +#define MAX_BLOCKSIZE_LOG 13 // from specification +#define MAX_BLOCKSIZE (1 << MAX_BLOCKSIZE_LOG) + + +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#ifdef STB_VORBIS_CODEBOOK_FLOATS +typedef float codetype; +#else +typedef uint16 codetype; +#endif + +// @NOTE +// +// Some arrays below are tagged "//varies", which means it's actually +// a variable-sized piece of data, but rather than malloc I assume it's +// small enough it's better to just allocate it all together with the +// main thing +// +// Most of the variables are specified with the smallest size I could pack +// them into. It might give better performance to make them all full-sized +// integers. It should be safe to freely rearrange the structures or change +// the sizes larger--nothing relies on silently truncating etc., nor the +// order of variables. + +#define FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH) +#define FAST_HUFFMAN_TABLE_MASK (FAST_HUFFMAN_TABLE_SIZE - 1) + +typedef struct +{ + int dimensions, entries; + uint8 *codeword_lengths; + float minimum_value; + float delta_value; + uint8 value_bits; + uint8 lookup_type; + uint8 sequence_p; + uint8 sparse; + uint32 lookup_values; + codetype *multiplicands; + uint32 *codewords; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + int16 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #else + int32 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #endif + uint32 *sorted_codewords; + int *sorted_values; + int sorted_entries; +} Codebook; + +typedef struct +{ + uint8 order; + uint16 rate; + uint16 bark_map_size; + uint8 amplitude_bits; + uint8 amplitude_offset; + uint8 number_of_books; + uint8 book_list[16]; // varies +} Floor0; + +typedef struct +{ + uint8 partitions; + uint8 partition_class_list[32]; // varies + uint8 class_dimensions[16]; // varies + uint8 class_subclasses[16]; // varies + uint8 class_masterbooks[16]; // varies + int16 subclass_books[16][8]; // varies + uint16 Xlist[31*8+2]; // varies + uint8 sorted_order[31*8+2]; + uint8 neighbors[31*8+2][2]; + uint8 floor1_multiplier; + uint8 rangebits; + int values; +} Floor1; + +typedef union +{ + Floor0 floor0; + Floor1 floor1; +} Floor; + +typedef struct +{ + uint32 begin, end; + uint32 part_size; + uint8 classifications; + uint8 classbook; + uint8 **classdata; + int16 (*residue_books)[8]; +} Residue; + +typedef struct +{ + uint8 magnitude; + uint8 angle; + uint8 mux; +} MappingChannel; + +typedef struct +{ + uint16 coupling_steps; + MappingChannel *chan; + uint8 submaps; + uint8 submap_floor[15]; // varies + uint8 submap_residue[15]; // varies +} Mapping; + +typedef struct +{ + uint8 blockflag; + uint8 mapping; + uint16 windowtype; + uint16 transformtype; +} Mode; + +typedef struct +{ + uint32 goal_crc; // expected crc if match + int bytes_left; // bytes left in packet + uint32 crc_so_far; // running crc + int bytes_done; // bytes processed in _current_ chunk + uint32 sample_loc; // granule pos encoded in page +} CRCscan; + +typedef struct +{ + uint32 page_start, page_end; + uint32 after_previous_page_start; + uint32 first_decoded_sample; + uint32 last_decoded_sample; +} ProbedPage; + +struct stb_vorbis +{ + // user-accessible info + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int temp_memory_required; + unsigned int setup_temp_memory_required; + + // input config +#ifndef STB_VORBIS_NO_STDIO + FILE *f; + uint32 f_start; + int close_on_free; +#endif + + uint8 *stream; + uint8 *stream_start; + uint8 *stream_end; + + uint32 stream_len; + + uint8 push_mode; + + uint32 first_audio_page_offset; + + ProbedPage p_first, p_last; + + // memory management + stb_vorbis_alloc alloc; + int setup_offset; + int temp_offset; + + // run-time results + int eof; + enum STBVorbisError error; + + // user-useful data + + // header info + int blocksize[2]; + int blocksize_0, blocksize_1; + int codebook_count; + Codebook *codebooks; + int floor_count; + uint16 floor_types[64]; // varies + Floor *floor_config; + int residue_count; + uint16 residue_types[64]; // varies + Residue *residue_config; + int mapping_count; + Mapping *mapping; + int mode_count; + Mode mode_config[64]; // varies + + uint32 total_samples; + + // decode buffer + float *channel_buffers[STB_VORBIS_MAX_CHANNELS]; + float *outputs [STB_VORBIS_MAX_CHANNELS]; + + float *previous_window[STB_VORBIS_MAX_CHANNELS]; + int previous_length; + + #ifndef STB_VORBIS_NO_DEFER_FLOOR + int16 *finalY[STB_VORBIS_MAX_CHANNELS]; + #else + float *floor_buffers[STB_VORBIS_MAX_CHANNELS]; + #endif + + uint32 current_loc; // sample location of next frame to decode + int current_loc_valid; + + // per-blocksize precomputed data + + // twiddle factors + float *A[2],*B[2],*C[2]; + float *window[2]; + uint16 *bit_reverse[2]; + + // current page/packet/segment streaming info + uint32 serial; // stream serial number for verification + int last_page; + int segment_count; + uint8 segments[255]; + uint8 page_flag; + uint8 bytes_in_seg; + uint8 first_decode; + int next_seg; + int last_seg; // flag that we're on the last segment + int last_seg_which; // what was the segment number of the last seg? + uint32 acc; + int valid_bits; + int packet_bytes; + int end_seg_with_known_loc; + uint32 known_loc_for_packet; + int discard_samples_deferred; + uint32 samples_output; + + // push mode scanning + int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching +#ifndef STB_VORBIS_NO_PUSHDATA_API + CRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT]; +#endif + + // sample-access + int channel_buffer_start; + int channel_buffer_end; +}; + +extern int my_prof(int slot); +//#define stb_prof my_prof + +#ifndef stb_prof +#define stb_prof(x) 0 +#endif + +#if defined(STB_VORBIS_NO_PUSHDATA_API) + #define IS_PUSH_MODE(f) FALSE +#elif defined(STB_VORBIS_NO_PULLDATA_API) + #define IS_PUSH_MODE(f) TRUE +#else + #define IS_PUSH_MODE(f) ((f)->push_mode) +#endif + +typedef struct stb_vorbis vorb; + +static int error(vorb *f, enum STBVorbisError e) +{ + f->error = e; + if (!f->eof && e != VORBIS_need_more_data) { + f->error=e; // breakpoint for debugging + } + return 0; +} + + +// these functions are used for allocating temporary memory +// while decoding. if you can afford the stack space, use +// alloca(); otherwise, provide a temp buffer and it will +// allocate out of those. + +#define array_size_required(count,size) (count*(sizeof(void *)+(size))) + +#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) +#ifdef dealloca +#define temp_free(f,p) (f->alloc.alloc_buffer ? 0 : dealloca(size)) +#else +#define temp_free(f,p) 0 +#endif +#define temp_alloc_save(f) ((f)->temp_offset) +#define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) + +#define temp_block_array(f,count,size) make_block_array(temp_alloc(f,array_size_required(count,size)), count, size) + +// given a sufficiently large block of memory, make an array of pointers to subblocks of it +static void *make_block_array(void *mem, int count, int size) +{ + int i; + void ** p = (void **) mem; + char *q = (char *) (p + count); + for (i=0; i < count; ++i) { + p[i] = q; + q += size; + } + return p; +} + +static void *setup_malloc(vorb *f, int sz) +{ + sz = (sz+3) & ~3; + f->setup_memory_required += sz; + if (f->alloc.alloc_buffer) { + void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; + if (f->setup_offset + sz > f->temp_offset) return NULL; + f->setup_offset += sz; + return p; + } + return sz ? malloc(sz) : NULL; +} + +static void setup_free(vorb *f, void *p) +{ + if (f->alloc.alloc_buffer) return; // do nothing; setup mem is not a stack + free(p); +} + +static void *setup_temp_malloc(vorb *f, int sz) +{ + sz = (sz+3) & ~3; + if (f->alloc.alloc_buffer) { + if (f->temp_offset - sz < f->setup_offset) return NULL; + f->temp_offset -= sz; + return (char *) f->alloc.alloc_buffer + f->temp_offset; + } + return malloc(sz); +} + +static void setup_temp_free(vorb *f, void *p, size_t sz) +{ + if (f->alloc.alloc_buffer) { + f->temp_offset += (sz+3)&~3; + return; + } + free(p); +} + +#define CRC32_POLY 0x04c11db7 // from spec + +static uint32 crc_table[256]; +static void crc32_init(void) +{ + int i,j; + uint32 s; + for(i=0; i < 256; i++) { + for (s=i<<24, j=0; j < 8; ++j) + s = (s << 1) ^ (s >= (1<<31) ? CRC32_POLY : 0); + crc_table[i] = s; + } +} + +static __forceinline uint32 crc32_update(uint32 crc, uint8 byte) +{ + return (crc << 8) ^ crc_table[byte ^ (crc >> 24)]; +} + + +// used in setup, and for huffman that doesn't go fast path +static unsigned int bit_reverse(unsigned int n) +{ + n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); + n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); + n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); + n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); + return (n >> 16) | (n << 16); +} + +static float square(float x) +{ + return x*x; +} + +// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3 +// as required by the specification. fast(?) implementation from stb.h +// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup +static int ilog(int32 n) +{ + static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; + + // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) + if (n < (1U << 14)) + if (n < (1U << 4)) return 0 + log2_4[n ]; + else if (n < (1U << 9)) return 5 + log2_4[n >> 5]; + else return 10 + log2_4[n >> 10]; + else if (n < (1U << 24)) + if (n < (1U << 19)) return 15 + log2_4[n >> 15]; + else return 20 + log2_4[n >> 20]; + else if (n < (1U << 29)) return 25 + log2_4[n >> 25]; + else if (n < (1U << 31)) return 30 + log2_4[n >> 30]; + else return 0; // signed n returns 0 +} + +#ifndef M_PI + #define M_PI 3.14159265358979323846264f // from CRC +#endif + +// code length assigned to a value with no huffman encoding +#define NO_CODE 255 + +/////////////////////// LEAF SETUP FUNCTIONS ////////////////////////// +// +// these functions are only called at setup, and only a few times +// per file + +static float float32_unpack(uint32 x) +{ + // from the specification + uint32 mantissa = x & 0x1fffff; + uint32 sign = x & 0x80000000; + uint32 exp = (x & 0x7fe00000) >> 21; + double res = sign ? -(double)mantissa : (double)mantissa; + return (float) ldexp((float)res, exp-788); +} + + +// zlib & jpeg huffman tables assume that the output symbols +// can either be arbitrarily arranged, or have monotonically +// increasing frequencies--they rely on the lengths being sorted; +// this makes for a very simple generation algorithm. +// vorbis allows a huffman table with non-sorted lengths. This +// requires a more sophisticated construction, since symbols in +// order do not map to huffman codes "in order". +static void add_entry(Codebook *c, uint32 huff_code, int symbol, int count, int len, uint32 *values) +{ + if (!c->sparse) { + c->codewords [symbol] = huff_code; + } else { + c->codewords [count] = huff_code; + c->codeword_lengths[count] = len; + values [count] = symbol; + } +} + +static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) +{ + int i,k,m=0; + uint32 available[32]; + + memset(available, 0, sizeof(available)); + // find the first entry + for (k=0; k < n; ++k) if (len[k] < NO_CODE) break; + if (k == n) { assert(c->sorted_entries == 0); return TRUE; } + // add to the list + add_entry(c, 0, k, m++, len[k], values); + // add all available leaves + for (i=1; i <= len[k]; ++i) + available[i] = 1 << (32-i); + // note that the above code treats the first case specially, + // but it's really the same as the following code, so they + // could probably be combined (except the initial code is 0, + // and I use 0 in available[] to mean 'empty') + for (i=k+1; i < n; ++i) { + uint32 res; + int z = len[i], y; + if (z == NO_CODE) continue; + // find lowest available leaf (should always be earliest, + // which is what the specification calls for) + // note that this property, and the fact we can never have + // more than one free leaf at a given level, isn't totally + // trivial to prove, but it seems true and the assert never + // fires, so! + while (z > 0 && !available[z]) --z; + if (z == 0) { assert(0); return FALSE; } + res = available[z]; + available[z] = 0; + add_entry(c, bit_reverse(res), i, m++, len[i], values); + // propogate availability up the tree + if (z != len[i]) { + for (y=len[i]; y > z; --y) { + assert(available[y] == 0); + available[y] = res + (1 << (32-y)); + } + } + } + return TRUE; +} + +// accelerated huffman table allows fast O(1) match of all symbols +// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH +static void compute_accelerated_huffman(Codebook *c) +{ + int i, len; + for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) + c->fast_huffman[i] = -1; + + len = c->sparse ? c->sorted_entries : c->entries; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + if (len > 32767) len = 32767; // largest possible value we can encode! + #endif + for (i=0; i < len; ++i) { + if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) { + uint32 z = c->sparse ? bit_reverse(c->sorted_codewords[i]) : c->codewords[i]; + // set table entries for all bit combinations in the higher bits + while (z < FAST_HUFFMAN_TABLE_SIZE) { + c->fast_huffman[z] = i; + z += 1 << c->codeword_lengths[i]; + } + } + } +} + +static int uint32_compare(const void *p, const void *q) +{ + uint32 x = * (uint32 *) p; + uint32 y = * (uint32 *) q; + return x < y ? -1 : x > y; +} + +static int include_in_sort(Codebook *c, uint8 len) +{ + if (c->sparse) { assert(len != NO_CODE); return TRUE; } + if (len == NO_CODE) return FALSE; + if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE; + return FALSE; +} + +// if the fast table above doesn't work, we want to binary +// search them... need to reverse the bits +static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) +{ + int i, len; + // build a list of all the entries + // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN. + // this is kind of a frivolous optimization--I don't see any performance improvement, + // but it's like 4 extra lines of code, so. + if (!c->sparse) { + int k = 0; + for (i=0; i < c->entries; ++i) + if (include_in_sort(c, lengths[i])) + c->sorted_codewords[k++] = bit_reverse(c->codewords[i]); + assert(k == c->sorted_entries); + } else { + for (i=0; i < c->sorted_entries; ++i) + c->sorted_codewords[i] = bit_reverse(c->codewords[i]); + } + + qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), uint32_compare); + c->sorted_codewords[c->sorted_entries] = 0xffffffff; + + len = c->sparse ? c->sorted_entries : c->entries; + // now we need to indicate how they correspond; we could either + // #1: sort a different data structure that says who they correspond to + // #2: for each sorted entry, search the original list to find who corresponds + // #3: for each original entry, find the sorted entry + // #1 requires extra storage, #2 is slow, #3 can use binary search! + for (i=0; i < len; ++i) { + int huff_len = c->sparse ? lengths[values[i]] : lengths[i]; + if (include_in_sort(c,huff_len)) { + uint32 code = bit_reverse(c->codewords[i]); + int x=0, n=c->sorted_entries; + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + assert(c->sorted_codewords[x] == code); + if (c->sparse) { + c->sorted_values[x] = values[i]; + c->codeword_lengths[x] = huff_len; + } else { + c->sorted_values[x] = i; + } + } + } +} + +// only run while parsing the header (3 times) +static int vorbis_validate(uint8 *data) +{ + static uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' }; + return memcmp(data, vorbis, 6) == 0; +} + +// called from setup only, once per code book +// (formula implied by specification) +static int lookup1_values(int entries, int dim) +{ + int r = (int) floor(exp((float) log((float) entries) / dim)); + if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning; + ++r; // floor() to avoid _ftol() when non-CRT + assert(pow((float) r+1, dim) > entries); + assert((int) floor(pow((float) r, dim)) <= entries); // (int),floor() as above + return r; +} + +// called twice per file +static void compute_twiddle_factors(int n, float *A, float *B, float *C) +{ + int n4 = n >> 2, n8 = n >> 3; + int k,k2; + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f; + B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f; + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } +} + +static void compute_window(int n, float *window) +{ + int n2 = n >> 1, i; + for (i=0; i < n2; ++i) + window[i] = (float) sin(0.5 * M_PI * square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI))); +} + +static void compute_bitreverse(int n, uint16 *rev) +{ + int ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + int i, n8 = n >> 3; + for (i=0; i < n8; ++i) + rev[i] = (bit_reverse(i) >> (32-ld+3)) << 2; +} + +static int init_blocksize(vorb *f, int b, int n) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3; + f->A[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->B[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->C[b] = (float *) setup_malloc(f, sizeof(float) * n4); + if (!f->A[b] || !f->B[b] || !f->C[b]) return error(f, VORBIS_outofmem); + compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]); + f->window[b] = (float *) setup_malloc(f, sizeof(float) * n2); + if (!f->window[b]) return error(f, VORBIS_outofmem); + compute_window(n, f->window[b]); + f->bit_reverse[b] = (uint16 *) setup_malloc(f, sizeof(uint16) * n8); + if (!f->bit_reverse[b]) return error(f, VORBIS_outofmem); + compute_bitreverse(n, f->bit_reverse[b]); + return TRUE; +} + +static void neighbors(uint16 *x, int n, int *plow, int *phigh) +{ + int low = -1; + int high = 65536; + int i; + for (i=0; i < n; ++i) { + if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; } + if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; } + } +} + +// this has been repurposed so y is now the original index instead of y +typedef struct +{ + uint16 x,y; +} Point; + +int point_compare(const void *p, const void *q) +{ + Point *a = (Point *) p; + Point *b = (Point *) q; + return a->x < b->x ? -1 : a->x > b->x; +} + +// +/////////////////////// END LEAF SETUP FUNCTIONS ////////////////////////// + + +#if defined(STB_VORBIS_NO_STDIO) + #define USE_MEMORY(z) TRUE +#else + #define USE_MEMORY(z) ((z)->stream) +#endif + +static uint8 get8(vorb *z) +{ + if (USE_MEMORY(z)) { + if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; } + return *z->stream++; + } + + #ifndef STB_VORBIS_NO_STDIO + { + int c = fgetc(z->f); + if (c == EOF) { z->eof = TRUE; return 0; } + return c; + } + #endif +} + +static uint32 get32(vorb *f) +{ + uint32 x; + x = get8(f); + x += get8(f) << 8; + x += get8(f) << 16; + x += get8(f) << 24; + return x; +} + +static int getn(vorb *z, uint8 *data, int n) +{ + if (USE_MEMORY(z)) { + if (z->stream+n > z->stream_end) { z->eof = 1; return 0; } + memcpy(data, z->stream, n); + z->stream += n; + return 1; + } + + #ifndef STB_VORBIS_NO_STDIO + if (fread(data, n, 1, z->f) == 1) + return 1; + else { + z->eof = 1; + return 0; + } + #endif +} + +static void skip(vorb *z, int n) +{ + if (USE_MEMORY(z)) { + z->stream += n; + if (z->stream >= z->stream_end) z->eof = 1; + return; + } + #ifndef STB_VORBIS_NO_STDIO + { + long x = ftell(z->f); + fseek(z->f, x+n, SEEK_SET); + } + #endif +} + +static int set_file_offset(stb_vorbis *f, unsigned int loc) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + f->eof = 0; + if (USE_MEMORY(f)) { + if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) { + f->stream = f->stream_end; + f->eof = 1; + return 0; + } else { + f->stream = f->stream_start + loc; + return 1; + } + } + #ifndef STB_VORBIS_NO_STDIO + if (loc + f->f_start < loc || loc >= 0x80000000) { + loc = 0x7fffffff; + f->eof = 1; + } else { + loc += f->f_start; + } + if (!fseek(f->f, loc, SEEK_SET)) + return 1; + f->eof = 1; + fseek(f->f, f->f_start, SEEK_END); + return 0; + #endif +} + + +static uint8 ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 }; + +static int capture_pattern(vorb *f) +{ + if (0x4f != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x53 != get8(f)) return FALSE; + return TRUE; +} + +#define PAGEFLAG_continued_packet 1 +#define PAGEFLAG_first_page 2 +#define PAGEFLAG_last_page 4 + +static int start_page_no_capturepattern(vorb *f) +{ + uint32 loc0,loc1,n,i; + // stream structure version + if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); + // header flag + f->page_flag = get8(f); + // absolute granule position + loc0 = get32(f); + loc1 = get32(f); + // @TODO: validate loc0,loc1 as valid positions? + // stream serial number -- vorbis doesn't interleave, so discard + get32(f); + //if (f->serial != get32(f)) return error(f, VORBIS_incorrect_stream_serial_number); + // page sequence number + n = get32(f); + f->last_page = n; + // CRC32 + get32(f); + // page_segments + f->segment_count = get8(f); + if (!getn(f, f->segments, f->segment_count)) + return error(f, VORBIS_unexpected_eof); + // assume we _don't_ know any the sample position of any segments + f->end_seg_with_known_loc = -2; + if (loc0 != ~0 || loc1 != ~0) { + // determine which packet is the last one that will complete + for (i=f->segment_count-1; i >= 0; --i) + if (f->segments[i] < 255) + break; + // 'i' is now the index of the _last_ segment of a packet that ends + if (i >= 0) { + f->end_seg_with_known_loc = i; + f->known_loc_for_packet = loc0; + } + } + if (f->first_decode) { + int i,len; + ProbedPage p; + len = 0; + for (i=0; i < f->segment_count; ++i) + len += f->segments[i]; + len += 27 + f->segment_count; + p.page_start = f->first_audio_page_offset; + p.page_end = p.page_start + len; + p.after_previous_page_start = p.page_start; + p.first_decoded_sample = 0; + p.last_decoded_sample = loc0; + f->p_first = p; + } + f->next_seg = 0; + return TRUE; +} + +static int start_page(vorb *f) +{ + if (!capture_pattern(f)) return error(f, VORBIS_missing_capture_pattern); + return start_page_no_capturepattern(f); +} + +static int start_packet(vorb *f) +{ + while (f->next_seg == -1) { + if (!start_page(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) + return error(f, VORBIS_continued_packet_flag_invalid); + } + f->last_seg = FALSE; + f->valid_bits = 0; + f->packet_bytes = 0; + f->bytes_in_seg = 0; + // f->next_seg is now valid + return TRUE; +} + +static int maybe_start_packet(vorb *f) +{ + if (f->next_seg == -1) { + int x = get8(f); + if (f->eof) return FALSE; // EOF at page boundary is not an error! + if (0x4f != x ) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x53 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (!start_page_no_capturepattern(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) { + // set up enough state that we can read this packet if we want, + // e.g. during recovery + f->last_seg = FALSE; + f->bytes_in_seg = 0; + return error(f, VORBIS_continued_packet_flag_invalid); + } + } + return start_packet(f); +} + +static int next_segment(vorb *f) +{ + int len; + if (f->last_seg) return 0; + if (f->next_seg == -1) { + f->last_seg_which = f->segment_count-1; // in case start_page fails + if (!start_page(f)) { f->last_seg = 1; return 0; } + if (!(f->page_flag & PAGEFLAG_continued_packet)) return error(f, VORBIS_continued_packet_flag_invalid); + } + len = f->segments[f->next_seg++]; + if (len < 255) { + f->last_seg = TRUE; + f->last_seg_which = f->next_seg-1; + } + if (f->next_seg >= f->segment_count) + f->next_seg = -1; + assert(f->bytes_in_seg == 0); + f->bytes_in_seg = len; + return len; +} + +#define EOP (-1) +#define INVALID_BITS (-1) + +static int get8_packet_raw(vorb *f) +{ + if (!f->bytes_in_seg) + if (f->last_seg) return EOP; + else if (!next_segment(f)) return EOP; + assert(f->bytes_in_seg > 0); + --f->bytes_in_seg; + ++f->packet_bytes; + return get8(f); +} + +static int get8_packet(vorb *f) +{ + int x = get8_packet_raw(f); + f->valid_bits = 0; + return x; +} + +static void flush_packet(vorb *f) +{ + while (get8_packet_raw(f) != EOP); +} + +// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important +// as the huffman decoder? +static uint32 get_bits(vorb *f, int n) +{ + uint32 z; + + if (f->valid_bits < 0) return 0; + if (f->valid_bits < n) { + if (n > 24) { + // the accumulator technique below would not work correctly in this case + z = get_bits(f, 24); + z += get_bits(f, n-24) << 24; + return z; + } + if (f->valid_bits == 0) f->acc = 0; + while (f->valid_bits < n) { + int z = get8_packet_raw(f); + if (z == EOP) { + f->valid_bits = INVALID_BITS; + return 0; + } + f->acc += z << f->valid_bits; + f->valid_bits += 8; + } + } + if (f->valid_bits < 0) return 0; + z = f->acc & ((1 << n)-1); + f->acc >>= n; + f->valid_bits -= n; + return z; +} + +static int32 get_bits_signed(vorb *f, int n) +{ + uint32 z = get_bits(f, n); + if (z & (1 << (n-1))) + z += ~((1 << n) - 1); + return (int32) z; +} + +// @OPTIMIZE: primary accumulator for huffman +// expand the buffer to as many bits as possible without reading off end of packet +// it might be nice to allow f->valid_bits and f->acc to be stored in registers, +// e.g. cache them locally and decode locally +static __forceinline void prep_huffman(vorb *f) +{ + if (f->valid_bits <= 24) { + if (f->valid_bits == 0) f->acc = 0; + do { + int z; + if (f->last_seg && !f->bytes_in_seg) return; + z = get8_packet_raw(f); + if (z == EOP) return; + f->acc += z << f->valid_bits; + f->valid_bits += 8; + } while (f->valid_bits <= 24); + } +} + +enum +{ + VORBIS_packet_id = 1, + VORBIS_packet_comment = 3, + VORBIS_packet_setup = 5, +}; + +static int codebook_decode_scalar_raw(vorb *f, Codebook *c) +{ + int i; + prep_huffman(f); + + assert(c->sorted_codewords || c->codewords); + // cases to use binary search: sorted_codewords && !c->codewords + // sorted_codewords && c->entries > 8 + if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) { + // binary search + uint32 code = bit_reverse(f->acc); + int x=0, n=c->sorted_entries, len; + + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + // x is now the sorted index + if (!c->sparse) x = c->sorted_values[x]; + // x is now sorted index if sparse, or symbol otherwise + len = c->codeword_lengths[x]; + if (f->valid_bits >= len) { + f->acc >>= len; + f->valid_bits -= len; + return x; + } + + f->valid_bits = 0; + return -1; + } + + // if small, linear search + assert(!c->sparse); + for (i=0; i < c->entries; ++i) { + if (c->codeword_lengths[i] == NO_CODE) continue; + if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) { + if (f->valid_bits >= c->codeword_lengths[i]) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + return i; + } + f->valid_bits = 0; + return -1; + } + } + + error(f, VORBIS_invalid_stream); + f->valid_bits = 0; + return -1; +} + +static int codebook_decode_scalar(vorb *f, Codebook *c) +{ + int i; + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) + prep_huffman(f); + // fast huffman table lookup + i = f->acc & FAST_HUFFMAN_TABLE_MASK; + i = c->fast_huffman[i]; + if (i >= 0) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + if (f->valid_bits < 0) { f->valid_bits = 0; return -1; } + return i; + } + return codebook_decode_scalar_raw(f,c); +} + +#ifndef STB_VORBIS_NO_INLINE_DECODE + +#define DECODE_RAW(var, f,c) \ + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \ + prep_huffman(f); \ + var = f->acc & FAST_HUFFMAN_TABLE_MASK; \ + var = c->fast_huffman[var]; \ + if (var >= 0) { \ + int n = c->codeword_lengths[var]; \ + f->acc >>= n; \ + f->valid_bits -= n; \ + if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \ + } else { \ + var = codebook_decode_scalar_raw(f,c); \ + } + +#else + +#define DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c); + +#endif + +#define DECODE(var,f,c) \ + DECODE_RAW(var,f,c) \ + if (c->sparse) var = c->sorted_values[var]; + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + #define DECODE_VQ(var,f,c) DECODE_RAW(var,f,c) +#else + #define DECODE_VQ(var,f,c) DECODE(var,f,c) +#endif + + + + + + +// CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case +// where we avoid one addition +#ifndef STB_VORBIS_CODEBOOK_FLOATS + #define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off] * c->delta_value + c->minimum_value) + #define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off] * c->delta_value) + #define CODEBOOK_ELEMENT_BASE(c) (c->minimum_value) +#else + #define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off]) + #define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off]) + #define CODEBOOK_ELEMENT_BASE(c) (0) +#endif + +static int codebook_decode_start(vorb *f, Codebook *c, int len) +{ + int z = -1; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) + error(f, VORBIS_invalid_stream); + else { + DECODE_VQ(z,f,c); + if (c->sparse) assert(z < c->sorted_entries); + if (z < 0) { // check for EOP + if (!f->bytes_in_seg) + if (f->last_seg) + return z; + error(f, VORBIS_invalid_stream); + } + } + return z; +} + +static int codebook_decode(vorb *f, Codebook *c, float *output, int len) +{ + int i,z = codebook_decode_start(f,c,len); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + float last = CODEBOOK_ELEMENT_BASE(c); + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i] += val; + if (c->sequence_p) last = val + c->minimum_value; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + if (c->sequence_p) { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i] += val; + last = val + c->minimum_value; + } + } else { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + output[i] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; + } + } + + return TRUE; +} + +static int codebook_decode_step(vorb *f, Codebook *c, float *output, int len, int step) +{ + int i,z = codebook_decode_start(f,c,len); + float last = CODEBOOK_ELEMENT_BASE(c); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + } + + return TRUE; +} + +static int codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode) +{ + int c_inter = *c_inter_p; + int p_inter = *p_inter_p; + int i,z, effective = c->dimensions; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); + + while (total_decode > 0) { + float last = CODEBOOK_ELEMENT_BASE(c); + DECODE_VQ(z,f,c); + #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + assert(!c->sparse || z < c->sorted_entries); + #endif + if (z < 0) { + if (!f->bytes_in_seg) + if (f->last_seg) return FALSE; + return error(f, VORBIS_invalid_stream); + } + + // if this will take us off the end of the buffers, stop short! + // we check by computing the length of the virtual interleaved + // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), + // and the length we'll be using (effective) + if (c_inter + p_inter*ch + effective > len * ch) { + effective = len*ch - (p_inter*ch - c_inter); + } + + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < effective; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + } else + #endif + { + z *= c->dimensions; + if (c->sequence_p) { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + last = val; + } + } else { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + } + } + } + + total_decode -= effective; + } + *c_inter_p = c_inter; + *p_inter_p = p_inter; + return TRUE; +} + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK +static int codebook_decode_deinterleave_repeat_2(vorb *f, Codebook *c, float **outputs, int *c_inter_p, int *p_inter_p, int len, int total_decode) +{ + int c_inter = *c_inter_p; + int p_inter = *p_inter_p; + int i,z, effective = c->dimensions; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); + + while (total_decode > 0) { + float last = CODEBOOK_ELEMENT_BASE(c); + DECODE_VQ(z,f,c); + + if (z < 0) { + if (!f->bytes_in_seg) + if (f->last_seg) return FALSE; + return error(f, VORBIS_invalid_stream); + } + + // if this will take us off the end of the buffers, stop short! + // we check by computing the length of the virtual interleaved + // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), + // and the length we'll be using (effective) + if (c_inter + p_inter*2 + effective > len * 2) { + effective = len*2 - (p_inter*2 - c_inter); + } + + { + z *= c->dimensions; + stb_prof(11); + if (c->sequence_p) { + // haven't optimized this case because I don't have any examples + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == 2) { c_inter = 0; ++p_inter; } + last = val; + } + } else { + i=0; + if (c_inter == 1) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + c_inter = 0; ++p_inter; + ++i; + } + { + float *z0 = outputs[0]; + float *z1 = outputs[1]; + for (; i+1 < effective;) { + z0[p_inter] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; + z1[p_inter] += CODEBOOK_ELEMENT_FAST(c,z+i+1) + last; + ++p_inter; + i += 2; + } + } + if (i < effective) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == 2) { c_inter = 0; ++p_inter; } + } + } + } + + total_decode -= effective; + } + *c_inter_p = c_inter; + *p_inter_p = p_inter; + return TRUE; +} +#endif + +static int predict_point(int x, int x0, int x1, int y0, int y1) +{ + int dy = y1 - y0; + int adx = x1 - x0; + // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86? + int err = abs(dy) * (x - x0); + int off = err / adx; + return dy < 0 ? y0 - off : y0 + off; +} + +// the following table is block-copied from the specification +static float inverse_db_table[256] = +{ + 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f, + 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f, + 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f, + 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f, + 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f, + 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f, + 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f, + 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f, + 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f, + 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f, + 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f, + 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f, + 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f, + 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f, + 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f, + 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f, + 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f, + 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f, + 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f, + 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f, + 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f, + 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f, + 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f, + 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f, + 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f, + 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f, + 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f, + 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f, + 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f, + 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f, + 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f, + 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f, + 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f, + 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f, + 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f, + 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f, + 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f, + 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f, + 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f, + 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f, + 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f, + 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f, + 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f, + 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f, + 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f, + 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f, + 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f, + 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f, + 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f, + 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f, + 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f, + 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f, + 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f, + 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f, + 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f, + 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f, + 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f, + 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f, + 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f, + 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f, + 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f, + 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f, + 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f, + 0.82788260f, 0.88168307f, 0.9389798f, 1.0f +}; + + +// @OPTIMIZE: if you want to replace this bresenham line-drawing routine, +// note that you must produce bit-identical output to decode correctly; +// this specific sequence of operations is specified in the spec (it's +// drawing integer-quantized frequency-space lines that the encoder +// expects to be exactly the same) +// ... also, isn't the whole point of Bresenham's algorithm to NOT +// have to divide in the setup? sigh. +#ifndef STB_VORBIS_NO_DEFER_FLOOR +#define LINE_OP(a,b) a *= b +#else +#define LINE_OP(a,b) a = b +#endif + +#ifdef STB_VORBIS_DIVIDE_TABLE +#define DIVTAB_NUMER 32 +#define DIVTAB_DENOM 64 +int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]; // 2KB +#endif + +static __forceinline void draw_line(float *output, int x0, int y0, int x1, int y1, int n) +{ + int dy = y1 - y0; + int adx = x1 - x0; + int ady = abs(dy); + int base; + int x=x0,y=y0; + int err = 0; + int sy; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (adx < DIVTAB_DENOM && ady < DIVTAB_NUMER) { + if (dy < 0) { + base = -integer_divide_table[ady][adx]; + sy = base-1; + } else { + base = integer_divide_table[ady][adx]; + sy = base+1; + } + } else { + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; + } +#else + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; +#endif + ady -= abs(base) * adx; + if (x1 > n) x1 = n; + LINE_OP(output[x], inverse_db_table[y]); + for (++x; x < x1; ++x) { + err += ady; + if (err >= adx) { + err -= adx; + y += sy; + } else + y += base; + LINE_OP(output[x], inverse_db_table[y]); + } +} + +static int residue_decode(vorb *f, Codebook *book, float *target, int offset, int n, int rtype) +{ + int k; + if (rtype == 0) { + int step = n / book->dimensions; + for (k=0; k < step; ++k) + if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) + return FALSE; + } else { + for (k=0; k < n; ) { + if (!codebook_decode(f, book, target+offset, n-k)) + return FALSE; + k += book->dimensions; + offset += book->dimensions; + } + } + return TRUE; +} + +static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int rn, uint8 *do_not_decode) +{ + int i,j,pass; + Residue *r = f->residue_config + rn; + int rtype = f->residue_types[rn]; + int c = r->classbook; + int classwords = f->codebooks[c].dimensions; + int n_read = r->end - r->begin; + int part_read = n_read / r->part_size; + int temp_alloc_point = temp_alloc_save(f); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + uint8 ***part_classdata = (uint8 ***) temp_block_array(f,f->channels, part_read * sizeof(**part_classdata)); + #else + int **classifications = (int **) temp_block_array(f,f->channels, part_read * sizeof(**classifications)); + #endif + + stb_prof(2); + for (i=0; i < ch; ++i) + if (!do_not_decode[i]) + memset(residue_buffers[i], 0, sizeof(float) * n); + + if (rtype == 2 && ch != 1) { + int len = ch * n; + for (j=0; j < ch; ++j) + if (!do_not_decode[j]) + break; + if (j == ch) + goto done; + + stb_prof(3); + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set = 0; + if (ch == 2) { + stb_prof(13); + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = (z & 1), p_inter = z>>1; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + stb_prof(5); + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + stb_prof(20); // accounts for X time + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + #else + // saves 1% + if (!codebook_decode_deinterleave_repeat_2(f, book, residue_buffers, &c_inter, &p_inter, n, r->part_size)) + goto done; + #endif + stb_prof(7); + } else { + z += r->part_size; + c_inter = z & 1; + p_inter = z >> 1; + } + } + stb_prof(8); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else if (ch == 1) { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = 0, p_inter = z; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + stb_prof(22); + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + stb_prof(3); + } else { + z += r->part_size; + c_inter = 0; + p_inter = z; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = z % ch, p_inter = z/ch; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + stb_prof(22); + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + stb_prof(3); + } else { + z += r->part_size; + c_inter = z % ch; + p_inter = z / ch; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + } + goto done; + } + stb_prof(9); + + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set=0; + while (pcount < part_read) { + if (pass == 0) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + Codebook *c = f->codebooks+r->classbook; + int temp; + DECODE(temp,f,c); + if (temp == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[j][class_set] = r->classdata[temp]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[j][i+pcount] = temp % r->classifications; + temp /= r->classifications; + } + #endif + } + } + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[j][class_set][i]; + #else + int c = classifications[j][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + float *target = residue_buffers[j]; + int offset = r->begin + pcount * r->part_size; + int n = r->part_size; + Codebook *book = f->codebooks + b; + if (!residue_decode(f, book, target, offset, n, rtype)) + goto done; + } + } + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + done: + stb_prof(0); + temp_alloc_restore(f,temp_alloc_point); +} + + +#if 0 +// slow way for debugging +void inverse_mdct_slow(float *buffer, int n) +{ + int i,j; + int n2 = n >> 1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + // formula from paper: + //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + // formula from wikipedia + //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + // these are equivalent, except the formula from the paper inverts the multiplier! + // however, what actually works is NO MULTIPLIER!?! + //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + buffer[i] = acc; + } + free(x); +} +#elif 0 +// same as above, but just barely able to run in real time on modern machines +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + float mcos[16384]; + int i,j; + int n2 = n >> 1, nmask = (n << 2) -1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < 4*n; ++i) + mcos[i] = (float) cos(M_PI / 2 * i / n); + + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask]; + buffer[i] = acc; + } + free(x); +} +#else +// transform to use a slow dct-iv; this is STILL basically trivial, +// but only requires half as many ops +void dct_iv_slow(float *buffer, int n) +{ + float mcos[16384]; + float x[2048]; + int i,j; + int n2 = n >> 1, nmask = (n << 3) - 1; + memcpy(x, buffer, sizeof(*x) * n); + for (i=0; i < 8*n; ++i) + mcos[i] = (float) cos(M_PI / 4 * i / n); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n; ++j) + acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask]; + //acc += x[j] * cos(M_PI / n * (i + 0.5) * (j + 0.5)); + buffer[i] = acc; + } + free(x); +} + +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4; + float temp[4096]; + + memcpy(temp, buffer, n2 * sizeof(float)); + dct_iv_slow(temp, n2); // returns -c'-d, a-b' + + for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b' + for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d' + for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d +} +#endif + +#ifndef LIBVORBIS_MDCT +#define LIBVORBIS_MDCT 0 +#endif + +#if LIBVORBIS_MDCT +// directly call the vorbis MDCT using an interface documented +// by Jeff Roberts... useful for performance comparison +typedef struct +{ + int n; + int log2n; + + float *trig; + int *bitrev; + + float scale; +} mdct_lookup; + +extern void mdct_init(mdct_lookup *lookup, int n); +extern void mdct_clear(mdct_lookup *l); +extern void mdct_backward(mdct_lookup *init, float *in, float *out); + +mdct_lookup M1,M2; + +void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + mdct_lookup *M; + if (M1.n == n) M = &M1; + else if (M2.n == n) M = &M2; + else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; } + else { + if (M2.n) __asm int 3; + mdct_init(&M2, n); + M = &M2; + } + + mdct_backward(M, buffer, buffer); +} +#endif + + +// the following were split out into separate functions while optimizing; +// they could be pushed back up but eh. __forceinline showed no change; +// they're probably already being inlined. +static void imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A) +{ + float *ee0 = e + i_off; + float *ee2 = ee0 + k_off; + int i; + + assert((n & 3) == 0); + for (i=(n>>2); i > 0; --i) { + float k00_20, k01_21; + k00_20 = ee0[ 0] - ee2[ 0]; + k01_21 = ee0[-1] - ee2[-1]; + ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-1] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-2] - ee2[-2]; + k01_21 = ee0[-3] - ee2[-3]; + ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-3] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-4] - ee2[-4]; + k01_21 = ee0[-5] - ee2[-5]; + ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-5] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-6] - ee2[-6]; + k01_21 = ee0[-7] - ee2[-7]; + ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-7] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + ee0 -= 8; + ee2 -= 8; + } +} + +static void imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1) +{ + int i; + float k00_20, k01_21; + + float *e0 = e + d0; + float *e2 = e0 + k_off; + + for (i=lim >> 2; i > 0; --i) { + k00_20 = e0[-0] - e2[-0]; + k01_21 = e0[-1] - e2[-1]; + e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0]; + e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1]; + e2[-0] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-1] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-2] - e2[-2]; + k01_21 = e0[-3] - e2[-3]; + e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2]; + e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3]; + e2[-2] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-3] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-4] - e2[-4]; + k01_21 = e0[-5] - e2[-5]; + e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4]; + e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5]; + e2[-4] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-5] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-6] - e2[-6]; + k01_21 = e0[-7] - e2[-7]; + e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6]; + e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7]; + e2[-6] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-7] = (k01_21)*A[0] + (k00_20) * A[1]; + + e0 -= 8; + e2 -= 8; + + A += k1; + } +} + +static void imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0) +{ + int i; + float A0 = A[0]; + float A1 = A[0+1]; + float A2 = A[0+a_off]; + float A3 = A[0+a_off+1]; + float A4 = A[0+a_off*2+0]; + float A5 = A[0+a_off*2+1]; + float A6 = A[0+a_off*3+0]; + float A7 = A[0+a_off*3+1]; + + float k00,k11; + + float *ee0 = e +i_off; + float *ee2 = ee0+k_off; + + for (i=n; i > 0; --i) { + k00 = ee0[ 0] - ee2[ 0]; + k11 = ee0[-1] - ee2[-1]; + ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = (k00) * A0 - (k11) * A1; + ee2[-1] = (k11) * A0 + (k00) * A1; + + k00 = ee0[-2] - ee2[-2]; + k11 = ee0[-3] - ee2[-3]; + ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = (k00) * A2 - (k11) * A3; + ee2[-3] = (k11) * A2 + (k00) * A3; + + k00 = ee0[-4] - ee2[-4]; + k11 = ee0[-5] - ee2[-5]; + ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = (k00) * A4 - (k11) * A5; + ee2[-5] = (k11) * A4 + (k00) * A5; + + k00 = ee0[-6] - ee2[-6]; + k11 = ee0[-7] - ee2[-7]; + ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = (k00) * A6 - (k11) * A7; + ee2[-7] = (k11) * A6 + (k00) * A7; + + ee0 -= k0; + ee2 -= k0; + } +} + +static __forceinline void iter_54(float *z) +{ + float k00,k11,k22,k33; + float y0,y1,y2,y3; + + k00 = z[ 0] - z[-4]; + y0 = z[ 0] + z[-4]; + y2 = z[-2] + z[-6]; + k22 = z[-2] - z[-6]; + + z[-0] = y0 + y2; // z0 + z4 + z2 + z6 + z[-2] = y0 - y2; // z0 + z4 - z2 - z6 + + // done with y0,y2 + + k33 = z[-3] - z[-7]; + + z[-4] = k00 + k33; // z0 - z4 + z3 - z7 + z[-6] = k00 - k33; // z0 - z4 - z3 + z7 + + // done with k33 + + k11 = z[-1] - z[-5]; + y1 = z[-1] + z[-5]; + y3 = z[-3] + z[-7]; + + z[-1] = y1 + y3; // z1 + z5 + z3 + z7 + z[-3] = y1 - y3; // z1 + z5 - z3 - z7 + z[-5] = k11 - k22; // z1 - z5 + z2 - z6 + z[-7] = k11 + k22; // z1 - z5 - z2 + z6 +} + +static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n) +{ + int k_off = -8; + int a_off = base_n >> 3; + float A2 = A[0+a_off]; + float *z = e + i_off; + float *base = z - 16 * n; + + while (z > base) { + float k00,k11; + + k00 = z[-0] - z[-8]; + k11 = z[-1] - z[-9]; + z[-0] = z[-0] + z[-8]; + z[-1] = z[-1] + z[-9]; + z[-8] = k00; + z[-9] = k11 ; + + k00 = z[ -2] - z[-10]; + k11 = z[ -3] - z[-11]; + z[ -2] = z[ -2] + z[-10]; + z[ -3] = z[ -3] + z[-11]; + z[-10] = (k00+k11) * A2; + z[-11] = (k11-k00) * A2; + + k00 = z[-12] - z[ -4]; // reverse to avoid a unary negation + k11 = z[ -5] - z[-13]; + z[ -4] = z[ -4] + z[-12]; + z[ -5] = z[ -5] + z[-13]; + z[-12] = k11; + z[-13] = k00; + + k00 = z[-14] - z[ -6]; // reverse to avoid a unary negation + k11 = z[ -7] - z[-15]; + z[ -6] = z[ -6] + z[-14]; + z[ -7] = z[ -7] + z[-15]; + z[-14] = (k00+k11) * A2; + z[-15] = (k00-k11) * A2; + + iter_54(z); + iter_54(z-8); + z -= 16; + } +} + +static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int n3_4 = n - n4, ld; + // @OPTIMIZE: reduce register pressure by using fewer variables? + int save_point = temp_alloc_save(f); + float *buf2 = (float *) temp_alloc(f, n2 * sizeof(*buf2)); + float *u=NULL,*v=NULL; + // twiddle factors + float *A = f->A[blocktype]; + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function. + + // kernel from paper + + + // merged: + // copy and reflect spectral data + // step 0 + + // note that it turns out that the items added together during + // this step are, in fact, being added to themselves (as reflected + // by step 0). inexplicable inefficiency! this became obvious + // once I combined the passes. + + // so there's a missing 'times 2' here (for adding X to itself). + // this propogates through linearly to the end, where the numbers + // are 1/2 too small, and need to be compensated for. + + { + float *d,*e, *AA, *e_stop; + d = &buf2[n2-2]; + AA = A; + e = &buffer[0]; + e_stop = &buffer[n2]; + while (e != e_stop) { + d[1] = (e[0] * AA[0] - e[2]*AA[1]); + d[0] = (e[0] * AA[1] + e[2]*AA[0]); + d -= 2; + AA += 2; + e += 4; + } + + e = &buffer[n2-3]; + while (d >= buf2) { + d[1] = (-e[2] * AA[0] - -e[0]*AA[1]); + d[0] = (-e[2] * AA[1] + -e[0]*AA[0]); + d -= 2; + AA += 2; + e -= 4; + } + } + + // now we use symbolic names for these, so that we can + // possibly swap their meaning as we change which operations + // are in place + + u = buffer; + v = buf2; + + // step 2 (paper output is w, now u) + // this could be in place, but the data ends up in the wrong + // place... _somebody_'s got to swap it, so this is nominated + { + float *AA = &A[n2-8]; + float *d0,*d1, *e0, *e1; + + e0 = &v[n4]; + e1 = &v[0]; + + d0 = &u[n4]; + d1 = &u[0]; + + while (AA >= A) { + float v40_20, v41_21; + + v41_21 = e0[1] - e1[1]; + v40_20 = e0[0] - e1[0]; + d0[1] = e0[1] + e1[1]; + d0[0] = e0[0] + e1[0]; + d1[1] = v41_21*AA[4] - v40_20*AA[5]; + d1[0] = v40_20*AA[4] + v41_21*AA[5]; + + v41_21 = e0[3] - e1[3]; + v40_20 = e0[2] - e1[2]; + d0[3] = e0[3] + e1[3]; + d0[2] = e0[2] + e1[2]; + d1[3] = v41_21*AA[0] - v40_20*AA[1]; + d1[2] = v40_20*AA[0] + v41_21*AA[1]; + + AA -= 8; + + d0 += 4; + d1 += 4; + e0 += 4; + e1 += 4; + } + } + + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + + // optimized step 3: + + // the original step3 loop can be nested r inside s or s inside r; + // it's written originally as s inside r, but this is dumb when r + // iterates many times, and s few. So I have two copies of it and + // switch between them halfway. + + // this is iteration 0 of step 3 + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A); + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A); + + // this is iteration 1 of step 3 + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16); + + l=2; + for (; l < (ld-3)>>1; ++l) { + int k0 = n >> (l+2), k0_2 = k0>>1; + int lim = 1 << (l+1); + int i; + for (i=0; i < lim; ++i) + imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3)); + } + + for (; l < ld-6; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1; + int rlim = n >> (l+6), r; + int lim = 1 << (l+1); + int i_off; + float *A0 = A; + i_off = n2-1; + for (r=rlim; r > 0; --r) { + imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0); + A0 += k1*4; + i_off -= 8; + } + } + + // iterations with count: + // ld-6,-5,-4 all interleaved together + // the big win comes from getting rid of needless flops + // due to the constants on pass 5 & 4 being all 1 and 0; + // combining them to be simultaneous to improve cache made little difference + imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n); + + // output is u + + // step 4, 5, and 6 + // cannot be in-place because of step 5 + { + uint16 *bitrev = f->bit_reverse[blocktype]; + // weirdly, I'd have thought reading sequentially and writing + // erratically would have been better than vice-versa, but in + // fact that's not what my testing showed. (That is, with + // j = bitreverse(i), do you read i and write j, or read j and write i.) + + float *d0 = &v[n4-4]; + float *d1 = &v[n2-4]; + while (d0 >= v) { + int k4; + + k4 = bitrev[0]; + d1[3] = u[k4+0]; + d1[2] = u[k4+1]; + d0[3] = u[k4+2]; + d0[2] = u[k4+3]; + + k4 = bitrev[1]; + d1[1] = u[k4+0]; + d1[0] = u[k4+1]; + d0[1] = u[k4+2]; + d0[0] = u[k4+3]; + + d0 -= 4; + d1 -= 4; + bitrev += 2; + } + } + // (paper output is u, now v) + + + // data must be in buf2 + assert(v == buf2); + + // step 7 (paper output is v, now v) + // this is now in place + { + float *C = f->C[blocktype]; + float *d, *e; + + d = v; + e = v + n2 - 4; + + while (d < e) { + float a02,a11,b0,b1,b2,b3; + + a02 = d[0] - e[2]; + a11 = d[1] + e[3]; + + b0 = C[1]*a02 + C[0]*a11; + b1 = C[1]*a11 - C[0]*a02; + + b2 = d[0] + e[ 2]; + b3 = d[1] - e[ 3]; + + d[0] = b2 + b0; + d[1] = b3 + b1; + e[2] = b2 - b0; + e[3] = b1 - b3; + + a02 = d[2] - e[0]; + a11 = d[3] + e[1]; + + b0 = C[3]*a02 + C[2]*a11; + b1 = C[3]*a11 - C[2]*a02; + + b2 = d[2] + e[ 0]; + b3 = d[3] - e[ 1]; + + d[2] = b2 + b0; + d[3] = b3 + b1; + e[0] = b2 - b0; + e[1] = b1 - b3; + + C += 4; + d += 4; + e -= 4; + } + } + + // data must be in buf2 + + + // step 8+decode (paper output is X, now buffer) + // this generates pairs of data a la 8 and pushes them directly through + // the decode kernel (pushing rather than pulling) to avoid having + // to make another pass later + + // this cannot POSSIBLY be in place, so we refer to the buffers directly + + { + float *d0,*d1,*d2,*d3; + + float *B = f->B[blocktype] + n2 - 8; + float *e = buf2 + n2 - 8; + d0 = &buffer[0]; + d1 = &buffer[n2-4]; + d2 = &buffer[n2]; + d3 = &buffer[n-4]; + while (e >= v) { + float p0,p1,p2,p3; + + p3 = e[6]*B[7] - e[7]*B[6]; + p2 = -e[6]*B[6] - e[7]*B[7]; + + d0[0] = p3; + d1[3] = - p3; + d2[0] = p2; + d3[3] = p2; + + p1 = e[4]*B[5] - e[5]*B[4]; + p0 = -e[4]*B[4] - e[5]*B[5]; + + d0[1] = p1; + d1[2] = - p1; + d2[1] = p0; + d3[2] = p0; + + p3 = e[2]*B[3] - e[3]*B[2]; + p2 = -e[2]*B[2] - e[3]*B[3]; + + d0[2] = p3; + d1[1] = - p3; + d2[2] = p2; + d3[1] = p2; + + p1 = e[0]*B[1] - e[1]*B[0]; + p0 = -e[0]*B[0] - e[1]*B[1]; + + d0[3] = p1; + d1[0] = - p1; + d2[3] = p0; + d3[0] = p0; + + B -= 8; + e -= 8; + d0 += 4; + d2 += 4; + d1 -= 4; + d3 -= 4; + } + } + + temp_alloc_restore(f,save_point); +} + +#if 0 +// this is the original version of the above code, if you want to optimize it from scratch +void inverse_mdct_naive(float *buffer, int n) +{ + float s; + float A[1 << 12], B[1 << 12], C[1 << 11]; + int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int n3_4 = n - n4, ld; + // how can they claim this only uses N words?! + // oh, because they're only used sparsely, whoops + float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13]; + // set up twiddle factors + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2); + B[k2+1] = (float) sin((k2+1)*M_PI/n/2); + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // Note there are bugs in that pseudocode, presumably due to them attempting + // to rename the arrays nicely rather than representing the way their actual + // implementation bounces buffers back and forth. As a result, even in the + // "some formulars corrected" version, a direct implementation fails. These + // are noted below as "paper bug". + + // copy and reflect spectral data + for (k=0; k < n2; ++k) u[k] = buffer[k]; + for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1]; + // kernel from paper + // step 1 + for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) { + v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1]; + v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2]; + } + // step 2 + for (k=k4=0; k < n8; k+=1, k4+=4) { + w[n2+3+k4] = v[n2+3+k4] + v[k4+3]; + w[n2+1+k4] = v[n2+1+k4] + v[k4+1]; + w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4]; + w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4]; + } + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + for (l=0; l < ld-3; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3); + int rlim = n >> (l+4), r4, r; + int s2lim = 1 << (l+2), s2; + for (r=r4=0; r < rlim; r4+=4,++r) { + for (s2=0; s2 < s2lim; s2+=2) { + u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4]; + u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4]; + u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1] + - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1]; + u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1] + + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1]; + } + } + if (l+1 < ld-3) { + // paper bug: ping-ponging of u&w here is omitted + memcpy(w, u, sizeof(u)); + } + } + + // step 4 + for (i=0; i < n8; ++i) { + int j = bit_reverse(i) >> (32-ld+3); + assert(j < n8); + if (i == j) { + // paper bug: original code probably swapped in place; if copying, + // need to directly copy in this case + int i8 = i << 3; + v[i8+1] = u[i8+1]; + v[i8+3] = u[i8+3]; + v[i8+5] = u[i8+5]; + v[i8+7] = u[i8+7]; + } else if (i < j) { + int i8 = i << 3, j8 = j << 3; + v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1]; + v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3]; + v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5]; + v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7]; + } + } + // step 5 + for (k=0; k < n2; ++k) { + w[k] = v[k*2+1]; + } + // step 6 + for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) { + u[n-1-k2] = w[k4]; + u[n-2-k2] = w[k4+1]; + u[n3_4 - 1 - k2] = w[k4+2]; + u[n3_4 - 2 - k2] = w[k4+3]; + } + // step 7 + for (k=k2=0; k < n8; ++k, k2 += 2) { + v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] + C[k2+1]*(u[n2+k2]-u[n-2-k2]) + C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; + v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] - C[k2+1]*(u[n2+k2]-u[n-2-k2]) - C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; + v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; + v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; + } + // step 8 + for (k=k2=0; k < n4; ++k,k2 += 2) { + X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1]; + X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ]; + } + + // decode kernel to output + // determined the following value experimentally + // (by first figuring out what made inverse_mdct_slow work); then matching that here + // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?) + s = 0.5; // theoretically would be n4 + + // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code, + // so it needs to use the "old" B values to behave correctly, or else + // set s to 1.0 ]]] + for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4]; + for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1]; + for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4]; +} +#endif + +static float *get_window(vorb *f, int len) +{ + len <<= 1; + if (len == f->blocksize_0) return f->window[0]; + if (len == f->blocksize_1) return f->window[1]; + assert(0); + return NULL; +} + +#ifndef STB_VORBIS_NO_DEFER_FLOOR +typedef int16 YTYPE; +#else +typedef int YTYPE; +#endif +static int do_floor(vorb *f, Mapping *map, int i, int n, float *target, YTYPE *finalY, uint8 *step2_flag) +{ + int n2 = n >> 1; + int s = map->chan[i].mux, floor; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + int j,q; + int lx = 0, ly = finalY[0] * g->floor1_multiplier; + for (q=1; q < g->values; ++q) { + j = g->sorted_order[q]; + #ifndef STB_VORBIS_NO_DEFER_FLOOR + if (finalY[j] >= 0) + #else + if (step2_flag[j]) + #endif + { + int hy = finalY[j] * g->floor1_multiplier; + int hx = g->Xlist[j]; + draw_line(target, lx,ly, hx,hy, n2); + lx = hx, ly = hy; + } + } + if (lx < n2) + // optimization of: draw_line(target, lx,ly, n,ly, n2); + for (j=lx; j < n2; ++j) + LINE_OP(target[j], inverse_db_table[ly]); + } + return TRUE; +} + +static int vorbis_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) +{ + Mode *m; + int i, n, prev, next, window_center; + f->channel_buffer_start = f->channel_buffer_end = 0; + + retry: + if (f->eof) return FALSE; + if (!maybe_start_packet(f)) + return FALSE; + // check packet type + if (get_bits(f,1) != 0) { + if (IS_PUSH_MODE(f)) + return error(f,VORBIS_bad_packet_type); + while (EOP != get8_packet(f)); + goto retry; + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + i = get_bits(f, ilog(f->mode_count-1)); + if (i == EOP) return FALSE; + if (i >= f->mode_count) return FALSE; + *mode = i; + m = f->mode_config + i; + if (m->blockflag) { + n = f->blocksize_1; + prev = get_bits(f,1); + next = get_bits(f,1); + } else { + prev = next = 0; + n = f->blocksize_0; + } + +// WINDOWING + + window_center = n >> 1; + if (m->blockflag && !prev) { + *p_left_start = (n - f->blocksize_0) >> 2; + *p_left_end = (n + f->blocksize_0) >> 2; + } else { + *p_left_start = 0; + *p_left_end = window_center; + } + if (m->blockflag && !next) { + *p_right_start = (n*3 - f->blocksize_0) >> 2; + *p_right_end = (n*3 + f->blocksize_0) >> 2; + } else { + *p_right_start = window_center; + *p_right_end = n; + } + return TRUE; +} + +static int vorbis_decode_packet_rest(vorb *f, int *len, Mode *m, int left_start, int left_end, int right_start, int right_end, int *p_left) +{ + Mapping *map; + int i,j,k,n,n2; + int zero_channel[256]; + int really_zero_channel[256]; + int window_center; + +// WINDOWING + + n = f->blocksize[m->blockflag]; + window_center = n >> 1; + + map = &f->mapping[m->mapping]; + +// FLOORS + n2 = n >> 1; + + stb_prof(1); + for (i=0; i < f->channels; ++i) { + int s = map->chan[i].mux, floor; + zero_channel[i] = FALSE; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + if (get_bits(f, 1)) { + short *finalY; + uint8 step2_flag[256]; + static int range_list[4] = { 256, 128, 86, 64 }; + int range = range_list[g->floor1_multiplier-1]; + int offset = 2; + finalY = f->finalY[i]; + finalY[0] = get_bits(f, ilog(range)-1); + finalY[1] = get_bits(f, ilog(range)-1); + for (j=0; j < g->partitions; ++j) { + int pclass = g->partition_class_list[j]; + int cdim = g->class_dimensions[pclass]; + int cbits = g->class_subclasses[pclass]; + int csub = (1 << cbits)-1; + int cval = 0; + if (cbits) { + Codebook *c = f->codebooks + g->class_masterbooks[pclass]; + DECODE(cval,f,c); + } + for (k=0; k < cdim; ++k) { + int book = g->subclass_books[pclass][cval & csub]; + cval = cval >> cbits; + if (book >= 0) { + int temp; + Codebook *c = f->codebooks + book; + DECODE(temp,f,c); + finalY[offset++] = temp; + } else + finalY[offset++] = 0; + } + } + if (f->valid_bits == INVALID_BITS) goto error; // behavior according to spec + step2_flag[0] = step2_flag[1] = 1; + for (j=2; j < g->values; ++j) { + int low, high, pred, highroom, lowroom, room, val; + low = g->neighbors[j][0]; + high = g->neighbors[j][1]; + //neighbors(g->Xlist, j, &low, &high); + pred = predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]); + val = finalY[j]; + highroom = range - pred; + lowroom = pred; + if (highroom < lowroom) + room = highroom * 2; + else + room = lowroom * 2; + if (val) { + step2_flag[low] = step2_flag[high] = 1; + step2_flag[j] = 1; + if (val >= room) + if (highroom > lowroom) + finalY[j] = val - lowroom + pred; + else + finalY[j] = pred - val + highroom - 1; + else + if (val & 1) + finalY[j] = pred - ((val+1)>>1); + else + finalY[j] = pred + (val>>1); + } else { + step2_flag[j] = 0; + finalY[j] = pred; + } + } + +#ifdef STB_VORBIS_NO_DEFER_FLOOR + do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag); +#else + // defer final floor computation until _after_ residue + for (j=0; j < g->values; ++j) { + if (!step2_flag[j]) + finalY[j] = -1; + } +#endif + } else { + error: + zero_channel[i] = TRUE; + } + // So we just defer everything else to later + + // at this point we've decoded the floor into buffer + } + } + stb_prof(0); + // at this point we've decoded all floors + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + // re-enable coupled channels if necessary + memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels); + for (i=0; i < map->coupling_steps; ++i) + if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) { + zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE; + } + +// RESIDUE DECODE + for (i=0; i < map->submaps; ++i) { + float *residue_buffers[STB_VORBIS_MAX_CHANNELS]; + int r,t; + uint8 do_not_decode[256]; + int ch = 0; + for (j=0; j < f->channels; ++j) { + if (map->chan[j].mux == i) { + if (zero_channel[j]) { + do_not_decode[ch] = TRUE; + residue_buffers[ch] = NULL; + } else { + do_not_decode[ch] = FALSE; + residue_buffers[ch] = f->channel_buffers[j]; + } + ++ch; + } + } + r = map->submap_residue[i]; + t = f->residue_types[r]; + decode_residue(f, residue_buffers, ch, n2, r, do_not_decode); + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + +// INVERSE COUPLING + stb_prof(14); + for (i = map->coupling_steps-1; i >= 0; --i) { + int n2 = n >> 1; + float *m = f->channel_buffers[map->chan[i].magnitude]; + float *a = f->channel_buffers[map->chan[i].angle ]; + for (j=0; j < n2; ++j) { + float a2,m2; + if (m[j] > 0) + if (a[j] > 0) + m2 = m[j], a2 = m[j] - a[j]; + else + a2 = m[j], m2 = m[j] + a[j]; + else + if (a[j] > 0) + m2 = m[j], a2 = m[j] + a[j]; + else + a2 = m[j], m2 = m[j] - a[j]; + m[j] = m2; + a[j] = a2; + } + } + + // finish decoding the floors +#ifndef STB_VORBIS_NO_DEFER_FLOOR + stb_prof(15); + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL); + } + } +#else + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + for (j=0; j < n2; ++j) + f->channel_buffers[i][j] *= f->floor_buffers[i][j]; + } + } +#endif + +// INVERSE MDCT + stb_prof(16); + for (i=0; i < f->channels; ++i) + inverse_mdct(f->channel_buffers[i], n, f, m->blockflag); + stb_prof(0); + + // this shouldn't be necessary, unless we exited on an error + // and want to flush to get to the next packet + flush_packet(f); + + if (f->first_decode) { + // assume we start so first non-discarded sample is sample 0 + // this isn't to spec, but spec would require us to read ahead + // and decode the size of all current frames--could be done, + // but presumably it's not a commonly used feature + f->current_loc = -n2; // start of first frame is positioned for discard + // we might have to discard samples "from" the next frame too, + // if we're lapping a large block then a small at the start? + f->discard_samples_deferred = n - right_end; + f->current_loc_valid = TRUE; + f->first_decode = FALSE; + } else if (f->discard_samples_deferred) { + left_start += f->discard_samples_deferred; + *p_left = left_start; + f->discard_samples_deferred = 0; + } else if (f->previous_length == 0 && f->current_loc_valid) { + // we're recovering from a seek... that means we're going to discard + // the samples from this packet even though we know our position from + // the last page header, so we need to update the position based on + // the discarded samples here + // but wait, the code below is going to add this in itself even + // on a discard, so we don't need to do it here... + } + + // check if we have ogg information about the sample # for this packet + if (f->last_seg_which == f->end_seg_with_known_loc) { + // if we have a valid current loc, and this is final: + if (f->current_loc_valid && (f->page_flag & PAGEFLAG_last_page)) { + uint32 current_end = f->known_loc_for_packet - (n-right_end); + // then let's infer the size of the (probably) short final frame + if (current_end < f->current_loc + right_end) { + if (current_end < f->current_loc) { + // negative truncation, that's impossible! + *len = 0; + } else { + *len = current_end - f->current_loc; + } + *len += left_start; + f->current_loc += *len; + return TRUE; + } + } + // otherwise, just set our sample loc + // guess that the ogg granule pos refers to the _middle_ of the + // last frame? + // set f->current_loc to the position of left_start + f->current_loc = f->known_loc_for_packet - (n2-left_start); + f->current_loc_valid = TRUE; + } + if (f->current_loc_valid) + f->current_loc += (right_start - left_start); + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + *len = right_end; // ignore samples after the window goes to 0 + return TRUE; +} + +static int vorbis_decode_packet(vorb *f, int *len, int *p_left, int *p_right) +{ + int mode, left_end, right_end; + if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0; + return vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left); +} + +static int vorbis_finish_frame(stb_vorbis *f, int len, int left, int right) +{ + int prev,i,j; + // we use right&left (the start of the right- and left-window sin()-regions) + // to determine how much to return, rather than inferring from the rules + // (same result, clearer code); 'left' indicates where our sin() window + // starts, therefore where the previous window's right edge starts, and + // therefore where to start mixing from the previous buffer. 'right' + // indicates where our sin() ending-window starts, therefore that's where + // we start saving, and where our returned-data ends. + + // mixin from previous window + if (f->previous_length) { + int i,j, n = f->previous_length; + float *w = get_window(f, n); + for (i=0; i < f->channels; ++i) { + for (j=0; j < n; ++j) + f->channel_buffers[i][left+j] = + f->channel_buffers[i][left+j]*w[ j] + + f->previous_window[i][ j]*w[n-1-j]; + } + } + + prev = f->previous_length; + + // last half of this data becomes previous window + f->previous_length = len - right; + + // @OPTIMIZE: could avoid this copy by double-buffering the + // output (flipping previous_window with channel_buffers), but + // then previous_window would have to be 2x as large, and + // channel_buffers couldn't be temp mem (although they're NOT + // currently temp mem, they could be (unless we want to level + // performance by spreading out the computation)) + for (i=0; i < f->channels; ++i) + for (j=0; right+j < len; ++j) + f->previous_window[i][j] = f->channel_buffers[i][right+j]; + + if (!prev) + // there was no previous packet, so this data isn't valid... + // this isn't entirely true, only the would-have-overlapped data + // isn't valid, but this seems to be what the spec requires + return 0; + + // truncate a short frame + if (len < right) right = len; + + f->samples_output += right-left; + + return right - left; +} + +static void vorbis_pump_first_frame(stb_vorbis *f) +{ + int len, right, left; + if (vorbis_decode_packet(f, &len, &left, &right)) + vorbis_finish_frame(f, len, left, right); +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API +static int is_whole_packet_present(stb_vorbis *f, int end_page) +{ + // make sure that we have the packet available before continuing... + // this requires a full ogg parse, but we know we can fetch from f->stream + + // instead of coding this out explicitly, we could save the current read state, + // read the next packet with get8() until end-of-packet, check f->eof, then + // reset the state? but that would be slower, esp. since we'd have over 256 bytes + // of state to restore (primarily the page segment table) + + int s = f->next_seg, first = TRUE; + uint8 *p = f->stream; + + if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag + for (; s < f->segment_count; ++s) { + p += f->segments[s]; + if (f->segments[s] < 255) // stop at first short segment + break; + } + // either this continues, or it ends it... + if (end_page) + if (s < f->segment_count-1) return error(f, VORBIS_invalid_stream); + if (s == f->segment_count) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + for (; s == -1;) { + uint8 *q; + int n; + + // check that we have the page header ready + if (p + 26 >= f->stream_end) return error(f, VORBIS_need_more_data); + // validate the page + if (memcmp(p, ogg_page_header, 4)) return error(f, VORBIS_invalid_stream); + if (p[4] != 0) return error(f, VORBIS_invalid_stream); + if (first) { // the first segment must NOT have 'continued_packet', later ones MUST + if (f->previous_length) + if ((p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + // if no previous length, we're resynching, so we can come in on a continued-packet, + // which we'll just drop + } else { + if (!(p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + } + n = p[26]; // segment counts + q = p+27; // q points to segment table + p = q + n; // advance past header + // make sure we've read the segment table + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + for (s=0; s < n; ++s) { + p += q[s]; + if (q[s] < 255) + break; + } + if (end_page) + if (s < n-1) return error(f, VORBIS_invalid_stream); + if (s == f->segment_count) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + return TRUE; +} +#endif // !STB_VORBIS_NO_PUSHDATA_API + +static int start_decoder(vorb *f) +{ + uint8 header[6], x,y; + int len,i,j,k, max_submaps = 0; + int longest_floorlist=0; + + // first page, first packet + + if (!start_page(f)) return FALSE; + // validate page flag + if (!(f->page_flag & PAGEFLAG_first_page)) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_last_page) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_continued_packet) return error(f, VORBIS_invalid_first_page); + // check for expected packet length + if (f->segment_count != 1) return error(f, VORBIS_invalid_first_page); + if (f->segments[0] != 30) return error(f, VORBIS_invalid_first_page); + // read packet + // check packet header + if (get8(f) != VORBIS_packet_id) return error(f, VORBIS_invalid_first_page); + if (!getn(f, header, 6)) return error(f, VORBIS_unexpected_eof); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_first_page); + // vorbis_version + if (get32(f) != 0) return error(f, VORBIS_invalid_first_page); + f->channels = get8(f); if (!f->channels) return error(f, VORBIS_invalid_first_page); + if (f->channels > STB_VORBIS_MAX_CHANNELS) return error(f, VORBIS_too_many_channels); + f->sample_rate = get32(f); if (!f->sample_rate) return error(f, VORBIS_invalid_first_page); + get32(f); // bitrate_maximum + get32(f); // bitrate_nominal + get32(f); // bitrate_minimum + x = get8(f); + { int log0,log1; + log0 = x & 15; + log1 = x >> 4; + f->blocksize_0 = 1 << log0; + f->blocksize_1 = 1 << log1; + if (log0 < 6 || log0 > 13) return error(f, VORBIS_invalid_setup); + if (log1 < 6 || log1 > 13) return error(f, VORBIS_invalid_setup); + if (log0 > log1) return error(f, VORBIS_invalid_setup); + } + + // framing_flag + x = get8(f); + if (!(x & 1)) return error(f, VORBIS_invalid_first_page); + + // second packet! + if (!start_page(f)) return FALSE; + + if (!start_packet(f)) return FALSE; + do { + len = next_segment(f); + skip(f, len); + f->bytes_in_seg = 0; + } while (len); + + // third packet! + if (!start_packet(f)) return FALSE; + + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (IS_PUSH_MODE(f)) { + if (!is_whole_packet_present(f, TRUE)) { + // convert error in ogg header to write type + if (f->error == VORBIS_invalid_stream) + f->error = VORBIS_invalid_setup; + return FALSE; + } + } + #endif + + crc32_init(); // always init it, to avoid multithread race conditions + + if (get8_packet(f) != VORBIS_packet_setup) return error(f, VORBIS_invalid_setup); + for (i=0; i < 6; ++i) header[i] = get8_packet(f); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); + + // codebooks + + f->codebook_count = get_bits(f,8) + 1; + f->codebooks = (Codebook *) setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count); + if (f->codebooks == NULL) return error(f, VORBIS_outofmem); + memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count); + for (i=0; i < f->codebook_count; ++i) { + uint32 *values; + int ordered, sorted_count; + int total=0; + uint8 *lengths; + Codebook *c = f->codebooks+i; + x = get_bits(f, 8); if (x != 0x42) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x43) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x56) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); + c->dimensions = (get_bits(f, 8)<<8) + x; + x = get_bits(f, 8); + y = get_bits(f, 8); + c->entries = (get_bits(f, 8)<<16) + (y<<8) + x; + ordered = get_bits(f,1); + c->sparse = ordered ? 0 : get_bits(f,1); + + if (c->sparse) + lengths = (uint8 *) setup_temp_malloc(f, c->entries); + else + lengths = c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + + if (!lengths) return error(f, VORBIS_outofmem); + + if (ordered) { + int current_entry = 0; + int current_length = get_bits(f,5) + 1; + while (current_entry < c->entries) { + int limit = c->entries - current_entry; + int n = get_bits(f, ilog(limit)); + if (current_entry + n > (int) c->entries) { return error(f, VORBIS_invalid_setup); } + memset(lengths + current_entry, current_length, n); + current_entry += n; + ++current_length; + } + } else { + for (j=0; j < c->entries; ++j) { + int present = c->sparse ? get_bits(f,1) : 1; + if (present) { + lengths[j] = get_bits(f, 5) + 1; + ++total; + } else { + lengths[j] = NO_CODE; + } + } + } + + if (c->sparse && total >= c->entries >> 2) { + // convert sparse items to non-sparse! + if (c->entries > (int) f->setup_temp_memory_required) + f->setup_temp_memory_required = c->entries; + + c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + memcpy(c->codeword_lengths, lengths, c->entries); + setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs! + lengths = c->codeword_lengths; + c->sparse = 0; + } + + // compute the size of the sorted tables + if (c->sparse) { + sorted_count = total; + //assert(total != 0); + } else { + sorted_count = 0; + #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + for (j=0; j < c->entries; ++j) + if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) + ++sorted_count; + #endif + } + + c->sorted_entries = sorted_count; + values = NULL; + + if (!c->sparse) { + c->codewords = (uint32 *) setup_malloc(f, sizeof(c->codewords[0]) * c->entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + } else { + unsigned int size; + if (c->sorted_entries) { + c->codeword_lengths = (uint8 *) setup_malloc(f, c->sorted_entries); + if (!c->codeword_lengths) return error(f, VORBIS_outofmem); + c->codewords = (uint32 *) setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + values = (uint32 *) setup_temp_malloc(f, sizeof(*values) * c->sorted_entries); + if (!values) return error(f, VORBIS_outofmem); + } + size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries; + if (size > f->setup_temp_memory_required) + f->setup_temp_memory_required = size; + } + + if (!compute_codewords(c, lengths, c->entries, values)) { + if (c->sparse) setup_temp_free(f, values, 0); + return error(f, VORBIS_invalid_setup); + } + + if (c->sorted_entries) { + // allocate an extra slot for sentinels + c->sorted_codewords = (uint32 *) setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1)); + // allocate an extra slot at the front so that c->sorted_values[-1] is defined + // so that we can catch that case without an extra if + c->sorted_values = ( int *) setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1)); + if (c->sorted_values) { ++c->sorted_values; c->sorted_values[-1] = -1; } + compute_sorted_huffman(c, lengths, values); + } + + if (c->sparse) { + setup_temp_free(f, values, sizeof(*values)*c->sorted_entries); + setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries); + setup_temp_free(f, lengths, c->entries); + c->codewords = NULL; + } + + compute_accelerated_huffman(c); + + c->lookup_type = get_bits(f, 4); + if (c->lookup_type > 2) return error(f, VORBIS_invalid_setup); + if (c->lookup_type > 0) { + uint16 *mults; + c->minimum_value = float32_unpack(get_bits(f, 32)); + c->delta_value = float32_unpack(get_bits(f, 32)); + c->value_bits = get_bits(f, 4)+1; + c->sequence_p = get_bits(f,1); + if (c->lookup_type == 1) { + c->lookup_values = lookup1_values(c->entries, c->dimensions); + } else { + c->lookup_values = c->entries * c->dimensions; + } + mults = (uint16 *) setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values); + if (mults == NULL) return error(f, VORBIS_outofmem); + for (j=0; j < (int) c->lookup_values; ++j) { + int q = get_bits(f, c->value_bits); + if (q == EOP) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_invalid_setup); } + mults[j] = q; + } + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int len, sparse = c->sparse; + // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop + if (sparse) { + if (c->sorted_entries == 0) goto skip; + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions); + } else + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions); + if (c->multiplicands == NULL) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } + len = sparse ? c->sorted_entries : c->entries; + for (j=0; j < len; ++j) { + int z = sparse ? c->sorted_values[j] : j, div=1; + for (k=0; k < c->dimensions; ++k) { + int off = (z / div) % c->lookup_values; + c->multiplicands[j*c->dimensions + k] = + #ifndef STB_VORBIS_CODEBOOK_FLOATS + mults[off]; + #else + mults[off]*c->delta_value + c->minimum_value; + // in this case (and this case only) we could pre-expand c->sequence_p, + // and throw away the decode logic for it; have to ALSO do + // it in the case below, but it can only be done if + // STB_VORBIS_CODEBOOK_FLOATS + // !STB_VORBIS_DIVIDES_IN_CODEBOOK + #endif + div *= c->lookup_values; + } + } + setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); + c->lookup_type = 2; + } + else +#endif + { + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values); + #ifndef STB_VORBIS_CODEBOOK_FLOATS + memcpy(c->multiplicands, mults, sizeof(c->multiplicands[0]) * c->lookup_values); + #else + for (j=0; j < (int) c->lookup_values; ++j) + c->multiplicands[j] = mults[j] * c->delta_value + c->minimum_value; + setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); + #endif + } + skip:; + + #ifdef STB_VORBIS_CODEBOOK_FLOATS + if (c->lookup_type == 2 && c->sequence_p) { + for (j=1; j < (int) c->lookup_values; ++j) + c->multiplicands[j] = c->multiplicands[j-1]; + c->sequence_p = 0; + } + #endif + } + } + + // time domain transfers (notused) + + x = get_bits(f, 6) + 1; + for (i=0; i < x; ++i) { + uint32 z = get_bits(f, 16); + if (z != 0) return error(f, VORBIS_invalid_setup); + } + + // Floors + f->floor_count = get_bits(f, 6)+1; + f->floor_config = (Floor *) setup_malloc(f, f->floor_count * sizeof(*f->floor_config)); + for (i=0; i < f->floor_count; ++i) { + f->floor_types[i] = get_bits(f, 16); + if (f->floor_types[i] > 1) return error(f, VORBIS_invalid_setup); + if (f->floor_types[i] == 0) { + Floor0 *g = &f->floor_config[i].floor0; + g->order = get_bits(f,8); + g->rate = get_bits(f,16); + g->bark_map_size = get_bits(f,16); + g->amplitude_bits = get_bits(f,6); + g->amplitude_offset = get_bits(f,8); + g->number_of_books = get_bits(f,4) + 1; + for (j=0; j < g->number_of_books; ++j) + g->book_list[j] = get_bits(f,8); + return error(f, VORBIS_feature_not_supported); + } else { + Point p[31*8+2]; + Floor1 *g = &f->floor_config[i].floor1; + int max_class = -1; + g->partitions = get_bits(f, 5); + for (j=0; j < g->partitions; ++j) { + g->partition_class_list[j] = get_bits(f, 4); + if (g->partition_class_list[j] > max_class) + max_class = g->partition_class_list[j]; + } + for (j=0; j <= max_class; ++j) { + g->class_dimensions[j] = get_bits(f, 3)+1; + g->class_subclasses[j] = get_bits(f, 2); + if (g->class_subclasses[j]) { + g->class_masterbooks[j] = get_bits(f, 8); + if (g->class_masterbooks[j] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + for (k=0; k < 1 << g->class_subclasses[j]; ++k) { + g->subclass_books[j][k] = get_bits(f,8)-1; + if (g->subclass_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + } + g->floor1_multiplier = get_bits(f,2)+1; + g->rangebits = get_bits(f,4); + g->Xlist[0] = 0; + g->Xlist[1] = 1 << g->rangebits; + g->values = 2; + for (j=0; j < g->partitions; ++j) { + int c = g->partition_class_list[j]; + for (k=0; k < g->class_dimensions[c]; ++k) { + g->Xlist[g->values] = get_bits(f, g->rangebits); + ++g->values; + } + } + // precompute the sorting + for (j=0; j < g->values; ++j) { + p[j].x = g->Xlist[j]; + p[j].y = j; + } + qsort(p, g->values, sizeof(p[0]), point_compare); + for (j=0; j < g->values; ++j) + g->sorted_order[j] = (uint8) p[j].y; + // precompute the neighbors + for (j=2; j < g->values; ++j) { + int low,hi; + neighbors(g->Xlist, j, &low,&hi); + g->neighbors[j][0] = low; + g->neighbors[j][1] = hi; + } + + if (g->values > longest_floorlist) + longest_floorlist = g->values; + } + } + + // Residue + f->residue_count = get_bits(f, 6)+1; + f->residue_config = (Residue *) setup_malloc(f, f->residue_count * sizeof(*f->residue_config)); + for (i=0; i < f->residue_count; ++i) { + uint8 residue_cascade[64]; + Residue *r = f->residue_config+i; + f->residue_types[i] = get_bits(f, 16); + if (f->residue_types[i] > 2) return error(f, VORBIS_invalid_setup); + r->begin = get_bits(f, 24); + r->end = get_bits(f, 24); + r->part_size = get_bits(f,24)+1; + r->classifications = get_bits(f,6)+1; + r->classbook = get_bits(f,8); + for (j=0; j < r->classifications; ++j) { + uint8 high_bits=0; + uint8 low_bits=get_bits(f,3); + if (get_bits(f,1)) + high_bits = get_bits(f,5); + residue_cascade[j] = high_bits*8 + low_bits; + } + r->residue_books = (short (*)[8]) setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications); + for (j=0; j < r->classifications; ++j) { + for (k=0; k < 8; ++k) { + if (residue_cascade[j] & (1 << k)) { + r->residue_books[j][k] = get_bits(f, 8); + if (r->residue_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } else { + r->residue_books[j][k] = -1; + } + } + } + // precompute the classifications[] array to avoid inner-loop mod/divide + // call it 'classdata' since we already have r->classifications + r->classdata = (uint8 **) setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + if (!r->classdata) return error(f, VORBIS_outofmem); + memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + for (j=0; j < f->codebooks[r->classbook].entries; ++j) { + int classwords = f->codebooks[r->classbook].dimensions; + int temp = j; + r->classdata[j] = (uint8 *) setup_malloc(f, sizeof(r->classdata[j][0]) * classwords); + for (k=classwords-1; k >= 0; --k) { + r->classdata[j][k] = temp % r->classifications; + temp /= r->classifications; + } + } + } + + f->mapping_count = get_bits(f,6)+1; + f->mapping = (Mapping *) setup_malloc(f, f->mapping_count * sizeof(*f->mapping)); + for (i=0; i < f->mapping_count; ++i) { + Mapping *m = f->mapping + i; + int mapping_type = get_bits(f,16); + if (mapping_type != 0) return error(f, VORBIS_invalid_setup); + m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan)); + if (get_bits(f,1)) + m->submaps = get_bits(f,4); + else + m->submaps = 1; + if (m->submaps > max_submaps) + max_submaps = m->submaps; + if (get_bits(f,1)) { + m->coupling_steps = get_bits(f,8)+1; + for (k=0; k < m->coupling_steps; ++k) { + m->chan[k].magnitude = get_bits(f, ilog(f->channels)-1); + m->chan[k].angle = get_bits(f, ilog(f->channels)-1); + if (m->chan[k].magnitude >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].angle >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].magnitude == m->chan[k].angle) return error(f, VORBIS_invalid_setup); + } + } else + m->coupling_steps = 0; + + // reserved field + if (get_bits(f,2)) return error(f, VORBIS_invalid_setup); + if (m->submaps > 1) { + for (j=0; j < f->channels; ++j) { + m->chan[j].mux = get_bits(f, 4); + if (m->chan[j].mux >= m->submaps) return error(f, VORBIS_invalid_setup); + } + } else + // @SPECIFICATION: this case is missing from the spec + for (j=0; j < f->channels; ++j) + m->chan[j].mux = 0; + + for (j=0; j < m->submaps; ++j) { + get_bits(f,8); // discard + m->submap_floor[j] = get_bits(f,8); + m->submap_residue[j] = get_bits(f,8); + if (m->submap_floor[j] >= f->floor_count) return error(f, VORBIS_invalid_setup); + if (m->submap_residue[j] >= f->residue_count) return error(f, VORBIS_invalid_setup); + } + } + + // Modes + f->mode_count = get_bits(f, 6)+1; + for (i=0; i < f->mode_count; ++i) { + Mode *m = f->mode_config+i; + m->blockflag = get_bits(f,1); + m->windowtype = get_bits(f,16); + m->transformtype = get_bits(f,16); + m->mapping = get_bits(f,8); + if (m->windowtype != 0) return error(f, VORBIS_invalid_setup); + if (m->transformtype != 0) return error(f, VORBIS_invalid_setup); + if (m->mapping >= f->mapping_count) return error(f, VORBIS_invalid_setup); + } + + flush_packet(f); + + f->previous_length = 0; + + for (i=0; i < f->channels; ++i) { + f->channel_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1); + f->previous_window[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + f->finalY[i] = (int16 *) setup_malloc(f, sizeof(int16) * longest_floorlist); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + f->floor_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + #endif + } + + if (!init_blocksize(f, 0, f->blocksize_0)) return FALSE; + if (!init_blocksize(f, 1, f->blocksize_1)) return FALSE; + f->blocksize[0] = f->blocksize_0; + f->blocksize[1] = f->blocksize_1; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (integer_divide_table[1][1]==0) + for (i=0; i < DIVTAB_NUMER; ++i) + for (j=1; j < DIVTAB_DENOM; ++j) + integer_divide_table[i][j] = i / j; +#endif + + // compute how much temporary memory is needed + + // 1. + { + uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1); + uint32 classify_mem; + int i,max_part_read=0; + for (i=0; i < f->residue_count; ++i) { + Residue *r = f->residue_config + i; + int n_read = r->end - r->begin; + int part_read = n_read / r->part_size; + if (part_read > max_part_read) + max_part_read = part_read; + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(uint8 *)); + #else + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *)); + #endif + + f->temp_memory_required = classify_mem; + if (imdct_mem > f->temp_memory_required) + f->temp_memory_required = imdct_mem; + } + + f->first_decode = TRUE; + + if (f->alloc.alloc_buffer) { + assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); + // check if there's enough temp memory so we don't error later + if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset) + return error(f, VORBIS_outofmem); + } + + f->first_audio_page_offset = stb_vorbis_get_file_offset(f); + + return TRUE; +} + +static void vorbis_deinit(stb_vorbis *p) +{ + int i,j; + for (i=0; i < p->residue_count; ++i) { + Residue *r = p->residue_config+i; + if (r->classdata) { + for (j=0; j < p->codebooks[r->classbook].entries; ++j) + setup_free(p, r->classdata[j]); + setup_free(p, r->classdata); + } + setup_free(p, r->residue_books); + } + + if (p->codebooks) { + for (i=0; i < p->codebook_count; ++i) { + Codebook *c = p->codebooks + i; + setup_free(p, c->codeword_lengths); + setup_free(p, c->multiplicands); + setup_free(p, c->codewords); + setup_free(p, c->sorted_codewords); + // c->sorted_values[-1] is the first entry in the array + setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL); + } + setup_free(p, p->codebooks); + } + setup_free(p, p->floor_config); + setup_free(p, p->residue_config); + for (i=0; i < p->mapping_count; ++i) + setup_free(p, p->mapping[i].chan); + setup_free(p, p->mapping); + for (i=0; i < p->channels; ++i) { + setup_free(p, p->channel_buffers[i]); + setup_free(p, p->previous_window[i]); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + setup_free(p, p->floor_buffers[i]); + #endif + setup_free(p, p->finalY[i]); + } + for (i=0; i < 2; ++i) { + setup_free(p, p->A[i]); + setup_free(p, p->B[i]); + setup_free(p, p->C[i]); + setup_free(p, p->window[i]); + } + #ifndef STB_VORBIS_NO_STDIO + if (p->close_on_free) fclose(p->f); + #endif +} + +void stb_vorbis_close(stb_vorbis *p) +{ + if (p == NULL) return; + vorbis_deinit(p); + setup_free(p,p); +} + +static void vorbis_init(stb_vorbis *p, stb_vorbis_alloc *z) +{ + memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start + if (z) { + p->alloc = *z; + p->alloc.alloc_buffer_length_in_bytes = (p->alloc.alloc_buffer_length_in_bytes+3) & ~3; + p->temp_offset = p->alloc.alloc_buffer_length_in_bytes; + } + p->eof = 0; + p->error = VORBIS__no_error; + p->stream = NULL; + p->codebooks = NULL; + p->page_crc_tests = -1; + #ifndef STB_VORBIS_NO_STDIO + p->close_on_free = FALSE; + p->f = NULL; + #endif +} + +int stb_vorbis_get_sample_offset(stb_vorbis *f) +{ + if (f->current_loc_valid) + return f->current_loc; + else + return -1; +} + +stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) +{ + stb_vorbis_info d; + d.channels = f->channels; + d.sample_rate = f->sample_rate; + d.setup_memory_required = f->setup_memory_required; + d.setup_temp_memory_required = f->setup_temp_memory_required; + d.temp_memory_required = f->temp_memory_required; + d.max_frame_size = f->blocksize_1 >> 1; + return d; +} + +int stb_vorbis_get_error(stb_vorbis *f) +{ + int e = f->error; + f->error = VORBIS__no_error; + return e; +} + +static stb_vorbis * vorbis_alloc(stb_vorbis *f) +{ + stb_vorbis *p = (stb_vorbis *) setup_malloc(f, sizeof(*p)); + return p; +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +void stb_vorbis_flush_pushdata(stb_vorbis *f) +{ + f->previous_length = 0; + f->page_crc_tests = 0; + f->discard_samples_deferred = 0; + f->current_loc_valid = FALSE; + f->first_decode = FALSE; + f->samples_output = 0; + f->channel_buffer_start = 0; + f->channel_buffer_end = 0; +} + +static int vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int data_len) +{ + int i,n; + for (i=0; i < f->page_crc_tests; ++i) + f->scan[i].bytes_done = 0; + + // if we have room for more scans, search for them first, because + // they may cause us to stop early if their header is incomplete + if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) { + if (data_len < 4) return 0; + data_len -= 3; // need to look for 4-byte sequence, so don't miss + // one that straddles a boundary + for (i=0; i < data_len; ++i) { + if (data[i] == 0x4f) { + if (0==memcmp(data+i, ogg_page_header, 4)) { + int j,len; + uint32 crc; + // make sure we have the whole page header + if (i+26 >= data_len || i+27+data[i+26] >= data_len) { + // only read up to this page start, so hopefully we'll + // have the whole page header start next time + data_len = i; + break; + } + // ok, we have it all; compute the length of the page + len = 27 + data[i+26]; + for (j=0; j < data[i+26]; ++j) + len += data[i+27+j]; + // scan everything up to the embedded crc (which we must 0) + crc = 0; + for (j=0; j < 22; ++j) + crc = crc32_update(crc, data[i+j]); + // now process 4 0-bytes + for ( ; j < 26; ++j) + crc = crc32_update(crc, 0); + // len is the total number of bytes we need to scan + n = f->page_crc_tests++; + f->scan[n].bytes_left = len-j; + f->scan[n].crc_so_far = crc; + f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24); + // if the last frame on a page is continued to the next, then + // we can't recover the sample_loc immediately + if (data[i+27+data[i+26]-1] == 255) + f->scan[n].sample_loc = ~0; + else + f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24); + f->scan[n].bytes_done = i+j; + if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) + break; + // keep going if we still have room for more + } + } + } + } + + for (i=0; i < f->page_crc_tests;) { + uint32 crc; + int j; + int n = f->scan[i].bytes_done; + int m = f->scan[i].bytes_left; + if (m > data_len - n) m = data_len - n; + // m is the bytes to scan in the current chunk + crc = f->scan[i].crc_so_far; + for (j=0; j < m; ++j) + crc = crc32_update(crc, data[n+j]); + f->scan[i].bytes_left -= m; + f->scan[i].crc_so_far = crc; + if (f->scan[i].bytes_left == 0) { + // does it match? + if (f->scan[i].crc_so_far == f->scan[i].goal_crc) { + // Houston, we have page + data_len = n+m; // consumption amount is wherever that scan ended + f->page_crc_tests = -1; // drop out of page scan mode + f->previous_length = 0; // decode-but-don't-output one frame + f->next_seg = -1; // start a new page + f->current_loc = f->scan[i].sample_loc; // set the current sample location + // to the amount we'd have decoded had we decoded this page + f->current_loc_valid = f->current_loc != ~0; + return data_len; + } + // delete entry + f->scan[i] = f->scan[--f->page_crc_tests]; + } else { + ++i; + } + } + + return data_len; +} + +// return value: number of bytes we used +int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, // the file we're decoding + uint8 *data, int data_len, // the memory available for decoding + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ) +{ + int i; + int len,right,left; + + if (!IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (f->page_crc_tests >= 0) { + *samples = 0; + return vorbis_search_for_page_pushdata(f, data, data_len); + } + + f->stream = data; + f->stream_end = data + data_len; + f->error = VORBIS__no_error; + + // check that we have the entire packet in memory + if (!is_whole_packet_present(f, FALSE)) { + *samples = 0; + return 0; + } + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + // save the actual error we encountered + enum STBVorbisError error = f->error; + if (error == VORBIS_bad_packet_type) { + // flush and resynch + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return f->stream - data; + } + if (error == VORBIS_continued_packet_flag_invalid) { + if (f->previous_length == 0) { + // we may be resynching, in which case it's ok to hit one + // of these; just discard the packet + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return f->stream - data; + } + } + // if we get an error while parsing, what to do? + // well, it DEFINITELY won't work to continue from where we are! + stb_vorbis_flush_pushdata(f); + // restore the error that actually made us bail + f->error = error; + *samples = 0; + return 1; + } + + // success! + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + if (channels) *channels = f->channels; + *samples = len; + *output = f->outputs; + return f->stream - data; +} + +stb_vorbis *stb_vorbis_open_pushdata( + unsigned char *data, int data_len, // the memory available for decoding + int *data_used, // only defined if result is not NULL + int *error, stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.stream = data; + p.stream_end = data + data_len; + p.push_mode = TRUE; + if (!start_decoder(&p)) { + if (p.eof) + *error = VORBIS_need_more_data; + else + *error = p.error; + return NULL; + } + f = vorbis_alloc(&p); + if (f) { + *f = p; + *data_used = f->stream - data; + *error = 0; + return f; + } else { + vorbis_deinit(&p); + return NULL; + } +} +#endif // STB_VORBIS_NO_PUSHDATA_API + +unsigned int stb_vorbis_get_file_offset(stb_vorbis *f) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + if (USE_MEMORY(f)) return f->stream - f->stream_start; + #ifndef STB_VORBIS_NO_STDIO + return ftell(f->f) - f->f_start; + #endif +} + +#ifndef STB_VORBIS_NO_PULLDATA_API +// +// DATA-PULLING API +// + +static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) +{ + for(;;) { + int n; + if (f->eof) return 0; + n = get8(f); + if (n == 0x4f) { // page header + unsigned int retry_loc = stb_vorbis_get_file_offset(f); + int i; + // check if we're off the end of a file_section stream + if (retry_loc - 25 > f->stream_len) + return 0; + // check the rest of the header + for (i=1; i < 4; ++i) + if (get8(f) != ogg_page_header[i]) + break; + if (f->eof) return 0; + if (i == 4) { + uint8 header[27]; + uint32 i, crc, goal, len; + for (i=0; i < 4; ++i) + header[i] = ogg_page_header[i]; + for (; i < 27; ++i) + header[i] = get8(f); + if (f->eof) return 0; + if (header[4] != 0) goto invalid; + goal = header[22] + (header[23] << 8) + (header[24]<<16) + (header[25]<<24); + for (i=22; i < 26; ++i) + header[i] = 0; + crc = 0; + for (i=0; i < 27; ++i) + crc = crc32_update(crc, header[i]); + len = 0; + for (i=0; i < header[26]; ++i) { + int s = get8(f); + crc = crc32_update(crc, s); + len += s; + } + if (len && f->eof) return 0; + for (i=0; i < len; ++i) + crc = crc32_update(crc, get8(f)); + // finished parsing probable page + if (crc == goal) { + // we could now check that it's either got the last + // page flag set, OR it's followed by the capture + // pattern, but I guess TECHNICALLY you could have + // a file with garbage between each ogg page and recover + // from it automatically? So even though that paranoia + // might decrease the chance of an invalid decode by + // another 2^32, not worth it since it would hose those + // invalid-but-useful files? + if (end) + *end = stb_vorbis_get_file_offset(f); + if (last) + if (header[5] & 0x04) + *last = 1; + else + *last = 0; + set_file_offset(f, retry_loc-1); + return 1; + } + } + invalid: + // not a valid page, so rewind and look for next one + set_file_offset(f, retry_loc); + } + } +} + +// seek is implemented with 'interpolation search'--this is like +// binary search, but we use the data values to estimate the likely +// location of the data item (plus a bit of a bias so when the +// estimation is wrong we don't waste overly much time) + +#define SAMPLE_unknown 0xffffffff + + +// ogg vorbis, in its insane infinite wisdom, only provides +// information about the sample at the END of the page. +// therefore we COULD have the data we need in the current +// page, and not know it. we could just use the end location +// as our only knowledge for bounds, seek back, and eventually +// the binary search finds it. or we can try to be smart and +// not waste time trying to locate more pages. we try to be +// smart, since this data is already in memory anyway, so +// doing needless I/O would be crazy! +static int vorbis_analyze_page(stb_vorbis *f, ProbedPage *z) +{ + uint8 header[27], lacing[255]; + uint8 packet_type[255]; + int num_packet, packet_start, previous =0; + int i,len; + uint32 samples; + + // record where the page starts + z->page_start = stb_vorbis_get_file_offset(f); + + // parse the header + getn(f, header, 27); + assert(header[0] == 'O' && header[1] == 'g' && header[2] == 'g' && header[3] == 'S'); + getn(f, lacing, header[26]); + + // determine the length of the payload + len = 0; + for (i=0; i < header[26]; ++i) + len += lacing[i]; + + // this implies where the page ends + z->page_end = z->page_start + 27 + header[26] + len; + + // read the last-decoded sample out of the data + z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 16); + + if (header[5] & 4) { + // if this is the last page, it's not possible to work + // backwards to figure out the first sample! whoops! fuck. + z->first_decoded_sample = SAMPLE_unknown; + set_file_offset(f, z->page_start); + return 1; + } + + // scan through the frames to determine the sample-count of each one... + // our goal is the sample # of the first fully-decoded sample on the + // page, which is the first decoded sample of the 2nd page + + num_packet=0; + + packet_start = ((header[5] & 1) == 0); + + for (i=0; i < header[26]; ++i) { + if (packet_start) { + uint8 n,b,m; + if (lacing[i] == 0) goto bail; // trying to read from zero-length packet + n = get8(f); + // if bottom bit is non-zero, we've got corruption + if (n & 1) goto bail; + n >>= 1; + b = ilog(f->mode_count-1); + m = n >> b; + n &= (1 << b)-1; + if (n >= f->mode_count) goto bail; + if (num_packet == 0 && f->mode_config[n].blockflag) + previous = (m & 1); + packet_type[num_packet++] = f->mode_config[n].blockflag; + skip(f, lacing[i]-1); + } else + skip(f, lacing[i]); + packet_start = (lacing[i] < 255); + } + + // now that we know the sizes of all the pages, we can start determining + // how much sample data there is. + + samples = 0; + + // for the last packet, we step by its whole length, because the definition + // is that we encoded the end sample loc of the 'last packet completed', + // where 'completed' refers to packets being split, and we are left to guess + // what 'end sample loc' means. we assume it means ignoring the fact that + // the last half of the data is useless without windowing against the next + // packet... (so it's not REALLY complete in that sense) + if (num_packet > 1) + samples += f->blocksize[packet_type[num_packet-1]]; + + for (i=num_packet-2; i >= 1; --i) { + // now, for this packet, how many samples do we have that + // do not overlap the following packet? + if (packet_type[i] == 1) + if (packet_type[i+1] == 1) + samples += f->blocksize_1 >> 1; + else + samples += ((f->blocksize_1 - f->blocksize_0) >> 2) + (f->blocksize_0 >> 1); + else + samples += f->blocksize_0 >> 1; + } + // now, at this point, we've rewound to the very beginning of the + // _second_ packet. if we entirely discard the first packet after + // a seek, this will be exactly the right sample number. HOWEVER! + // we can't as easily compute this number for the LAST page. The + // only way to get the sample offset of the LAST page is to use + // the end loc from the previous page. But what that returns us + // is _exactly_ the place where we get our first non-overlapped + // sample. (I think. Stupid spec for being ambiguous.) So for + // consistency it's better to do that here, too. However, that + // will then require us to NOT discard all of the first frame we + // decode, in some cases, which means an even weirder frame size + // and extra code. what a fucking pain. + + // we're going to discard the first packet if we + // start the seek here, so we don't care about it. (we could actually + // do better; if the first packet is long, and the previous packet + // is short, there's actually data in the first half of the first + // packet that doesn't need discarding... but not worth paying the + // effort of tracking that of that here and in the seeking logic) + // except crap, if we infer it from the _previous_ packet's end + // location, we DO need to use that definition... and we HAVE to + // infer the start loc of the LAST packet from the previous packet's + // end location. fuck you, ogg vorbis. + + z->first_decoded_sample = z->last_decoded_sample - samples; + + // restore file state to where we were + set_file_offset(f, z->page_start); + return 1; + + // restore file state to where we were + bail: + set_file_offset(f, z->page_start); + return 0; +} + +static int vorbis_seek_frame_from_page(stb_vorbis *f, uint32 page_start, uint32 first_sample, uint32 target_sample, int fine) +{ + int left_start, left_end, right_start, right_end, mode,i; + int frame=0; + uint32 frame_start; + int frames_to_skip, data_to_skip; + + // first_sample is the sample # of the first sample that doesn't + // overlap the previous page... note that this requires us to + // _partially_ discard the first packet! bleh. + set_file_offset(f, page_start); + + f->next_seg = -1; // force page resync + + frame_start = first_sample; + // frame start is where the previous packet's last decoded sample + // was, which corresponds to left_end... EXCEPT if the previous + // packet was long and this packet is short? Probably a bug here. + + + // now, we can start decoding frames... we'll only FAKE decode them, + // until we find the frame that contains our sample; then we'll rewind, + // and try again + for (;;) { + int start; + + if (!vorbis_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode)) + return error(f, VORBIS_seek_failed); + + if (frame == 0) + start = left_end; + else + start = left_start; + + // the window starts at left_start; the last valid sample we generate + // before the next frame's window start is right_start-1 + if (target_sample < frame_start + right_start-start) + break; + + flush_packet(f); + if (f->eof) + return error(f, VORBIS_seek_failed); + + frame_start += right_start - start; + + ++frame; + } + + // ok, at this point, the sample we want is contained in frame #'frame' + + // to decode frame #'frame' normally, we have to decode the + // previous frame first... but if it's the FIRST frame of the page + // we can't. if it's the first frame, it means it falls in the part + // of the first frame that doesn't overlap either of the other frames. + // so, if we have to handle that case for the first frame, we might + // as well handle it for all of them, so: + if (target_sample > frame_start + (left_end - left_start)) { + // so what we want to do is go ahead and just immediately decode + // this frame, but then make it so the next get_frame_float() uses + // this already-decoded data? or do we want to go ahead and rewind, + // and leave a flag saying to skip the first N data? let's do that + frames_to_skip = frame; // if this is frame #1, skip 1 frame (#0) + data_to_skip = left_end - left_start; + } else { + // otherwise, we want to skip frames 0, 1, 2, ... frame-2 + // (which means frame-2+1 total frames) then decode frame-1, + // then leave frame pending + frames_to_skip = frame - 1; + assert(frames_to_skip >= 0); + data_to_skip = -1; + } + + set_file_offset(f, page_start); + f->next_seg = - 1; // force page resync + + for (i=0; i < frames_to_skip; ++i) { + maybe_start_packet(f); + flush_packet(f); + } + + if (data_to_skip >= 0) { + int i,j,n = f->blocksize_0 >> 1; + f->discard_samples_deferred = data_to_skip; + for (i=0; i < f->channels; ++i) + for (j=0; j < n; ++j) + f->previous_window[i][j] = 0; + f->previous_length = n; + frame_start += data_to_skip; + } else { + f->previous_length = 0; + vorbis_pump_first_frame(f); + } + + // at this point, the NEXT decoded frame will generate the desired sample + if (fine) { + // so if we're doing sample accurate streaming, we want to go ahead and decode it! + if (target_sample != frame_start) { + int n; + stb_vorbis_get_frame_float(f, &n, NULL); + assert(target_sample > frame_start); + assert(f->channel_buffer_start + (int) (target_sample-frame_start) < f->channel_buffer_end); + f->channel_buffer_start += (target_sample - frame_start); + } + } + + return 0; +} + +static int vorbis_seek_base(stb_vorbis *f, unsigned int sample_number, int fine) +{ + ProbedPage p[2],q; + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + // do we know the location of the last page? + if (f->p_last.page_start == 0) { + uint32 z = stb_vorbis_stream_length_in_samples(f); + if (z == 0) return error(f, VORBIS_cant_find_last_page); + } + + p[0] = f->p_first; + p[1] = f->p_last; + + if (sample_number >= f->p_last.last_decoded_sample) + sample_number = f->p_last.last_decoded_sample-1; + + if (sample_number < f->p_first.last_decoded_sample) { + vorbis_seek_frame_from_page(f, p[0].page_start, 0, sample_number, fine); + return 0; + } else { + int attempts=0; + while (p[0].page_end < p[1].page_start) { + uint32 probe; + uint32 start_offset, end_offset; + uint32 start_sample, end_sample; + + // copy these into local variables so we can tweak them + // if any are unknown + start_offset = p[0].page_end; + end_offset = p[1].after_previous_page_start; // an address known to seek to page p[1] + start_sample = p[0].last_decoded_sample; + end_sample = p[1].last_decoded_sample; + + // currently there is no such tweaking logic needed/possible? + if (start_sample == SAMPLE_unknown || end_sample == SAMPLE_unknown) + return error(f, VORBIS_seek_failed); + + // now we want to lerp between these for the target samples... + + // step 1: we need to bias towards the page start... + if (start_offset + 4000 < end_offset) + end_offset -= 4000; + + // now compute an interpolated search loc + probe = start_offset + (int) floor((float) (end_offset - start_offset) / (end_sample - start_sample) * (sample_number - start_sample)); + + // next we need to bias towards binary search... + // code is a little wonky to allow for full 32-bit unsigned values + if (attempts >= 4) { + uint32 probe2 = start_offset + ((end_offset - start_offset) >> 1); + if (attempts >= 8) + probe = probe2; + else if (probe < probe2) + probe = probe + ((probe2 - probe) >> 1); + else + probe = probe2 + ((probe - probe2) >> 1); + } + ++attempts; + + set_file_offset(f, probe); + if (!vorbis_find_page(f, NULL, NULL)) return error(f, VORBIS_seek_failed); + if (!vorbis_analyze_page(f, &q)) return error(f, VORBIS_seek_failed); + q.after_previous_page_start = probe; + + // it's possible we've just found the last page again + if (q.page_start == p[1].page_start) { + p[1] = q; + continue; + } + + if (sample_number < q.last_decoded_sample) + p[1] = q; + else + p[0] = q; + } + + if (p[0].last_decoded_sample <= sample_number && sample_number < p[1].last_decoded_sample) { + vorbis_seek_frame_from_page(f, p[1].page_start, p[0].last_decoded_sample, sample_number, fine); + return 0; + } + return error(f, VORBIS_seek_failed); + } +} + +int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) +{ + return vorbis_seek_base(f, sample_number, FALSE); +} + +int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number) +{ + return vorbis_seek_base(f, sample_number, TRUE); +} + +void stb_vorbis_seek_start(stb_vorbis *f) +{ + if (IS_PUSH_MODE(f)) { error(f, VORBIS_invalid_api_mixing); return; } + set_file_offset(f, f->first_audio_page_offset); + f->previous_length = 0; + f->first_decode = TRUE; + f->next_seg = -1; + vorbis_pump_first_frame(f); +} + +unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f) +{ + unsigned int restore_offset, previous_safe; + unsigned int end, last_page_loc; + + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + if (!f->total_samples) { + int last; + uint32 lo,hi; + char header[6]; + + // first, store the current decode position so we can restore it + restore_offset = stb_vorbis_get_file_offset(f); + + // now we want to seek back 64K from the end (the last page must + // be at most a little less than 64K, but let's allow a little slop) + if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset) + previous_safe = f->stream_len - 65536; + else + previous_safe = f->first_audio_page_offset; + + set_file_offset(f, previous_safe); + // previous_safe is now our candidate 'earliest known place that seeking + // to will lead to the final page' + + if (!vorbis_find_page(f, &end, (int unsigned *)&last)) { + // if we can't find a page, we're hosed! + f->error = VORBIS_cant_find_last_page; + f->total_samples = 0xffffffff; + goto done; + } + + // check if there are more pages + last_page_loc = stb_vorbis_get_file_offset(f); + + // stop when the last_page flag is set, not when we reach eof; + // this allows us to stop short of a 'file_section' end without + // explicitly checking the length of the section + while (!last) { + set_file_offset(f, end); + if (!vorbis_find_page(f, &end, (int unsigned *)&last)) { + // the last page we found didn't have the 'last page' flag + // set. whoops! + break; + } + previous_safe = last_page_loc+1; + last_page_loc = stb_vorbis_get_file_offset(f); + } + + set_file_offset(f, last_page_loc); + + // parse the header + getn(f, (unsigned char *)header, 6); + // extract the absolute granule position + lo = get32(f); + hi = get32(f); + if (lo == 0xffffffff && hi == 0xffffffff) { + f->error = VORBIS_cant_find_last_page; + f->total_samples = SAMPLE_unknown; + goto done; + } + if (hi) + lo = 0xfffffffe; // saturate + f->total_samples = lo; + + f->p_last.page_start = last_page_loc; + f->p_last.page_end = end; + f->p_last.last_decoded_sample = lo; + f->p_last.first_decoded_sample = SAMPLE_unknown; + f->p_last.after_previous_page_start = previous_safe; + + done: + set_file_offset(f, restore_offset); + } + return f->total_samples == SAMPLE_unknown ? 0 : f->total_samples; +} + +float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) +{ + return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate; +} + + + +int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output) +{ + int len, right,left,i; + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + f->channel_buffer_start = f->channel_buffer_end = 0; + return 0; + } + + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + f->channel_buffer_start = left; + f->channel_buffer_end = left+len; + + if (channels) *channels = f->channels; + if (output) *output = f->outputs; + return len; +} + +#ifndef STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, stb_vorbis_alloc *alloc, unsigned int length) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.f = file; + p.f_start = ftell(file); + p.stream_len = length; + p.close_on_free = close_on_free; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, stb_vorbis_alloc *alloc) +{ + unsigned int len, start; + start = ftell(file); + fseek(file, 0, SEEK_END); + len = ftell(file) - start; + fseek(file, start, SEEK_SET); + return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len); +} + +stb_vorbis * stb_vorbis_open_filename(char *filename, int *error, stb_vorbis_alloc *alloc) +{ + FILE *f = fopen(filename, "rb"); + if (f) + return stb_vorbis_open_file(f, TRUE, error, alloc); + if (error) *error = VORBIS_file_open_failure; + return NULL; +} +#endif // STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_memory(unsigned char *data, int len, int *error, stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + if (data == NULL) return NULL; + vorbis_init(&p, alloc); + p.stream = data; + p.stream_end = data + len; + p.stream_start = p.stream; + p.stream_len = len; + p.push_mode = FALSE; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#define PLAYBACK_MONO 1 +#define PLAYBACK_LEFT 2 +#define PLAYBACK_RIGHT 4 + +#define L (PLAYBACK_LEFT | PLAYBACK_MONO) +#define C (PLAYBACK_LEFT | PLAYBACK_RIGHT | PLAYBACK_MONO) +#define R (PLAYBACK_RIGHT | PLAYBACK_MONO) + +static int8 channel_position[7][6] = +{ + { 0 }, + { C }, + { L, R }, + { L, C, R }, + { L, R, L, R }, + { L, C, R, L, R }, + { L, C, R, L, R, C }, +}; + + +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + typedef union { + float f; + int i; + } float_conv; + typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4]; + #define FASTDEF(x) float_conv x + // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round + #define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT)) + #define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22)) + #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + MAGIC(s), temp.i - ADDEND(s)) + #define check_endianness() +#else + #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s)))) + #define check_endianness() + #define FASTDEF(x) +#endif + +static void copy_samples(short *dest, float *src, int len) +{ + int i; + check_endianness(); + for (i=0; i < len; ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp, src[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + dest[i] = v; + } +} + +static void compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len) +{ + #define BUFFER_SIZE 32 + float buffer[BUFFER_SIZE]; + int i,j,o,n = BUFFER_SIZE; + check_endianness(); + for (o = 0; o < len; o += BUFFER_SIZE) { + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + if (channel_position[num_c][j] & mask) { + for (i=0; i < n; ++i) + buffer[i] += data[j][d_offset+o+i]; + } + } + for (i=0; i < n; ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o+i] = v; + } + } +} + +static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; +static void compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len) +{ + #define BUFFER_SIZE 32 + float buffer[BUFFER_SIZE]; + int i,j,o,n = BUFFER_SIZE >> 1; + // o is the offset in the source data + check_endianness(); + for (o = 0; o < len; o += BUFFER_SIZE >> 1) { + // o2 is the offset in the output data + int o2 = o << 1; + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + int m = channel_position[num_c][j] & (PLAYBACK_LEFT | PLAYBACK_RIGHT); + if (m == (PLAYBACK_LEFT | PLAYBACK_RIGHT)) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_LEFT) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_RIGHT) { + for (i=0; i < n; ++i) { + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } + } + for (i=0; i < (n<<1); ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o2+i] = v; + } + } +} + +static void convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples) +{ + int i; + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; + for (i=0; i < buf_c; ++i) + compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + for (i=0; i < limit; ++i) + copy_samples(buffer[i]+b_offset, data[i], samples); + for ( ; i < buf_c; ++i) + memset(buffer[i]+b_offset, 0, sizeof(short) * samples); + } +} + +int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) +{ + float **output; + int len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len > num_samples) len = num_samples; + if (len) + convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len); + return len; +} + +static void convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len) +{ + int i; + check_endianness(); + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + assert(buf_c == 2); + for (i=0; i < buf_c; ++i) + compute_stereo_samples(buffer, data_c, data, d_offset, len); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + int j; + for (j=0; j < len; ++j) { + for (i=0; i < limit; ++i) { + FASTDEF(temp); + float f = data[i][d_offset+j]; + int v = FAST_SCALED_FLOAT_TO_INT(temp, f,15);//data[i][d_offset+j],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + *buffer++ = v; + } + for ( ; i < buf_c; ++i) + *buffer++ = 0; + } + } +} + +int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts) +{ + float **output; + int len; + if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts); + len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len) { + if (len*num_c > num_shorts) len = num_shorts / num_c; + convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len); + } + return len; +} + +int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts) +{ + float **outputs; + int len = num_shorts / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k); + buffer += k*channels; + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k); + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +#ifndef STB_VORBIS_NO_STDIO +int stb_vorbis_decode_filename(char *filename, int *channels, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + return data_len; +} +#endif // NO_STDIO + +int stb_vorbis_decode_memory(uint8 *mem, int len, int *channels, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + return data_len; +} +#endif + +int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats) +{ + float **outputs; + int len = num_floats / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int i,j; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + for (j=0; j < k; ++j) { + for (i=0; i < z; ++i) + *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j]; + for ( ; i < channels; ++i) + *buffer++ = 0; + } + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < num_samples) { + int i; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= num_samples) k = num_samples - n; + if (k) { + for (i=0; i < z; ++i) + memcpy(buffer[i]+n, f->channel_buffers+f->channel_buffer_start, sizeof(float)*k); + for ( ; i < channels; ++i) + memset(buffer[i]+n, 0, sizeof(float) * k); + } + n += k; + f->channel_buffer_start += k; + if (n == num_samples) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} +#endif // STB_VORBIS_NO_PULLDATA_API + +#endif // STB_VORBIS_HEADER_ONLY diff --git a/src/stb_vorbis.h b/src/stb_vorbis.h new file mode 100644 index 000000000..98c1209ac --- /dev/null +++ b/src/stb_vorbis.h @@ -0,0 +1,352 @@ +// Ogg Vorbis I audio decoder -- version 0.99996 +// +// Written in April 2007 by Sean Barrett, sponsored by RAD Game Tools. +// +// Placed in the public domain April 2007 by the author: no copyright is +// claimed, and you may use it for any purpose you like. +// +// No warranty for any purpose is expressed or implied by the author (nor +// by RAD Game Tools). Report bugs and send enhancements to the author. +// +// Get the latest version and other information at: +// http://nothings.org/stb_vorbis/ + +// Todo: +// +// - seeking (note you can seek yourself using the pushdata API) +// +// Limitations: +// +// - floor 0 not supported (used in old ogg vorbis files) +// - lossless sample-truncation at beginning ignored +// - cannot concatenate multiple vorbis streams +// - sample positions are 32-bit, limiting seekable 192Khz +// files to around 6 hours (Ogg supports 64-bit) +// +// All of these limitations may be removed in future versions. + + +////////////////////////////////////////////////////////////////////////////// +// +// HEADER BEGINS HERE +// + +#ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H +#define STB_VORBIS_INCLUDE_STB_VORBIS_H + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) +#define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/////////// THREAD SAFETY + +// Individual stb_vorbis* handles are not thread-safe; you cannot decode from +// them from multiple threads at the same time. However, you can have multiple +// stb_vorbis* handles and decode from them independently in multiple thrads. + + +/////////// MEMORY ALLOCATION + +// normally stb_vorbis uses malloc() to allocate memory at startup, +// and alloca() to allocate temporary memory during a frame on the +// stack. (Memory consumption will depend on the amount of setup +// data in the file and how you set the compile flags for speed +// vs. size. In my test files the maximal-size usage is ~150KB.) +// +// You can modify the wrapper functions in the source (setup_malloc, +// setup_temp_malloc, temp_malloc) to change this behavior, or you +// can use a simpler allocation model: you pass in a buffer from +// which stb_vorbis will allocate _all_ its memory (including the +// temp memory). "open" may fail with a VORBIS_outofmem if you +// do not pass in enough data; there is no way to determine how +// much you do need except to succeed (at which point you can +// query get_info to find the exact amount required. yes I know +// this is lame). +// +// If you pass in a non-NULL buffer of the type below, allocation +// will occur from it as described above. Otherwise just pass NULL +// to use malloc()/alloca() + +typedef struct +{ + char *alloc_buffer; + int alloc_buffer_length_in_bytes; +} stb_vorbis_alloc; + + +/////////// FUNCTIONS USEABLE WITH ALL INPUT MODES + +typedef struct stb_vorbis stb_vorbis; + +typedef struct +{ + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int setup_temp_memory_required; + unsigned int temp_memory_required; + + int max_frame_size; +} stb_vorbis_info; + +// get general information about the file +extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f); + +// get the last error detected (clears it, too) +extern int stb_vorbis_get_error(stb_vorbis *f); + +// close an ogg vorbis file and free all memory in use +extern void stb_vorbis_close(stb_vorbis *f); + +// this function returns the offset (in samples) from the beginning of the +// file that will be returned by the next decode, if it is known, or -1 +// otherwise. after a flush_pushdata() call, this may take a while before +// it becomes valid again. +// NOT WORKING YET after a seek with PULLDATA API +extern int stb_vorbis_get_sample_offset(stb_vorbis *f); + +// returns the current seek point within the file, or offset from the beginning +// of the memory buffer. In pushdata mode it returns 0. +extern unsigned int stb_vorbis_get_file_offset(stb_vorbis *f); + +/////////// PUSHDATA API + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +// this API allows you to get blocks of data from any source and hand +// them to stb_vorbis. you have to buffer them; stb_vorbis will tell +// you how much it used, and you have to give it the rest next time; +// and stb_vorbis may not have enough data to work with and you will +// need to give it the same data again PLUS more. Note that the Vorbis +// specification does not bound the size of an individual frame. + +extern stb_vorbis *stb_vorbis_open_pushdata( + unsigned char *datablock, int datablock_length_in_bytes, + int *datablock_memory_consumed_in_bytes, + int *error, + stb_vorbis_alloc *alloc_buffer); +// create a vorbis decoder by passing in the initial data block containing +// the ogg&vorbis headers (you don't need to do parse them, just provide +// the first N bytes of the file--you're told if it's not enough, see below) +// on success, returns an stb_vorbis *, does not set error, returns the amount of +// data parsed/consumed on this call in *datablock_memory_consumed_in_bytes; +// on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed +// if returns NULL and *error is VORBIS_need_more_data, then the input block was +// incomplete and you need to pass in a larger block from the start of the file + +extern int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, unsigned char *datablock, int datablock_length_in_bytes, + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ); +// decode a frame of audio sample data if possible from the passed-in data block +// +// return value: number of bytes we used from datablock +// possible cases: +// 0 bytes used, 0 samples output (need more data) +// N bytes used, 0 samples output (resynching the stream, keep going) +// N bytes used, M samples output (one frame of data) +// note that after opening a file, you will ALWAYS get one N-bytes,0-sample +// frame, because Vorbis always "discards" the first frame. +// +// Note that on resynch, stb_vorbis will rarely consume all of the buffer, +// instead only datablock_length_in_bytes-3 or less. This is because it wants +// to avoid missing parts of a page header if they cross a datablock boundary, +// without writing state-machiney code to record a partial detection. +// +// The number of channels returned are stored in *channels (which can be +// NULL--it is always the same as the number of channels reported by +// get_info). *output will contain an array of float* buffers, one per +// channel. In other words, (*output)[0][0] contains the first sample from +// the first channel, and (*output)[1][0] contains the first sample from +// the second channel. + +extern void stb_vorbis_flush_pushdata(stb_vorbis *f); +// inform stb_vorbis that your next datablock will not be contiguous with +// previous ones (e.g. you've seeked in the data); future attempts to decode +// frames will cause stb_vorbis to resynchronize (as noted above), and +// once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it +// will begin decoding the _next_ frame. +// +// if you want to seek using pushdata, you need to seek in your file, then +// call stb_vorbis_flush_pushdata(), then start calling decoding, then once +// decoding is returning you data, call stb_vorbis_get_sample_offset, and +// if you don't like the result, seek your file again and repeat. +#endif + + +////////// PULLING INPUT API + +#ifndef STB_VORBIS_NO_PULLDATA_API +// This API assumes stb_vorbis is allowed to pull data from a source-- +// either a block of memory containing the _entire_ vorbis stream, or a +// FILE * that you or it create, or possibly some other reading mechanism +// if you go modify the source to replace the FILE * case with some kind +// of callback to your code. (But if you don't support seeking, you may +// just want to go ahead and use pushdata.) + +#if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION) +extern int stb_vorbis_decode_filename(char *filename, int *channels, short **output); +#endif +extern int stb_vorbis_decode_memory(unsigned char *mem, int len, int *channels, short **output); +// decode an entire file and output the data interleaved into a malloc()ed +// buffer stored in *output. The return value is the number of samples +// decoded, or -1 if the file could not be opened or was not an ogg vorbis file. +// When you're done with it, just free() the pointer returned in *output. + +extern stb_vorbis * stb_vorbis_open_memory(unsigned char *data, int len, + int *error, stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from an ogg vorbis stream in memory (note +// this must be the entire stream!). on failure, returns NULL and sets *error + +#ifndef STB_VORBIS_NO_STDIO +extern stb_vorbis * stb_vorbis_open_filename(char *filename, + int *error, stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from a filename via fopen(). on failure, +// returns NULL and sets *error (possibly to VORBIS_file_open_failure). + +extern stb_vorbis * stb_vorbis_open_file(FILE *f, int close_handle_on_close, + int *error, stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from an open FILE *, looking for a stream at +// the _current_ seek point (ftell). on failure, returns NULL and sets *error. +// note that stb_vorbis must "own" this stream; if you seek it in between +// calls to stb_vorbis, it will become confused. Morever, if you attempt to +// perform stb_vorbis_seek_*() operations on this file, it will assume it +// owns the _entire_ rest of the file after the start point. Use the next +// function, stb_vorbis_open_file_section(), to limit it. + +extern stb_vorbis * stb_vorbis_open_file_section(FILE *f, int close_handle_on_close, + int *error, stb_vorbis_alloc *alloc_buffer, unsigned int len); +// create an ogg vorbis decoder from an open FILE *, looking for a stream at +// the _current_ seek point (ftell); the stream will be of length 'len' bytes. +// on failure, returns NULL and sets *error. note that stb_vorbis must "own" +// this stream; if you seek it in between calls to stb_vorbis, it will become +// confused. +#endif + +extern int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number); +extern int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number); +// NOT WORKING YET +// these functions seek in the Vorbis file to (approximately) 'sample_number'. +// after calling seek_frame(), the next call to get_frame_*() will include +// the specified sample. after calling stb_vorbis_seek(), the next call to +// stb_vorbis_get_samples_* will start with the specified sample. If you +// do not need to seek to EXACTLY the target sample when using get_samples_*, +// you can also use seek_frame(). + +extern void stb_vorbis_seek_start(stb_vorbis *f); +// this function is equivalent to stb_vorbis_seek(f,0), but it +// actually works + +extern unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f); +extern float stb_vorbis_stream_length_in_seconds(stb_vorbis *f); +// these functions return the total length of the vorbis stream + +extern int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output); +// decode the next frame and return the number of samples. the number of +// channels returned are stored in *channels (which can be NULL--it is always +// the same as the number of channels reported by get_info). *output will +// contain an array of float* buffers, one per channel. These outputs will +// be overwritten on the next call to stb_vorbis_get_frame_*. +// +// You generally should not intermix calls to stb_vorbis_get_frame_*() +// and stb_vorbis_get_samples_*(), since the latter calls the former. + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +extern int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts); +extern int stb_vorbis_get_frame_short (stb_vorbis *f, int num_c, short **buffer, int num_samples); +#endif +// decode the next frame and return the number of samples per channel. the +// data is coerced to the number of channels you request according to the +// channel coercion rules (see below). You must pass in the size of your +// buffer(s) so that stb_vorbis will not overwrite the end of the buffer. +// The maximum buffer size needed can be gotten from get_info(); however, +// the Vorbis I specification implies an absolute maximum of 4096 samples +// per channel. Note that for interleaved data, you pass in the number of +// shorts (the size of your array), but the return value is the number of +// samples per channel, not the total number of samples. + +// Channel coercion rules: +// Let M be the number of channels requested, and N the number of channels present, +// and Cn be the nth channel; let stereo L be the sum of all L and center channels, +// and stereo R be the sum of all R and center channels (channel assignment from the +// vorbis spec). +// M N output +// 1 k sum(Ck) for all k +// 2 * stereo L, stereo R +// k l k > l, the first l channels, then 0s +// k l k <= l, the first k channels +// Note that this is not _good_ surround etc. mixing at all! It's just so +// you get something useful. + +extern int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats); +extern int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples); +// gets num_samples samples, not necessarily on a frame boundary--this requires +// buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES. +// Returns the number of samples stored per channel; it may be less than requested +// at the end of the file. If there are no more samples in the file, returns 0. + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +extern int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts); +extern int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int num_samples); +#endif +// gets num_samples samples, not necessarily on a frame boundary--this requires +// buffering so you have to supply the buffers. Applies the coercion rules above +// to produce 'channels' channels. Returns the number of samples stored per channel; +// it may be less than requested at the end of the file. If there are no more +// samples in the file, returns 0. + +#endif + +//////// ERROR CODES + +enum STBVorbisError +{ + VORBIS__no_error, + + VORBIS_need_more_data=1, // not a real error + + VORBIS_invalid_api_mixing, // can't mix API modes + VORBIS_outofmem, // not enough memory + VORBIS_feature_not_supported, // uses floor 0 + VORBIS_too_many_channels, // STB_VORBIS_MAX_CHANNELS is too small + VORBIS_file_open_failure, // fopen() failed + VORBIS_seek_without_length, // can't seek in unknown-length file + + VORBIS_unexpected_eof=10, // file is truncated? + VORBIS_seek_invalid, // seek past EOF + + // decoding errors (corrupt/invalid stream) -- you probably + // don't care about the exact details of these + + // vorbis errors: + VORBIS_invalid_setup=20, + VORBIS_invalid_stream, + + // ogg errors: + VORBIS_missing_capture_pattern=30, + VORBIS_invalid_stream_structure_version, + VORBIS_continued_packet_flag_invalid, + VORBIS_incorrect_stream_serial_number, + VORBIS_invalid_first_page, + VORBIS_bad_packet_type, + VORBIS_cant_find_last_page, + VORBIS_seek_failed, +}; + + +#ifdef __cplusplus +} +#endif + +#endif // STB_VORBIS_INCLUDE_STB_VORBIS_H diff --git a/src/text.c b/src/text.c new file mode 100644 index 000000000..e9a66d893 --- /dev/null +++ b/src/text.c @@ -0,0 +1,515 @@ +/********************************************************************************************* +* +* raylib.text +* +* Basic functions to load SpriteFonts and draw Text +* +* Uses external lib: +* stb_image - Multiple formats image loading (JPEG, PNG, BMP, TGA, PSD, GIF, HDR, PIC) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "raylib.h" + +#include // OpenGL functions +#include // Declares malloc() and free() for memory management +#include // String management functions (just strlen() is used) +#include // Used for functions with variable number of parameters (FormatText()) +#include "stb_image.h" // Used to read image data (multiple formats support) + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#define FIRST_CHAR 32 +#define MAX_FONTCHARS 128 + +#define BIT_CHECK(a,b) ((a) & (1<<(b))) + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef unsigned char byte; + +// SpriteFont one Character (Glyph) data +struct Character { + int value; //char value = ' '; (int)value = 32; + int x; + int y; + int w; + int h; +}; + +//---------------------------------------------------------------------------------- +// Global variables +//---------------------------------------------------------------------------------- +static SpriteFont defaultFont; // Default font provided by raylib + // NOTE: defaultFont is loaded on InitWindow and disposed on CloseWindow [module: core] + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +static bool PixelIsMagenta(Color p); // Check if a pixel is magenta +static int ParseImageData(Color *imgDataPixel, int imgWidth, int imgHeight, Character **charSet); // Parse image pixel data to obtain character set measures +static int GetNextPOT(int num); // Calculate next power-of-two value for a given value + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- +extern void LoadDefaultFont() +{ + defaultFont.numChars = 96; // We know our default font has 94 chars + defaultFont.texture.width = 128; // We know our default font texture is 128 pixels width + defaultFont.texture.height = 64; // We know our default font texture is 64 pixels height + + // Default font is directly defined here (data generated from a sprite font image) + // This way, we reconstruct SpriteFont without creating large global variables + // This data is automatically allocated to Stack and automatically deallocated at the end of this function + int defaultFontData[256] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200020, 0x0001b000, 0x00000000, 0x00000000, 0x8ef92520, 0x00020a00, 0x7dbe8000, 0x1f7df45f, + 0x4a2bf2a0, 0x0852091e, 0x41224000, 0x10041450, 0x2e292020, 0x08220812, 0x41222000, 0x10041450, 0x10f92020, 0x3efa084c, 0x7d22103c, 0x107df7de, + 0xe8a12020, 0x08220832, 0x05220800, 0x10450410, 0xa4a3f000, 0x08520832, 0x05220400, 0x10450410, 0xe2f92020, 0x0002085e, 0x7d3e0281, 0x107df41f, + 0x00200000, 0x8001b000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc0000fbe, 0xfbf7e00f, 0x5fbf7e7d, 0x0050bee8, 0x440808a2, 0x0a142fe8, 0x50810285, 0x0050a048, + 0x49e428a2, 0x0a142828, 0x40810284, 0x0048a048, 0x10020fbe, 0x09f7ebaf, 0xd89f3e84, 0x0047a04f, 0x09e48822, 0x0a142aa1, 0x50810284, 0x0048a048, + 0x04082822, 0x0a142fa0, 0x50810285, 0x0050a248, 0x00008fbe, 0xfbf42021, 0x5f817e7d, 0x07d09ce8, 0x00008000, 0x00000fe0, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000c0180, + 0xdfbf4282, 0x0bfbf7ef, 0x42850505, 0x004804bf, 0x50a142c6, 0x08401428, 0x42852505, 0x00a808a0, 0x50a146aa, 0x08401428, 0x42852505, 0x00081090, + 0x5fa14a92, 0x0843f7e8, 0x7e792505, 0x00082088, 0x40a15282, 0x08420128, 0x40852489, 0x00084084, 0x40a16282, 0x0842022a, 0x40852451, 0x00088082, + 0xc0bf4282, 0xf843f42f, 0x7e85fc21, 0x3e0900bf, 0x00000000, 0x00000004, 0x00000000, 0x000c0180, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000402, 0x41482000, 0x00000000, 0x00000800, + 0x04000404, 0x4100203c, 0x00000000, 0x00000800, 0xf7df7df0, 0x514bef85, 0xbefbefbe, 0x04513bef, 0x14414500, 0x494a2885, 0xa28a28aa, 0x04510820, + 0xf44145f0, 0x474a289d, 0xa28a28aa, 0x04510be0, 0x14414510, 0x494a2884, 0xa28a28aa, 0x02910a00, 0xf7df7df0, 0xd14a2f85, 0xbefbe8aa, 0x011f7be0, + 0x00000000, 0x00400804, 0x20080000, 0x00000000, 0x00000000, 0x00600f84, 0x20080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xac000000, 0x00000f01, 0x00000000, 0x00000000, 0x24000000, 0x00000901, 0x00000000, 0x00000000, 0x24000000, 0x00000901, 0x00000000, 0x00000000, + 0x24fa28a2, 0x00000901, 0x00000000, 0x00000000, 0x2242252a, 0x00000952, 0x00000000, 0x00000000, 0x2422222a, 0x00000929, 0x00000000, 0x00000000, + 0x2412252a, 0x00000901, 0x00000000, 0x00000000, 0x24fbe8be, 0x00000901, 0x00000000, 0x00000000, 0xac020000, 0x00000f01, 0x00000000, 0x00000000, + 0x0003e000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }; + + int charsHeight = 10; + int charsDivisor = 1; // Every char is separated from the consecutive by a 1 pixel divisor, horizontally and vertically + + int charsWidth[96] = { 3, 1, 4, 6, 5, 7, 6, 2, 3, 3, 5, 5, 2, 4, 1, 7, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 3, 4, 3, 6, + 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 5, 6, 5, 7, 6, 6, 6, 6, 6, 6, 7, 6, 7, 7, 6, 6, 6, 2, 7, 2, 3, 5, + 2, 5, 5, 5, 5, 5, 4, 5, 5, 1, 2, 5, 2, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 3, 1, 3, 4, 4 }; + + + // Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, numChars + //------------------------------------------------------------------------------ + defaultFont.charSet = (Character *)malloc(defaultFont.numChars * sizeof(Character)); // Allocate space for our character data + // This memory should be freed at end! --> Done on CloseWindow() + int currentLine = 0; + int currentPosX = charsDivisor; + int testPosX = charsDivisor; + + for (int i = 0; i < defaultFont.numChars; i++) + { + defaultFont.charSet[i].value = FIRST_CHAR + i; + defaultFont.charSet[i].x = currentPosX; + defaultFont.charSet[i].y = charsDivisor + currentLine * (charsHeight + charsDivisor); + defaultFont.charSet[i].w = charsWidth[i]; + defaultFont.charSet[i].h = charsHeight; + + testPosX += (defaultFont.charSet[i].w + charsDivisor); + + if (testPosX >= defaultFont.texture.width) + { + currentLine++; + currentPosX = 2 * charsDivisor + charsWidth[i]; + testPosX = currentPosX; + + defaultFont.charSet[i].x = charsDivisor; + defaultFont.charSet[i].y = charsDivisor + currentLine * (charsHeight + charsDivisor); + } + else currentPosX = testPosX; + } + + // Re-construct image from defaultFontData and generate OpenGL texture + //---------------------------------------------------------------------- + Color *imgDataPixel = (Color *)malloc(defaultFont.texture.width * defaultFont.texture.height * sizeof(Color)); + + for (int i = 0; i < defaultFont.texture.width * defaultFont.texture.height; i++) imgDataPixel[i] = BLANK; // Initialize array + + int counter = 0; // Font data elements counter + + // Fill imgData with defaultFontData (convert from bit to pixel!) + for (int i = 0; i < defaultFont.texture.width * defaultFont.texture.height; i += 32) + { + for (int j = 31; j >= 0; j--) + { + if (BIT_CHECK(defaultFontData[counter], j)) imgDataPixel[i+j] = WHITE; + } + + counter++; + + if (counter > 256) counter = 0; // Security check... + } + + // Convert loaded data to OpenGL texture + //---------------------------------------- + GLuint id; + glGenTextures(1, &id); // Generate pointer to the texture + + glBindTexture(GL_TEXTURE_2D, id); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // Set texture to clamp on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); // Set texture to clamp on y-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Filter for pixel-perfect drawing, alternative: GL_LINEAR + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Filter for pixel-perfect drawing, alternative: GL_LINEAR + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, defaultFont.texture.width, defaultFont.texture.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgDataPixel); + + // NOTE: Not using mipmappings (texture for 2D drawing) + // At this point we have the image converted to texture and uploaded to GPU + + free(imgDataPixel); // Now we can free loaded data from RAM memory + + defaultFont.texture.glId = id; +} + +extern void UnloadDefaultFont() +{ + glDeleteTextures(1, &defaultFont.texture.glId); + free(defaultFont.charSet); +} + +// Load a SpriteFont image into GPU memory +SpriteFont LoadSpriteFont(const char* fileName) +{ + SpriteFont spriteFont; + + // Use stb_image to load image data! + int imgWidth; + int imgHeight; + int imgBpp; + + byte *imgData = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4); // Force loading to 4 components (RGBA) + + // Convert array to pixel array for working convenience + Color *imgDataPixel = (Color *)malloc(imgWidth * imgHeight * sizeof(Color)); + Color *imgDataPixelPOT = NULL; + + int pix = 0; + + for (int i = 0; i < (imgWidth * imgHeight * 4); i += 4) + { + imgDataPixel[pix].r = imgData[i]; + imgDataPixel[pix].g = imgData[i+1]; + imgDataPixel[pix].b = imgData[i+2]; + imgDataPixel[pix].a = imgData[i+3]; + pix++; + } + + stbi_image_free(imgData); + + // At this point we have a pixel array with all the data... + + // Process bitmap Font pixel data to get measures (Character array) + // spriteFont.charSet data is filled inside the function and memory is allocated! + int numChars = ParseImageData(imgDataPixel, imgWidth, imgHeight, &spriteFont.charSet); + + spriteFont.numChars = numChars; + + // Convert image font to POT image before conversion to texture + // Just add the required amount of pixels at the right and bottom sides of image... + int potWidth = GetNextPOT(imgWidth); + int potHeight = GetNextPOT(imgHeight); + + // Check if POT texture generation is required (if texture is not already POT) + if ((potWidth != imgWidth) || (potHeight != imgWidth)) + { + // Generate POT array from NPOT data + imgDataPixelPOT = (Color *)malloc(potWidth * potHeight * sizeof(Color)); + + for (int j = 0; j < potHeight; j++) + { + for (int i = 0; i < potWidth; i++) + { + if ((j < imgHeight) && (i < imgWidth)) imgDataPixelPOT[j*potWidth + i] = imgDataPixel[j*imgWidth + i]; + else imgDataPixelPOT[j*potWidth + i] = MAGENTA; + } + } + } + + free(imgDataPixel); + + // Convert loaded data to OpenGL texture + //---------------------------------------- + GLuint id; + glGenTextures(1, &id); // Generate pointer to the texture + + glBindTexture(GL_TEXTURE_2D, id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Filter for pixel-perfect drawing, alternative: GL_LINEAR + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Filter for pixel-perfect drawing, alternative: GL_LINEAR + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, potWidth, potHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgDataPixelPOT); + + // NOTE: Not using mipmappings (texture for 2D drawing) + // At this point we have the image converted to texture and uploaded to GPU + + free(imgDataPixelPOT); // Now we can free loaded data from RAM memory + + spriteFont.texture.glId = id; + spriteFont.texture.width = potWidth; + spriteFont.texture.height = potHeight; + + return spriteFont; +} + +// Unload SpriteFont from GPU memory +void UnloadSpriteFont(SpriteFont spriteFont) +{ + glDeleteTextures(1, &spriteFont.texture.glId); + free(spriteFont.charSet); +} + +// Draw text (using default font) +// NOTE: fontSize work like in any drawing program but if fontSize is lower than font-base-size, then font-base-size is used +void DrawText(const char* text, int posX, int posY, int fontSize, int spacing, Color color) +{ + Vector2 position = { (float)posX, (float)posY }; + + DrawTextEx(defaultFont, text, position, fontSize, spacing, color); +} + +// Formatting of text with variables to 'embed' +const char *FormatText(const char *text, ...) +{ + int length = strlen(text); + char *buffer = malloc(length + 20); // We add 20 extra characters, should be enough... :P + + va_list args; + va_start(args, text); + vsprintf(buffer, text, args); // NOTE: We use vsprintf() defined in + va_end(args); + + //strcat(buffer, "\0"); // We add a end-of-string mark at the end (not needed) + + return buffer; +} + +// Draw text using SpriteFont +// NOTE: If font size is lower than base size, base size is used +void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, int fontSize, int spacing, Color tint) +{ + int length = strlen(text); + int positionX = (int)position.x; + float scaleFactor; + + Character c; + + if (fontSize <= spriteFont.charSet[0].h) scaleFactor = 1.0f; + else scaleFactor = (float)fontSize / spriteFont.charSet[0].h; + + glDisable(GL_LIGHTING); // When drawing text, disable LIGHTING + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, spriteFont.texture.glId); + + glPushMatrix(); + + // Optimized to use one draw call per string + glBegin(GL_QUADS); + for(int i = 0; i < length; i++) + { + c = spriteFont.charSet[(int)text[i] - FIRST_CHAR]; + + glColor4ub(tint.r, tint.g, tint.b, tint.a); + glNormal3f(0.0f, 0.0f, 1.0f); // Normal Pointing Towards Viewer + glTexCoord2f((float)c.x / spriteFont.texture.width, (float)c.y / spriteFont.texture.height); glVertex2f(positionX, position.y); + glTexCoord2f((float)c.x / spriteFont.texture.width, (float)(c.y + c.h) / spriteFont.texture.height); glVertex2f(positionX, position.y + (c.h) * scaleFactor); + glTexCoord2f((float)(c.x + c.w) / spriteFont.texture.width, (float)(c.y + c.h) / spriteFont.texture.height); glVertex2f(positionX + (c.w) * scaleFactor, position.y + (c.h) * scaleFactor); + glTexCoord2f((float)(c.x + c.w) / spriteFont.texture.width, (float)c.y / spriteFont.texture.height); glVertex2f(positionX + (c.w) * scaleFactor, position.y); + + positionX += (spriteFont.charSet[(int)text[i] - FIRST_CHAR].w + spacing) * scaleFactor; + } + glEnd(); + + glPopMatrix(); + + glDisable(GL_TEXTURE_2D); +} + +// Measure string width for default font +int MeasureText(const char *text, int fontSize, int spacing) +{ + Vector2 vec; + + vec = MeasureTextEx(defaultFont, text, fontSize, spacing); + + return (int)vec.x; +} + + +// Measure string size for SpriteFont +Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, int fontSize, int spacing) +{ + int len = strlen(text); + int textWidth = 0; + float scaleFactor; + + for (int i = 0; i < len; i++) + { + textWidth += spriteFont.charSet[(int)text[i] - FIRST_CHAR].w; + } + + textWidth += (int)((len - 1) * spacing); // Adds chars spacing to measure + + if (fontSize <= spriteFont.charSet[0].h) scaleFactor = 1.0f; + else scaleFactor = (float)fontSize / spriteFont.charSet[0].h; + + Vector2 vec; + vec.x = (float)textWidth * scaleFactor; + vec.y = (float)spriteFont.charSet[0].h * scaleFactor; + + return vec; +} + +// Returns the base size for a SpriteFont (chars height) +int GetFontBaseSize(SpriteFont spriteFont) +{ + return spriteFont.charSet[0].h; +} + +// Shows current FPS on top-left corner +// NOTE: Uses default font +void DrawFps(int posX, int posY) +{ + // NOTE: We are rendering fps every second for better viewing on high framerates + static float fps; + static int counter = 0; + static int refreshRate = 0; + + char buffer[20]; + + if (counter < refreshRate) + { + sprintf(buffer, "%2.0f FPS", fps); + DrawText(buffer, posX, posY, 20, 1, LIME); + + counter++; + } + else + { + fps = GetFPS(); + refreshRate = fps; + sprintf(buffer, "%2.0f FPS", fps); + DrawText(buffer, posX, posY, 20, 1, LIME); + + counter = 0; + } +} + +//---------------------------------------------------------------------------------- +// Module specific Functions Definition +//---------------------------------------------------------------------------------- + +// Check if a pixel is magenta +static bool PixelIsMagenta(Color p) +{ + return ((p.r == 255) && (p.g == 0) && (p.b == 255) && (p.a == 255)); +} + +// Parse image pixel data to obtain character set measures +static int ParseImageData(Color *imgDataPixel, int imgWidth, int imgHeight, Character **charSet) +{ + int charSpacing = 0; + int lineSpacing = 0; + + int x = 0; + int y = 0; + + Character tempCharSet[MAX_FONTCHARS]; // We allocate a temporal array for charData, once we get the actual charNumber we copy data to a sized array. + + for(y = 0; y < imgHeight; y++) + { + for(x = 0; x < imgWidth; x++) + { + if (!PixelIsMagenta(imgDataPixel[y*imgWidth + x])) break; + } + if (!PixelIsMagenta(imgDataPixel[y*imgWidth + x])) break; + } + + charSpacing = x; + lineSpacing = y; + + int charHeight = 0; + int j = 0; + + while(!PixelIsMagenta(imgDataPixel[(lineSpacing + j)*imgWidth + charSpacing])) j++; + + charHeight = j; + + // Check array values to get characters: value, x, y, w, h + int index = 0; + int lineToRead = 0; + int xPosToRead = charSpacing; + + while((lineSpacing + lineToRead * (charHeight + lineSpacing)) < imgHeight) + { + while((xPosToRead < imgWidth) && + !PixelIsMagenta((imgDataPixel[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*imgWidth + xPosToRead]))) + { + tempCharSet[index].value = FIRST_CHAR + index; + tempCharSet[index].x = xPosToRead; + tempCharSet[index].y = lineSpacing + lineToRead * (charHeight + lineSpacing); + tempCharSet[index].h = charHeight; + + int charWidth = 0; + + while(!PixelIsMagenta(imgDataPixel[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*imgWidth + xPosToRead + charWidth])) charWidth++; + + tempCharSet[index].w = charWidth; + + index++; + + xPosToRead += (charWidth + charSpacing); + } + + lineToRead++; + xPosToRead = charSpacing; + } + + // We got tempCharSet populated with char data and the number of chars (index) + // Now we move temp data to real charSet (passed as parameter to the function) + (*charSet) = (Character *)malloc(index * sizeof(Character)); // BE CAREFUL! This memory should be freed! + + for (int i = 0; i < index; i++) (*charSet)[i] = tempCharSet[i]; + + return index; +} + +// Calculate next power-of-two value for a given num +static int GetNextPOT(int num) +{ + if (num != 0) + { + num--; + num |= (num >> 1); // Or first 2 bits + num |= (num >> 2); // Or next 2 bits + num |= (num >> 4); // Or next 4 bits + num |= (num >> 8); // Or next 8 bits + num |= (num >> 16); // Or next 16 bits + num++; + } + + return num; +} \ No newline at end of file diff --git a/src/textures.c b/src/textures.c new file mode 100644 index 000000000..1a7e23a72 --- /dev/null +++ b/src/textures.c @@ -0,0 +1,275 @@ +/********************************************************************************************* +* +* raylib.textures +* +* Basic functions to load and draw Textures (2d) +* +* Uses external lib: +* stb_image - Multiple formats image loading (JPEG, PNG, BMP, TGA, PSD, GIF, PIC) +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "raylib.h" + +#include // OpenGL functions +#include // Declares malloc() and free() for memory management +#include "stb_image.h" // Used to read image data (multiple formats support) + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Nop... + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef unsigned char byte; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +// It's lonely here... + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +// No private (static) functions in this module (.c file) + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- + +// Load an image into CPU memory (RAM) +Image LoadImage(const char *fileName) +{ + Image image; + + int imgWidth; + int imgHeight; + int imgBpp; + + // NOTE: Using stb_image to load images (Supports: BMP, TGA, PNG, JPG, ...) + byte *imgData = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4); // Force loading to 4 components (RGBA) + + // Convert array to pixel array for working convenience + image.pixels = (Color *)malloc(imgWidth * imgHeight * sizeof(Color)); + + int pix = 0; + + for (int i = 0; i < (imgWidth * imgHeight * 4); i += 4) + { + image.pixels[pix].r = imgData[i]; + image.pixels[pix].g = imgData[i+1]; + image.pixels[pix].b = imgData[i+2]; + image.pixels[pix].a = imgData[i+3]; + pix++; + } + + stbi_image_free(imgData); + + image.width = imgWidth; + image.height = imgHeight; + + // ALTERNATIVE: We can load pixel data directly into Color struct pixels array, + // to do that struct data alignment should be the right one (4 byte); it is. + //image.pixels = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4); + + return image; +} + +// Unload image from CPU memory (RAM) +void UnloadImage(Image image) +{ + free(image.pixels); +} + +// Load an image as texture into GPU memory +Texture2D LoadTexture(const char *fileName) +{ + Texture2D texture; + + int imgWidth; + int imgHeight; + int imgBpp; + + // NOTE: Using stb_image to load images (Supports: BMP, TGA, PNG, JPG, ...) + byte *imgData = stbi_load(fileName, &imgWidth, &imgHeight, &imgBpp, 4); // Force loading to 4 components (RGBA) + + // Convert loaded data to OpenGL texture + //---------------------------------------- + GLuint id; + glGenTextures(1, &id); // Generate Pointer to the Texture + + glBindTexture(GL_TEXTURE_2D, id); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repead on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repead on y-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Filter for pixel-perfect drawing, alternative: GL_LINEAR + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Filter for pixel-perfect drawing, alternative: GL_LINEAR + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imgWidth, imgHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgData); + + // NOTE: Not using mipmappings (texture for 2D drawing) + // At this point we have the image converted to texture and uploaded to GPU + + stbi_image_free(imgData); // Now we can free loaded data from RAM memory + + texture.glId = id; + texture.width = imgWidth; + texture.height = imgHeight; + + return texture; +} + +// Load an image as texture (and convert to POT with mipmaps) +Texture2D LoadTextureEx(const char *fileName, bool createPOT, bool mipmaps) +{ + Texture2D texture; + + // TODO: Load and image and convert to Power-Of-Two + // NOTE: Conversion could be done just adding extra space to image or by scaling image + // NOTE: If scaling image, be careful with scaling algorithm (aproximation, bilinear, bicubic...) + + // TODO: Generate all required mipmap levels from image and convert to testure (not that easy) + // NOTE: If using OpenGL 1.1, the only option is doing mipmap generation on CPU side (i.e. gluBuild2DMipmaps) + // NOTE: raylib tries to minimize external dependencies so, we are not using GLU + // NOTE: Re-implement some function similar to gluBuild2DMipmaps (not that easy...) + + return texture; +} + +// Unload texture from GPU memory +void UnloadTexture(Texture2D texture) +{ + glDeleteTextures(1, &texture.glId); +} + +// Draw a Texture2D +void DrawTexture(Texture2D texture, int posX, int posY, Color tint) +{ + DrawTextureEx(texture, (Vector2){ (float)posX, (float)posY}, 0, 1.0f, tint); +} + +// Draw a Texture2D with extended parameters +void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint) +{ + glEnable(GL_TEXTURE_2D); // Enable textures usage + + glBindTexture(GL_TEXTURE_2D, texture.glId); + + glPushMatrix(); + // NOTE: Rotation is applied before translation and scaling, even being called in inverse order... + // NOTE: Rotation point is upper-left corner + glTranslatef(position.x, position.y, 0); + glScalef(scale, scale, 1.0f); + glRotatef(rotation, 0, 0, 1); + + glBegin(GL_QUADS); + glColor4ub(tint.r, tint.g, tint.b, tint.a); + glNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer + glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); // Bottom-left corner for texture and quad + glTexCoord2f(1.0f, 0.0f); glVertex2f(texture.width, 0.0f); // Bottom-right corner for texture and quad + glTexCoord2f(1.0f, 1.0f); glVertex2f(texture.width, texture.height); // Top-right corner for texture and quad + glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, texture.height); // Top-left corner for texture and quad + glEnd(); + glPopMatrix(); + + glDisable(GL_TEXTURE_2D); // Disable textures usage +} + +// Draw a part of a texture (defined by a rectangle) +void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, float scale, Color tint) +{ + glEnable(GL_TEXTURE_2D); // Enable textures usage + + glBindTexture(GL_TEXTURE_2D, texture.glId); + + glPushMatrix(); + glTranslatef(position.x, position.y, 0); + glScalef(scale, scale, 1.0f); + //glRotatef(rotation, 0, 0, 1); + + glBegin(GL_QUADS); + glColor4ub(tint.r, tint.g, tint.b, tint.a); + glNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer + + // Bottom-left corner for texture and quad + glTexCoord2f((float)sourceRec.x / texture.width, (float)sourceRec.y / texture.height); + glVertex2f(0.0f, 0.0f); + + // Bottom-right corner for texture and quad + glTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)sourceRec.y / texture.height); + glVertex2f(sourceRec.width, 0.0f); + + // Top-right corner for texture and quad + glTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height); + glVertex2f(sourceRec.width, sourceRec.height); + + // Top-left corner for texture and quad + glTexCoord2f((float)sourceRec.x / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height); + glVertex2f(0.0f, sourceRec.height); + glEnd(); + glPopMatrix(); + + glDisable(GL_TEXTURE_2D); // Disable textures usage +} + +// Creates a bitmap (BMP) file from an array of pixel data +// NOTE: This function is only used by module [core], not explicitly available to raylib users +extern void WriteBitmap(const char *fileName, const Color *imgDataPixel, int width, int height) +{ + int filesize = 54 + 3*width*height; + + unsigned char bmpFileHeader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0}; // Standard BMP file header + unsigned char bmpInfoHeader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0}; // Standard BMP info header + + bmpFileHeader[2] = (unsigned char)(filesize); + bmpFileHeader[3] = (unsigned char)(filesize>>8); + bmpFileHeader[4] = (unsigned char)(filesize>>16); + bmpFileHeader[5] = (unsigned char)(filesize>>24); + + bmpInfoHeader[4] = (unsigned char)(width); + bmpInfoHeader[5] = (unsigned char)(width>>8); + bmpInfoHeader[6] = (unsigned char)(width>>16); + bmpInfoHeader[7] = (unsigned char)(width>>24); + bmpInfoHeader[8] = (unsigned char)(height); + bmpInfoHeader[9] = (unsigned char)(height>>8); + bmpInfoHeader[10] = (unsigned char)(height>>16); + bmpInfoHeader[11] = (unsigned char)(height>>24); + + FILE *bmpFile = fopen(fileName, "wb"); // Define a pointer to bitmap file and open it in write-binary mode + + // NOTE: fwrite parameters are: data pointer, size in bytes of each element to be written, number of elements, file-to-write pointer + fwrite(bmpFileHeader, sizeof(unsigned char), 14, bmpFile); // Write BMP file header data + fwrite(bmpInfoHeader, sizeof(unsigned char), 40, bmpFile); // Write BMP info header data + + // Write pixel data to file + for (int y = 0; y < height ; y++) + { + for (int x = 0; x < width; x++) + { + fputc(imgDataPixel[x + y*width].b, bmpFile); + fputc(imgDataPixel[x + y*width].g, bmpFile); + fputc(imgDataPixel[x + y*width].r, bmpFile); + } + } + + fclose(bmpFile); // Close bitmap file +} \ No newline at end of file diff --git a/src/vector3.c b/src/vector3.c new file mode 100644 index 000000000..8752f4d09 --- /dev/null +++ b/src/vector3.c @@ -0,0 +1,140 @@ +/********************************************************************************************* +* +* raylib.vector3 +* +* Vector3 Functions Definition +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#include "vector3.h" + +#include + +// Add two vectors +Vector3 VectorAdd(Vector3 v1, Vector3 v2) +{ + Vector3 out; + + out.x = v1.x + v2.x; + out.y = v1.y + v2.y; + out.z = v1.z + v2.z; + + return out; +} + +// Substract two vectors +Vector3 VectorSubtract(Vector3 v1, Vector3 v2) +{ + Vector3 out; + + out.x = v1.x - v2.x; + out.y = v1.y - v2.y; + out.z = v1.z - v2.z; + + return out; +} + +// Calculate two vectors cross product +Vector3 VectorCrossProduct(Vector3 v1, Vector3 v2) +{ + Vector3 cross; + + cross.x = v1.y*v2.z - v1.z*v2.y; + cross.y = v1.z*v2.x - v1.x*v2.z; + cross.z = v1.x*v2.y - v1.y*v2.x; + + return cross; +} + +// Calculate one vector perpendicular vector +Vector3 VectorPerpendicular(Vector3 v) +{ + Vector3 out; + + float min = fabs(v.x); + Vector3 cardinalAxis = {1.0, 0.0, 0.0}; + + if (fabs(v.y) < min) + { + min = fabs(v.y); + cardinalAxis = (Vector3){0.0, 1.0, 0.0}; + } + + if(fabs(v.z) < min) + { + cardinalAxis = (Vector3){0.0, 0.0, 1.0}; + } + + out = VectorCrossProduct(v, cardinalAxis); + + return out; +} + +// Calculate two vectors dot product +float VectorDotProduct(Vector3 v1, Vector3 v2) +{ + float dot; + + dot = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; + + return dot; +} + +// Calculate vector lenght +float VectorLength(const Vector3 v) +{ + float length; + + length = sqrt(v.x*v.x + v.y*v.y + v.z*v.z); + + return length; +} + +// Scale provided vector +void VectorScale(Vector3 *v, float scale) +{ + v->x *= scale; + v->y *= scale; + v->z *= scale; +} + +// Invert provided vector (direction) +void VectorInverse(Vector3 *v) +{ + v->x = -v->x; + v->y = -v->y; + v->z = -v->z; +} + +// Normalize provided vector +void VectorNormalize(Vector3 *v) +{ + float length, ilength; + + length = VectorLength(*v); + + if (length == 0) length = 1; + + ilength = 1.0/length; + + v->x *= ilength; + v->y *= ilength; + v->z *= ilength; +} diff --git a/src/vector3.h b/src/vector3.h new file mode 100644 index 000000000..3973f4798 --- /dev/null +++ b/src/vector3.h @@ -0,0 +1,57 @@ +/********************************************************************************************* +* +* raylib.vector3 +* +* Some useful functions to work with Vector3 +* +* Copyright (c) 2013 Ramon Santamaria (Ray San - raysan@raysanweb.com) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef VECTOR3_H +#define VECTOR3_H + +#include "raylib.h" // Defines Vector3 structure + +#ifdef __cplusplus +extern "C" { // Prevents name mangling of functions +#endif + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Functions Declaration to work with Vector3 +//------------------------------------------------------------------------------------ +Vector3 VectorAdd(Vector3 v1, Vector3 v2); // Add two vectors +Vector3 VectorSubtract(Vector3 v1, Vector3 v2); // Substract two vectors +Vector3 VectorCrossProduct(Vector3 v1, Vector3 v2); // Calculate two vectors cross product +Vector3 VectorPerpendicular(Vector3 v); // Calculate one vector perpendicular vector +float VectorDotProduct(Vector3 v1, Vector3 v2); // Calculate two vectors dot product +float VectorLength(const Vector3 v); // Calculate vector lenght +void VectorScale(Vector3 *v, float scale); // Scale provided vector +void VectorInverse(Vector3 *v); // Invert provided vector (direction) +void VectorNormalize(Vector3 *v); // Normalize provided vector + +#ifdef __cplusplus +} +#endif + +#endif // VECTOR3_H \ No newline at end of file

      N5^y4$+vIXdF2~)tz7nN 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