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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 U{4odzfxq25_HM7(7W2jb00rcuasU7T 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 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 literal 0 HcmV?d00001 diff --git a/examples/ex03c_input_gamepad.c b/examples/ex03c_input_gamepad.c new file mode 100644 index 000000000..377ac7f52 --- /dev/null +++ b/examples/ex03c_input_gamepad.c @@ -0,0 +1,67 @@ +/******************************************************************************************* +* +* raylib example 03c - Gamepad 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 }; + Vector2 gamepadMove = { 0, 0 }; + + // Initialization + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib example 01 - gamepad input"); // Window and context initialization + //---------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //----------------------------------------------------- + if (IsGamepadAvailable(GAMEPAD_PLAYER1)) + { + gamepadMove = GetGamepadMovement(GAMEPAD_PLAYER1); + + ballPosition.x += gamepadMove.x; + ballPosition.y -= gamepadMove.y; + + if (IsGamepadButtonPressed(GAMEPAD_PLAYER1, GAMEPAD_BUTTON_A)) + { + ballPosition.x = screenWidth/2; + ballPosition.y = screenHeight/2; + } + } + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("move the ball with gamepad", 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/ex03c_input_gamepad.png b/examples/ex03c_input_gamepad.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e556584198e25aabbf77646da1f08af3cd0afb GIT binary patch literal 10840 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 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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%0DEMD4!$XXJT-Vy*02f*-Ofr`Y~lE;RGgVNTt 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

<|XlS20=wRR^ZkjKRh5eY(4j>7s0-(0umKT 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�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

tIfz&i$-#ki>1jCT-RJg{1 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 jitluIOqXNpFp^SG;ML9UGFUc2E4IIq?M^=y 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

Q~J3$t#;CHi=*xB$_d4dW7 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 MLnl@7Vt>}+|Js^=IRF3v 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 zcmXX{Ygm%m7G}I8MhfZ?9Cak7W6fA%cE-V5l7LZZjy8G2%fx7@`HaXYiN{1O5*_nW z9knU1FogzGDrYp*Xv_=U49=5y#)Ef7#wOI1&K-e<4%u6Mn=BrKF{ zwcT+$1Ol--dW3WW*bBe~H37aMaqnt@?UT$CWCG;wkn?Vbj%8h&ia;iCM%oz<7r43H8nj88ya+S=ed7iy|A91DeloWW9nee7Y@jcIXhxz|DH^;gbQEiD|x7q}-iL)ovr)wx}vz}!)JgR6$!&hhH zvulr4qx_`D8{rhB|wDaU3o z&lcvJ7-uG2wBA+W8$^MTd!{6OUHqu$6+`cpr8^cSa$i8W7#^jo7;`x3p@bvV4)%Ij=2zAt z-`U@Tl1u3AAW}tKi<95LvD;+}_wJTPe)jf1bXb-&`m8gBA%oFz%~xH+Tu0#msSxe-R8a#?EG_314vC6?=ip<#koH7NeT6B?_qyHW@Xr|Yvn-eX?A`?gxR z!u3*jSW&a%;Nth3`!~NS^(mEr`FBhruetgPq`6S^tcH~`j9ElFG-{)!<&M|9*kj+T zI^PptuT8Mqr%#THz}%3BePsNMk)X7Ow|fZ*vIsNQoh=%QVndWHS8I_c4^HhkWFHkT zF5f)<-xpt?I3VcN#mCyu=_TznoqrDq67&91#E`HMN~zb>BNo*fU6 zf#QDcEjg5(uKe1{4P%9cwNL0ERlv%Rd5tB{c-ix?g6U!f98Y=Cj6$ z%sL(&xb7uZo_7k!+*~}6WHqG#D>LBnuozn7Qw=Ik|B*)1rIk&)g; z(jR)gM)ckrIyWXs`Jp78-9466LZ8vXMR`D6@M;P}0W@mKWXw<(fdX4Q)$qBmiD(8+ zwb!%K7mQ#V3Cc^ILCM2GX=nyi&WWzcOv867Z*cqPdN+WK5WjGo(9NDdU_0|EV) z-6Uave1fxf&DIS-O{6e?{IVg!W4RkCEKmk4AdIQBNyqjfPD*{l_5Ak*^Z3o>KP3fP zvQ5spLT#y^Ek}Xk_q8sG`!d&`j01&)bC#}{-fJ3Y`SW);@1}>Y4c$b}H!VWDEl{Lg%Iu_CzP@<}RS|Ifa+_xEsl-EB5jQbZ_po##8&Fh2Mn6QYmI4 z$0xeqT>u5|j3QK2V5=;<&9-tNVAJlv0iK;of%y=%24yO)1BRI$9P(|+Xz%&B`qa!G% zHLY(B6liwV|NE(8hIes3N`1+~pQe4;t7jA~?Kn6PABk{p_<6o&E#J_pEU`d}CoPpm zkupKP<$sYHPjBKgXG+o3HWL1g)Jl=Iye}kp88Kd@*|z>7inCM?m|O+D#-60#`QD2) zGhJ+S+H@T3r3n1>#odjJrd-Ty%+F5eov+Wkt1mupI(XY)+#RySi>N2r^&q9)(f)(K zDa`G9!mwr{PhDB%NaMqGV49iu9aFOS4hxEb7~P+T*_e?}Jp6?p2DnMJ=CCX_qtwUL zOuzG=PI{l&Et9>iftulq19*Fi#|ITC1ZbQktocV!ZQyG17ltOU!vL3yP}MYluxS|2 z9tQ0K)bi+6FE$zVW@~a-`*`u7{RTgF4;xz)dW#1x2e8{SJ`UJ4U&m1**AJ6a8!gQY z@}ftX02<;q7}5936$T=EOi)WyyICByV`gS%Uh5wj*|e#!o$-27mq|Kvh#bT^vI!{MYt7@*P$XV1D_3|Lr@*2HN^cFV`*>HI0ilVYd4`LqX=N z-=DaQuSpZLfB&ml->I(f$R(UH;B+Nt=dMd1R&U@Bi8|97+kE|B+hbM-8RloN7f%o7 z4p4c!HLl^hxXoh+@dI~_+Y?r=bNY8_;^B0i7vH({Cb4l_v7BQns23B-xf=W7-L1=< iue_L9-T#Ik+riin(LBXF?uRGPeGHzielF{r5}E*`2Wle# 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!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|KvnNNT^vI!{O3+`oYWK`;9S@*e&F~0fbU-WZ?GL&u5o`+?j_GQ&AAVj zotM|JQ=BWkj^)nex{oz)EyHijoV_ckW%dEl>yDxdXLrPvd~kctSTHwMbb_d40c$`A ze{|o24yS}h{cxn5y#t;Y535oo3Uax8ha*0yxb`X8AjAsdx28hcxXU{68 zC6eup^XBKT+A>w^htk>)T=(ym1sqwwV1D(%SCg~fH+))LD__Aa=U&>MTA13puk6dA zC$B`${I)61?LTnwJ=51Mo4DVUV7NlsQEXnzKK5>{->c-*VQ2-xGTN9yZy_ ZxLWpuN2U7FIH1oNJYD@<);T3K0RXOVoJ9Zt 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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 wc00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A000BBNklLiP3a^)LRlF=CFk3gR^*Z1pXu5$T*kIzC22?lc)!$@xX+Fx7Mlawcv) zp)E(HBR0-NHBpSP6>6mWL`OzUIvR4P$+%#?4var?#>|<8yi{ zt6;1~>i8)QG3$h#jO(8eF&!O|j)rXcL@~lvs8P8OI%36ak+(h>cOfnz=NBdi`ADEZ zHAb9?n@`Aa7Dx+&YN9j3PU(qp)Kg1qaOPtQf=kDKfEMLd;Z6 z%t-01cMMA(q+S02f-NIM$ERa>r^&bq#(IVtnGxw|NaqL^8CNeMW~w$Ajryqg?1<=$ zuocE}>-aMtQ!HfMg}4Na-|o+-#;hB|jt`4W+o zS}bJT1wJ9=>{L^bvr#5)J|X2y(h#8TNhLlH) zu%}N*;YbU`Xgcd4~wsV zV*bjbz~^Cypp$U{(?>C;w`(OF#do$4&8#l)y+$!M68x%9XaQ4@iS-g2GVULL{PB1^z5$l|7OlRK6Y2l}002ov JPDHLkV1l&P?%e@ArFW*y-~b=e*B(F5l<- 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 // 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

k82|Aa1d`7@Uad-AY4X^tY9~-wl}0R#V$Hkv?s(gZH#!PMCG?S9 ztj@+(WSYn78r<$Aw#|E|hC%x7%{$wT=bJ~B6(QtZW7`rYEzVpgtEC4tBCDWAUGCIO z;1lAn9PJT817R_#&GKpu+p7Q89skB%`ad^*iIoEE)3^bt+LBU5flACX+s1@SVP?q z1a*%Nfn_%y9Ax7A+fZ@6SV7v5ZGDu+Cbtg8h+J5u`hL@?sa$2+R4AY$rW>;g0fhdN z5%P>GZ(Fq>72rnS=5$V2TnoJcGYv#}9#9B^d0Ng?Xk>U4cQl)=xb_UcP-m_gf>|D` zp`S#-j$TR$eT;4NZwwMiUR9bkH$J6dK7i=aP-|7_P}LM_&^FwjIJe*^WdL#a0w-e@ zkkNLACjyE7sw&uyyP?T$(BCT6)mS2}i~i&h#-U3MwA<8gKf0j56~nO{&SDJK6dsyO zM?bNG*MbY8bY`uE{M>4#+EuPL6Jd=ckH2%i(x*eDW~#+8SNKDf!KFjz8FSxG_6jF4 zHP{4iRkd`iSd2cAbPpfm(~!$bHelH{g;NsK(@pj3N)a4fzPy9}kH3k&mcycd5+{C= zyJh(u^zXD`3er!c9ygiICI^Spqf0mrFYg^)&JPagm~aJ~Li`;Y@YekY7ru_Q0k+3M zNFeA@)_;*I=>#QwmjW;QRiNWA{9{7LnP0HF25*~VOyaO|efR!T7=Y!Hd||{@NF!bz zNlxzHKPG<-b)HHFySDm&qy|8nGoR*`y0UZpJ0Xh}^dB6+wO-`T7V64YMC5J1yr92$ zA3_@^eCRTN>oN7_xQO>>Vi=(A7{d1-?TtZy0znl|Mh=#yvb#$><#k;V`cpKpKD%Sy zebpQESCc~!vK#al4x*UZ5scfb*b>BCg2uTK^o#HBx4bJ1`nv`nIhMW=2GD?$%R5ab zg7rf5QZPRT!i~_=rP!OXg@&R_il5-wrL;HUr^hfWD!yt`BsL=;!p{@ zgVbrI-OCaR(GP9tut{@oL;OgC#XpqzKsm*B@_D5#L|P2S33GFC9*h3x9sGyc0Ga*` zoq6CVi2!`(CfXpte;lNgjh$<)=s3MQr^orpojFgL(4$3v<6*=XHf1>g7rXBN!Tv~X z-=0*u8H9qZso|9q`V)fhb9l{SlJ}+N8fw z!db#ZnE-7+Q98PVWCW=^2a?@aQp#)X3oCdFQi=m0pYcS5HdSZ znGB};d%dR@>-FFVdqtik^db}7@i@|2OXES=v{^B!J6aNLFa#l*ytAsT=%OaE3Vc6K zlYwHH2o2KEjaLygZhUkrccFs36;hOb=lNO89B>^bkI?KKgxFvzf(%wSNJ#)H@OgrK zCgyZ&%;!ZBy=}+IFr~7A;yJ=c6$TW1H0!2bqauVXbbt(Uy^O&1J+X-(6(j-OgltN# z0R`Zi9GbrCmd#{(K(D+iPk@7Q?&|<7J$>glO`tW4Xa$_<#+@4=0LG&2x}_j0gYE#i ztf+SM!k8ly;xLd13K#-W9%`3Cj;nD_xJl%j@(F^&kSVLa*Sb9pH(@t!|? zM8ASWW9(x_grF(%189+_Q@T4GhU3t*08kGAmnf}-RkNZ3i4fTG zk@OCNw8u=q_=XLwF^2n_UwnPFB9qF5wZ87_Ze7wgg`Aw%l=n}Tr;GJO1=HC91%(Hf z_E2=87o?S`13E&Adg~_6a?I$^`bOc6VrFbTTH6Rm8YFK0B=D5qqA)FJImJ;>FHXnOh*Ja5Fcn;X+<+}7Ae*XmqWAXezP)qr?>^mu{d`XoBGE^Rf)zRS zVX!~hpCps3SDuLv4zFH50--c5{5YmFC43_Atk2Faz5K3rRf(D_-H@toKs?qDlQ>5i zj1O#ff(Y8^Dv`Ud-4(iHpZ?w7FRO(= z4D_gnCrbgDR9bTT_U+|zNskY4f;NtcOA76hgGxro8^v*uTNM5;VSfa9+@@20Yv1iK zaZ6HYlO3Y?J4z7IMnVDP^iYxylR&0`mam=Dslksiw#<)2o{cRzG%{V>tya2*5DGnp z1zs8XleSgtvl~W)R`5~|c{Qm+PzZs%IbcsU;wym}ZA^B_ti!;9q;!HU6VzI!hf(4O zQ(zbLw~Qii@XA7Q`N48(c+6eid^sQYYM9Q;K+--9rq4k96o*J1h|f-FF7NA*KW`o_ z!zlOsG@|`0zi`L@H!li0 zD14W^kdTK9Cq(aRNh&g4aaS!h=f2fq(G?rD#qa&_x4!-PXQhRoaP532*o9xhCN6ya zF^^v;N87{g%c47I4}sf<-s=fo?Hw<__xwK*JSOa8Ng;5e)aB{cK=bu$qYB#=&r%T9 zebcWim1UmMtBDP51FiFFyL4f7-yC$^=xKw2oRx^^vF|T#jaxn?Ulw1uaQDA^W_4pQW@sa zFtt@8W*Z<<2b|NiF=HPyM3!fFw^vNFgI@w+o#tTzPTkl#gj?Wsje%(uZ6y)J@sE=F zuw9Yl4@TskWB7Vg#-QIGDZVYiVvBxI&+tZAayQ9}+Mw8#QV{4r-u_%){g)(v+#FH= z1V!LZKkVmRrF?28(vj$UyIVK30`a!2H@>faq9VnEJ75CHDQw>>l*vmJ6M)WgT`t$- z+MA|o{$Oigw_#kxMZZOhraVJx(ljIbua8%87Mm`QKnU~+`XP?ZmVlt&N=FD&5nB<( zlLi4>`X%3MR>E4IM$4_!c>D9$&*ur*B=}}ovH-mS@0bCB(4U~64hra_$w6EkYjyKLYzn!2z`S0C0HYFoApeQ1|RxwgQtFz;L?=aZrN@Nc{ z95%Aoi9{-H_XT9z+E%!^1^StfQ}v@?TzjJiG&#)Uh?&&7gFrjBDzT3?4sZonE-3Ms zV!&3;PR2?2=MhgoG{%WYMunEvw*9b^zG?WeAZ|;zwvc;1pU6SLSPGUyzLit8GhDVR zDDq*nCddbnAiy#AV-S!8c2safkRmof){>ZkNs{k)M&$mFYx3T`Vc4k<^iS3T zwBu@@Ck1+h4H$;uv6kSxJ=pytvH@sEZruAdToeK9koGY2m&?^ycBUX;;Y0>D2vBD2 zk?$`u0J3_?ts8aFs)o?tHvC9TPY$s}y7WY#pSF3usC2s_2UWI1)a)-Z0~b2@Z+q@K z1pyHpl*DRgbxvSvw#nww*pXmmM7ziaYy|;&TP*Z~Fi`uZJfQONMacaZ^dIXhv#V|p z;G+NeuWVaInf3^|{~@w#WzU3B^w=8Sfvzsa(OH|NE|om81QHgHrGik|!hmU}s2=f| zZr}dWQw0IxwF58*l+_w3UC3!Ii`gYlrISgrs;V$eRgq62Vi}%%Ebr<*{1rA-^R6&r&n3|#wP+wnKt>h@k~ZQ3%qG ztghCaVd=zA0sm$YYmYu4MTc21_~2=Q(v2oi^y#vBLDO|15I=|{NcK7XNQ+c=^c&nT zjM;$*Qp03^w9lamtpwU(fmD#_x+^qBek}TN_XsL#Ha>7Jss81P22celY%uEGQ_J zXd(2pEckPI&_W=y*bz*|LN3HP4A{~j28Se=dhzFNv%-WxpnRmZV~tTsFaY`;oi;`E zQMq3Fn1#SapyT$NZ`^p}i+3L!&(BWhOYqMJkLdBg@Zdk;oE$A8Px{9_e^UwAO?c`d zglZa2EAst+_G`cS(I5Ch5K6MWM@?e8yLvmJ88|S6N`UlRX#+?Bs~hW0agx66r6L0L zZIsXO*#`_9;BBO4Ie-97R`wZR4E=nNs&}--$*9}tVDkA4M z==`qj=oQH@)D^zS5tPyegx=`qc~VUG229MrN^~7<;=Zms^8e^hkg&%t^3kPD(L+&0 z6jFd7%e#H&P8QK``E>pfGW9{%bRm5_EZ0Uu6p}Oe^jaerT4t!?JvLU<(H3UvpWxNFHatv z-n~7)@#eZJ`w%lkyo!Ch)W~&FDtgB|Uwr2`yn}X2s>b0<=|rM!*z5k_`rGSO*;Ezn zt0Ku%OqbL5sxF#Lczix0qlo7AIHW*l)%9tNYHElavR0VOp$`R$Clv?mD`>9dVWtSX z#}AM1-xTs6I)42Ze?eNYD0+L+8o+XUT5QGA0e8+-0>~40=X>d++g?3u;m;Qa&?O?u z(Qx^ZXICJ1U{|FX=sw1?lrw{^KPCqp=G$dw68F6oxiwY$aq}Qc&1}-(g|0>?6nUzu z6CR;3^1G(7jYHkKbzdrI=?*X&CvjNh{c=fBSix!pwA5*1Kyx@#n!*>$X&fqv15nc& zjK9MK{e%u1Cd(+c%^O1J0Ai6Ow<5i^J;u(#TD32UHmbVZ&hW0#bkq(uvBoZQMF-g2 zq=UFw(dkKFrl|+8m(k7TiQD@x)X1gtH#4qi%ft%%&KkP>mg00{G^`HL*C&jt=YK8#D7NFr`S>PwiBl%A~j$o;x zT;Km(G!V-1m}Vr?8*08CFVtH%z9gMLn~rsE0-?u(Q?VIieYq}g-=2f5;?9Y8PTm#2 zU~XUIBocGOg!}Ri@s}C$Z z>NQBYMQ6LALq(xf&ZMDswc2i|<8D!RF!*Qx@joew;+bcz(eV^1Ae*|ev)6ZTyt$o{ z>j|kb0}`QwW(?4(RUD7hK*}KjPlDbp56B9jdk+^fl1`>k?jS4_9db=U1IfMN^dw4i z)=q1~A|g+ff&kCqyQgbM9zUULK8eT-5c)$mwQk%cyIP7IYbd$`SVr;K&TpGd<%wNb z0R<5JS86tEoxE?Kj_5Bl>*W5AN0^D+ zgm6aG`8Np4EimXVc{auwNw!6^#$90vK!^xO2CNiOOA7mg}p9+bs&XI3B|M*-NG zvEy%|G%1aM^iTFrSSDc{Y#Ehs#7d>RwJe!4kWN$S8MRNexi56i7qU^k{BCT^w9=s@r^Lv2#R*(4+xytJ>hV?;mn!S9mBe<=gtU>-Bm zURl!D@$qq4mKVN-r0gD)EqT)P2!{5&pl#J)l&3IzY6-^*iC;WQiTGqbZ|YilK*G~1RZPzfi zN(=A(zRnn0?p6;)6W4BSN%au=6XHwrx;zm|z6CgtnL*vrS~qO!(0{F}O~U877oIJO z=~EYhr4F3L$wTu*k*gmxQnb^PaTs_T{TFR)g8=BfGy2QDZy^w&q>3xT5&g17d!Xa> zM_D1o0BIMYAb@Ou47S)|F>=-c{p*e_0V+`mRw`DdOpS@k7<=)qLyGaSX4Fm*^cN;C z+f8Ju@UE~spx^IYHZCIK*vV4SPsM zM1ejUeg>qrTH8%bC*Se{TCGmJb8@@#?s}Uq1u2>B{IY}{8xkIwM+*bb5W|ggD70jm zzrs5Bw!|$aDq`PXw=Ih+jQ$YX6qK{>Vni8>RZ z{|YogbgXEj6~-7qk$bt6@-Kw~crTs>lORCQKTR|F)^2|nMuwB)f#rNZ^O@Io&g#nL zBkTJ+Er{Fq#ca~Xe5i>ThM*_O-es`?FavQo9-*(3bUY@7h5r3#U$*EEKjW2GUi`fl19>*cwx=8KJOOhF| zxF3gHWn?uyasPuLzNiam@l=6wBx>=!?@@RmthUo6qdWc9od?fee?AS=**!=k9*DmQ z=*uYV@cpoB+r@Gm1%fs-hcIA!_sX8D)f54e7s9Fq4a;65fr&`M3+WxAMAdWC+6W@} zaEukoCF^7&Am|Y{sK`&d#gZ;|SQKdYY+IkJ!EMzRdpSjwWKL0IKxe(>K8u^W@}XD2 zgi}E>AVD5wX#!zkI2V`=4*boK5h`us9QvN>YS5!_!8R<CWBP zq>^H=ijL*bfO|$Ym`5BwIJ6+5kgd^xjcG4yR|o=_+?oQ4M)$%C(pM7La_25A3jXu_ zIP@Vh1DY6lFKb-{_gU^D@9Gt{PRId=V**;fN_TJFT&}Bjxrp>b+j}0f&^?DA<_Uh^ za_z-QD0%0yzWV|K>YsxMgr3`pa$n?<}NO6z}yPYLp(S& z28)c%yvm$p2*G^>28bnL2Dp7VsLhJW{rP=A^^UF`-MDvh{h3RIFB5r%c1!_XzkI;i zB;@zkXUFJUjpHQGL#4=zCtE-fK!XHxlw}D!NkLP!fcpZTzM#J}2*L4h8eAWK3wxn_ zgQ5Afcw4NBZW(#x4|(@_UZ+T_cfIY|SHJX{y%k;wE-!fz>z>W{u6JeGmV?R)x3@#h za&MNOaa^Kr+}PBOAB+=ce%tN6@BQ-pPksCM>>pkIzz0A4{ttdTefux}#V5Y>C!hV& ztA9*~tQ$gn-iYx^|pg6FdYU3*TbX8^CyZ2doo|q znl8y_>N-IW&HK6%6-hK+``(oNMaZ&kIJtH2 z?&|bO>%bes+ASCHwyfvP+vsh&{>;^rIg6wp?HPj>_f50O4x!7lx0`ELWMv0uU$Gio z*_HBy7EdIaz*xh9{Gqr8F-y?Uf?Cgy8_x%W8|PahE(?=Mpb#ODf>qnWAfo`03ah0y_^!vv;bRV% zidEO_j5Nz+ucOwRm6sBZjQ5}rkl$sIUm#KBUOFRP-0YN<+Aj+{(HY_!(3^WK1Ck@ zLwU_(WwOw15Fl@NKEVIwU-%_K|GPJC-nsdf>#*CDj%x-k3<4g(`hXXC+zyH3s4VLX zvpSLlquu=^HsFz&s~(hoPn;m~$-VF|a69gwJs|uQL8n|zTw}nAAUHjjFM}fZ{{07+ zE*;HHBhbO&UYe+iO9(gbom|?3ES3=EN?(o42b4>S14fGVqe5jImzTV-tr8@RxoIY> zn{(W*YGe!NI6g**FnG7`uZmpJ(FMiH@tFO)_RMp)Zol=gE08)_ho)RAcG33t#Bt7#S(@O>b!IINHbc`dh#Kd+5nGfAAv*M@NGGpZ?_Ued!CIBj|r!(BJX*#ZMnD zYGHcz+3R-8%GSUWr^RfNgWJY1!7*iIHft8QJeKY-961{eVOtnz2t`F9uHA~%-LGc3 z3G5~XAo|JCe`5gprVdRC=zRD<3*}(8x3vU04nYqE3&MD&X^VoF`I7K|kX*l*fdq2i zb9w^F__mK{+|RyfF;`+7GC}{Ys)~a>J02aSxzva0iQH5zLk3kl*~{Hjz97^D8icK+ zfGjejgEP)05l;@a{5Vci6;IGo(6#2WqIok)i>_J*Yy%^IsOFeZ1~Xt z=MH3F?gw$`nzP1}?codhyQN^%00N$9^u6Fe?DFYf=Ne`oZ*nOg znH}vvCIDDKr@u!WC!z!}mZJZ`_9Gd4z2zL)e)+eE8n) zGpF4|Ts;|(T1fkH9!9CplYn%s3|rbt#%_jg^o zNKq(9=s!W}rZ<16y0PkjmapEdq@isTy2{iB>&*z_4uzbpn91YV$j|Qo$PC&nga}C9 z#Y5$m%u?cUiiymCxc~H|PYW^wAP@>vhm~GSrwR)q4t`8#d`X@@p+BQ%;*F#_b($QG z$~%}t(LF~>!mTt6y(L+aBCzoOlNsO?P#;#+KzAB7;SR&VWcQlVwAd5s<{iiFy`dI? zbfR&`G_&%6Jf z?jAuGdfo<{uL0N~K-v+c5+H*kFr07@PzOdCz?sh%-(PINX|)vex4yqT$qy!X?~Pt| z@!S|CoE)F!2b&K1_1STJ8D4FaOa{lS7J1>4{y$i5cK2u$A5db?aHA4h3@|}Q{VpKZ#`e?rv>kN2PgBB zgV}-cQ-S_{S4G*(V|oqi1Id^UM46a_(g>UP*8S&=9LflYZ--@ zgv+`bAhJoJBJ|G)QkiDW8+<6w(PyK0VTQtY6{VOqsr~WK8?udQ)^&|!fe7Qr36v}w zBE6=UZF^m7kmXPEo+Vrc)q^i3@qIN~$hzwjMdrZoA*YMv|4HxD=Sj%-uNNcB5=G#t z_PbIp2l{+~7~K$2P*n8mC4IVxTvLEDT0=cBh(v*@{Us_b+bZ&y#*DDlPb>)fNijrT zUH6_JOag39k&~;vzV1tIQZ|)X&hUC*{P$QItcrB7?8~EcM&`5UW=clMaCH9z=%CT& zWXw%>!6# zDl7JC*NfBBFMZ+jo=M{O`XP(hAH&H_G~kaZpx)a8=`C#5&VZ=<%7*Hvsk$snTFwIf z8vzP|an_XNbzkIxZl1nF`s7-gK$%0!0`7S)7R_R6{> zpkKEf@p74zyz-{1i~T9b_p1p9j#--h$s0F5Fv;%SxPSF%HpE5Sjx22JVY0pl1i3oP zY4bFd)+L5~`b@X$HcsN~C@+s!bhG!17}IAy)1QDmYLojWV=!M-6z|cl2iiYiu`ycwi2S4$tKVp|uqVQ5oOhmqs zvZ<0@9UtF2KK5UDna=aYZ`^P>2u;8tHwC@)ws+f~f9{VyHRjE3-}v0W`n^{_^#^j} z#CaFrzv7|DzSY#yhZ!xt_-ixNvjnqG}8}D8}0g>u@+eo14?|3W}`+ z_kw8MddX8609qm?O9y90;P?JraLgWEy7b`Wm=5nn?{I&&c}qe+I%4Ay+pLK3bK!or zEjyvKc&kb%?`0z3@(?FPT11>oy5T=D%(;5l(+n zITt^W;S4eZwy_Mw08MdaEPY2ivW^c?67+m%I4OT<*PRmf2=P7RX*&A;{WvHv5`%N{ zNA9?738kO7B>^!Qtb4KH4(fEZN&1^4l|DD5|Fi%2pNzP6=gz%5x1J`SzMBi`&((@| zeuvKe(If$c{*r>Qi3qnD)Y^cjOCLSGnEkGx-uC+W3xEB;``>@!$4A?_syx;dj3yZw z0NUE)&PtQT@uDnCTQ0tR@4++Nb#wRbohw(at{fc=|(5h>QHQlfCVYW7~3nOAe> z|CQR2er(FdcC!?jvQx_RS2Dei1#Cn}V*ZIuX3r8$vHj&sBk$7(zwO&@-njYJ%^Ly> zZMC(C<0#zAl+-!ye)+Zh;Bc`%yYlSwSFXXFTzTd>`W{ET(4;Zeo;=U;m1xffq>_oFaq*{{p*`>xH~)#W6~%(cqLv@p}?S{J@ZbMpG> zAos{LQm))0Uu+Okh}JJWs|8<&<#PSh5kP|+3%)Hmne*7*wv60x6axs|4Y;6vCEO9A zm8eM62Q3pEwta+bAfZ3m0CNAIIhYkDb4T}>+lpKA7?SC%W0qRWDbyQkIY$4{$b~%Q zg`X6OMSqO6yVMI#H>Y&^2RybeouIavukUKt5)k?)QMy_m*G*MSr}PiYy5lrgZ1va# z_qWjBb;*0a8lB;D28}6L9L%MF%{QWtPBVTalISfx5&Gzz8i38DDMOrRQ}BfTZWd0` zJBWbl7HvVX1X$ZCY;sjLsxv@;I!#IGj9qKePsK>NH67L?9W;!&qke1+GMz&5Ja%SP zB$q7#uN4LI`(g0DmS2x937r3@$Jzj=rS)sCPr2(mRXZtOqIMd9k080g%4Wu@+dhdDV6dD1`nI*^H{nE;0SogB7n~ zCGwNf7sO8zyM)0V#JkLzf%Pfi?BL2w21uj5Vld|;CpPyz+0gXZ#YYbwJP;dj?__nI z3$0=UEJSQRTGtcqueh(29?$CX&doQjUVo9yz=L~tE?*zPy*<6}UJZhNd43`K?=&p+ z=dAp*FTUiu|DNYPteNZjcU ziMn9N{ODi(EA%>q{)_cjU;xNXUbXH~Oi~BE+M)VTs)3y!k zAfs5(ZTT!5^0dfJOGB$nG+6W}OF(c&7Jj|pe&oHqdNG%3aA-^tg_anwUUp#-Ar5F) zg8s`lU!Od4#mWU2SuqlPGCzb_HvnlN$FI>=rMEpS4oj0Fh~lv`m*TgSQ#{*<&+peo7S$6c?GmY<6eHSP_ z**m0bP3T;EdX~`!=u!^dqJT-`-s(B>#90x|{-hMtfqf?6swL-=~| z;h3V^Jxkzm`WlmdC=HM|Q4f8!fBDMl?5wGwO-g<|NHn`D&V|mQ3nn8$5DY`tHsvat z?t@jM?FgFv0SxoxR#Fg9uPadBM@k0)eHe(pcfhGoC4Lw|LN&@jogRRF1%kzT z2!e_c7B$mnMy#~*><&0XOw8B=t=43 zLKLBcBCq z5S=Yb6zJQh5F_UCu?W0PLx^rzkg(87?uS@6%K&Yukv2pj6BUuw0L44)Z>^(|er5m_ z4fuja%9H@(EHQiPzQuhl3c2I3#aJZpg~=Wgta>zldQd^s^ewIt#9bj95I~FAM?63u z8gI72>{tKb4}z|x;}8GkAKtt5R?}TX-muN{vlYxRJAb#$(XUt!`64Ja+%VgGJ_yW4 z1zEy0p9~w9Y=+_~q_;*xVY@s#tyb%rKO0>Z3IHMf;?p+iFCAQp z^2yopNjja<_Dd3#PB2P|X@9+8NxMFa(g?g;b&J4_)`?1ES^RWmk~E>)yX1T~vPl%=gEce{ z>P8c)B%1G2=cvZm{jqj`3SQFfqUvP3>2nPlWP=E;KPq>@LT^hoa`;`+?LPyBvEy6 zp+~q}EKbjs`)rv{PnXN%V>upWIeA9Z<#GX6Oxw_BOVez_dv0?h4JrU)A%stgK3$ro z4Sl4#noMVWM=8wYjC0jXGbsJC!~~M)4?w}+s3f+n#}F+srxAmz*2w&JwI;)0lIfbg z`!Urs=6uGUPFmk+XQLm=#P3d*Ri1BRw6>R~CKz-~ZH%9Bwce#zp+AvcAjp0OF;Jeo z$cvbMbzo^1SJDm)wq(v72{UK`OA=Ce9!JoRv+Utp^1NZNQBpK#WnCNTL>A2eI|QIN zZ70archC{<-A>2Yba%9-3(%T@3)_=-iXUPjFnT6pXHqlB)Q-bNU;pe^e)aaf`{Qx< zp4)>HK5-CmKF{-&k^hW3&mftZT5tD!8Q|-k0`ihdoYZZ7=f*9&-w|xxJ$Z2dc&8-u`kVD?-7iaBWWL1T;W+>AXuHyV z&11zPZmZR*Wko>G8&in#b51<9o^ZSieJp1$DQ;*uCYB=N;dJX_ra`B|-KF)+)yp4v z|2JNHW>*=at=A3HXZgHsqcAZ)ujC-_O^!v0%_@gB#}j@%|F#$ZosWLw=I&pVyj=69 z`@rSdj2BEmMsYPaeTfK@$+460S92+wzLhB%83_{hbpst^Sb*%1Az&WMW2<@9?8Y?J za`|+N?MZ&=Y`)=UIpge-6&H=NG|E$hSw{VpQAyeycd7z{NA#P(eRk(VnU8R;BcVU{ zKb1}^-XKdHWa5zui%2s5?Yt)Fj}0lgEk)2F=uftRjxp=P4gNi7=xaYpqO=gQXhMI{ zR6)uj68lk05qPu&5$%`48Usvc#Atk`a9CQzK>omn?J&>G6=*Ftkr)ga5QDvO*#*on zupZMy4w>!vd0QcsgHW(ilFSif({z^92&%}ovMTV(G#r+1WTa;x=%*+uFnuFJ8Ew@f zc{v6y&jEZi-EZVyE@Hv8^?-g;XCAB_Lc=l|jYKGzyujA27P!O`_UntEe|4-+-nnUfjZTxWs(0`6KFbL2^XSjjtC!?>|NGwk?r(aJb89kd1N6BZ zUEQwfSghN+9ctrqJR$BkO<$Wzz=uEb9UuOV4?i^9<5d1WU>J?QbY|I}D>|54z6lIC zgjE@`rz1qR^4i*R}}Lh9++23yZg zPEJ?V*|`cs#7zZuCO{$p$pR4$+2XL~LN3rB>~gUjvXNvjRaIp!I^qB>11PBz7+8#> ztdK;%lmYOW**@h(4iYo~Q7^3YCI}d(d1b!0E0=`+VouTCHEtS5KY*w8ykyA4_4DXbU~eGm7)Da3ozL3((#9e%mB6;7YR0)E)ExA zC_}$ZeFj#koO9C+*g#{~4YxL6Okqdq1=$EVBWTF+`>hsrOsM&zZ?c2_wgw>YV&6y# z0JbsImH~u5fgY9P!npF{^7W7Yx4$FMkK^vWuPSx^wI~D70+1NXHq!hX`SQX0IJSq$ zl@=R7hwwyMHN7*_`~TQ4TK5G{!mrMjg(Gf7LBJ0B-+9n+Cy!6)ugMk5nP{k7D*oDa z!yR%I*&w?Ky0Q`6cWpnrw&P!2zm$*-h_@a8z5T-40Q+_6@}-Y_??=fDT)MIq4RjRl zkKCHIKtJ1tQt}S2_jR7r)BaE}-=aS`{(t5_{OG9<<-rd7&k39ZKI%(T3O41-np@E{3s4aVN)H92VO6al!^izeh zw$Gi*J{WJ965S&JL+4_edLZiW=`m(@0aT2^EFV*t8fx-@QwR=p5K~2|fCrVyU;x2= zg}!WXb3`)zh(1W*c{j*75-K;XpM>iNt7xLaH1>h)P1UyaQP5Yz+=3zaNi#dMv7mIIvw^j>sa96^i}%Bo1kW|Qf<8KNkjq)EB12cKftoSok$NhV!e(T8aCP{Y#? z)08f(26s8vdC`fFWNt{I2NHSoiGr9rf@7ZTQ^;I*nzdvCe+U#r3N*zp6l-)WVOp1` z8Uv6z!whpo%OXn>pFH%wO#!tOO6DD>cOtNa2Ov`nnaqD+RR%ItgRZ+aQ4mW=n3seV zW9c&b5mMSXRXRa0N`3N@I%M&Zl{TGQ6 zKV=QTcMR}Yis9;*W^Yxrg(1TbL?V?eK{i+ez2SF$>o@#x$TITBXh$Llq}Y`Xa(eB# z)jo*7TEDNFHTWNWC_Ste%W~P$oxOZ1ugmJ%v)Ahixo6xbsB3#oulM#;)#|;&X%wl& zvJQK#_7crW{D>mgri=WTLdbpySqU|Q_ypD=-DWN(X{h_EELxX?-<6si1wW+gIjF>E zr7&7$A#;fV9GbcZ)ly4G>eqp;BXWVFAWy?AnI6pcrxf=Gag=9O=VjBqOV3<;&wJjp zx4#z$;WW?68ux7gB+=o^G0qWqtXwkaG#nH9q3@M^P2|YT4{5tJUGU-y&t5v5earh^ zdH*-Ppn^6Ft0ZicUlYK{p;0FE<=FGv*c<4WedN!D)nak)X42#p=4$+W~tCo<*K$W!Z(V7U_E+`6+?@zIG94V;;(4m|DtXeM0(bC&A>Tmwy zFLVwi_>*Kkqn#c&3f<6<)NBQh^ZD`k_~Q0r6)8vZL7-KFR6S=Tswg649zFeN%#wrf zzz;)hi0oa8&7BPLXd8n-ak86C`K(A=@Xi-98IVvAFu-7<#$d*P2cCnq%`l!LC$P!j zQ1B3Vu}MWxfWp|)>7&i6GvRKA1Ni!3!Q}M5KW?3 zn+TJ&V!TLdJavG8lw3$Ks6J~GTDq1MvjHC;~ znHIkbBsC`rZZ`AN^h4@=d1o$%#!C!u8a_QcKeI2ShvsF4&64Z)jZE< zB2hlD(3@xIuw+0I#E8|I1u^OQ885BZTSnwblF@N|wi^LN)2XhT{)rcAbl&%As?xdT zS-CC+{b#eolhb1zc?YxIaWGA*jj&jy(%J2^1VqPx0uKf4hYjIT>!h)SWS<@fIz|cg zVaE)#T%xyq#3TAoXMNY(x`N9-W(5QA=R786^E09eLy!JuOlg#OwCHbpK(*1W9l*wy zgNiwXbOTu`GqRYjaHn^ny0+)T6DT5BOw0zw6WIJbGfbj6zCt7>PPI_(|b8T;Z7uU?u>i$}lU&3pCRpU(*WOU{N#-apC}Z!zOs zuU3Noc^=u!?bz|TF0C1;7bam?Rm1!^Gvf2typtcj4}J^MR>mrDhOoJM_3HVLnQi4rtL+;xJfu%IbU7FI z-t%4c-7gm`*P0z%VN2N}-OXe(6nZ(1Z{yTX9DZDpOfYCBV_#AO2+XX{aL&8=iNE?+ z821{V!@h3uM2yhExw_DOI>voimFMFC)SAo_pFK*U$qZEH#~ImxK(x!n>*UYS3i`X8 z??zxt6aIC`5w&gW_KipoPF6<(8*EnyV`~ZMkq)rvVECYE$ADmb?7<*A^g{fw4H*DR3TG(r zy{MvSD+l4Z!9Q9Md6qlH*m$gJK$@Pjhs~}BXO*_ysq~0h9fF=bvuf-uRn6?=S0M5ylN*3~dPg zm6h9*9+-2jQ*oBY*#>8|nM){7R#A#pRC==i%q%;|&)EPqJId3^)(h?zDIEm;F8V+0 zi>!hi7oz{8fHHWDrKcrL?!Tb_1sl0sNufSgW*(SzoCx>ju)7!(DQ1gim{@1#q6cBL|b*D8fM>so{Y8wb2#M%NL#wrg?Z2*AoQpbSKI^b~1e$Pq+?B5Tx!dVrA&pz^Ch z*b`DPguaded3qm>-dA??7rMn#18U^jpO95uUtD-!Cl&_DN zpKS)YT1kwslpF4)$6f}2G1&ly`2jk=9ep!U6sd=UIFEv`K~*Czy9#~T{SeWopxBY# z0-0_4^gI!#Q3{QBtT#XpmN%XdY(Z%o*~Wj#L3@~h@R8rCyC864 z1?2h>{*k9i>w(N;)i+TX)pU8g0oR$93SVtH{?=dn>u1ZdtPy?Ck#J-hnK8w{1~$N`8!!D6FTPivuWHU@oe1XF2Y;ps!IC6h8LILR5V z8&1Yxk(E|Fd*>(cig-5jhvUI$1e@czhV3a@6@*JT6Sih($kQvbTv?Vud}C%svD!q# z!64JYh3^e;e5sYen#c7(JYJ=4qWstf->$0do`H^(iGnw2kOLZEUsDBFwuTe!DxBw= zrEroB$4RpQ>sCfX1w}P1KybKjBG$X7w1-v{up7GPVD|;qg)8cMqeYQ-_b&YYB&A<})LTrVqa*_!)L+Lgq(|NPC3Tzf^t_I67^)c2z%O1)fc_$ul9 z#yfAn^__2j9{|JyV^6m*oZoaNa7!|@zefWda?HD){Vq z7VzAh3K=R3f+J?So05Mb>9lsprKm$FD%cBZBKJNX1fl+%d+0!v^}TN=Dwl+a0mLYRNdyRt>fH00nKq7WueMwOz3|M9>0FVRt* z9J#Ld0_4m~XMwhSRjCYAz81RJU#eisJLCj{wu8@Xjic)Rj!a?2c^5V zRcju8>1TK_B#j5B@_b1i66M)iQ6tl}O`7Y%C8V&4BBJN#m&&2JV^23|ksO=HR_Ai% z4_{Vd26&bx-e9s54H$!-D3;@?hZWJYIOi};VAH6&1Yhhpb&}N7*?aQ(>#*6rf3=66 zw}(9y_qV7SQ^0c28{t}`?MClv&qeR};oUF)LU#U)Xt4ooTR>r2%n%?+P$YF8b1Al% zirPU|lM=uo0W3Jry1XnD%JBhjSC{r)-g3tec4(S?!DG(>o8E04fX; zF?y76-xQOe0rXWWt7r7Ld#(&R@)BqK5kMwNLTkf88vv-0=XDEt6+DnaB!+$_TU4p6 zm&+&x`Zu49)OIVYf?0~386HZ6XcDtQtC^^6QLR38IAjZXbvrbI97!0!Ws$fPniXhi6B|{0bi-^o>RD5BCLLDXWOc9L{m>)bLFVs39X98Ya8%|=AAe^ESm9Fy(fL^2l4!s>4Zc40l>5iub9({UPqJUjA zwrBeycaNW)747FdxO=Q{-}SZ}~pwpr?~kGZ`f(Hn0#WXT7X#u5||Tw!2PcV~^5 zorVOSf{ViipuNFymc%zV1KOc{*OgKd&pvoEJw1bsgMjmkc^E}JdUQuLMkD}s(4Y0J zD^WkEDLbhzWSpyt7n3UWDB+8xOaOY&ZPf}VT15d2;G^NTGuc^-pZYoVp07yFoJ{Fz zS0vLcGQ3-t8LjfVmAyosOWXR{?T%NiG@GVNLpzz}Z}Pwd_WkGp~LP!F6jB}8sA_4Y4HA-T8s~8(!TVwKl73Ay{#o+Gf-Z$qbRRX z$<9-&+C=tvkJslFZng`)*B>>>9w`Dy)*);nxEXDyf*}ZC^yh6aEsRk`#50;G2w)qg z(wvXBz9^C70NL?RTg1>TArOS?vsllwi|1S&L_aY~+rh=li*wFIGLa7}4%RF)Xgkq> z*lxswD=#kYB+&l=hP3%)P5|gQG&{peSa)2;3x<1C`)Qkg#e~!jOv@Au$$%~pX~VIlvp-|r9lN|7Z= z?7Aj+>o$NaOKI1-3So|dM0{Rkh|HEr1rRLZ?Qv#?}NYR+?z|vHl z?NE}iVg~Mvt`&-@8-|X_TXavkEGO4!XAR2s2mv2Vv7jnU-KhH5wnmd3D-9>iQx!tZn?fQ+C=aQl&{1W2D#_XC zx`WNXWoqfBrfMk@Yl7ic>(%V?xBu>Mu`*?vtf=CAx0GI!9?0x}!3_J$O$ey+H+Et} z;x`z!b#(86?fGz!fB2&xz4_HIRwRjo`Yp)J@+t1>1hI&IJ0tKB-><5?PMRzc_D$5h zVa^QSUn31&6*wH4b6;}g=$fbjkiQoOWrUWQ5U=^YPae5 znv6FL4aBx}z7F3;TIr}I{1W%>E3f_BpGr>Og{#Q#9pz<+jXyVP8`^Z3LiMyHg+MH{A6BMw&bnLjy#w52(Mp}6df9=2Fe69 zb^WTS>cMDlr}C=gnE{$9t65-c!nIQj|JGmsn_vC;ue}&M|EZ+`1Xm6VA(w^&52#2+ z)Nbxm`Nr)DrJWDi9~KX=ThzOG0&Eo6AClu@IgR01xB3C|i%Z9MF3;x|)A=Ql469A> z^mMwt{I<^NCR2G34J8KjEX%@8n78Z`{)Sds*!A5sq;}jiEz;bwskL)FuB2*1xo?2L zCx(Eah?8isDB`W6Ov`qY*)(|a9^5-eC*zTS6+tI%FSlw-zx$f`)qi95qo#T--CR~d zSVJUjSt`Xe%jMJM;+f+N42o=c#7OtB%$vLoha=nu!xzi}Bvt81c+-?{6=gtYuIDvrx*4N?U7p;%bACR%d-q6=NxLAF zpkH8xNEtdvR2gIQ39ehf26b%1lNCW$WdeJ!!r zp6~N$NiYL-kyPdZv;udUQ4%K_Yr3#x0{snC=@U|S8h2xr8kPTxMzFR6V9VXB5%C`zUr;`Hb9}*{H!*JvR>sJNSCXcX^h;ZsPZJ`s)1?W`Wc)0~=u1xzOyHuM2?w z$)E!hzwZk>w40*}V}^bn>s=7f12#Zwr=743s7Sd%vt4+gyKYV|%aS>_hMpcw+%IL!%JS&Ld44v>B?vZ}ib*uniYJA({10OEjI>-fWi zDQxE#jQ%JjL)$(zOtk*?U@W@U!CLThHBRE~&|m1FDXpG(&oK{Pkk}AWiPkQXRG@lx z)3QXV&(`%|p#yJ0%tfU*jQ%pkuWZX;VLG0Wi_stJ`>EWemW~&yA5eQf(-h6j~RmYe`~!7BiIb2TLDw|7@$AxVy`XYUJeDe9nWg# zNjig_6UxnZDE~{RfCbGvtK6L2PR~T3zp8k>J)r z*;Ke##1t?wWLRtBbzfXKEui7VY`IcMc1&qKXtsU;8&~VqEph-YU#W1FE4Xl#Qs&g! z;n`Lkhg7YP+SzdQld=fY7&gUm!J)Su?`V9lDAYXL&>1i4x`4>DLZV+MKC9*`1w7~| z1Ct|ps1nDmH%yy}B{;Q8x<4ur&rIdjSbv}6I6`pbvkYr#slXWGf*LVXui%xsshW0` zWT<6tTeV?uVYUi3!!T5MxoN6cJZtEht!Z|psacgE?`F6}aF?V*q+yLe36U74TUP~Q zm8Cd!CtVYsg8jKKd_rrcaO5|6{>dOz!aQj zqt+U7uw(;}@Wx&Od|OF>qqGRt7vs*>O?C^}UY;LNQWcVAQx~P5H#vc(d#@bO#>(MU{V1IeT5XzHO|ctlZw<394OmCAta*PskyhL zeg@6aEWOqWQqCvwA+6S^2au*Zz)8arZ#0ZqrD8t^el}POG6BE-m;M*6D4w64$Kev< z$Rt=QhY|q0Nl@DKwkP1Kc>sq~vU?T!SF!Rejg^w6;myJWVxW+|qB^!VnT+A$D6-=1 zx8M4gzWg<8S5dntu=T5G0;($ZNxPx)E}U5v52sGTS+$S`qIL^zEa2Daloe2Mji}Af zR&j!Wa(VgOuyFdeWjSeCX_i@|5|x=1we9&Sm0D4aW>#(6DqU-s{VYul$AI-0M4{gw z#!0?dho0v~@!AKtz>0mXrVCiFE3G~Lo2WFg&D%6w5AZsS3N4ReX&J5!F9hVkycCv} z7dVJX#XgWKiwYfpq@SuZxuU|I!lLV8zrv~GgCfsW&x1v04|}HP6mep?y&{aUv9c^( z*Dcc&E_Mrrax+UUVbdKupUo}oFH4Hm+QCWTx#PJ0VB`<{Ua#FW_4xS6R>7?+9pCHs zd$5D(2q)pu(a{9{3(;4b3`gVPXxQry#&x1n#Sg=W3A~ zwu9)QR!ENq8!Gmwm;%AFc<|DK6<9tT%WYaJWjg?Xbjv~ANupu7)>A7I7R|zWBBpKN zOX=j}ym90C1&SoPhAl{l$B(}E&RahQgoF)j#giYtRVB$y=K&nxK&9dZmWq|1$&y`H zjU$1lr;Bx4s$b$H_g!Lv2?}_gH%o8a8AEL}4tLpny(_<=?lQfV&)&6o6;)rUfd1@X zlX5clCrhKPxSP2iBE-ccfJj>epG)=dv*4UP<>;@ZKY{D{keIHG21#c}MHg^2e z?L8@_aG^wH1-&8hwT}GJvMu^UMdqC(;PqY3Y=3+%a!2h~SVTZ#CmH2g#k7Z%+L5&~ zm&>~OjVczG<-$2?YIxc{0CoFl%PxF!h_Vq*O`{=-Lx4*;*4g$q1MuZ;;d$*n_(XC5 z6_;=TiW&n8Tv^h~%F;T`j9%X*rowTZPc+&P-aWYuM%`QFnHjRrY-d^HciR<@pr0ZI&specz!$fqA&r+p7E`+!VCl zbbpuxVY&(JzVGyWQ5lF`uG_5!sHu=<(IzaCfMS=fe>h*yVIvkRHf$AV>JrOXE#EI=e5Rn0A%^3V3_%W8jjXF$Qn(|yfx6B79z1K`{QB2__qToz z9z6Q-`wGnia3pQlTNnVD1rmr43jsEa2#W4`lcF=W1ZNj#)AQ+c`vgdzlZi4lQ$kN! z*nr2+%1JE=p-4g?&&6bOaTEZmI0{x;`3p@tg6Q~H9ks#~yh#5t`llqES+_|}M*rsR zqLuT_Ej8OPu->MHZgfNJG(0?!4Kwp@FHK|I10mL zy$Vq#dKGX2U}vhq!Oy`9pY-pZKEJq?4ZsSKQ!Eel`i_L!c^pQR2lil-u-*~q&-WV6 z0k`stW!{#4>Jo0SB>=0yh9Rcc*nW>KLAqMQmaVqf50lWJJG07g#puruY)Vw{z2Ku< z4{4=T8l}KCAj?9-*jcSDBq5jqxQAWVdp_F$*Y#n`!f?OTh4R3d3YIn1 zo0=4W0_l|V;4yPfEZB^HURGLj&MB}DaeMjTt9ztRyJk4O)>kPPbvDa!~h){D384Y&6s$pW`K_uM+s^k*X$w^neH3nS%kE9cJ z^e9}T%n^Xnj&9ew2H-;+h}JppvL)a@tu`D{YY|=`_aXlnwaf*F+l**#OMnE#V-S$- zq+2X*rW3CL_g}UFT9*^H*vHwY`|*fb=CA+He^LAyftPq2^#9Z6Ax}J1r!IxiZ!)M4_u#d7!G@E1270Uq-(@M zfIx*H*w`kkawu#Aj;PYc_dP5K^vC;6!s7P9J7;(9liQx9isYGr`=5r`>q{NK9^?LE z`FuRWdB4l3RcagfU0V-aq;X=n$p1J;qaw+{HdJPgHXs4tI&^&>3;;ksf%1w2`PIca zTLp*!2>P2i0H8m5pDl#3Iz7*5kd!_giUU&F%{9iBV12pZd`6b8Ru@eiFCZ$o9m+dt?NS&U|GH#^Oj+02SIHt6Rh8u$lK-BTgppoC{59|O zdaxEx?i>NS53C+)zgwiljkUd|j`K=O7A{w?nh?2uRQ)lWBtvflD`bgZ&Zq~*-tO!W zvq_QCAz5*h%-68X4?`oYy1^H#b!lP>BSn`U1*%G}o;GybFn#zn1rhS5VOA>q>bihm zi5fml?L1yRI5Ui_y0IL8;IK$C1{Q~<#uv?+P(q^z5R)Hg=6H|KYdhtKj+B6ztI1hac8$H^Hrf)|xo|TQvbxXw%C5t&%oP;+AmCGD(gY+dOHl zt9MWCYLxOZ9qX+hzV+pw|0?!jl=Vwg1{K9)LMf=mO7@aF1LU3n1CKSFO87+%|IpRN zg-PgXnMSl(V;x6(YFOzr^gmBp6vW$w-*w0$<;cZU}_^*S$GrKrPMK8GQEY<6K zX`aJYN9AbLD>x~oHq8NOBQ>4$fV54N`JQLlu8LKvMwt}-UJvjq4im#L^FpyL({YT- zvWuiv9bI*>gd-0k*lR4A_j@Qb=DG$vsBsXDF&x!t=?%tMRapXzsJ-zB>4B=ev`Emg(x{M+m=~962jv8gKq{}QyP#c>@4(K}ULxHMdCY&}USZP^eIgaVL1_l;z zWFTn96+=BTN`cge$(wFCRgqL>4%k*Jm>I3GsR%0oi*QwCXC+DEqDoLS z!1hgRkYS^gp;$JYM6;Ei1}s96Y!$CbjT#mJbWFp-apkgE*OV+w8l5PkIa@#YgKu0e zSMU)@6rrq{rpHOTilh9X%)^ax0Ne2(Y#97X0@G2HC1DQtp)@S)a`GMqMTBXY1+2L8a+5N|rUNHRN1Y zg~>^2UM@Je!qLaxjWQQLh?r{091$l8OiKv(L6GBXtr(~9kFID#X{`(i$-?!knUqm?!Q{epI-?a5xXx~DR9OsDgPmZR~hH!p<#_xW9m%SC*dyk zR)w^wRD<_!m4q6WoJIJxU-@6>^TlK`9#4)ISG4}#(Eb1THK1yxtCfE9I76-i;!NT` z3-ofuK|fL~h))V{m8ED^8|>s3p{Yk9 zm;uTFixhFvv{S33zgDLfm0O8^G%RCxO;c4WX_pz+w-_P7Q-idf%bfp9LlA6OBY6@F zqkjc^N1RXDq#3&L9b#hQR_1C)X|8Tff7K*C!KTuItpppUY>|d0pubvYwQ61EPFAQg zliuo6okZ<90B6LCcZpvB)_56Oy5fz;jM`P6V(4nI z)Vx)}B?BA$nS!Z^$!v`C)debr_&u-$W}CdlKclRSV|P4pkvXWdBq>;NTGPj4B&N^| zkUzw8Z0fWS>O+R5fer9|GYoT8&Fr2FmqXq9L#%GebSVBR9)8~ai8i2ym?Mh~8a3-j;uNoGXhCzW)c`tQ>28@!awI zp4XqvXYp+efOakO*leu_WZ(3nD!IyQ7eunM^XP@XJWlAU6-8>F5n`EgUQ3|AmgEfm zde6YYyhR$&Xf%6I)u+sPCB<@rg`3g3S-XV(I10GjW!@Wi9= zEkDw;aB^SXT8=GGP|P9VSVWhSJfeJPYi^e`+ga=Mh{_~s)Js|o`bMHeNSTX6+V%%z zoDnJ8%rLnB;;TQV`~PuVezD#5>mUMP;mnZGknaz=?Vl#%vl$jPc<0t@{bHv@Ti3B~ z{^3GR4$J^-fc|6#F2E8f?P##&;v+^7&)d1U5oOL((sqU*fa3tbeU=L|+g=}V|0A06 zjW&Q(ys9+Q`aX7tZ9>5P0^0&G2tce4L#zwRn$jS?2k3_gAYRPbmVociL(An(No1BR zyDcDeVPh52qAiZ~Y4kD6+H)wt3dcBJ+w25}Ax5dC623ZXFegc3c6s62@dih*i5vh9 zkD?J$JVwy!jq#bJYeco%833@Iwl|)9e()AW8}iFvB%QV$0o1a?D1iv&vYa9&#ha9h zK*(>Rpcu(Gucya(8m^Td9W~Wr+5xkX;CCZ8XJH>NV5QRd{_HFmj7=)l62LPm$;Xq! zSkUvtGGikccZBg|m_CwkwMM^+(grQ`X8@J9Pj!2nBIB=S>W1ap5biZ6%fmJZK$cZk z^dibjwIo&t06OG)3q!+*04FkQ%^)rOwHngBO{7pXY8wTG0&?LK6}0 z8Q}S%u5`)XgU>5Q3~D**Pga&m>M1mqR;Mah2f__JO4M2Az|&+QH)b2KVT%{pw%&5B}VLQYvfVQ>oRJsKFUmScC-3R_Zq2a`8PcdQ};^MKb>lBfXro>Qnw9wlj>*uFpP z526vG)!F&ElRwa zbB%bN6ewsRGMCtYAD8eI_)#&NI^5-Qf8l6`+}>wV|RGr#BW==WhUl_)qa zlSqoMe*16yt?&QyKfs^ecfG>({81LiS&~(8WWTrp*e--nwx>k~o0K!cN~;(F{)LD! zpPyd7a_{*0boSunX!koDza3yyax8rb9wduo7VoC&PU zJqHFDwr!7j|1&$HX&-U)W@HFU`^&KrqrcFw)$&a3Vx8udJAUx5|E2$lA55P-?%i0Z zrshI(Z$*tN+$`8TkWS34ft2f<+qM}l2Ko-<=R<%Q^kBn z|Ewrr)kksT&OdK!L%{|>5a0;O2ldL4J@1|-fc{}z2~@$V9tx!3-stt5yC=!{)b!A= zzx)vOH39vbL)xDxSyZJ-5e0_VgZt(PH}#iutcS8J-Lk-t6mjAnjd3>0k&>*}EG9a- zds32SQ5ojCZ`LVm##EfD#r!jB6>FMfh~XvOwGift*CuQ&SOps8RAMPvV&M$VEHhhW zQ=4Kh?7WM@NGd92*|YU}v0g1!Z9(mLa;$rP7=)Jj5tBY2z4ZgQ|G)m)Ulm|6eg34^ zKc?6sdVw`#d}KYGqA1rCor4Y7M4O(s#fR=NU*P^X%KK)QR#gi0_px|FH@VtLSc0_Z zE*tTfAFw7wNimc{Q-W>RF%3JQHVxadZ3Em@RFnYpH!W@f(__J6;gFWCS$ZPVz%IP# z0u!Lmaa=~fKWilx-~qeXtO=2;T~)YNG^ML>kIK-(k=zr8OX8&E!L~ZZ_)kFU>urG0 zdqCb_;YNg9W_V=u7tdewnGE7$pd$*ADxFTfwxxZ|Vt+ZQ7-phlMXQ9GP}84lu-dD% z>n9Ii0~_#DA^O?NKru*u(EWGOyynn4H{HHMs0W~FxmHgZiQy`JNoq}(48Y61@$nZ! z0+j6<4MChvKX}WO+NtVRn_(5Kh_Fh6HVK@^+0D@((Ml=+i7AZpT>shW#VhykfEfS- zz+4d90Bl06uCxIV0i2A@qAegUqQoX|pbSFTZ1n`tAN)$c_eO8Ij;OK|?llTKMB6so z0K@aK8^cPf&78OwRAGaAh$p}fyZjhlsnV2{eZ?W+4&%V%Ykj~SCH-B`ORz&N?T*Q3SYI^71%3%9ewDWP zN8dKo`w;*e6^R8B-Nj8q00&JRi)hlPF$PstX9hSAyt~&D^8vur1UuUY0MIjBE&ijEwto7!8#W-LKe|&7 z9=@>e-`KpZK7gyJ29$emHmj<1+APB?>&&+881P+F!QR=feeeEBoE4sBpw>+zmdUww zmoJi9)b(T857PQL_!lXC6%H;|jw5-FmFaO-I#sP&aKyDbM{?R|y!9G&*NU7gsPdwy z;p~_w*i&h0jtX-MD(;y0u{9~&=!UCdv5;O@)PP$nEGq;yi3i)JS&)Dm5U%oIm1hYm zF=VMu<@`#8Me-Fo^Nl;t10Xe1$LYf;lT>fRjbK;mB#%)0h&DwtB#$#;Z6&O)$K7vk zrQQu5g}oA+r&b1SYLyg)>KHZ_{8n|L7AlSq#y$vfV4KTNrE-336;ij6w52I%2raWf zbXMwuCOMSIDWl(BXet6FkIad{ckn{pln5h>ZZA&5zjN|6N;))t?f3Pzf3jNd?YF? zH!kT(JdTE%M-@&CfyL-sHXNiX#nIErW|M>ouHiJFUOavCOFxU9C0PCpmQyV98x^af z46Ldg+;}j67!sh8;tx-t;7%7hz4htoGx*UqTovFA6)5+#2{)E)z?=)R}Bu8AaTfm5T)s#Vk1v{L2i z-x^8VG+U|}>rDb%S}XS-Jg_VWw%o8)*8_(-NsA&*Rnt~18z+2gI{5PNv8LnbrU?fb zCr#K+mgW@zH*LK;cS@WoqG*-@uP@hY-LrMf*=m^F!nT%Db#&XbQBet%#xxAl(-^No z1PF*T=I(fyMFAkOp_-28L1X}!6s8e=p^a4yaLnO{xmxK@CP^GG=L@g_S&{-;^dZPd zl4`Ya`Xg{{)uISB_0G|WVOZe!R~a&B(=#x}MpPx(9&f%k`>K38J^k?Mb2#i#nkc#n(6hOmC1Je2oPjU+5fcnvRs_JV zl+o{VJt(*XGX+BrbO#1Ip3AmkGtcL$RpHU_+)F`~va~}(D>)|Oae;{6jRl6Iljj{{ z10e;3Z+XVden;*D;N^Kuh7=#P&A@HVPcD0@ang83mf6dxlch4OkK-c!;H@7UtyRBV zuJ4V}1$gBZ^b?no+dJ;LtL1t~J`Pv-%A}3gJIv&^lT`J6j!rowiFOqu!O7=(+hXmv znqokp$<^hZGn%XWp^RWcl!ITJgn{zYxXHQS;)<*%KX0_x!cIN_1A3KLOA2fK=*Tr) zPxiS6lY!XrX4RJ;?b^#ee)+Mp8;;|Mg%lIx20wYeI3NkR&eN=TL4gVu5n?sz;c&Df zD(uOJkB|F!xlP7H;vrSjs=M`|qBx)~1q1-a;8<~u39Q~nXU%o-=DqPI&%!wKDU4X3 zJ~tfK9gmARsk5lcVeclIg(<|G-G>k6tt|fL^tsh@Dq@Mjc~oo@mGE7+v6Zse1|m(ArC>Pk{b&WMh;8i63H3av09fg+4eRg%sxv()QKN51>}SaS_t zz$V*e)dBtC{^_%Gac@}-Y7WPf)pWL8tViPkC50NecRU9yxi|1RWu&WJFlgByQNdDh z5}?f@h?&E3(UIVY@+>!{7BJTTHz&F524H>!*O!->X(E51gwHW@;)h1!M16pc@72u&_Aal zQ3U!paa;%PiT(G(Foc&4UU?M^0A8@eK|%;HolTV)?5-qj-KgA~HpIkOqGEIXYfaFP z2H=N3%-T}a^QRvko!n#eSK2~PxQER)ypNCmH!=W)+PtW7Zn9L(Eq(x~13`f6f;ntZ z?BcR90E*Pf)u6Ls3TIzl{j7i?q%cbI#F_fXccZLZ1s=VwHO)%!GMrEu=v*WUR#hCz2}f;L0{&h6>b=^Jm{Ym#z{xmw^AAZ$Q`k`b<}XdUvP49oJe!M>Xljtal@MKZ`o|J)-R^lPilfb<23%G$dj{r+qc2|K>mYkMF(q zChqU$85jVer}hHu|E%UvY}ub4C!*9$rd%^l+#&=szY_?y1dF5yl`od zw$qf?{<-7(vkgcH=a#kn#9YwBE}P$I?v<+0|15r zf&;bpi{qAVY`34@~1rb2Fn3F7NFI_Gc%f$Cht}Ef;2P_C^ zSODP`2MX|m!1rex5XQlFh-M{Hagm4s@ElPbbGcdr^uP1=4>`pmUiqExzkT==ybSce z)&Qtmuh1oXP*8KAqBc+Zrtcc=d_A)q_2lkdI4*hLR}3nD1W-_2)X}IbgsO@PgGm#@ z(rK!qO4EFc1BuYIfVXH$TYw^>X`bkdIRF59+d_u}wW4}pV6cWq)y<}(xOMj`C5zTu zYp`p(XR<|lWD(-H8cp&1rD6EweKamkJN+jN z!YB(oDsr&&bapvw3kE`R8Sum6Jnr|0e#`m9T$&aU5maSSw5*L06+(pKHHE5%G#Dr= zwy?I6jFX^{unYT8iYEtftQ#3r@P~vi*_`P1>NIGoL;E}$Y1BrokpkNH_nVP5+HRmQ zx;s`2#GUbIxVSuvZ{z;I05c-;-iZEJ<$Dhyu%T_Ih}C8}fPICaKW-(I$#z3bhQ~N6 zLbt$9(aCu7cYfn<|GR(o-)j!9QXZt>^p~V#U9_KL+0N|gQ%kj|nz4+fO5zyZi6n|6 z$2HToToo*+{jt7RiZcuwpf(O;-8A4raB^e5m`Ax`c>%9;Se{Kyq|RTRwc$J0{^@l) z90_G{>)lvkk(QS&bMpG@_i<@iPM9gWU-Bsql8vuo%M~mp*{4mZJ0_+Lv`M_sUO&mk9tlT zBz2mz1clMgnun{{a#-s@dE@o_^9>yHJg)2c`K4y|REvk#;?$5lkNG$VvKsaxp)#lU zAH9baG}GtL9z9;o(V*&<4alaOHh4>($vk91r6{P@m*&b#yxoWb`p9JqtIg@TXXlq- z0H~O$M7@9H)|+{cd5LK>m%fb^K)Fx^t}gg5E)V56fOD2y2!wSdtps!@RDkoV8}x^J z)C7h2fGhO#%J&Tp(+VZqkFPCVzv}3{{jH{l{`~a0qIMP-pg)Mh9wqd{%{mO$esAFS z2hn;B8$5Z367jpG4y2DQ^1fgOHZ-G$uZ`(Bv5M538PT{Uz;`ehGDQ}xmwfLHMr=-m z4PZYG?z#8})ws{jJ$mmS|I@#C+Z7=C541fSEYQDDb|}#&6|Bf|w4?x1asF zpMU)0cN&IpvHV2Q{~+~$Q*^5eLo>ENM6EH8uFUsp>@3R-HkZ1g%;uNl$>dW=W@uNG zipg;{H`&NpCHWQvaS+5W>-RLHGN={w(W9RnwdIVitDM|D;dNeNx1)3os;s&pYhD@Z z)r^!*|5w(=`;sM4^C)b~y3;t0BeZm5VjTduz5ckc+$tlr=hg-wGNdtp{_^s9o+W;N z41aE@#mpTJ!3<=}=4D_5Ophet92Y{0yw!vdK*<9v!LRjw$EWtL%Vn|&;(pIvZQ#J? zj$+1z*dl5a0Tt~Sg< zzg0$?o}ZuGIkrq`nxM!6Nn8P&0kRQj6>6cjrlAO*JOaK(!iTwuN+b_h#fk61w%Yx1 zS>!dgC^zVT{Vi=|#QphndU|Fr|HZ_et7;&B^Kbtj@}Kj?(*AVOe<#8Fkv5)!X1r`#zTT#(73MxA^@-fjQ(%|!u_lF$8WuZzY1)C zfPOFoIb2p@UYpfbC_9}k=BJB)_;>%_;loS47jUn&(j8g)iFBD5g?fNs-QoRjVgnpX zbZ`W)XUWk9xW-oBil%M-$&O5`I9<=@lqyO3Y93BikS9*IO)?%m^$U<)BU;yks1pyERgn`wY@ZyvA@$S95 z77dsd`@-lCx4-e1|EiR$kHOvG$AA7m|D~NQaoIGrm1$Y_Epz`cUX!upE7mj*Sb`t@ z;JdDgbnT<}AKwuAU;4l==J)qAzz27#2?c6W$1W)dICSgvkK_1~JzuZ^Pp3}>1tfH? z1biQ?$l`B5SOs*I@z{z&0PiH+=X>x%W8{9~#bV7>K#RqyqMH4eYXBJf8T~~C0w0Y4 zqUJE@fk)%}*kQX}bU@V>-67@Krj^==-R@I}2XE6^L5b4@(BF1(TVKwN%!SAdY=G}s zcV2&EeLl6lo*9H}6~r8QumSLluAxD?{P4-~=M?97z(GK^3RSISo(F6IbM!0>TCBOK7249PlSBkpsUYpY|PFGAsY86jh8A=6p7Qh29Y*d zSz6e#k#v*O4Mzl$;FH=c`C#Z7c?wJ@#akD9JiBbjhfP~Hu$(WVwwYzU3hFj}Ia{t+ z-ZtC>e!r*XD$8BKg0?5PQ|C``0M6+6&Zv(SpUX`Ezt9^s@&-L5I`G0f8V{eIFM?pn zvH_@qNouZ>WAIS$#|x1b+27;_6WT8@06qR0!@&Svyb4yE^?EcJGiAgMb(iyOoxb%F z>{DY!z|`5prYtp2vH{g;oIg8*7fc4t_3)qmgR<`2VU!`rGo#kIW^p;6KYxz%(h$)-_Oz^C>dlQg@ygn?tqYmk4xO!=CZi8AFk?~OUDJe`Fn zNB*GYo2be>psbrZU#ma&`jDRt5^M-^P5sC>XJH=aW#3eglPDE3XAK=xgjtkV9>GqW z5XC6^k&RWTWv{`&&-ZoCXZfB0Rx8}He1s+d2WiKU^pK0@NWd@ z&*?@Vjvt%Q?9H%E0$;nP=0}U=#HEsE6)`u0Lqda=kuW z*gk8EulWJX27nC!^k2+p z-~EMO-s4iZQMgoFf{wvUfPM>|V*c|1k%_N-?W^y8@ZQA@-2a2F&dn=-uIK%)M}P6B z09-jGu&)$^IpHCeV`uR#-0D_Tqmg#lrb;jmzaJ~ezv`+;0uR1`E&r~YCF>qlpuBL&d!lIQMOny;6eT;Uq*^YifTT`uCtMwaec`m+Td?R-0c zY@nYC->>=2?|y*Iy+x2IKkeIr2;f%MLulkOJpwjB1Oc3tI&!2gA#Iyj*vln?i)3jH z(C=79qjOPB_QGld=|PSF(!7HETDP&sgBDpNbt+U!1<>C(#pEI}Z=2@jhA8{hGK|vz z48RdN@^IPkteapPv*@qCUK%=idPMMVT4a=*OBmce?|8<>X0B}s5!N)WcZoO3n$U^2v- z^|th$Cu!tS=1qE)B=lcM1AIi%>Z@P*s%Lut_MiPT`{zh+3bMFw!x096je(dGkmo!d z0UvV&0Jrad=iBW5U*qXq8R*`?0B{6wzyL@QKsO&^k79sBEzfS0LxIKykmuOgfL2Qb zf&fR=vpBL`&vZR8JLQXC`SOQPr+@Cx|3~`~fLt58V*n0!cZVu*rMJ5`cxc<{5r`(Br1lC>sDdA<;bs^pEpHCA?QukH`j~s!DeJC71NT z?_u=+`@i#bO%j{=3`GF9Ex0mxQO*UVzJm@m2o!R|lbtNH39avsY7 zmi($^S}xxI&>xSy(IBEG08#4_$DL=v=uft1W><|NS#4H@8qkj+ZN(ao;ewbVyYGPS z&t#4a7P1)q<@v>ohqd0jV@OdEpnnnujx-~wh_m&xc|;cgf2^Q@_HV!a8@~znUPWj-xBEm((}EC-TyXcc#!npf&QHbUXof*~0V1 z;?u{GZV1V?k2jyqhLbVG0Tl~OkqyX;!ZyuAX(W{q9B{KNcVhw>@vnNO`q)C;2hsng zV7iU|R1vrJdrnUm30dxU-}_McY}`JU0pJ93%vybr%~tG-tlKMka0I%$rpGj!iu<14_f%sc6{3T*)&>rmiF26 z=M#!f=9_pP&9Wp5)*HIU5PVtTPB(3;PuSbvWWxjEAy&7G)Fzv^i8pDH236|C5n%3o zGsj7lJSz>N^7dnNBjkOYUxxP5^Cw5=>o|+!lxNrFsOWTl{sYP`+VmCH$-~!}+;?1O zy_gTile10CQONxAVgW&eX2S^#=d)lv0}I56e>QzqC7I#5wQj{(=2Zq5gDBc~ULRm4 z4mOKtPw-;{WH7=s!#3AknNZkq`s9@5{O-SU@{Qm7U7dOh{*`|V3x~>9(3|$g;eWAj z&%p6Dg-SG0El}9;sPp;x)8}d#-^A-LZpryvsr4_RKNtT9@<*V*fcqPL5$ZL;ucFZx z(imOc&_nvw?BE2O1_6Kc-UmmdKA%Rx>C-1Y-+!-okN?Xytyf-owOQ50;qZS;r4)X@ zYSbht*bRC!lxVr&MW3X}a=jp;A3rTyQ$3RFt~ZgT*Ou=F!6v17uAiubxfQ9?^=&zJ zo;BLAkKTE7eD`QDWG*Ov@Y(~nic8VOLYaV)GXW|kg;j9oRM~TP9C=N+BD-E|ojErt zsT*Z6SYt3BYI}H7%C~Xs3s;0%iT7>+4gZ(mmholVraIRTN2O-_6H2@=w~mCcVF}^V z_rCw$bUOd)SH5t5b{1}yY7rLyq8or_&kIF27}}^K{Aeq;xtuLVZErC1eR)phB6WlQ zbTRBc;K$k(zb=!7D0G_%P@mv$PNiMT)ygJ?YCwPVlrJ0Y^7D)Hs;n06Fv1`TvbMn| zsidZ5(XG0pXe8v0s}gXZO;Sn|a=1U+iTVJ_oNYr+R^8ei@j%TZWsaUBinvaW!G8qw z$JRb_^fJJPv>XntaJ3Amh-iEVDW)}b{3oGBVZ{0T^1Ro__wwhcL{+j40Q9%muEep| z_e3b*^m=j7aKV?W4f7cA!1em`*}Sm<&zd?SumSww4}b4>`6B;?Kl!g82#vF546?Fa z;@z0x=g*!!d2%bpA1lyq)A4(d`adZ7&{nb*FNAT$PAw_U2&5-w^UGIXd1&;!h#JC; z*qeO5X$@H}S2f8=4u;J|@$6Zn?C97SKXCWymFyQM%-W*KF2YOO*54-0o5hQ;%_{8{ zfPxJuKXq7v%PO<2i}S_B^pf&G%4!)ueC@&hD}$){!9CBBh4?K=l}q*tO{*(=Eov<4 ztEBF8&vIKk+Pqy;YSw{38$jLfYITF-QGcvsRvCu2y~@t1UG(InX&E^?J^iB)0qoo$ z0+9c_oL?Sqt6j5N0BbOE6E2{khy&Ua-@#?JHJ4nj#88U1eJP@lBA^;cOGoGzjz8X? zP8s**pE0|+cJ}sKDYvm>v)9xLHbBj9lx@ox@xcd&h+x;emBcbFST@-ojW@GS>_xM+ z@uaD>mEYT0Ae`N0vjKp6cK;i^SVYNoGB8e3umSV=}|Yp=;K{{8>w zpYVfU_>;f5?L9S;O`@siAOF^GvipA!{jX2id;*zc)v@=Gpnd@nj&-zrlK%S7W*s_a~Zr<;dLT z*4Th51z(c;fgHmDyXe@Cu#Oc=xT9Q{R!Jj9kUg%-T{?P48Kv!6Q`@?ReOZg0n;yq` z-_?quGK?JycS)q&y}NjRpFcbM?zg_Jd}eMh#{h6Y$C!No`D_)(Kf<$ngy?^VYEEp| zf#u53&q09J0{ss9%g+=_2{yo@AWjaM8E7oqf>2;8l|n{!F>9rG=F`jR=~=V>whh3I zkcBj}YQy-cpCO^1KO}1kjz4Tyy_n^qG@~-&m~8-{zfj^#;_v|JNih&NyTbj$lg4|6 zP(UrqSKfGI+s5N>_|7-~8UOjm{qlGy*N(7*V28MSL{z}8+E zx@&mMeZxJ!)FOeJ#kLIRx~(odx@)i2YqkNo)UV5OBUyT?wB^h9UcKKT)L!MZYj5Rm z^44(%_n*;UX{PuFL9qEOpbW$TN0Z~H?>}pguyW^Ucrjaj<%y{Wzl!3o z{i}bRpMOKL1akX+ER97}+kDK2AH4hB@BQHEv&Q|muLuH)Tl)Lg^ZxryzdP>#Ve+Rw zunev$3ZlQ8SNGjMd~HsnwMuMOt&avxKm2SRP9~$t(P%s#ZdS41b9+5k5JCM>A0Ej0 zDyJ3y3d2~oq_St9P#c%)dXD3;v0Jb3I(YVY+C?5z-#mTxL9kh>xl(+VfTlJT9ExEg zUF@r#+w*95+}D5h3$tkxk*jrje0pY-!z&4;69p{(=`u7Pz)pAF4B0fbrP`G5BKpQZ}*S( z4F_0D6jO(Tx32*QPx5TNfs1zfcb@RnA+b(vUNe?tnLL%-v=!$TsSnCPO! zW+pM?&bAA+Sz@_Y+z!Z9q-&x0tS!#GxrZ%QqL{R)UC&D?TXuPR&PL+SoyAwa{O0B5 z%rxz@>G{2ryTXA38vyrU1}@t^9!=FJfvE+a1x+Ne zEoLZ&aUupw&FAw>B5l`;4#l)~^4xs3kjo#JRNKxrKsEsXABh0O&91NVpl|09)RK4O zy8df#zWMpr-~8bHNB#cf-h&4Z?mgI#0RHhm`UfAphe57v0PL%v|CYz{C}t|#=p@Zgm@133Z!=>Pk_^Yu61_#B_>XO9t! ze)#C!kKFfvu_J(F9qymJXCI#3e|XQ6=u6*|Yut3p)B*h=6tFdf{vbj>C~8|Pm&?VY z51w@ZWOd<{-FGKP<2jY~UtU~vCv`Db{{P!2c6ByH5kPoFXR zzjT-X8sC4{NZiEzudjG!+YH>c20x`}z=mkJ-{S}X?mf59{7>h~P@RI~XhE3uC=Mv3 z4r;zc*z1=SaO3I4{MEKl=jn9*y|*8|PE5x8AD&H) zoO@J^cXn|x9v>-f9sf7Ki+Ba^x_@{4gCBqU5f%8uy%?GG`0?3i`3V2N0t^7Tt-6+Y Sm2CF_0000oLb-Die`0?Y14({Sdz4|kB`0$Y&pE!|x_UzejW?NfZ3l$X=m6eqzPo6w=>fzI;PoF$_^7!%NU;9s= zK7)FGkN}GClD$$N zO06E$u8G9#if=UtgE{vIUu=L>OHA-BX^xL^-kv;ynDCH z(fXj|WvTVEl0%ZO-I294IK`w+IM~pzE;%6CC-sihhT?6fOrz5U2XEi@INGR?+hOel zg-dI;Y-|)QXfi8qh}NvZN&#%Ni@B+tpa7cIAO%7JunK5aenuV5q7H%rXkLXB2nE0@ zq0Et6BIO)f0Tc)YzzRVD+;T(Qgl$LG&GP5Yi}KcFwv73_BIfmVH^fa)xUvk%6L93F zedL0fauao0lUXN0u}AZ>1j!TffF;7tBNsc@ka7_%0rG@AV3DBmO&6q#pmJq#Rg}Ag za)3pG3RvxebP-gpEI_s$SutC<3tTSr>VJj+P6 zCaZZsR*WqzS-?C&zw z4?*S1EF??F0=6GnFzdN0>ahkZ6>xP%%nKPp1~5ZV0iPY2w~qW|H8U^D*pvCm0Hz5l zVBQPy5>&2CLvW<6Ei)&YZbK?y&I|AoRIW@x(u6c%ilEKSih8e!dNI#xfNN8bG$9R` zBxroI?Z}Lo){Z8v$t+Dsi+N^}paEul5Ff!gQi51VI;_&uqLMwC9}O_=gZKyrF+WeigGh{sBsK>haU@$?fkfM*nvBqRZ&gq=sa`^S;ijYa`ULJ}}S z(D}v>@e_2ejEs-jC3;Xo%wr=29WdsH_z5~!ijeI`Mn^}BUZk6YT>uau=v*m65`+Yx zK=|}XuT@|K>Go)T3V=8v4k!?Gz8QcF5OBoj%NIp)ABqF=1RYQufD90Hu9P`au*+RX zx|j=v0l*+Z=SmI|C&U3ej^y+C!9LNT`P)th^ko4tLJW{4=zy|E`t7ngQA~{e{V_m> zpaXJ4kRgK3l?((&{Qg*0l<^}SkR1XH5p=GkAyGmUkR}+}jOa!{bOUq700h#IC?N_+ z5e&ZBek7ev8v`h14pvb@RLtoV!2qO#kRZW1l7yH?2JNCLQBsV9g9acKgaio&SCWtj zAp%GMhKwXqhC~X%01PD{5kdrzAe1|jurqF;xR?_WLIe;e7=VNdQ3*Sa#N**03dcn; zf&qxD5S3tXB?c*bM6ohrNV7*p(Fg`Wi9*7JFd$0Uc|_Hs$WRd>ObA0Fgb-JBh)xJ` zB@&I;4Qpsv%#jEoM9?8RA;gt1Wap7^SVy5SG5`i4#1+CYVVFYr^oU_Mj6z~GjL#rM O;f4czvlBx9tN#F)s7Ijy literal 0 HcmV?d00001 diff --git a/examples/resources/raylib_logo.png b/examples/resources/raylib_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..66545627719a2ab9aa73a0a801d94a0ea078b278 GIT binary patch literal 3760 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 + * + * 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 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 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 zcmeI5d#qeXdBA5k4<~7w7kT3(H;Hl6G&p zc?{|S<>bR8y>AGC(ibGdJwl*7@o|z<{~!d)`)($Ae@6(E5Bx642mf0Ll#k4jeDp&? zpnMGSMEUs3B%juDiS ze*1ZnFKrV7<;zel>dNzQU3E`lK=XW5Geoi z0?Gg0Bm~OKa9k*_Kv__J@*^pY#!W)X8IOtv%2{6_+47=jpqzIL$@!lU4U`N1mgM4# zL<8k@he$ga*n-dL`>z^RG@oS=i@`fLi+%zW|C^vtBjq$WD~IVlED5jWL)%@+9%gL#bD{a#rs+I zfi&3TP`|fa3HO^-s2kOB?I!z5cLRDP=IyO6Icv)UfCd)_UDT{bJxA^?`w( z2>aaW{Q;&<{3Nnp8ur(^kFd%EL#-nVto6MsD{u@0*UU*E+XDd5BSrrS*U)OoYJb1q z>$@gOrP8|_Cy%r{8~i_o!`g4vWT*a39~3Yyr>Q-N@PUU6?ompEJr;_=u-|*q|ABG> z*xmu>#87j_3RlvjWv4eNyd!Y5Xw_aHZuE<#VQ-!1#TPsaZ2qnmta=;$kJFl*jNpw`mLxwj!>H1quV~-DVWOwL#>kO za852WR}9HYgQ;}Nj_eqWG_rZ{@=~t&pBxzM-8i+@S!?&7q@P{t^qhkUCbv7R(bpBg zRFv+yVze+yZetuT&x5p zqmvekonCv$njAO)t+MIP{xVsWiQHJJwylzKkgksTQv3<6V-}@aCKFV08}~?LF1kKS z-FNsE(|gCywwKPTi)rPrkasGT$11svb0o?{9V>k+mB%VsE-o?3MCG#3+W?pD{xwD? z^Pq3efoPRXCkI?Aja70RClh6&j)T6HN@JBQ7q>LZ#K|Riy$$~k**d8#-_jXF#^!uc zUqe4meHF~V*XtDRu3MQ_NxwxlZcS*NvM-{%ov5yb(Mb#9+O;q`X+i&?YhiTKB5;VVdDx)cQLcvl^;Tn2 z?f;+>vGnwj*R$1_)bgHCvF#3Zy=;>H4k@zN#i_9xlgf4^bD5|7$d88hM2+5){i`Yw z(-wN`5aj9~DLTF7wIN(?Xb0#e7~946@{q?ul%-aK9rV-N-R0t*-b&G7Il5|ThaFSL zf)tQebc$i&0aj9LJF0v3pOc+YYdb2qXJ^#f&fsNgLmrM%Yr8O4?oMGF%mJ>1gI7O( zO1ncp&DpRTlWJ>HCE`C!A2}OVV^Yg|N>a&gY2&!#dv)o;sX9m4YoR@CyPagSi%l~2 zp9hrJ7$_rZ71U>TI#^A+6Zp4yrALy(``P0Q?S}tNK+pfENOE|; zk-xSoR$8sr zoz>W}wgP{_wi)?V=|7>rnD^Fm%5GMxaQ|oY7xQlH=C$e~`0%X$V%}TN>5mxB!=Zv5 zFjRm#emo8Meumb_Uv6@Z{0%G-m5NG4-P?g zx9ED5M|zr?mA~%SEbfK*3t7AJ1H3fFE$|u~-_d_A8wVnOtJnYRH0PIU{T4WobLG!N z{mWq^eJnzp10TN!awZ-uZ1^@ITE`SuhD)rSAA(%K?1V7&Z~iB=gTY8~W!TRAPiXfd z$PHn;IY^Ql^6`@TY~NbXz4`|H_Kb5%{hELPcWHnO>mTK8G?%5_B0u5p^H029@Q}=T zBx?Y3FdA7_`nUPnhdCM>dHh)WXNWzkFxs%A)xum~eHAshp*3!(B}T50-zl9mEv3P? zrdWVi@SWuXnx2cF;Ey0mnr3!YKAUH!Vd{n4&>Ip>Sdi1vbPg5^HhddJ(%jYxsZ%0KPg7l&gxXn z_&zEZs(uxz@(0u9|5FdDt_Eswvs9VW3$#sfH@qTMejzPZp|luR^VPY^xb6E4a;3(P z^dLC$R1c=Awtb}nTA;jy7)^84X`1xgzMG(ZIbGW)8$GCbY>Gy;edmSSDz7JXY1q!V za_mW9PwLvRojEx#0-LIB-=~o#HgljpB)twwiJSFKFdfcpO|ct3qjzG3vlKbX7(uhu z37S#UQ{}Z}UcIMhkf6Yft@@DkdPR*TX{X@`{pvwQQlOBQs9<7@teNU$&GM^kB5MZD z|I_)V^O=tr<(n>NcBA^`6Ja~gH{BezGrnmn)MZuQ^eH4OGN-RTbY17swMS|2ttsw@ zSM*bnf?C3&1~JN}t5Y`b`>);bPo9o4-eQfSEYf0mEg-hKxY3)5Ie3&!h3yPw+aQms zls%16fvcER`uw9&he~IAXzZ(@7@wnCofhtp5+zNx~@P{%wHwM+$ZO} zC}}QNioc?$Qa2*hs7<^?HGj5E+^!o$cyEf^RGSFM=({Y8d*ZqXKhr5uc0V4P%b3l_ z6+e95Vtv}Ws&Omeg%{BAM{YulriAFaGXhK3hPlx6%Zes5OTx zo0SINn&NhN#cM*K$rR8*iD_dTB}CIF{TM?ot=h*FM>JcuPJN_{6)~0}eeFjKVGK(# zRGJ)&SZP&^o`mT6l;0=H#S8tCrpL^$t`k9*c?98n6}>gZ9{8vUG6i(p5Su|BxQkg{ zvrVT&(f!_0E~CXCRV0;ek*!fLyXt5$IG<7>9i+Upn1@P;p=Ue`;TJVm?v2!A%9UG4 zm#cDGjH`sGdB(F4K7w48?zkVntGQAEEl^%UjHZNG_>?~jA(wvChmj_CQHC0MsLNHC z$@au|=uQ;8H^n~Hk8%rWVJhomEG0z0GmZ>=NV3G1^N{}m^~=X6GT^M-VWO3;HpWpx zygOr#J}5b2OS_CGN34L%BRSd#M^g!L?~G#vPdOan+CSqMBXActvJOduL`xyXNJ@x# zXWZxh04GVU4K;p!ZcUP2{K{j=B*bV+h0y=QV{E(JOl^UIWp2O;ZUm@{D`rKM!O%ixJkUCslFG*D0X! zQzdQ8LnXw-C;b_}xs3U~4>{6{q}7Tcyt4;48)>?M6!NtxZ~`=p*qOpvespo;J}4pX zopGe{y_OxlY+j9eOcf)QiXUCTGDTJ&^Ft|7?|f$uJjq#-3(1UOWWccGu9Q<&$4E+u zdAEF$wpF-?1s3v`8{Sef>K>M}!}pwc_pn?Pw)5^`xjJlT?qN9}j;HE9ET=3sUO4_oFa6j zCgO1>6QbG~dz>dMJLBqc*aB(_o4CiBOo(7-dWhoCyOZb^M@ zdfuknwkci21GP5e+B%v-@8RbWJZAZ!$CZw64{7vMTBCkwGp=2QqeoqiYSc4IYsp4D z!#7G$LR>rJ`Dts0AoJ+b8c~!qKg|@d)VF5(SgV#2!_Ie}>*PN%6+=BfypaIn5Y< zDcdZ>_hFZ22A}8*{?@LP2(>?}D3`YD7^4Tm zBsHQZ(fjbIkj7_3T&T4xAwHdP-}xx#2O>lD@jj{i1l-Sv*idWNW=z`leDG7a_wz9D zb6`MW611uhKNVxrrf}xUi)ms#=gpWjvS7C`JMWh4EUtBiMIUX)kR4Sx#*Wd%*hz>< zXBNV4NSs;)*1Rg5JDpU1a$a{VaWM-)tpag`9G&iHEVUBp$leY{hw)XFDSycz>$ zRN8pNX#1&f93HKSv6B#mp7XEdcfz_Xr+e-(U*l!e znlX_zUc5D9aGe_5=q>)-;~inUIocc7uc^Lf%sVAJ`!=99`-{E)$@Xw*V|~5X9~LzF zSfAd}jjH(eF4((tg}{4LJOr<@^@K%+Y{DbO4SmkRsg2xVf z92gi)jGct2^{oGVtX%Hbf4gL7@5ZUM&RVzBa`n zc$c0kR8Z!l!pSkhQX<>=j>;YZ!r<9t`tim!qN-v~+!oG|#8okRQsUbA-h=jlqDQZ@ zS|6WOappdvq6_EnW0f(25+d8vK0&!W0rGx_Aic(Fom#i6R9j|Sw;88(!(KVGZk8ln z$N*0^DMnR7%zN6u%FBhSr4m(Ynb{h(ZdZC#O*vF8`c%2gW^vwBN{p$5Sa`-`xQ894 z>g1s+j^SEj?3J9Oi}8~Z^Y&Z1T;`Cxjq?LDy2iJ!#HX+sfJV(>+nEyg_FJ`F2s-2t zG|nD~%_6Y?#b>eYOo)AF{3NyeI6rDl*7|s%E4&_2%jpp0OV$XRS4#5a-S~3UCi+$=u0arxq?X3SbK9M*&z; z%tNKbw)5?AA9Sf2;~qDkwryP2sCnD-oAGVdd4P}Mxsz{o2wELyf%8w@H;+gIumh@d-cuRkc+P8`;WrG7^1>`6>>KI80k?oA1Z**sgB2*)W>g#7DZ7PZlKY6H1KnZqNYNk9c_gNA{ECe!V+5r{wf$Btmw6<6 z9fIoQhpNwHQ?NK!YE~EHCn2Vt@!i{dh@ZtyuRW~SHCpw1MpWUr|1qiWO{DdjO^HJLt3Bj0 z=VO;*r@L|TNV~I9)Qg|$BlY`D0Ud^zHpbCr3>ulRTQ~;2Q*k8MBpcJ~Fj{Pg0c_w_get#{pSggrAv|ICQ>OU@gwim|lSqE2S$iri>Ak5RJ}wB&Fr|yr6!^ z$W4v;r<54A&sQ#2Xm8|v!96hbxk9Tx+l-hh-S@+kF@iRu)a)dMkKs{{TO5MMbNv_v zOQ?w(wSLS@N|ZWZAM|sIpkA+2w7cUu-)x^QoYS0HWy}X{#;L3Lpqm|n>eMqzxXve7 z-0OU!i}8~Xr=Igyu*&6$X+KN+1RlNvVMo~N(<_=#r;F`r?^7ClYlL@=?NJ(hYl{2fHO`si#6p;jh#MqCzBBe{KNF=4 zB7O27BCmEfei7$@Y>}VNEPdKBEKUt&3O&Q}46$Qvr9EtKn@1)3MWd0=zC<33W(I9A zN28fT%~?{jXSHY#ceLB(tijW(#o-08`e_-;u{@Mxv5W&ky55%Fl#2~qNl zJ=*p-Yq@wd_sTGYS=^&dZ${Gb{I**-&hQ3FS(hGFR;x83EBEnD;aD$>>0(|gA(Ec) zNX$0khi=gsQ+{;eI6qbw<0mCjp6^_^8;Kv9S~#Zs=)!S+tS-h+N}N1jer_OsD3m;= z{OH1QeylFWPePPD<6idl#804aIT*)Yb~jj14pzhQjUCV(>PG1M*cS#jkW zQ#gYX)5O?Gh@!Xr7H%5^GtQNlH)l3@JOx!4dHEj5EBFOAjC)Lo)-fJsK|MxMeh6|l z8o)+xt>=`TjJ=>9?Op)6C~PMqGTQD%_;7XDPR41_?tGA!@Po63uh6cu?9|93U8qWC z<4Y5)tWAMc29ZofiH%%ZMU0w+czDM5`d@3Psas?+$>Z=yB%w1h@|Y0i&e-EzW7!#3 zkHaF13Y&N&aVjBR-SS7^a%rcw0yX=)ZMdb4#u#v%;k7>wa)D}rqXV{`MisEkl2OMCyq^9T;!@^8HtWm$Hs{e5c zXc;Q0BP2~GM4mGy=@LT{#qwbq(72MM3s@q_s$(Q2#G^AN>0(0?UHy(RNxFa~lB_yL zQbKe(W0Ed1BZNq)Y9Dm?J{n5taXtT z^0g@*gm;(|M4iH5VM~ZbY+}46M7gK^`DS=a-Rb6=ox|pRjhb(E3A4i$Kw|UFwubGz z`DWY0c4ofWl~A))=bK$1d0Q>|53Iv2iFI5T2}_Hc7rerCnPJNm(g%wr#i&Y%cxO!27E6`04Dz^A#R^%b%1Me*l@R^TcvXuKf)GMB)E!BU@s$ww&e(%B!hFdfczyW# j|9dbV5Dx$*lVgM>M8`AsU?M_TE*^~ayF!2kC1cjo~P+sC|hJd0dkFrbu-*fKFWF}21{(k=-eA0Q` zd(S=Zd+xb+X0ExV-j;5&*&O(FcG_%a+)bJME79e0Sb)|NRdHeZRTOH!XC(@1Fa8CD+~HyYGQXcMa>?_XNKNdhF#k z+Zemc_V}Nh$J+KeY%e%%ww<=jGyB-nPPH9Kv)Pscv;M%xjRr3I5w;U2^ErwMZ@W$6 zBTj9$IT?J@_iQH9WwZH2J8D4f@sAG;4%-b9E;cx9ubjxYyZMu0QwDZZM7M#nCq?n1 zR@?`E-TfODylX}fh4X(zB|?a3C1OnfCfdeM95(5W;2pTPhF}rxRHwrVIAELDFl?Hr zIR6nlNJhO!aXi|kUSQa7rcb9X=JcaKNgYxF{#6mYy97MuQ3L7`jx(+G1Ge12uzN&3 z<{@~=^`7WbuVGm6^`!(mhyLtDIidDKih98*jGvF{fwx@mFDdFxyKBk=ciJ@BK<3mS zi5}p0+4=bd$Yz^Ce|)G%{SrN&L%`PGI?Yzw{_@@PCry5N68;4H zHWMAT@Jdf!Ls=6Ji=bY%vZnf*0Kgq7_4{jEL(^Zf&6za0wn2JwFiJ;9&dA+__H-}q zL>~%3bZ!doaWt3svj`fF4g!O+Ddfp&Rwc(aug3u{3(qjoowuZ5*PF4F|=> z2vI}ggSrV-ukj{+IJ z!N~#<2y2B@`v7|7s^!#u63R+IpqzC3%sH&?$+chqcV}l_D^MW< z#=TN+0zJL_Q*}Qv+(gPRp; zTU+)wmDdBztxffbe{5_`Ff>j7_BUyWbaSna*bDuD;I;A_Zzd0y17ZTurxI|;*psCq^7| zWv?HF4&^^v2~=n+^wdiv+UG#a3;oJZZ{s-A9|*6^DZB0VTh+UMW4E#X>J=SY#dS#) z3sEtzRX$4fpfg^1Q^fHX>IxKi!93;tc1C`cR8t3JBUM|08{IEH+ir`@=6m%^@37Oo z&g*j`H_wbbRfURC$L|VOgnGwM3$Jh#YzUq_;=IsLk-)#hs$EW#xki`9xslqHXi0!v zpe<`BdLkNe&nD;imCxfaC>$4Wgn2aCM@;a0q}pqRW*US~0V>oeeU3nL>s#@Sq4k$;u_0QVL)6xS3y=X!;u$zwC6fr=2dCjC zu|Z+sEQG$Y_+t;gvo}RDF7)oz*P%Ens`w)orn9C&ZK;>bACNj`+pf+R#KNTT$M$G#!to zRK~gj$So+2zoOww&|=S0G|^nufWOd6TYR?Yl+1v~YpAS04RrXxmF(aIW%FGco9-b> zf`XFYY@wUMff^=6hjN?1#K+^Wy5V+aqK=Cau#~=w((?M44LqYU(NAN6X!k0M40?ZLe8(ez*e;h=MR@f(6& zOdtu2U;-X&Nj(EdMXKfl6}eY@3-}=|t6D0q)(QI(684!IH4$)~*%JUf{!+r9i1-KO zac>y@F|a`Thth+$C{>d*w%%o8YafBTg{{2=#u{56yv@p1^>wC4D=ni^a0`w!8w%|g zEPc;lX_7q%|K%lK5`T%eigKrh*EADPr?)Xr&mqMPm}P#i=pKseWmmN2Rx5f}C6zBh zd8~>wFg8diylD3~+=sjc6vMu(`WT$3T&*MbTNBeh+sw$FWyY)ZH8WdE0G-^nR)fT) z%(K)ui~ENxO`5pfV4H65@E@q+pxF)v7P1~?Mq6GdqWN2^zq8c~oMx>? zJD^@W72a9LXNkb)4HG_35k4F98i3D%6>0n52xgTx_X3FKwD2ywRC6y{ukK}2e}kj) z2e4iYqB4L-Nt@k%D78mf{2>&KqOwAN=gkhp37#56F7KfhYAA7(n$XRqTBk0`n1f;A zEWni(_J7r0E}y!DIaG5Hy+{ij{p%d3s&SmxgR?`KEU(H#a(^dtB*G$5BxYHrkdn&2;AxTW_gmE6$Xmf75}T2Vig$@waDxuo9JP z4?z50`8%nGWF&Z~NwgSJ(ItvO7!uXw8SEo1Jh5Ds785P6+Jn77$%%CiNsOyPq9~!6 zh6hTPh4F{@);TuIOa(EJ829d4Fb<;wYIV9W?f4M^Z+U%@AnZ@LP;wh|i76l z586Pk4W~lCm4{!{D~+ad^+WuX7Gy>rv4>aN>n^t~S_q8PTL6#!DdZ7W(!#6LAQR|; zdJPH$_2tVJL4{|dwje$kG^tNQ*O;+v3&^Bx(8 zHhY8jM6Z~k4R+kyXRUf~!3*K^v$zX{iBBFOBMO$m>rrr{EPKTYZWzFY|6{NCCH2W6 z6yk;FP$~X9EndiLh`&vR_Bm*Y!kH*k$xvmb?r|C!n~O`yYp6Hjo)(QZnd0MPj(_mD z#GjzqmG=QD$zeq=fwn&WA(RFxI#!DMG83hbe<+Qd%p+ilpBx6pb%YY?4G=b;X^vQn z-x0iL!Q;7Kmtz5&r3qp{fLkTUyU2mYAAmtNqA7C4Okz~^4j#wf zka0Pey2dQklh+=7Ag8t^n6KFbW=lX@z;YdXeh@R{1$qwi|-3>JEEVXXj%2BaPX3aEr9Ob@9WG*=*Gv^jErWV|n$8 z8VvHdU*32aBT|dBOrAIt6Y~$ljp>bFI5u_kZVT^{dT%(mp$zf8yy9SMV@Fo?t|}lL zI=LtT{hBogW76`*B7)0ZNY^!%7j@bmlYovRujSeB4>$H+leeKsZhRJ9W#Lj<-g1Mq z?74}m z7W>CIchWg@#ohRM8ZLb>A!IoorLfTzo#3B}k;RpcAiunx@R1grAT4;v-ni4#dyTZ< zsx;u&_)S*h=dRv|d#{nx!%dEY&qANU6}lo*{BHD`MZH3Yp-+J1$ZLqs^k)SGw-gbZ^uK+2^&$?%7DgUHRerX@Hpw(Sj6d=jtTOQo{5k^tHl4M6yjV2;VeHZr<^DW^|{V<_IHf@?K zmco01r$FGzBSiQS3;*eJW_+SBtIC@Z^!NSCfmCzZH% zgM13IJaw7)gQO44t8SD%l3q6|Ekfer>-6wy$A~HZ!r(=akvrm?OM(Lko3z|XD=7{1s1UBg6?N1xJ8&ug2L+@BCf)NJ9X1GsWiNo|YtB&D=TUyuXI>x}ouZAZA-o{ph2+?iE}_-ivz!(FGeJUvqS9(gv# zHsX9ocItQnW2vqk6_20gg4d(hE@56DPEU9Gs}BohTf2mLeOM^lTCm9}JKv4CSw?o? zkk=X+^B&B6v0y#!gge0ewFjF)j7>(FRC57w3Pu288h1K~o-7!U9YjHI98xWD623JI zo~4Zl`U|Dn!%#R7>a&AKnqIEQt?)`eE2T*a{n0kXe7kzjoAA<+`ThnRY7YeSNf*+`__NM!3m*zpoD!*FKn1uv{a+BNBmOki zC=jnQdVV=<6 zl|p|DyVKvOBMLjC7|W@t@<8R`Lptiznix&MbX6Xxsqz^ZlX$&JTJ9d%xXXp{Lm>Yh zkau>2JON~teuI&JLemer4V8Y)q#um`Qa|J08T?uJzkl#}@ITv(Kd~R9yon0+c&PY0 zQ!&d*#mn9M6GPt%lk{EpC(wFb9$B)k`SAmwr_kTM;>R*}BA$X;o|@NCUcbX}SzAlY zJ4@4ktLi)0xom5Tr)_H+Aq-&pTo}Obbpuf9;|o&h|9prj@`8U24(O;z;J==A=R;-b!zwzRE7}#!g8rODHK5y3RUVKD688t6hT0L*aPFg&AU1!{!T0Y1aJC0 z4S%|*0RAcMm+_y^_{(lTT=Atai4Wm&1kzc;-Owrrpnz1jA71AyIi}qA6OYqbb`0gh z0e2-Lh?=k>un6b$ zxl~H*i-+k9j-Kh+8hv(e@BnJ>gJo|&oG7^0x!UI zFXlv^P3bcD18 zOSzNE`PC~4HC9+!pZs6pTi!jskr|7gS@GF z&%Xt~eX03flEiP9;P>4EfB7?Tyz%Qyu-yI`aXjky6%L;Ade|1s7^7M-vHV^!DC|Sn z=Ao95ZwWCS9uEPUtWXFC*59jq1r5_Epq?rhRj(xcgqPrfMjwy=clh6T9Qb2cX8gsd zY!DIekqBQB5&tp~VZ>|yJNzeii$CSpX(abR0vHLT<)vZdYz^$c>k<3kAW>u%!9o-E zrup0d4u75*=XIvgA2a@5k^teKB!b;N67k~qRwCXt5h3CW1Ap=$&__zsQMLvtb(&7; z{${L2|DX2L*0b7Hsb&=o518+DrNI+*{G`di3mM#(*AP?UCyT+B1X01Z5WH@iqlxE5 z?P}$&n8MSh*v=hlWh^$+Ke(;$K8%GR-amMO6RrII*c89NeS+VI<6v~`OMnW!CxC+~ zv~kG|V#XTAm17uJg;KYVnc{&*BQm7fw_@H?y^OE z!@o%jpFTP8i#sP1DVkGOdhl?ozBA-XXjjfPc{mY>n*GDi9#38n__zNI{LlSa_-7n9 z{+f3tD#@B5)Le^(dUXvgwP>giEiFXyS_XzR1T(Z35}7kC%JIu<8h2(Qhk&gVQAYrW z?DBe~bbQd(=}6>c!xKMb-xeP%AC?w0%HK=NzLyq^@%L%`+SPks*}CSD|%I6_)5J(-D1qI=m@qhyw2XWA*gcR}D7>l;m_&unNENTrcxg6J+G>QG;iQC%9 z>Zb``cvZ|1)_vjEF@@dWgK&dqCEVay!VQx9^T7>zaXbtCc@t1VOAI%t#~5P_H<)d> z!D&i$-0&fUy)>Kl`c7H)+HF5- zKSBy_Cj~En%7r#!e?xeX8rwQ&F^|3CoMCIlx2e$QF)8;FJJVc~`eB8K`W_1uUBcml8)~ST|jFoe0@EY@E#y7FIkqR z*vzo^q=LOs9bZtQdV9etaX?q3o(rk~U!aL&U()v!LtRi*P zdxNxKBW7*AH^9d$tG@)huu@)ppmpNQ(AT{_EDtEtE6REu-luZjhMvni!p2# zhUQBPR#bmQE}xc$)--;V)mw?bqht34Qp`PIcZhs3c?*GE9_fR;8&Kgc{EZld2t6^1 zv+elISpJI!EMU2Su_UaD;MOmgOQfk*eL8%Uj2fUN%MkVB|MDo1=pzuke?R*4(`m4vEOI$lTz(un3}o)wa}>_ ziGHnIb0<=*O6BuVzO8K$Ek>w+gfi;qTOep-KF0adb(m`+zqJzwcuf~X?nVY-G`5B; z7)o)C5kq;Sjw`_$+7Rgh!zfUoxcg$D=~4oqi0|6JG~r`6%Dy8v;xSMPTEnoYO$Msi7s!x{F*ccngv} z>Mw==)k`ZrRd2-|EuYN%S!(4^=g;PkZ`aS{PZ0b$5S);TKUvHlnzW_n&o7uiP;*!l zbQEd~KCKpf%3?mb;wv$p94D)8F|+CyU08KJ?g)Lov3j=_FRZ=+OX_}^zq**??VVN719afuDpeZ@hM1e8*M5# zBJg+>fD(6>@&6cqfugXD$PDY)Sua(6^gc>K!Zf{ z(_=tduU?PVIzFQaQt41~9v=H{{H56gFR#+TJ>wEM3d(H$Kp`Q96_>qDUKKx|{j+th z(2JDyYiw7rOtz$&a{&T#1?+R6xdQos#DuF?XbJgao^qhMm^BC>hvJKM6kmn|jFtdJ za!v~VT2OqaC^d@p*12FW>s%1#rB7v~n%@9KcXPsCp@r5tVXwrTF#aBF!%4%2jZg#^ zvC*S&FF8ms5@}!rHv`ol3Nbt3_=XlQuvjLTaq3p_eG{mr|F@$OQRe=#AItI+bl5Di_Ey5+Qh2uBYxBenKr6UpA zhkz&xvAm{b?dq>YSi!n_9>LP6Vn{kw!GW-Uk*BjNTHFe5llqMqPn{H1wd0)RNK6vo zplQsc0qT1rzzbg8F)`@RxXJUZ|DO!Hk+1-R@>-c8r$`G6k?<|lZ0>vehxU)KNRRn~ zGqhdJCiFGVdZ{5>t}&n48}yj+t(ss%d+bLNb{kW_q_JLu(S~yYqr6^|2kf6y=6dUI z%~s#8{=?Mz&qiy~CvJZ_R^{F4<>B2T@2&$;%|Jd=?;s#hRe1{>Gu$~jWtE-s=Fd@r zbx*_SA*Tzd8*RQq;m-&Tf8d{#E4NVibBUM@eT6>0#UPYrhZ<%v!`7(>v3yL#Vgd+f zr{XHF6>hE{>B|DgDRqwi#N1CY^P|R^)@@ZAsF~*5=Hom%=04J3BcLUE$sbL{qq0%w zFnI?GUGZVk0(6g!V8~Ixee_<#A*`69{3QldGqJq_J1bnE2@R!%lCc5CWM1-6mhk(MLQR=AohWKl`{5*u4ZdELRGuVMI7imFWh@B<8_cvw{ ze4=j0;73a~?`#_0qRbGu)cD&krj_92CqLJNcg*1WIo#VJ>#Y3*5rFC-Fm2z(JJk}uYE#)R(^c%&GulE;go0$-YO z=(#zwKQ>`{DFAfuikEipikIlfh7e|Gh$g%-)P(H~?)bxBAyy%Lgu9X5LS9nMn<&uS z@neQN-a>h9u#-LVM)Js8`ySHr+}(NP_!~MdDprs!>Jl2DzILI}f1>Yt+|)c>qVMhc zboXH}g}UCBL0xZep(J~^oxiSkK7~4Wv&6s%I4;9`d&PWyxx3h`u-{pI_ophYf9nI> zAOa@THLum=|4xb&hUG#{<@cMN=T0?FE70&Q+_dP0%c6cpCD-?l1-;$jX4R*X)Sf)G~sgsq}Sb2qt>^kvnbNg~t{& zJiarV@mBRz4GUR?CoL78RD`!h+Y->f$Ev0kzX3GgM%s(kM-#yJn1OFrm(UWoM&jFM z5Q*^{{@9(qqlOnD+WOM=32n#3su1~OBV24%?;~IuwRaG(V>ld+ugTx6#3TG@lx)A3 z9EZPwNAS1fx3#b9d|)*|b3NsN*uCp{qZ`-rmX7&9k^4J_>mi);Q{$Z9ZT!~_raN0xE$zxf&TTO~nwS$qzKTLZLxS62 zKS%Z8W3~DQ!0CMWD}hcJ4aZ;l%z@XVQjYwa)ZY>eO{K~RM#@m1^^16UUTR+UFy17s z4Pe8jU}cK&W(dSWRE)9iKUgR1GV$OL=}h5Y&FkX2wkFLNHmC~$MISTXAc*>y zqs7ao0qJ%n_HBC%HYE0ntqR4><4&78onUC5@3#cQGE$tA7$-1$5*{myJeCe^hk4Xk zr=DYicA6O@rtQ>rM|f*rOZ&ZMY__OheVf20hV#@z@_85^jByYH3nP}~;I~_c#Afw( zCeV)(XmSv(8q37|;?y0E;v_IMDjHLqE$ZbaAO!@(!mYElQ7eIx&CILM&123->S0>@ z)HuHv=LRhDf6TA5#C!$d&f0-}YHfWj;C7k8eXPDNmQtNv2iu98(UCUyuAz=FxB+ID z`GPkG^947}7m($Q=TLON4ADIT4Fvd@Eoe)_%GC9i*}~^T;2|(uSZ2%?e%W=lkRO`I z^AApR^L)7j>z7eC`+w>$DL&@4jzQ{Vz}EbOa(G>0J|)#$jgoDSBi1zp_y>wTrP=-9 zJ4TfO5nAT^GpISMovSj^$h$ptP(z~vVh8{hAK~L-9d3Od(>x~bK8SxWl zm(${Vs5t~xcLtOXph(7uKambd@+(R4=U!DHC^7*%aK!*lCx-$j z@bt+e0iq6D207PB2@4}1@R>S~8f#OBS8#3$eHeg|F*OodNg0m^wB9KTaVG%~X*n(H zdN%nZJ(30*Tl>;JUTyDgQY8J6dbSDHsa;?h96=a%EI6%dJC>()k$sGF5s~Ze!kPlm z@*OLGkuuQv`SJKR#N%0%3MdD}|3y50D&ftk0D*T>Du80h2CNW)%;Y)5@y6o@rc(f? z`!Ma8@wjFe_hJ>?h{wfvcp3t*cI9CQqV8`Ec_+mW7oeFgr(ZA#cAyl}GtuVw>J;^@ zv*ESHu5UaV`#i2VM0q$)UBtiAUC4GUZELtt?#eJMHVU2}bQ728utPgA{JRpV+SO_V zAoW4;F#@j{DrqMqN0E;}q>=>6g6OB}^Cmz~5g^^BP4oBUcx7u}58@Sr^rU#@N)yB)3&d{X zl_YRU@k$3)rAgjhYp5Sh`=_9mmPa*41+vebK8lHkVEoOJe~6zaH)Dyh4(Ytc?_5}uJY0t-K9PB? zyDY8lDtmZE`iKe0hSvNOjid#%FF;QQn-?g>4!Y2MEK+tNql#F`gLUBeyM&77|FOW# z`iKoXCjZY*XK6!#80NH;@Fw*wT9P)}|20K>INW2jzfWsVBfuRvH-(6tWvwS(EE)t} zIEEoFPRm=X@Q9ErK19=Zo=g%iyp##X6S{4*vgP8Wa>2LAMWZb}6Duvam>%T?s}c)a z-VpZBH6}8u-1<1Vw943pd!W*WIek z4)p{}(|_;KLp;r&!O+e9QYO{t_cL`ps;73AU#v<{^-t8&ESDcIC&D!R$X)`cNCId~R1*fnl!>SFUKgMm%0B;-0R|NjsAb{75yL2`jm#jE4tfT-3|ilV1Vt$_8%w^ievq#?nDGX*V^lDqP>n- zHAd947}a8U`;J3TkxH{xp8`p=E$PI+<@9GU{n6dWQbay3yrBdu$gVg)7)jB`7g#m7 zFgbWS@i!6g>uXKqnT-{k&(t^2PN(Uw1VdXcwyvL@N)fqvfKOfEV8KcmrM%`Mx%wQi7Z$_Q>lQ8PdBS z`?21+<$d-otasOt*J;&aG7rUM9TeEDB{QkARU;nj#4B&)&4{WIpHpBBB~2RDM1=kf zKuZhzNXu@Z=P_u9!!`29*8L6FQTtF7%A!A?(b9V}b@y@fPhGmBx)@F4PwDLS5=|+m z{%lt4|JR+AWLKxAu&S3)X&bC6D`8ccbnE9?RTL@U=*;_!w}FWH{Y7|(LOSd(9ZwKC zGwVt-(`eW~MC`Z%fx(q@Qi79FbaE9=#)Q_h)$u+SJ-s$xJ)aWHn93n4!q|5vt^|Bj z`U)yx#AQk8tM5NcXysQp?=trw`yqYE0_&3JA1UH}^Zdgc?|%Tz?tTigEY%d`16`cg z5MIJsEK`t?DNw>2d}#azJTV_K&p(XG$G;hw?j|4fP*uvw$5Pz`Ed3M+>5~sF--!7C zzW_Gn{G${FG$!H+fy5&Mv|pnNMw8gD(bl)8DG25tnvW}B6hyX1pMUg)BS_i*KIkls ziT^+P*F4zbPlyGk{xScc_}?5xC(S=*p@}Zihs@1|zMjJK7eh~z<{wv@8W&MxF?pGv zm_Jbe*6Bl1|CuHb9h(dg&=-zh-D3V>Ah6Fo`PineK?}lOOg@(2id&sV`bM7LOt@wK z(56N$O&_DCJx*B0Q=60tn&pc`30eCEsAbwAI6#|k9Al&4X0?-|cx@=#k8@MP+NZY{ z^jJ3g#W5!`M*NNHV$)pUEdz=^AES5(^U-7P7p%|_>AKagaIxSujZb3of{k6xh z^%dGK8$|n22b#Y2PT;7m4;;sS$WJyVSiJ`4$To5`my(Ub$pbxpg~LQ;7w@Qb$F=vnxXm(p%K|M z)z$c&heuB(t7|%~V82xJHNK=FEyQ-{tHn?~(?3!^RNnZVu@!NQzc}=)K1MefZ(M7P zR->a%+S#Xfq~+Q?@n>|Igf@`&CB{WIsEcWRsoRlp1jfN48W4x$Dy*Ks6b3#t$BBHUZVvrS>I-8h7h_4*gMHkNdmhPZB|0 zE#~z`kg5$01Cd!h#`G8bC2FViO+oExA|H}O)rF{XUqGq&t6zbe*a0}1s z$VW)M@u1E}y1Hc&7Gl4-+pa=&EWw1E0MX-AEPY6R5I(uF5xvrzqqSanzD0800b`RE zBB7Z^5h`!x(93_`L_enf*iUF?LW_wB z1}1jGL_DG3<|h;^On9H5nVBG-r#uEHs?oyWgwBJHO+5Hm=fP~O*e5$sQ+})gfD(Sx zU6-{wV7DP1rscw(qkcFShACF`T_Tp!X0Q{z)AjP&yq0*g-kpcKOH8qh=R^uK&HbFl z{yMoc7wU-4+3$J;}n*=@todAYMOzY(>iS-Sy zzP@oH$FNX#sJt=L|BfE3UI>w=!KJg*6VDHZmL}FUytJ-i>^1JqxERwsgB`ss?9iTn zmVc;oG5bgB?B7D2E;uEx1<6PV0FDV`+_y$D@*}*J`apb*&ifazexEFAB6%sGBxKyb zYd3$eb|Wk+xwAFg*^1PT@SQaYpWlzr;A!An&==mNpFGR`og+yIBLBx@mNt#`Vq{Dy zh^wfrVR|MZG>9>e20RwRGTk%RKsma2AVVQ`r6=KHEO;GTA^w4OhC-OoXiUg5z<-m8677ce@$h>G_ zcWrK6&|N>__quDdcs_VmvKP-Pq)BrTQzAqNBG8%&g_@x~PN-fp3t#L>iDd+XWNOMb zc8mX?mZC>7ztLleAK?TkhB*H0CD{(=WDx0PshzYr2=f&k-a9`7o+T<#Pdda8g7J2* zYc(i6KW>n)=LAlT*vN++J|6MxF_KX9sy39Ytm@Xv@eV#x=i9s@!SMZifvfO>mq83%pPwgvH+kWv29k0@U!%IR&xgonBP zYll((CY5*J#~EOjT8BEclPQUgbUe7GPDx!>b_8W(QP@I4;!$h=hHU=+C2Hj+!+(I_4-j|t39D4Q7Q16q2SEhCKx^VjLa8>7 z%9JKSC!QZBJs^EF%lW>qQD-IU==|!Y-b-Jh-U|e)d+LT_F;bm@IvUT-dY!QYWfM?l z+F&o$j=pl2J|>Z??zd%X5x{-xHSP7nM$6G6H<;n=X=p*q7+$3kNzd4#iYm*2N!(pN)Y zuGxngHiF%~Y+fN+w$g0MVp9f;jr&o)R4Zp02;XDYm7!GU*<;sv@CVchq7LgL`oe-U zYn)+yl}J~q*P}*xeZoJE;dj`;KeizAqvmVv!H0yVUy7(l9YDQzFOBz!g9jRpL!ZuU zL(O%l2^_lOcqifbHkDc}Y6waDj|Tjt(lZbSsWVV|3=GF3Mo~)%0{OS@DXDHoy&S^8 z7z0ZA9XjAq2<~5XQJEFH3*ZLSL(99|KLFKGcjEpr`pc&}OOIXWJ}_T>7In6@VdbiQ zaaAX-Td*Nte>cY4NJdeax@s2)tiXB#&I`W4`TW5YsdBr{ycYEp+S4b>^XU4LFReg- z2aVQ&stlAL0aUL6_w+X{k+mehpYmpT^G)*V8{F{Te`d-zmrtr~()ojB{U z(KWmR?}0rvIAp|t(D!(cS=3QWbt88>B7v-eDgH@_dvX?~&9T{nZhRYw-==_LId1Ve zf}KfNP0A-~@WdPze8L@>NV?=ov;K}-7=Lqy(kmRohcYW4!3*VG$bSLka1=~L2sK<@ zL1%aky)<|2!Abt%_O-a1j~X7_&lfj6_O;;-e$<|_Ih7NuXZk(h^kbDbMQ_TL`8!F4 ziv1pZoZ?#gc*Rv{St#QZ7sGICkprl!m!Uea98Or`h?QeLVvQIde_0Z7JoDpVMk`;v z8Z{SX%t4zIaR%x<5hBMy@UERnpUjYI+RzFmQ{+s%Z^Vx?qGSqc(HBnhsWy&x%Wf*l zQHFnj#n_qtAvW<gqs<^u$2ihz3gE#|0}y@EUT>l*x#n0Q;eL1jTXB z@fW-{><7T0&t@tAxR*Y~g3JpVMFKe}+6=tujSUXc4jH2T1HBLd@B62`OiALSCI9{o zV%ZyUyiIIjaQJl8Y^W7~$mhC9pahR`pt<`UKu)K#6CO&l9cZ#I8I8U|W3_KN4e$0d zV8L{J#7V~INLnAnmrPgL@d*TX=qWWw9E3kKeXlA0KJZ(eZi_x_fAQ!;wSvV|;737Nd^}VCAkcCkXnc**70`*VajRtawCkrOwYjnjWbox9#(24RD!CNA@L65+= z>GmgcX>ZtKENkIQSHzB{8T?ID(q%6h6jl1}VzfPgZ}CjQH9o((T&SW&U{`<3rs*N* z*d!{$IRHcDNAcan6(N}lO7LZb)pn%!YKdX-_o)*iBx85G;$*P9E24niLV4y&b_5Am9> zE}cBXozN#+(@>0-*^SB|`mEd&Ko_3JpVzRY>TE1jsDo-+f+xji=;MT6s*zCzW5r%E zR#2_T=qwBuSO-8{7Cz*xmAb%IDW+H&18XM4G@C?6t z9c}=IgB=OjDAUc0wK0NFmScKXYQyWL^t2no?9zr4ZtE;K5qqZL9q#x=(aILA8{@G&j{TpEq__ieM zfoy?ZFvqWx#Bn07-HKx$+a&A(Uwz`wDO!xK77j{yE&kjjT4?s*C1GOyz+w-lsTsJ< z`DBw_oP>KLF1FakSVwenF2X1o-{OL90TY*U%S41JS9_}ulgzLwhvZpIZq$b}TeM!Y zl*&F4H**mUebL2iTAh7h$n>r>4qFf=pa>r+`hW}x)x5}aISv&<2u{^qS0D7mNm_7U_$LyX z!4Fqnt2FlzF$B!P1$ljPS28U{c+%5xO|N>*k)3RG&>KH_Uge^H!Q{ZSzv3f_>cgbe zsJ^7&$uEX;{N!ouNay%T-as!D-eB&bNo4=mqS{DqmPd2ATUB39>n+L z&Gt|#>;a<<*+Motok+?Q5ivd4$lb&sMS&kBRT2iU9dJ?2Iw;+R4?3Y{K;^Y$+291JEwdIrgg!MyA6555d#Ee9Ln*~X z8ey3e2svo5bXW{xV_=H7X)@RuHOx$vvIFbSsE8(yHs;6`H^4}pNe2{ z#3ynaatHG%G#-Gli~^R0h#A>>7~i|%H-sCHUcl{SLCr*Mj-@{S6^(z9u}-|i$n%(U z2>upqmY&=}5`dS!0Uu4&m_dP_vMG<5VKgsBbHt0$sky{t=!^1s8GqT(7a8jYSvirh zuITUB*&NOUY5s~^fDMcbx-f=^!CX4mUo1yeyzn?vXv&Ziv0~t)r zz6Lc4Wo>q~Wv=M_GIXxKPsT-^xw*6WYF)l0Tas~!KgjY0D9D0dA$T{*8Vo8VrYKwC z5``T+nM%I5!h%V@U_M?2Duh}>LKUY4IL%4O_bM|pehGd;qYVN5?F%iwQL=BbiZUyy z<_y#{$?>`IW;yzk-cRUC0%mf2Tj+kO&a`^$v5$q;82J=aV&jY#{ z?T62YbZBtb@{tfq#2IBt0!I9Kp`h8)Q@=!=A>c&8r_xh{ah{N3Hl*mutQei11@^PS z6Pwr%AUXl(mHuxF84g6}Dt$tjFwl+mFy4%zuE0$_`v8OVMBE<`4)HgV=98FAdJqu% zlv6PHz@c2giH~?6Bsr=(s73G$%5%IA`PpPd+umJ>t5#wwfcCw_y!N<)XiVIJ{fO_m z!pAEsz7d)cyrqlPUjcPMUuT=0Q!%iHxP4*%8tZ$XYw?0sg=kZJmMXtT6|QWVpC$Ug zto#0(q58@FHw`uSe_^Wr=UA$ooU(ts&Q<^VX3(Fld;k|q<`H~|1~y9wMfL|IF2e+E zkeLw|8@9b0Eq)?V%sl!x#yi1AZhaq$!{T$DLLU?SIZH>at9fd@f>yQP?st?=AcV-orSvbu#hj^XGehh`_6+SxEroTF7`*RaLC0R zh-v*VXB*tIUdRZZvx;=34H%(c5ln_t$M)PlC#BWUYMsH>_ zwm#uR)H4#uFtSl=@lnhtAbRdwYw-qhPG)JBSzD|_3(Y}^`Qe^I=t>S*66qfBBpWS( z(hVn_RHne|3Np^J1G8jZ+zaKVc;hq_)*g^*hT<6gQ|As2wZ&)5_4u*%7aUJOG0{;j z96}B{%10-|5$~$`z>Dk+Z%Q6R8JmDp&WyJrz6>~U(t?;UkzdZN`~vx93JvHBv68LE8-V5q~P+B9j-REP1I4`-CWB>b5!qAx*P6B#G_2pH$O!SE6Ey#sB1g~~{> z5ScQM%G#+6fb{R%u!5zwj}7p+J=n)J_@;Fa_Hi+KHM@(~V~mZCm@*)#{CA0RwvUc; ztnKebdBQ$)`$q0u^Kql2PqKa-?p=A}BB+aP)6UnP!cLt~snQ9jE0nE)Y$jRRs^C{Z zOd%|MT=h{N5~dQGx`s_n!el3wL3AhRhFP#bH#x#UQvG?TubB>sMDZn+*Q4BsbG^zt zm|-D0^hU<|(@icg-KzIUE3RvrF=3Y5=AAp3`BZN{=g@Ht*15Pf0AAo$8d7mE2<7XWkzYlvTf5TdisR=$M zNy8rHW=oJcJIP?j7_eg|s>dF$hX7-qCX9dak2FDc$DgaM@VoGDh_zhwkDh=-R*d>T zWm}tp0q{~g&P3nzibi~FWZFrwub$tr^T0}bs88%U!m3HUFqT@7P0;|Zu0e}>4NW2` zX2XjeUGb;ceudo&y}5tVURNDN~E7 zU4<=HT|>MZP^Q^mteWDC#C7~_D?fSuM#(Cq$>HlMkCsEwZw?@Y6X+lBAl9x0KJnE$zto4d zfku;W3VJgtPPURd4*g@*!H0Lc)W@o;06#%rY~)nBh>Z-=p}amea)!8`DX!yxvC`j# z|3?NLTR!bw%AMeyp-xycs2B(x>8*8>q+BneHBcW8)P)=85~S#>NK|_x}>hm@n?X5F0-uasT&(<+S?P_?b=Af9yHpf0OaOsf7Nk zpJU|j>hGQ(cx?VYY%Ncr56)zL7>y=i>R8r?k-0+N4qg6P;@YWSyTr9yzxIf0uYTke{KahkXn<_AKg<8 zj%BP9^76&T=O*OUUue}jJ8M-1bY&WT_v3djzC%zSpM2>diHYbrkgHIHSi(aOK2tMNWl`A#kuvXLI&%H@7j`A1w%Si|}s zU&-a!z;Ofa=yWWgyW|}npU34nO|kI~rq^U|?;s?s7y76751#YA@00_ zLpk10qCPLKpVqG_`o?XFL#RCdD1Hy&2j2sKGZkl3@VndaH@D&H7W{7F^07D@gWqVQ zoP7`O{EEwSah8K$woyJ1R|D|t&*d(hIq}QV%Poq2hR5uCXp$?;>Kr!fN$@WjTMgby zkN0ES-^u)y9(Qr2i6-04FaQX@FaiAk#MJ&Lw(T~p{XVwcai;dWxLmjWHZF(l8_sbp zm+QWRa`Lh9X5TTN%XQx)e1qBd{Ef?X-}NlFhwrlZzgb*I_kWLaox-F#Q!I7v<~j(^ zY5cdqqHhW%{OxG22Y+kOL%SRV!)Z@kZ2WLjS+-HeXX7=0ZnW)hl)JdCQ}l0?ABFo9 zusi4s0}112lq*I#pK1OxHa^GV@36lJE-xD~uZvP2$RoLt-l1h>-ft8>)F+7e_{3mk zEFEQj)N#>U+)+-6GTvnbXPJ#DpZYnTF{qEF^9*8J8_glkiWNIdm#4&vvl5rV5aA1; z6oilrMkD5 z#?MY&DZrIVxYB5?iU}(XCRRBkmr=&LbEh893xC@E`11nI^Sg{cvv60~Yfs}3gp(96 z*@LIkgazJ#ES)DrG|*i@ATb}(+x3$*!^edY+1F7!FX%UcrdbI=-DpKaI{ zM)y!Jpr_)lT!pQa2Q>U5*y@OI!q~dH?h*oo1-#Lbs`-Qh?_RxWmPj5g!ky3XpQhUH`sx}cI(ffq;|g@K z&unMmr2Vclh%qM=5!T)9cg5atSURn54(Fi=sekeS$X#b6!T<8RgCp3 z2L4tdvxK(6qPY4$_A0FAh9b3G=yb)hVY5d#~k@dolaKGTg(ATt|3;4`Oo2o^Q`I9Ew zLapH=y``G|h=8T18c;2K#Eusf0#NvfgWRN43+G{L9yN9Sx^+d(qk`fv1NSa%9yOB> zv#M~wL-EU-XA#~z{|+^rMapdZ2c3~JH@re;b8xnSOG%ll_#P?q96n=Z<}*^}sW_7d z^2$jHCNz;%v2tLI=AOPVT$&{kzST!;Rb+v=Ac3xDO3|=wDvbJ&U7Gbu8c1OzH;~mZ zlJoe?usB9?D&I3KZkAzjvkZ%yrCS`3q^OP%vd@9kfKZzg2o=%IQ4Y`vMrDbE^MuVW zU(!6vb;9O5anpVMqGdREK7Xhb2k-iIW58hFWfQ*|fu|(izTzd^%pO;eU)Ved4!#Dr~dnSmhiQ;OKxYAf~w=M9(<;|m} z*lZ6KcVWnexjI99^XQBi((t;@kovdjj2KeI_lP0$_>34bkJ&{GnfeYhxqf44+J;C=3W#ZmQ<0qo6=r@<|&B46}KI490rc&zHW@x;R?{U94 zgCH`{Z}Y5rszj?b#5|K=<=F5hYpQ}E~9%{T&3NO#&bcmdkzCVF|TI?e7X~7WMIRPsR z?SvO2gmIC}9*jJh$&2M<-c0rxx!jg)-xxKA!<_P|XL5LQ2L_$4j!?v>hTUO3bz*P0 zzbCaoBS9ZlF^Col8@<5K4|K?9X9JylWhMp%rt7LMzS=J68j1E^v~{9Qf;JL?MjK6X z$V0Ptp0E^NnXaiLaj(gY-h3`ud=%r$&8AlJ{xJ-<)+IW|wBMJNpb^Im(WvgB^UdZ^}s_D>$UGOB8?M^@3 zz?1dECijYONrkb%&y4rPUcftP{pNV}JJ_J{`F@~jrQ>iu({WE1{U$@}4*$|68vaR& z3w#a5o`WGG6=i0cp2!4Ee?ESFc@tSlO`ntHktgWrsxRawx})QX#Xakbl5za{;_M#3 z|3*XuKhhOHa$eoxw`Wn$_>DH3Wv*uY(1W_(O7;Bo(cq2v6Zkj}& z+oljRpA>E?QmzzxZl>)$mw z6pH|%ScEmjA~GlzVNJ0J0*XagQ!K{x;#`Q=wz?Q$O_<_G4r{_Rc5qk|CQr*@O?VDY zIIIbi=ism=Og6}2O_;Qp!0{5_oVueDuFU zo5Mvu*PW9QC{pZB^}(2|r_h2J^e!D8{5 z3&a9Bv9gj_AU9SvIu^)}mHA_V;jyypSfDUgHYOGb#LC9T0wuAs(pX@0tZZB?FeX+u zAr=@LE1MV#l*Y;?#RB7EWjV3Hgjm_#vB1Pw*_2pdQY3J9tSq;#IA3RwM#cXPpDO4% z6elS#$tz@)*Y9wtEEtSEI+z7?)*oAUhYN+as&JvWY1QNa38=ZaL>xwogH^r9h?`@@ zLBzPl;{fcE=HdzB=0tHdNnC06AY$C&DIDV_TL;IutYaMGvW{_#%R0s}E?Wo3xNIF9 zZ6ZtqMA}4e=(8Y~8W$;d8*c8q5x8cTRnMc#ji~VGd0l-N@r$mmacs zu6@!wzs936Sbyy7=Y(T{8{Z|y=gxjBTPID9f1>9*-L>(HI=JLVWS4XC>{c)J8P_4TIwj4}^n0meQgU8I^%!P45!5IyC?6UDrC>gN)u z0PNaB=kLDD;U#w3-*)@0O)}KmG5Cyh?UP?+u%YW7Q*=q*p{PbbK;tGNJ>o zycv|!gHYOYbdE^B7eI7pD>7nu)ptpet)>BweD~w}aH(|v5;=!AANv4LnOn#?pjE*$ z>+yuOwBS}Ofj0rC&d*SDFJ55UyQV$#Jp1dsc76fC`{c=lKUkRqS_IMM{vu!AL|HIfdaEc z{?uCD-b4BOJ(NG+L;1r!l$Z5TKB9;6)2-zx)^oM}MU*@=?JxR5%ok%LdEqoRl9y4j zp0~_8AL+u+H>lk)_!;S;d~y%vS9d8-y*_Yd()z$D)Xua%a00CzO}|Lb{o|NPXeaHf z*@nrbv1HIrO{Q(*JquV)Vtoev`g*{Bkw4b$x73ucR_1GV+-<(Pibm~3%DMSxsoa0C1{M{Y}Tt>vrFkN=a<)V-Mu|1}NM;-2%>FTk_1PXsToffF(1 zt3ipLuU-n&Gl-|;JgF0+MbB7&evzKB-br@@&WX(!Jp!%(AKX4Zcx-&|?p#e}z6L({ z=kOuBiVkRtDG``P{{BA3YDI7&9@ zNiTuHa=B^A;j=fD71v!&;NS=xKib z!aG{u_a)}%2H-&ga1Di`+ARJ2^VPnm<%8(%>d2pnjZ_`g@f^^bvy!n$IOpSn5)rsWg?R@bq?v=THCC^@H+bu~aAvH8vw2AjIG5BLAe^ zUN`yQw=_PR@?!=ao6lrAe%nRAecj=Ip@Dyr;sW2Fl^>ge=k(*xVW3Rpd(kK5c~j?8 zpMcZtR$nARM^}CEcSpy4|L9p?T7LK$`mzU3wOjli@G+me;z#>&QtI>izxRyaxmNrN zVa);jN@5u$Q?coCcg5AQi~!DJYuk5kY2CIZ*4VZJ+p-(lzSzDt*3`C+e%p6%Z`rQK z8e$#o%0uVitMe^wYw?&DRolKR*0OyU{(n#Tv2AVi#a9&JL4lapA8SEooig(-WyMar z4c)r%^TpQ2TH+s&8?ffnYT@|79z4QQgA*#(!mY_YhFg?b>l}v6+Is{8$+cRFcdYp} zjzuuwZoVrK(FI?m>LU(Ynk|SO#$=^wz>5NoKkvhY97`18m3}-3?0hA$A#d8r`qLJ{8z>GZ z`Y8^_4||AZ)6=atSzxSr*#x6ihY?yA8RdwL%WocqXU34gjqqizcBwvyk#JiZBf%TR zH2Wg@N1r^Pj-El`9b{6?Rs&-EJi#A=9>*R?K4K3f zAF+RlkKi5sH}h_QrS~U*qNVp`mfjbcdk?)ETWj7fMvT#!0?A^38L=3QiH&pO;ERnT zWp~BKxkW3D^`;GJx$2KtBM>+;H=2&O2ao80xuRT9MftSI2w2xpq$>pe! z$G70#V`Hk1l9ccbTwEz-@YE0_HZ<(TB{hI_(Lf?WjxsCm=XldAMlfHPpNChke~I?D zRv%?u&jL*7dT1VY*r9K7&swz)G0(JY+PlWOY3~y2roHoH#mh@Rd#~`YH)@XaP^)oX0x=GV zIAi1dgwD8Z!eU&GXxDrNo0mnXpFyZf8io#LZ0$IhTKxB7yypDaH}KjhY6_lV=5IA# zXaheF#$iv~kAJ0f4W1!NdcGR%>BTy^m^I}iGdCQDSy;qIcVQ99I5K_4J;6sBcJ?;(e6w)hKwDaLe9qH%!m^6xJJ20E3_T=a_e*t`k1D_J$6QGp^ z7_+UqgE4uix`UM{x4MH7yjS@S&W`EkIjHUsWxS9~Mzn8dl82WywbS!s9z1}K1D-=C z0s7jJ_=aM&BlA7MpWPmCM=8w*w~EUg%w(x2r4zaqUP%zRkyC)kVt5YO?NlAQfCZubXlbVm{gYeg4fh=@E{_!OUC9$1U z(+JXrr{RyNesok8wAvXR<-j2ewfXH-gT+d+MH7U67~FqNIX_){sSb zwJ>Qszr92~?|G9>Q2b*lb)uB(X}i#mPk%kiD|1+XJ%oW&)5p&GI~w|10{snW`g@ho zU#SMJ*dn$50*913{Lr6G_`)ab#_QR;*WsD|fzrZK|G)*#atf)qWN^ePQhs`jxwix%m6Hs@|9m)(bKq)LbkXf9^pz?a}om^#xF{sVYIp<4>uN}*fxDdbw@ucT~yuC zAIFL<)w_K-hC6yye2jITm&rdA(LhsqT2XHtrY|n)g+uUN6wcE8UG?t1+{9k-0^YoQ zAJnRPcQ1IJa7RYP?{KFq$)1a-CwWC>-y-fhS0E(M^tyD0}>NlnIp)Y{;nWAv?2Z~R=Gi0bI~twsQ7ac5j|}&lMR;9Hss17 zMTEH&rWegr?y$XL4@kr5`Xvp+%hr=~`814NP zzb?uIFQl43g5AP@O0(haZGy~AMHwg!t~10~QNkSsmq@c|=YpX1E#`gjA7DD3=VGO( zyv{1d-DflQj*4nj`WJ_1(+3xk4oEfh{Oq(Bt9O$gfIw*$(SvGF2z;1v0Z=1)c zLBVUJt{#ZO5Bs*2_{Y+=>2EPGM9!_<8}i6&;(fuEhzsxf!ZLV$OvXIr_TmVLyZ}dg5|Hs?Az(-YFf8d+2fnWnSYG|X4 zZM3V6HELpGOEj@72}xAcC=n>4MWvQ1)l_zYDngRoO}JiGW5G9SsE<sMTe;~i_0F~^sUF_}yL$wBS1&&fyz;dI%7damv zln?nWg zZqwVem-pxQ@P?e3qC@8FfMa^s$+&$KM{-CF&^K4&#-&Cg5b}J8fN=zXGFE=kKu1|$ z<72eT-`qLUiTubH53A#gF4}B!fu5A#{zV+UQ3BK78Qa^n*GpYzsH+wz<6S!d1;1wi zQcf^!P^6XEd=@#AKb;YAzZ;pp?3)(tu-)tzm#W4Fb6fNS`~S7_lVsgoxoe>I@+!2? zZUfsX{UWVALGeav*Z9;3Pu6vH1g~=IoA&?f=p|Vux+QM?Fthfc$fOCluzx)ix@xrD z16_QE=6})&ZhcRy=gPbGAg2<%-3AuW>aW4y+Jh9_n*XvC#56n#=}~)-a!m72M-0N7 z82(zyQaWpaf1{M~XELC1j~seqZ)Lc8uF55?jaM3x!dsnQM|tBSxK9kzzluKglZ4UWESA2cH~b|bg=O1R3vJ3<0VTPV;V*?%NPPw`?bQJ z`8^hc_LAlSGEs08t`H`x-ocAk3viDz71cXj`d0D~qZq;P_JdtquVeGJKjG{S!yM3s zi?kyLP&@ApuHZ)69M%K5+&CA%+SBWYLhQJVhuPOFKO8!E9e5XJGtX!&YOc(0r<~H? zhIr&1>bZIs$mxnYk@gc~Aa-_6z&@GPVYxbwF8IcI`IT{vWfiE4PqkSxw1<+yM!@+?dk2}8J-LZpk$JP^pxWrcb2 zz&w!^Xqs9-#1H?Ymvysjsg$i?**cWPV#TH!Db|K4tH10TaYH`_(u*YFw|1d1*Hr^r z{x7{a9GmTt!)&-+S(;Sl7R1uy5j&gp+qou6u9M@V#!1v5L|Oc6XU4<`^!K0=xH85= z?3Ad?_^7q?nx3s_*gt6p~FF}7E{q4xZ zhkzo+6Zk@0^Zb~`IgCH$uhX>LK&jM|K$lPPE%d5ANL!#*zg56czTi@C0eqSW36VbHf~=&H zcb0LFOec@X1eWH)1d@p{nb9+vlNhy>4DGdw%l++M&8WcKdZvJU62RCrI6V>*Awm4Y z&bPWEzlHZ9+4A%_Y050YN~FDycMZTEcZvwsPA#w>Ibwnpw!@F!w*+f6O0#Bxw~vgC#-rsm1lcv%Fi)39jY_s~_IQ*hHfyDX3k@e6dvk~sPR z^voy~F(%ek7b3!N&x~a_OJ%sm#xim;Gt|_Ou2!2Pav)pexs7**;H?EdLpz1fzzKcv z7i>?$-(K8*Ex04&a7p~Ntl%SyNG!F!gc2kj%oSVhK{fl2L-K#;5@XyhhXMST*ogB3-(I!>BijIs&q>K;W?kP$o!NfLEe;?vt0_L1am~AFcA8RQh zb=YBa1aV`w4uSrq`8W7bfJIKXhI2Kk*LOJYxR7M#dItb8|4+nR#LMO<`&Lf@x60ss zQLBGnsH)b)cYxn-ZqyonhF@E`RN{cEVlA*4@jxP1A>sd8kZ1z@YOqDF_+3MrJuw=z zyX*@9*BWjWaLMe%`kgZ5WvJBo6gaC*@4U+s}qgCZrn`6 z$h;VZZiJX-lkOz9a%lnhc=h|>kM$Gv%bby$2msqCNLj)TP-H#ZDm0RXEYgBy@?zu# zqyqi2R2<4cZE#S};Ez5!J#wOgXX|$JrQJ%m;}yo%*zxlQ5~b&9{z?vPIeq}`C@>u* zV)735yD#x{qbQP*W-zP0JjoJR4lFmktNZII8A{283AqMnsTG8$QhnvO=Xcf~lBM-U zkmS{Rsy@yczn!Xc3$;MVRFbL^^wDYYQXJwdmji4LbvNj6i#St2hdW{AhbIi~f}SSp z|JXP$#`rG8xXQ$O^N9XAo_tSfMAVOD$PX3Otr-9uNo~h}0KZa*guw1cUC>Wo#hlP)`Zu3J;rS>Yt-z2HxT$|El-P3JvFzdI9HJr@0GS2gJ*#kQm|; znbZUTMVSBI2BI^2uYI`MM|q)t!+iPsc<%#?bB;zwn(rPKoM4;p00OY^{u)paKcN&~ z{qD>#%BzhlJ;97Qg`2#CqnW-IXW=T(@r9W;H+uIPS0DC8lJqM*dV0Ttd4{hM;32`! zw)MSAr#_EyH1v2&ONdg!~ePSiCic zCkpetTQMF|8-Y2;1><#SRL=ntf9qgTvF@VK0^gv6;)!#9ohme-Nj3YKw-VEbAwA|@ zswUFJ`@=oxU)1>f6cp?h&7K`{yZF`Sz8r->HiB2u$_)aD+8|HmeU+!GYIiRx#P z%20*8mC2j1=yjw+I}X$!^>}~^1^mp1fBMMD!2nq-G;(I1q&zM0s4TE37J4NXS{w^4 zkA+%dp|!ElhFIv`Scv>gyt=Nd1}dl%J>X~y>||^x@G*bzk35&{7TT}$+=ewOGGds^ z)g0q4M$W#Rg{6Dtao{Zc=5(V^k(d37GU63IX#-}HP8{jL=~Z&ySD1e}ekD(wXY_LH zVM2LGwQ7tTkvHyF*k}P-4y|J9o$7 z+`9M-(vkj11?FouoN~Z%$H6HE98}QexfTSg5Pc37AF~X5cDND3b1IRRty+-mR3J^# zJp!%Yx4Pik>$(4eVx>W>hxDyLOYb&E?H0X;&ox$H&d&*FM%NQaQj;KTZd-?zFNx6t z;MOtbukrYnngeZouLYdSIDCT#6uz2&9vX+l36Nd#nizfy@I4W~TOl zeEMS|rMJyWK^te~#<%fLsFrQ~VkRhrx-e%|LKaqG)*9zqJ)srtn-qkV6!vg(JuPZ5jH$q05^8& zOA6X5^p^x?=uK?p%zO~7HBIrSSQg($qX0DexA-<)z?g^P`LV#9R%>BRevBVK-$1)y zH(2~wKcVmwuEHa*mX31oJer}`0?BOYi5nr@+;!{YmjR78qZDWuRo%{_I*T@W{v2j zbSaQLR%ea7Qy8=F%{}5q8QK!8r|-mn_rk+2n!tY>)*vQ<|CTZ)f&X0QK8Rewn*5g+ zCn4_MD+xCLmAZ<+Z{)w>!hfUSRMsx?u)sV`+SErLUXIErE7r^)|G}ZQHJ-TV5*5nB z0`Omk&42Am#8V#fi0g1Y86g^$iX@bUkXuhaiagx88sPp%{yPjoEiI4dzXqs|i0tLR zvJd<6p9@GHtFt<$e>eWiBfd*X5L*KNh%pKLm&Ta?f&X&t_Qdnw>z0xklYjMSPe1-! z*m~?HrJzaQLH@n92iPX?-zWf0W%{(DNz$D=I%>o5Oa z-FYi@^1!YbQ5#LRIOo5>8$B+9z@57I6JNoit6@6=uF?m&ZzZ*X`tpqs|`0-xG zB=F-*#>DZXTJO@Qu?q91ydxx2WR+`NfVJ1l@eddISbr$?UTBIq{xcKjU#O`@PI{A zYvvrmeWfFvdZsL&00-g8srnk||D(EnCAmq#%kp$s#<4^&4@Xdt`}Y}|zZHeySy@=_ z)B+h;l^CNl3&&dV;4t!_tm)bXhQ*WA9xN>H#pBGh?PkNI;(V28+{_gM znGUi;hwb})>`;?yw7@8p(w|CsByEg4q2j;#rohPL+sYlp3@we|w5r3b_y+C6m%b*} zL^;_9L&r%3Uy`m4-Z~x=2rj*DfwW8(PwO95k+pZF^A%RMT(4_F`qI2vH{9AhF>u4J z+Q?PxGQG}^MOUcKUZX{v0M54OfM&?>Ep2cDppG`|S%J!csgaJiP!jA3^Re&-19o^n zX1mdvN{bC67u+GMyVzRkIlzc+)kBf5u*BkhsV<|D3=ne9x?$33iuTawwH#D=GTynB5-yGdS+ZnC5%3;plw}L5+Hh) zqxH%IIL_FYtGr;m#~Ecai%BRfkHkwjE{`mYWK9YcU<7c+=yF?CM_#QK|7!8PDGW`g zg9jC>EzwhrO87uO?&$VShHWU#g%z;5=1`KOaL24`49RZX%MRi$!BtLO#U%M&nvb|7 z{Xr(7gCNHqM+gUNmO}xt8Q)yKJQ0grU}4m=48;~Emq8Y*_is$(A`slBrw8^QDTb;B zN6!{#CHN<$LLJ&`l+7qUJ)N>B1p~KO92)$8MHR)g`FM`!n;Ko$SA!7P^Wxqp9iMtM-e(Vja6B0%U}yX>+b52Gd&fj+GxK z@BhMjmOS!fB(i=*U*2&&9P^2Ij4R)(03C0PC)iVHUWPG%eT9d`Ai)P2*E$28-rbgW z7~Nt#zX?9rJp@MR&w}@Mqab{NcBTgX1H0LB{15Jd4RfV;FB6Vq!eESW)UOgP!H!v| zaFusA?g*(}<#57azLLfy-#3H3FRQvj^)&#+3X8>X{v-R6!g%^xHwPjk35)xlcSO26 z?nuR2#(W8bl~yBVIIWrC#6Au;ldP7|i01jJA$Jg}sxlDMR=*Qj(19QG2mjO%h;fxV z5GM#}{wI)L%u=4`iwVxVBOdm81yzi7*7b@<$Gl&ic`#J22xtjLgemEvS^ZuAB6 zH_lsNt(8rrpw@t!9p;iFEJ~AJZ2WOEOwn^&_5YQgBR)AgJud*dYywb-%>~ci@;}n^ z6Yze2dXmp=dj10j*#8?nA9?NnLwe4|WhFL$9s%`*Kgp1B{7El`{`~pnzm87NUH|M) z&oRG`r)U0W{W&!H12ul79>tX+!LZX58xb|AQTXuEDe#4Tk3nQ7<1(x6l&71`OR*(d z*yRl!gJW;tIJbtB&9T1(%8`nAjy>uqioS3&?z`&8uYWrlzk0y0I6GzL-X`?Lz83dO zWj6-T+j6JvO;D9;Z5HP1Utzv1-0vA~l)k|zs&H9ok9qG$LgNo@bpe`#dC%fRjp5Mm zK$X6lPOfp+4E?}aC7!~zSyPhW%{J>iqokT*DnmLJf{SZyKYzl`5I(7qll$oJ_5lQAYJ@ENry1?@;?T=c-L^s?l_FKDKC;kK7 z`i}IDwecYLWA&9cm&Esu`>!)WKyN0V4_CC}WbN)`@ z8yvIU2C)5_n;XUfttXyFfpB?h_=!ab^veT>P)uD|(g1)XTBgRA?QHQCBDMN^kz#uQ z;O+^8#RH)3HDJb$b~XVc@Z9%b#oj(Y8X<^_pa_XDrt*$A&*2}!J#EihT3xNc%g2{i zcd5WT58-KxEpLDT&wLw$VCm5ssEW=ht4hG}FZ8z(*N+CLlvZ2g)D-Qlaab;G2wc9- zDH|0JK`wt0lFoUC83W=JhUo_+?WxR_iKxB?Df$&NM2+hl1jW|_HJ*`5XR0_FA!RMd z`6yT``|&tX@CTWnItTHXDOd_Vr{vXc^G@_-=WZ%eq0APK}Q*3HZ%zw84gkjetBNw~oE*9ZOUha&{ zA?~WZ^heYD_ame7NyBMb7Vl8+S3 z!wEiG8{&K>{)*jNabmWh|6ZVvO@J=?kYe3SC3#Fj^2cz?P-D3VnETdL*#mh!CR0qX zt2947Zj9$CJuI4IlCk(w*pCyIsK%PVjhPfrQYX{=|765bS;yI=_+aWw))0;ST2LuY z+5|e_&IM0yG55kfrxy?4&yR|o{P{s~3V+gz2jU0LJft1zua{M7uZ^CN-{OZEMgyd{ zPI3@%9J{F7)48{8-C~YV#0xzqf3p~72rsZ%U0DwNu|nWT=0DAUGTFFnCQW3PISXPw z%e*d%H+2!P7Cd^owfgP$jlkMF)UcuvrGvNRDWHJC4R9&>lMg^4lr%=9bLRYN4sgY% zUQelNj1XJUn~2own^Y%>Og4}nd1puN`B>T;20>7dQlYfqw+V5aC9 zn``)LfVWH*&^TnC&@Y=29@uqlwdSt{nks{}qOE2`KL=t+*P9?kK@WBKql1*KA1yek z!yh*y2L6-vZzOPd{$=3JL-=kFaNf7?H=RkPQQGE$-$#2mGifkXsBFf*lAziHTV{047QR7kChHr=P zmH2uG(vTlLHPdwtO;6`2(^D?y*CNiY9k4y+c0vWg?>T1WKEVD4uq_`tzfairGGSSD z;N%UYMqkFHAd?C%poe1e4ajS`J2yPe^!sWLo(87%{MJ6m(|}mTE_~Ejt7{-qG*8)x(lb|!1bOlPmY&D6A}tl_5pkm^T<1u!zFiWLhjT0nnikoz{3 zJI1iZ=#R^({c#!kt+==amr}u{LatAUr>9UWGl3-60vTjE3QLolaVC+c z(a#a~h8*Ly6Gf&M*O*04Qw6OT*|fS+(pI?TB8JALB~r-NJLW!58L`Fg#MJQpPe;L}Rbe-gf zmCEi}47@btF-AbO)&cF5^6Q!D&u-&nmNHxmz;oUsBiu@8hMtRGV$k--D zrx&2}dH2e2^T2hYH?(^CdaupiED0gc@8O3s-Js{%lor`}6|X4S$g$T2H$5%1F+0bK zq^1{90j9{|*mi2oZ-*PXtIPRTIO`r|5#5W~u2eq&vgljQW}MB4TK8*^U`ZqxmKx~* z8GSxRLc|<-3NeqUk*56l=xaR%815bv`G1~LH+`CI%bCgeJfTvyy2({F_{SSq+B)!RX0A0 z%#SfwL{}>NfZZN9vF~&Lq4*D?Xa(^%Z<}EC1o3q%)lN2o{{w{xs$HAsN+gt;pRORj zef$SM{ENc(*JFrpqW@s7zLl8U_~n|V#P6L%{F(p&x85y20~40xJNo-9zt+My-hZTA zVcY9JGUkoG`}M1FNQ8_?351C~!P)HLYlMaVtN&8>Lg1UQU%#C(i{d$E17qU$>q&2y zInc(MbdLA;3BGO7c{~yd%qNyBzUaL^2K?|RfFxghQAIk_rzecv8ZZSsc+mG5V2T37 z6d}x8(A+lBv&^@#ERU`xdNxa(P4r&nz_jR1{4&g&$H(zOb{rpk_LhYohbqRyGQ|f8 z_=TGkepd;88Nd%1(PR*FA}uE#+eCkgN2Un{qig#1{{*GfLSj^+vnHa`MnP(bXXW(s z?Gr%HfMa%?6ZD{t0v8&dWBv;>3dRfiwx5F}^n2*^njfoR=%`Ea*RoLgw=3P+o|{K(k}Y#LK55I`snCvr zk6JHynze=yvRc-kdP8b-awQ>Re8)L#!;ag;oU!A!^xlT$na6ReJe|5W@loe^reA97 zpVah;fU`*n{ZT}KACWJiO~D>>5f0ztjC)`V@qvs4y+Fqf?5^Q`o8loO_mt9jgbHxSyh7N<|m?QGeGO*jmyv@;< z3&cnGhH&2*vm;@~%rGwnYhcFAh-^R!*w4S+|MD<|B?N1$CtiLv;7}j`$gv|LHS0 zlOq(f?-cq!BaJ6iv&?k6ttH4hF;1#H1SNy*)%2EgHL6@H8Gn`Qn2GlukHUwQsUyCk%UYExj|yW}YH@^6o+R-KAg`9z*mf&;;r zNAP|qT1SzW)hO6sUVb~j&4p0z$8SGSSoZSU``9B)8JVwG^ zWN%XC;eHpbXE1H=_!P(_%$MIhf|&mE@a3HZI`)*M#RFdcZPuj zVGr@6&w;Ql@53@_@U!o8jI}ip(3Rn-}F$4mdjYDKEN<1M}~ zG%Shc#N~LF_4+jJzUv`;eR6ARtLPs@-u&n)AziBn_pxHaaCl@ZPDBA1x z9B9||i&`v)rFCc6f-Zj_X*d5N#T01(1)TM69>>A_q`g)>A^K_lK09smK~j`B#my##Vf-+6P~M$E*>xU$cFlKh%CL zZMz&TuxTm6`H}}!%ffpAABnQkS$qlHfiPG2cpWNA62cj^UrQrbppnt{Eq$b798Sk# z%L~(fHZLcMzJVr1o6&~oKRDl1PQf&ii+gl(aRD9nTUQSc@42=$W}lAXf8zfcfBk_( z{Gl4An_pF+5B`6^U(I)9u&W{EIdfR|eOfG5%Pu%iv6$x$a0}UMyiI@bG6dV&`HGi$ zLJ||4@Uq2M=UaUB7D)cB{&ya{$G(j8t{xZt2YcWh%ie{4Xe0AHp}xsKss{CKk8c-v zI~!Jnf?{^{-Q!Fjq^(SZyrA|>8)0()Nklg$JB)Jd{g1IT=c7H$JD>@%-Sgrz-iVC2 z?~c4UTef6wfQmL}pb|L6q>J~S=)aGN&)!kT!beZ2=Ib)l+-7G^z-MAY#?8o>fY0B7 zPuGvWD?T^bRrI6J!9T}0`&Q!f3p;ZHKARFUj_8ZehrlQNo$=WML3s53`h7w*og;zI zvv%eLeB22cUq!|Q`W#Q?zHfi2_fJH`QVN)(1hVE|4Zg?ipkRY#H^4mTDW8Q`ERtWr zXC6O?&z@d;B!#J?`FSSToM|KYK@pqZ8RIw#-)HYvLmcPD!GM{-Oz(hH&w=D~!K(~X zm<#r0_p*4`tP4>SKWq8<7RDYwrsBicQV2uy5I8 zOnOK>qT#>N8J(|2in3=xUgbcp@ZR=x^Ea3WNOKAr&lME;G_>C_R7}kKRwsFWqV52U z9~7O9!X3CK6!&OfQ3@$_?Zi-tJwdAIUm}`!>*J>Eg!(>*Q2t-*yEVSP?Io;lQs4SQ zh(20?>4D#a^L#K_SUDyJEVzuf~u^|GX>MkCP>Lrc%Hh0^NySg z<>ye+wDW`W4qL&W;reCfIL#I{o`_0(BFP@qbJiCG=~l|%J-_L(T_y!HN^Nr&dASMN-2&p zdt?y^oQLeWG@D?3JKP)&$q!n#d5+I-X(*!;OqO2YGOxNAEk-`7XIKjt7|2U&w7R+j ze&e6TyN3qLGT9(XgNoNlsx-Xwaa{Crddkg8n>7*|yfNW`)7pv^-?FN>eOXVrZZ`P* zq*se)J;0=*ATX7~@IT!Q7r|L+vzHl`f>*{G#Njv&g}g`^n%h;<>m&UFnc|*JSY`ah zeiae^fbd^P#RHh;A78UfO{f%cWQ0&k7E%~8pI?{ccq$uTKDf5_@*m1CWGs2A8d*Xq z{6Yb%EJG~OXp!Ao&t%(`=Au$#2y20-|A-~5D*8R1(LaT8)AAJXbqyI0qlf=(mEsA8 z(JV+~EADUe$=%HAJgU{00yf49S1@Za;RT)CJavGa&KTBP+v!4x-o7g6e1oY;J;98D zI(8C3bPia?nNK5E$oT~EL+uu1U4ZK6v&rUZtfk5YuQmN-3n3eUK};IPi?*6mn#ik~ z{}ObKF^o8&iquyi!dcZ${yJTq_(|gZoN2;8Ya#R5(~%4m>i<3hj}FA>xot7vcY0DU zRP;L@P_x;)zSVeS;m2^pk#_r{N%@;W)9B8<_Ql55cxO5?(SUn!7ovn{9A~woDnvGPip@Mc8BAzbwA}YVQpP&z` zu&`J8t@l14H%YI?q8msrH-MXWyo8qT^PKSJ$#>m!>yk8d)ZS-t{tG?EoSSZ7|GCl; zZBBlXql%g@ugeY9aKASF1W;aGZQ*ue#hHo~D!g3Nz}G#)oM>3Eq$*TWgh)row}C(S z7xGbp@n6WdRt0cH(Qt-9hmfxsfcY;};wET3uS;eMl~nQvkck+&w8#8DdM#KoBR*;X zqvSc<_}I_>!Hn)uNv?vMqkdeaFA#2C(lGuM49pN7SKNDtuoUx|zqu2PG}?`kG{{0J zSW;@Ud1_q7Uoc}yDI^~<3ev$6Zg&a9p>Y|9AfxZDO6T;k2C*8&_Tn6oUIH&fl9esY zKz<0Gp7e!obfxZFjd(-;;+fr380Y=OC)YA1PsePSE|0<5Y-tfI+GNQO2x@VIJB3I9 z_{JBcd3pFWo6xU)%P(~{@nT}r17#4pQPa{C^*ssS(LdiT?{(Jh9)%78cbrcsyVi(2 zz;=yXr;&;lNi+D1t}r(v-FLvL)wd3mLL*t|pS^_!*9?b4+J8_kzhw!X>4NaSUEx3t zd!K)E6J!9;PQA-QpV155D$*@A@G%5ylLs~|a|+z9_11-RkOhO|+(vXln%?aTRh-#@ zpp#jX_}o(JEI=fB7otE?t5M#J&f9E}RckmO=$LK~kfD)mlu@lIq%18N9vi&e$>tODsI zCVrg_ad~>!NT+KaqW(LT+pP$!9qI3?S7!bXL#32XdnA3a% z1xX(5wG;52U32JcebbyO*H3Zn5PGyISM%RAz=3CzHUG8vg{F|rgR_f}2JIpHEDts) zaWFCH+#JkU!|pfkbn?d5mylV15Ar;x_dG!b<{RU3CvW$@kFf3*TU!ATC~WiYByvy- zQel4sB2KeNTI5|@Gt>3cvo-(uC{YM-ORzzP$H6+Gw`2wjq{_X|Xu$^bvL4Rgd={>u z4wlgOFDvM52|6W%zLEBiRY`hVa7KmCtSH3;yjO|p!0tVpa2NT*v5|8Y5XT8!489YMVwP_fAn2@Grc8BV&UwHXBJkS1 zhE?uOe(T#Uf@$^Dkn#%|=M$ue`f;8F)G5IP^{tCoA(0MThEm{H&P|wv@E6phiCd`m zTpacGO%>|-7qXS`BOpnHUEy4UPjl$XBuCAK)O)f#f4C6ao$4;J$*^3^R2&va#- zxx+ZW<#rH#pQrqdO$bDf^Q}oYyxoZSg$@;XMGLqtJim_&0eGqY-SG4dp6uDJ&7}^nXCeqm4PijP{iu4G7hdp#T$S zq{(3_R1ph}vOAX39Bhq);EZOyO?uMTQnB|LW888aj@)JOqwsiS2AZW--HI(g zNMy@c-yV4uOBXtz0n;o}Um;$ky>_uQKs<2a+rk^grIUw~Nh}e4{2i*34`Lq@!@eN0 z69J3g^iUkL{SFl@B$txSzBmRdQ;AA3az2%fc1M1GP=LzzS0ovmXChcY^z|_9>TQwB zRTMcZCR#~A_Dc)0@JxjN>O<0_=b=jTDMUiak{-PXBZVE=PrTDo-loL65Yp!D@;KhU z6wL++u0hmaI1!ka#6iC8SdjAsvdkC>kZ+BH-2F#~<1fq-`72ry8=??V-|@Y&F(kQC1E`j9SHpx^SSogN%}@@ zMJxKE=l$U2xZu@m)_k4o`K7ocRqum!*r16O$K6=H#N6LL)AufQON zNl)-MNnSm2ct5zh3Y%!q#gUfkLjmGq30u**a-Rkp{RJ5@z#{=L2{Tlw_L;9QCl6?T zIx#$z4WST;z)eU8QN2jP6#>C-;i_AZMYxI=%4#cwOCk)D_l+U(Em>^Q^Bq=p5yql5 zOKA1^_+Wmbza$a;*j(}Zr_hAdxQy%#HiN(9@14smOrBSm2+J^RL3Vy=)z5zSr&`04 z5cc;bcqb}m04W@i10(}ZN!