diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3d8721b..f25f8f7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,4 +19,6 @@ add_subdirectory(external/raylib-cpp-4.5.1)
add_executable(browser src/main.cpp src/fetch.cpp)
+target_include_directories(browser PRIVATE external/raygui-4.0/src)
+
target_link_libraries(browser libcurl raylib raylib_cpp)
\ No newline at end of file
diff --git a/data/Apache License.txt b/data/Apache License.txt
new file mode 100644
index 0000000..989e2c5
--- /dev/null
+++ b/data/Apache License.txt
@@ -0,0 +1,201 @@
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/data/OpenSans-Regular.ttf b/data/OpenSans-Regular.ttf
new file mode 100644
index 0000000..db43334
Binary files /dev/null and b/data/OpenSans-Regular.ttf differ
diff --git a/external/raygui-4.0/.gitattributes b/external/raygui-4.0/.gitattributes
new file mode 100644
index 0000000..15a5c58
--- /dev/null
+++ b/external/raygui-4.0/.gitattributes
@@ -0,0 +1 @@
+*.h linguist-language=C
diff --git a/external/raygui-4.0/.github/FUNDING.yml b/external/raygui-4.0/.github/FUNDING.yml
new file mode 100644
index 0000000..d7775fe
--- /dev/null
+++ b/external/raygui-4.0/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: raysan5
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/external/raygui-4.0/.gitignore b/external/raygui-4.0/.gitignore
new file mode 100644
index 0000000..18c01c5
--- /dev/null
+++ b/external/raygui-4.0/.gitignore
@@ -0,0 +1,64 @@
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+
+# VSCode files
+.vscode/
+
+
+# Ignore files build by Visual Studio
+[Dd]ebug
+[Rr]elease
+*.vs
+*.obj
+*.pdb
+*.aps
+*.user
+# *.vcproj
+# *.vcxproj*
+# *.sln
+*.vspscc
+*_i.c
+*.i
+*.icf
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+
+build
\ No newline at end of file
diff --git a/external/raygui-4.0/HISTORY.md b/external/raygui-4.0/HISTORY.md
new file mode 100644
index 0000000..7d0f717
--- /dev/null
+++ b/external/raygui-4.0/HISTORY.md
@@ -0,0 +1,17 @@
+## raygui history
+
+raygui development started on December 2014 by two internship students (Kevin and Daniel) guided by me, objective was creating a simple and easy-to-use immediate-mode-gui module for raylib, intended for tools development. On June 2015, library was mostly functional (including basic controls) and we started working in the styling posibilities for the library, focusing on an easy way to style controls properties. Consequently, development of [rGuiStyler](https://raylibtech.itch.io/rguistyler) also started at that point... but resources were quite limited and project was stopped for several months, most of the time was invested in [raylib](https://github.com/raysan5/raylib) development.
+
+On June 2016, project was picked up again and raygui 1.0 was released by the end of that month. During August 2016, raygui was used to develop [rFXGen](https://github.com/raysan5/rfxgen) and also an early protoype of [rGuiLayout](https://raylibtech.itch.io/rguilayout), those tools were a testbed for the library. By the end of 2016, raygui project development was stopped again for several months.
+
+On June 2017, a complete redesign of the library started, almost from scratch, all functions were reviewed and mostly rewritten and a brand new styling system was developed. The objective was using raygui professionally in several tools. It was the beginning of raygui 2.0.
+
+On January 2018, two students (Adria and Jordi) started working on raygui and related tools; library evolved considerably in the following months. [rGuiStyler](https://raylibtech.itch.io/rguistyler) was completely redesigned and rewritten from scratch (rGuiStyler v2.0). [rGuiLayout](https://raylibtech.itch.io/rguilayout) turned from a protoype into a professional software and raygui reached version 2.0 with plenty of new controls and features.
+
+On July 2018, I started working full time on raygui and its tools, improving the library considerably. On October 2018 [Sergio](https://github.com/anidealgift) joined the project and focused efforts on [rGuiLayout](https://raylibtech.itch.io/rguilayout) tool redesign. We reached 2019 with continuous improvement and redesigns of mostly all raygui functions along rGuiLayout 2.0 and rGuiStyler 3.0.
+
+On March 2019, the first set of new raygui tools was published: [rFXGen 2.0](https://raylibtech.itch.io/rfxgen), [rTexViewer 1.0](https://raylibtech.itch.io/rtexviewer) and [rIconPacker 1.0](https://raylibtech.itch.io/riconpacker).
+
+From March 2019 to June 2019 raygui development decelerated, Sergio left the project and efforts were focused on raylib 2.5, during this time one external contributor, [Vlad Adrian](https://github.com/Demizdor), completely redesigned `GuiTextBox()` and related controls and version was bumped to raygui 2.5.
+
+During summer 2019 lots of raygui functions were reviewed, breaking compatibility to any previous version and pointing to a **raygui 2.6** update.
diff --git a/external/raygui-4.0/LICENSE b/external/raygui-4.0/LICENSE
new file mode 100644
index 0000000..273f7a6
--- /dev/null
+++ b/external/raygui-4.0/LICENSE
@@ -0,0 +1,18 @@
+zlib License
+
+Copyright (c) 2014-2023 Ramon Santamaria (@raysan5)
+
+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.
diff --git a/external/raygui-4.0/README.md b/external/raygui-4.0/README.md
new file mode 100644
index 0000000..d786fc5
--- /dev/null
+++ b/external/raygui-4.0/README.md
@@ -0,0 +1,122 @@
+
+
+**raygui is a simple and easy-to-use immediate-mode-gui library.**
+
+`raygui` was originally inspired by [Unity IMGUI](https://docs.unity3d.com/Manual/GUIScriptingGuide.html) (immediate mode GUI API).
+
+`raygui` was designed as an auxiliar module for [raylib](https://github.com/raysan5/raylib) to create simple GUI interfaces using raylib graphic style (simple colors, plain rectangular shapes, wide borders...) but it can be adapted to other engines/frameworks.
+
+`raygui` is intended for **tools development**; it has already been used to develop [multiple published tools](https://raylibtech.itch.io).
+
+
+
+**WARNING: Latest `raygui` from master branch is always aligned with latest `raylib` from master branch. Make sure to use the appropiate versions.**
+
+**WARNING: Master branch now contains raygui 4.0-dev, it is an API-BREAKING redesign from previous versions (3.x), now all functions are more consistent and coherent, you can read the details about this breaking change in issue [283](https://github.com/raysan5/raygui/issues/283)**
+
+*NOTE: raygui is a single-file header-only library (despite its internal dependency on raylib), so, functions definition AND implementation reside in the same file `raygui.h`, when including `raygui.h` in a module, `RAYGUI_IMPLEMENTATION` must be previously defined to include the implementation part of `raygui.h` BUT only in one compilation unit, other modules could also include `raygui.h` but `RAYGUI_IMPLEMENTATION` must not be defined again.*
+
+## features
+
+ - **Immediate-mode gui, no retained data**
+ - **+25** controls provided (basic and advanced)
+ - Powerful **styling system** for colors, font and metrics
+ - Standalone usage mode supported (for other graphic libs)
+ - **Icons support**, embedding a complete 1-bit icons pack
+ - Multiple **tools** provided for raygui development
+
+## raygui controls
+
+### basic controls
+```
+Label | Button | LabelButton | Toggle | ToggleGroup | ToggleSlider
+CheckBox | ComboBox | DropdownBox | TextBox | ValueBox | Spinner
+Slider | SliderBar | ProgressBar | StatusBar | DummyRec | Grid
+```
+### container/separator controls
+```
+WindowBox | GroupBox | Line | Panel | ScrollPanel | TabBar
+```
+### advanced controls
+```
+ListView | ColorPicker | MessageBox | TextInputBox
+```
+
+
+## raygui styles
+
+`raygui` comes with a [default](styles/default) style automatically loaded at runtime:
+
+![raygui default style](styles/default/style_default.png)
+
+Some additional styles are also provided for convenience, just check [styles directory](styles) for details:
+
+![raygui additional styles](images/raygui_style_table_multi.png)
+
+Custom styles can also be created very easily using [rGuiStyler](https://raylibtech.itch.io/rguistyler) tool.
+
+Styles can be loaded at runtime using raygui `GuiLoadStyle()` function. Simple and easy-to-use.
+
+## raygui icons
+
+`raygui` supports custom icons, by default, a predefined set of icons is provided inside `raygui` as an array of binary data; it contains **256 possible icons** defined as **16x16 pixels** each; each pixel is codified using **1-bit**. The total size of the array is `2048 bytes`.
+
+
+
+To use any of those icons just prefix the *#iconId#* number to **any text** written within `raygui` controls:
+```c
+if (GuiButton(rec, "#05#Open Image")) { /* ACTION */ }
+```
+It's also possible to use the provided `GuiIconText()` function to prefix it automatically, using a clearer identifier (defined in `raygui.h`).
+```c
+if (GuiButton(rec, GuiIconText(RICON_FILE_OPEN, "Open Image"))) { /* ACTION */ }
+```
+Provided set of icons can be reviewed and customized using [rGuiIcons](https://raylibtech.itch.io/rguiicons) tool.
+
+## raygui support tools
+
+ - [**rGuiStyler**](https://raylibtech.itch.io/rguistyler) - A simple and easy-to-use raygui styles editor.
+
+ ![rGuiStyler v3.1](images/rguistyler_v300.png)
+
+ - [**rGuiIcons**](https://raylibtech.itch.io/rguiicons) - A simple and easy-to-use raygui icons editor.
+
+ ![rGuiIcons v1.0](images/rguiicons_v100.png)
+
+ - [**rGuiLayout**](https://raylibtech.itch.io/rguilayout) - A simple and easy-to-use raygui layouts editor.
+
+ ![rGuiLayout v2.2](images/rguilayout_v220.png)
+
+## building
+
+`raygui` is intended to be used as a portable single-file header-only library, to be directly integrated into any C/C++ codebase but some users could require a shared/dynamic version of the library, for example, to create bindings:
+
+ - **Windows (MinGW, GCC)**
+```
+copy src/raygui.h src/raygui.c
+gcc -o src/raygui.dll src/raygui.c -shared -DRAYGUI_IMPLEMENTATION -DBUILD_LIBTYPE_SHARED -static-libgcc -lopengl32 -lgdi32 -lwinmm -Wl,--out-implib,src/librayguidll.a
+```
+
+ - **Windows (MSVC)**
+```
+copy src\raylib.h src\raylib.c
+cl /O2 /I../raylib/src/ /D_USRDLL /D_WINDLL /DRAYGUI_IMPLEMENTATION /DBUILD_LIBTYPE_SHARED src/raygui.c /LD /Feraygui.dll /link /LIBPATH ../raylib/build/raylib/Release/raylib.lib /subsystem:windows /machine:x64
+```
+
+ - **Linux (GCC)**
+```
+mv src/raygui.h src/raygui.c
+gcc -o raygui.so src/raygui.c -shared -fpic -DRAYGUI_IMPLEMENTATION -lraylib -lGL -lm -lpthread -ldl -lrt -lX11
+```
+
+- **Mac (clang, homebrew installed raylib)**
+```
+cp src/raygui.h src/raygui.c
+brew install raylib
+gcc -o raygui.dynlib src/raygui.c -shared -fpic -DRAYGUI_IMPLEMENTATION -framework OpenGL -lm -lpthread -ldl $(pkg-config --libs --cflags raylib)
+```
+
+
+## license
+
+raygui is licensed under an unmodified zlib/libpng license, which is an OSI-certified, BSD-like license that allows static linking with closed source software. Check [LICENSE](LICENSE) for further details.
diff --git a/external/raygui-4.0/examples/Makefile b/external/raygui-4.0/examples/Makefile
new file mode 100644
index 0000000..cacf46f
--- /dev/null
+++ b/external/raygui-4.0/examples/Makefile
@@ -0,0 +1,392 @@
+#**************************************************************************************************
+#
+# raylib makefile for Desktop platform and HTML5
+#
+# Copyright (c) 2019 Ramon Santamaria (@raysan5)
+#
+# 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.
+#
+#**************************************************************************************************
+
+.PHONY: all clean
+
+# Define required raylib variables
+RAYLIB_PATH ?= ../../raylib
+RAYGUI_PATH ?= ../src
+
+# Define default options
+
+# One of PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
+PLATFORM ?= PLATFORM_DESKTOP
+
+# Locations of your newly installed library and associated headers. See ../src/Makefile
+# On Linux, if you have installed raylib but cannot compile the examples, check that
+# the *_INSTALL_PATH values here are the same as those in src/Makefile or point to known locations.
+# To enable system-wide compile-time and runtime linking to libraylib.so, run ../src/$ sudo make install RAYLIB_LIBTYPE_SHARED.
+# To enable compile-time linking to a special version of libraylib.so, change these variables here.
+# To enable runtime linking to a special version of libraylib.so, see EXAMPLE_RUNTIME_PATH below.
+# If there is a libraylib in both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, at runtime,
+# the library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over the one at RAYLIB_INSTALL_PATH.
+# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths.
+DESTDIR ?= /usr/local
+RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib
+# RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files.
+RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include
+
+# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
+RAYLIB_LIBTYPE ?= STATIC
+
+# Build mode for project: DEBUG or RELEASE
+BUILD_MODE ?= RELEASE
+
+# Use external GLFW library instead of rglfw module
+# TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3
+USE_EXTERNAL_GLFW ?= FALSE
+
+# Use Wayland display server protocol on Linux desktop
+# by default it uses X11 windowing system
+USE_WAYLAND_DISPLAY ?= FALSE
+
+# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
+ # ifeq ($(UNAME),Msys) -> Windows
+ ifeq ($(OS),Windows_NT)
+ PLATFORM_OS=WINDOWS
+ else
+ UNAMEOS=$(shell uname)
+ ifeq ($(UNAMEOS),Linux)
+ PLATFORM_OS=LINUX
+ endif
+ ifeq ($(UNAMEOS),FreeBSD)
+ PLATFORM_OS=BSD
+ endif
+ ifeq ($(UNAMEOS),OpenBSD)
+ PLATFORM_OS=BSD
+ endif
+ ifeq ($(UNAMEOS),NetBSD)
+ PLATFORM_OS=BSD
+ endif
+ ifeq ($(UNAMEOS),DragonFly)
+ PLATFORM_OS=BSD
+ endif
+ ifeq ($(UNAMEOS),Darwin)
+ PLATFORM_OS=OSX
+ endif
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ UNAMEOS=$(shell uname)
+ ifeq ($(UNAMEOS),Linux)
+ PLATFORM_OS=LINUX
+ endif
+endif
+
+# RAYLIB_PATH adjustment for different platforms.
+# If using GNU make, we can get the full path to the top of the tree. Windows? BSD?
+# Required for ldconfig or other tools that do not perform path expansion.
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),LINUX)
+ RAYLIB_PREFIX ?= ..
+ RAYLIB_PATH = $(realpath $(RAYLIB_PREFIX))
+ endif
+endif
+# Default path for raylib on Raspberry Pi, if installed in different path, update it!
+# This is not currently used by src/Makefile. Not sure of its origin or usage. Refer to wiki.
+# TODO: update install: target in src/Makefile for RPI, consider relation to LINUX.
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ RAYLIB_PATH ?= /home/pi/raylib
+endif
+
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ # Emscripten required variables
+ EMSDK_PATH ?= C:/emsdk
+ EMSCRIPTEN_VERSION ?= 1.38.32
+ CLANG_VERSION = e$(EMSCRIPTEN_VERSION)_64bit
+ PYTHON_VERSION = 2.7.13.1_64bit\python-2.7.13.amd64
+ NODE_VERSION = 8.9.1_64bit
+ export PATH = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH)
+ EMSCRIPTEN = $(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION)
+endif
+
+# Define raylib release directory for compiled library.
+# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version
+RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src
+
+# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
+# into each example binary compiled with RAYLIB_LIBTYPE=SHARED. It defaults to RAYLIB_RELEASE_PATH
+# so that these examples link at runtime with your version of libraylib.so in ../release/libs/linux
+# without formal installation from ../src/Makefile. It aids portability and is useful if you have
+# multiple versions of raylib, have raylib installed to a non-standard location, or want to
+# bundle libraylib.so with your game. Change it to your liking.
+# NOTE: If, at runtime, there is a libraylib.so at both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH,
+# The library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over RAYLIB_INSTALL_PATH,
+# Implemented for LINUX below with CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
+# To see the result, run readelf -d core/core_basic_window; looking at the RPATH or RUNPATH attribute.
+# To see which libraries a built example is linking to, ldd core/core_basic_window;
+# Look for libraylib.so.1 => $(RAYLIB_INSTALL_PATH)/libraylib.so.1 or similar listing.
+EXAMPLE_RUNTIME_PATH ?= $(RAYLIB_RELEASE_PATH)
+
+# Define default C compiler: gcc
+# NOTE: define g++ compiler if using C++
+CC = gcc
+
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),OSX)
+ # OSX default compiler
+ CC = clang
+ endif
+ ifeq ($(PLATFORM_OS),BSD)
+ # FreeBSD, OpenBSD, NetBSD, DragonFly default compiler
+ CC = clang
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ ifeq ($(USE_RPI_CROSS_COMPILER),TRUE)
+ # Define RPI cross-compiler
+ #CC = armv6j-hardfloat-linux-gnueabi-gcc
+ CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ # HTML5 emscripten compiler
+ # WARNING: To compile to HTML5, code must be redesigned
+ # to use emscripten.h and emscripten_set_main_loop()
+ CC = emcc
+endif
+
+# Define default make program: Mingw32-make
+MAKE = mingw32-make
+
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),LINUX)
+ MAKE = make
+ endif
+endif
+
+# Define compiler flags:
+# -O1 defines optimization level
+# -g include debug information on compilation
+# -s strip unnecessary data from build
+# -Wall turns on most, but not all, compiler warnings
+# -std=c99 defines C language mode (standard C from 1999 revision)
+# -std=gnu99 defines C language mode (GNU C from 1999 revision)
+# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
+# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
+CFLAGS += -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces
+
+ifeq ($(BUILD_MODE),DEBUG)
+ CFLAGS += -g
+endif
+ifeq ($(RAYLIB_BUILD_MODE),RELEASE)
+ CFLAGS += -O1 -s
+endif
+
+# Additional flags for compiler (if desired)
+#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ # resource file contains windows executable icon and properties
+ # -Wl,--subsystem,windows hides the console window
+ CFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data -Wl,--subsystem,windows
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ ifeq ($(RAYLIB_LIBTYPE),STATIC)
+ CFLAGS += -D_DEFAULT_SOURCE
+ endif
+ ifeq ($(RAYLIB_LIBTYPE),SHARED)
+ # Explicitly enable runtime link to libraylib.so
+ CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
+ endif
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ CFLAGS += -std=gnu99
+endif
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ # -Os # size optimization
+ # -O2 # optimization level 2, if used, also set --memory-init-file 0
+ # -s USE_GLFW=3 # Use glfw3 library (context/input management)
+ # -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing -> WARNING: Audio buffers could FAIL!
+ # -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB)
+ # -s USE_PTHREADS=1 # multithreading support
+ # -s WASM=0 # disable Web Assembly, emitted by default
+ # -s EMTERPRETIFY=1 # enable emscripten code interpreter (very slow)
+ # -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter
+ # -s FORCE_FILESYSTEM=1 # force filesystem to load/save files data
+ # -s ASSERTIONS=1 # enable runtime checks for common memory allocation errors (-O1 and above turn it off)
+ # --profiling # include information for code profiling
+ # --memory-init-file 0 # to avoid an external memory initialization code file (.mem)
+ # --preload-file resources # specify a resources folder for data compilation
+ CFLAGS += -Os -s USE_GLFW=3 -s FORCE_FILESYSTEM=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 --preload-file $(dir $<)resources@resources
+ ifeq ($(BUILD_MODE), DEBUG)
+ CFLAGS += -s ASSERTIONS=1 --profiling
+ endif
+ # NOTE: Simple raylib examples are compiled to be interpreter by emterpreter, that way,
+ # we can compile same code for ALL platforms with no change required, but, working on bigger
+ # projects, code needs to be refactored to avoid a blocking while() loop, moving Update and Draw
+ # logic to a self contained function: UpdateDrawFrame(), check core_basic_window_web.c for reference.
+
+ # Define a custom shell .html and output extension
+ CFLAGS += --shell-file $(RAYLIB_PATH)/src/shell.html
+ EXT = .html
+endif
+
+# Define include paths for required headers
+# NOTE: Several external required libraries (stb and others)
+INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external -I$(RAYGUI_PATH)
+
+# Define additional directories containing required header files
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ # RPI required libraries
+ INCLUDE_PATHS += -I/opt/vc/include
+ INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux
+ INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads
+endif
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),BSD)
+ # Consider -L$(RAYLIB_H_INSTALL_PATH)
+ INCLUDE_PATHS += -I/usr/local/include
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ # Reset everything.
+ # Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include
+ INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
+ endif
+endif
+
+# Define library paths containing required libs.
+LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
+
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),BSD)
+ # Consider -L$(RAYLIB_INSTALL_PATH)
+ LDFLAGS += -L. -Lsrc -L/usr/local/lib
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ # Reset everything.
+ # Precedence: immediately local, installed version, raysan5 provided libs
+ LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH)
+ endif
+endif
+
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ LDFLAGS += -L/opt/vc/lib
+endif
+
+# Define any libraries required on linking
+# if you want to link libraries (libname.so or libname.a), use the -lname
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ # Libraries for Windows desktop compilation
+ # NOTE: WinMM library required to set high-res timer resolution
+ LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm
+ # Required for physac examples
+ LDLIBS += -static -lpthread
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ # Libraries for Debian GNU/Linux desktop compiling
+ # NOTE: Required packages: libegl1-mesa-dev
+ LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt
+
+ # On X11 requires also below libraries
+ LDLIBS += -lX11
+ # NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them
+ #LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
+
+ # On Wayland windowing system, additional libraries requires
+ ifeq ($(USE_WAYLAND_DISPLAY),TRUE)
+ LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon
+ endif
+ # Explicit link to libc
+ ifeq ($(RAYLIB_LIBTYPE),SHARED)
+ LDLIBS += -lc
+ endif
+ endif
+ ifeq ($(PLATFORM_OS),OSX)
+ # Libraries for OSX 10.9 desktop compiling
+ # NOTE: Required packages: libopenal-dev libegl1-mesa-dev
+ LDLIBS = -lraylib -framework OpenGL -framework Cocoa -framework IOKit -framework CoreAudio -framework CoreVideo
+ endif
+ ifeq ($(PLATFORM_OS),BSD)
+ # Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling
+ # NOTE: Required packages: mesa-libs
+ LDLIBS = -lraylib -lGL -lpthread -lm
+
+ # On XWindow requires also below libraries
+ LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
+ endif
+ ifeq ($(USE_EXTERNAL_GLFW),TRUE)
+ # NOTE: It could require additional packages installed: libglfw3-dev
+ LDLIBS += -lglfw
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ # Libraries for Raspberry Pi compiling
+ # NOTE: Required packages: libasound2-dev (ALSA)
+ LDLIBS = -lraylib -lbrcmGLESv2 -lbrcmEGL -lpthread -lrt -lm -lbcm_host -ldl
+endif
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ # Libraries for web (HTML5) compiling
+ LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.bc
+endif
+
+# Define all source files required
+EXAMPLES = \
+ controls_test_suite/controls_test_suite \
+ custom_file_dialog/custom_file_dialog \
+ custom_input_box/custom_input_box\
+ image_exporter/image_exporter \
+ image_importer_raw/image_importer_raw \
+ property_list/property_list \
+ portable_window/portable_window \
+ scroll_panel/scroll_panel \
+ style_selector/style_selector \
+ custom_sliders/custom_sliders \
+ animation_curve/animation_curve
+
+CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST))
+
+# Default target entry
+all: $(EXAMPLES)
+
+# Generic compilation pattern
+# NOTE: Examples must be ready for Android compilation!
+%: %.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+# Clean everything
+clean:
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ del *.o *.exe /s
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -fv
+ endif
+ ifeq ($(PLATFORM_OS),OSX)
+ find . -type f -perm +ugo+x -delete
+ rm -f *.o
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ find . -type f -executable -delete
+ rm -fv *.o
+endif
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ del *.o *.html *.js
+endif
+ @echo Cleaning done
diff --git a/external/raygui-4.0/examples/animation_curve/animation_curve.c b/external/raygui-4.0/examples/animation_curve/animation_curve.c
new file mode 100644
index 0000000..94fc14b
--- /dev/null
+++ b/external/raygui-4.0/examples/animation_curve/animation_curve.c
@@ -0,0 +1,477 @@
+/*******************************************************************************************
+*
+* Animation curves - An example demo for animation curves
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2023 Pierre Jaffuer (@smallcluster)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT 24
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+// raygui embedded styles
+#include "../../styles/cyber/cyber.h" // raygui style: cyber
+#include "../../styles/jungle/jungle.h" // raygui style: jungle
+#include "../../styles/lavanda/lavanda.h" // raygui style: lavanda
+#include "../../styles/dark/dark.h" // raygui style: dark
+#include "../../styles/bluish/bluish.h" // raygui style: bluish
+#include "../../styles/terminal/terminal.h" // raygui style: terminal
+
+#undef RAYGUI_IMPLEMENTATION // Avoid including raygui implementation again
+
+#define GUI_CURVE_EDITOR_IMPLEMENTATION
+#include "gui_curve_editor.h"
+
+//------------------------------------------------------------------------------------
+// Helper function
+//------------------------------------------------------------------------------------
+void LoadCurveDefaults(GuiCurveEditorState curves[]);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 540;
+
+ InitWindow(screenWidth, screenHeight, "raygui - animation curves");
+ SetTargetFPS(60);
+
+ // Gui style
+ GuiLoadStyleDefault();
+ int visualStyleActive = 0;
+ int prevVisualStyleActive = 0;
+
+ float fontSize = GuiGetStyle(DEFAULT, TEXT_SIZE);
+ const float margin = 8;
+
+ // Gui states
+ Vector2 scrollOffset = (Vector2){ 0, 0 };
+ Rectangle contentRect = (Rectangle){ 0, 0, 0, 0 };
+ bool moveSlider = false;
+ bool sectionActive[5] = { 0 };
+ sectionActive[0] = true;
+ const char *sectionNames[5] = { "X Position", "Y Position", "Width", "Height", "Rotation" };
+ bool editValueBox[5][4] = { 0 };
+ char *valTextBox[5][4][20] = { 0 };
+ bool playAnimation = true;
+ bool showHelp = true;
+
+ Rectangle settingsRect = (Rectangle){ screenWidth - screenWidth/3, 0, screenWidth/3, screenHeight };
+
+ // Animation curves
+ // 0 -> Ball X position
+ // 1 -> Ball Y position
+ // 2 -> Ball Width
+ // 3 -> Ball Height
+ // 4 -> Ball rotation
+ GuiCurveEditorState curves[5] = { 0 };
+ LoadCurveDefaults(curves);
+
+ // Animation time
+ float time = 0.0f;
+ float animationTime = 4.0f;
+
+ //SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ if (playAnimation) time += GetFrameTime();
+
+ // Reset timer
+ if (time > animationTime) time = 0;
+
+ // Ball animation
+ const float t = time/animationTime;
+ Vector2 ballPos = (Vector2){ GuiCurveEval(&curves[0], t), GuiCurveEval(&curves[1], t) };
+ Vector2 ballSize = (Vector2){ GuiCurveEval(&curves[2], t), GuiCurveEval(&curves[3], t) };
+ float ballRotation = GuiCurveEval(&curves[4], t);
+
+ // Update style
+ if (visualStyleActive != prevVisualStyleActive)
+ {
+ switch (visualStyleActive)
+ {
+ case 0: GuiLoadStyleDefault(); break;
+ case 1: GuiLoadStyleJungle(); break;
+ case 2: GuiLoadStyleLavanda(); break;
+ case 3: GuiLoadStyleDark(); break;
+ case 4: GuiLoadStyleBluish(); break;
+ case 5: GuiLoadStyleCyber(); break;
+ case 6: GuiLoadStyleTerminal(); break;
+ default: break;
+ }
+
+ fontSize = GuiGetStyle(DEFAULT, TEXT_SIZE);
+ prevVisualStyleActive = visualStyleActive;
+ }
+
+ // Update settings panel rect
+ Rectangle sliderRect = (Rectangle){ settingsRect.x - 4, settingsRect.y, 4, settingsRect.height };
+ if (CheckCollisionPointRec(GetMousePosition(), sliderRect) && IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) moveSlider = true;
+ if (IsMouseButtonUp(MOUSE_BUTTON_LEFT)) moveSlider = false;
+
+ if (moveSlider)
+ {
+ settingsRect.x = GetMouseX();
+
+ // Minimum-Maximum size
+ if (settingsRect.x > (screenWidth - 4)) settingsRect.x = screenWidth - 4;
+ else if (settingsRect.x < 4) settingsRect.x = 4;
+
+ settingsRect.width = screenWidth - settingsRect.x;
+ }
+
+
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+ ClearBackground(GetColor( GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ // Scene
+ //----------------------------------------------------------------------------------
+ DrawRectangle(curves[0].start, curves[1].end, curves[0].end-curves[0].start, curves[1].start-curves[1].end, BLUE); // Sky
+
+ DrawRectangle(curves[0].start, curves[1].start, curves[0].end-curves[0].start, 32, DARKGREEN); // Ground
+
+ BeginScissorMode(curves[0].start, curves[1].end, curves[0].end-curves[0].start, curves[1].start-curves[1].end+32);
+
+ DrawRectanglePro((Rectangle){ballPos.x, ballPos.y, ballSize.x, ballSize.y}, (Vector2){ballSize.x/2.f,ballSize.y/2.f}, ballRotation, PINK); // Ball
+
+ DrawLine(ballPos.x, ballPos.y, ballPos.x + cosf(ballRotation*DEG2RAD)*ballSize.x, ballPos.y +sinf(ballRotation*DEG2RAD)*ballSize.y, RED);
+ DrawLine(ballPos.x, ballPos.y, ballPos.x + cosf((ballRotation+90)*DEG2RAD)*ballSize.x, ballPos.y +sinf((ballRotation+90)*DEG2RAD)*ballSize.y, GREEN);
+
+ EndScissorMode();
+
+ // Bounds
+ DrawRectangleLines(curves[0].start, curves[1].end, curves[0].end-curves[0].start, curves[1].start-curves[1].end+32, GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL)));
+ //----------------------------------------------------------------------------------
+
+ // GUI
+ //----------------------------------------------------------------------------------
+ if (showHelp)
+ {
+ if (GuiWindowBox((Rectangle) {margin, margin, settingsRect.x-2*margin, curves[1].end-2*margin}, "help")) showHelp = false;
+
+ Rectangle helpTextRect = (Rectangle) { 2*margin, 2*margin+RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT, settingsRect.x - 4 - 4*margin, 0 };
+ GuiLabel((Rectangle) {helpTextRect.x, helpTextRect.y+helpTextRect.height, helpTextRect.width, fontSize}, "Curve widget controls:");
+ helpTextRect.height += fontSize+margin;
+ GuiLabel((Rectangle) {helpTextRect.x, helpTextRect.y+helpTextRect.height, helpTextRect.width, fontSize}, "- Left click to move/add point or move tangents");
+ helpTextRect.height += fontSize+margin/2;
+ GuiLabel((Rectangle) {helpTextRect.x, helpTextRect.y+helpTextRect.height, helpTextRect.width, fontSize}, "- While moving a tangent, hold SHIFT to disable tangent symetry");
+ helpTextRect.height += fontSize+margin/2;
+ GuiLabel((Rectangle) {helpTextRect.x, helpTextRect.y+helpTextRect.height, helpTextRect.width, fontSize}, "- Right click to remove a point");
+ helpTextRect.height += fontSize+margin/2;
+ DrawRectangleGradientV(margin, margin+curves[1].end - 2*margin, settingsRect.x - 2*margin, 12, (Color){ 0,0,0,100 }, BLANK);
+ }
+
+ // Settings panel
+ GuiScrollPanel(settingsRect, "Settings", contentRect, &scrollOffset, NULL);
+
+ BeginScissorMode(settingsRect.x, settingsRect.y+RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT, settingsRect.width, settingsRect.height);
+
+ // Rebuild the content Rect
+ contentRect = (Rectangle){ settingsRect.x + margin, RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT+margin, settingsRect.width - 2*margin - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), 0 };
+
+ // Help button
+ if (GuiButton((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width, 1.5*fontSize }, GuiIconText(showHelp? ICON_EYE_ON : ICON_EYE_OFF, "Curve controls help"))) showHelp = !showHelp;
+
+ contentRect.height += 1.5*fontSize + margin;
+
+ // Animation Time slider
+ GuiSlider((Rectangle){ contentRect.x, contentRect.y+contentRect.height+scrollOffset.y, contentRect.width/2, fontSize }, NULL, TextFormat("Animation Time: %.2fs", animationTime), &animationTime, 1, 8);
+ contentRect.height += fontSize + margin;
+
+ // Load default curves
+ if (GuiButton((Rectangle){ contentRect.x, contentRect.y+contentRect.height+scrollOffset.y, contentRect.width, 1.5*fontSize }, "Load default"))
+ {
+ LoadCurveDefaults(curves);
+ animationTime = 4.0f;
+ time = 0.0f;
+ }
+ contentRect.height += 1.5f*fontSize + margin;
+
+ // Styles
+ GuiLabel((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width, fontSize }, "Style:");
+ contentRect.height += fontSize;
+ GuiComboBox((Rectangle){contentRect.x, contentRect.y+contentRect.height+scrollOffset.y, contentRect.width, 1.5*fontSize }, "default;Jungle;Lavanda;Dark;Bluish;Cyber;Terminal", &visualStyleActive);
+ contentRect.height += 1.5f*fontSize + margin;
+
+ // Draw curves with their controls
+ //----------------------------------------------------------------------------------
+ for (int i = 0; i < 5; i++)
+ {
+ // Collapsing section
+ Rectangle headerRect = (Rectangle){ contentRect.x, contentRect.y + contentRect.height+scrollOffset.y, contentRect.width, 1.5f*fontSize };
+ GuiStatusBar(headerRect, NULL);
+
+ if (GuiLabelButton(headerRect, GuiIconText(sectionActive[i] ? ICON_ARROW_DOWN_FILL : ICON_ARROW_RIGHT_FILL, sectionNames[i]))) sectionActive[i] = !sectionActive[i];
+
+ contentRect.height += 1.5f*fontSize + margin;
+
+ // Skip this section
+ if (!sectionActive[i]) continue;
+
+ // Draw curve control
+ Rectangle curveRect = (Rectangle){ contentRect.x, contentRect.y+contentRect.height + scrollOffset.y, contentRect.width, fontSize*12 };
+ EndScissorMode(); // Stop clipping from setting rect
+
+ // Curves can leaks from control boundary... scissor it !
+ BeginScissorMode(curveRect.x, curveRect.y, curveRect.width, curveRect.height);
+ GuiCurveEditor(&curves[i], curveRect);
+ EndScissorMode();
+
+ // Resume clipping from setting rect
+ BeginScissorMode(settingsRect.x, settingsRect.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT, settingsRect.width, settingsRect.height);
+ contentRect.height += fontSize*12 + margin;
+
+ // Draw selected point controls
+ GuiCurveEditorPoint *p = &(curves[i].points[curves[i].selectedIndex]);
+ GuiCheckBox((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, 1.5f*fontSize, 1.5f*fontSize }, "Left Linear", &p->leftLinear);
+ GuiCheckBox((Rectangle){ contentRect.x+contentRect.width/2, contentRect.y + contentRect.height + scrollOffset.y, 1.5f*fontSize, 1.5f*fontSize }, "Right Linear", &p->rightLinear);
+ contentRect.height += 1.5f*fontSize + margin;
+
+ // Positions
+ GuiLabel((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width, fontSize }, "Position");
+ contentRect.height += fontSize;
+
+ if (!editValueBox[i][0]) gcvt(p->position.x, 6, valTextBox[i][0]); // Transform x position to string
+
+ if (!editValueBox[i][1]) gcvt(curves[i].start + (curves[i].end-curves[i].start)*p->position.y, 6, valTextBox[i][1]); // Transform y position to string
+
+ // X pos
+ if (GuiTextBox((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width/2-margin, 1.5f*fontSize }, valTextBox[i][0], 20, editValueBox[i][0]))
+ {
+ editValueBox[i][0] = !editValueBox[i][0];
+
+ // Input ended
+ if (!editValueBox[i][0])
+ {
+ // Try to convert text to float and assign it to the point
+ char *endPtr = NULL;
+ double value = strtod((char *)valTextBox[i][0], &endPtr);
+
+ if (endPtr != (char *)valTextBox[i][0]) p->position.x = (value < 0)? 0 : (value > 1)? 1 : value;
+ }
+ }
+
+ // Y pos
+ if (GuiTextBox((Rectangle){ contentRect.x + contentRect.width/2, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width/2.0f, 1.5f*fontSize }, valTextBox[i][1], 20, editValueBox[i][1]))
+ {
+ editValueBox[i][1] = !editValueBox[i][1];
+
+ // Input ended
+ if (!editValueBox[i][1])
+ {
+ // Try to convert text to float and assign it to the point
+ char *endPtr = NULL;
+ double value = strtod((char *)valTextBox[i][1], &endPtr);
+
+ if (endPtr != (char *)valTextBox[i][1])
+ {
+ float normalizedVal = (value - curves[i].start)/(curves[i].end - curves[i].start);
+ p->position.y = (normalizedVal < 0)? 0 : (normalizedVal > 1)? 1 : normalizedVal;
+ }
+ }
+
+ }
+
+ contentRect.height += 1.5f*fontSize + margin;
+
+ // Tangents
+ GuiLabel((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width, fontSize }, "Tangents");
+ contentRect.height += fontSize;
+
+ if (!editValueBox[i][2]) gcvt(p->tangents.x, 6, valTextBox[i][2]); // Transform left tangent to string
+
+ if (!editValueBox[i][3]) gcvt(p->tangents.y, 6, valTextBox[i][3]); // Transform right tangent to string
+
+ // Left tan
+ if (GuiTextBox((Rectangle){ contentRect.x, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width/2 - margin, 1.5f*fontSize }, valTextBox[i][2], 20, editValueBox[i][2]))
+ {
+ editValueBox[i][2] = !editValueBox[i][2];
+
+ // Input ended
+ if (!editValueBox[i][2])
+ {
+ // Try to convert text to float and assign it to the point
+ char *endPtr = NULL;
+ double value = strtod((char *)valTextBox[i][2], &endPtr);
+ if (endPtr != (char *)valTextBox[i][2]) p->tangents.x = value;
+ }
+ }
+
+ // Right tan
+ if (GuiTextBox((Rectangle){ contentRect.x + contentRect.width/2.0f, contentRect.y + contentRect.height + scrollOffset.y, contentRect.width/2.0f, 1.5f*fontSize }, valTextBox[i][3], 20, editValueBox[i][3]))
+ {
+ editValueBox[i][3] = !editValueBox[i][3];
+
+ // Input ended
+ if (!editValueBox[i][3])
+ {
+ // Try to convert text to float and assign it to the point
+ char *endPtr = NULL;
+ double value = strtod((char *)valTextBox[i][3], &endPtr);
+ if (endPtr != (char *)valTextBox[i][3]) p->tangents.y = value;
+ }
+ }
+
+ contentRect.height += 1.5*fontSize + margin;
+ }
+
+ contentRect.height += margin;
+
+ EndScissorMode();
+
+ // Settings panel shadow
+ DrawRectangleGradientH(settingsRect.x - 12, 0, 12, settingsRect.height, BLANK, (Color){ 0, 0, 0, 100 });
+
+ // Slider
+ if (moveSlider) DrawRectangle(sliderRect.x, sliderRect.y, sliderRect.width, sliderRect.height, GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_PRESSED)));
+ else if(CheckCollisionPointRec(GetMousePosition(), sliderRect)) DrawRectangle(sliderRect.x, sliderRect.y, sliderRect.width, sliderRect.height, GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_FOCUSED)));
+
+ // Draw Time controls
+ //----------------------------------------------------------------------------------
+ Rectangle timeLineRect = (Rectangle){ 0, screenHeight-4*fontSize, settingsRect.x, 4*fontSize };
+ GuiPanel((Rectangle){ timeLineRect.x, timeLineRect.y, timeLineRect.width, 2*fontSize }, NULL);
+ GuiLabel((Rectangle){ timeLineRect.x, timeLineRect.y, timeLineRect.width, 2*fontSize }, TextFormat("Normalized Time: %.3f", time/animationTime));
+ if (GuiButton((Rectangle){ timeLineRect.x+timeLineRect.width/2 - 2*fontSize - margin/4, timeLineRect.y, 2*fontSize, 2*fontSize }, GuiIconText((playAnimation? ICON_PLAYER_PAUSE : ICON_PLAYER_PLAY), ""))) playAnimation = !playAnimation;
+
+ if (GuiButton((Rectangle){ timeLineRect.x+timeLineRect.width/2 + margin/4, timeLineRect.y, 2*fontSize, 2*fontSize }, GuiIconText(ICON_PLAYER_STOP, "")))
+ {
+ playAnimation = false;
+ time = 0;
+ }
+
+ float animTime = time/animationTime;
+ GuiSlider((Rectangle){timeLineRect.x, timeLineRect.y + 2*fontSize, timeLineRect.width, timeLineRect.height - 2*fontSize }, NULL, NULL, &animTime, 0, 1);
+ time = animationTime*animTime;
+
+ // Time panel shadow
+ DrawRectangleGradientV(timeLineRect.x, timeLineRect.y - 12, timeLineRect.width, 12, BLANK, (Color){ 0, 0, 0, 100 });
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+void LoadCurveDefaults(GuiCurveEditorState curves[])
+{
+ // X pos
+ curves[0].start = 28;
+ curves[0].end = 506;
+ curves[0].numPoints = 4;
+ curves[0].selectedIndex = 0;
+ curves[0].editLeftTangent = false;
+ curves[0].editRightTangent = false;
+ curves[0].points[0].position =(Vector2) {0.000000, 0.000000}; curves[0].points[0].tangents = (Vector2) {0.000000, 1.515101}; curves[0].points[0].leftLinear = 1;curves[0].points[0].rightLinear = 1;
+ curves[0].points[1].position =(Vector2) {0.422414, 0.640000}; curves[0].points[1].tangents = (Vector2) {-2.824348, -4.494999};curves[0].points[1].leftLinear = 0;curves[0].points[1].rightLinear = 0;
+ curves[0].points[2].position =(Vector2) {0.732759, 0.210000}; curves[0].points[2].tangents = (Vector2) {0.000000, 2.956133}; curves[0].points[2].leftLinear = 0;curves[0].points[2].rightLinear = 1;
+ curves[0].points[3].position =(Vector2) {1.000000, 1.000000}; curves[0].points[3].tangents = (Vector2) {2.956133, 0.000000}; curves[0].points[3].leftLinear = 1;curves[0].points[3].rightLinear = 1;
+
+ // Y pos
+ curves[1].start = 405;
+ curves[1].end = 135;
+ curves[1].numPoints = 7;
+ curves[1].selectedIndex = 0;
+ curves[1].editLeftTangent = false;
+ curves[1].editRightTangent = false;
+ curves[1].points[0].position = (Vector2) {0.000000, 1.000000};curves[1].points[0].tangents = (Vector2) { 0.000000 , 0.000000};curves[1].points[0].leftLinear = 0;curves[1].points[0].rightLinear = 0;
+ curves[1].points[1].position = (Vector2) {0.140000, 0.000000};curves[1].points[1].tangents = (Vector2) {-10.000000 ,10.000000};curves[1].points[1].leftLinear = 0;curves[1].points[1].rightLinear = 0;
+ curves[1].points[2].position = (Vector2) {0.450000, 0.000000};curves[1].points[2].tangents = (Vector2) {-10.000000 ,10.000000};curves[1].points[2].leftLinear = 0;curves[1].points[2].rightLinear = 0;
+ curves[1].points[3].position = (Vector2) {0.670000, 0.000000};curves[1].points[3].tangents = (Vector2) {-10.000000 ,10.000000};curves[1].points[3].leftLinear = 0;curves[1].points[3].rightLinear = 0;
+ curves[1].points[4].position = (Vector2) {0.830000, 0.000000};curves[1].points[4].tangents = (Vector2) {-10.000000 ,10.000000};curves[1].points[4].leftLinear = 0;curves[1].points[4].rightLinear = 0;
+ curves[1].points[5].position = (Vector2) {0.940000, 0.000000};curves[1].points[5].tangents = (Vector2) {-10.000000 ,10.000000};curves[1].points[5].leftLinear = 0;curves[1].points[5].rightLinear = 0;
+ curves[1].points[6].position = (Vector2) {1.000000, 0.000000};curves[1].points[6].tangents = (Vector2) {-10.000000 , 0.000000};curves[1].points[6].leftLinear = 0;curves[1].points[6].rightLinear = 0;
+
+ // X size
+ curves[2].start = 1;
+ curves[2].end = 64;
+ curves[2].numPoints = 16;
+ curves[2].selectedIndex = 0;
+ curves[2].editLeftTangent = false;
+ curves[2].editRightTangent = false;
+ curves[2].points[0].position = (Vector2) {0.000000, 0.492063}; curves[2].points[0].tangents = (Vector2) {0,0}; curves[2].points[0].leftLinear = 0; curves[2].points[0].rightLinear = 0;
+ curves[2].points[1].position = (Vector2) {0.130000, 0.492063}; curves[2].points[1].tangents = (Vector2) {0,0}; curves[2].points[1].leftLinear = 0; curves[2].points[1].rightLinear = 0;
+ curves[2].points[2].position = (Vector2) {0.140000, 0.746032}; curves[2].points[2].tangents = (Vector2) {0,0}; curves[2].points[2].leftLinear = 0; curves[2].points[2].rightLinear = 0;
+ curves[2].points[3].position = (Vector2) {0.150000, 0.492063}; curves[2].points[3].tangents = (Vector2) {0,0}; curves[2].points[3].leftLinear = 0; curves[2].points[3].rightLinear = 0;
+ curves[2].points[4].position = (Vector2) {0.440000, 0.490000}; curves[2].points[4].tangents = (Vector2) {0,0}; curves[2].points[4].leftLinear = 0; curves[2].points[4].rightLinear = 0;
+ curves[2].points[5].position = (Vector2) {0.450000, 0.682540}; curves[2].points[5].tangents = (Vector2) {0,0}; curves[2].points[5].leftLinear = 0; curves[2].points[5].rightLinear = 0;
+ curves[2].points[6].position = (Vector2) {0.460000, 0.480000}; curves[2].points[6].tangents = (Vector2) {0,0}; curves[2].points[6].leftLinear = 0; curves[2].points[6].rightLinear = 0;
+ curves[2].points[7].position = (Vector2) {0.660000, 0.492063}; curves[2].points[7].tangents = (Vector2) {0,0}; curves[2].points[7].leftLinear = 0; curves[2].points[7].rightLinear = 0;
+ curves[2].points[8].position = (Vector2) {0.670000, 0.619048}; curves[2].points[8].tangents = (Vector2) {0,0}; curves[2].points[8].leftLinear = 0; curves[2].points[8].rightLinear = 0;
+ curves[2].points[9].position = (Vector2) {0.680000, 0.492063}; curves[2].points[9].tangents = (Vector2) {0,0}; curves[2].points[9].leftLinear = 0; curves[2].points[9].rightLinear = 0;
+ curves[2].points[10].position = (Vector2) {0.820000, 0.492063}; curves[2].points[10].tangents = (Vector2) {0,0}; curves[2].points[10].leftLinear = 0; curves[2].points[10].rightLinear = 0;
+ curves[2].points[11].position = (Vector2) {0.830000, 0.619048}; curves[2].points[11].tangents = (Vector2) {0,0}; curves[2].points[11].leftLinear = 0; curves[2].points[11].rightLinear = 0;
+ curves[2].points[12].position = (Vector2) {0.840000, 0.492063}; curves[2].points[12].tangents = (Vector2) {0,0}; curves[2].points[12].leftLinear = 0; curves[2].points[12].rightLinear = 0;
+ curves[2].points[13].position = (Vector2) {0.930000, 0.492063}; curves[2].points[13].tangents = (Vector2) {0,0}; curves[2].points[13].leftLinear = 0; curves[2].points[13].rightLinear = 0;
+ curves[2].points[14].position = (Vector2) {0.940000, 0.619048}; curves[2].points[14].tangents = (Vector2) {0,0}; curves[2].points[14].leftLinear = 0; curves[2].points[14].rightLinear = 0;
+ curves[2].points[15].position = (Vector2) {0.950000, 0.492063}; curves[2].points[15].tangents = (Vector2) {0,0}; curves[2].points[15].leftLinear = 0; curves[2].points[15].rightLinear = 0;
+
+ // Y Size
+ curves[3].start = 1;
+ curves[3].end = 64;
+ curves[3].numPoints = 16;
+ curves[3].selectedIndex = 0;
+ curves[3].editLeftTangent = false;
+ curves[3].editRightTangent = false;
+ curves[3].points[0].position = (Vector2) {0.000000, 0.492063};curves[3].points[0].tangents = (Vector2) {0,0};curves[3].points[0].leftLinear = 0;curves[3].points[0].rightLinear = 0;
+ curves[3].points[1].position = (Vector2) {0.130000, 0.492063};curves[3].points[1].tangents = (Vector2) {0,0};curves[3].points[1].leftLinear = 0;curves[3].points[1].rightLinear = 0;
+ curves[3].points[2].position = (Vector2) {0.140000, 0.238095};curves[3].points[2].tangents = (Vector2) {0,0};curves[3].points[2].leftLinear = 0;curves[3].points[2].rightLinear = 0;
+ curves[3].points[3].position = (Vector2) {0.150000, 0.492063};curves[3].points[3].tangents = (Vector2) {0,0};curves[3].points[3].leftLinear = 0;curves[3].points[3].rightLinear = 0;
+ curves[3].points[4].position = (Vector2) {0.440000, 0.492063};curves[3].points[4].tangents = (Vector2) {0,0};curves[3].points[4].leftLinear = 0;curves[3].points[4].rightLinear = 0;
+ curves[3].points[5].position = (Vector2) {0.450000, 0.301587};curves[3].points[5].tangents = (Vector2) {0,0};curves[3].points[5].leftLinear = 0;curves[3].points[5].rightLinear = 0;
+ curves[3].points[6].position = (Vector2) {0.460000, 0.492063};curves[3].points[6].tangents = (Vector2) {0,0};curves[3].points[6].leftLinear = 0;curves[3].points[6].rightLinear = 0;
+ curves[3].points[7].position = (Vector2) {0.660000, 0.492063};curves[3].points[7].tangents = (Vector2) {0,0};curves[3].points[7].leftLinear = 0;curves[3].points[7].rightLinear = 0;
+ curves[3].points[8].position = (Vector2) {0.670000, 0.365079};curves[3].points[8].tangents = (Vector2) {0,0};curves[3].points[8].leftLinear = 0;curves[3].points[8].rightLinear = 0;
+ curves[3].points[9].position = (Vector2) {0.680000, 0.492063};curves[3].points[9].tangents = (Vector2) {0,0};curves[3].points[9].leftLinear = 0;curves[3].points[9].rightLinear = 0;
+ curves[3].points[10].position = (Vector2) {0.820000, 0.492063};curves[3].points[10].tangents = (Vector2) {0,0};curves[3].points[10].leftLinear = 0;curves[3].points[10].rightLinear = 0;
+ curves[3].points[11].position = (Vector2) {0.830000, 0.365079};curves[3].points[11].tangents = (Vector2) {0,0};curves[3].points[11].leftLinear = 0;curves[3].points[11].rightLinear = 0;
+ curves[3].points[12].position = (Vector2) {0.840000, 0.492063};curves[3].points[12].tangents = (Vector2) {0,0};curves[3].points[12].leftLinear = 0;curves[3].points[12].rightLinear = 0;
+ curves[3].points[13].position = (Vector2) {0.930000, 0.492063};curves[3].points[13].tangents = (Vector2) {0,0};curves[3].points[13].leftLinear = 0;curves[3].points[13].rightLinear = 0;
+ curves[3].points[14].position = (Vector2) {0.940000, 0.365079};curves[3].points[14].tangents = (Vector2) {0,0};curves[3].points[14].leftLinear = 0;curves[3].points[14].rightLinear = 0;
+ curves[3].points[15].position = (Vector2) {0.950000, 0.507937};curves[3].points[15].tangents = (Vector2) {0,0};curves[3].points[15].leftLinear = 0;curves[3].points[15].rightLinear = 0;
+
+ // Rotation
+ curves[4].start = -360;
+ curves[4].end = 360;
+ curves[4].numPoints = 9;
+ curves[4].selectedIndex = 0;
+ curves[4].editLeftTangent = false;
+ curves[4].editRightTangent = false;
+ curves[4].points[0].position = (Vector2) {0.140000, 0.500000};curves[4].points[0].tangents = (Vector2) {0,0};curves[4].points[0].leftLinear = 0;curves[4].points[0].rightLinear = 0;
+ curves[4].points[1].position = (Vector2) {0.450000, 0.500000};curves[4].points[1].tangents = (Vector2) {0,0};curves[4].points[1].leftLinear = 0;curves[4].points[1].rightLinear = 0;
+ curves[4].points[2].position = (Vector2) {0.670000, 0.500000};curves[4].points[2].tangents = (Vector2) {0,0};curves[4].points[2].leftLinear = 0;curves[4].points[2].rightLinear = 0;
+ curves[4].points[3].position = (Vector2) {0.830000, 0.500000};curves[4].points[3].tangents = (Vector2) {0,0};curves[4].points[3].leftLinear = 0;curves[4].points[3].rightLinear = 0;
+ curves[4].points[4].position = (Vector2) {0.940000, 0.500000};curves[4].points[4].tangents = (Vector2) {0,0};curves[4].points[4].leftLinear = 0;curves[4].points[4].rightLinear = 0;
+ curves[4].points[5].position = (Vector2) {1.000000, 0.500000};curves[4].points[5].tangents = (Vector2) {0,0};curves[4].points[5].leftLinear = 0;curves[4].points[5].rightLinear = 0;
+ curves[4].points[6].position = (Vector2) {0.000000, 0.472222};curves[4].points[6].tangents = (Vector2) {0,0};curves[4].points[6].leftLinear = 0;curves[4].points[6].rightLinear = 0;
+ curves[4].points[7].position = (Vector2) {0.302752, 0.527778};curves[4].points[7].tangents = (Vector2) {0,0};curves[4].points[7].leftLinear = 0;curves[4].points[7].rightLinear = 0;
+ curves[4].points[8].position = (Vector2) {0.577982, 0.472222};curves[4].points[8].tangents = (Vector2) {0,0};curves[4].points[8].leftLinear = 0;curves[4].points[8].rightLinear = 0;
+}
diff --git a/external/raygui-4.0/examples/animation_curve/gui_curve_editor.h b/external/raygui-4.0/examples/animation_curve/gui_curve_editor.h
new file mode 100644
index 0000000..ed855d0
--- /dev/null
+++ b/external/raygui-4.0/examples/animation_curve/gui_curve_editor.h
@@ -0,0 +1,554 @@
+/*******************************************************************************************
+*
+* CurveEdit v1.0 - A cubic Hermite editor for making animation curves
+*
+* MODULE USAGE:
+* #define GUI_CURVE_EDITOR_IMPLEMENTATION
+* #include "gui_curve_edit.h"
+*
+* INIT: GuiCurveEditState state = InitCurveEdit();
+* EVALUATE: float y = EvalGuiCurve(&state, t); // 0 <= t <= 1
+* DRAW: BeginScissorMode(bounds.x,bounds.y,bounds.width,bounds.height);
+* GuiCurveEdit(&state, bounds, pointSize);
+* EndScissorMode();
+*
+* NOTE: See 'Module Structures Declaration' section for more informations.
+*
+* NOTE: This module uses functions of the stdlib:
+* - qsort
+*
+* NOTE: Built-in interactions:
+* - Left click to move/add point or move tangents
+* - While moving a tangent, hold (left/right) SHIFT to disable tangent symetry
+* - Right click to remove a point
+*
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2023 Pierre Jaffuer (@smallcluster)
+*
+* 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"
+
+#ifndef GUI_CURVE_EDITOR_H
+#define GUI_CURVE_EDITOR_H
+
+
+#ifndef GUI_CURVE_EDITOR_MAX_POINTS
+ #define GUI_CURVE_EDITOR_MAX_POINTS 30
+#endif
+
+//----------------------------------------------------------------------------------
+// Module Structures Declaration
+//----------------------------------------------------------------------------------
+
+typedef struct {
+ Vector2 position; // In normalized space [0.0f, 1.0f]
+ Vector2 tangents; // The derivatives (left/right) of the 1D curve
+
+ // Let the curve editor calculate tangents to linearize part of the curve
+ bool leftLinear;
+ bool rightLinear;
+} GuiCurveEditorPoint;
+
+typedef struct {
+ float start; // Value at y = 0
+ float end; // Value at y = 1
+
+ // Always valid (unless you manualy change state's point array). Make sure to set it to -1 before init
+ int selectedIndex;
+
+ // Unsorted array with at least one point (constant curve)
+ GuiCurveEditorPoint points[GUI_CURVE_EDITOR_MAX_POINTS];
+ int numPoints;
+
+ // Private variables
+ bool editLeftTangent;
+ bool editRightTangent;
+ Vector2 mouseOffset;
+} GuiCurveEditorState;
+
+
+#ifdef __cplusplus
+extern "C" { // Prevents name mangling of functions
+#endif
+
+//----------------------------------------------------------------------------------
+// Module Functions Declaration
+//----------------------------------------------------------------------------------
+GuiCurveEditorState InitGuiCurveEditor(); // Initialize curve editor state
+void GuiCurveEditor(GuiCurveEditorState *state, Rectangle bounds); // Draw and update curve control
+
+// 1D Interpolation
+// Returns the y value (in [start, end]) of the curve at x = t
+// t must be normalized [0.f, 1.f]
+float GuiCurveEval(GuiCurveEditorState *state, float t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // GUI_CURVE_EDITOR_H
+
+/***********************************************************************************
+*
+* GUI_CURVE_EDITOR IMPLEMENTATION
+*
+************************************************************************************/
+#if defined(GUI_CURVE_EDITOR_IMPLEMENTATION)
+
+#include "../../src/raygui.h" // Change this to fit your project
+
+#include "stdlib.h" // Required for qsort
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition
+//----------------------------------------------------------------------------------
+GuiCurveEditorState InitGuiCurveEditor()
+{
+ GuiCurveEditorState state = { 0 };
+
+ state.start = 0;
+ state.end = 1;
+ state.selectedIndex = 0;
+ state.editLeftTangent = false;
+ state.editRightTangent = false;
+ state.mouseOffset = (Vector2){ 0.0f, 0.0f };
+
+ // At least one point (AVG by default)
+ state.numPoints = 1;
+ state.points[0].position = (Vector2){ 0.5f, 0.5f };
+ state.points[0].tangents = (Vector2){ 0.0f, 0.0f };
+ state.points[0].leftLinear = false;
+ state.points[0].rightLinear = false;
+
+ return state;
+}
+
+static int CompareGuiCurveEditPointPtr(const void *a, const void *b)
+{
+ float fa = (*(GuiCurveEditorPoint**)a)->position.x;
+ float fb = (*(GuiCurveEditorPoint**)b)->position.x;
+
+ return ((fa > fb) - (fa < fb));
+}
+
+float GuiCurveEval(GuiCurveEditorState *state, float t)
+{
+ // Sort points
+ GuiCurveEditorPoint* sortedPoints[GUI_CURVE_EDITOR_MAX_POINTS];
+
+ for (int i=0; i < state->numPoints; i++) sortedPoints[i] = &state->points[i];
+
+ qsort(sortedPoints, state->numPoints, sizeof(GuiCurveEditorPoint*), CompareGuiCurveEditPointPtr);
+
+ if (state->numPoints == 0) return state->start;
+
+ // Constants part on edges
+ if (t <= sortedPoints[0]->position.x) return state->start + (state->end-state->start)*sortedPoints[0]->position.y;
+ if (t >= sortedPoints[state->numPoints-1]->position.x) return state->start + (state->end-state->start)*sortedPoints[state->numPoints-1]->position.y;
+
+ // Find curve portion
+ for (int i=0; i < state->numPoints-1; i++)
+ {
+ const GuiCurveEditorPoint *p1 = sortedPoints[i];
+ const GuiCurveEditorPoint *p2 = sortedPoints[i+1];
+
+ // Skip this range
+ if (!((t >= p1->position.x) && (t < p2->position.x)) || (p1->position.x == p2->position.x)) continue;
+
+ float scale = (p2->position.x-p1->position.x);
+ float T = (t-p1->position.x)/scale;
+ float startTangent = scale*p1->tangents.y;
+ float endTangent = scale*p2->tangents.x;
+ float T2 = T*T;
+ float T3 = T*T*T;
+
+ return (state->start + (state->end-state->start)*((2*T3 - 3*T2 + 1)*p1->position.y + (T3 - 2*T2 + T)*startTangent + (3*T2 - 2*T3)*p2->position.y + (T3 - T2)*endTangent));
+ }
+
+ return state->start;
+}
+
+void GuiCurveEditor(GuiCurveEditorState *state, Rectangle bounds)
+{
+ // CONST
+ //----------------------------------------------------------------------------------
+ const float pointSize = 10.0f;
+ const float fontSize = GuiGetStyle(DEFAULT, TEXT_SIZE);
+ const float handleLength = pointSize*2.5f;
+ const float handleSize = pointSize/1.5f;
+
+ const Rectangle innerBounds = (Rectangle){ bounds.x + fontSize, bounds.y + fontSize, bounds.width - 2*fontSize, bounds.height - 2*fontSize };
+ const Vector2 mouse = GetMousePosition();
+ const Vector2 mouseLocal = (Vector2){ (mouse.x - innerBounds.x)/innerBounds.width, (innerBounds.y + innerBounds.height-mouse.y)/innerBounds.height};
+ //----------------------------------------------------------------------------------
+
+ // UPDATE STATE
+ //----------------------------------------------------------------------------------
+ // Find first point under mouse (-1 if not found)
+ int hoveredPointIndex = -1;
+ for (int i = 0; i < state->numPoints; i++)
+ {
+ const GuiCurveEditorPoint *p = &state->points[i];
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height-p->position.y*innerBounds.height };
+ const Rectangle pointRect = (Rectangle){ screenPos.x - pointSize/2.0f, screenPos.y - pointSize/2.0f, pointSize, pointSize };
+
+ if (CheckCollisionPointRec(mouse, pointRect))
+ {
+ hoveredPointIndex = i;
+ break;
+ }
+ }
+
+ // Unselect tangents
+ if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT))
+ {
+ state->editLeftTangent = false;
+ state->editRightTangent = false;
+ }
+
+ // Select a tangent if possible
+ if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && (state->selectedIndex != -1) && CheckCollisionPointRec(mouse, bounds))
+ {
+ const GuiCurveEditorPoint* p = &state->points[state->selectedIndex];
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width+innerBounds.x, innerBounds.y+innerBounds.height-p->position.y*innerBounds.height };
+
+ // Left control
+ Vector2 target = (Vector2){ (p->position.x-1)*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - (p->position.y-p->tangents.x)*innerBounds.height };
+ Vector2 dir = (Vector2){ target.x-screenPos.x, target.y-screenPos.y };
+ float d = sqrt(dir.x*dir.x + dir.y*dir.y);
+ Vector2 control = (Vector2){ screenPos.x + dir.x/d*handleLength, screenPos.y + dir.y/d*handleLength };
+ Rectangle controlRect = (Rectangle){ control.x - handleSize/2.0f, control.y - handleSize/2.0f, handleSize, handleSize };
+
+ // Edit left tangent
+ if (CheckCollisionPointRec(mouse, controlRect)) state->editLeftTangent = true;
+
+ // Right control
+ target = (Vector2){ (p->position.x + 1)*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - (p->position.y + p->tangents.y)*innerBounds.height };
+ dir = (Vector2){ target.x-screenPos.x, target.y-screenPos.y };
+ d = sqrt(dir.x*dir.x + dir.y*dir.y);
+ control = (Vector2){ screenPos.x + dir.x/d*handleLength, screenPos.y + dir.y/d*handleLength };
+ controlRect = (Rectangle){ control.x - handleSize/2.0f, control.y - handleSize/2.0f, handleSize, handleSize };
+
+ // Edit right tangent
+ if (CheckCollisionPointRec(mouse, controlRect)) state->editRightTangent = true;
+ }
+
+ // Move tangents
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) && state->editRightTangent)
+ {
+ // editRightTangent == true implies selectedIndex != -1
+ GuiCurveEditorPoint *p = &state->points[state->selectedIndex];
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height-p->position.y*innerBounds.height };
+ const Vector2 dir = (Vector2){ mouseLocal.x - p->position.x, mouseLocal.y - p->position.y};
+
+ // Calculate right tangent slope
+ p->tangents.y = (dir.x < 0.001f)? dir.y/0.001f : dir.y/dir.x;
+ p->rightLinear = false; // Stop right linearization update
+
+ // Tangents are symetric by default unless SHIFT is pressed
+ if (!(IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT)))
+ {
+ p->tangents.x = p->tangents.y;
+ p->leftLinear = false; // Stop left linearization update
+ }
+
+ }
+ else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) && state->editLeftTangent)
+ {
+ // editLeftTangent == true implies selectedIndex != -1
+ GuiCurveEditorPoint *p = &state->points[state->selectedIndex];
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height-p->position.y*innerBounds.height };
+ const Vector2 dir = (Vector2){ mouseLocal.x - p->position.x, mouseLocal.y - p->position.y };
+
+ // Calculate left tangent slope
+ p->tangents.x = (dir.x > -0.001f)? dir.y/(-0.001f) : dir.y/dir.x;
+ p->leftLinear = false; // Stop left linearization update
+
+ // Tangents are symetric by default unless SHIFT is pressed
+ if (!(IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT)))
+ {
+ p->tangents.y = p->tangents.x;
+ p->rightLinear = false; // Stop right linearization update
+ }
+ }
+ // Select a point
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && (hoveredPointIndex != -1) && CheckCollisionPointRec(mouse, bounds))
+ {
+ state->selectedIndex = hoveredPointIndex;
+ const GuiCurveEditorPoint *p = &state->points[state->selectedIndex];
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - p->position.y*innerBounds.height };
+ state->mouseOffset = (Vector2){ p->position.x - mouseLocal.x, p->position.y - mouseLocal.y };
+ }
+ // Remove a point (check against bounds)
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT) && (hoveredPointIndex != -1) && CheckCollisionPointRec(mouse, bounds) && (state->numPoints > 1))
+ {
+ // Deselect everything
+ state->selectedIndex = 0; // select first point by default
+ state->editLeftTangent = false;
+ state->editRightTangent = false;
+
+ // Remove point
+ state->numPoints -= 1;
+ for (int i = hoveredPointIndex; i < state->numPoints; i++) state->points[i] = state->points[i+1];
+ }
+ // Add a point (check against innerBounds)
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && CheckCollisionPointRec(mouse, innerBounds) && (state->numPoints < GUI_CURVE_EDITOR_MAX_POINTS))
+ {
+ state->editLeftTangent = false;
+ state->editRightTangent = false;
+
+ // Create new point
+ GuiCurveEditorPoint p;
+ p.tangents = (Vector2){ 0.0f, 0.0f };
+ p.position = mouseLocal;
+ p.leftLinear = false;
+ p.rightLinear = false;
+
+ // Append point
+ state->points[state->numPoints] = p;
+ state->selectedIndex = state->numPoints; // select new point
+ state->numPoints += 1;
+
+ // Point is add on mouse pos
+ state->mouseOffset = (Vector2){ 0, 0 };
+ }
+ // Move selected point
+ else if ((state->selectedIndex != -1) && IsMouseButtonDown(MOUSE_BUTTON_LEFT) && CheckCollisionPointRec(mouse, bounds))
+ {
+ GuiCurveEditorPoint *p = &state->points[state->selectedIndex];
+
+ // use mouse offset on click to prevent point teleporting to mouse
+ const Vector2 newLocalPos = (Vector2){ mouseLocal.x + state->mouseOffset.x, mouseLocal.y + state->mouseOffset.y };
+
+ // Clamp to innerbounds
+ p->position.x = (newLocalPos.x < 0)? 0 : ((newLocalPos.x > 1)? 1 : newLocalPos.x);
+ p->position.y = (newLocalPos.y < 0)? 0 : ((newLocalPos.y > 1)? 1 : newLocalPos.y);
+ }
+
+ // Sort points
+ GuiCurveEditorPoint *sortedPoints[GUI_CURVE_EDITOR_MAX_POINTS] = { 0 };
+ for (int i = 0; i < state->numPoints; i++) sortedPoints[i] = &state->points[i];
+ qsort(sortedPoints, state->numPoints, sizeof(GuiCurveEditorPoint*), CompareGuiCurveEditPointPtr);
+
+ // Update linear tangents
+ for (int i = 0; i < state->numPoints; i++)
+ {
+ GuiCurveEditorPoint *p = sortedPoints[i];
+
+ // Left tangent
+ if ((i > 0) && p->leftLinear)
+ {
+ const GuiCurveEditorPoint *p2 = sortedPoints[i - 1];
+ Vector2 dir = (Vector2){ p2->position.x - p->position.x, p2->position.y - p->position.y };
+ p->tangents.x = (dir.x == 0)? 0 : dir.y/dir.x;
+ }
+
+ // Right tangent
+ if ((i < state->numPoints - 1) && p->rightLinear)
+ {
+ const GuiCurveEditorPoint *p2 = sortedPoints[i + 1];
+ Vector2 dir = (Vector2){ p2->position.x - p->position.x, p2->position.y - p->position.y };
+ p->tangents.y = (dir.x == 0)? 0 : dir.y/dir.x;
+ }
+ }
+ //----------------------------------------------------------------------------------
+
+ // DRAWING
+ //----------------------------------------------------------------------------------
+ DrawRectangle(bounds.x, bounds.y, bounds.width, bounds.height, GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ // Draw grid
+ // H lines
+ const Color lineColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+ DrawLine(bounds.x, innerBounds.y, bounds.x+bounds.width, innerBounds.y, lineColor); // end
+ DrawLine(bounds.x, innerBounds.y+innerBounds.height/2, bounds.x+bounds.width, innerBounds.y+innerBounds.height/2, lineColor); // avg
+ DrawLine(bounds.x, innerBounds.y+innerBounds.height, bounds.x+bounds.width, innerBounds.y+innerBounds.height, lineColor); // start
+
+ // V lines
+ DrawLine(innerBounds.x, bounds.y, innerBounds.x, bounds.y+bounds.height, lineColor); // 0
+ DrawLine(innerBounds.x + innerBounds.width/4, bounds.y, innerBounds.x + innerBounds.width/4, bounds.y + bounds.height, lineColor); // 0.25
+ DrawLine(innerBounds.x + innerBounds.width/2, bounds.y, innerBounds.x + innerBounds.width/2, bounds.y + bounds.height, lineColor); // 0.5
+ DrawLine(innerBounds.x + 3*innerBounds.width/4, bounds.y, innerBounds.x + 3*innerBounds.width/4, bounds.y + bounds.height, lineColor); // 0.75
+ DrawLine(innerBounds.x + innerBounds.width, bounds.y, innerBounds.x + innerBounds.width, bounds.y + bounds.height, lineColor); // 1
+
+ Font font = GuiGetFont();
+ // V labels
+ DrawTextEx(font, "0", (Vector2){ innerBounds.x, bounds.y + bounds.height-fontSize}, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+ DrawTextEx(font, "0.25", (Vector2){ innerBounds.x + innerBounds.width/4.0f, bounds.y + bounds.height - fontSize}, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+ DrawTextEx(font, "0.5", (Vector2){ innerBounds.x + innerBounds.width/2.0f, bounds.y + bounds.height - fontSize}, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+ DrawTextEx(font, "0.75", (Vector2){ innerBounds.x + 3.0f*innerBounds.width/4.0f, bounds.y + bounds.height-fontSize}, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+ DrawTextEx(font, "1", (Vector2){ innerBounds.x + innerBounds.width, bounds.y+bounds.height - fontSize}, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+
+ // H labels
+ DrawTextEx(font, TextFormat("%.2f", state->start), (Vector2){ innerBounds.x, innerBounds.y - fontSize+innerBounds.height }, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+ DrawTextEx(font, TextFormat("%.2f", state->start + (state->end-state->start)/2.f), (Vector2){ innerBounds.x, innerBounds.y - fontSize + innerBounds.height/2.0f }, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+ DrawTextEx(font, TextFormat("%.2f", state->end), (Vector2){ innerBounds.x, innerBounds.y }, fontSize, GuiGetStyle(DEFAULT, TEXT_SPACING), lineColor);
+
+ // Draw contours
+ if (CheckCollisionPointRec(mouse, bounds)) DrawRectangleLines(bounds.x, bounds.y, bounds.width, bounds.height, GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_FOCUSED)));
+ else DrawRectangleLines(bounds.x, bounds.y, bounds.width, bounds.height, GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL)));
+
+ // Draw points
+ for (int i = 0; i < state->numPoints; i++)
+ {
+ const GuiCurveEditorPoint *p = sortedPoints[i];
+
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - p->position.y*innerBounds.height };
+ const Rectangle pointRect = (Rectangle){ screenPos.x - pointSize/2.0f, screenPos.y - pointSize/2.0f, pointSize, pointSize };
+
+ Color pointColor = { 0 };
+ Color pointBorderColor = { 0 };
+
+ // Draw point
+ if (&state->points[state->selectedIndex] == p)
+ {
+ // Draw left handle
+ if (i > 0)
+ {
+ const Vector2 target = (Vector2){ (p->position.x - 1)*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - (p->position.y - p->tangents.x)*innerBounds.height };
+ const Vector2 dir = (Vector2){ target.x - screenPos.x, target.y - screenPos.y };
+ const float d = sqrt(dir.x*dir.x + dir.y*dir.y);
+ const Vector2 control = (Vector2){ screenPos.x + dir.x/d*handleLength, screenPos.y + dir.y/d*handleLength };
+ const Rectangle controlRect = (Rectangle){ control.x - handleSize/2.0f, control.y - handleSize/2.0f, handleSize, handleSize };
+
+ Color controlColor = { 0 };
+ Color controlBorderColor = { 0 };
+
+ if (state->editLeftTangent)
+ {
+ controlColor = GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_PRESSED));
+ controlBorderColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+ }
+ else if (CheckCollisionPointRec(mouse, controlRect))
+ {
+ controlColor = GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_FOCUSED));
+ controlBorderColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+ }
+ else
+ {
+ controlColor = GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL));
+ controlBorderColor = GetColor(GuiGetStyle(BUTTON, BORDER_COLOR_NORMAL));
+ }
+
+ DrawLine(screenPos.x,screenPos.y, control.x, control.y, controlColor);
+ DrawRectangle(controlRect.x, controlRect.y, controlRect.width, controlRect.height, controlColor);
+ DrawRectangleLines(controlRect.x, controlRect.y, controlRect.width, controlRect.height, controlColor);
+ }
+
+ // Draw right handle
+ if (i < state->numPoints - 1)
+ {
+ const Vector2 target = (Vector2){ (p->position.x + 1)*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - (p->position.y + p->tangents.y)*innerBounds.height };
+ const Vector2 dir = (Vector2){ target.x - screenPos.x, target.y - screenPos.y };
+ const float d = sqrt(dir.x*dir.x + dir.y*dir.y);
+ const Vector2 control = (Vector2){ screenPos.x + dir.x/d*handleLength, screenPos.y + dir.y/d*handleLength };
+ const Rectangle controlRect = (Rectangle){ control.x - handleSize/2.0f, control.y - handleSize/2.0f, handleSize, handleSize };
+
+ Color controlColor = { 0 };
+ Color controlBorderColor = { 0 };
+
+ if (state->editRightTangent)
+ {
+ controlColor = GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_PRESSED));
+ controlBorderColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+ }
+ else if (CheckCollisionPointRec(mouse, controlRect))
+ {
+ controlColor = GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_FOCUSED));
+ controlBorderColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+ }
+ else
+ {
+ controlColor = GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL));
+ controlBorderColor = GetColor(GuiGetStyle(BUTTON, BORDER_COLOR_NORMAL));
+ }
+
+ DrawLine(screenPos.x,screenPos.y, control.x, control.y, controlColor);
+ DrawRectangle(controlRect.x, controlRect.y, controlRect.width, controlRect.height, controlColor);
+ DrawRectangleLines(controlRect.x, controlRect.y, controlRect.width, controlRect.height, controlColor);
+ }
+
+ pointColor = GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_PRESSED));
+ pointBorderColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+
+ }
+ else if (&state->points[hoveredPointIndex] == p)
+ {
+ pointColor = GetColor(GuiGetStyle(DEFAULT, BASE_COLOR_FOCUSED));
+ pointBorderColor = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_NORMAL));
+ }
+ else
+ {
+ pointColor = GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL));
+ pointBorderColor = GetColor(GuiGetStyle(BUTTON, BORDER_COLOR_NORMAL));
+ }
+
+ DrawRectangle(pointRect.x, pointRect.y, pointRect.width, pointRect.height, pointColor);
+ DrawRectangleLines(pointRect.x, pointRect.y, pointRect.width, pointRect.height, pointBorderColor);
+ }
+
+ // Draw curve
+ Color curveColor = GetColor(GuiGetStyle(LABEL, TEXT_COLOR_FOCUSED));
+
+ if (state->numPoints == 1)
+ {
+ const GuiCurveEditorPoint *p = sortedPoints[0];
+ const Vector2 screenPos = (Vector2){ p->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - p->position.y*innerBounds.height };
+ DrawLine(innerBounds.x, screenPos.y, innerBounds.x+innerBounds.width, screenPos.y, curveColor);
+ }
+ else
+ {
+ for (int i = 0; i < state->numPoints - 1; i++)
+ {
+ const GuiCurveEditorPoint *p1 = sortedPoints[i];
+ const GuiCurveEditorPoint *p2 = sortedPoints[i + 1];
+ const Vector2 screenPos1 = (Vector2){ p1->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - p1->position.y*innerBounds.height };
+ const Vector2 screenPos2 = (Vector2){ p2->position.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - p2->position.y*innerBounds.height };
+
+ // Constant on edge
+ if ((screenPos1.x > innerBounds.x) && (i == 0))
+ {
+ DrawLine(innerBounds.x, screenPos1.y, screenPos1.x, screenPos1.y, curveColor);
+ }
+ if ((screenPos2.x < innerBounds.x + innerBounds.width) && (i == (state->numPoints - 2)))
+ {
+ DrawLine(screenPos2.x, screenPos2.y, innerBounds.x+innerBounds.width, screenPos2.y, curveColor);
+ }
+
+ // Draw cubic Hermite curve
+ const float scale = (p2->position.x - p1->position.x)/3.0f;
+ const Vector2 offset1 = (Vector2){ scale, scale*p1->tangents.y };
+ // negative endTangent => top part => need to invert value to calculate offset
+ const Vector2 offset2 = (Vector2){ -scale, -scale*p2->tangents.x };
+
+ const Vector2 c1 = (Vector2){ p1->position.x + offset1.x, p1->position.y + offset1.y };
+ const Vector2 c2 = (Vector2){ p2->position.x + offset2.x, p2->position.y + offset2.y };
+
+ const Vector2 screenC1 = (Vector2){ c1.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - c1.y*innerBounds.height };
+ const Vector2 screenC2 = (Vector2){ c2.x*innerBounds.width + innerBounds.x, innerBounds.y + innerBounds.height - c2.y*innerBounds.height };
+
+ DrawLineBezierCubic(screenPos1, screenPos2, screenC1, screenC2, 1, curveColor);
+ }
+ }
+}
+
+#endif // GUI_CURVE_EDITOR_IMPLEMENTATION
+
diff --git a/external/raygui-4.0/examples/controls_test_suite/controls_test_suite.c b/external/raygui-4.0/examples/controls_test_suite/controls_test_suite.c
new file mode 100644
index 0000000..39111d8
--- /dev/null
+++ b/external/raygui-4.0/examples/controls_test_suite/controls_test_suite.c
@@ -0,0 +1,320 @@
+/*******************************************************************************************
+*
+* raygui - controls test suite
+*
+* TEST CONTROLS:
+* - GuiDropdownBox()
+* - GuiCheckBox()
+* - GuiSpinner()
+* - GuiValueBox()
+* - GuiTextBox()
+* - GuiButton()
+* - GuiComboBox()
+* - GuiListView()
+* - GuiToggleGroup()
+* - GuiColorPicker()
+* - GuiSlider()
+* - GuiSliderBar()
+* - GuiProgressBar()
+* - GuiColorBarAlpha()
+* - GuiScrollPanel()
+*
+*
+* DEPENDENCIES:
+* raylib 4.5 - Windowing/input management and drawing
+* raygui 3.5 - Immediate-mode GUI controls with custom styling and icons
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2016-2023 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+//#define RAYGUI_DEBUG_RECS_BOUNDS
+//#define RAYGUI_DEBUG_TEXT_BOUNDS
+
+#define RAYGUI_IMPLEMENTATION
+//#define RAYGUI_CUSTOM_ICONS // It requires providing gui_icons.h in the same directory
+//#include "gui_icons.h" // External icons data provided, it can be generated with rGuiIcons tool
+#include "../../src/raygui.h"
+
+// raygui embedded styles
+#include "../styles/style_cyber.h" // raygui style: cyber
+#include "../styles/style_jungle.h" // raygui style: jungle
+#include "../styles/style_lavanda.h" // raygui style: lavanda
+#include "../styles/style_dark.h" // raygui style: dark
+#include "../styles/style_bluish.h" // raygui style: bluish
+#include "../styles/style_terminal.h" // raygui style: terminal
+
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ const int screenWidth = 960;
+ const int screenHeight = 560;
+
+ InitWindow(screenWidth, screenHeight, "raygui - controls test suite");
+ SetExitKey(0);
+
+ // GUI controls initialization
+ //----------------------------------------------------------------------------------
+ int dropdownBox000Active = 0;
+ bool dropDown000EditMode = false;
+
+ int dropdownBox001Active = 0;
+ bool dropDown001EditMode = false;
+
+ int spinner001Value = 0;
+ bool spinnerEditMode = false;
+
+ int valueBox002Value = 0;
+ bool valueBoxEditMode = false;
+
+ char textBoxText[64] = "Text box";
+ bool textBoxEditMode = false;
+
+ char textBoxMultiText[1024] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+ bool textBoxMultiEditMode = false;
+
+ int listViewScrollIndex = 0;
+ int listViewActive = -1;
+
+ int listViewExScrollIndex = 0;
+ int listViewExActive = 2;
+ int listViewExFocus = -1;
+ const char *listViewExList[8] = { "This", "is", "a", "list view", "with", "disable", "elements", "amazing!" };
+
+ char multiTextBoxText[256] = "Multi text box";
+ bool multiTextBoxEditMode = false;
+ Color colorPickerValue = RED;
+
+ float sliderValue = 50.0f;
+ float sliderBarValue = 60;
+ float progressValue = 0.1f;
+
+ bool forceSquaredChecked = false;
+
+ float alphaValue = 0.5f;
+
+ //int comboBoxActive = 1;
+ int visualStyleActive = 0;
+ int prevVisualStyleActive = 0;
+
+ int toggleGroupActive = 0;
+ int toggleSliderActive = 0;
+
+ Vector2 viewScroll = { 0, 0 };
+ //----------------------------------------------------------------------------------
+
+ // Custom GUI font loading
+ //Font font = LoadFontEx("fonts/rainyhearts16.ttf", 12, 0, 0);
+ //GuiSetFont(font);
+
+ bool exitWindow = false;
+ bool showMessageBox = false;
+
+ char textInput[256] = { 0 };
+ char textInputFileName[256] = { 0 };
+ bool showTextInputBox = false;
+
+ float alpha = 1.0f;
+
+ // DEBUG: Testing how those two properties affect all controls!
+ //GuiSetStyle(DEFAULT, TEXT_PADDING, 0);
+ //GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!exitWindow) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ exitWindow = WindowShouldClose();
+
+ if (IsKeyPressed(KEY_ESCAPE)) showMessageBox = !showMessageBox;
+
+ if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_S)) showTextInputBox = true;
+
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ if ((droppedFiles.count > 0) && IsFileExtension(droppedFiles.paths[0], ".rgs")) GuiLoadStyle(droppedFiles.paths[0]);
+
+ UnloadDroppedFiles(droppedFiles); // Clear internal buffers
+ }
+
+ //alpha -= 0.002f;
+ if (alpha < 0.0f) alpha = 0.0f;
+ if (IsKeyPressed(KEY_SPACE)) alpha = 1.0f;
+
+ GuiSetAlpha(alpha);
+
+ //progressValue += 0.002f;
+ if (IsKeyPressed(KEY_LEFT)) progressValue -= 0.1f;
+ else if (IsKeyPressed(KEY_RIGHT)) progressValue += 0.1f;
+ if (progressValue > 1.0f) progressValue = 1.0f;
+ else if (progressValue < 0.0f) progressValue = 0.0f;
+
+ if (visualStyleActive != prevVisualStyleActive)
+ {
+ GuiLoadStyleDefault();
+
+ switch (visualStyleActive)
+ {
+ case 0: break; // Default style
+ case 1: GuiLoadStyleJungle(); break;
+ case 2: GuiLoadStyleLavanda(); break;
+ case 3: GuiLoadStyleDark(); break;
+ case 4: GuiLoadStyleBluish(); break;
+ case 5: GuiLoadStyleCyber(); break;
+ case 6: GuiLoadStyleTerminal(); break;
+ default: break;
+ }
+
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+
+ prevVisualStyleActive = visualStyleActive;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ // raygui: controls drawing
+ //----------------------------------------------------------------------------------
+ // Check all possible events that require GuiLock
+ if (dropDown000EditMode || dropDown001EditMode) GuiLock();
+
+ // First GUI column
+ //GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiCheckBox((Rectangle){ 25, 108, 15, 15 }, "FORCE CHECK!", &forceSquaredChecked);
+
+ GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ //GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ if (GuiSpinner((Rectangle){ 25, 135, 125, 30 }, NULL, &spinner001Value, 0, 100, spinnerEditMode)) spinnerEditMode = !spinnerEditMode;
+ if (GuiValueBox((Rectangle){ 25, 175, 125, 30 }, NULL, &valueBox002Value, 0, 100, valueBoxEditMode)) valueBoxEditMode = !valueBoxEditMode;
+ GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ if (GuiTextBox((Rectangle){ 25, 215, 125, 30 }, textBoxText, 64, textBoxEditMode)) textBoxEditMode = !textBoxEditMode;
+
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ if (GuiButton((Rectangle){ 25, 255, 125, 30 }, GuiIconText(ICON_FILE_SAVE, "Save File"))) showTextInputBox = true;
+
+ GuiGroupBox((Rectangle){ 25, 310, 125, 150 }, "STATES");
+ //GuiLock();
+ GuiSetState(STATE_NORMAL); if (GuiButton((Rectangle){ 30, 320, 115, 30 }, "NORMAL")) { }
+ GuiSetState(STATE_FOCUSED); if (GuiButton((Rectangle){ 30, 355, 115, 30 }, "FOCUSED")) { }
+ GuiSetState(STATE_PRESSED); if (GuiButton((Rectangle){ 30, 390, 115, 30 }, "#15#PRESSED")) { }
+ GuiSetState(STATE_DISABLED); if (GuiButton((Rectangle){ 30, 425, 115, 30 }, "DISABLED")) { }
+ GuiSetState(STATE_NORMAL);
+ //GuiUnlock();
+
+ GuiComboBox((Rectangle){ 25, 480, 125, 30 }, "default;Jungle;Lavanda;Dark;Bluish;Cyber;Terminal", &visualStyleActive);
+
+ // NOTE: GuiDropdownBox must draw after any other control that can be covered on unfolding
+ GuiUnlock();
+ GuiSetStyle(DROPDOWNBOX, TEXT_PADDING, 4);
+ GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ if (GuiDropdownBox((Rectangle){ 25, 65, 125, 30 }, "#01#ONE;#02#TWO;#03#THREE;#04#FOUR", &dropdownBox001Active, dropDown001EditMode)) dropDown001EditMode = !dropDown001EditMode;
+ GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ GuiSetStyle(DROPDOWNBOX, TEXT_PADDING, 0);
+
+ if (GuiDropdownBox((Rectangle){ 25, 25, 125, 30 }, "ONE;TWO;THREE", &dropdownBox000Active, dropDown000EditMode)) dropDown000EditMode = !dropDown000EditMode;
+
+ // Second GUI column
+ GuiListView((Rectangle){ 165, 25, 140, 124 }, "Charmander;Bulbasaur;#18#Squirtel;Pikachu;Eevee;Pidgey", &listViewScrollIndex, &listViewActive);
+ GuiListViewEx((Rectangle){ 165, 162, 140, 184 }, listViewExList, 8, &listViewExScrollIndex, &listViewExActive, &listViewExFocus);
+
+ //GuiToggle((Rectangle){ 165, 400, 140, 25 }, "#1#ONE", &toggleGroupActive);
+ GuiToggleGroup((Rectangle){ 165, 360, 140, 24 }, "#1#ONE\n#3#TWO\n#8#THREE\n#23#", &toggleGroupActive);
+ //GuiDisable();
+ GuiSetStyle(SLIDER, SLIDER_PADDING, 2);
+ GuiToggleSlider((Rectangle){ 165, 480, 140, 30 }, "ON;OFF", &toggleSliderActive);
+ GuiSetStyle(SLIDER, SLIDER_PADDING, 0);
+
+ // Third GUI column
+ GuiPanel((Rectangle){ 320, 25, 225, 140 }, "Panel Info");
+ GuiColorPicker((Rectangle){ 320, 185, 196, 192 }, NULL, &colorPickerValue);
+
+ //GuiDisable();
+ GuiSlider((Rectangle){ 355, 400, 165, 20 }, "TEST", TextFormat("%2.2f", sliderValue), &sliderValue, -50, 100);
+ GuiSliderBar((Rectangle){ 320, 430, 200, 20 }, NULL, TextFormat("%i", (int)sliderBarValue), &sliderBarValue, 0, 100);
+
+ GuiProgressBar((Rectangle){ 320, 460, 200, 20 }, NULL, TextFormat("%i%%", (int)(progressValue*100)), &progressValue, 0.0f, 1.0f);
+ GuiEnable();
+
+ // NOTE: View rectangle could be used to perform some scissor test
+ Rectangle view = { 0 };
+ GuiScrollPanel((Rectangle){ 560, 25, 102, 354 }, NULL, (Rectangle){ 560, 25, 300, 1200 }, &viewScroll, &view);
+
+ Vector2 mouseCell = { 0 };
+ GuiGrid((Rectangle) { 560, 25 + 180 + 195, 100, 120 }, NULL, 20, 3, &mouseCell);
+
+ GuiColorBarAlpha((Rectangle){ 320, 490, 200, 30 }, NULL, &alphaValue);
+
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_TOP); // WARNING: Word-wrap does not work as expected in case of no-top alignment
+ GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_WORD); // WARNING: If wrap mode enabled, text editing is not supported
+ if (GuiTextBox((Rectangle){ 678, 25, 258, 492 }, textBoxMultiText, 1024, textBoxMultiEditMode)) textBoxMultiEditMode = !textBoxMultiEditMode;
+ GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE);
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE);
+
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiStatusBar((Rectangle){ 0, (float)GetScreenHeight() - 20, (float)GetScreenWidth(), 20 }, "This is a status bar");
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ //GuiSetStyle(STATUSBAR, TEXT_INDENTATION, 20);
+
+ if (showMessageBox)
+ {
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
+ int result = GuiMessageBox((Rectangle){ (float)GetScreenWidth()/2 - 125, (float)GetScreenHeight()/2 - 50, 250, 100 }, GuiIconText(ICON_EXIT, "Close Window"), "Do you really want to exit?", "Yes;No");
+
+ if ((result == 0) || (result == 2)) showMessageBox = false;
+ else if (result == 1) exitWindow = true;
+ }
+
+ if (showTextInputBox)
+ {
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
+ int result = GuiTextInputBox((Rectangle){ (float)GetScreenWidth()/2 - 120, (float)GetScreenHeight()/2 - 60, 240, 140 }, GuiIconText(ICON_FILE_SAVE, "Save file as..."), "Introduce output file name:", "Ok;Cancel", textInput, 255, NULL);
+
+ if (result == 1)
+ {
+ // TODO: Validate textInput value and save
+
+ TextCopy(textInputFileName, textInput);
+ }
+
+ if ((result == 0) || (result == 1) || (result == 2))
+ {
+ showTextInputBox = false;
+ TextCopy(textInput, "\0");
+ }
+ }
+ //----------------------------------------------------------------------------------
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/custom_file_dialog/cat.png b/external/raygui-4.0/examples/custom_file_dialog/cat.png
new file mode 100644
index 0000000..d023aa2
Binary files /dev/null and b/external/raygui-4.0/examples/custom_file_dialog/cat.png differ
diff --git a/external/raygui-4.0/examples/custom_file_dialog/custom_file_dialog.c b/external/raygui-4.0/examples/custom_file_dialog/custom_file_dialog.c
new file mode 100644
index 0000000..9762530
--- /dev/null
+++ b/external/raygui-4.0/examples/custom_file_dialog/custom_file_dialog.c
@@ -0,0 +1,111 @@
+/*******************************************************************************************
+*
+* raygui - custom file dialog to load image
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2016-2023 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+#undef RAYGUI_IMPLEMENTATION // Avoid including raygui implementation again
+#define GUI_WINDOW_FILE_DIALOG_IMPLEMENTATION
+#include "gui_window_file_dialog.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ int screenWidth = 800;
+ int screenHeight = 560;
+
+ InitWindow(screenWidth, screenHeight, "raygui - custom modal dialog");
+ SetExitKey(0);
+
+ // Custom file dialog
+ GuiWindowFileDialogState fileDialogState = InitGuiWindowFileDialog(GetWorkingDirectory());
+
+ bool exitWindow = false;
+
+ char fileNameToLoad[512] = { 0 };
+
+ Texture texture = { 0 };
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!exitWindow) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ exitWindow = WindowShouldClose();
+
+ if (fileDialogState.SelectFilePressed)
+ {
+ // Load image file (if supported extension)
+ if (IsFileExtension(fileDialogState.fileNameText, ".png"))
+ {
+ strcpy(fileNameToLoad, TextFormat("%s" PATH_SEPERATOR "%s", fileDialogState.dirPathText, fileDialogState.fileNameText));
+ UnloadTexture(texture);
+ texture = LoadTexture(fileNameToLoad);
+ }
+
+ fileDialogState.SelectFilePressed = false;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ DrawTexture(texture, GetScreenWidth()/2 - texture.width/2, GetScreenHeight()/2 - texture.height/2 - 5, WHITE);
+ DrawRectangleLines(GetScreenWidth()/2 - texture.width/2, GetScreenHeight()/2 - texture.height/2 - 5, texture.width, texture.height, BLACK);
+
+ DrawText(fileNameToLoad, 208, GetScreenHeight() - 20, 10, GRAY);
+
+ // raygui: controls drawing
+ //----------------------------------------------------------------------------------
+ if (fileDialogState.windowActive) GuiLock();
+
+ if (GuiButton((Rectangle){ 20, 20, 140, 30 }, GuiIconText(ICON_FILE_OPEN, "Open Image"))) fileDialogState.windowActive = true;
+
+ GuiUnlock();
+
+ // GUI: Dialog Window
+ //--------------------------------------------------------------------------------
+ GuiWindowFileDialog(&fileDialogState);
+ //--------------------------------------------------------------------------------
+
+ //----------------------------------------------------------------------------------
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadTexture(texture); // Unload texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/custom_file_dialog/gui_window_file_dialog.h b/external/raygui-4.0/examples/custom_file_dialog/gui_window_file_dialog.h
new file mode 100644
index 0000000..769e095
--- /dev/null
+++ b/external/raygui-4.0/examples/custom_file_dialog/gui_window_file_dialog.h
@@ -0,0 +1,625 @@
+/*******************************************************************************************
+*
+* Window File Dialog v1.2 - Modal file dialog to open/save files
+*
+* MODULE USAGE:
+* #define GUI_WINDOW_FILE_DIALOG_IMPLEMENTATION
+* #include "gui_window_file_dialog.h"
+*
+* INIT: GuiWindowFileDialogState state = GuiInitWindowFileDialog();
+* DRAW: GuiWindowFileDialog(&state);
+*
+* NOTE: This module depends on some raylib file system functions:
+* - LoadDirectoryFiles()
+* - UnloadDirectoryFiles()
+* - GetWorkingDirectory()
+* - DirectoryExists()
+* - FileExists()
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2019-2023 Ramon Santamaria (@raysan5)
+*
+* 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"
+
+#ifndef GUI_WINDOW_FILE_DIALOG_H
+#define GUI_WINDOW_FILE_DIALOG_H
+
+// Gui file dialog context data
+typedef struct {
+
+ // Window management variables
+ bool windowActive;
+ Rectangle windowBounds;
+ Vector2 panOffset;
+ bool dragMode;
+ bool supportDrag;
+
+ // UI variables
+ bool dirPathEditMode;
+ char dirPathText[1024];
+
+ int filesListScrollIndex;
+ bool filesListEditMode;
+ int filesListActive;
+
+ bool fileNameEditMode;
+ char fileNameText[1024];
+ bool SelectFilePressed;
+ bool CancelFilePressed;
+ int fileTypeActive;
+ int itemFocused;
+
+ // Custom state variables
+ FilePathList dirFiles;
+ char filterExt[256];
+ char dirPathTextCopy[1024];
+ char fileNameTextCopy[1024];
+
+ int prevFilesListActive;
+
+ bool saveFileMode;
+
+} GuiWindowFileDialogState;
+
+#ifdef __cplusplus
+extern "C" { // Prevents name mangling of functions
+#endif
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+//...
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+//...
+
+//----------------------------------------------------------------------------------
+// Module Functions Declaration
+//----------------------------------------------------------------------------------
+GuiWindowFileDialogState InitGuiWindowFileDialog(const char *initPath);
+void GuiWindowFileDialog(GuiWindowFileDialogState *state);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // GUI_WINDOW_FILE_DIALOG_H
+
+/***********************************************************************************
+*
+* GUI_WINDOW_FILE_DIALOG IMPLEMENTATION
+*
+************************************************************************************/
+#if defined(GUI_WINDOW_FILE_DIALOG_IMPLEMENTATION)
+
+#include "../../src/raygui.h"
+
+#include // Required for: strcpy()
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+#define MAX_DIRECTORY_FILES 2048
+#define MAX_ICON_PATH_LENGTH 512
+#ifdef _WIN32
+#define PATH_SEPERATOR "\\"
+#else
+#define PATH_SEPERATOR "/"
+#endif
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+#if defined(USE_CUSTOM_LISTVIEW_FILEINFO)
+// Detailed file info type
+typedef struct FileInfo {
+ const char *name;
+ int size;
+ int modTime;
+ int type;
+ int icon;
+} FileInfo;
+#else
+// Filename only
+typedef char *FileInfo; // Files are just a path string
+#endif
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+FileInfo *dirFilesIcon = NULL; // Path string + icon (for fancy drawing)
+
+//----------------------------------------------------------------------------------
+// Internal Module Functions Definition
+//----------------------------------------------------------------------------------
+// Read files in new path
+static void ReloadDirectoryFiles(GuiWindowFileDialogState *state);
+
+#if defined(USE_CUSTOM_LISTVIEW_FILEINFO)
+// List View control for files info with extended parameters
+static int GuiListViewFiles(Rectangle bounds, FileInfo *files, int count, int *focus, int *scrollIndex, int active);
+#endif
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition
+//----------------------------------------------------------------------------------
+GuiWindowFileDialogState InitGuiWindowFileDialog(const char *initPath)
+{
+ GuiWindowFileDialogState state = { 0 };
+
+ // Init window data
+ state.windowBounds = (Rectangle){ GetScreenWidth()/2 - 440/2, GetScreenHeight()/2 - 310/2, 440, 310 };
+ state.windowActive = false;
+ state.supportDrag = true;
+ state.dragMode = false;
+ state.panOffset = (Vector2){ 0, 0 };
+
+ // Init path data
+ state.dirPathEditMode = false;
+ state.filesListActive = -1;
+ state.prevFilesListActive = state.filesListActive;
+ state.filesListScrollIndex = 0;
+
+ state.fileNameEditMode = false;
+
+ state.SelectFilePressed = false;
+ state.CancelFilePressed = false;
+
+ state.fileTypeActive = 0;
+
+ strcpy(state.fileNameText, "\0");
+
+ // Custom variables initialization
+ if (initPath && DirectoryExists(initPath))
+ {
+ strcpy(state.dirPathText, initPath);
+ }
+ else if (initPath && FileExists(initPath))
+ {
+ strcpy(state.dirPathText, GetDirectoryPath(initPath));
+ strcpy(state.fileNameText, GetFileName(initPath));
+ }
+ else strcpy(state.dirPathText, GetWorkingDirectory());
+
+ // TODO: Why we keep a copy?
+ strcpy(state.dirPathTextCopy, state.dirPathText);
+ strcpy(state.fileNameTextCopy, state.fileNameText);
+
+ state.filterExt[0] = '\0';
+ //strcpy(state.filterExt, "all");
+
+ state.dirFiles.count = 0;
+
+ return state;
+}
+
+// Update and draw file dialog
+void GuiWindowFileDialog(GuiWindowFileDialogState *state)
+{
+ if (state->windowActive)
+ {
+ // Update window dragging
+ //----------------------------------------------------------------------------------------
+ if (state->supportDrag)
+ {
+ Vector2 mousePosition = GetMousePosition();
+
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ // Window can be dragged from the top window bar
+ if (CheckCollisionPointRec(mousePosition, (Rectangle){ state->windowBounds.x, state->windowBounds.y, (float)state->windowBounds.width, RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }))
+ {
+ state->dragMode = true;
+ state->panOffset.x = mousePosition.x - state->windowBounds.x;
+ state->panOffset.y = mousePosition.y - state->windowBounds.y;
+ }
+ }
+
+ if (state->dragMode)
+ {
+ state->windowBounds.x = (mousePosition.x - state->panOffset.x);
+ state->windowBounds.y = (mousePosition.y - state->panOffset.y);
+
+ // Check screen limits to avoid moving out of screen
+ if (state->windowBounds.x < 0) state->windowBounds.x = 0;
+ else if (state->windowBounds.x > (GetScreenWidth() - state->windowBounds.width)) state->windowBounds.x = GetScreenWidth() - state->windowBounds.width;
+
+ if (state->windowBounds.y < 0) state->windowBounds.y = 0;
+ else if (state->windowBounds.y > (GetScreenHeight() - state->windowBounds.height)) state->windowBounds.y = GetScreenHeight() - state->windowBounds.height;
+
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) state->dragMode = false;
+ }
+ }
+ //----------------------------------------------------------------------------------------
+
+ // Load dirFilesIcon and state->dirFiles lazily on windows open
+ // NOTE: They are automatically unloaded at fileDialog closing
+ //----------------------------------------------------------------------------------------
+ if (dirFilesIcon == NULL)
+ {
+ dirFilesIcon = (FileInfo *)RL_CALLOC(MAX_DIRECTORY_FILES, sizeof(FileInfo)); // Max files to read
+ for (int i = 0; i < MAX_DIRECTORY_FILES; i++) dirFilesIcon[i] = (char *)RL_CALLOC(MAX_ICON_PATH_LENGTH, 1); // Max file name length
+ }
+
+ // Load current directory files
+ if (state->dirFiles.paths == NULL) ReloadDirectoryFiles(state);
+ //----------------------------------------------------------------------------------------
+
+ // Draw window and controls
+ //----------------------------------------------------------------------------------------
+ state->windowActive = !GuiWindowBox(state->windowBounds, "#198# Select File Dialog");
+
+ // Draw previous directory button + logic
+ if (GuiButton((Rectangle){ state->windowBounds.x + state->windowBounds.width - 48, state->windowBounds.y + 24 + 12, 40, 24 }, "< .."))
+ {
+ // Move dir path one level up
+ strcpy(state->dirPathText, GetPrevDirectoryPath(state->dirPathText));
+
+ // Reload directory files (frees previous list)
+ ReloadDirectoryFiles(state);
+
+ state->filesListActive = -1;
+ memset(state->fileNameText, 0, 1024);
+ memset(state->fileNameTextCopy, 0, 1024);
+ }
+
+ // Draw current directory text box info + path editing logic
+ if (GuiTextBox((Rectangle){ state->windowBounds.x + 8, state->windowBounds.y + 24 + 12, state->windowBounds.width - 48 - 16, 24 }, state->dirPathText, 1024, state->dirPathEditMode))
+ {
+ if (state->dirPathEditMode)
+ {
+ // Verify if a valid path has been introduced
+ if (DirectoryExists(state->dirPathText))
+ {
+ // Reload directory files (frees previous list)
+ ReloadDirectoryFiles(state);
+
+ strcpy(state->dirPathTextCopy, state->dirPathText);
+ }
+ else strcpy(state->dirPathText, state->dirPathTextCopy);
+ }
+
+ state->dirPathEditMode = !state->dirPathEditMode;
+ }
+
+ // List view elements are aligned left
+ int prevTextAlignment = GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT);
+ int prevElementsHeight = GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ GuiSetStyle(LISTVIEW, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, 24);
+# if defined(USE_CUSTOM_LISTVIEW_FILEINFO)
+ state->filesListActive = GuiListViewFiles((Rectangle){ state->position.x + 8, state->position.y + 48 + 20, state->windowBounds.width - 16, state->windowBounds.height - 60 - 16 - 68 }, fileInfo, state->dirFiles.count, &state->itemFocused, &state->filesListScrollIndex, state->filesListActive);
+# else
+ GuiListViewEx((Rectangle){ state->windowBounds.x + 8, state->windowBounds.y + 48 + 20, state->windowBounds.width - 16, state->windowBounds.height - 60 - 16 - 68 },
+ (const char**)dirFilesIcon, state->dirFiles.count, &state->filesListScrollIndex, &state->filesListActive, &state->itemFocused);
+# endif
+ GuiSetStyle(LISTVIEW, TEXT_ALIGNMENT, prevTextAlignment);
+ GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, prevElementsHeight);
+
+ // Check if a path has been selected, if it is a directory, move to that directory (and reload paths)
+ if ((state->filesListActive >= 0) && (state->filesListActive != state->prevFilesListActive))
+ //&& (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsKeyPressed(KEY_ENTER) || IsKeyPressed(KEY_DPAD_A)))
+ {
+ strcpy(state->fileNameText, GetFileName(state->dirFiles.paths[state->filesListActive]));
+
+ if (DirectoryExists(TextFormat("%s/%s", state->dirPathText, state->fileNameText)))
+ {
+ if (TextIsEqual(state->fileNameText, "..")) strcpy(state->dirPathText, GetPrevDirectoryPath(state->dirPathText));
+ else strcpy(state->dirPathText, TextFormat("%s/%s", (strcmp(state->dirPathText, "/") == 0)? "" : state->dirPathText, state->fileNameText));
+
+ strcpy(state->dirPathTextCopy, state->dirPathText);
+
+ // Reload directory files (frees previous list)
+ ReloadDirectoryFiles(state);
+
+ strcpy(state->dirPathTextCopy, state->dirPathText);
+
+ state->filesListActive = -1;
+ strcpy(state->fileNameText, "\0");
+ strcpy(state->fileNameTextCopy, state->fileNameText);
+ }
+
+ state->prevFilesListActive = state->filesListActive;
+ }
+
+ // Draw bottom controls
+ //--------------------------------------------------------------------------------------
+ GuiLabel((Rectangle){ state->windowBounds.x + 8, state->windowBounds.y + state->windowBounds.height - 68, 60, 24 }, "File name:");
+ if (GuiTextBox((Rectangle){ state->windowBounds.x + 72, state->windowBounds.y + state->windowBounds.height - 68, state->windowBounds.width - 184, 24 }, state->fileNameText, 128, state->fileNameEditMode))
+ {
+ if (*state->fileNameText)
+ {
+ // Verify if a valid filename has been introduced
+ if (FileExists(TextFormat("%s/%s", state->dirPathText, state->fileNameText)))
+ {
+ // Select filename from list view
+ for (int i = 0; i < state->dirFiles.count; i++)
+ {
+ if (TextIsEqual(state->fileNameText, state->dirFiles.paths[i]))
+ {
+ state->filesListActive = i;
+ strcpy(state->fileNameTextCopy, state->fileNameText);
+ break;
+ }
+ }
+ }
+ else if (!state->saveFileMode)
+ {
+ strcpy(state->fileNameText, state->fileNameTextCopy);
+ }
+ }
+
+ state->fileNameEditMode = !state->fileNameEditMode;
+ }
+
+ GuiLabel((Rectangle){ state->windowBounds.x + 8, state->windowBounds.y + state->windowBounds.height - 24 - 12, 68, 24 }, "File filter:");
+ GuiComboBox((Rectangle){ state->windowBounds.x + 72, state->windowBounds.y + state->windowBounds.height - 24 - 12, state->windowBounds.width - 184, 24 }, "All files", &state->fileTypeActive);
+
+ state->SelectFilePressed = GuiButton((Rectangle){ state->windowBounds.x + state->windowBounds.width - 96 - 8, state->windowBounds.y + state->windowBounds.height - 68, 96, 24 }, "Select");
+
+ if (GuiButton((Rectangle){ state->windowBounds.x + state->windowBounds.width - 96 - 8, state->windowBounds.y + state->windowBounds.height - 24 - 12, 96, 24 }, "Cancel")) state->windowActive = false;
+ //--------------------------------------------------------------------------------------
+
+ // Exit on file selected
+ if (state->SelectFilePressed) state->windowActive = false;
+
+ // File dialog has been closed, free all memory before exit
+ if (!state->windowActive)
+ {
+ // Free dirFilesIcon memory
+ for (int i = 0; i < MAX_DIRECTORY_FILES; i++) RL_FREE(dirFilesIcon[i]);
+
+ RL_FREE(dirFilesIcon);
+ dirFilesIcon = NULL;
+
+ // Unload directory file paths
+ UnloadDirectoryFiles(state->dirFiles);
+
+ // Reset state variables
+ state->dirFiles.count = 0;
+ state->dirFiles.capacity = 0;
+ state->dirFiles.paths = NULL;
+ }
+ }
+}
+
+// Compare two files from a directory
+static inline int FileCompare(const char *d1, const char *d2, const char *dir)
+{
+ const bool b1 = DirectoryExists(TextFormat("%s/%s", dir, d1));
+ const bool b2 = DirectoryExists(TextFormat("%s/%s", dir, d2));
+
+ if (b1 && !b2) return -1;
+ if (!b1 && b2) return 1;
+
+ if (!FileExists(TextFormat("%s/%s", dir, d1))) return 1;
+ if (!FileExists(TextFormat("%s/%s", dir, d2))) return -1;
+
+ return strcmp(d1, d2);
+}
+
+// Read files in new path
+static void ReloadDirectoryFiles(GuiWindowFileDialogState *state)
+{
+ UnloadDirectoryFiles(state->dirFiles);
+
+ state->dirFiles = LoadDirectoryFilesEx(state->dirPathText, (state->filterExt[0] == '\0')? NULL : state->filterExt, false);
+ state->itemFocused = 0;
+
+ // Reset dirFilesIcon memory
+ for (int i = 0; i < MAX_DIRECTORY_FILES; i++) memset(dirFilesIcon[i], 0, MAX_ICON_PATH_LENGTH);
+
+ // Copy paths as icon + fileNames into dirFilesIcon
+ for (int i = 0; i < state->dirFiles.count; i++)
+ {
+ if (IsPathFile(state->dirFiles.paths[i]))
+ {
+ // Path is a file, a file icon for convenience (for some recognized extensions)
+ if (IsFileExtension(state->dirFiles.paths[i], ".png;.bmp;.tga;.gif;.jpg;.jpeg;.psd;.hdr;.qoi;.dds;.pkm;.ktx;.pvr;.astc"))
+ {
+ strcpy(dirFilesIcon[i], TextFormat("#12#%s", GetFileName(state->dirFiles.paths[i])));
+ }
+ else if (IsFileExtension(state->dirFiles.paths[i], ".wav;.mp3;.ogg;.flac;.xm;.mod;.it;.wma;.aiff"))
+ {
+ strcpy(dirFilesIcon[i], TextFormat("#11#%s", GetFileName(state->dirFiles.paths[i])));
+ }
+ else if (IsFileExtension(state->dirFiles.paths[i], ".txt;.info;.md;.nfo;.xml;.json;.c;.cpp;.cs;.lua;.py;.glsl;.vs;.fs"))
+ {
+ strcpy(dirFilesIcon[i], TextFormat("#10#%s", GetFileName(state->dirFiles.paths[i])));
+ }
+ else if (IsFileExtension(state->dirFiles.paths[i], ".exe;.bin;.raw;.msi"))
+ {
+ strcpy(dirFilesIcon[i], TextFormat("#200#%s", GetFileName(state->dirFiles.paths[i])));
+ }
+ else strcpy(dirFilesIcon[i], TextFormat("#218#%s", GetFileName(state->dirFiles.paths[i])));
+ }
+ else
+ {
+ // Path is a directory, add a directory icon
+ strcpy(dirFilesIcon[i], TextFormat("#1#%s", GetFileName(state->dirFiles.paths[i])));
+ }
+ }
+}
+
+#if defined(USE_CUSTOM_LISTVIEW_FILEINFO)
+// List View control for files info with extended parameters
+static int GuiListViewFiles(Rectangle bounds, FileInfo *files, int count, int *focus, int *scrollIndex, int *active)
+{
+ int result = 0;
+ GuiState state = guiState;
+ int itemFocused = (focus == NULL)? -1 : *focus;
+ int itemSelected = *active;
+
+ // Check if we need a scroll bar
+ bool useScrollBar = false;
+ if ((GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING))*count > bounds.height) useScrollBar = true;
+
+ // Define base item rectangle [0]
+ Rectangle itemBounds = { 0 };
+ itemBounds.x = bounds.x + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING);
+ itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING) + GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ itemBounds.width = bounds.width - 2*GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING) - GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ itemBounds.height = GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ if (useScrollBar) itemBounds.width -= GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH);
+
+ // Get items on the list
+ int visibleItems = bounds.height/(GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING));
+ if (visibleItems > count) visibleItems = count;
+
+ int startIndex = (scrollIndex == NULL)? 0 : *scrollIndex;
+ if ((startIndex < 0) || (startIndex > (count - visibleItems))) startIndex = 0;
+ int endIndex = startIndex + visibleItems;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != GUI_STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check mouse inside list view
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = GUI_STATE_FOCUSED;
+
+ // Check focused and selected item
+ for (int i = 0; i < visibleItems; i++)
+ {
+ if (CheckCollisionPointRec(mousePoint, itemBounds))
+ {
+ itemFocused = startIndex + i;
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) itemSelected = startIndex + i;
+ break;
+ }
+
+ // Update item rectangle y position for next item
+ itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING));
+ }
+
+ if (useScrollBar)
+ {
+ int wheelMove = GetMouseWheelMove();
+ startIndex -= wheelMove;
+
+ if (startIndex < 0) startIndex = 0;
+ else if (startIndex > (count - visibleItems)) startIndex = count - visibleItems;
+
+ endIndex = startIndex + visibleItems;
+ if (endIndex > count) endIndex = count;
+ }
+ }
+ else itemFocused = -1;
+
+ // Reset item rectangle y to [0]
+ itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING) + GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ DrawRectangleRec(bounds, GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background
+ DrawRectangleLinesEx(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), guiAlpha));
+
+ // TODO: Draw list view header with file sections: icon+name | size | type | modTime
+
+ // Draw visible items
+ for (int i = 0; i < visibleItems; i++)
+ {
+ if (state == GUI_STATE_DISABLED)
+ {
+ if ((startIndex + i) == itemSelected)
+ {
+ DrawRectangleRec(itemBounds, Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED)), guiAlpha));
+ DrawRectangleLinesEx(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), guiAlpha));
+ }
+
+ // TODO: Draw full file info line: icon+name | size | type | modTime
+
+ GuiDrawText(files[startIndex + i].name, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED)), guiAlpha));
+ }
+ else
+ {
+ if ((startIndex + i) == itemSelected)
+ {
+ // Draw item selected
+ DrawRectangleRec(itemBounds, Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED)), guiAlpha));
+ DrawRectangleLinesEx(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), guiAlpha));
+
+ GuiDrawText(files[startIndex + i].name, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED)), guiAlpha));
+ }
+ else if ((startIndex + i) == itemFocused)
+ {
+ // Draw item focused
+ DrawRectangleRec(itemBounds, Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED)), guiAlpha));
+ DrawRectangleLinesEx(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), guiAlpha));
+
+ GuiDrawText(files[startIndex + i].name, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED)), guiAlpha));
+ }
+ else
+ {
+ // Draw item normal
+ GuiDrawText(files[startIndex + i].name, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL)), guiAlpha));
+ }
+ }
+
+ // Update item rectangle y position for next item
+ itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING));
+ }
+
+ if (useScrollBar)
+ {
+ Rectangle scrollBarBounds = {
+ bounds.x + bounds.width - GuiGetStyle(LISTVIEW, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH),
+ bounds.y + GuiGetStyle(LISTVIEW, BORDER_WIDTH), (float)GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH),
+ bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH)
+ };
+
+ // Calculate percentage of visible items and apply same percentage to scrollbar
+ float percentVisible = (float)(endIndex - startIndex)/count;
+ float sliderSize = bounds.height*percentVisible;
+
+ int prevSliderSize = GuiGetStyle(SCROLLBAR, SLIDER_WIDTH); // Save default slider size
+ int prevScrollSpeed = GuiGetStyle(SCROLLBAR, SCROLL_SPEED); // Save default scroll speed
+ GuiSetStyle(SCROLLBAR, SLIDER_WIDTH, sliderSize); // Change slider size
+ GuiSetStyle(SCROLLBAR, SCROLL_SPEED, count - visibleItems); // Change scroll speed
+
+ startIndex = GuiScrollBar(scrollBarBounds, startIndex, 0, count - visibleItems);
+
+ GuiSetStyle(SCROLLBAR, SCROLL_SPEED, prevScrollSpeed); // Reset scroll speed to default
+ GuiSetStyle(SCROLLBAR, SLIDER_WIDTH, prevSliderSize); // Reset slider size to default
+ }
+ //--------------------------------------------------------------------
+
+ if (focus != NULL) *focus = itemFocused;
+ if (scrollIndex != NULL) *scrollIndex = startIndex;
+
+ *active = itemSelected;
+ return result;
+}
+#endif // USE_CUSTOM_LISTVIEW_FILEINFO
+
+#endif // GUI_FILE_DIALOG_IMPLEMENTATION
diff --git a/external/raygui-4.0/examples/custom_input_box/custom_input_box.c b/external/raygui-4.0/examples/custom_input_box/custom_input_box.c
new file mode 100644
index 0000000..bb2b991
--- /dev/null
+++ b/external/raygui-4.0/examples/custom_input_box/custom_input_box.c
@@ -0,0 +1,260 @@
+/*******************************************************************************************
+*
+* raygui - basic calculator app with custom input box for float values
+*
+* DEPENDENCIES:
+* raylib 4.5 - Windowing/input management and drawing.
+* raygui 3.5 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+**********************************************************************************************/
+
+#include
+
+#define RAYGUI_IMPLEMENTATION
+#include
+
+int guiFloatingPointIndex = 0; // Global variable shared by all GuiFLoatBox()
+
+float TextToFloat(const char* text); // Helper function that converts text to float
+int GuiFloatBox(Rectangle bounds, const char* text, float* value, int minValue, int maxValue, bool editMode); // Custom input box that works with float values. Basicly GuiValueBox(), but with some changes
+
+int main()
+{
+ InitWindow(250, 100, "Basic calculator");
+
+ // General variables
+ SetTargetFPS(60);
+
+ float variableA = 0.0f;
+ float variableB = 0.0f;
+ float result = 0.0f;
+ char operation[2];
+ operation[0] = '+';
+ operation[1] = '\0';
+
+ bool variableAMode = false;
+ bool variableBMode = false;
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose())
+ {
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (GuiFloatBox((Rectangle){ 10, 10, 100, 20 }, NULL, &variableA, -1000000.0, 1000000.0, variableAMode)) variableAMode = !variableAMode;
+ if (GuiFloatBox((Rectangle){ 140, 10, 100, 20 }, NULL, &variableB, -1000000.0, 1000000.0, variableBMode)) variableBMode = !variableBMode;
+
+ if (GuiButton((Rectangle){ 10, 70, 50, 20 }, "+"))
+ {
+ result = variableA + variableB;
+ operation[0] = '+';
+ }
+ if (GuiButton((Rectangle){ 70, 70, 50, 20 }, "-"))
+ {
+ result = variableA - variableB;
+ operation[0] = '-';
+ }
+ if (GuiButton((Rectangle){ 130, 70, 50, 20 }, "*"))
+ {
+ result = variableA * variableB;
+ operation[0] = '*';
+ }
+ if (GuiButton((Rectangle){ 190, 70, 50, 20 }, "/"))
+ {
+ result = variableA / variableB;
+ operation[0] = '/';
+ }
+
+ DrawText(operation, 123, 15, 10, DARKGRAY);
+
+ GuiFloatBox((Rectangle){ 55, 40, 135, 20 }, "= ", &result, -2000000.0, 2000000.0, false);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ CloseWindow();
+}
+
+// Get float value from text
+float TextToFloat(const char* text)
+{
+ float value = 0.0f;
+ float floatingPoint = 0.0f;
+ int sign = 1;
+
+ // deal with the sign
+ if ((text[0] == '+') || (text[0] == '-'))
+ {
+ if (text[0] == '-') sign = -1;
+ text++;
+ }
+
+ // convert text to float
+ for (int i = 0; (((text[i] >= '0') && (text[i] <= '9')) || text[i] == '.'); i++)
+ {
+ if (text[i] == '.')
+ {
+ if (floatingPoint > 0.0f) break;
+
+ floatingPoint = 10.0f;
+ continue;
+ }
+ if (floatingPoint > 0.0f) // after encountering decimal separator
+ {
+ value += (float)(text[i] - '0') / floatingPoint;
+ floatingPoint *= 10.0f;
+ }
+ else // before decimal separator
+ value = value * 10.0f + (float)(text[i] - '0');
+ }
+
+ return value * sign;
+}
+
+// Float Box control, updates input text with numbers
+int GuiFloatBox(Rectangle bounds, const char* text, float* value, int minValue, int maxValue, bool editMode)
+{
+#if !defined(RAYGUI_VALUEBOX_MAX_CHARS)
+#define RAYGUI_VALUEBOX_MAX_CHARS 32
+#endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0";
+
+ Rectangle textBounds = { 0 };
+ if (text != NULL)
+ {
+ textBounds.width = (float)GetTextWidth(text) + 2;
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height / 2 - GuiGetStyle(DEFAULT, TEXT_SIZE) / 2;
+ if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING);
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (*value >= 0) sprintf(textValue, "+%.3f", *value);
+ else sprintf(textValue, "%.3f", *value);
+
+ bool valueHasChanged = false;
+
+ int keyCount = (int)strlen(textValue) - guiFloatingPointIndex;
+
+ if (editMode)
+ {
+ state = STATE_PRESSED;
+
+ // Only allow keys in range [48..57]
+ if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS)
+ {
+ if (GetTextWidth(textValue) < bounds.width)
+ {
+ int key = GetCharPressed();
+ if ((key >= 48) && (key <= 57) && guiFloatingPointIndex)
+ {
+ if (guiFloatingPointIndex && guiFloatingPointIndex != 4) guiFloatingPointIndex--;
+
+ textValue[keyCount] = (char)key;
+ textValue[++keyCount] = '\0';
+ valueHasChanged = true;
+ }
+ }
+ }
+
+ // Delete text
+ if (keyCount > 0)
+ {
+ if (IsKeyPressed(KEY_BACKSPACE))
+ {
+ if (guiFloatingPointIndex < 4) guiFloatingPointIndex++;
+
+ keyCount--;
+ textValue[keyCount] = '\0';
+ valueHasChanged = true;
+ }
+ }
+
+ // Change sign
+ if (IsKeyPressed(KEY_MINUS))
+ {
+ if (textValue[0] == '+') textValue[0] = '-';
+ else if (textValue[0] == '-') textValue[0] = '+';
+ valueHasChanged = true;
+ }
+
+ // Add decimal separator
+ if ((IsKeyPressed(KEY_COMMA) || IsKeyPressed(KEY_PERIOD)) && guiFloatingPointIndex == 4)
+ {
+ guiFloatingPointIndex--;
+ valueHasChanged = true;
+ }
+
+ if (valueHasChanged)
+ {
+ *value = TextToFloat(textValue);
+ }
+
+ if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)))
+ {
+ guiFloatingPointIndex = 0;
+ result = 1;
+ }
+ }
+ else
+ {
+ if (*value > maxValue) *value = maxValue;
+ else if (*value < minValue) *value = minValue;
+
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = STATE_FOCUSED;
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1;
+ }
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ Color baseColor = BLANK;
+ sprintf(textValue, "%.3f", *value);
+
+ if (state == STATE_PRESSED)
+ {
+ baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED));
+ textValue[(int)strlen(textValue) - guiFloatingPointIndex] = '\0';
+ }
+ else if (state == STATE_DISABLED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED));
+
+ // WARNING: BLANK color does not work properly with Fade()
+ GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(VALUEBOX, BORDER + (state * 3))), guiAlpha), baseColor);
+ GuiDrawText(textValue, GetTextBounds(VALUEBOX, bounds), TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(VALUEBOX, TEXT + (state * 3))), guiAlpha));
+
+ // Draw cursor
+ if (editMode)
+ {
+ // NOTE: ValueBox internal text is always centered
+ Rectangle cursor = { bounds.x + GetTextWidth(textValue) / 2 + bounds.width / 2 + 1, bounds.y + 2 * GuiGetStyle(VALUEBOX, BORDER_WIDTH), 4, bounds.height - 4 * GuiGetStyle(VALUEBOX, BORDER_WIDTH) };
+ GuiDrawRectangle(cursor, 0, BLANK, Fade(GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED)), guiAlpha));
+ }
+
+ // Draw text label if provided
+ GuiDrawText(text, textBounds, (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT) ? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(LABEL, TEXT + (state * 3))), guiAlpha));
+ //--------------------------------------------------------------------
+
+ return result;
+}
diff --git a/external/raygui-4.0/examples/custom_sliders/custom_sliders.c b/external/raygui-4.0/examples/custom_sliders/custom_sliders.c
new file mode 100644
index 0000000..84f80d9
--- /dev/null
+++ b/external/raygui-4.0/examples/custom_sliders/custom_sliders.c
@@ -0,0 +1,470 @@
+/*******************************************************************************************
+*
+* raygui - custom sliders
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2016-2023 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+//----------------------------------------------------------------------------------
+// Controls Functions Declaration
+//----------------------------------------------------------------------------------
+float GuiVerticalSlider(Rectangle bounds, const char *textTop, const char *textBottom, float value, float minValue, float maxValue);
+float GuiVerticalSliderBar(Rectangle bounds, const char *textTop, const char *textBottom, float value, float minValue, float maxValue);
+float GuiVerticalSliderPro(Rectangle bounds, const char *textTop, const char *textBottom, float value, float minValue, float maxValue, int sliderHeight);
+
+bool GuiSliderOwning(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, bool editMode);
+bool GuiSliderBarOwning(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, bool editMode);
+bool GuiSliderProOwning(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth, bool editMode);
+
+bool GuiVerticalSliderOwning(Rectangle bounds, const char *textTop, const char *textBottom, float *value, float minValue, float maxValue, bool editMode);
+bool GuiVerticalSliderBarOwning(Rectangle bounds, const char *textTop, const char *textBottom, float *value, float minValue, float maxValue, bool editMode);
+bool GuiVerticalSliderProOwning(Rectangle bounds, const char *textTop, const char *textBottom, float *value, float minValue, float maxValue, int sliderHeight, bool editMode);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ int screenWidth = 800;
+ int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raygui - custom sliders");
+
+ float value = 0.5f;
+ bool sliderEditMode = false;
+ bool vSliderEditMode = false;
+ bool vSliderBarEditMode = false;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // TODO: Implement required update logic
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ if (vSliderEditMode || vSliderBarEditMode) GuiLock();
+ else GuiUnlock();
+
+ // raygui: controls drawing
+ //----------------------------------------------------------------------------------
+ GuiGroupBox((Rectangle){ 66, 24, 276, 312 }, "STANDARD");
+ GuiSlider((Rectangle){ 96, 48, 216, 16 }, TextFormat("%0.2f", value), NULL, &value, 0.0f, 1.0f);
+ value = GuiVerticalSlider((Rectangle){ 120, 120, 24, 192 }, TextFormat("%0.2f", value), NULL, value, 0.0f, 1.0f);
+ value = GuiVerticalSliderBar((Rectangle){ 264, 120, 24, 192 }, TextFormat("%0.2f", value), NULL, value, 0.0f, 1.0f);
+
+ GuiGroupBox((Rectangle){ 378, 24, 276, 312 }, "OWNING");
+ if (GuiSliderOwning((Rectangle){ 408, 48, 216, 16 }, NULL, TextFormat("%0.2f", value), &value, 0.0f, 1.0f, sliderEditMode)) sliderEditMode = !sliderEditMode;
+ if (GuiVerticalSliderOwning((Rectangle){ 432, 120, 24, 192 }, NULL, TextFormat("%0.2f", value), &value, 0.0f, 1.0f, vSliderEditMode)) vSliderEditMode = !vSliderEditMode;
+ if (GuiVerticalSliderBarOwning((Rectangle){ 576, 120, 24, 192 }, NULL, TextFormat("%0.2f", value), &value, 0.0f, 1.0f, vSliderBarEditMode)) vSliderBarEditMode = !vSliderBarEditMode;
+ //----------------------------------------------------------------------------------
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------------
+// Controls Functions Definitions (local)
+//------------------------------------------------------------------------------------
+float GuiVerticalSliderPro(Rectangle bounds, const char *textTop, const char *textBottom, float value, float minValue, float maxValue, int sliderHeight)
+{
+ GuiState state = (GuiState)GuiGetState();
+
+ int sliderValue = (int)(((value - minValue)/(maxValue - minValue)) * (bounds.height - 2 * GuiGetStyle(SLIDER, BORDER_WIDTH)));
+
+ Rectangle slider = {
+ bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING),
+ bounds.y + bounds.height - sliderValue,
+ bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING),
+ 0.0f,
+ };
+
+ if (sliderHeight > 0) // Slider
+ {
+ slider.y -= sliderHeight/2;
+ slider.height = (float)sliderHeight;
+ }
+ else if (sliderHeight == 0) // SliderBar
+ {
+ slider.y -= GuiGetStyle(SLIDER, BORDER_WIDTH);
+ slider.height = (float)sliderValue;
+ }
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+
+ // Get equivalent value and slider position from mousePoint.x
+ float normalizedValue = (bounds.y + bounds.height - mousePoint.y - (float)(sliderHeight / 2)) / (bounds.height - (float)sliderHeight);
+ value = (maxValue - minValue) * normalizedValue + minValue;
+
+ if (sliderHeight > 0) slider.y = mousePoint.y - slider.height / 2; // Slider
+ else if (sliderHeight == 0) // SliderBar
+ {
+ slider.y = mousePoint.y;
+ slider.height = bounds.y + bounds.height - slider.y - GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ }
+ else state = STATE_FOCUSED;
+ }
+
+ if (value > maxValue) value = maxValue;
+ else if (value < minValue) value = minValue;
+ }
+
+
+ // Bar limits check
+ if (sliderHeight > 0) // Slider
+ {
+ if (slider.y < (bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.y = bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH);
+ else if ((slider.y + slider.height) >= (bounds.y + bounds.height)) slider.y = bounds.y + bounds.height - slider.height - GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ else if (sliderHeight == 0) // SliderBar
+ {
+ if (slider.y < (bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH)))
+ {
+ slider.y = bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH);
+ slider.height = bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ }
+
+ //--------------------------------------------------------------------
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)), guiAlpha));
+
+ // Draw slider internal bar (depends on state)
+ if ((state == STATE_NORMAL) || (state == STATE_PRESSED)) GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)), guiAlpha));
+ else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED)), guiAlpha));
+
+ // Draw top/bottom text if provided
+ if (textTop != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textTop);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width/2 - textBounds.width/2;
+ textBounds.y = bounds.y - textBounds.height - GuiGetStyle(SLIDER, TEXT_PADDING);
+
+ GuiDrawText(textTop, textBounds, TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha));
+ }
+
+ if (textBottom != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textBottom);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width/2 - textBounds.width/2;
+ textBounds.y = bounds.y + bounds.height + GuiGetStyle(SLIDER, TEXT_PADDING);
+
+ GuiDrawText(textBottom, textBounds, TEXT_ALIGN_LEFT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha));
+ }
+ //--------------------------------------------------------------------
+
+ return value;
+}
+
+float GuiVerticalSlider(Rectangle bounds, const char *textTop, const char *textBottom, float value, float minValue, float maxValue)
+{
+ return GuiVerticalSliderPro(bounds, textTop, textBottom, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH));
+}
+
+float GuiVerticalSliderBar(Rectangle bounds, const char *textTop, const char *textBottom, float value, float minValue, float maxValue)
+{
+ return GuiVerticalSliderPro(bounds, textTop, textBottom, value, minValue, maxValue, 0);
+}
+
+bool GuiSliderProOwning(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth, bool editMode)
+{
+ GuiState state = (GuiState)GuiGetState();
+
+ float tempValue = *value;
+ bool pressed = false;
+
+ int sliderValue = (int)(((tempValue - minValue)/(maxValue - minValue))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH)));
+
+ Rectangle slider = {
+ bounds.x,
+ bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING),
+ 0,
+ bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING)
+ };
+
+ if (sliderWidth > 0) // Slider
+ {
+ slider.x += (sliderValue - sliderWidth/2);
+ slider.width = (float)sliderWidth;
+ }
+ else if (sliderWidth == 0) // SliderBar
+ {
+ slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH);
+ slider.width = (float)sliderValue;
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && (editMode || !guiLocked))
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ pressed = true;
+ }
+ }
+ else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON) && editMode)
+ {
+ pressed = true;
+ }
+ if (editMode)
+ {
+ state = STATE_PRESSED;
+ tempValue = ((maxValue - minValue)*(mousePoint.x - (float)(bounds.x + sliderWidth/2)))/(float)(bounds.width - sliderWidth) + minValue;
+
+ if (sliderWidth > 0) slider.x = mousePoint.x - slider.width/2; // Slider
+ else if (sliderWidth == 0) slider.width = (float)sliderValue; // SliderBar
+
+ }
+ else if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = STATE_FOCUSED;
+ }
+
+ if (tempValue > maxValue) tempValue = maxValue;
+ else if (tempValue < minValue) tempValue = minValue;
+ }
+
+
+ // Bar limits check
+ if (sliderWidth > 0) // Slider
+ {
+ if (slider.x <= (bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH);
+ else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) slider.x = bounds.x + bounds.width - slider.width - GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ else if (sliderWidth == 0) // SliderBar
+ {
+ if (slider.width > bounds.width) slider.width = bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+
+ //--------------------------------------------------------------------
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)), guiAlpha));
+
+ // Draw slider internal bar (depends on state)
+ if ((state == STATE_NORMAL) || (state == STATE_PRESSED))
+ GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)), guiAlpha));
+ else if (state == STATE_FOCUSED)
+ GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED)), guiAlpha));
+
+ // Draw left/right text if provided
+ if (textLeft != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textLeft);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SLIDER, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha));
+ }
+
+ if (textRight != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textRight);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(SLIDER, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha));
+ }
+ //--------------------------------------------------------------------
+
+ *value = tempValue;
+ return pressed;
+}
+
+bool GuiSliderOwning(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, bool editMode)
+{
+ return GuiSliderProOwning(bounds, textLeft, textRight, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH), editMode);
+}
+
+bool GuiSliderBarOwning(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, bool editMode)
+{
+ return GuiSliderProOwning(bounds, textLeft, textRight, value, minValue, maxValue, 0, editMode);
+}
+
+bool GuiVerticalSliderProOwning(Rectangle bounds, const char *textTop, const char *textBottom, float *value, float minValue, float maxValue, int sliderHeight, bool editMode)
+{
+ GuiState state = (GuiState)GuiGetState();
+
+ float tempValue = *value;
+ bool pressed = false;
+
+ int sliderValue = (int)(((tempValue - minValue)/(maxValue - minValue)) * (bounds.height - 2 * GuiGetStyle(SLIDER, BORDER_WIDTH)));
+
+ Rectangle slider = {
+ bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING),
+ bounds.y + bounds.height - sliderValue,
+ bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING),
+ 0.0f,
+ };
+
+ if (sliderHeight > 0) // Slider
+ {
+ slider.y -= sliderHeight/2;
+ slider.height = (float)sliderHeight;
+ }
+ else if (sliderHeight == 0) // SliderBar
+ {
+ slider.y -= GuiGetStyle(SLIDER, BORDER_WIDTH);
+ slider.height = (float)sliderValue;
+ }
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && (editMode || !guiLocked))
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ pressed = true;
+ }
+ }
+ else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON) && editMode)
+ {
+ pressed = true;
+ }
+ if (editMode)
+ {
+ state = STATE_PRESSED;
+
+ float normalizedValue = (bounds.y + bounds.height - mousePoint.y - (float)(sliderHeight / 2)) / (bounds.height - (float)sliderHeight);
+ tempValue = (maxValue - minValue) * normalizedValue + minValue;
+
+ if (sliderHeight > 0) slider.y = mousePoint.y - slider.height / 2; // Slider
+ else if (sliderHeight == 0) // SliderBar
+ {
+ slider.y = mousePoint.y;
+ slider.height = bounds.y + bounds.height - slider.y - GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ }
+ else if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = STATE_FOCUSED;
+ }
+
+ if (tempValue > maxValue) tempValue = maxValue;
+ else if (tempValue < minValue) tempValue = minValue;
+ }
+
+
+ // Bar limits check
+ if (sliderHeight > 0) // Slider
+ {
+ if (slider.y < (bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.y = bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH);
+ else if ((slider.y + slider.height) >= (bounds.y + bounds.height)) slider.y = bounds.y + bounds.height - slider.height - GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ else if (sliderHeight == 0) // SliderBar
+ {
+ if (slider.y < (bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH)))
+ {
+ slider.y = bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH);
+ slider.height = bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ }
+
+ //--------------------------------------------------------------------
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)), guiAlpha));
+
+ // Draw slider internal bar (depends on state)
+ if ((state == STATE_NORMAL) || (state == STATE_PRESSED))
+ GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)), guiAlpha));
+ else if (state == STATE_FOCUSED)
+ GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED)), guiAlpha));
+
+ // Draw top/bottom text if provided
+ if (textTop != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textTop);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width/2 - textBounds.width/2;
+ textBounds.y = bounds.y - textBounds.height - GuiGetStyle(SLIDER, TEXT_PADDING);
+
+ GuiDrawText(textTop, textBounds, TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha));
+ }
+
+ if (textBottom != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textBottom);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width/2 - textBounds.width/2;
+ textBounds.y = bounds.y + bounds.height + GuiGetStyle(SLIDER, TEXT_PADDING);
+
+ GuiDrawText(textBottom, textBounds, TEXT_ALIGN_LEFT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha));
+ }
+ //--------------------------------------------------------------------
+
+ *value = tempValue;
+ return pressed;
+}
+
+bool GuiVerticalSliderOwning(Rectangle bounds, const char *textTop, const char *textBottom, float *value, float minValue, float maxValue, bool editMode)
+{
+ return GuiVerticalSliderProOwning(bounds, textTop, textBottom, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH), editMode);
+}
+
+bool GuiVerticalSliderBarOwning(Rectangle bounds, const char *textTop, const char *textBottom, float *value, float minValue, float maxValue, bool editMode)
+{
+ return GuiVerticalSliderProOwning(bounds, textTop, textBottom, value, minValue, maxValue, 0, editMode);
+}
diff --git a/external/raygui-4.0/examples/image_exporter/image_exporter.c b/external/raygui-4.0/examples/image_exporter/image_exporter.c
new file mode 100644
index 0000000..7fdf9bd
--- /dev/null
+++ b/external/raygui-4.0/examples/image_exporter/image_exporter.c
@@ -0,0 +1,192 @@
+/*******************************************************************************************
+*
+* raygui - image exporter
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(int argc, char *argv[])
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raygui - image exporter");
+
+ // GUI controls initialization
+ //----------------------------------------------------------------------------------
+ Rectangle windowBoxRec = { screenWidth/2 - 110, screenHeight/2 - 100, 220, 190 };
+ bool windowBoxActive = false;
+
+ int fileFormatActive = 0;
+ const char *fileFormatTextList[3] = { "IMAGE (.png)", "DATA (.raw)", "CODE (.h)" };
+
+ int pixelFormatActive = 0;
+ const char *pixelFormatTextList[7] = { "GRAYSCALE", "GRAY ALPHA", "R5G6B5", "R8G8B8", "R5G5B5A1", "R4G4B4A4", "R8G8B8A8" };
+
+ bool textBoxEditMode = false;
+ char fileName[64] = "untitled";
+ //--------------------------------------------------------------------------------------
+
+ Image image = { 0 };
+ Texture2D texture = { 0 };
+
+ bool imageLoaded = false;
+ float imageScale = 1.0f;
+ Rectangle imageRec = { 0 };
+
+ bool btnExportPressed = false;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ if (droppedFiles.count == 1)
+ {
+ Image imTemp = LoadImage(droppedFiles.paths[0]);
+
+ if (imTemp.data != NULL)
+ {
+ UnloadImage(image);
+ image = imTemp;
+
+ UnloadTexture(texture);
+ texture = LoadTextureFromImage(image);
+
+ imageLoaded = true;
+ pixelFormatActive = image.format - 1;
+
+ if (texture.height > texture.width) imageScale = (float)(screenHeight - 100)/(float)texture.height;
+ else imageScale = (float)(screenWidth - 100)/(float)texture.width;
+ }
+ }
+
+ UnloadDroppedFiles(droppedFiles);
+ }
+
+ if (btnExportPressed)
+ {
+ if (imageLoaded)
+ {
+ ImageFormat(&image, pixelFormatActive + 1);
+
+ if (fileFormatActive == 0) // PNG
+ {
+ if ((GetFileExtension(fileName) == NULL) || (!IsFileExtension(fileName, ".png"))) strcat(fileName, ".png\0"); // No extension provided
+ ExportImage(image, fileName);
+ }
+ else if (fileFormatActive == 1) // RAW
+ {
+ if ((GetFileExtension(fileName) == NULL) || (!IsFileExtension(fileName, ".raw"))) strcat(fileName, ".raw\0"); // No extension provided
+
+ int dataSize = GetPixelDataSize(image.width, image.height, image.format);
+
+ FILE *rawFile = fopen(fileName, "wb");
+ fwrite(image.data, 1, dataSize, rawFile);
+ fclose(rawFile);
+ }
+ else if (fileFormatActive == 2) // CODE
+ {
+ ExportImageAsCode(image, fileName);
+ }
+ }
+
+ windowBoxActive = false;
+ }
+
+ if (imageLoaded)
+ {
+ imageScale += (float)GetMouseWheelMove()*0.05f; // Image scale control
+ if (imageScale <= 0.1f) imageScale = 0.1f;
+ else if (imageScale >= 5) imageScale = 5;
+
+ imageRec = (Rectangle){ screenWidth/2 - (float)image.width*imageScale/2,
+ screenHeight/2 - (float)image.height*imageScale/2,
+ (float)image.width*imageScale, (float)image.height*imageScale };
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (texture.id > 0)
+ {
+ DrawTextureEx(texture, (Vector2){ screenWidth/2 - (float)texture.width*imageScale/2, screenHeight/2 - (float)texture.height*imageScale/2 }, 0.0f, imageScale, WHITE);
+
+ DrawRectangleLinesEx(imageRec, 1, CheckCollisionPointRec(GetMousePosition(), imageRec) ? RED : DARKGRAY);
+ DrawText(TextFormat("SCALE: %.2f%%", imageScale*100.0f), 20, screenHeight - 40, 20, GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)));
+ }
+ else
+ {
+ DrawText("DRAG & DROP YOUR IMAGE!", 350, 200, 10, DARKGRAY);
+ GuiDisable();
+ }
+
+ if (GuiButton((Rectangle){ screenWidth - 170, screenHeight - 50, 150, 30 }, "Image Export")) windowBoxActive = true;
+ GuiEnable();
+
+ // Draw window box: windowBoxName
+ //-----------------------------------------------------------------------------
+ if (windowBoxActive)
+ {
+ DrawRectangle(0, 0, screenWidth, screenHeight, Fade(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)), 0.7f));
+ windowBoxActive = !GuiWindowBox((Rectangle){ windowBoxRec.x, windowBoxRec.y, 220, 190 }, "Image Export Options");
+
+ GuiLabel((Rectangle){ windowBoxRec.x + 10, windowBoxRec.y + 35, 60, 25 }, "File format:");
+ GuiComboBox((Rectangle){ windowBoxRec.x + 80, windowBoxRec.y + 35, 130, 25 }, TextJoin(fileFormatTextList, 3, ";"), &fileFormatActive);
+ GuiLabel((Rectangle){ windowBoxRec.x + 10, windowBoxRec.y + 70, 63, 25 }, "Pixel format:");
+ GuiComboBox((Rectangle){ windowBoxRec.x + 80, windowBoxRec.y + 70, 130, 25 }, TextJoin(pixelFormatTextList, 7, ";"), &pixelFormatActive);
+ GuiLabel((Rectangle){ windowBoxRec.x + 10, windowBoxRec.y + 105, 50, 25 }, "File name:");
+ if (GuiTextBox((Rectangle){ windowBoxRec.x + 80, windowBoxRec.y + 105, 130, 25 }, fileName, 64, textBoxEditMode)) textBoxEditMode = !textBoxEditMode;
+
+ btnExportPressed = GuiButton((Rectangle){ windowBoxRec.x + 10, windowBoxRec.y + 145, 200, 30 }, "Export Image");
+ }
+ else btnExportPressed = false;
+
+ if (btnExportPressed) DrawText("Image exported!", 20, screenHeight - 20, 20, RED);
+ //-----------------------------------------------------------------------------
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadImage(image);
+ UnloadTexture(texture);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/image_exporter/resources/cat.png b/external/raygui-4.0/examples/image_exporter/resources/cat.png
new file mode 100644
index 0000000..d023aa2
Binary files /dev/null and b/external/raygui-4.0/examples/image_exporter/resources/cat.png differ
diff --git a/external/raygui-4.0/examples/image_exporter/resources/fudesumi.png b/external/raygui-4.0/examples/image_exporter/resources/fudesumi.png
new file mode 100644
index 0000000..9d9038f
Binary files /dev/null and b/external/raygui-4.0/examples/image_exporter/resources/fudesumi.png differ
diff --git a/external/raygui-4.0/examples/image_exporter/resources/parrots.png b/external/raygui-4.0/examples/image_exporter/resources/parrots.png
new file mode 100644
index 0000000..d6ec60b
Binary files /dev/null and b/external/raygui-4.0/examples/image_exporter/resources/parrots.png differ
diff --git a/external/raygui-4.0/examples/image_exporter/resources/scarfy.png b/external/raygui-4.0/examples/image_exporter/resources/scarfy.png
new file mode 100644
index 0000000..4803ef7
Binary files /dev/null and b/external/raygui-4.0/examples/image_exporter/resources/scarfy.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REF.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REF.png
new file mode 100644
index 0000000..6f16441
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REF.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV0.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV0.png
new file mode 100644
index 0000000..884b096
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV0.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV1.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV1.png
new file mode 100644
index 0000000..39b1b72
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV1.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV2.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV2.png
new file mode 100644
index 0000000..0797528
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV2.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV3.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV3.png
new file mode 100644
index 0000000..f396f6c
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV3.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV4.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV4.png
new file mode 100644
index 0000000..b128a62
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV4.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV5.png b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV5.png
new file mode 100644
index 0000000..3f5e012
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/design/raw_importer_REV5.png differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/image_2x2_RGBA.raw b/external/raygui-4.0/examples/image_importer_raw/image_2x2_RGBA.raw
new file mode 100644
index 0000000..1aa92cd
Binary files /dev/null and b/external/raygui-4.0/examples/image_importer_raw/image_2x2_RGBA.raw differ
diff --git a/external/raygui-4.0/examples/image_importer_raw/image_importer_raw.c b/external/raygui-4.0/examples/image_importer_raw/image_importer_raw.c
new file mode 100644
index 0000000..0d6c36b
--- /dev/null
+++ b/external/raygui-4.0/examples/image_importer_raw/image_importer_raw.c
@@ -0,0 +1,228 @@
+/*******************************************************************************************
+*
+* raygui - image raw importer
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+#include // Required for: strcpy()
+#include // Required for: atoi()
+#include // Required for: round()
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 600;
+
+ InitWindow(screenWidth, screenHeight, "raygui - image raw importer");
+
+ Texture2D texture = { 0 };
+
+ // GUI controls initialization
+ //----------------------------------------------------------------------------------
+ Vector2 windowOffset = { screenWidth/2 - 200/2, screenHeight/2 - 465/2 };
+
+ bool importWindowActive = false;
+
+ int widthValue = 0;
+ bool widthEditMode = false;
+ int heightValue = 0;
+ bool heightEditMode = false;
+
+ int pixelFormatActive = 0;
+ const char *pixelFormatTextList[8] = { "CUSTOM", "GRAYSCALE", "GRAY ALPHA", "R5G6B5", "R8G8B8", "R5G5B5A1", "R4G4B4A4", "R8G8B8A8" };
+
+ int channelsActive = 3;
+ const char *channelsTextList[4] = { "1", "2", "3", "4" };
+ int bitDepthActive = 0;
+ const char *bitDepthTextList[3] = { "8", "16", "32" };
+
+ int headerSizeValue = 0;
+ bool headerSizeEditMode = false;
+ //----------------------------------------------------------------------------------
+
+ // Image file info
+ int dataSize = 0;
+ char fileNamePath[256] = "\0";
+ char fileName[64] = "\0";
+
+ bool btnLoadPressed = false;
+
+ bool imageLoaded = false;
+ float imageScale = 1.0f;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // Check if a file is dropped
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ // Check file extensions for drag-and-drop
+ if ((droppedFiles.count == 1) && IsFileExtension(droppedFiles.paths[0], ".raw"))
+ {
+ FILE *imageFile = fopen(droppedFiles.paths[0], "rb");
+ fseek(imageFile, 0L, SEEK_END);
+ dataSize = ftell(imageFile);
+ fclose(imageFile);
+
+ // NOTE: Returned string is just a pointer to droppedFiles[0],
+ // we need to make a copy of that data somewhere else: fileName
+ strcpy(fileNamePath, droppedFiles.paths[0]);
+ strcpy(fileName, GetFileName(droppedFiles.paths[0]));
+
+ // Try to guess possible raw values
+ // Let's assume image is square, RGBA, 8 bit per channel
+ widthValue = round(sqrt(dataSize/4));
+ heightValue = widthValue;
+ headerSizeValue = dataSize - widthValue*heightValue*4;
+ if (headerSizeValue < 0) headerSizeValue = 0;
+
+ importWindowActive = true;
+ }
+
+ UnloadDroppedFiles(droppedFiles);
+ }
+
+ // Check if load button has been pressed
+ if (btnLoadPressed)
+ {
+ // Depending on channels and bit depth, select correct pixel format
+ if ((widthValue != 0) && (heightValue != 0))
+ {
+ int format = -1;
+
+ if (pixelFormatActive == 0)
+ {
+ int channels = atoi(channelsTextList[channelsActive]);
+ int bpp = atoi(bitDepthTextList[bitDepthActive]);
+
+ // Select correct format depending on channels and bpp
+ if (bpp == 8)
+ {
+ if (channels == 1) format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE;
+ else if (channels == 2) format = PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA;
+ else if (channels == 3) format = PIXELFORMAT_UNCOMPRESSED_R8G8B8;
+ else if (channels == 4) format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
+ }
+ else if (bpp == 32)
+ {
+ if (channels == 1) format = PIXELFORMAT_UNCOMPRESSED_R32;
+ else if (channels == 2) TraceLog(LOG_WARNING, "Channel bit-depth not supported!");
+ else if (channels == 3) format = PIXELFORMAT_UNCOMPRESSED_R32G32B32;
+ else if (channels == 4) format = PIXELFORMAT_UNCOMPRESSED_R32G32B32A32;
+ }
+ else if (bpp == 16) TraceLog(LOG_WARNING, "Channel bit-depth not supported!");
+ }
+ else format = pixelFormatActive;
+
+ if (format != -1)
+ {
+ Image image = LoadImageRaw(fileNamePath, widthValue, heightValue, format, headerSizeValue);
+ texture = LoadTextureFromImage(image);
+ UnloadImage(image);
+
+ importWindowActive = false;
+ btnLoadPressed = false;
+
+ if (texture.id > 0)
+ {
+ imageLoaded = true;
+ imageScale = (float)(screenHeight - 100)/texture.height;
+ }
+ }
+ }
+ }
+
+ if (imageLoaded) imageScale += (float)GetMouseWheelMove(); // Image scale control
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ if (texture.id != 0)
+ {
+ DrawTextureEx(texture, (Vector2){ screenWidth/2 - texture.width*imageScale/2, screenHeight/2 - texture.height*imageScale/2 }, 0, imageScale, WHITE);
+ DrawText(TextFormat("SCALE x%.0f", imageScale), 20, screenHeight - 40, 20, GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)));
+ }
+ else DrawText("drag & drop RAW image file", 320, 180, 10, GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)));
+
+ // raygui: controls drawing
+ //----------------------------------------------------------------------------------
+ if (importWindowActive)
+ {
+ importWindowActive = !GuiWindowBox((Rectangle){ windowOffset.x + 0, windowOffset.y + 0, 200, 465 }, "Image RAW Import Options");
+
+ GuiLabel((Rectangle){ windowOffset.x + 10, windowOffset.y + 30, 65, 20 }, "Import file:");
+ GuiLabel((Rectangle){ windowOffset.x + 85, windowOffset.y + 30, 75, 20 }, fileName);
+ GuiLabel((Rectangle){ windowOffset.x + 10, windowOffset.y + 50, 65, 20 }, "File size:");
+ GuiLabel((Rectangle){ windowOffset.x + 85, windowOffset.y + 50, 75, 20 }, TextFormat("%i bytes", dataSize));
+ GuiGroupBox((Rectangle){ windowOffset.x + 10, windowOffset.y + 85, 180, 80 }, "Resolution");
+ GuiLabel((Rectangle){ windowOffset.x + 20, windowOffset.y + 100, 33, 25 }, "Width:");
+ if (GuiValueBox((Rectangle){ windowOffset.x + 60, windowOffset.y + 100, 80, 25 }, NULL, &widthValue, 0, 8192, widthEditMode)) widthEditMode = !widthEditMode;
+ GuiLabel((Rectangle){ windowOffset.x + 145, windowOffset.y + 100, 30, 25 }, "pixels");
+ GuiLabel((Rectangle){ windowOffset.x + 20, windowOffset.y + 130, 33, 25 }, "Height:");
+ if (GuiValueBox((Rectangle){ windowOffset.x + 60, windowOffset.y + 130, 80, 25 }, NULL, &heightValue, 0, 8192, heightEditMode)) heightEditMode = !heightEditMode;
+ GuiLabel((Rectangle){ windowOffset.x + 145, windowOffset.y + 130, 30, 25 }, "pixels");
+ GuiGroupBox((Rectangle){ windowOffset.x + 10, windowOffset.y + 180, 180, 160 }, "Pixel Format");
+ GuiComboBox((Rectangle){ windowOffset.x + 20, windowOffset.y + 195, 160, 25 }, TextJoin(pixelFormatTextList, 8, ";"), &pixelFormatActive);
+ GuiLine((Rectangle){ windowOffset.x + 20, windowOffset.y + 220, 160, 20 }, NULL);
+
+ if (pixelFormatActive != 0) GuiDisable();
+ GuiLabel((Rectangle){ windowOffset.x + 20, windowOffset.y + 235, 50, 20 }, "Channels:");
+ GuiToggleGroup((Rectangle){ windowOffset.x + 20, windowOffset.y + 255, 156/4, 25 }, TextJoin(channelsTextList, 4, ";"), &channelsActive);
+ GuiLabel((Rectangle){ windowOffset.x + 20, windowOffset.y + 285, 50, 20 }, "Bit Depth:");
+ GuiToggleGroup((Rectangle){ windowOffset.x + 20, windowOffset.y + 305, 160/3, 25 }, TextJoin(bitDepthTextList, 3, ";"), &bitDepthActive);
+ GuiEnable();
+
+ GuiGroupBox((Rectangle){ windowOffset.x + 10, windowOffset.y + 355, 180, 50 }, "Header");
+ GuiLabel((Rectangle){ windowOffset.x + 25, windowOffset.y + 370, 27, 25 }, "Size:");
+ if (GuiValueBox((Rectangle){ windowOffset.x + 55, windowOffset.y + 370, 85, 25 }, NULL, &headerSizeValue, 0, 10000, headerSizeEditMode)) headerSizeEditMode = !headerSizeEditMode;
+ GuiLabel((Rectangle){ windowOffset.x + 145, windowOffset.y + 370, 30, 25 }, "bytes");
+
+ btnLoadPressed = GuiButton((Rectangle){ windowOffset.x + 10, windowOffset.y + 420, 180, 30 }, "Import RAW");
+ }
+ //----------------------------------------------------------------------------------
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ if (texture.id != 0) UnloadTexture(texture);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/portable_window/portable_window.c b/external/raygui-4.0/examples/portable_window/portable_window.c
new file mode 100644
index 0000000..8d6bba6
--- /dev/null
+++ b/external/raygui-4.0/examples/portable_window/portable_window.c
@@ -0,0 +1,97 @@
+/*******************************************************************************************
+*
+* raygui - portable window
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2016-2023 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 600;
+
+ SetConfigFlags(FLAG_WINDOW_UNDECORATED);
+ InitWindow(screenWidth, screenHeight, "raygui - portable window");
+
+ // General variables
+ Vector2 mousePosition = { 0 };
+ Vector2 windowPosition = { 500, 200 };
+ Vector2 panOffset = mousePosition;
+ bool dragWindow = false;
+
+ SetWindowPosition(windowPosition.x, windowPosition.y);
+
+ bool exitWindow = false;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!exitWindow && !WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ mousePosition = GetMousePosition();
+
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && !dragWindow)
+ {
+ if (CheckCollisionPointRec(mousePosition, (Rectangle){ 0, 0, screenWidth, 20 }))
+ {
+ dragWindow = true;
+ panOffset = mousePosition;
+ }
+ }
+
+ if (dragWindow)
+ {
+ windowPosition.x += (mousePosition.x - panOffset.x);
+ windowPosition.y += (mousePosition.y - panOffset.y);
+
+ SetWindowPosition((int)windowPosition.x, (int)windowPosition.y);
+
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) dragWindow = false;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ exitWindow = GuiWindowBox((Rectangle){ 0, 0, screenWidth, screenHeight }, "#198# PORTABLE WINDOW");
+
+ DrawText(TextFormat("Mouse Position: [ %.0f, %.0f ]", mousePosition.x, mousePosition.y), 10, 40, 10, DARKGRAY);
+ DrawText(TextFormat("Window Position: [ %.0f, %.0f ]", windowPosition.x, windowPosition.y), 10, 60, 10, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/property_list/dm_property_list.h b/external/raygui-4.0/examples/property_list/dm_property_list.h
new file mode 100644
index 0000000..1e59c23
--- /dev/null
+++ b/external/raygui-4.0/examples/property_list/dm_property_list.h
@@ -0,0 +1,867 @@
+/*******************************************************************************************
+*
+* PropertyListControl v1.0.1 - A custom control that displays a set of properties as a list
+*
+* UPDATES: last updated - 10 march 2020 (v1.0.1)
+* v1.0.1 - Made it work with latest raygui version
+* - Added `GuiDMSaveProperties()` for saving properties to a text file
+* - A `GuiDMLoadProperties()` is planed but not implemented yet
+* - Added a section property that can work as a way to group multiple properties
+* - Fixed issue with section not having the correct height
+* v1.0.0 - Initial release
+*
+*
+* MODULE USAGE:
+* #define GUI_PROPERTY_LIST_IMPLEMENTATION
+* #include "dm_property_list.h"
+*
+* INIT: GuiDMProperty props[] = { // initialize a set of properties first
+ PCOLOR(),
+ PINT(),
+ PFLOAT(),
+ ...
+ };
+* DRAW: GuiDMPropertyList(bounds, props, sizeof(props)/sizeof(props[0]), ...);
+*
+*
+* NOTE: This module also contains 2 extra controls used internally by the property list
+* - GuiDMValueBox() - a value box that supports displaying float values
+* - GuiDMSpinner() - a `better` GuiSpinner()
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2020 Vlad Adrian (@Demizdor - https://github.com/Demizdor).
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+// WARNING: raygui implementation is expected to be defined before including this header
+#undef RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+
+#ifndef GUI_PROPERTY_LIST_H
+#define GUI_PROPERTY_LIST_H
+
+#ifdef __cplusplus
+extern "C" { // Prevents name mangling of functions
+#endif
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+
+// A bunch of usefull macros for modifying the flags of each property
+
+// Set flag `F` of property `P`. `P` must be a pointer!
+#define PROP_SET_FLAG(P, F) ((P)->flags |= (F))
+// Clear flag `F` of property `P`. `P` must be a pointer!
+#define PROP_CLEAR_FLAG(P, F) ((P)->flags &= ~(F))
+// Toggles flag `F` of property `P`. `P` must be a pointer!
+#define PROP_TOGGLE_FLAG(P, F) ((P)->flags ^= (F))
+// Checks if flag `F` of property `P` is set . `P` must be a pointer!
+#define PROP_CHECK_FLAG(P, F) ((P)->flags & (F))
+
+// Some usefull macros for creating properties
+
+// Create a bool property with name `N`, flags `F` and value `V`
+#define PBOOL(N, F, V) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_BOOL, F, .value.vbool = V}
+// Create a int property with name `N`, flags `F` and value `V`
+#define PINT(N, F, V) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_INT, F, .value.vint = {V,0,0,1}}
+// Create a ranged int property within `MIN` and `MAX` with name `N`, flags `F` value `V`.
+// Pressing the spinner buttons will increase/decrease the value by `S`.
+#define PINT_RANGE(N, F, V, S, MIN, MAX) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_INT, F, .value.vint = {V,MIN,MAX,S}}
+// Create a float property with name `N`, flags `F` and value `V`
+#define PFLOAT(N, F, V) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_FLOAT, F, .value.vfloat = {V,0.f,0.f,1.0f,3}}
+// Create a ranged float property within `MIN` and `MAX` with name `N`, flags `F` value `V` with `P` decimal digits to show.
+// Pressing the spinner buttons will increase/decrease the value by `S`.
+#define PFLOAT_RANGE(N, F, V, S, P, MIN, MAX) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_FLOAT, F, .value.vfloat = {V,MIN,MAX,S,P}}
+// Create a text property with name `N`, flags `F` value `V` and max text size `S`
+#define PTEXT(N, F, V, S) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_TEXT, F, .value.vtext = {V, S} }
+// Create a text property with name `N`, flags `F` value `V` and max text size `S`
+#define PSELECT(N, F, V, A) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_SELECT, F, .value.vselect = {V, A} }
+// Create a 2D vector property with name `N`, flags `F` and the `X`, `Y` coordinates
+#define PVEC2(N, F, X, Y) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_VECTOR2, F, .value.v2 = {X, Y} }
+// Create a 3D vector property with name `N`, flags `F` and the `X`, `Y`, `Z` coordinates
+#define PVEC3(N, F, X, Y, Z) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_VECTOR3, F, .value.v3 = {X, Y, Z} }
+// Create a 4D vector property with name `N`, flags `F` and the `X`, `Y`, `Z`, `W` coordinates
+#define PVEC4(N, F, X, Y, Z, W) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_VECTOR4, F, .value.v4 = {X, Y, Z, W} }
+// Create a rectangle property with name `N`, flags `F`, `X`, `Y` coordinates and `W` and `H` size
+#define PRECT(N, F, X, Y, W, H) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_RECT, F, .value.vrect = {X, Y, W, H} }
+// Create a 3D vector property with name `N`, flags `F` and the `R`, `G`, `B`, `A` channel values
+#define PCOLOR(N, F, R, G, B, A) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_COLOR, F, .value.vcolor = {R, G, B, A} }
+// Create a collapsable section named `N` with `F` flags and the next `C` properties as children.
+// !! A section cannot hold another section as a child !!
+#define PSECTION(N, F, C) RAYGUI_CLITERAL(GuiDMProperty){N, GUI_PROP_SECTION, F, .value.vsection = (C)}
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+enum GuiDMPropertyTypes {
+ GUI_PROP_BOOL = 0,
+ GUI_PROP_INT,
+ GUI_PROP_FLOAT,
+ GUI_PROP_TEXT,
+ GUI_PROP_SELECT,
+ GUI_PROP_VECTOR2,
+ GUI_PROP_VECTOR3,
+ GUI_PROP_VECTOR4,
+ GUI_PROP_RECT,
+ GUI_PROP_COLOR,
+ GUI_PROP_SECTION,
+};
+
+enum GuiDMPropertyFlags {
+ GUI_PFLAG_COLLAPSED = 1 << 0, // is the property expanded or collapsed?
+ GUI_PFLAG_DISABLED = 1 << 1, // is this property disabled or enabled?
+};
+
+// Data structure for each property
+typedef struct {
+ char* name;
+ short type;
+ short flags;
+ union {
+ bool vbool;
+ struct { int val; int min; int max; int step; } vint;
+ struct { float val; float min; float max; float step; int precision; } vfloat;
+ struct { char* val; int size; } vtext;
+ struct { char* val; int active; } vselect;
+ int vsection;
+ Vector2 v2;
+ Vector3 v3;
+ Vector4 v4;
+ Rectangle vrect;
+ Color vcolor;
+ } value;
+} GuiDMProperty;
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+//...
+
+//----------------------------------------------------------------------------------
+// Module Functions Declaration
+//----------------------------------------------------------------------------------
+
+// A more advanced `GuiValueBox()` supporting float/int values with specified `precision`, cursor movements, cut/copy/paste and
+// other keybord shortcuts. Needed by `GuiDMSpinner()` !!
+// `precision` should be between 1-7 for float values and 0 for int values (maybe 15 for doubles but that was not tested)
+// WARNING: The bounds should be set big enough else the text will overflow and things will break
+// WARNING: Sometimes the last decimal value could differ, this is probably due to rounding
+double GuiDMValueBox(Rectangle bounds, double value, double minValue, double maxValue, int precision, bool editMode);
+
+// A more advanced `GuiSpinner()` using `GuiDMValueBox()` for displaying the values.
+// This was needed because `GuiSpinner()` can't display float values and editing values is somewhat hard.
+// This is by no means perfect but should be more user friendly than the default control provided by raygui.
+double GuiDMSpinner(Rectangle bounds, double value, double minValue, double maxValue, double step, int precision, bool editMode);
+
+// Works just like `GuiListViewEx()` but with an array of properties instead of text.
+void GuiDMPropertyList(Rectangle bounds, GuiDMProperty* props, int count, int* focus, int* scrollIndex);
+
+// Handy function to save properties to a file. Returns false on failure or true otherwise.
+bool GuiDMSaveProperties(const char* file, GuiDMProperty* props, int count);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // GUI_PROPERTY_LIST_H
+
+
+
+/***********************************************************************************
+*
+* GUI_PROPERTY_LIST_IMPLEMENTATION
+*
+************************************************************************************/
+#if defined(GUI_PROPERTY_LIST_IMPLEMENTATION)
+
+#include "../../src/raygui.h"
+
+#include // for calloc()
+#include // for memmove(), strlen()
+#include // for sscanf(), snprintf()
+
+#ifndef __cplusplus
+#if __STDC_VERSION__ >= 199901L
+#include // for bool if >= C99
+#endif
+#endif
+
+double GuiDMValueBox(Rectangle bounds, double value, double minValue, double maxValue, int precision, bool editMode) {
+ // FIXME: Hope all those `memmove()` functions are correctly used so we won't leak memory or overflow the buffer !!!
+ static int framesCounter = 0; // Required for blinking cursor
+ static int cursor = 0; // Required for tracking the cursor position (only for a single active valuebox)
+
+ enum {cursorTimer = 6, maxChars = 31, textPadding = 2};
+
+ GuiState state = GuiGetState();
+
+ // Make sure value is in range
+ if(maxValue != minValue){
+ if(value < minValue) value = minValue;
+ if(value > maxValue) value = maxValue;
+ }
+
+ char textValue[maxChars + 1] = "\0";
+ snprintf(textValue, maxChars, "%.*f", precision, value); // NOTE: use `snprintf` here so we don't overflow the buffer
+ int len = strlen(textValue);
+
+ bool valueHasChanged = false;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ if (editMode)
+ {
+ // Make sure cursor position is correct
+ if(cursor > len) cursor = len;
+ if(cursor < 0) cursor = 0;
+
+ state = STATE_PRESSED;
+ framesCounter++;
+
+ if(IsKeyPressed(KEY_RIGHT) || (IsKeyDown(KEY_RIGHT) && (framesCounter%cursorTimer == 0))) {
+ // MOVE CURSOR TO RIGHT
+ ++cursor;
+ framesCounter = 0;
+ } else if(IsKeyPressed(KEY_LEFT) || (IsKeyDown(KEY_LEFT) && (framesCounter%cursorTimer == 0))) {
+ // MOVE CURSOR TO LEFT
+ --cursor;
+ framesCounter = 0;
+ } else if (IsKeyPressed(KEY_BACKSPACE) || (IsKeyDown(KEY_BACKSPACE) && (framesCounter%cursorTimer) == 0)) {
+ // HANDLE BACKSPACE
+ if(cursor > 0) {
+ if(textValue[cursor-1] != '.') {
+ if(cursor < len )
+ memmove(&textValue[cursor-1], &textValue[cursor], len-cursor);
+ textValue[len - 1] = '\0';
+ valueHasChanged = true;
+ }
+ --cursor;
+ }
+ framesCounter = 0;
+ } else if (IsKeyPressed(KEY_DELETE) || (IsKeyDown(KEY_DELETE) && (framesCounter%cursorTimer) == 0)) {
+ // HANDLE DEL
+ if(len > 0 && cursor < len && textValue[cursor] != '.') {
+ memmove(&textValue[cursor], &textValue[cursor+1], len-cursor);
+ textValue[len] = '\0';
+ len -= 1;
+ valueHasChanged = true;
+ }
+ } else if (IsKeyPressed(KEY_HOME)) {
+ // MOVE CURSOR TO START
+ cursor = 0;
+ } else if (IsKeyPressed(KEY_END)) {
+ // MOVE CURSOR TO END
+ cursor = len;
+ } else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)) {
+ // COPY
+ SetClipboardText(textValue);
+ } else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_X)) {
+ // CUT
+ SetClipboardText(textValue);
+ textValue[0] = '\0';
+ cursor = len = 0;
+ value = 0.0; // set it to 0 and pretend the value didn't change
+ } else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V)) {
+ // PASTE
+ const char* clip = GetClipboardText();
+ int clipLen = strlen(clip);
+ clipLen = clipLen > maxChars ? maxChars : clipLen;
+ memcpy(textValue, clip, clipLen);
+ len = clipLen;
+ textValue[len] = '\0';
+ valueHasChanged = true;
+ }
+ else {
+ // HANDLE KEY PRESS
+ int key = GetKeyPressed();
+ if( ((len < maxChars) && (key >= 48) && (key <= 57)) || (key == 46) || (key == 45) ) // only allow 0..9, minus(-) and dot(.)
+ {
+ if(precision != 0 && cursor < len) { // when we have decimals we can't insert at the end
+ memmove(&textValue[cursor], &textValue[cursor-1], len+1-cursor);
+ textValue[len+1] = '\0';
+ textValue[cursor] = (char)key;
+ cursor++;
+ valueHasChanged = true;
+ }
+ else if(precision == 0) {
+ if(cursor < len) memmove(&textValue[cursor], &textValue[cursor-1], len+1-cursor);
+ len += 1;
+ textValue[len+1] = '\0';
+ textValue[cursor] = (char)key;
+ cursor++;
+ valueHasChanged = true;
+ }
+ }
+ }
+
+ // Make sure cursor position is correct
+ if(cursor > len) cursor = len;
+ if(cursor < 0) cursor = 0;
+ }
+ else
+ {
+ if (CheckCollisionPointRec(GetMousePosition(), bounds))
+ {
+ state = STATE_FOCUSED;
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) framesCounter = 0;
+ }
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ DrawRectangleLinesEx(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(VALUEBOX, BORDER + (state*3))), guiAlpha));
+
+ Rectangle textBounds = {bounds.x + GuiGetStyle(VALUEBOX, BORDER_WIDTH) + textPadding, bounds.y + GuiGetStyle(VALUEBOX, BORDER_WIDTH),
+ bounds.width - 2*(GuiGetStyle(VALUEBOX, BORDER_WIDTH) + textPadding), bounds.height - 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH)};
+
+ int textWidth = GetTextWidth(textValue);
+ if(textWidth > textBounds.width) textBounds.width = textWidth;
+
+ if (state == STATE_PRESSED)
+ {
+ DrawRectangle(bounds.x + GuiGetStyle(VALUEBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(VALUEBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED)), guiAlpha));
+
+ // Draw blinking cursor
+ // NOTE: ValueBox internal text is always centered
+ if (editMode && ((framesCounter/20)%2 == 0)) {
+ // Measure text until the cursor
+ int textWidthCursor = -2;
+ if(cursor > 0) {
+ char c = textValue[cursor];
+ textValue[cursor] = '\0';
+ textWidthCursor = GetTextWidth(textValue);
+ textValue[cursor] = c;
+ }
+ //DrawRectangle(bounds.x + textWidthCursor + textPadding + 2, bounds.y + 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), 1, bounds.height - 4*GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED)), guiAlpha));
+ DrawRectangle(bounds.x + textWidthCursor + (int)((bounds.width - textWidth - textPadding)/2.0f) + 2, bounds.y + 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), 1, bounds.height - 4*GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED)), guiAlpha));
+ }
+ }
+ else if (state == STATE_DISABLED)
+ {
+ DrawRectangle(bounds.x + GuiGetStyle(VALUEBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(VALUEBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED)), guiAlpha));
+ }
+
+ GuiDrawText(textValue, textBounds, TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(VALUEBOX, TEXT + (state*3))), guiAlpha));
+
+ value = valueHasChanged ? strtod(textValue, NULL) : value;
+
+ // Make sure value is in range
+ if(maxValue != minValue){
+ if(value < minValue) value = minValue;
+ if(value > maxValue) value = maxValue;
+ }
+
+ return value;
+}
+
+
+
+double GuiDMSpinner(Rectangle bounds, double value, double minValue, double maxValue, double step, int precision, bool editMode) {
+ GuiState state = GuiGetState();
+
+ Rectangle spinner = { bounds.x + GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING), bounds.y,
+ bounds.width - 2*(GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING)), bounds.height };
+ Rectangle leftButtonBound = { (float)bounds.x, (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height };
+ Rectangle rightButtonBound = { (float)bounds.x + bounds.width - GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check spinner state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+
+ // Draw control
+ //--------------------------------------------------------------------
+ // Draw value selector custom buttons
+ // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values
+ int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH);
+ int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(SPINNER, BORDER_WIDTH));
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+#if defined(RAYGUI_SUPPORT_RICONS)
+ if (GuiButton(leftButtonBound, GuiIconText(RICON_ARROW_LEFT_FILL, NULL))) value -= step;
+ if (GuiButton(rightButtonBound, GuiIconText(RICON_ARROW_RIGHT_FILL, NULL))) value += step;
+#else
+ if (GuiButton(leftButtonBound, "<")) value -= step;
+ if (GuiButton(rightButtonBound, ">")) value += step;
+#endif
+
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth);
+
+ value = GuiDMValueBox(spinner, value, minValue, maxValue, precision, editMode);
+
+ return value;
+}
+
+
+
+void GuiDMPropertyList(Rectangle bounds, GuiDMProperty* props, int count, int* focus, int* scrollIndex) {
+ #ifdef RAYGUI_SUPPORT_RICONS
+ #define PROPERTY_COLLAPSED_ICON "#120#"
+ #define PROPERTY_EXPANDED_ICON "#121#"
+ #else
+ #define PROPERTY_COLLAPSED_ICON "+"
+ #define PROPERTY_EXPANDED_ICON "-"
+ #endif
+
+ #define PROPERTY_PADDING 6
+ #define PROPERTY_ICON_SIZE 16
+ #define PROPERTY_DECIMAL_DIGITS 3 //how many digits to show (used only for the vector properties)
+
+ // NOTE: Using ListView style for everything !!
+ GuiState state = GuiGetState();
+ int propFocused = (focus == NULL)? -1 : *focus;
+ int scroll = *scrollIndex > 0 ? 0 : *scrollIndex; // NOTE: scroll should always be negative or 0
+
+ // Each property occupies a certain number of slots, highly synchronized with the properties enum (GUI_PROP_BOOL ... GUI_PROP_SECTION)
+ // NOTE: If you add a custom property type make sure to add the number of slots it occupies here !!
+ const int propSlots[] = {1,1,1,2,1,3,4,5,5,5,1};
+
+ Rectangle absoluteBounds = {0}; // total bounds for all of the properties (unclipped)
+ // We need to loop over all the properties to get total height so we can see if we need a scrollbar or not
+ for(int p=0; p bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) ? true : false;
+ if(!useScrollBar && scroll != 0) scroll = 0; // make sure scroll is 0 when there's no scrollbar
+
+ Rectangle scrollBarBounds = {bounds.x + GuiGetStyle(LISTVIEW, BORDER_WIDTH), bounds.y + GuiGetStyle(LISTVIEW, BORDER_WIDTH),
+ GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH)};
+
+ absoluteBounds.x = bounds.x + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ absoluteBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH) + scroll;
+ absoluteBounds.width = bounds.width - 2*(GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH));
+
+ if(useScrollBar) {
+ if(GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)
+ absoluteBounds.x += GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH); // scrollbar is on the LEFT, adjust bounds
+ else
+ scrollBarBounds.x = bounds.x + bounds.width - GuiGetStyle(LISTVIEW, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH); // scrollbar is on the RIGHT
+ absoluteBounds.width -= GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH); // adjust width to fit the scrollbar
+ }
+
+ int maxScroll = absoluteBounds.height + 2*(GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH))-bounds.height;
+
+ // Update control
+ //--------------------------------------------------------------------
+ Vector2 mousePos = GetMousePosition();
+ // NOTE: most of the update code is actually done in the draw control section
+ if ((state != STATE_DISABLED) && !guiLocked) {
+ if(!CheckCollisionPointRec(mousePos, bounds)) {
+ propFocused = -1;
+ }
+
+ if (useScrollBar)
+ {
+ int wheelMove = GetMouseWheelMove();
+ scroll += wheelMove*count;
+ if(-scroll > maxScroll) scroll = -maxScroll;
+ }
+ }
+ //--------------------------------------------------------------------
+
+
+ // Draw control
+ //--------------------------------------------------------------------
+ DrawRectangleRec(bounds, Fade(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)), guiAlpha) ); // Draw background
+ DrawRectangleLinesEx(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), guiAlpha)); // Draw border
+
+ BeginScissorMode(absoluteBounds.x, bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), absoluteBounds.width, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH));
+ int currentHeight = 0;
+ for(int p=0; p= bounds.y && absoluteBounds.y + currentHeight <= bounds.y + bounds.height)
+ {
+ Rectangle propBounds = {absoluteBounds.x, absoluteBounds.y + currentHeight, absoluteBounds.width, height};
+ Color textColor = Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL)), guiAlpha);
+ int propState = STATE_NORMAL;
+
+ // Get the state of this property and do some initial drawing
+ if(PROP_CHECK_FLAG(&props[p], GUI_PFLAG_DISABLED)) {
+ propState = STATE_DISABLED;
+ propBounds.height += 1;
+ DrawRectangleRec(propBounds, Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED)), guiAlpha));
+ propBounds.height -= 1;
+ textColor = Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED)), guiAlpha);
+ } else {
+ if(CheckCollisionPointRec(mousePos, propBounds) && !guiLocked) {
+ if(IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) {
+ propState = STATE_PRESSED;
+ //DrawRectangleRec(propRect, Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED)), guiAlpha));
+ textColor = Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED)), guiAlpha);
+ } else {
+ propState = STATE_FOCUSED;
+ propFocused = p;
+ //DrawRectangleRec(propRect, Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED)), guiAlpha));
+ textColor = Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED)), guiAlpha);
+ }
+ } else propState = STATE_NORMAL;
+ }
+
+ if(propState == STATE_DISABLED) GuiSetState(propState);
+ switch(props[p].type)
+ {
+ case GUI_PROP_BOOL: {
+ // draw property name
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x + PROPERTY_PADDING, propBounds.y, propBounds.width/2-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ if(propState == STATE_PRESSED) props[p].value.vbool = !props[p].value.vbool; // toggle the property value when clicked
+
+ // draw property value
+ const bool locked = guiLocked;
+ GuiLock(); // lock the checkbox since we changed the value manually
+ GuiCheckBox((Rectangle){propBounds.x+propBounds.width/2, propBounds.y + height/4, height/2, height/2}, props[p].value.vbool? "Yes" : "No", &props[p].value.vbool);
+ if(!locked) GuiUnlock(); // only unlock when needed
+ } break;
+
+ case GUI_PROP_INT:
+ // draw property name
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x + PROPERTY_PADDING, propBounds.y, propBounds.width/2-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ // draw property value
+ props[p].value.vint.val = GuiDMSpinner((Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2},
+ props[p].value.vint.val, props[p].value.vint.min, props[p].value.vint.max, props[p].value.vint.step, 0, (propState == STATE_FOCUSED) );
+ break;
+
+ case GUI_PROP_FLOAT:
+ // draw property name
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x + PROPERTY_PADDING, propBounds.y, propBounds.width/2-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ // draw property value
+ props[p].value.vfloat.val = GuiDMSpinner((Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2},
+ props[p].value.vfloat.val, props[p].value.vfloat.min, props[p].value.vfloat.max, props[p].value.vfloat.step, props[p].value.vfloat.precision, (propState == STATE_FOCUSED) );
+ break;
+
+ case GUI_PROP_TEXT: {
+ Rectangle titleBounds = { propBounds.x, propBounds.y, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) };
+ // Collapse/Expand property on click
+ if((propState == STATE_PRESSED) && CheckCollisionPointRec(mousePos, titleBounds))
+ PROP_TOGGLE_FLAG(&props[p], GUI_PFLAG_COLLAPSED);
+
+ // draw property name
+ GuiDrawText(PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED) ? PROPERTY_COLLAPSED_ICON : PROPERTY_EXPANDED_ICON, titleBounds, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x+PROPERTY_ICON_SIZE+PROPERTY_PADDING, propBounds.y, propBounds.width-PROPERTY_ICON_SIZE-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(TextFormat("%i/%i", strlen(props[p].value.vtext.val), props[p].value.vtext.size), (Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2}, TEXT_ALIGN_LEFT, textColor);
+
+ // draw property value
+ if(!PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED))
+ GuiTextBox((Rectangle){propBounds.x, propBounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)+1, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2}, props[p].value.vtext.val, props[p].value.vtext.size, (propState == STATE_FOCUSED));
+ } break;
+
+ case GUI_PROP_SELECT: {
+ // TODO: Create a custom dropdownbox control instead of using the raygui combobox
+ // draw property name
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x + PROPERTY_PADDING, propBounds.y, propBounds.width/2-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ // draw property value
+ GuiComboBox((Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2},
+ props[p].value.vselect.val, &props[p].value.vselect.active);
+ } break;
+
+ case GUI_PROP_VECTOR2: case GUI_PROP_VECTOR3: case GUI_PROP_VECTOR4: {
+ Rectangle titleBounds = { propBounds.x, propBounds.y, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) };
+ // Collapse/Expand property on click
+ if((propState == STATE_PRESSED) && CheckCollisionPointRec(mousePos, titleBounds))
+ PROP_TOGGLE_FLAG(&props[p], GUI_PFLAG_COLLAPSED);
+
+ const char* fmt = "";
+ if(props[p].type == GUI_PROP_VECTOR2) fmt = TextFormat("[%.0f, %.0f]", props[p].value.v2.x, props[p].value.v2.y);
+ else if(props[p].type == GUI_PROP_VECTOR3) fmt = TextFormat("[%.0f, %.0f, %.0f]", props[p].value.v3.x, props[p].value.v3.y, props[p].value.v3.z);
+ else fmt = TextFormat("[%.0f, %.0f, %.0f, %.0f]", props[p].value.v4.x, props[p].value.v4.y, props[p].value.v4.z, props[p].value.v4.w);
+
+ // draw property name
+ GuiDrawText(PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED) ? PROPERTY_COLLAPSED_ICON : PROPERTY_EXPANDED_ICON, titleBounds, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x+PROPERTY_ICON_SIZE+PROPERTY_PADDING, propBounds.y, propBounds.width-PROPERTY_ICON_SIZE-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(fmt, (Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2}, TEXT_ALIGN_LEFT, textColor);
+
+ // draw X, Y, Z, W values (only when expanded)
+ if(!PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED)) {
+ Rectangle slotBounds = { propBounds.x, propBounds.y+GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)+1, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2};
+ Rectangle lblBounds = { propBounds.x+PROPERTY_PADDING, slotBounds.y, GetTextWidth("A"), slotBounds.height};
+ Rectangle valBounds = { lblBounds.x+lblBounds.width+PROPERTY_PADDING, slotBounds.y, propBounds.width-lblBounds.width-2*PROPERTY_PADDING, slotBounds.height};
+ GuiDrawText("X", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.v2.x = GuiDMSpinner(valBounds, props[p].value.v2.x, 0.0, 0.0, 1.0, PROPERTY_DECIMAL_DIGITS, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = slotBounds.y;
+ GuiDrawText("Y", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.v2.y = GuiDMSpinner(valBounds, props[p].value.v2.y, 0.0, 0.0, 1.0, PROPERTY_DECIMAL_DIGITS, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = slotBounds.y;
+ if(props[p].type >= GUI_PROP_VECTOR3) {
+ GuiDrawText("Z", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.v3.z = GuiDMSpinner(valBounds, props[p].value.v3.z, 0.0, 0.0, 1.0, PROPERTY_DECIMAL_DIGITS, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = slotBounds.y;
+ }
+
+ if(props[p].type >= GUI_PROP_VECTOR4) {
+ GuiDrawText("W", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.v4.w = GuiDMSpinner(valBounds, props[p].value.v4.w, 0.0, 0.0, 1.0, PROPERTY_DECIMAL_DIGITS, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ }
+ }
+ } break;
+
+ case GUI_PROP_RECT:{
+ Rectangle titleBounds = { propBounds.x, propBounds.y, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) };
+ // Collapse/Expand property on click
+ if((propState == STATE_PRESSED) && CheckCollisionPointRec(mousePos, titleBounds))
+ PROP_TOGGLE_FLAG(&props[p], GUI_PFLAG_COLLAPSED);
+
+ // draw property name
+ GuiDrawText(PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED) ? PROPERTY_COLLAPSED_ICON : PROPERTY_EXPANDED_ICON, titleBounds, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x+PROPERTY_ICON_SIZE+PROPERTY_PADDING, propBounds.y, propBounds.width-PROPERTY_ICON_SIZE-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(TextFormat("[%.0f, %.0f, %.0f, %.0f]", props[p].value.vrect.x, props[p].value.vrect.y, props[p].value.vrect.width, props[p].value.vrect.height),
+ (Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2}, TEXT_ALIGN_LEFT, textColor);
+
+ // draw X, Y, Width, Height values (only when expanded)
+ if(!PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED)) {
+ Rectangle slotBounds = { propBounds.x, propBounds.y+GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)+1, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2};
+ Rectangle lblBounds = { propBounds.x+PROPERTY_PADDING, slotBounds.y, GetTextWidth("Height"), slotBounds.height};
+ Rectangle valBounds = { lblBounds.x+lblBounds.width+PROPERTY_PADDING, slotBounds.y, propBounds.width-lblBounds.width-2*PROPERTY_PADDING, slotBounds.height};
+ GuiDrawText("X", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vrect.x = GuiDMSpinner(valBounds, props[p].value.vrect.x, 0.0, 0.0, 1.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = slotBounds.y;
+ GuiDrawText("Y", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vrect.y = GuiDMSpinner(valBounds, props[p].value.vrect.y, 0.0, 0.0, 1.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = slotBounds.y;
+ GuiDrawText("Width", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vrect.width = GuiDMSpinner(valBounds, props[p].value.vrect.width, 0.0, 0.0, 1.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = slotBounds.y;
+ GuiDrawText("Height", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vrect.height = GuiDMSpinner(valBounds, props[p].value.vrect.height, 0.0, 0.0, 1.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ }
+ } break;
+
+
+ case GUI_PROP_COLOR: {
+ Rectangle titleBounds = { propBounds.x, propBounds.y, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) };
+ // Collapse/Expand property on click
+ if((propState == STATE_PRESSED) && CheckCollisionPointRec(mousePos, titleBounds))
+ PROP_TOGGLE_FLAG(&props[p], GUI_PFLAG_COLLAPSED);
+
+ // draw property name
+ GuiDrawText(PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED) ? PROPERTY_COLLAPSED_ICON : PROPERTY_EXPANDED_ICON, titleBounds, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x+PROPERTY_ICON_SIZE+PROPERTY_PADDING, propBounds.y+1, propBounds.width-PROPERTY_ICON_SIZE-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2}, TEXT_ALIGN_LEFT, textColor);
+ DrawLineEx( (Vector2){propBounds.x+propBounds.width/2, propBounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 5}, (Vector2){propBounds.x+propBounds.width, propBounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 5}, 6.0f, props[p].value.vcolor);
+ const char* fmt = TextFormat("#%02X%02X%02X%02X", props[p].value.vcolor.r, props[p].value.vcolor.g, props[p].value.vcolor.b, props[p].value.vcolor.a);
+ char clip[10] = "\0";
+ memcpy(clip, fmt, 10*sizeof(char)); // copy to temporary buffer since we can't be sure when TextFormat() will be called again and our text will be overwritten
+ GuiDrawText(fmt, (Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2}, TEXT_ALIGN_LEFT, textColor);
+
+ // draw R, G, B, A values (only when expanded)
+ if(!PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED)) {
+ Rectangle slotBounds = { propBounds.x, propBounds.y+GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)+1, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2};
+ Rectangle lblBounds = { propBounds.x+PROPERTY_PADDING, slotBounds.y, GetTextWidth("A"), slotBounds.height};
+ Rectangle valBounds = { lblBounds.x+lblBounds.width+PROPERTY_PADDING, slotBounds.y, GetTextWidth("000000"), slotBounds.height};
+ Rectangle sbarBounds = { valBounds.x + valBounds.width + PROPERTY_PADDING, slotBounds.y, slotBounds.width - 3*PROPERTY_PADDING - lblBounds.width - valBounds.width, slotBounds.height };
+
+ if(sbarBounds.width <= GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2) valBounds.width = propBounds.width-lblBounds.width-2*PROPERTY_PADDING; // hide slider when no space
+ // save current scrollbar style
+ int tmpSliderPadding = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING);
+ int tmpPadding = GuiGetStyle(SCROLLBAR, SCROLL_PADDING);
+ int tmpBorder = GuiGetStyle(SCROLLBAR, BORDER_WIDTH);
+ int tmpSliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE);
+ int tmpArrows = GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE);
+ Color tmpBG1 = GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED));
+ // set a custom scrollbar style
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, 3);
+ GuiSetStyle(SCROLLBAR, SCROLL_PADDING, 10);
+ GuiSetStyle(SCROLLBAR, BORDER_WIDTH, 0);
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, 6);
+ GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, 0);
+ GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, GuiGetStyle(DEFAULT, BACKGROUND_COLOR)); // disable scrollbar background
+
+ GuiDrawText("R", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vcolor.r = GuiDMValueBox(valBounds, props[p].value.vcolor.r, 0.0, 255.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ if(sbarBounds.width > GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2)
+ props[p].value.vcolor.r = GuiScrollBar(sbarBounds, props[p].value.vcolor.r, 0, 255);
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = sbarBounds.y = slotBounds.y;
+
+ GuiDrawText("G", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vcolor.g = GuiDMValueBox(valBounds, props[p].value.vcolor.g, 0.0, 255.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ if(sbarBounds.width > GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2)
+ props[p].value.vcolor.g = GuiScrollBar(sbarBounds, props[p].value.vcolor.g, 0, 255);
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = sbarBounds.y = slotBounds.y;
+
+ GuiDrawText("B", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vcolor.b = GuiDMValueBox(valBounds, props[p].value.vcolor.b, 0.0, 255.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ if(sbarBounds.width > GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2)
+ props[p].value.vcolor.b = GuiScrollBar(sbarBounds, props[p].value.vcolor.b, 0, 255);
+ slotBounds.y += GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ lblBounds.y = valBounds.y = sbarBounds.y = slotBounds.y;
+
+ GuiDrawText("A", lblBounds, TEXT_ALIGN_LEFT, textColor);
+ props[p].value.vcolor.a = GuiDMValueBox(valBounds, props[p].value.vcolor.a, 0.0, 255.0, 0, (propState == STATE_FOCUSED) && CheckCollisionPointRec(mousePos, slotBounds) );
+ if(sbarBounds.width > GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)-2)
+ props[p].value.vcolor.a = GuiScrollBar(sbarBounds, props[p].value.vcolor.a, 0, 255);
+
+ // load saved scrollbar style
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, tmpSliderPadding);
+ GuiSetStyle(SCROLLBAR, SCROLL_PADDING, tmpPadding);
+ GuiSetStyle(SCROLLBAR, BORDER_WIDTH, tmpBorder);
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, tmpSliderSize);
+ GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, tmpArrows);
+ GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, ColorToInt(tmpBG1));
+ }
+
+ // support COPY/PASTE (need to do this here since GuiDMValueBox() also has COPY/PASTE so we need to overwrite it)
+ if((propState == STATE_FOCUSED)) {
+ if(IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C))
+ SetClipboardText(clip);
+ else if(IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V)){
+ unsigned int a = props[p].value.vcolor.a, r = props[p].value.vcolor.r, g=props[p].value.vcolor.g, b=props[p].value.vcolor.b;
+ sscanf(GetClipboardText(), "#%02X%02X%02X%02X", &r, &g, &b, &a);
+ props[p].value.vcolor.r=r; props[p].value.vcolor.g=g; props[p].value.vcolor.b=b; props[p].value.vcolor.a=a;
+ }
+ }
+ } break;
+
+ case GUI_PROP_SECTION: {
+ Rectangle titleBounds = { propBounds.x, propBounds.y, propBounds.width, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) };
+ // Collapse/Expand section on click
+ if( (propState == STATE_PRESSED) && CheckCollisionPointRec(mousePos, titleBounds) )
+ PROP_TOGGLE_FLAG(&props[p], GUI_PFLAG_COLLAPSED);
+
+ if(!PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED)) {
+ GuiDrawText(PROPERTY_EXPANDED_ICON, titleBounds, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x+PROPERTY_ICON_SIZE+PROPERTY_PADDING, propBounds.y, propBounds.width-PROPERTY_ICON_SIZE-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_CENTER, textColor);
+ } else {
+ GuiDrawText(PROPERTY_COLLAPSED_ICON, titleBounds, TEXT_ALIGN_LEFT, textColor);
+ GuiDrawText(TextFormat("%s [%i]", props[p].name, props[p].value.vsection), (Rectangle){propBounds.x+PROPERTY_ICON_SIZE+PROPERTY_PADDING, propBounds.y, propBounds.width-PROPERTY_ICON_SIZE-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_CENTER, textColor);
+ }
+ } break;
+
+
+ // NOTE: Add your custom property here !!
+ default: {
+ // draw property name
+ GuiDrawText(props[p].name, (Rectangle){propBounds.x + PROPERTY_PADDING, propBounds.y, propBounds.width/2-PROPERTY_PADDING, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)}, TEXT_ALIGN_LEFT, textColor);
+ // draw property type
+ GuiDrawText(TextFormat("TYPE %i", props[p].type), (Rectangle){propBounds.x+propBounds.width/2, propBounds.y + 1, propBounds.width/2, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) - 2}, TEXT_ALIGN_LEFT, textColor);
+ } break;
+
+ } // end of switch()
+
+ GuiSetState(state);
+ }
+
+ currentHeight += height + 1;
+
+ // Skip collapsed section. Don't put this code inside the switch !!
+ if(props[p].type == GUI_PROP_SECTION && (PROP_CHECK_FLAG(&props[p], GUI_PFLAG_COLLAPSED))) p += props[p].value.vsection;
+ } // end for
+ EndScissorMode();
+
+ if(useScrollBar) {
+ scroll = -GuiScrollBar(scrollBarBounds, -scroll, 0, maxScroll);
+ *scrollIndex = scroll;
+ }
+ //--------------------------------------------------------------------
+
+ if(focus != NULL) *focus = propFocused;
+}
+
+bool GuiDMSaveProperties(const char* file, GuiDMProperty* props, int count) {
+ if(file == NULL || props == NULL) return false;
+ if(count == 0) return true;
+
+ FILE* f = fopen(file, "w");
+ if(f == NULL) return false;
+
+ // write header
+ fprintf(f, "#\n# Property types:\n"
+ "# b // Bool\n"
+ "# i // Int\n"
+ "# f // Float\n"
+ "# t // Text\n"
+ "# l // Select\n"
+ "# g // Section (Group)\n"
+ "# v2 // Vector 2D\n"
+ "# v3 // Vector 3D\n"
+ "# v4 // Vector 4D\n"
+ "# r // Rectangle\n"
+ "# c // Color\n"
+ "#\n\n");
+ for(int p=0; p= 1)
+ {
+ DrawText(TextFormat("FOCUS:%i | SCROLL:%i | FPS:%i", focus, scroll, GetFPS()), prop[8].value.v2.x, prop[8].value.v2.y, 20, prop[11].value.vcolor);
+ }
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ GuiDMSaveProperties("test.props", prop, SIZEOF(prop)); // Save properties to `test.props` file at exit
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
diff --git a/external/raygui-4.0/examples/property_list/test.props b/external/raygui-4.0/examples/property_list/test.props
new file mode 100644
index 0000000..3208dd0
--- /dev/null
+++ b/external/raygui-4.0/examples/property_list/test.props
@@ -0,0 +1,27 @@
+#
+# Property types:
+# b // Bool
+# i // Int
+# f // Float
+# t // Text
+# l // Select
+# g // Section (Group)
+# v2 // Vector 2D
+# v3 // Vector 3D
+# v4 // Vector 4D
+# r // Rectangle
+# c // Color
+#
+
+b Bool 0 1
+g #102#SECTION 0 2
+i Int 0 123 0 0 1
+f Float 0 0.990000 0.000000 0.000000 1.000000 3
+t Text 1 Hello! 30
+l Select 0 ONE;TWO;THREE;FOUR 3
+i Int Range 0 32 0 100 1
+r Rect 1 0 0 100 200
+v2 Vec2 1 20.000000 20.000000
+v3 Vec3 1 12.000000 13.000000 14.000000
+v4 Vec4 1 12.000000 13.000000 14.000000 15.000000
+c Color 1 94 68 197 160
diff --git a/external/raygui-4.0/examples/raygui.ico b/external/raygui-4.0/examples/raygui.ico
new file mode 100644
index 0000000..cc8498b
Binary files /dev/null and b/external/raygui-4.0/examples/raygui.ico differ
diff --git a/external/raygui-4.0/examples/raygui.rc b/external/raygui-4.0/examples/raygui.rc
new file mode 100644
index 0000000..8dc1e71
--- /dev/null
+++ b/external/raygui-4.0/examples/raygui.rc
@@ -0,0 +1,27 @@
+GLFW_ICON ICON "raygui.ico"
+
+1 VERSIONINFO
+FILEVERSION 4,0,0,0
+PRODUCTVERSION 4,0,0,0
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ //BLOCK "080904E4" // English UK
+ BLOCK "040904E4" // English US
+ BEGIN
+ //VALUE "CompanyName", "raylib technologies"
+ VALUE "FileDescription", "raygui application (www.raylib.com)"
+ VALUE "FileVersion", "4.0.0"
+ VALUE "InternalName", "raygui app"
+ VALUE "LegalCopyright", "(c) 2023 Ramon Santamaria (@raysan5)"
+ //VALUE "OriginalFilename", "raygui_app.exe"
+ VALUE "ProductName", "raygui app"
+ VALUE "ProductVersion", "4.0.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ //VALUE "Translation", 0x809, 1252 // English UK
+ VALUE "Translation", 0x409, 1252 // English US
+ END
+END
diff --git a/external/raygui-4.0/examples/scroll_panel/scroll_panel.c b/external/raygui-4.0/examples/scroll_panel/scroll_panel.c
new file mode 100644
index 0000000..d3978cf
--- /dev/null
+++ b/external/raygui-4.0/examples/scroll_panel/scroll_panel.c
@@ -0,0 +1,153 @@
+/*******************************************************************************************
+*
+* raygui - Controls test
+*
+* TEST CONTROLS:
+* - GuiScrollPanel()
+*
+* DEPENDENCIES:
+* raylib 4.0 - Windowing/input management and drawing.
+* raygui 3.0 - Immediate-mode GUI controls.
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* COMPILATION (Linux - gcc):
+* gcc -o $(NAME_PART) $(FILE_NAME) -I../../src -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2019-2023 Vlad Adrian (@Demizdor) and Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "../../src/raygui.h"
+
+
+static void DrawStyleEditControls(void); // Draw and process scroll bar style edition controls
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raygui - GuiScrollPanel()");
+
+ Rectangle panelRec = { 20, 40, 200, 150 };
+ Rectangle panelContentRec = {0, 0, 340, 340 };
+ Rectangle panelView = { 0 };
+ Vector2 panelScroll = { 99, -20 };
+
+ bool showContentArea = true;
+
+ SetTargetFPS(60);
+ //---------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // TODO: Implement required update logic
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText(TextFormat("[%f, %f]", panelScroll.x, panelScroll.y), 4, 4, 20, RED);
+
+ GuiScrollPanel(panelRec, NULL, panelContentRec, &panelScroll, &panelView);
+
+ BeginScissorMode(panelView.x, panelView.y, panelView.width, panelView.height);
+ GuiGrid((Rectangle){panelRec.x + panelScroll.x, panelRec.y + panelScroll.y, panelContentRec.width, panelContentRec.height}, NULL, 16, 3, NULL);
+ EndScissorMode();
+
+ if (showContentArea) DrawRectangle(panelRec.x + panelScroll.x, panelRec.y + panelScroll.y, panelContentRec.width, panelContentRec.height, Fade(RED, 0.1));
+
+ DrawStyleEditControls();
+
+ GuiCheckBox((Rectangle){ 565, 80, 20, 20 }, "SHOW CONTENT AREA", &showContentArea);
+
+ GuiSliderBar((Rectangle){ 590, 385, 145, 15}, "WIDTH", TextFormat("%i", (int)panelContentRec.width), &panelContentRec.width, 1, 600);
+ GuiSliderBar((Rectangle){ 590, 410, 145, 15 }, "HEIGHT", TextFormat("%i", (int)panelContentRec.height), &panelContentRec.height, 1, 400);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+// Draw and process scroll bar style edition controls
+static void DrawStyleEditControls(void)
+{
+ // ScrollPanel style controls
+ //----------------------------------------------------------
+ GuiGroupBox((Rectangle){ 550, 170, 220, 205 }, "SCROLLBAR STYLE");
+
+ int style = GuiGetStyle(SCROLLBAR, BORDER_WIDTH);
+ GuiLabel((Rectangle){ 555, 195, 110, 10 }, "BORDER_WIDTH");
+ GuiSpinner((Rectangle){ 670, 190, 90, 20 }, NULL, &style, 0, 6, false);
+ GuiSetStyle(SCROLLBAR, BORDER_WIDTH, style);
+
+ style = GuiGetStyle(SCROLLBAR, ARROWS_SIZE);
+ GuiLabel((Rectangle){ 555, 220, 110, 10 }, "ARROWS_SIZE");
+ GuiSpinner((Rectangle){ 670, 215, 90, 20 }, NULL, &style, 4, 14, false);
+ GuiSetStyle(SCROLLBAR, ARROWS_SIZE, style);
+
+ style = GuiGetStyle(SCROLLBAR, SLIDER_PADDING);
+ GuiLabel((Rectangle){ 555, 245, 110, 10 }, "SLIDER_PADDING");
+ GuiSpinner((Rectangle){ 670, 240, 90, 20 }, NULL, &style, 0, 14, false);
+ GuiSetStyle(SCROLLBAR, SLIDER_PADDING, style);
+
+ bool scrollBarArrows = GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE);
+ GuiCheckBox((Rectangle){ 565, 280, 20, 20 }, "ARROWS_VISIBLE", &scrollBarArrows);
+ GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, scrollBarArrows);
+
+ style = GuiGetStyle(SCROLLBAR, SLIDER_PADDING);
+ GuiLabel((Rectangle){ 555, 325, 110, 10 }, "SLIDER_PADDING");
+ GuiSpinner((Rectangle){ 670, 320, 90, 20 }, NULL, &style, 0, 14, false);
+ GuiSetStyle(SCROLLBAR, SLIDER_PADDING, style);
+
+ style = GuiGetStyle(SCROLLBAR, SLIDER_WIDTH);
+ GuiLabel((Rectangle){ 555, 350, 110, 10 }, "SLIDER_WIDTH");
+ GuiSpinner((Rectangle){ 670, 345, 90, 20 }, NULL, &style, 2, 100, false);
+ GuiSetStyle(SCROLLBAR, SLIDER_WIDTH, style);
+
+ const char *text = GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE? "SCROLLBAR: LEFT" : "SCROLLBAR: RIGHT";
+ bool toggleScrollBarSide = GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE);
+ GuiToggle((Rectangle){ 560, 110, 200, 35 }, text, &toggleScrollBarSide);
+ GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, toggleScrollBarSide);
+ //----------------------------------------------------------
+
+ // ScrollBar style controls
+ //----------------------------------------------------------
+ GuiGroupBox((Rectangle){ 550, 20, 220, 135 }, "SCROLLPANEL STYLE");
+
+ style = GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH);
+ GuiLabel((Rectangle){ 555, 35, 110, 10 }, "SCROLLBAR_WIDTH");
+ GuiSpinner((Rectangle){ 670, 30, 90, 20 }, NULL, &style, 6, 30, false);
+ GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, style);
+
+ style = GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ GuiLabel((Rectangle){ 555, 60, 110, 10 }, "BORDER_WIDTH");
+ GuiSpinner((Rectangle){ 670, 55, 90, 20 }, NULL, &style, 0, 20, false);
+ GuiSetStyle(DEFAULT, BORDER_WIDTH, style);
+ //----------------------------------------------------------
+}
diff --git a/external/raygui-4.0/examples/standalone/raygui_custom_backend.h b/external/raygui-4.0/examples/standalone/raygui_custom_backend.h
new file mode 100644
index 0000000..e430d15
--- /dev/null
+++ b/external/raygui-4.0/examples/standalone/raygui_custom_backend.h
@@ -0,0 +1,181 @@
+/*******************************************************************************************
+*
+* raygui - Standalone mode custom backend
+*
+* Just edit this file to include your custom implementation to your graphic API
+*
+* LICENSE:
+*
+* Copyright (c)
+*
+**********************************************************************************************/
+
+//#include "my_cool_graphic_api.h"
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+// TODO: Define input keys required by raygui
+//----------------------------------------------------------------------------------
+#define KEY_RIGHT 262
+#define KEY_LEFT 263
+#define KEY_DOWN 264
+#define KEY_UP 265
+#define KEY_BACKSPACE 259
+#define KEY_ENTER 257
+#define MOUSE_LEFT_BUTTON 0
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+// TODO: Define required structures, maybe Font/Texture2D should be defined here?
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition
+// TODO: Define all raygui required functions (previously provided by raylib)
+//----------------------------------------------------------------------------------
+
+//-------------------------------------------------------------------------------
+// Input required functions
+//-------------------------------------------------------------------------------
+static Vector2 GetMousePosition(void)
+{
+ Vector2 position = { 0 };
+
+ // TODO: Mouse position
+
+ return position;
+}
+
+static int GetMouseWheelMove(void)
+{
+ // TODO: Mouse wheel movement variation, reseted every frame
+
+ return 0;
+}
+
+static bool IsMouseButtonDown(int button)
+{
+ // TODO: Return true while mouse button [0..2] is being down
+
+ return false;
+}
+
+static bool IsMouseButtonPressed(int button)
+{
+ // TODO: Return true when mouse button [0..2] has been pressed: up->down
+
+ return false;
+}
+
+static bool IsMouseButtonReleased(int button)
+{
+ // TODO: Return true when mouse button [0..2] has been released: down->up
+
+ return false;
+}
+
+static bool IsKeyDown(int key)
+{
+ // TODO: Return true while key is being down
+
+ return false;
+}
+
+static bool IsKeyPressed(int key)
+{
+ // TODO: Return true when key has been pressed: up->down
+
+ return false;
+}
+
+// USED IN: GuiTextBox(), GuiValueBox()
+static int GetKeyPressed(void)
+{
+ // TODO: Return last key pressed (up->down) in the frame
+
+ return 0;
+}
+
+//-------------------------------------------------------------------------------
+// Drawing required functions
+//-------------------------------------------------------------------------------
+static void DrawRectangle(int x, int y, int width, int height, Color color)
+{
+ // TODO: Draw rectangle on the screen
+}
+
+// USED IN: GuiColorPicker()
+static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4)
+{
+ // TODO: Draw rectangle with gradients (4 vertex colors) on the screen
+}
+
+// USED IN: GuiDropdownBox(), GuiScrollBar()
+static void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color)
+{
+ // TODO: Draw triangle on the screen, required for arrows
+}
+
+//-------------------------------------------------------------------------------
+// Text required functions
+//-------------------------------------------------------------------------------
+// USED IN: GuiLoadStyleDefault()
+static Font GetFontDefault(void)
+{
+ Font font = { 0 };
+
+ // TODO: Return default rendering Font for the UI
+
+ return font;
+}
+
+// USED IN: GetTextWidth()
+static Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing)
+{
+ Vector2 size = { 0 };
+
+ // TODO: Return text size (width, height) on screen depending on the Font, text, fontSize and spacing
+
+ return size;
+}
+
+// USED IN: GuiDrawText()
+static void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint)
+{
+ // TODO: Draw text on the screen
+}
+
+//-------------------------------------------------------------------------------
+// GuiLoadStyle() required functions
+//-------------------------------------------------------------------------------
+static Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount)
+{
+ Font font = { 0 };
+
+ // TODO: Load a new font from a file
+
+ return font;
+}
+
+static char *LoadText(const char *fileName)
+{
+ // TODO: Load text file data, used by GuiLoadStyle() to load characters list required on Font generation,
+ // this is a .rgs feature, probably this function is not required in most cases
+
+ return NULL;
+}
+
+static const char *GetDirectoryPath(const char *filePath)
+{
+ // TODO: Get directory path for .rgs file, required to look for a possible .ttf/.otf font file referenced,
+ // this is a .rgs feature, probably this function is not required in most cases
+
+ return NULL;
+}
+
diff --git a/external/raygui-4.0/examples/standalone/raygui_standalone.c b/external/raygui-4.0/examples/standalone/raygui_standalone.c
new file mode 100644
index 0000000..2fbc8a2
--- /dev/null
+++ b/external/raygui-4.0/examples/standalone/raygui_standalone.c
@@ -0,0 +1,36 @@
+/*******************************************************************************************
+*
+* raygui - Standalone mode usage template
+*
+* DEPENDENCIES:
+* raygui 2.6 - Immediate-mode GUI controls.
+*
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2020 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#define RAYGUI_IMPLEMENTATION
+#define RAYGUI_STANDALONE
+#include "../../src/raygui.h"
+
+#include "custom_backend.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // TODO: Initialize your systems (window, graphics, inputs)
+
+ // TODO: Create your game loop
+ {
+ // TODO: Use raygui API
+ }
+
+ // TODO: De-initialize all resources
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/style_selector/style_selector.c b/external/raygui-4.0/examples/style_selector/style_selector.c
new file mode 100644
index 0000000..81e6feb
--- /dev/null
+++ b/external/raygui-4.0/examples/style_selector/style_selector.c
@@ -0,0 +1,136 @@
+/*******************************************************************************************
+*
+* raygui - style selector
+*
+* DEPENDENCIES:
+* raylib 4.5 - Windowing/input management and drawing
+* raygui 3.5 - Immediate-mode GUI controls with custom styling and icons
+*
+* COMPILATION (Windows - MinGW):
+* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2016-2023 Ramon Santamaria (@raysan5)
+*
+**********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+//#define RAYGUI_CUSTOM_ICONS // It requires providing gui_icons.h in the same directory
+//#include "gui_icons.h" // External icons data provided, it can be generated with rGuiIcons tool
+#include "../../src/raygui.h"
+
+// raygui embedded styles
+#include "../styles/style_cyber.h" // raygui style: cyber
+#include "../styles/style_jungle.h" // raygui style: jungle
+#include "../styles/style_lavanda.h" // raygui style: lavanda
+#include "../styles/style_dark.h" // raygui style: dark
+#include "../styles/style_bluish.h" // raygui style: bluish
+#include "../styles/style_terminal.h" // raygui style: terminal
+
+#include // Required for: strcpy()
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //---------------------------------------------------------------------------------------
+ const int screenWidth = 690;
+ const int screenHeight = 560;
+
+ InitWindow(screenWidth, screenHeight, "raygui - controls test suite");
+ SetExitKey(0);
+
+ // Custom GUI font loading
+ //Font font = LoadFontEx("fonts/custom_font.ttf", 12, 0, 0);
+ //GuiSetFont(font);
+
+ bool exitWindow = false;
+ bool showMessageBox = false;
+
+ char textInput[256] = { 0 };
+ bool showTextInputBox = false;
+
+ char textInputFileName[256] = { 0 };
+
+ // Load default style
+ GuiLoadStyleBluish();
+ int visualStyleActive = 4;
+ int prevVisualStyleActive = 4;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!exitWindow) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ exitWindow = WindowShouldClose();
+
+ if (IsKeyPressed(KEY_ESCAPE)) showMessageBox = !showMessageBox;
+
+ if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_S)) showTextInputBox = true;
+
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ if ((droppedFiles.count > 0) && IsFileExtension(droppedFiles.paths[0], ".rgs")) GuiLoadStyle(droppedFiles.paths[0]);
+
+ UnloadDroppedFiles(droppedFiles); // Clear internal buffers
+ }
+
+ if (visualStyleActive != prevVisualStyleActive)
+ {
+ GuiLoadStyleDefault();
+
+ switch (visualStyleActive)
+ {
+ case 0: break; // Default style
+ case 1: GuiLoadStyleJungle(); break;
+ case 2: GuiLoadStyleLavanda(); break;
+ case 3: GuiLoadStyleDark(); break;
+ case 4: GuiLoadStyleBluish(); break;
+ case 5: GuiLoadStyleCyber(); break;
+ case 6: GuiLoadStyleTerminal(); break;
+ default: break;
+ }
+
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+
+ prevVisualStyleActive = visualStyleActive;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
+
+ // Visuals options
+ GuiLabel((Rectangle){ 10, 10, 60, 24 }, "Style:");
+ GuiComboBox((Rectangle){ 60,10, 120, 24 }, "default;Jungle;Lavanda;Dark;Bluish;Cyber;Terminal", &visualStyleActive);
+
+ GuiSetIconScale(2);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_RIGHT);
+ GuiButton((Rectangle){ 25, 255, 300, 30 }, GuiIconText(ICON_FILE_SAVE, "Save File"));
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ //----------------------------------------------------------------------------------
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/external/raygui-4.0/examples/styles/style_bluish.h b/external/raygui-4.0/examples/styles/style_bluish.h
new file mode 100644
index 0000000..7a98731
--- /dev/null
+++ b/external/raygui-4.0/examples/styles/style_bluish.h
@@ -0,0 +1,354 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v1.2 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleBluish(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define BLUISH_STYLE_PROPS_COUNT 14
+
+// Custom style name: bluish
+static const GuiStyleProp bluishStyleProps[BLUISH_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x5ca6a6ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0xb4e8f3ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x447e77ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x5f8792ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xcdeff7ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x4c6c74ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x3b5b5fff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xeaffffff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x275057ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x96aaacff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0xc8d7d9ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x8c9c9eff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 18, 0x84adb7ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0xe8eef1ff }, // DEFAULT_BACKGROUND_COLOR
+};
+
+// WARNING: This style uses a custom font: (size: 10, spacing: 1)
+
+#define BLUISH_COMPRESSED_DATA_SIZE 1423
+
+// Font image pixels data compressed (DEFLATE)
+// NOTE: Original pixel data simplified to GRAYSCALE
+static unsigned char bluishFontData[BLUISH_COMPRESSED_DATA_SIZE] = { 0xed,
+ 0xdd, 0xd1, 0x72, 0x9b, 0x3a, 0x10, 0x00, 0x50, 0xc4, 0xff, 0x7f, 0x72, 0x41, 0x77, 0x1a, 0x3b, 0x99, 0xb9, 0x2d, 0x2b,
+ 0x58, 0x21, 0x08, 0x6d, 0x4f, 0xcf, 0xb4, 0x0f, 0x91, 0x51, 0x24, 0x2d, 0xe0, 0x34, 0x5a, 0x2f, 0x75, 0x02, 0x00, 0xf8,
+ 0xcd, 0x1c, 0x7c, 0x6d, 0x0e, 0x5f, 0x3d, 0x27, 0x7a, 0x7a, 0x7d, 0x7d, 0x6e, 0xb4, 0xe7, 0x7a, 0x9b, 0x13, 0x3d, 0xb4,
+ 0x5a, 0xda, 0x6d, 0xbf, 0x2a, 0x6f, 0x23, 0x56, 0x76, 0xfe, 0x5a, 0x8f, 0xed, 0x55, 0xca, 0xbc, 0x7e, 0x4e, 0xcd, 0x62,
+ 0x5b, 0x0d, 0xbe, 0xb6, 0x6e, 0xce, 0xb7, 0xd6, 0x12, 0xb4, 0xcc, 0xb5, 0x06, 0xe3, 0xa9, 0x1f, 0x47, 0x6d, 0xf7, 0xd8,
+ 0x3a, 0x6a, 0xeb, 0x7b, 0x2c, 0x1b, 0x7d, 0x2c, 0xe1, 0x59, 0xf1, 0xf3, 0x3b, 0x46, 0x2b, 0xb4, 0x06, 0xf1, 0xac, 0x9b,
+ 0xaf, 0x7d, 0x29, 0x87, 0x5e, 0xdd, 0xfa, 0x0e, 0xb5, 0x2e, 0x75, 0x79, 0xaf, 0xc7, 0xaf, 0xb3, 0xa8, 0xa9, 0xd7, 0xc7,
+ 0x2d, 0xe7, 0xe3, 0xbf, 0x7e, 0x8c, 0xa7, 0x6c, 0x5c, 0x07, 0x3f, 0xa3, 0xb5, 0x06, 0xf1, 0x8a, 0xc6, 0xf3, 0x5a, 0xb9,
+ 0xb2, 0xd9, 0x63, 0xeb, 0xa8, 0xe9, 0xf0, 0x6a, 0x6f, 0x1f, 0xff, 0x1a, 0xe9, 0xf6, 0x3c, 0xca, 0x47, 0xdb, 0xd6, 0xda,
+ 0x2d, 0x83, 0xee, 0xab, 0xd1, 0x7c, 0xa7, 0xe6, 0xb5, 0xb5, 0xbd, 0x0a, 0x6b, 0xaa, 0xe5, 0x7c, 0xfc, 0xe3, 0x33, 0xba,
+ 0xbe, 0xff, 0x46, 0x33, 0x5b, 0x82, 0xf1, 0x94, 0xa0, 0xa5, 0x7d, 0xd4, 0x99, 0xf8, 0x97, 0xf7, 0x48, 0xe7, 0xe0, 0x7a,
+ 0xae, 0xc1, 0x15, 0x7d, 0x65, 0xf4, 0xf3, 0xf1, 0x2f, 0xef, 0x73, 0xb5, 0x04, 0xef, 0x4a, 0xf7, 0xc6, 0xbf, 0xbc, 0xef,
+ 0xff, 0x73, 0x30, 0xfa, 0x12, 0x46, 0x3f, 0xbe, 0xdb, 0x66, 0xde, 0x57, 0x73, 0xd7, 0xff, 0x6b, 0x9d, 0xa3, 0x73, 0xeb,
+ 0xba, 0xd8, 0xb7, 0xe7, 0x9b, 0x8b, 0x7f, 0x0d, 0xdf, 0x79, 0x3e, 0xcf, 0xe2, 0xb3, 0xb3, 0x58, 0x07, 0x5d, 0xff, 0x6b,
+ 0x38, 0x9e, 0xf2, 0xbe, 0xff, 0x6f, 0xcf, 0x39, 0x73, 0x15, 0x66, 0xe2, 0xbf, 0x17, 0xe3, 0x2b, 0xaf, 0xfd, 0xb8, 0xef,
+ 0x7c, 0xfc, 0x5f, 0x3d, 0x6e, 0x7d, 0x97, 0xab, 0xcf, 0xe2, 0x29, 0xf5, 0xf3, 0x5f, 0x69, 0xfc, 0xcc, 0xf3, 0x79, 0xee,
+ 0x64, 0xe6, 0x37, 0x2a, 0xce, 0xf7, 0xab, 0xbb, 0x33, 0xc8, 0xc4, 0xbf, 0x84, 0xab, 0x5a, 0x6e, 0x7f, 0xff, 0x6f, 0xc5,
+ 0xbf, 0x35, 0xd2, 0x56, 0xfc, 0x73, 0xb3, 0xa8, 0xc9, 0x9f, 0xc1, 0x9f, 0x17, 0xff, 0xfa, 0xf5, 0xff, 0xa1, 0x63, 0x73,
+ 0x8b, 0x5e, 0xdf, 0xea, 0xe9, 0x7b, 0x66, 0xdd, 0x33, 0x9e, 0xa7, 0xcd, 0x82, 0x33, 0x7e, 0x74, 0xc4, 0xf1, 0x87, 0xd8,
+ 0x03, 0x00, 0x00, 0x00, 0x0c, 0xcb, 0xf2, 0x19, 0x95, 0x61, 0x32, 0xba, 0xe5, 0x5c, 0x56, 0x50, 0x9c, 0x9d, 0xd3, 0xca,
+ 0x48, 0x6a, 0x8f, 0xf2, 0xae, 0xf5, 0x98, 0x6e, 0xca, 0xf9, 0xa9, 0x1d, 0x19, 0x29, 0x77, 0xb5, 0x2c, 0x87, 0xb3, 0x30,
+ 0xb6, 0x77, 0x73, 0xe3, 0xec, 0x9c, 0x35, 0x58, 0xab, 0xbd, 0x51, 0xde, 0xb7, 0x1e, 0x73, 0xc7, 0xe8, 0x7a, 0x7e, 0x5b,
+ 0x5e, 0x77, 0x76, 0xe7, 0x96, 0x54, 0xcb, 0xba, 0xbb, 0xd7, 0x97, 0xcb, 0x7c, 0x39, 0xb7, 0xaf, 0xda, 0xca, 0xce, 0x8b,
+ 0xf2, 0x3f, 0x5a, 0xa3, 0x8c, 0xf2, 0x2a, 0x6a, 0xf7, 0xac, 0x97, 0xa1, 0xc7, 0x2c, 0x5d, 0xf1, 0x8f, 0x67, 0x15, 0xef,
+ 0xcd, 0xb7, 0xb3, 0x1e, 0xe3, 0xde, 0x72, 0x2d, 0xc7, 0xb3, 0x0f, 0xa2, 0x18, 0xc7, 0x39, 0x12, 0xd9, 0xdc, 0x99, 0xda,
+ 0xc8, 0xab, 0xd8, 0x9b, 0xdb, 0x92, 0xda, 0x9b, 0xac, 0x3b, 0x6b, 0x78, 0x3e, 0x5b, 0xe6, 0x58, 0x76, 0xc6, 0xda, 0x98,
+ 0x6f, 0x3b, 0xc3, 0x64, 0x4d, 0x1d, 0xb3, 0x0e, 0xc8, 0x57, 0xc9, 0x9e, 0x3d, 0xad, 0x3c, 0x9c, 0xb5, 0x11, 0xff, 0x39,
+ 0x39, 0xb7, 0x57, 0xcb, 0x9c, 0xda, 0x0b, 0xae, 0x3b, 0x6b, 0x78, 0x3e, 0x5b, 0xe6, 0xd8, 0xfa, 0x95, 0xee, 0x3b, 0xf6,
+ 0xa8, 0x63, 0xae, 0x3b, 0x03, 0x6a, 0xba, 0x9f, 0xfa, 0x75, 0xa6, 0x8e, 0xbc, 0xff, 0x97, 0x8e, 0x77, 0xe4, 0x72, 0x3a,
+ 0x57, 0xe3, 0xf8, 0x1d, 0xbb, 0x2f, 0xc3, 0x64, 0xd4, 0x31, 0xcf, 0xca, 0xdd, 0x28, 0x9d, 0x77, 0xec, 0x7b, 0x5a, 0xae,
+ 0x88, 0x7f, 0x6f, 0x86, 0xc9, 0x3a, 0xec, 0x98, 0xe9, 0xf6, 0x9c, 0x9e, 0x1a, 0x5e, 0xff, 0xad, 0xf5, 0x18, 0xb9, 0x86,
+ 0xad, 0x3c, 0xa0, 0xf6, 0x08, 0xfe, 0x05, 0x8b, 0xdf, 0xd9, 0x00, 0x00, 0x00, 0x00, 0x40, 0x22, 0xff, 0xa7, 0x9d, 0x7d,
+ 0x93, 0xcb, 0x50, 0x69, 0x67, 0xed, 0x64, 0x6b, 0xf4, 0xcc, 0xb7, 0x67, 0xdd, 0x8c, 0x6e, 0xe9, 0x59, 0x8b, 0xbd, 0x96,
+ 0xdc, 0x91, 0xfb, 0xbf, 0xef, 0x8e, 0x73, 0x4a, 0xa2, 0xdf, 0x6a, 0x2f, 0x1f, 0x47, 0x8d, 0xd9, 0xfd, 0xab, 0xbb, 0x23,
+ 0x7b, 0xfd, 0x3b, 0x3f, 0x30, 0x3f, 0xa9, 0x95, 0xb9, 0xf4, 0x39, 0xf2, 0x91, 0xbb, 0x85, 0xaf, 0x96, 0x65, 0x73, 0x2d,
+ 0x7a, 0xf7, 0xd0, 0x7a, 0xf2, 0x50, 0xda, 0xbb, 0x61, 0xe3, 0xe2, 0xdf, 0x3b, 0xe7, 0x7b, 0x5b, 0xb2, 0x75, 0x44, 0x9e,
+ 0x17, 0xff, 0x56, 0x96, 0xcf, 0xa8, 0xf8, 0x9f, 0xcb, 0x83, 0x19, 0x17, 0xff, 0x9e, 0x1c, 0xae, 0x78, 0xec, 0xad, 0x3c,
+ 0xa8, 0x3b, 0xe3, 0x1f, 0xd7, 0xd1, 0x3a, 0x12, 0xff, 0x7c, 0x96, 0x4f, 0x3e, 0xfe, 0xe7, 0xf2, 0x60, 0xc6, 0xc5, 0xbf,
+ 0x27, 0x87, 0x63, 0x6d, 0x54, 0x8b, 0x5a, 0xd3, 0xb5, 0x47, 0xea, 0x4e, 0x8e, 0xe1, 0xd2, 0x11, 0xff, 0x12, 0x8e, 0xf1,
+ 0x6c, 0xfe, 0x67, 0xe6, 0xfa, 0x2f, 0x97, 0xe5, 0xc1, 0x8c, 0xbd, 0xff, 0x8f, 0x5a, 0x87, 0xb2, 0x93, 0x7d, 0x58, 0x3a,
+ 0xb2, 0x45, 0xd6, 0xc1, 0x6b, 0x71, 0x2c, 0xdf, 0x61, 0x4c, 0xfc, 0x7b, 0xfa, 0x3a, 0x76, 0x4c, 0x36, 0xfe, 0xa5, 0x23,
+ 0xfe, 0x23, 0xc7, 0xde, 0x8e, 0x7f, 0x69, 0x64, 0x8b, 0xec, 0x1f, 0x33, 0x3a, 0xfe, 0xbd, 0x59, 0x2d, 0x65, 0x60, 0x5f,
+ 0x75, 0x70, 0xfc, 0xf3, 0x79, 0x32, 0x63, 0xc7, 0xde, 0x8e, 0x7f, 0xff, 0xe8, 0x5e, 0x7f, 0xe6, 0x0b, 0x72, 0xe8, 0x51,
+ 0x71, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x7f, 0xa6, 0xc6, 0x13, 0xa9, 0xda, 0x59, 0x46, 0xc7, 0xb3, 0x85, 0x3e, 0x33,
+ 0x28, 0xb6, 0xf3, 0x27, 0xc6, 0x54, 0xfa, 0xd9, 0x7f, 0x76, 0x57, 0xf6, 0xfb, 0x44, 0xab, 0xd5, 0x33, 0xb6, 0xab, 0x9f,
+ 0x71, 0x76, 0x2c, 0xcb, 0xa7, 0x95, 0xf7, 0x92, 0xfb, 0x0c, 0x6a, 0x54, 0x9b, 0x66, 0x0e, 0x2a, 0xdd, 0x64, 0x3f, 0xbb,
+ 0xdf, 0xaa, 0x55, 0x11, 0xf7, 0x33, 0xb2, 0x8a, 0x45, 0x0d, 0xcf, 0xd7, 0xda, 0x31, 0xb6, 0x25, 0xf8, 0x6a, 0xd4, 0xc7,
+ 0xdc, 0xfd, 0x49, 0xe9, 0xfe, 0x5a, 0x0e, 0x47, 0x6b, 0x2a, 0xc5, 0x3b, 0x86, 0xaf, 0xbd, 0xee, 0xec, 0x19, 0xb0, 0x86,
+ 0xd7, 0xd8, 0xf6, 0x58, 0xe7, 0x30, 0xbf, 0x65, 0x0a, 0x9f, 0x66, 0x96, 0xaf, 0x55, 0x53, 0x83, 0xa7, 0x86, 0xb5, 0xf7,
+ 0x8f, 0xa2, 0xb1, 0x45, 0x4f, 0x4b, 0x9a, 0x82, 0x3e, 0x96, 0xee, 0xcf, 0x84, 0xd7, 0x9d, 0xe7, 0x48, 0x65, 0x7a, 0x6e,
+ 0x9d, 0x01, 0xad, 0x27, 0xb9, 0x2d, 0x03, 0x9e, 0x55, 0x92, 0xaf, 0x55, 0xd3, 0xca, 0x3c, 0x68, 0xf7, 0x96, 0xad, 0xcd,
+ 0x12, 0x9f, 0x33, 0xb9, 0x3b, 0xc3, 0xa8, 0x0a, 0x33, 0xc7, 0xee, 0x9c, 0xa5, 0x31, 0xa3, 0x29, 0x7d, 0x06, 0x5c, 0xfb,
+ 0x24, 0x8f, 0xeb, 0x32, 0x0f, 0x8e, 0xce, 0x62, 0xf4, 0xce, 0xf2, 0xf1, 0xf8, 0x4f, 0xa7, 0x6a, 0x82, 0x94, 0xee, 0x5c,
+ 0x99, 0xdc, 0x19, 0x70, 0x75, 0xfc, 0xaf, 0xca, 0x3c, 0x18, 0x55, 0x81, 0x63, 0x7d, 0x68, 0xfc, 0xf7, 0xaa, 0xcd, 0xe4,
+ 0x63, 0x99, 0xcf, 0x18, 0x9d, 0xbe, 0xe5, 0xce, 0x30, 0xfa, 0x98, 0x29, 0xfd, 0x3f, 0x99, 0x67, 0xc4, 0xbf, 0xaf, 0x42,
+ 0x4d, 0x49, 0xd7, 0x12, 0xfa, 0xae, 0xf8, 0xe7, 0x9f, 0x23, 0xd5, 0x77, 0xcc, 0xf8, 0xdc, 0xcb, 0x3b, 0xe2, 0xcf, 0x9f,
+ 0x53, 0xf9, 0x68, 0x91, 0x9f, 0x04, 0x00, 0x00, 0x00, 0x40, 0x52, 0xf9, 0x9f, 0x4c, 0xf6, 0xca, 0xf7, 0xb7, 0xcc, 0x3b,
+ 0xbb, 0x5a, 0xa5, 0xbb, 0xa5, 0x0c, 0xeb, 0xb3, 0x95, 0x63, 0x74, 0xf6, 0x99, 0x67, 0x9f, 0x7d, 0x97, 0x01, 0x3b, 0xe7,
+ 0xaf, 0x7f, 0xe7, 0x41, 0x3b, 0xeb, 0xe3, 0x5b, 0xae, 0xff, 0x34, 0xff, 0x15, 0xf5, 0x06, 0x5a, 0x15, 0x22, 0xe6, 0xc3,
+ 0xb9, 0x15, 0x4b, 0xb8, 0xa7, 0xba, 0x36, 0x6a, 0x06, 0xe4, 0xf7, 0x20, 0xbe, 0xbf, 0xca, 0xce, 0x92, 0x7c, 0x0e, 0xd5,
+ 0x7c, 0x63, 0x8d, 0x8d, 0x75, 0x27, 0x1f, 0x26, 0x97, 0x43, 0x13, 0xd7, 0x50, 0x98, 0x52, 0xaf, 0x8d, 0x9e, 0x49, 0xf4,
+ 0x67, 0xc6, 0x7f, 0x4a, 0xe6, 0xf6, 0xad, 0x07, 0xea, 0x65, 0x8c, 0xaa, 0xb1, 0x51, 0x3a, 0x32, 0x7c, 0x4a, 0xe3, 0xf9,
+ 0x63, 0xb9, 0xf8, 0x47, 0x4f, 0xab, 0x5b, 0x4f, 0x3e, 0xf9, 0xe9, 0x9a, 0x2a, 0x1b, 0xe3, 0x9f, 0x60, 0x33, 0xae, 0x9a,
+ 0xc7, 0xf8, 0x1a, 0x1b, 0xad, 0x9d, 0xf2, 0x38, 0xaf, 0x32, 0x17, 0xff, 0xab, 0x6a, 0x3b, 0x5c, 0x53, 0x65, 0xa3, 0xb7,
+ 0x42, 0x48, 0x4f, 0x6e, 0x4f, 0x79, 0x48, 0x8d, 0x8d, 0x6c, 0x85, 0x90, 0xf3, 0xf7, 0xff, 0xe7, 0xee, 0x54, 0xdf, 0x53,
+ 0x67, 0xa3, 0x27, 0x4f, 0xe7, 0xaa, 0x9d, 0xf9, 0xfc, 0xee, 0x7c, 0x26, 0xb7, 0x52, 0x65, 0x97, 0x51, 0x79, 0x3a, 0x4f,
+ 0xf2, 0x94, 0x67, 0x9e, 0xf1, 0xa4, 0x73, 0xda, 0x1a, 0xfc, 0xdb, 0x59, 0x5e, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x2f,
+ 0xf0, 0x1f };
+
+// Font characters rectangles data
+static const Rectangle bluishFontRecs[95] = {
+ { 4, 4, 5 , 10 },
+ { 17, 4, 2 , 8 },
+ { 27, 4, 4 , 3 },
+ { 39, 4, 6 , 8 },
+ { 53, 4, 5 , 10 },
+ { 66, 4, 6 , 8 },
+ { 80, 4, 5 , 10 },
+ { 93, 4, 2 , 3 },
+ { 103, 4, 3 , 8 },
+ { 114, 4, 3 , 8 },
+ { 125, 4, 6 , 6 },
+ { 139, 4, 6 , 6 },
+ { 153, 4, 2 , 3 },
+ { 163, 4, 5 , 2 },
+ { 176, 4, 2 , 2 },
+ { 186, 4, 6 , 8 },
+ { 200, 4, 5 , 8 },
+ { 213, 4, 3 , 8 },
+ { 224, 4, 5 , 8 },
+ { 237, 4, 5 , 8 },
+ { 4, 22, 5 , 8 },
+ { 17, 22, 5 , 8 },
+ { 30, 22, 5 , 8 },
+ { 43, 22, 5 , 8 },
+ { 56, 22, 5 , 8 },
+ { 69, 22, 5 , 8 },
+ { 82, 22, 2 , 8 },
+ { 92, 22, 2 , 9 },
+ { 102, 22, 4 , 6 },
+ { 114, 22, 5 , 4 },
+ { 127, 22, 4 , 6 },
+ { 139, 22, 5 , 8 },
+ { 152, 22, 6 , 8 },
+ { 166, 22, 5 , 8 },
+ { 179, 22, 5 , 8 },
+ { 192, 22, 5 , 8 },
+ { 205, 22, 5 , 8 },
+ { 218, 22, 5 , 8 },
+ { 231, 22, 5 , 8 },
+ { 4, 40, 5 , 8 },
+ { 17, 40, 5 , 8 },
+ { 30, 40, 4 , 8 },
+ { 42, 40, 5 , 8 },
+ { 55, 40, 5 , 8 },
+ { 68, 40, 5 , 8 },
+ { 81, 40, 8 , 8 },
+ { 97, 40, 5 , 8 },
+ { 110, 40, 5 , 8 },
+ { 123, 40, 5 , 8 },
+ { 136, 40, 5 , 9 },
+ { 149, 40, 5 , 8 },
+ { 162, 40, 5 , 8 },
+ { 175, 40, 6 , 8 },
+ { 189, 40, 5 , 8 },
+ { 202, 40, 5 , 8 },
+ { 215, 40, 8 , 8 },
+ { 231, 40, 5 , 8 },
+ { 4, 58, 5 , 8 },
+ { 17, 58, 5 , 8 },
+ { 30, 58, 3 , 8 },
+ { 41, 58, 6 , 8 },
+ { 55, 58, 3 , 8 },
+ { 66, 58, 6 , 4 },
+ { 80, 58, 5 , 1 },
+ { 93, 58, 2 , 3 },
+ { 103, 58, 5 , 6 },
+ { 116, 58, 5 , 8 },
+ { 129, 58, 5 , 6 },
+ { 142, 58, 5 , 8 },
+ { 155, 58, 5 , 6 },
+ { 168, 58, 5 , 8 },
+ { 181, 58, 5 , 7 },
+ { 194, 58, 5 , 8 },
+ { 207, 58, 2 , 8 },
+ { 217, 58, 3 , 9 },
+ { 228, 58, 5 , 8 },
+ { 241, 58, 2 , 8 },
+ { 4, 76, 8 , 6 },
+ { 20, 76, 5 , 6 },
+ { 33, 76, 5 , 6 },
+ { 46, 76, 5 , 7 },
+ { 59, 76, 5 , 7 },
+ { 72, 76, 5 , 6 },
+ { 85, 76, 5 , 6 },
+ { 98, 76, 5 , 8 },
+ { 111, 76, 5 , 6 },
+ { 124, 76, 5 , 6 },
+ { 137, 76, 8 , 6 },
+ { 153, 76, 5 , 6 },
+ { 166, 76, 5 , 7 },
+ { 179, 76, 5 , 6 },
+ { 192, 76, 4 , 8 },
+ { 204, 76, 2 , 10 },
+ { 214, 76, 4 , 8 },
+ { 226, 76, 6 , 4 },
+};
+
+// Font characters info data
+// NOTE: No chars.image data provided
+static const GlyphInfo bluishFontChars[95] = {
+ { 32, 0, 9, 5, { 0 }},
+ { 33, 0, 1, 2, { 0 }},
+ { 34, 0, 1, 4, { 0 }},
+ { 35, 0, 1, 6, { 0 }},
+ { 36, 0, 0, 5, { 0 }},
+ { 37, 0, 1, 6, { 0 }},
+ { 38, 0, 0, 5, { 0 }},
+ { 39, 0, 1, 2, { 0 }},
+ { 40, 0, 1, 3, { 0 }},
+ { 41, 0, 1, 3, { 0 }},
+ { 42, 0, 1, 6, { 0 }},
+ { 43, 0, 2, 6, { 0 }},
+ { 44, 0, 7, 2, { 0 }},
+ { 45, 0, 4, 5, { 0 }},
+ { 46, 0, 7, 2, { 0 }},
+ { 47, 0, 1, 6, { 0 }},
+ { 48, 0, 1, 5, { 0 }},
+ { 49, 0, 1, 3, { 0 }},
+ { 50, 0, 1, 5, { 0 }},
+ { 51, 0, 1, 5, { 0 }},
+ { 52, 0, 1, 5, { 0 }},
+ { 53, 0, 1, 5, { 0 }},
+ { 54, 0, 1, 5, { 0 }},
+ { 55, 0, 1, 5, { 0 }},
+ { 56, 0, 1, 5, { 0 }},
+ { 57, 0, 1, 5, { 0 }},
+ { 58, 0, 1, 2, { 0 }},
+ { 59, 0, 1, 2, { 0 }},
+ { 60, 0, 2, 4, { 0 }},
+ { 61, 0, 3, 5, { 0 }},
+ { 62, 0, 2, 4, { 0 }},
+ { 63, 0, 1, 5, { 0 }},
+ { 64, 0, 1, 6, { 0 }},
+ { 65, 0, 1, 5, { 0 }},
+ { 66, 0, 1, 5, { 0 }},
+ { 67, 0, 1, 5, { 0 }},
+ { 68, 0, 1, 5, { 0 }},
+ { 69, 0, 1, 5, { 0 }},
+ { 70, 0, 1, 5, { 0 }},
+ { 71, 0, 1, 5, { 0 }},
+ { 72, 0, 1, 5, { 0 }},
+ { 73, 0, 1, 4, { 0 }},
+ { 74, 0, 1, 5, { 0 }},
+ { 75, 0, 1, 5, { 0 }},
+ { 76, 0, 1, 5, { 0 }},
+ { 77, 0, 1, 8, { 0 }},
+ { 78, 0, 1, 5, { 0 }},
+ { 79, 0, 1, 5, { 0 }},
+ { 80, 0, 1, 5, { 0 }},
+ { 81, 0, 1, 5, { 0 }},
+ { 82, 0, 1, 5, { 0 }},
+ { 83, 0, 1, 5, { 0 }},
+ { 84, 0, 1, 6, { 0 }},
+ { 85, 0, 1, 5, { 0 }},
+ { 86, 0, 1, 5, { 0 }},
+ { 87, 0, 1, 8, { 0 }},
+ { 88, 0, 1, 5, { 0 }},
+ { 89, 0, 1, 5, { 0 }},
+ { 90, 0, 1, 5, { 0 }},
+ { 91, 0, 1, 3, { 0 }},
+ { 92, 0, 1, 6, { 0 }},
+ { 93, 0, 1, 3, { 0 }},
+ { 94, 0, 1, 6, { 0 }},
+ { 95, 0, 9, 5, { 0 }},
+ { 96, 0, 1, 2, { 0 }},
+ { 97, 0, 3, 5, { 0 }},
+ { 98, 0, 1, 5, { 0 }},
+ { 99, 0, 3, 5, { 0 }},
+ { 100, 0, 1, 5, { 0 }},
+ { 101, 0, 3, 5, { 0 }},
+ { 102, 0, 1, 5, { 0 }},
+ { 103, 0, 3, 5, { 0 }},
+ { 104, 0, 1, 5, { 0 }},
+ { 105, 0, 1, 2, { 0 }},
+ { 106, 0, 1, 3, { 0 }},
+ { 107, 0, 1, 5, { 0 }},
+ { 108, 0, 1, 2, { 0 }},
+ { 109, 0, 3, 8, { 0 }},
+ { 110, 0, 3, 5, { 0 }},
+ { 111, 0, 3, 5, { 0 }},
+ { 112, 0, 3, 5, { 0 }},
+ { 113, 0, 3, 5, { 0 }},
+ { 114, 0, 3, 5, { 0 }},
+ { 115, 0, 3, 5, { 0 }},
+ { 116, 0, 1, 5, { 0 }},
+ { 117, 0, 3, 5, { 0 }},
+ { 118, 0, 3, 5, { 0 }},
+ { 119, 0, 3, 8, { 0 }},
+ { 120, 0, 3, 5, { 0 }},
+ { 121, 0, 3, 5, { 0 }},
+ { 122, 0, 3, 5, { 0 }},
+ { 123, 0, 1, 4, { 0 }},
+ { 124, 0, 0, 2, { 0 }},
+ { 125, 0, 1, 4, { 0 }},
+ { 126, 0, 3, 6, { 0 }},
+};
+
+// Style loading function: bluish
+static void GuiLoadStyleBluish(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < BLUISH_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(bluishStyleProps[i].controlId, bluishStyleProps[i].propertyId, bluishStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int bluishFontDataSize = 0;
+ unsigned char *data = DecompressData(bluishFontData, BLUISH_COMPRESSED_DATA_SIZE, &bluishFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 10;
+ font.glyphCount = 95;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)malloc(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, bluishFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)malloc(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, bluishFontChars, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // this way we make sure all gui can be drawn on a single pass because no texture change is required
+ // NOTE: Setting up this rectangle is a manual process (for the moment)
+ Rectangle whiteChar = { 66, 5, 2, 2 };
+ SetShapesTexture(font.texture, whiteChar);
+}
diff --git a/external/raygui-4.0/examples/styles/style_cyber.h b/external/raygui-4.0/examples/styles/style_cyber.h
new file mode 100644
index 0000000..18219df
--- /dev/null
+++ b/external/raygui-4.0/examples/styles/style_cyber.h
@@ -0,0 +1,340 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v1.2 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleCyber(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define CYBER_STYLE_PROPS_COUNT 16
+
+// Custom style name: cyber
+static const GuiStyleProp cyberStyleProps[CYBER_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x2f7486ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x024658ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x51bfd3ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x82cde0ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x3299b4ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xb6e1eaff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xeb7630ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xffbc51ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0xd86f36ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x134b5aff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x02313dff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x17505fff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x0000000e }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x81c0d0ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x00222bff }, // DEFAULT_BACKGROUND_COLOR
+};
+
+// WARNING: This style uses a custom font: (size: 14, spacing: 0)
+
+#define CYBER_COMPRESSED_DATA_SIZE 1104
+
+// Font image pixels data compressed (DEFLATE)
+// NOTE: Original pixel data simplified to GRAYSCALE
+static unsigned char cyberFontData[CYBER_COMPRESSED_DATA_SIZE] = { 0xed,
+ 0xdd, 0xe1, 0x6e, 0x9b, 0x30, 0x14, 0x05, 0x60, 0xb4, 0xf7, 0x7f, 0xe3, 0x8d, 0x9d, 0x49, 0x95, 0xb6, 0xa9, 0x9b, 0x02,
+ 0xf6, 0xb5, 0x4d, 0x48, 0xfa, 0xed, 0xfb, 0xd7, 0x94, 0x05, 0x7c, 0xb1, 0x81, 0xfa, 0xc4, 0xc9, 0x06, 0x00, 0xb0, 0x58,
+ 0x2e, 0x7e, 0xb7, 0x34, 0xff, 0x74, 0xde, 0x11, 0xfd, 0xfe, 0xf7, 0xdc, 0x63, 0x5f, 0x77, 0x74, 0x8f, 0x8e, 0x24, 0x27,
+ 0xc7, 0x99, 0x87, 0x2d, 0xf3, 0xef, 0x56, 0x39, 0xd8, 0xbe, 0x6f, 0x4f, 0xfb, 0xce, 0xc3, 0x1c, 0xee, 0xfd, 0xda, 0xf3,
+ 0x39, 0x87, 0x6d, 0xb6, 0x77, 0x6c, 0x75, 0xdc, 0xce, 0xab, 0xea, 0xff, 0xf9, 0xdf, 0xa3, 0xff, 0x29, 0x0d, 0xad, 0x56,
+ 0x3d, 0xbb, 0xc6, 0xeb, 0xbf, 0x75, 0x9d, 0x5f, 0xeb, 0xc7, 0xc5, 0x34, 0x54, 0xba, 0xbf, 0x1f, 0xad, 0x1a, 0xaf, 0xf7,
+ 0x86, 0x63, 0xd9, 0xcb, 0xef, 0x98, 0xee, 0x3d, 0xea, 0xad, 0x7f, 0x0e, 0x46, 0xee, 0x79, 0x3d, 0xaa, 0x7a, 0x36, 0x56,
+ 0xc6, 0x9f, 0x6b, 0xeb, 0x3f, 0x36, 0xfe, 0x9f, 0xbf, 0xdf, 0xf7, 0x0f, 0xed, 0x7b, 0xf5, 0x2a, 0xfd, 0xbf, 0xed, 0x3d,
+ 0x73, 0x93, 0xf1, 0xbf, 0x5e, 0xff, 0xbf, 0xfd, 0x3f, 0x03, 0x15, 0x6b, 0x3f, 0xae, 0x2b, 0xae, 0xff, 0xe3, 0xf6, 0xc6,
+ 0xbd, 0xcc, 0x84, 0xab, 0xde, 0xea, 0x7b, 0xed, 0xb1, 0xeb, 0x7f, 0x1a, 0xcf, 0xae, 0x75, 0xf5, 0xbf, 0xde, 0x8f, 0xe6,
+ 0x23, 0x78, 0x4e, 0xfd, 0xaf, 0x1b, 0xff, 0x7b, 0xee, 0xff, 0xf3, 0x26, 0xf5, 0x4f, 0x47, 0xaf, 0xea, 0x7d, 0xfa, 0x5c,
+ 0x79, 0xbf, 0xe2, 0xf9, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xd3, 0xac, 0x63, 0x0a, 0xc9, 0x86, 0xf7, 0x6e,
+ 0xa3, 0x96, 0xa3, 0xcc, 0x49, 0x4e, 0x35, 0x0d, 0xbf, 0x71, 0xb6, 0x7d, 0x6d, 0x1e, 0xfc, 0x38, 0x27, 0xbb, 0x36, 0xf1,
+ 0xb0, 0x35, 0x67, 0xc0, 0x67, 0x1c, 0x4d, 0x9a, 0xb7, 0xaf, 0x65, 0x25, 0x8f, 0xf3, 0x68, 0xb5, 0x1c, 0x74, 0x86, 0x32,
+ 0x8b, 0x19, 0x7c, 0x7d, 0x74, 0xa4, 0x38, 0x4b, 0x35, 0x3d, 0xfe, 0xe9, 0x8a, 0xa3, 0xc9, 0xa7, 0x4c, 0xe4, 0xfc, 0xd6,
+ 0x38, 0xce, 0x9a, 0x54, 0xfb, 0xef, 0xda, 0x1c, 0x74, 0xff, 0x58, 0x9f, 0x49, 0xe9, 0x94, 0xda, 0xd9, 0xfc, 0xbb, 0xa5,
+ 0x46, 0x8f, 0x66, 0x9f, 0x98, 0xb1, 0x69, 0x4b, 0x1a, 0x65, 0xb0, 0x0f, 0xed, 0x85, 0xb6, 0xfc, 0x96, 0xfd, 0x8f, 0xad,
+ 0x38, 0x26, 0xae, 0xa9, 0xfe, 0x59, 0xde, 0xed, 0xd1, 0xef, 0xef, 0x43, 0x9f, 0xa4, 0x48, 0x7e, 0x7e, 0xd8, 0x97, 0x64,
+ 0xac, 0x72, 0x78, 0x45, 0x4a, 0xd7, 0x58, 0xdf, 0x33, 0x26, 0xb5, 0xe5, 0xa0, 0xf7, 0x85, 0x09, 0xb3, 0x2c, 0xca, 0xee,
+ 0x3f, 0xea, 0xff, 0xd7, 0x8d, 0x76, 0xdb, 0xd2, 0xeb, 0xf3, 0x9c, 0x2b, 0x74, 0x3d, 0x07, 0xbf, 0xf6, 0xfa, 0x7f, 0xd5,
+ 0x19, 0xb3, 0x62, 0xfc, 0x9f, 0xff, 0x94, 0x33, 0x7a, 0x4f, 0x9b, 0x62, 0x5e, 0x77, 0xf6, 0x1d, 0xef, 0xda, 0xfb, 0xff,
+ 0xd6, 0xa3, 0x49, 0xf1, 0x53, 0x5f, 0x57, 0xb5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x9a, 0xfe, 0x4d,
+ 0x69, 0xc6, 0x7a, 0x6c, 0xeb, 0x7a, 0xfe, 0x72, 0x5d, 0x4e, 0x26, 0x27, 0xbf, 0xdb, 0xba, 0x5e, 0xd9, 0x79, 0x8a, 0x77,
+ 0xbf, 0x41, 0x0a, 0x78, 0x2c, 0x53, 0x98, 0xa5, 0x79, 0x97, 0xde, 0xff, 0x63, 0x56, 0xfd, 0x73, 0x98, 0xe4, 0xcb, 0x85,
+ 0x29, 0xdf, 0xf5, 0x99, 0xe8, 0x99, 0x7d, 0xe5, 0x7e, 0xf5, 0xaf, 0xae, 0x37, 0x99, 0x83, 0xd4, 0x7b, 0x4e, 0x32, 0xb1,
+ 0x77, 0xaa, 0xff, 0x36, 0xa1, 0xfe, 0xf5, 0xf1, 0x3f, 0x27, 0xe9, 0xe2, 0x34, 0x8d, 0x65, 0x73, 0x73, 0xfb, 0xad, 0x67,
+ 0xed, 0xe3, 0x15, 0x27, 0xcf, 0xd6, 0x33, 0x7d, 0x7e, 0xff, 0xae, 0x8e, 0xff, 0x2b, 0xfb, 0x7f, 0x5e, 0xaa, 0xff, 0xb7,
+ 0x5c, 0xff, 0xeb, 0x29, 0xfe, 0x0c, 0xa6, 0x80, 0xf7, 0xe6, 0xfa, 0xde, 0x67, 0xfc, 0x9f, 0x5b, 0xff, 0xdc, 0xe2, 0xfe,
+ 0x2f, 0x4b, 0xc6, 0xe7, 0xf6, 0xf1, 0x25, 0x83, 0x89, 0xee, 0xb9, 0x77, 0xf0, 0xd7, 0xde, 0xff, 0x8f, 0xf5, 0xa0, 0xf6,
+ 0x63, 0xca, 0xf4, 0xf1, 0x77, 0x74, 0xed, 0xdf, 0xb9, 0xe3, 0x3f, 0xaf, 0xf4, 0xd9, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0x8f, 0x96, 0xe2, 0x6a, 0x5d, 0xe9, 0x5c, 0x13, 0xaa, 0xb2, 0xfa, 0x6a, 0x7d, 0x9e, 0x76, 0xce, 0x2c, 0x6f,
+ 0x86, 0xe7, 0xe8, 0xdb, 0x5e, 0x4f, 0x79, 0x3e, 0xbd, 0x67, 0x36, 0xbf, 0x27, 0xa3, 0x90, 0xf2, 0x1c, 0xec, 0x75, 0xab,
+ 0x85, 0x8e, 0xcf, 0x0e, 0x8f, 0x7e, 0x63, 0xf2, 0xfa, 0xfa, 0xb7, 0x7c, 0x7f, 0x74, 0x3d, 0x0b, 0x36, 0xf6, 0xcd, 0xfe,
+ 0x39, 0xcc, 0x87, 0x8e, 0x9f, 0x01, 0xf5, 0x6c, 0xcd, 0x3b, 0xd5, 0xff, 0xbc, 0x4d, 0x53, 0xae, 0xfe, 0xd8, 0xb7, 0x81,
+ 0xaf, 0xcd, 0x60, 0xec, 0x4d, 0xe7, 0x46, 0x6d, 0xad, 0xd7, 0x7d, 0x78, 0x55, 0xdc, 0x2b, 0xeb, 0x3f, 0x5e, 0x89, 0x2c,
+ 0xc9, 0xa8, 0xe7, 0xb2, 0x4f, 0xdf, 0x54, 0x72, 0x7e, 0xf5, 0x6d, 0xe7, 0xd5, 0xbf, 0xa5, 0x67, 0x8f, 0xf7, 0xff, 0x91,
+ 0x57, 0xd3, 0xdc, 0x0b, 0xef, 0x95, 0xc1, 0xca, 0xc0, 0x5e, 0x5c, 0x59, 0xff, 0xe3, 0xea, 0xcd, 0xb8, 0xfe, 0x8f, 0x55,
+ 0xf8, 0xbc, 0x05, 0x7e, 0xa8, 0xff, 0xe0, 0x73, 0x46, 0x1a, 0x9e, 0xa3, 0xaa, 0x4f, 0x18, 0xe7, 0xaf, 0x8c, 0x65, 0x94,
+ 0x47, 0x9f, 0x11, 0x9e, 0x71, 0x6d, 0xb8, 0xea, 0xe9, 0xd0, 0xf3, 0xbf, 0xbf, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x8a, 0xf3, 0x63, 0x79, 0x93, 0xf9, 0xc5, 0x34, 0x7d, 0x8b, 0xf6, 0xf9, 0xea, 0xa9, 0xc7, 0x6b, 0xaf, 0xee, 0xa5,
+ 0xd4, 0x55, 0x7d, 0x9f, 0xe6, 0x27, 0x04, 0xfe, 0xdf, 0x72, 0xef, 0x98, 0x05, 0xcd, 0xf4, 0xe4, 0x6a, 0x26, 0xa5, 0x3a,
+ 0x7a, 0xf2, 0xc6, 0xfd, 0xc9, 0xa9, 0x39, 0xaf, 0xce, 0xca, 0xb6, 0xcd, 0xa9, 0xff, 0x58, 0x76, 0x3a, 0xcb, 0x52, 0x13,
+ 0x5f, 0xa7, 0xfe, 0x5b, 0x71, 0xbd, 0xd2, 0xb9, 0xfd, 0xbf, 0x67, 0xbf, 0x52, 0x4e, 0x35, 0x57, 0xfa, 0x7f, 0xde, 0xbe,
+ 0xfe, 0xb5, 0xd6, 0xcc, 0x94, 0x1e, 0x57, 0xcb, 0x4e, 0xed, 0xe5, 0xf4, 0x69, 0x6f, 0xfd, 0x73, 0x69, 0xff, 0xdf, 0x1a,
+ 0x57, 0xc3, 0x9c, 0xd9, 0x96, 0xf5, 0xf5, 0x8a, 0x57, 0xdf, 0x85, 0xd5, 0x3f, 0x21, 0x31, 0xa3, 0xfe, 0x63, 0xab, 0x68,
+ 0x3e, 0xa7, 0x3d, 0x56, 0xec, 0x5d, 0x6e, 0x90, 0x41, 0xed, 0xeb, 0x25, 0x33, 0xfb, 0xff, 0xca, 0x7b, 0x0c, 0xf5, 0x5f,
+ 0xf1, 0xce, 0x57, 0xd4, 0x7f, 0xfb, 0x52, 0xe9, 0xcc, 0xf7, 0xcf, 0xa2, 0x4a, 0xda, 0x7e, 0xed, 0xbf, 0x40, 0x69, 0x05,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd9, 0xf3, 0x6e, 0x79, 0x42, 0x9a, 0xaa, 0x25, 0x4f, 0xd3, 0x96, 0x14, 0x39, 0x9e,
+ 0x5b, 0x32, 0xc3, 0xb4, 0xaa, 0xfe, 0x47, 0xdf, 0x54, 0xdc, 0x9e, 0x50, 0xcb, 0x92, 0x9f, 0xaa, 0xfd, 0x15, 0xf5, 0xdf,
+ 0x9a, 0x92, 0x6b, 0x99, 0x96, 0x7b, 0xbd, 0x53, 0x1e, 0xec, 0x7d, 0xce, 0x80, 0xfa, 0xea, 0x9d, 0xf5, 0xfe, 0x3f, 0x73,
+ 0x3d, 0x67, 0xf5, 0x5f, 0x93, 0xbf, 0x68, 0x5f, 0xbd, 0xb1, 0xb2, 0x4a, 0xed, 0xcc, 0x75, 0xdb, 0x9d, 0x01, 0xef, 0x96,
+ 0xef, 0xd2, 0xff, 0xbf, 0xea, 0xa7, 0x0b, 0xd5, 0x1f, 0xf5, 0x67, 0xfc, 0xf9, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x0f, 0xbf, 0x00 };
+
+// Font characters rectangles data
+static const Rectangle cyberFontRecs[95] = {
+ { 4, 4, 4 , 14 },
+ { 16, 4, 1 , 8 },
+ { 25, 4, 4 , 3 },
+ { 37, 4, 8 , 8 },
+ { 53, 4, 8 , 9 },
+ { 69, 4, 8 , 8 },
+ { 85, 4, 8 , 8 },
+ { 101, 4, 1 , 3 },
+ { 110, 4, 4 , 9 },
+ { 122, 4, 4 , 9 },
+ { 134, 4, 5 , 6 },
+ { 147, 4, 5 , 6 },
+ { 160, 4, 2 , 2 },
+ { 170, 4, 4 , 1 },
+ { 182, 4, 1 , 1 },
+ { 191, 4, 8 , 8 },
+ { 207, 4, 8 , 8 },
+ { 223, 4, 2 , 8 },
+ { 233, 4, 8 , 8 },
+ { 4, 26, 8 , 8 },
+ { 20, 26, 8 , 8 },
+ { 36, 26, 8 , 8 },
+ { 52, 26, 8 , 8 },
+ { 68, 26, 7 , 8 },
+ { 83, 26, 8 , 8 },
+ { 99, 26, 8 , 8 },
+ { 115, 26, 1 , 4 },
+ { 124, 26, 2 , 5 },
+ { 134, 26, 4 , 8 },
+ { 146, 26, 5 , 3 },
+ { 159, 26, 4 , 8 },
+ { 171, 26, 7 , 8 },
+ { 186, 26, 8 , 8 },
+ { 202, 26, 8 , 8 },
+ { 218, 26, 8 , 8 },
+ { 234, 26, 8 , 8 },
+ { 4, 48, 8 , 8 },
+ { 20, 48, 7 , 8 },
+ { 35, 48, 7 , 8 },
+ { 50, 48, 8 , 8 },
+ { 66, 48, 8 , 8 },
+ { 82, 48, 5 , 8 },
+ { 95, 48, 7 , 8 },
+ { 110, 48, 8 , 8 },
+ { 126, 48, 7 , 8 },
+ { 141, 48, 8 , 8 },
+ { 157, 48, 8 , 8 },
+ { 173, 48, 8 , 8 },
+ { 189, 48, 8 , 8 },
+ { 205, 48, 8 , 9 },
+ { 221, 48, 8 , 8 },
+ { 237, 48, 8 , 8 },
+ { 4, 70, 8 , 8 },
+ { 20, 70, 8 , 8 },
+ { 36, 70, 8 , 8 },
+ { 52, 70, 9 , 8 },
+ { 69, 70, 8 , 8 },
+ { 85, 70, 8 , 8 },
+ { 101, 70, 8 , 8 },
+ { 117, 70, 4 , 9 },
+ { 129, 70, 8 , 8 },
+ { 145, 70, 4 , 9 },
+ { 157, 70, 4 , 3 },
+ { 169, 70, 7 , 1 },
+ { 184, 70, 2 , 3 },
+ { 194, 70, 7 , 5 },
+ { 209, 70, 7 , 8 },
+ { 224, 70, 7 , 5 },
+ { 239, 70, 7 , 8 },
+ { 4, 92, 7 , 5 },
+ { 19, 92, 4 , 8 },
+ { 31, 92, 7 , 7 },
+ { 46, 92, 7 , 8 },
+ { 61, 92, 1 , 8 },
+ { 70, 92, 3 , 10 },
+ { 81, 92, 7 , 8 },
+ { 96, 92, 4 , 8 },
+ { 108, 92, 9 , 5 },
+ { 125, 92, 7 , 5 },
+ { 140, 92, 7 , 5 },
+ { 155, 92, 7 , 7 },
+ { 170, 92, 7 , 7 },
+ { 185, 92, 5 , 5 },
+ { 198, 92, 7 , 5 },
+ { 213, 92, 5 , 8 },
+ { 226, 92, 7 , 5 },
+ { 4, 114, 7 , 5 },
+ { 19, 114, 9 , 5 },
+ { 36, 114, 7 , 5 },
+ { 51, 114, 7 , 7 },
+ { 66, 114, 7 , 5 },
+ { 81, 114, 4 , 9 },
+ { 93, 114, 1 , 9 },
+ { 102, 114, 4 , 9 },
+ { 114, 114, 8 , 2 },
+};
+
+// Font characters info data
+// NOTE: No chars.image data provided
+static const GlyphInfo cyberFontChars[95] = {
+ { 32, 0, 11, 4, { 0 }},
+ { 33, 0, 3, 2, { 0 }},
+ { 34, 0, 3, 4, { 0 }},
+ { 35, 0, 3, 8, { 0 }},
+ { 36, 0, 3, 8, { 0 }},
+ { 37, 0, 3, 8, { 0 }},
+ { 38, 0, 3, 8, { 0 }},
+ { 39, 0, 3, 2, { 0 }},
+ { 40, 0, 3, 4, { 0 }},
+ { 41, 0, 3, 4, { 0 }},
+ { 42, 0, 4, 6, { 0 }},
+ { 43, 0, 4, 6, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 7, 5, { 0 }},
+ { 46, 0, 10, 2, { 0 }},
+ { 47, 0, 3, 8, { 0 }},
+ { 48, 0, 3, 8, { 0 }},
+ { 49, 0, 3, 3, { 0 }},
+ { 50, 0, 3, 8, { 0 }},
+ { 51, 0, 3, 8, { 0 }},
+ { 52, 0, 3, 8, { 0 }},
+ { 53, 0, 3, 8, { 0 }},
+ { 54, 0, 3, 8, { 0 }},
+ { 55, 0, 3, 7, { 0 }},
+ { 56, 0, 3, 8, { 0 }},
+ { 57, 0, 3, 8, { 0 }},
+ { 58, 0, 6, 2, { 0 }},
+ { 59, 0, 6, 3, { 0 }},
+ { 60, 0, 3, 5, { 0 }},
+ { 61, 0, 6, 6, { 0 }},
+ { 62, 0, 3, 5, { 0 }},
+ { 63, 0, 3, 7, { 0 }},
+ { 64, 0, 3, 8, { 0 }},
+ { 65, 0, 3, 8, { 0 }},
+ { 66, 0, 3, 8, { 0 }},
+ { 67, 0, 3, 8, { 0 }},
+ { 68, 0, 3, 8, { 0 }},
+ { 69, 0, 3, 7, { 0 }},
+ { 70, 0, 3, 7, { 0 }},
+ { 71, 0, 3, 8, { 0 }},
+ { 72, 0, 3, 8, { 0 }},
+ { 73, 0, 3, 6, { 0 }},
+ { 74, 0, 3, 7, { 0 }},
+ { 75, 0, 3, 8, { 0 }},
+ { 76, 0, 3, 7, { 0 }},
+ { 77, 0, 3, 9, { 0 }},
+ { 78, 0, 3, 8, { 0 }},
+ { 79, 0, 3, 8, { 0 }},
+ { 80, 0, 3, 8, { 0 }},
+ { 81, 0, 3, 8, { 0 }},
+ { 82, 0, 3, 8, { 0 }},
+ { 83, 0, 3, 8, { 0 }},
+ { 84, 0, 3, 8, { 0 }},
+ { 85, 0, 3, 8, { 0 }},
+ { 86, 0, 3, 8, { 0 }},
+ { 87, 0, 3, 10, { 0 }},
+ { 88, 0, 3, 8, { 0 }},
+ { 89, 0, 3, 8, { 0 }},
+ { 90, 0, 3, 8, { 0 }},
+ { 91, 0, 3, 4, { 0 }},
+ { 92, 0, 3, 8, { 0 }},
+ { 93, 0, 3, 4, { 0 }},
+ { 94, 0, 3, 4, { 0 }},
+ { 95, 0, 11, 7, { 0 }},
+ { 96, 0, 3, 3, { 0 }},
+ { 97, 0, 6, 7, { 0 }},
+ { 98, 0, 3, 7, { 0 }},
+ { 99, 0, 6, 7, { 0 }},
+ { 100, 0, 3, 7, { 0 }},
+ { 101, 0, 6, 7, { 0 }},
+ { 102, 0, 3, 5, { 0 }},
+ { 103, 0, 6, 7, { 0 }},
+ { 104, 0, 3, 7, { 0 }},
+ { 105, 0, 3, 2, { 0 }},
+ { 106, -2, 3, 2, { 0 }},
+ { 107, 0, 3, 7, { 0 }},
+ { 108, 0, 3, 4, { 0 }},
+ { 109, 0, 6, 10, { 0 }},
+ { 110, 0, 6, 7, { 0 }},
+ { 111, 0, 6, 7, { 0 }},
+ { 112, 0, 6, 7, { 0 }},
+ { 113, 0, 6, 7, { 0 }},
+ { 114, 0, 6, 6, { 0 }},
+ { 115, 0, 6, 7, { 0 }},
+ { 116, 0, 3, 6, { 0 }},
+ { 117, 0, 6, 7, { 0 }},
+ { 118, 0, 6, 7, { 0 }},
+ { 119, 0, 6, 10, { 0 }},
+ { 120, 0, 6, 7, { 0 }},
+ { 121, 0, 6, 7, { 0 }},
+ { 122, 0, 6, 7, { 0 }},
+ { 123, 0, 3, 5, { 0 }},
+ { 124, 0, 3, 2, { 0 }},
+ { 125, 0, 3, 5, { 0 }},
+ { 126, 0, 6, 8, { 0 }},
+};
+
+// Style loading function: cyber
+static void GuiLoadStyleCyber(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < CYBER_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(cyberStyleProps[i].controlId, cyberStyleProps[i].propertyId, cyberStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int cyberFontDataSize = 0;
+ unsigned char *data = DecompressData(cyberFontData, CYBER_COMPRESSED_DATA_SIZE, &cyberFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 14;
+ font.glyphCount = 95;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)malloc(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, cyberFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)malloc(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, cyberFontChars, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // this way we make sure all gui can be drawn on a single pass because no texture change is required
+ // NOTE: Setting up this rectangle is a manual process (for the moment)
+ Rectangle whiteChar = { 89, 9, 2, 2 };
+ SetShapesTexture(font.texture, whiteChar);
+}
diff --git a/external/raygui-4.0/examples/styles/style_dark.h b/external/raygui-4.0/examples/styles/style_dark.h
new file mode 100644
index 0000000..b98f606
--- /dev/null
+++ b/external/raygui-4.0/examples/styles/style_dark.h
@@ -0,0 +1,347 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v1.2 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleDark(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define DARK_STYLE_PROPS_COUNT 22
+
+// Custom style name: dark
+static const GuiStyleProp darkStyleProps[DARK_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x878787ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x2c2c2cff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xc3c3c3ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xe1e1e1ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x848484ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x181818ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x000000ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xefefefff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x202020ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x6a6a6aff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x818181ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x606060ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x9d9d9dff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x3c3c3cff }, // DEFAULT_BACKGROUND_COLOR
+ { 1, 5, 0xf7f7f7ff }, // LABEL_TEXT_COLOR_FOCUSED
+ { 1, 8, 0x898989ff }, // LABEL_TEXT_COLOR_PRESSED
+ { 4, 5, 0xb0b0b0ff }, // SLIDER_TEXT_COLOR_FOCUSED
+ { 5, 5, 0x848484ff }, // PROGRESSBAR_TEXT_COLOR_FOCUSED
+ { 9, 5, 0xf5f5f5ff }, // TEXTBOX_TEXT_COLOR_FOCUSED
+ { 10, 5, 0xf6f6f6ff }, // VALUEBOX_TEXT_COLOR_FOCUSED
+};
+
+// WARNING: This style uses a custom font: PixelOperator.ttf (size: 16, spacing: 0)
+
+#define DARK_COMPRESSED_DATA_SIZE 1031
+
+// Font image pixels data compressed (DEFLATE)
+// NOTE: Original pixel data simplified to GRAYSCALE
+static unsigned char darkFontData[DARK_COMPRESSED_DATA_SIZE] = { 0xed,
+ 0xdd, 0xd1, 0x76, 0x9b, 0x30, 0x0c, 0x00, 0x50, 0xff, 0xff, 0x4f, 0x6b, 0x4f, 0x3b, 0xeb, 0xb6, 0x16, 0x90, 0x90, 0x8d,
+ 0x93, 0xdc, 0xdd, 0x97, 0x9d, 0x36, 0x25, 0xc4, 0xc2, 0xc6, 0x04, 0xc9, 0xc4, 0x00, 0x00, 0xf8, 0x47, 0x7c, 0xfb, 0x93,
+ 0xf8, 0xf1, 0x95, 0x71, 0x79, 0x3b, 0xc7, 0x3f, 0xff, 0xfd, 0xdb, 0x38, 0x78, 0xaf, 0x6b, 0xfb, 0x9a, 0x7d, 0xdf, 0x48,
+ 0xb4, 0xc4, 0xf7, 0xfb, 0x17, 0x97, 0xb7, 0xfb, 0xd3, 0xe7, 0xcb, 0xbf, 0xfe, 0x68, 0x4b, 0xe7, 0xed, 0xfc, 0x54, 0xfc,
+ 0xe3, 0x52, 0x24, 0xe2, 0x62, 0xdb, 0x5c, 0x6f, 0xc5, 0xa3, 0x77, 0x8e, 0xe6, 0x16, 0x3c, 0x3f, 0x3a, 0x7f, 0x8a, 0x74,
+ 0xbe, 0x3d, 0xe2, 0xa0, 0x1f, 0xcd, 0x8d, 0xff, 0xd7, 0x7f, 0xb9, 0x7e, 0x1c, 0xc9, 0x88, 0x76, 0xf4, 0xf4, 0xe3, 0xfd,
+ 0x8c, 0xd4, 0xf6, 0x67, 0xc4, 0x3f, 0x5a, 0xc7, 0xae, 0x68, 0xed, 0xff, 0xc7, 0xaf, 0xcc, 0xf6, 0xb7, 0x48, 0xf6, 0xdd,
+ 0x8e, 0x36, 0xa9, 0xf5, 0xff, 0xee, 0xe8, 0xff, 0xf9, 0xec, 0x7d, 0xe3, 0x50, 0x7e, 0x5c, 0x5e, 0x19, 0xff, 0x4a, 0xec,
+ 0xae, 0x8e, 0x5c, 0x95, 0x3e, 0x31, 0x36, 0x88, 0x7f, 0xf6, 0x38, 0x3c, 0x6e, 0xab, 0x91, 0x3e, 0x33, 0x3c, 0x1f, 0xff,
+ 0xf3, 0xf1, 0x3f, 0x26, 0xc4, 0xff, 0xf9, 0x79, 0xf4, 0x9f, 0x88, 0x45, 0xb2, 0x2f, 0xe7, 0xce, 0x31, 0x91, 0xe8, 0x45,
+ 0xf5, 0xd6, 0xab, 0x9d, 0xff, 0xbf, 0x46, 0x3f, 0xde, 0x38, 0xfe, 0x91, 0x9c, 0xdf, 0x66, 0xe7, 0x38, 0x3b, 0xb4, 0xc2,
+ 0xf9, 0xfc, 0xff, 0x78, 0xef, 0xe2, 0xe6, 0xd8, 0x15, 0x2f, 0xd6, 0xfb, 0x3b, 0xe3, 0x1f, 0xd3, 0xe2, 0x1f, 0x4b, 0xe2,
+ 0x3f, 0x0e, 0xaf, 0x6a, 0xe3, 0xf6, 0x0c, 0x7b, 0xcf, 0xf8, 0x67, 0xaf, 0xff, 0x6b, 0x23, 0xec, 0xf3, 0x2d, 0x11, 0x37,
+ 0xaf, 0x41, 0x78, 0xfd, 0x6f, 0x11, 0x43, 0xf4, 0x7d, 0x8f, 0x8c, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0xef,
+ 0xd0, 0x45, 0x53, 0xb6, 0x6c, 0x25, 0x53, 0xfd, 0x5e, 0x9e, 0x7f, 0x2e, 0x6b, 0xf7, 0x6c, 0xef, 0xf2, 0xfb, 0xde, 0xf9,
+ 0x37, 0x47, 0x59, 0xc8, 0xb5, 0x1c, 0xeb, 0x2b, 0x95, 0x16, 0x9d, 0xb9, 0x25, 0xf5, 0x4c, 0xf5, 0xee, 0x3b, 0x49, 0x51,
+ 0xae, 0x2b, 0xe8, 0xf9, 0x54, 0x77, 0x7e, 0xd3, 0x13, 0xa5, 0xae, 0xf8, 0x8f, 0x2d, 0xe2, 0x9f, 0xcf, 0x13, 0xca, 0x1f,
+ 0xb7, 0x91, 0xce, 0x47, 0x8b, 0xd6, 0x9c, 0xad, 0x68, 0x8d, 0x52, 0x24, 0x2a, 0xad, 0x7a, 0x72, 0x4e, 0x77, 0xef, 0xff,
+ 0xd7, 0x32, 0xb2, 0x3f, 0x2b, 0xfe, 0xf9, 0x73, 0xeb, 0xdd, 0x33, 0xec, 0x8a, 0x5c, 0x82, 0x6a, 0xa5, 0x4c, 0x3e, 0xfe,
+ 0xf9, 0xde, 0x73, 0xb6, 0xb5, 0x51, 0xca, 0xa3, 0xbe, 0x9b, 0x01, 0x9e, 0xad, 0x52, 0x5b, 0x9d, 0x8f, 0x3a, 0x3f, 0x23,
+ 0x37, 0x2e, 0xd4, 0xb8, 0xed, 0xdb, 0xff, 0x63, 0x42, 0xff, 0x5f, 0x93, 0x8f, 0x1c, 0x4b, 0x8f, 0x92, 0xb3, 0x5e, 0xd4,
+ 0x75, 0x56, 0x7b, 0x95, 0xf8, 0xaf, 0xfe, 0x6c, 0xb1, 0x65, 0xd6, 0xd8, 0xbc, 0x36, 0xda, 0x7d, 0xfe, 0xdf, 0x75, 0xc5,
+ 0x7e, 0xbf, 0x52, 0x7d, 0x4d, 0xf4, 0xa3, 0xf4, 0x3d, 0x48, 0x65, 0x8e, 0xd4, 0x7b, 0xfd, 0x9f, 0x9f, 0xc1, 0x87, 0x0c,
+ 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0xca, 0xff, 0x5f, 0x93, 0x11, 0x34, 0x4a, 0x2b, 0xa1, 0xcf, 0xcf,
+ 0xb9, 0xbf, 0xb3, 0x26, 0x78, 0x3c, 0x9c, 0x61, 0x7e, 0x5c, 0x2d, 0xf0, 0xda, 0xf1, 0x7f, 0xfe, 0x37, 0xa3, 0xb0, 0x7e,
+ 0xe7, 0xca, 0xf8, 0x8f, 0x42, 0x34, 0x7a, 0xb2, 0xe4, 0x73, 0x5b, 0x89, 0xff, 0xfe, 0xb7, 0x63, 0xfc, 0xc7, 0x92, 0xf8,
+ 0xc7, 0xcb, 0xc7, 0xbf, 0x52, 0x6b, 0x71, 0x9c, 0x59, 0x2b, 0xfe, 0xe7, 0x6d, 0x1b, 0xa5, 0x2a, 0x8c, 0xfe, 0xf8, 0x47,
+ 0x71, 0x2b, 0x71, 0x72, 0x44, 0xf5, 0xe6, 0xdc, 0xf7, 0xe4, 0xe9, 0xad, 0x8d, 0x7f, 0xf7, 0x73, 0x3f, 0x76, 0xea, 0xff,
+ 0xd7, 0xea, 0xae, 0x66, 0x67, 0x1f, 0xdf, 0xe9, 0xe9, 0x4f, 0xf6, 0xff, 0xee, 0x67, 0x6b, 0xad, 0x3e, 0xff, 0xcf, 0x9a,
+ 0xff, 0x8d, 0xf4, 0x68, 0x12, 0xdb, 0xc6, 0xff, 0xce, 0x2c, 0xb4, 0x3b, 0xfe, 0xf1, 0x22, 0xf3, 0xff, 0x51, 0x38, 0x3e,
+ 0x67, 0xcf, 0xff, 0xaf, 0x3d, 0xef, 0x68, 0xef, 0xf8, 0x8f, 0x1b, 0xe7, 0xd7, 0x58, 0x72, 0xfd, 0x3f, 0x4e, 0xae, 0x36,
+ 0x7a, 0xde, 0x67, 0xb4, 0xad, 0xdf, 0xff, 0xf7, 0xbe, 0xe5, 0x6b, 0xf5, 0xb3, 0x2b, 0x16, 0x58, 0x75, 0x1d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xd9, 0x1d, 0xe4, 0xfc, 0xbd, 0xe8, 0xd1, 0x78, 0x6f, 0x3f, 0x9a, 0x32, 0x19,
+ 0xc6, 0xc1, 0x9d, 0xf8, 0xec, 0x0a, 0x7c, 0x3d, 0x99, 0xb9, 0x47, 0x7b, 0xdf, 0x57, 0xd3, 0x30, 0x6e, 0xef, 0x51, 0x7e,
+ 0x3d, 0xc1, 0xe7, 0x57, 0x96, 0x8d, 0xc6, 0xcc, 0xae, 0x75, 0xd5, 0x36, 0x33, 0x73, 0xc6, 0xbb, 0xeb, 0x3f, 0xba, 0x5a,
+ 0x23, 0x6e, 0x8c, 0x0c, 0xb3, 0xe3, 0x5f, 0x5f, 0xe9, 0xbb, 0x7a, 0x7c, 0xad, 0x88, 0x7f, 0x4f, 0x16, 0x69, 0x3e, 0xf2,
+ 0x6b, 0xd6, 0xd3, 0x3e, 0x7b, 0x9e, 0xca, 0xba, 0xdc, 0xc7, 0x4a, 0x06, 0xed, 0xbb, 0xc6, 0xff, 0xf9, 0xf5, 0xb4, 0x67,
+ 0x55, 0x76, 0xf5, 0x66, 0xd0, 0x8b, 0xff, 0xbc, 0xda, 0xbe, 0x58, 0x38, 0x32, 0x55, 0x2b, 0x68, 0xe6, 0xd5, 0x0c, 0x76,
+ 0x57, 0x91, 0xcc, 0x1f, 0xff, 0x6b, 0xcf, 0xb9, 0xaa, 0x3c, 0x1d, 0x68, 0xb7, 0xfe, 0xdf, 0x99, 0x3b, 0xbd, 0x4b, 0xfc,
+ 0xeb, 0xb3, 0xfc, 0xd1, 0x34, 0x2b, 0x7d, 0x6e, 0xfc, 0x5f, 0xfd, 0xc4, 0x8b, 0xfa, 0x3c, 0xfc, 0x89, 0x3d, 0xa9, 0xbc,
+ 0x73, 0xe5, 0xaf, 0xb2, 0x99, 0xfd, 0x9d, 0xf1, 0xdf, 0xef, 0x08, 0xe0, 0xe9, 0x51, 0x8c, 0xf7, 0x3a, 0x02, 0x54, 0xe0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0xbb, 0xe3, 0x7e, 0x9c, 0xa5, 0x13, 0x2d, 0x19, 0x37, 0xbb, 0xaf, 0xa5,
+ 0x3f, 0x4e, 0xd6, 0xa7, 0xbd, 0x96, 0xdb, 0x15, 0xdb, 0xde, 0x0f, 0xae, 0xb6, 0x7f, 0x57, 0xfe, 0xf4, 0xee, 0x6b, 0xe9,
+ 0xdf, 0x5f, 0x93, 0x33, 0x4e, 0x8e, 0x8e, 0x57, 0x8c, 0x7f, 0x25, 0x67, 0xf4, 0xf9, 0xb5, 0x94, 0xa3, 0x94, 0xf1, 0x1a,
+ 0x9b, 0xe7, 0xcc, 0xed, 0x94, 0x8b, 0xbd, 0x72, 0xfc, 0x8f, 0x72, 0x74, 0xa2, 0x21, 0x0f, 0x5a, 0xfc, 0x47, 0xba, 0x16,
+ 0x6f, 0xe7, 0xfe, 0xff, 0xc4, 0xda, 0xeb, 0xef, 0x17, 0xff, 0xce, 0x8a, 0xab, 0x19, 0x6b, 0x69, 0xe7, 0xab, 0x3b, 0xdf,
+ 0xbf, 0xff, 0x57, 0xe7, 0xff, 0x3d, 0xe3, 0xff, 0xea, 0xb5, 0xb4, 0xf3, 0xf3, 0xff, 0xcf, 0x18, 0xff, 0xef, 0xbc, 0x22,
+ 0x73, 0xac, 0xbd, 0x5e, 0x5e, 0xae, 0xf8, 0x7f, 0x7a, 0x5e, 0xee, 0xdd, 0xeb, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x46, 0xbf, 0x00 };
+
+// Font characters rectangles data
+static const Rectangle darkFontRecs[95] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 1 , 9 },
+ { 25, 4, 3 , 3 },
+ { 36, 4, 6 , 9 },
+ { 50, 4, 5 , 13 },
+ { 63, 4, 7 , 9 },
+ { 78, 4, 5 , 9 },
+ { 91, 4, 1 , 3 },
+ { 100, 4, 3 , 9 },
+ { 111, 4, 3 , 9 },
+ { 122, 4, 5 , 5 },
+ { 135, 4, 5 , 5 },
+ { 148, 4, 2 , 3 },
+ { 158, 4, 4 , 1 },
+ { 170, 4, 1 , 1 },
+ { 179, 4, 3 , 9 },
+ { 190, 4, 5 , 9 },
+ { 203, 4, 3 , 9 },
+ { 214, 4, 5 , 9 },
+ { 227, 4, 5 , 9 },
+ { 240, 4, 5 , 9 },
+ { 4, 28, 5 , 9 },
+ { 17, 28, 5 , 9 },
+ { 30, 28, 5 , 9 },
+ { 43, 28, 5 , 9 },
+ { 56, 28, 5 , 9 },
+ { 69, 28, 1 , 7 },
+ { 78, 28, 2 , 9 },
+ { 88, 28, 3 , 5 },
+ { 99, 28, 4 , 3 },
+ { 111, 28, 3 , 5 },
+ { 122, 28, 5 , 9 },
+ { 135, 28, 7 , 9 },
+ { 150, 28, 5 , 9 },
+ { 163, 28, 5 , 9 },
+ { 176, 28, 5 , 9 },
+ { 189, 28, 5 , 9 },
+ { 202, 28, 5 , 9 },
+ { 215, 28, 5 , 9 },
+ { 228, 28, 5 , 9 },
+ { 241, 28, 5 , 9 },
+ { 4, 52, 1 , 9 },
+ { 13, 52, 5 , 9 },
+ { 26, 52, 5 , 9 },
+ { 39, 52, 5 , 9 },
+ { 52, 52, 7 , 9 },
+ { 67, 52, 5 , 9 },
+ { 80, 52, 5 , 9 },
+ { 93, 52, 5 , 9 },
+ { 106, 52, 5 , 9 },
+ { 119, 52, 5 , 9 },
+ { 132, 52, 5 , 9 },
+ { 145, 52, 5 , 9 },
+ { 158, 52, 5 , 9 },
+ { 171, 52, 5 , 9 },
+ { 184, 52, 7 , 9 },
+ { 199, 52, 5 , 9 },
+ { 212, 52, 5 , 9 },
+ { 225, 52, 5 , 9 },
+ { 238, 52, 3 , 9 },
+ { 4, 76, 3 , 9 },
+ { 15, 76, 3 , 9 },
+ { 26, 76, 5 , 3 },
+ { 39, 76, 5 , 1 },
+ { 52, 76, 2 , 2 },
+ { 62, 76, 5 , 7 },
+ { 75, 76, 5 , 9 },
+ { 88, 76, 5 , 7 },
+ { 101, 76, 5 , 9 },
+ { 114, 76, 5 , 7 },
+ { 127, 76, 4 , 9 },
+ { 139, 76, 5 , 9 },
+ { 152, 76, 5 , 9 },
+ { 165, 76, 1 , 9 },
+ { 174, 76, 5 , 11 },
+ { 187, 76, 5 , 9 },
+ { 200, 76, 2 , 9 },
+ { 210, 76, 7 , 7 },
+ { 225, 76, 5 , 7 },
+ { 238, 76, 5 , 7 },
+ { 4, 100, 5 , 9 },
+ { 17, 100, 5 , 9 },
+ { 30, 100, 5 , 7 },
+ { 43, 100, 5 , 7 },
+ { 56, 100, 4 , 8 },
+ { 68, 100, 5 , 7 },
+ { 81, 100, 5 , 7 },
+ { 94, 100, 7 , 7 },
+ { 109, 100, 5 , 7 },
+ { 122, 100, 5 , 9 },
+ { 135, 100, 5 , 7 },
+ { 148, 100, 4 , 9 },
+ { 160, 100, 1 , 9 },
+ { 169, 100, 4 , 9 },
+ { 181, 100, 6 , 2 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo darkFontChars[95] = {
+ { 32, 0, 13, 4, { 0 }},
+ { 33, 2, 4, 5, { 0 }},
+ { 34, 2, 4, 7, { 0 }},
+ { 35, 1, 4, 8, { 0 }},
+ { 36, 1, 2, 7, { 0 }},
+ { 37, 1, 4, 9, { 0 }},
+ { 38, 1, 4, 7, { 0 }},
+ { 39, 2, 4, 5, { 0 }},
+ { 40, 3, 4, 7, { 0 }},
+ { 41, 1, 4, 7, { 0 }},
+ { 42, 1, 4, 7, { 0 }},
+ { 43, 1, 6, 7, { 0 }},
+ { 44, 1, 12, 5, { 0 }},
+ { 45, 1, 8, 6, { 0 }},
+ { 46, 2, 12, 5, { 0 }},
+ { 47, 1, 4, 5, { 0 }},
+ { 48, 1, 4, 7, { 0 }},
+ { 49, 2, 4, 7, { 0 }},
+ { 50, 1, 4, 7, { 0 }},
+ { 51, 1, 4, 7, { 0 }},
+ { 52, 1, 4, 7, { 0 }},
+ { 53, 1, 4, 7, { 0 }},
+ { 54, 1, 4, 7, { 0 }},
+ { 55, 1, 4, 7, { 0 }},
+ { 56, 1, 4, 7, { 0 }},
+ { 57, 1, 4, 7, { 0 }},
+ { 58, 2, 6, 5, { 0 }},
+ { 59, 1, 6, 5, { 0 }},
+ { 60, 1, 6, 5, { 0 }},
+ { 61, 1, 7, 6, { 0 }},
+ { 62, 1, 6, 5, { 0 }},
+ { 63, 1, 4, 7, { 0 }},
+ { 64, 1, 4, 9, { 0 }},
+ { 65, 1, 4, 7, { 0 }},
+ { 66, 1, 4, 7, { 0 }},
+ { 67, 1, 4, 7, { 0 }},
+ { 68, 1, 4, 7, { 0 }},
+ { 69, 1, 4, 7, { 0 }},
+ { 70, 1, 4, 7, { 0 }},
+ { 71, 1, 4, 7, { 0 }},
+ { 72, 1, 4, 7, { 0 }},
+ { 73, 2, 4, 5, { 0 }},
+ { 74, 1, 4, 7, { 0 }},
+ { 75, 1, 4, 7, { 0 }},
+ { 76, 1, 4, 7, { 0 }},
+ { 77, 1, 4, 9, { 0 }},
+ { 78, 1, 4, 7, { 0 }},
+ { 79, 1, 4, 7, { 0 }},
+ { 80, 1, 4, 7, { 0 }},
+ { 81, 1, 4, 7, { 0 }},
+ { 82, 1, 4, 7, { 0 }},
+ { 83, 1, 4, 7, { 0 }},
+ { 84, 1, 4, 7, { 0 }},
+ { 85, 1, 4, 7, { 0 }},
+ { 86, 1, 4, 7, { 0 }},
+ { 87, 1, 4, 9, { 0 }},
+ { 88, 1, 4, 7, { 0 }},
+ { 89, 1, 4, 7, { 0 }},
+ { 90, 1, 4, 7, { 0 }},
+ { 91, 3, 4, 7, { 0 }},
+ { 92, 1, 4, 5, { 0 }},
+ { 93, 1, 4, 7, { 0 }},
+ { 94, 1, 4, 7, { 0 }},
+ { 95, 0, 14, 5, { 0 }},
+ { 96, 1, 4, 5, { 0 }},
+ { 97, 1, 6, 7, { 0 }},
+ { 98, 1, 4, 7, { 0 }},
+ { 99, 1, 6, 7, { 0 }},
+ { 100, 1, 4, 7, { 0 }},
+ { 101, 1, 6, 7, { 0 }},
+ { 102, 1, 4, 6, { 0 }},
+ { 103, 1, 6, 7, { 0 }},
+ { 104, 1, 4, 7, { 0 }},
+ { 105, 2, 4, 5, { 0 }},
+ { 106, 1, 4, 7, { 0 }},
+ { 107, 1, 4, 7, { 0 }},
+ { 108, 2, 4, 5, { 0 }},
+ { 109, 1, 6, 9, { 0 }},
+ { 110, 1, 6, 7, { 0 }},
+ { 111, 1, 6, 7, { 0 }},
+ { 112, 1, 6, 7, { 0 }},
+ { 113, 1, 6, 7, { 0 }},
+ { 114, 1, 6, 7, { 0 }},
+ { 115, 1, 6, 7, { 0 }},
+ { 116, 1, 5, 6, { 0 }},
+ { 117, 1, 6, 7, { 0 }},
+ { 118, 1, 6, 7, { 0 }},
+ { 119, 1, 6, 9, { 0 }},
+ { 120, 1, 6, 7, { 0 }},
+ { 121, 1, 6, 7, { 0 }},
+ { 122, 1, 6, 7, { 0 }},
+ { 123, 2, 4, 7, { 0 }},
+ { 124, 2, 4, 5, { 0 }},
+ { 125, 1, 4, 7, { 0 }},
+ { 126, 1, 4, 8, { 0 }},
+};
+
+// Style loading function: dark
+static void GuiLoadStyleDark(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < DARK_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(darkStyleProps[i].controlId, darkStyleProps[i].propertyId, darkStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int darkFontDataSize = 0;
+ unsigned char *data = DecompressData(darkFontData, DARK_COMPRESSED_DATA_SIZE, &darkFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 95;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)malloc(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, darkFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)malloc(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, darkFontChars, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // TODO: Setup a white rectangle on the font to be used on shapes drawing,
+ // this way we make sure all gui can be drawn on a single pass because no texture change is required
+ // NOTE: Setting up this rectangle is a manual process (for the moment)
+ Rectangle whiteChar = { 124, 6, 1, 1 };
+ SetShapesTexture(font.texture, whiteChar);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/examples/styles/style_jungle.h b/external/raygui-4.0/examples/styles/style_jungle.h
new file mode 100644
index 0000000..b3e49cf
--- /dev/null
+++ b/external/raygui-4.0/examples/styles/style_jungle.h
@@ -0,0 +1,578 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleJungle(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define JUNGLE_STYLE_PROPS_COUNT 17
+
+// Custom style name: Jungle
+static const GuiStyleProp jungleStyleProps[JUNGLE_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x60827dff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x2c3334ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x82a29fff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x5f9aa8ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x334e57ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x6aa9b8ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xa9cb8dff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x3b6357ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x97af81ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x5b6462ff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x2c3334ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x666b69ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x0000000c }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x638465ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x2b3a3aff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000012 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Pixel Intv.otf" (size: 12, spacing: 0)
+
+#define JUNGLE_STYLE_FONT_ATLAS_COMP_SIZE 2030
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char jungleFontData[JUNGLE_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0x9d, 0x3d, 0x8e, 0x25, 0x35, 0x14, 0x85, 0x8d, 0xe9, 0x8c, 0x10, 0x11, 0x80, 0x84, 0x20, 0x41, 0x22, 0x21, 0x61, 0x34,
+ 0x12, 0x64, 0xb3, 0x00, 0x62, 0x84, 0x08, 0x10, 0x11, 0x09, 0xb0, 0x07, 0x66, 0x65, 0x93, 0x90, 0xb3, 0x01, 0x76, 0xc1,
+ 0x02, 0x2e, 0x9a, 0xbf, 0x9e, 0x9f, 0xae, 0xb2, 0x7d, 0x8f, 0xaf, 0xcb, 0xae, 0x7a, 0x5f, 0x7f, 0x9a, 0xd1, 0xcc, 0xf3,
+ 0x73, 0x95, 0xcb, 0xc7, 0xd7, 0x55, 0xaf, 0x7d, 0xde, 0xb5, 0x25, 0x00, 0x00, 0x00, 0x80, 0x07, 0x3c, 0xff, 0xd9, 0x7e,
+ 0x6d, 0xab, 0x24, 0xbd, 0x2a, 0x69, 0x3f, 0xd6, 0xeb, 0xd7, 0x5f, 0x96, 0xe4, 0xdd, 0x77, 0x6c, 0x1f, 0x31, 0xef, 0xb4,
+ 0x61, 0xaf, 0xd5, 0xfb, 0x2d, 0x4b, 0xae, 0x92, 0xfd, 0xe3, 0xef, 0xf7, 0x57, 0x72, 0x5c, 0xc3, 0xbb, 0x3f, 0xc9, 0x71,
+ 0x2d, 0xe5, 0x7a, 0xa3, 0xf5, 0x2f, 0xf7, 0xc1, 0x7e, 0xd9, 0xcb, 0x3f, 0xcf, 0x7b, 0x22, 0x3b, 0x8e, 0xb9, 0xff, 0xfe,
+ 0xe4, 0x1a, 0x81, 0xfe, 0x91, 0xe1, 0xeb, 0xdd, 0xd2, 0xbb, 0x6b, 0xd7, 0x60, 0xce, 0x16, 0xbc, 0x7e, 0x7d, 0xa4, 0xfe,
+ 0xe9, 0xfe, 0x1c, 0xed, 0xf1, 0x5f, 0x53, 0xc5, 0xec, 0x6e, 0xb3, 0x27, 0x52, 0x51, 0x9b, 0x2c, 0x9c, 0x29, 0x62, 0x34,
+ 0xa7, 0xa0, 0xde, 0xcd, 0xc5, 0x6b, 0x30, 0x41, 0x7f, 0x6d, 0x84, 0x46, 0x1d, 0x47, 0x8b, 0xff, 0xe7, 0xdc, 0xbd, 0x18,
+ 0x01, 0xe5, 0xa3, 0xf6, 0xb7, 0x38, 0x2a, 0xfe, 0xd3, 0x50, 0xf5, 0x7b, 0xf4, 0x3f, 0x62, 0xfe, 0x2f, 0xbf, 0xbf, 0xdc,
+ 0x67, 0xdb, 0xc7, 0xcb, 0xaf, 0xe2, 0xdf, 0x7f, 0xf7, 0x8c, 0xd0, 0xdf, 0x7f, 0xff, 0x1f, 0xab, 0x7e, 0xc4, 0xfc, 0xbf,
+ 0xe2, 0x73, 0x64, 0xed, 0x3e, 0xbe, 0x3d, 0x76, 0x6c, 0x78, 0xfc, 0xcf, 0xa0, 0xa4, 0x7e, 0xed, 0xf9, 0xcf, 0x3a, 0xe6,
+ 0xd9, 0xd1, 0xf1, 0xaf, 0x1c, 0xeb, 0x75, 0x4f, 0x98, 0x10, 0x9f, 0x67, 0xd5, 0xbf, 0xa4, 0x3e, 0x44, 0xcc, 0x35, 0x9e,
+ 0xbb, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x35, 0x57, 0x4c, 0xca, 0xeb, 0xef,
+ 0x91, 0x2b, 0x91, 0xa3, 0xca, 0xda, 0xdd, 0x06, 0x1e, 0xe7, 0x4a, 0x16, 0x7a, 0x6c, 0x56, 0xbf, 0x8c, 0x72, 0xfb, 0x25,
+ 0xb7, 0x37, 0xa3, 0xa5, 0x35, 0xea, 0xf9, 0x7a, 0xf4, 0xcf, 0xce, 0xb5, 0xd7, 0xb2, 0x43, 0x6f, 0xcf, 0xcf, 0xb8, 0xbf,
+ 0x72, 0xdd, 0x7b, 0x7d, 0xde, 0x32, 0xdf, 0x0c, 0x90, 0x0e, 0x89, 0xff, 0x36, 0x0f, 0xd3, 0x18, 0x77, 0xe3, 0xb6, 0xcf,
+ 0xac, 0xd4, 0xd6, 0x3b, 0xb7, 0xa3, 0xf0, 0xcd, 0x6a, 0xf3, 0xd8, 0xf1, 0x1d, 0xed, 0xfa, 0x54, 0x1d, 0x25, 0xca, 0x98,
+ 0x54, 0x1c, 0xac, 0x11, 0xf3, 0x7f, 0x4c, 0xfc, 0x97, 0xc6, 0xa9, 0xbd, 0xf7, 0x27, 0x66, 0x1e, 0x9f, 0xa5, 0xff, 0x88,
+ 0xb9, 0x3a, 0x35, 0xcc, 0x0a, 0x6a, 0x5b, 0xb4, 0xfb, 0xbf, 0xe2, 0xd4, 0x29, 0xb9, 0x95, 0xf4, 0xe7, 0xa9, 0x19, 0xf1,
+ 0xdf, 0x13, 0xe3, 0xda, 0xfc, 0x5f, 0xd6, 0x3f, 0xce, 0xdd, 0x66, 0x53, 0x9e, 0xa6, 0x5b, 0x62, 0x6c, 0xad, 0xfb, 0x3f,
+ 0x44, 0xfa, 0x19, 0xe7, 0x7d, 0x9e, 0x42, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0xeb, 0xc7, 0x3b, 0xca, 0x53, 0x62, 0x8d, 0x59, 0x7c, 0xf6, 0xfd, 0x5a, 0x47, 0xb9, 0xf5, 0x8e, 0xef, 0xef, 0x68,
+ 0xdf, 0x47, 0xc4, 0x9a, 0xb4, 0x92, 0xc1, 0xac, 0xdf, 0x8b, 0x68, 0x4b, 0x38, 0xf2, 0x46, 0xf4, 0xdb, 0x4c, 0xfd, 0x95,
+ 0xf6, 0xe8, 0xfa, 0x9b, 0x98, 0x61, 0xb0, 0x96, 0x19, 0x66, 0x2d, 0xfd, 0x15, 0xd7, 0x41, 0x8f, 0xfe, 0xf5, 0xb9, 0x2a,
+ 0x15, 0xf4, 0xf0, 0xcf, 0xf1, 0xaa, 0xfe, 0x26, 0xe6, 0x7d, 0x1c, 0x73, 0x17, 0x1b, 0xa3, 0xbf, 0xd2, 0x6f, 0x57, 0x99,
+ 0xff, 0xeb, 0xc7, 0xcc, 0xe2, 0xfc, 0x6f, 0xd5, 0x59, 0xc5, 0xc2, 0xdd, 0xa8, 0xfe, 0x98, 0x6a, 0xed, 0x9f, 0xdb, 0xd5,
+ 0x3f, 0x0d, 0xd1, 0x7f, 0xcc, 0x19, 0xcf, 0x73, 0xff, 0x57, 0xb2, 0x57, 0xcf, 0xf0, 0xb9, 0xf5, 0x79, 0xc3, 0x6b, 0xa5,
+ 0x47, 0xf4, 0xcc, 0xb8, 0xf9, 0x1f, 0x17, 0xe0, 0x79, 0x5c, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x47, 0xac, 0x51, 0xe8, 0x6b, 0x67, 0x23, 0x56, 0x00, 0x1f, 0xbe, 0x9e, 0x1b, 0xd6, 0x30, 0xdf, 0x7f,
+ 0x3d, 0xef, 0x38, 0x46, 0xcc, 0x99, 0xf3, 0x4f, 0xdb, 0x8f, 0xb7, 0x35, 0x0f, 0x9a, 0xee, 0x20, 0x8c, 0x58, 0x07, 0x3c,
+ 0x5e, 0xff, 0xd4, 0xb4, 0x1e, 0xfb, 0x50, 0xc9, 0x2c, 0x78, 0x86, 0xb2, 0x33, 0xe3, 0x53, 0x29, 0x43, 0x94, 0xdf, 0xcd,
+ 0x54, 0xef, 0x05, 0x25, 0xd7, 0x5d, 0xed, 0x68, 0xda, 0x0e, 0xc5, 0x25, 0x77, 0x4c, 0xcd, 0xcb, 0xe2, 0xbf, 0xf2, 0xec,
+ 0xbe, 0xb6, 0xdc, 0x30, 0x07, 0x8c, 0xf7, 0x48, 0x27, 0x77, 0x3c, 0xf6, 0xf9, 0xee, 0xc6, 0xeb, 0x9f, 0x1a, 0x3c, 0x7e,
+ 0xd1, 0x8e, 0x14, 0xab, 0xec, 0x7e, 0xab, 0x8c, 0x80, 0xd1, 0xfa, 0xd7, 0xae, 0x55, 0x77, 0x09, 0xa5, 0xd0, 0x71, 0x13,
+ 0xad, 0x7f, 0xcb, 0x38, 0x8d, 0x1e, 0xc1, 0xca, 0x08, 0x38, 0x26, 0xfe, 0xcd, 0xad, 0x7f, 0x79, 0x6e, 0x88, 0xef, 0x3d,
+ 0xc5, 0x05, 0xa4, 0xcd, 0x28, 0xbd, 0x6e, 0x35, 0x45, 0xc5, 0x2c, 0xcd, 0x1c, 0x47, 0x3c, 0x41, 0x6b, 0x7b, 0x55, 0x47,
+ 0x3b, 0x36, 0xb5, 0x9e, 0x38, 0x5e, 0x7f, 0x93, 0x77, 0xfc, 0xce, 0xcb, 0xed, 0x7e, 0xad, 0x45, 0x9d, 0xee, 0xd8, 0x8b,
+ 0x8f, 0xff, 0xf5, 0xbe, 0x8d, 0x76, 0x44, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xdb, 0xcc, 0x51, 0xe0, 0xcf, 0x54, 0x53, 0xaf, 0xa1, 0xee, 0x9d, 0x75, 0xe4, 0xde, 0xb9, 0xa3, 0xf6, 0xb7, 0xd3, 0xf3,
+ 0x82, 0xd9, 0x90, 0x1d, 0xe0, 0xe2, 0xd7, 0xcd, 0xfa, 0xb2, 0x98, 0xd5, 0x7a, 0x48, 0xcd, 0xb8, 0xe5, 0xf5, 0x60, 0xf4,
+ 0xf8, 0x7a, 0x54, 0xcf, 0x47, 0xbc, 0x0f, 0x2f, 0xc6, 0xdb, 0xa6, 0xc5, 0xbf, 0xe6, 0x0b, 0x59, 0x4d, 0xff, 0x74, 0x90,
+ 0x3f, 0xaf, 0x47, 0xff, 0xde, 0xdd, 0x9f, 0x75, 0x47, 0x96, 0xbf, 0x57, 0xaf, 0xa0, 0x7f, 0x9b, 0x7b, 0x57, 0xf1, 0x11,
+ 0x46, 0xfb, 0xf0, 0x66, 0xe9, 0x6f, 0xd2, 0xde, 0xb9, 0x3d, 0xfa, 0xf7, 0xf9, 0xe5, 0x8f, 0x8b, 0x7f, 0xfd, 0x8c, 0x69,
+ 0xc8, 0xce, 0xe8, 0xbd, 0xd1, 0xea, 0xcb, 0xd4, 0x38, 0xc3, 0xa9, 0x15, 0xef, 0x97, 0x1b, 0xe5, 0xec, 0x9a, 0xeb, 0x5e,
+ 0x8c, 0xf2, 0xaf, 0xf6, 0x66, 0xff, 0x9e, 0xa1, 0x3f, 0xde, 0xb1, 0x6b, 0x8f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5b, 0x5b, 0xc7, 0x89, 0xdb, 0x8f, 0xca, 0x9b, 0xd5, 0xcd, 0x36, 0x33, 0x7a, 0xa8,
+ 0xb9, 0x63, 0xbc, 0xde, 0x8a, 0xd2, 0x5a, 0xe5, 0x77, 0xf6, 0xe5, 0x3d, 0x8f, 0xec, 0x13, 0x57, 0xef, 0xd4, 0xea, 0xe6,
+ 0xb7, 0xea, 0x66, 0x77, 0xed, 0xd7, 0x59, 0x50, 0xb2, 0x70, 0x66, 0xbf, 0x03, 0xc0, 0x97, 0xab, 0xcd, 0xf7, 0x6a, 0x2e,
+ 0x3a, 0x45, 0x62, 0x5c, 0x17, 0x6a, 0x86, 0xbe, 0xc7, 0xef, 0xf4, 0xc1, 0xa3, 0xe0, 0xba, 0xf9, 0x1d, 0x25, 0x7d, 0xb5,
+ 0xf3, 0x7d, 0x66, 0xc3, 0xec, 0xae, 0xeb, 0xd3, 0x3f, 0xbb, 0x73, 0xb5, 0xf9, 0xd5, 0x89, 0xf1, 0x15, 0x6a, 0x59, 0x71,
+ 0x4a, 0xc7, 0xfc, 0xb2, 0xf0, 0xbf, 0xda, 0x35, 0xd5, 0xeb, 0xbe, 0x3d, 0xf3, 0xfa, 0x6b, 0xdf, 0xdd, 0xff, 0xed, 0xad,
+ 0xeb, 0x75, 0xf2, 0x68, 0x2e, 0xae, 0xde, 0x11, 0x10, 0x99, 0x4d, 0x51, 0x75, 0x64, 0xb5, 0xe8, 0xbf, 0x77, 0xce, 0x36,
+ 0xfd, 0xdf, 0xfc, 0xdb, 0x57, 0xbb, 0x14, 0xff, 0x9a, 0xfe, 0x71, 0x3e, 0xf7, 0xb1, 0xf1, 0x3f, 0x22, 0x2b, 0xde, 0x5e,
+ 0x49, 0x6b, 0xfc, 0x6b, 0x63, 0xa7, 0x27, 0xfe, 0x4b, 0xf7, 0x7f, 0xbf, 0xfe, 0xaa, 0x0b, 0xee, 0x68, 0xfd, 0x93, 0xec,
+ 0x53, 0xd5, 0x9e, 0x1a, 0xeb, 0x3d, 0xd9, 0x33, 0x77, 0x94, 0xee, 0xff, 0xaa, 0x86, 0xd1, 0xf1, 0xbf, 0x9e, 0xfe, 0xa9,
+ 0xc3, 0x59, 0xeb, 0x1d, 0x53, 0xad, 0x3d, 0x69, 0xe2, 0x0c, 0xbe, 0xff, 0xfc, 0x7f, 0xac, 0xfe, 0xb1, 0xce, 0x4a, 0x2d,
+ 0xab, 0xe3, 0x8a, 0xfc, 0xf2, 0xd6, 0x27, 0xa9, 0xc7, 0xf6, 0xbd, 0x6b, 0xfe, 0xaf, 0xd5, 0xed, 0x3b, 0xf3, 0xa8, 0xba,
+ 0x10, 0x39, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xa3, 0xd7, 0x89, 0xf6, 0xe9,
+ 0xa6, 0x43, 0xa4, 0x56, 0x6f, 0x74, 0x79, 0xcd, 0xd3, 0xf6, 0x95, 0x7d, 0x63, 0x9f, 0x3f, 0x78, 0xf5, 0x99, 0x3d, 0xb3,
+ 0x5f, 0x27, 0xb4, 0x35, 0xef, 0xee, 0x70, 0xbc, 0xf5, 0xa3, 0xbc, 0xa7, 0xb4, 0x8a, 0xd1, 0xe3, 0x44, 0xfb, 0xc1, 0x9e,
+ 0xd8, 0x1f, 0x1b, 0x47, 0xad, 0xd5, 0x1b, 0x5d, 0x5e, 0xd2, 0xff, 0x33, 0xfb, 0xd7, 0xfe, 0xb1, 0xa7, 0xf6, 0xc5, 0x66,
+ 0xad, 0xbf, 0x0e, 0x6f, 0x6b, 0xc9, 0xcd, 0xe3, 0xd9, 0x47, 0x59, 0xcb, 0x03, 0xd5, 0xe7, 0x44, 0xf9, 0xd9, 0x3e, 0xb0,
+ 0x1f, 0x37, 0x7c, 0x68, 0xb5, 0x7a, 0xa3, 0xcb, 0x4b, 0xfa, 0xff, 0x69, 0x66, 0x7f, 0xdb, 0x6f, 0xf6, 0xe1, 0x83, 0x92,
+ 0x27, 0xf6, 0x64, 0x42, 0x5b, 0x93, 0xdd, 0xbd, 0x68, 0xe7, 0x5d, 0xe7, 0x3e, 0xda, 0x6a, 0xfc, 0xf7, 0x38, 0xd1, 0x3e,
+ 0xb6, 0x9f, 0xec, 0x5b, 0xc1, 0x85, 0x30, 0x53, 0xff, 0xaf, 0xed, 0xbf, 0x1d, 0xfd, 0x35, 0x47, 0x45, 0x6f, 0x79, 0x6b,
+ 0xfc, 0xdb, 0xa0, 0xfc, 0x6f, 0x3d, 0xfa, 0xcf, 0xea, 0xb3, 0x76, 0x6f, 0xe6, 0x56, 0x9f, 0x7c, 0x64, 0x4f, 0x17, 0xd2,
+ 0xbf, 0x76, 0xff, 0x4f, 0x8e, 0x8c, 0xb3, 0xd1, 0xf7, 0xff, 0x33, 0xeb, 0x5f, 0x6a, 0xdf, 0xef, 0x0b, 0xe9, 0xdf, 0xe2,
+ 0xb0, 0x1a, 0xe7, 0x31, 0x19, 0xe3, 0x44, 0x43, 0xff, 0x38, 0xfd, 0xf5, 0xd8, 0x1e, 0xef, 0x81, 0x53, 0xeb, 0x8d, 0x2e,
+ 0xaf, 0xe1, 0xd1, 0x7f, 0x76, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xb4,
+ 0xe4, 0x8b, 0x2b, 0xaf, 0x3e, 0xe7, 0xe2, 0xda, 0x62, 0x69, 0xd5, 0x31, 0x17, 0x4a, 0x14, 0xa7, 0x43, 0xdb, 0xce, 0xc2,
+ 0x26, 0xe6, 0x3a, 0x8c, 0xbd, 0xce, 0xfa, 0xb5, 0xc4, 0x9e, 0x6f, 0x0f, 0x7f, 0xbe, 0xb8, 0xd6, 0xb6, 0xa4, 0x62, 0xf6,
+ 0xb0, 0xbc, 0xab, 0x71, 0x4f, 0x9f, 0x99, 0xbc, 0x8a, 0x5e, 0x7b, 0x4f, 0xfc, 0x75, 0x1e, 0x7b, 0xbe, 0x9e, 0x7c, 0x31,
+ 0x67, 0xcf, 0x70, 0xe1, 0xd1, 0xff, 0xd6, 0x68, 0x75, 0x52, 0x79, 0x33, 0xa0, 0xac, 0x5a, 0xa6, 0xe6, 0x0f, 0x3d, 0xdb,
+ 0x75, 0x46, 0xea, 0xaf, 0xc4, 0xd5, 0x59, 0xca, 0x3c, 0xd7, 0x79, 0x54, 0xd9, 0xc8, 0xe3, 0xaa, 0xfa, 0x9f, 0x59, 0xe3,
+ 0xde, 0xfb, 0xff, 0xad, 0xeb, 0x7f, 0xf6, 0xb9, 0xaf, 0xc5, 0x21, 0x6f, 0xe2, 0x3e, 0xe1, 0x23, 0xca, 0x8e, 0xd4, 0xbf,
+ 0xc7, 0x9d, 0x76, 0xb6, 0x18, 0x6f, 0xbd, 0x9e, 0x5b, 0x8a, 0xff, 0x51, 0xcf, 0xd5, 0xe7, 0xd3, 0xdf, 0xd0, 0xff, 0xa6,
+ 0xf5, 0x4f, 0x37, 0xf9, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xa5, 0xf6, 0x3b, 0x55,
+ 0xab, 0xec, 0x0c, 0x6a, 0x8b, 0xfb, 0x02, 0xdb, 0xae, 0x6f, 0x0d, 0xcf, 0x5f, 0x96, 0xf6, 0xce, 0xec, 0xfb, 0x9d, 0xaf,
+ 0xde, 0x77, 0x65, 0xaf, 0xe1, 0x3a, 0xbe, 0x40, 0x3d, 0x73, 0xd6, 0xd1, 0x9e, 0xbf, 0xd2, 0x4e, 0xbb, 0xca, 0x0e, 0xd6,
+ 0x31, 0xeb, 0x1e, 0xd7, 0xf1, 0xff, 0x6d, 0xbd, 0x9e, 0x4f, 0xb0, 0x5e, 0x32, 0x72, 0xdd, 0x4b, 0x1d, 0x5b, 0x56, 0xe8,
+ 0xdb, 0xb5, 0xd6, 0xbd, 0x6a, 0x25, 0xf9, 0x02, 0xde, 0xa6, 0xbe, 0x11, 0xac, 0xf8, 0xa6, 0x29, 0xbb, 0x1d, 0xdf, 0xcb,
+ 0x7e, 0xcc, 0x9d, 0xbb, 0x0f, 0xce, 0xa4, 0xf1, 0xc8, 0xfb, 0x7f, 0xdd, 0xdf, 0x1d, 0x79, 0xdf, 0x58, 0x4b, 0xff, 0x33,
+ 0x5c, 0x43, 0xdd, 0xef, 0x63, 0x43, 0xf4, 0xaf, 0xd7, 0x39, 0xb7, 0xfe, 0xab, 0xcd, 0x0d, 0xb3, 0xbc, 0x3b, 0xba, 0xfe,
+ 0xd7, 0xf5, 0x7e, 0xcd, 0x68, 0xe7, 0x2c, 0xed, 0x95, 0x71, 0x67, 0x85, 0xac, 0xd1, 0x57, 0xf0, 0xbd, 0xcd, 0x68, 0x27,
+ 0xbe, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x46, 0xf3, 0x39, 0xcd, 0xce, 0xe1, 0xb7, 0xba,
+ 0x9b, 0xef, 0xd8, 0xf3, 0xf5, 0x79, 0x00, 0x95, 0x96, 0x1e, 0x9b, 0xc3, 0xaf, 0x7f, 0x75, 0xe5, 0xec, 0x19, 0xfc, 0xea,
+ 0xab, 0x5c, 0x57, 0x5e, 0x3f, 0x68, 0x8b, 0xff, 0x5b, 0x76, 0x71, 0x6b, 0x33, 0xc0, 0xd1, 0xb9, 0x8d, 0x7a, 0xca, 0xfa,
+ 0xb2, 0xa2, 0xcc, 0x70, 0x1d, 0x7a, 0x33, 0xcd, 0xa8, 0x65, 0xbd, 0x2e, 0xc0, 0xf5, 0x33, 0xe3, 0xf5, 0xdd, 0xff, 0x57,
+ 0x5b, 0xcd, 0x8f, 0x2e, 0xd3, 0xf5, 0x3f, 0x4b, 0xfc, 0x47, 0x39, 0xd9, 0xd6, 0x58, 0xcd, 0x5f, 0x4b, 0xff, 0x24, 0xcc,
+ 0xb9, 0x47, 0x97, 0x79, 0xbe, 0xaf, 0x30, 0x7f, 0x0e, 0x9b, 0xa1, 0xbf, 0x75, 0xc6, 0xff, 0x95, 0xf3, 0x57, 0x5d, 0x25,
+ 0x8b, 0x25, 0xd9, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xcd, 0xfb, 0x67, 0x15,
+ 0x3f, 0xda, 0x3a, 0xde, 0x40, 0xc5, 0xfb, 0x12, 0x7d, 0x05, 0x3d, 0x59, 0xfc, 0x4c, 0xf0, 0xb5, 0x8d, 0x76, 0x0e, 0x95,
+ 0xf3, 0xf8, 0xad, 0xe4, 0x0d, 0xdc, 0xef, 0xbb, 0x1c, 0xee, 0xfb, 0x8c, 0xcf, 0xe2, 0x97, 0x96, 0xd4, 0xff, 0x7c, 0x0e,
+ 0xb7, 0xed, 0x92, 0x7c, 0x82, 0xbe, 0x5b, 0x71, 0xfd, 0xf6, 0xfc, 0x2b, 0xdc, 0x6a, 0x76, 0xbc, 0x51, 0x65, 0x4a, 0xcd,
+ 0x99, 0x99, 0x36, 0xcf, 0x93, 0xc7, 0x4d, 0xf3, 0x76, 0x1d, 0xeb, 0x52, 0x9a, 0xe5, 0x7d, 0xba, 0x05, 0xfd, 0xd3, 0xf2,
+ 0xee, 0x36, 0xf4, 0x47, 0x7f, 0x6b, 0xf0, 0x30, 0x9f, 0x47, 0xff, 0x73, 0x3b, 0xdc, 0xe6, 0x65, 0x1b, 0x36, 0xf9, 0x1b,
+ 0x0a, 0x3c, 0xeb, 0x5f, 0xe3, 0xd3, 0x8a, 0xf2, 0xfd, 0x2c, 0xf4, 0xbf, 0xee, 0xe7, 0xd4, 0xf3, 0x7d, 0x36, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xb2,
+ 0x0c, 0xa2, 0x3f, 0xfa, 0xdf, 0xb8, 0xfe, 0xff, 0x03 };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle jungleFontRecs[189] = {
+ { 4, 4, 5 , 12 },
+ { 17, 4, 2 , 7 },
+ { 27, 4, 5 , 3 },
+ { 40, 4, 5 , 5 },
+ { 53, 4, 6 , 7 },
+ { 67, 4, 7 , 7 },
+ { 82, 4, 5 , 7 },
+ { 95, 4, 3 , 3 },
+ { 106, 4, 4 , 8 },
+ { 118, 4, 4 , 8 },
+ { 130, 4, 5 , 5 },
+ { 143, 4, 5 , 5 },
+ { 156, 4, 2 , 3 },
+ { 166, 4, 5 , 1 },
+ { 179, 4, 2 , 2 },
+ { 189, 4, 7 , 7 },
+ { 204, 4, 7 , 6 },
+ { 219, 4, 6 , 6 },
+ { 233, 4, 6 , 6 },
+ { 4, 24, 6 , 6 },
+ { 18, 24, 6 , 6 },
+ { 32, 24, 6 , 6 },
+ { 46, 24, 6 , 6 },
+ { 60, 24, 6 , 6 },
+ { 74, 24, 6 , 6 },
+ { 88, 24, 6 , 6 },
+ { 102, 24, 2 , 5 },
+ { 112, 24, 2 , 6 },
+ { 122, 24, 3 , 5 },
+ { 133, 24, 5 , 3 },
+ { 146, 24, 3 , 5 },
+ { 157, 24, 6 , 7 },
+ { 171, 24, 7 , 7 },
+ { 186, 24, 6 , 7 },
+ { 200, 24, 6 , 7 },
+ { 214, 24, 6 , 7 },
+ { 228, 24, 6 , 7 },
+ { 4, 44, 6 , 7 },
+ { 18, 44, 6 , 7 },
+ { 32, 44, 6 , 7 },
+ { 46, 44, 6 , 7 },
+ { 60, 44, 6 , 7 },
+ { 74, 44, 6 , 7 },
+ { 88, 44, 6 , 7 },
+ { 102, 44, 6 , 7 },
+ { 116, 44, 7 , 7 },
+ { 131, 44, 6 , 7 },
+ { 145, 44, 6 , 7 },
+ { 159, 44, 6 , 7 },
+ { 173, 44, 7 , 8 },
+ { 188, 44, 6 , 7 },
+ { 202, 44, 6 , 7 },
+ { 216, 44, 6 , 7 },
+ { 230, 44, 6 , 7 },
+ { 4, 64, 6 , 7 },
+ { 18, 64, 7 , 7 },
+ { 33, 64, 6 , 7 },
+ { 47, 64, 6 , 7 },
+ { 61, 64, 6 , 7 },
+ { 75, 64, 4 , 8 },
+ { 87, 64, 7 , 7 },
+ { 102, 64, 4 , 8 },
+ { 114, 64, 4 , 2 },
+ { 126, 64, 6 , 1 },
+ { 140, 64, 2 , 2 },
+ { 150, 64, 6 , 5 },
+ { 164, 64, 6 , 7 },
+ { 178, 64, 6 , 5 },
+ { 192, 64, 6 , 7 },
+ { 206, 64, 6 , 5 },
+ { 220, 64, 6 , 7 },
+ { 234, 64, 6 , 7 },
+ { 4, 84, 6 , 7 },
+ { 18, 84, 6 , 7 },
+ { 32, 84, 5 , 8 },
+ { 45, 84, 6 , 7 },
+ { 59, 84, 6 , 7 },
+ { 73, 84, 7 , 5 },
+ { 88, 84, 6 , 5 },
+ { 102, 84, 6 , 5 },
+ { 116, 84, 6 , 7 },
+ { 130, 84, 6 , 7 },
+ { 144, 84, 6 , 5 },
+ { 158, 84, 6 , 5 },
+ { 172, 84, 6 , 6 },
+ { 186, 84, 6 , 5 },
+ { 200, 84, 6 , 5 },
+ { 214, 84, 7 , 5 },
+ { 229, 84, 6 , 5 },
+ { 4, 104, 6 , 7 },
+ { 18, 104, 6 , 5 },
+ { 32, 104, 4 , 8 },
+ { 44, 104, 2 , 8 },
+ { 54, 104, 4 , 8 },
+ { 66, 104, 5 , 2 },
+ { 79, 104, 2 , 7 },
+ { 89, 104, 6 , 6 },
+ { 103, 104, 6 , 7 },
+ { 117, 104, 6 , 7 },
+ { 131, 104, 6 , 7 },
+ { 145, 104, 8 , 8 },
+ { 161, 104, 6 , 9 },
+ { 175, 104, 8 , 8 },
+ { 191, 104, 7 , 7 },
+ { 206, 104, 8 , 8 },
+ { 222, 104, 6 , 5 },
+ { 236, 104, 8 , 8 },
+ { 4, 124, 7 , 7 },
+ { 19, 124, 8 , 8 },
+ { 35, 124, 4 , 4 },
+ { 47, 124, 8 , 8 },
+ { 63, 124, 8 , 8 },
+ { 79, 124, 8 , 8 },
+ { 95, 124, 8 , 8 },
+ { 111, 124, 6 , 7 },
+ { 125, 124, 5 , 8 },
+ { 138, 124, 3 , 3 },
+ { 149, 124, 8 , 8 },
+ { 165, 124, 8 , 8 },
+ { 181, 124, 8 , 8 },
+ { 197, 124, 6 , 5 },
+ { 211, 124, 10 , 7 },
+ { 229, 124, 10 , 5 },
+ { 4, 144, 8 , 8 },
+ { 20, 144, 6 , 7 },
+ { 34, 144, 6 , 10 },
+ { 48, 144, 6 , 10 },
+ { 62, 144, 6 , 10 },
+ { 76, 144, 6 , 10 },
+ { 90, 144, 6 , 10 },
+ { 104, 144, 6 , 10 },
+ { 118, 144, 10 , 7 },
+ { 136, 144, 6 , 9 },
+ { 150, 144, 6 , 10 },
+ { 164, 144, 6 , 10 },
+ { 178, 144, 6 , 10 },
+ { 192, 144, 6 , 10 },
+ { 206, 144, 6 , 10 },
+ { 220, 144, 6 , 10 },
+ { 234, 144, 6 , 10 },
+ { 4, 164, 6 , 10 },
+ { 18, 164, 6 , 7 },
+ { 32, 164, 6 , 10 },
+ { 46, 164, 6 , 10 },
+ { 60, 164, 6 , 10 },
+ { 74, 164, 6 , 10 },
+ { 88, 164, 6 , 10 },
+ { 102, 164, 6 , 10 },
+ { 116, 164, 6 , 5 },
+ { 130, 164, 6 , 7 },
+ { 144, 164, 6 , 10 },
+ { 158, 164, 6 , 10 },
+ { 172, 164, 6 , 10 },
+ { 186, 164, 6 , 10 },
+ { 200, 164, 6 , 10 },
+ { 214, 164, 6 , 7 },
+ { 228, 164, 6 , 7 },
+ { 4, 184, 6 , 8 },
+ { 18, 184, 6 , 8 },
+ { 32, 184, 6 , 8 },
+ { 46, 184, 6 , 8 },
+ { 60, 184, 6 , 8 },
+ { 74, 184, 6 , 8 },
+ { 88, 184, 9 , 5 },
+ { 105, 184, 6 , 7 },
+ { 119, 184, 6 , 8 },
+ { 133, 184, 6 , 8 },
+ { 147, 184, 6 , 8 },
+ { 161, 184, 6 , 8 },
+ { 175, 184, 6 , 8 },
+ { 189, 184, 6 , 8 },
+ { 203, 184, 6 , 8 },
+ { 217, 184, 6 , 8 },
+ { 231, 184, 6 , 7 },
+ { 4, 204, 6 , 8 },
+ { 18, 204, 6 , 8 },
+ { 32, 204, 6 , 8 },
+ { 46, 204, 6 , 8 },
+ { 60, 204, 6 , 8 },
+ { 74, 204, 6 , 8 },
+ { 88, 204, 5 , 5 },
+ { 101, 204, 6 , 5 },
+ { 115, 204, 6 , 8 },
+ { 129, 204, 6 , 8 },
+ { 143, 204, 6 , 8 },
+ { 157, 204, 6 , 8 },
+ { 171, 204, 6 , 10 },
+ { 185, 204, 6 , 9 },
+ { 199, 204, 6 , 10 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo jungleFontGlyphs[189] = {
+ { 32, 0, 9, 5, { 0 }},
+ { 33, 0, 2, 3, { 0 }},
+ { 34, 0, 2, 6, { 0 }},
+ { 35, 0, 3, 6, { 0 }},
+ { 36, 0, 2, 7, { 0 }},
+ { 37, 0, 2, 8, { 0 }},
+ { 38, 0, 2, 6, { 0 }},
+ { 39, 0, 2, 4, { 0 }},
+ { 40, 0, 2, 5, { 0 }},
+ { 41, 0, 2, 5, { 0 }},
+ { 42, 0, 2, 6, { 0 }},
+ { 43, 0, 3, 6, { 0 }},
+ { 44, 0, 7, 3, { 0 }},
+ { 45, 0, 5, 6, { 0 }},
+ { 46, 0, 7, 3, { 0 }},
+ { 47, 0, 2, 8, { 0 }},
+ { 48, 0, 3, 8, { 0 }},
+ { 49, 0, 3, 7, { 0 }},
+ { 50, 0, 3, 7, { 0 }},
+ { 51, 0, 3, 7, { 0 }},
+ { 52, 0, 3, 7, { 0 }},
+ { 53, 0, 3, 7, { 0 }},
+ { 54, 0, 3, 7, { 0 }},
+ { 55, 0, 3, 7, { 0 }},
+ { 56, 0, 3, 7, { 0 }},
+ { 57, 0, 3, 7, { 0 }},
+ { 58, 0, 4, 3, { 0 }},
+ { 59, 0, 4, 3, { 0 }},
+ { 60, 0, 3, 4, { 0 }},
+ { 61, 0, 4, 6, { 0 }},
+ { 62, 0, 3, 4, { 0 }},
+ { 63, 0, 2, 7, { 0 }},
+ { 64, 0, 2, 8, { 0 }},
+ { 65, 0, 2, 7, { 0 }},
+ { 66, 0, 2, 7, { 0 }},
+ { 67, 0, 2, 7, { 0 }},
+ { 68, 0, 2, 7, { 0 }},
+ { 69, 0, 2, 7, { 0 }},
+ { 70, 0, 2, 7, { 0 }},
+ { 71, 0, 2, 7, { 0 }},
+ { 72, 0, 2, 7, { 0 }},
+ { 73, 0, 2, 7, { 0 }},
+ { 74, 0, 2, 7, { 0 }},
+ { 75, 0, 2, 7, { 0 }},
+ { 76, 0, 2, 7, { 0 }},
+ { 77, 0, 2, 8, { 0 }},
+ { 78, 0, 2, 7, { 0 }},
+ { 79, 0, 2, 7, { 0 }},
+ { 80, 0, 2, 7, { 0 }},
+ { 81, 0, 2, 7, { 0 }},
+ { 82, 0, 2, 7, { 0 }},
+ { 83, 0, 2, 7, { 0 }},
+ { 84, 0, 2, 7, { 0 }},
+ { 85, 0, 2, 7, { 0 }},
+ { 86, 0, 2, 7, { 0 }},
+ { 87, 0, 2, 8, { 0 }},
+ { 88, 0, 2, 7, { 0 }},
+ { 89, 0, 2, 7, { 0 }},
+ { 90, 0, 2, 7, { 0 }},
+ { 91, 0, 2, 5, { 0 }},
+ { 92, 0, 2, 8, { 0 }},
+ { 93, 0, 2, 5, { 0 }},
+ { 94, 0, -1, 5, { 0 }},
+ { 95, 0, 10, 7, { 0 }},
+ { 96, 0, -1, 3, { 0 }},
+ { 97, 0, 4, 7, { 0 }},
+ { 98, 0, 2, 7, { 0 }},
+ { 99, 0, 4, 7, { 0 }},
+ { 100, 0, 2, 7, { 0 }},
+ { 101, 0, 4, 7, { 0 }},
+ { 102, 0, 2, 7, { 0 }},
+ { 103, 0, 4, 7, { 0 }},
+ { 104, 0, 2, 7, { 0 }},
+ { 105, 0, 2, 7, { 0 }},
+ { 106, 0, 2, 6, { 0 }},
+ { 107, 0, 2, 7, { 0 }},
+ { 108, 0, 2, 7, { 0 }},
+ { 109, 0, 4, 8, { 0 }},
+ { 110, 0, 4, 7, { 0 }},
+ { 111, 0, 4, 7, { 0 }},
+ { 112, 0, 4, 7, { 0 }},
+ { 113, 0, 4, 7, { 0 }},
+ { 114, 0, 4, 7, { 0 }},
+ { 115, 0, 4, 7, { 0 }},
+ { 116, 0, 3, 7, { 0 }},
+ { 117, 0, 4, 7, { 0 }},
+ { 118, 0, 4, 7, { 0 }},
+ { 119, 0, 4, 8, { 0 }},
+ { 120, 0, 4, 7, { 0 }},
+ { 121, 0, 4, 7, { 0 }},
+ { 122, 0, 4, 7, { 0 }},
+ { 123, 0, 2, 5, { 0 }},
+ { 124, 0, 2, 3, { 0 }},
+ { 125, 0, 2, 5, { 0 }},
+ { 126, 0, -1, 6, { 0 }},
+ { 161, 0, 2, 3, { 0 }},
+ { 162, 0, 3, 7, { 0 }},
+ { 163, 0, 2, 7, { 0 }},
+ { 8364, 0, 2, 7, { 0 }},
+ { 165, 0, 2, 7, { 0 }},
+ { 352, 0, 1, 8, { 0 }},
+ { 167, 0, 1, 7, { 0 }},
+ { 353, 0, 1, 8, { 0 }},
+ { 169, 0, 2, 8, { 0 }},
+ { 170, 0, 1, 8, { 0 }},
+ { 171, 0, 3, 7, { 0 }},
+ { 172, 0, 1, 8, { 0 }},
+ { 174, 0, 2, 8, { 0 }},
+ { 175, 0, 1, 8, { 0 }},
+ { 176, 0, 1, 2, { 0 }},
+ { 177, 0, 1, 8, { 0 }},
+ { 178, 0, 1, 8, { 0 }},
+ { 179, 0, 1, 8, { 0 }},
+ { 381, 0, 1, 8, { 0 }},
+ { 181, 0, 4, 7, { 0 }},
+ { 182, 0, 1, 4, { 0 }},
+ { 183, 0, 4, 4, { 0 }},
+ { 382, 0, 1, 8, { 0 }},
+ { 185, 0, 1, 8, { 0 }},
+ { 186, 0, 1, 8, { 0 }},
+ { 187, 0, 3, 7, { 0 }},
+ { 338, 0, 2, 11, { 0 }},
+ { 339, 0, 4, 11, { 0 }},
+ { 376, 0, 1, 8, { 0 }},
+ { 191, 0, 2, 7, { 0 }},
+ { 192, 0, -1, 7, { 0 }},
+ { 193, 0, -1, 7, { 0 }},
+ { 194, 0, -1, 7, { 0 }},
+ { 195, 0, -1, 7, { 0 }},
+ { 196, 0, -1, 7, { 0 }},
+ { 197, 0, -1, 7, { 0 }},
+ { 198, 0, 2, 11, { 0 }},
+ { 199, 0, 2, 7, { 0 }},
+ { 200, 0, -1, 7, { 0 }},
+ { 201, 0, -1, 7, { 0 }},
+ { 202, 0, -1, 7, { 0 }},
+ { 203, 0, -1, 7, { 0 }},
+ { 204, 0, -1, 7, { 0 }},
+ { 205, 0, -1, 7, { 0 }},
+ { 206, 0, -1, 7, { 0 }},
+ { 207, 0, -1, 7, { 0 }},
+ { 208, 0, 2, 7, { 0 }},
+ { 209, 0, -1, 7, { 0 }},
+ { 210, 0, -1, 7, { 0 }},
+ { 211, 0, -1, 7, { 0 }},
+ { 212, 0, -1, 7, { 0 }},
+ { 213, 0, -1, 7, { 0 }},
+ { 214, 0, -1, 7, { 0 }},
+ { 215, 0, 3, 7, { 0 }},
+ { 216, 0, 2, 7, { 0 }},
+ { 217, 0, -1, 7, { 0 }},
+ { 218, 0, -1, 7, { 0 }},
+ { 219, 0, -1, 7, { 0 }},
+ { 220, 0, -1, 7, { 0 }},
+ { 221, 0, -1, 7, { 0 }},
+ { 222, 0, 2, 7, { 0 }},
+ { 223, 0, 2, 7, { 0 }},
+ { 224, 0, 1, 7, { 0 }},
+ { 225, 0, 1, 7, { 0 }},
+ { 226, 0, 1, 7, { 0 }},
+ { 227, 0, 1, 7, { 0 }},
+ { 228, 0, 1, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 4, 10, { 0 }},
+ { 231, 0, 4, 7, { 0 }},
+ { 232, 0, 1, 7, { 0 }},
+ { 233, 0, 1, 7, { 0 }},
+ { 234, 0, 1, 7, { 0 }},
+ { 235, 0, 1, 7, { 0 }},
+ { 236, 0, 1, 7, { 0 }},
+ { 237, 0, 1, 7, { 0 }},
+ { 238, 0, 1, 7, { 0 }},
+ { 239, 0, 1, 7, { 0 }},
+ { 240, 0, 2, 7, { 0 }},
+ { 241, 0, 1, 7, { 0 }},
+ { 242, 0, 1, 7, { 0 }},
+ { 243, 0, 1, 7, { 0 }},
+ { 244, 0, 1, 7, { 0 }},
+ { 245, 0, 1, 7, { 0 }},
+ { 246, 0, 1, 7, { 0 }},
+ { 247, 0, 3, 6, { 0 }},
+ { 248, 0, 4, 7, { 0 }},
+ { 249, 0, 1, 7, { 0 }},
+ { 250, 0, 1, 7, { 0 }},
+ { 251, 0, 1, 7, { 0 }},
+ { 252, 0, 1, 7, { 0 }},
+ { 253, 0, 1, 7, { 0 }},
+ { 254, 0, 2, 7, { 0 }},
+ { 255, 0, 1, 7, { 0 }},
+};
+
+// Style loading function: Jungle
+static void GuiLoadStyleJungle(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < JUNGLE_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(jungleStyleProps[i].controlId, jungleStyleProps[i].propertyId, jungleStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int jungleFontDataSize = 0;
+ unsigned char *data = DecompressData(jungleFontData, JUNGLE_STYLE_FONT_ATLAS_COMP_SIZE, &jungleFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 12;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, jungleFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, jungleFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 254, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/examples/styles/style_lavanda.h b/external/raygui-4.0/examples/styles/style_lavanda.h
new file mode 100644
index 0000000..b8d7bdf
--- /dev/null
+++ b/external/raygui-4.0/examples/styles/style_lavanda.h
@@ -0,0 +1,607 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleLavanda(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define LAVANDA_STYLE_PROPS_COUNT 16
+
+// Custom style name: Lavanda
+static const GuiStyleProp lavandaStyleProps[LAVANDA_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0xab9bd3ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x3e4350ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xdadaf4ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xee84a0ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xf4b7c7ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xb7657bff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xd5c8dbff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x966ec0ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0xd7ccf7ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x8fa2bdff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x6b798dff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x8292a9ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 18, 0x84adb7ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x5b5b81ff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Cartridge.ttf" (size: 16, spacing: 1)
+
+#define LAVANDA_STYLE_FONT_ATLAS_COMP_SIZE 2636
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char lavandaFontData[LAVANDA_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0xdb, 0xd2, 0xa4, 0xba, 0x0d, 0x06, 0x50, 0xde, 0xff, 0xa5, 0xbf, 0x5c, 0xa4, 0x52, 0x49, 0xaa, 0x66, 0x63, 0x24,
+ 0x0b, 0x9a, 0xee, 0x59, 0xb3, 0xee, 0x7e, 0xa6, 0x4f, 0x06, 0xf9, 0x04, 0x96, 0x73, 0x00, 0x00, 0x00, 0x00, 0x24, 0x7f,
+ 0xfc, 0x4b, 0x4e, 0xfe, 0x6f, 0x2e, 0xbf, 0xd3, 0x7f, 0xfe, 0x9e, 0xc5, 0xff, 0xf8, 0xff, 0xff, 0x75, 0xed, 0x7d, 0x73,
+ 0xf9, 0xf3, 0x3b, 0x47, 0xf2, 0xc7, 0xef, 0x97, 0x8d, 0xd7, 0xff, 0xd3, 0x3b, 0xd4, 0xff, 0xff, 0x7f, 0xff, 0x55, 0xca,
+ 0xf1, 0xfc, 0x35, 0x47, 0xf1, 0x73, 0xb2, 0xf8, 0x9c, 0xab, 0xbf, 0xb0, 0x56, 0xfa, 0xb5, 0x73, 0x9e, 0xd3, 0x2b, 0xb2,
+ 0xf3, 0xca, 0xf3, 0xd7, 0x1d, 0xe5, 0xb2, 0x3a, 0x96, 0x25, 0x5c, 0x3d, 0xcb, 0xef, 0x8b, 0xff, 0x5c, 0x78, 0xe5, 0xf9,
+ 0xf1, 0x6c, 0xd4, 0x09, 0xeb, 0x72, 0xac, 0xd6, 0x18, 0x3b, 0xa5, 0x7a, 0xf6, 0x1d, 0x2b, 0xff, 0xff, 0x5a, 0x6d, 0xbb,
+ 0x5f, 0x3b, 0xae, 0x4a, 0xbf, 0xfe, 0xad, 0xaf, 0x94, 0x5c, 0x06, 0xfe, 0x7f, 0x5a, 0xdf, 0x7e, 0xe2, 0xfa, 0xcf, 0xf6,
+ 0xb5, 0x7d, 0xa5, 0xad, 0x9c, 0xb8, 0x46, 0xab, 0xf1, 0x9f, 0x56, 0x8b, 0x90, 0x45, 0x99, 0xde, 0x1d, 0xff, 0x9d, 0x76,
+ 0x34, 0x37, 0x95, 0x6a, 0xb5, 0xbe, 0xad, 0x5f, 0x37, 0x29, 0xb6, 0xb4, 0xbd, 0xf8, 0x5f, 0x7f, 0x4e, 0xc6, 0xca, 0x6d,
+ 0xdd, 0x7b, 0xa9, 0x97, 0x76, 0xef, 0xb7, 0x75, 0x6b, 0x95, 0x34, 0x7a, 0x40, 0xfd, 0xfa, 0x7a, 0xaa, 0xc4, 0x6b, 0x51,
+ 0x7a, 0xa5, 0x75, 0xcb, 0x58, 0xbd, 0x9f, 0x72, 0x6b, 0x95, 0x47, 0xca, 0xf2, 0x68, 0xb7, 0x3a, 0xd5, 0x5f, 0x94, 0x72,
+ 0x5c, 0x56, 0xfa, 0xe5, 0xfd, 0xab, 0x30, 0xa5, 0xd1, 0x59, 0x6e, 0x6b, 0xff, 0xd7, 0xad, 0x71, 0x9a, 0x57, 0x72, 0xca,
+ 0x7d, 0x83, 0x94, 0x47, 0x95, 0xeb, 0x73, 0xbc, 0x1e, 0x8b, 0xcc, 0xc7, 0x7f, 0xaf, 0x1f, 0xf3, 0xa7, 0x72, 0xef, 0xf6,
+ 0x12, 0xe6, 0xeb, 0xc6, 0xb7, 0xc7, 0x7f, 0x1a, 0x7d, 0x8c, 0xea, 0x6b, 0x52, 0x9e, 0x7b, 0x39, 0x6f, 0x23, 0xaf, 0x5f,
+ 0x99, 0x19, 0xba, 0x26, 0x3b, 0xad, 0x41, 0x1a, 0xe3, 0xc5, 0xdd, 0x96, 0x7c, 0x7a, 0xce, 0xea, 0xc9, 0xf8, 0xcf, 0x85,
+ 0x19, 0x89, 0xd5, 0x95, 0x97, 0x65, 0x29, 0xe4, 0x86, 0xf6, 0xff, 0x0d, 0x73, 0xaa, 0x4f, 0xc5, 0x7f, 0x96, 0x73, 0x5b,
+ 0x13, 0xd7, 0x74, 0x46, 0xce, 0x43, 0x3e, 0x70, 0x16, 0xae, 0xc4, 0xff, 0xd1, 0x6c, 0xc9, 0x7f, 0x3b, 0xfe, 0x8f, 0x8b,
+ 0xbd, 0xf8, 0xa3, 0x31, 0x0b, 0xf8, 0x5b, 0xf1, 0x9f, 0x46, 0xcc, 0x64, 0x6c, 0x64, 0xde, 0xeb, 0x33, 0xcc, 0xc6, 0xff,
+ 0x7b, 0x6b, 0xe1, 0x55, 0xff, 0x3f, 0x17, 0xef, 0x30, 0xfd, 0x4e, 0xfc, 0x1f, 0xa3, 0xfd, 0xff, 0xf5, 0x15, 0x33, 0x31,
+ 0x6b, 0xf4, 0x77, 0xc4, 0x7f, 0x9a, 0xf5, 0x70, 0x06, 0x67, 0x6e, 0xbe, 0x39, 0xfe, 0x3b, 0xd1, 0x93, 0x76, 0x5d, 0x79,
+ 0xde, 0xba, 0xe5, 0xa4, 0xc7, 0x56, 0xad, 0x19, 0xee, 0x9e, 0xff, 0xef, 0xdf, 0xb7, 0xc9, 0xf6, 0xab, 0xf3, 0xf0, 0xf8,
+ 0xff, 0xb9, 0xf8, 0x3f, 0xca, 0x33, 0xd8, 0xe7, 0xf7, 0x5a, 0xea, 0xf5, 0x4f, 0x1a, 0xf7, 0xbb, 0x8f, 0x91, 0xdf, 0xf2,
+ 0xb6, 0xf3, 0x70, 0xed, 0x35, 0x29, 0xcf, 0x6d, 0x9c, 0xdf, 0x01, 0xfb, 0xe7, 0xd9, 0x88, 0xce, 0xbc, 0xec, 0xfb, 0xea,
+ 0xd8, 0xbc, 0xa6, 0x8d, 0xfd, 0x5b, 0x4a, 0x81, 0x67, 0x9e, 0x31, 0x40, 0xfc, 0x8b, 0x7f, 0x78, 0xfb, 0x73, 0xcb, 0xe2,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xdf, 0x5a, 0xa1, 0x57, 0x5b, 0x15, 0xbe,
+ 0x93, 0xcb, 0xb8, 0x93, 0x9d, 0x6e, 0xbd, 0x42, 0x3d, 0xad, 0x9c, 0x04, 0xbd, 0xd7, 0xe5, 0x34, 0x0b, 0x5a, 0x46, 0xf2,
+ 0x13, 0x74, 0xf3, 0x4e, 0x55, 0x32, 0x08, 0x54, 0xf7, 0x32, 0xe8, 0xee, 0x1b, 0x50, 0xfb, 0x8c, 0xce, 0x6a, 0xfd, 0x0c,
+ 0x65, 0x41, 0xe8, 0xe4, 0x16, 0xde, 0x5b, 0x95, 0x5a, 0xcf, 0xd1, 0xb6, 0x93, 0xf5, 0x23, 0xad, 0x55, 0x73, 0x93, 0xf1,
+ 0x9f, 0x4b, 0xb9, 0x0e, 0x3a, 0x19, 0x6a, 0x3a, 0x59, 0x6a, 0x32, 0x9c, 0x5f, 0xe7, 0x5a, 0x94, 0x5e, 0xcb, 0x39, 0x95,
+ 0xe2, 0x77, 0xaa, 0xef, 0xca, 0x90, 0x46, 0xa4, 0xd5, 0xca, 0xb0, 0xb3, 0x3e, 0x72, 0xa7, 0x55, 0xd9, 0xbb, 0x7a, 0x53,
+ 0xca, 0x45, 0x7c, 0x77, 0xde, 0x9d, 0x94, 0xe3, 0xe7, 0xd9, 0xf8, 0x4f, 0xe3, 0x17, 0xe5, 0x52, 0xce, 0xe5, 0x6e, 0x46,
+ 0xb6, 0x6e, 0x26, 0xa7, 0x5e, 0x16, 0x81, 0x7e, 0xfc, 0x5f, 0x3b, 0x03, 0xbf, 0x1d, 0xff, 0x3b, 0xfb, 0xc7, 0x4c, 0xc4,
+ 0x7f, 0xb6, 0x3f, 0x39, 0x23, 0xe5, 0x5a, 0x79, 0x97, 0x55, 0xfc, 0x3c, 0x19, 0xff, 0xfd, 0x8c, 0x85, 0x67, 0xbf, 0x38,
+ 0x5b, 0xf1, 0x3f, 0xf9, 0xba, 0xa3, 0x99, 0x5f, 0x6b, 0x3f, 0xfe, 0xd3, 0xec, 0xb9, 0xce, 0xf5, 0x3d, 0xa7, 0xf2, 0x06,
+ 0x77, 0xae, 0xcf, 0x5c, 0xc8, 0xd7, 0xbb, 0xdb, 0x33, 0xa8, 0xe5, 0xae, 0xce, 0xb2, 0x35, 0xde, 0x8d, 0xff, 0x3c, 0xd8,
+ 0xff, 0xaf, 0x8c, 0xc8, 0x32, 0xde, 0xfe, 0x7f, 0x57, 0xfc, 0xdf, 0xd5, 0xff, 0xbf, 0xd2, 0x92, 0x75, 0xf7, 0xf5, 0x7a,
+ 0x3a, 0xfe, 0xef, 0x98, 0x97, 0xca, 0x48, 0xcb, 0xd5, 0xaf, 0x31, 0xae, 0xf6, 0xff, 0x33, 0xb4, 0x2b, 0x55, 0x6f, 0xdc,
+ 0x92, 0x9b, 0xdb, 0xff, 0x34, 0x46, 0x4a, 0xbb, 0xf1, 0x7f, 0x5c, 0xca, 0x83, 0x9a, 0xe6, 0xb9, 0xae, 0xd4, 0xe1, 0x3b,
+ 0x3b, 0xef, 0xed, 0xf4, 0xe0, 0xd3, 0xdc, 0x79, 0x2e, 0x8d, 0x91, 0xea, 0x6f, 0xc4, 0xff, 0xce, 0x2e, 0x5d, 0x4f, 0xf5,
+ 0xdc, 0x8f, 0x0b, 0x6d, 0xde, 0x1b, 0xe3, 0x7f, 0x7e, 0xfe, 0x6f, 0xfd, 0x1d, 0xf2, 0xf0, 0xf8, 0x3f, 0x8d, 0x28, 0x7e,
+ 0x5f, 0xfc, 0xd7, 0xdb, 0xa3, 0x99, 0xfd, 0x90, 0xa7, 0x6b, 0x80, 0xce, 0xee, 0x99, 0x9d, 0x9d, 0x53, 0x53, 0xda, 0x89,
+ 0x6c, 0xae, 0x47, 0x32, 0xd5, 0xff, 0x7f, 0x2e, 0xfe, 0xd3, 0xba, 0x0e, 0x3b, 0xdf, 0xbf, 0xbf, 0x3b, 0x40, 0xb6, 0x5a,
+ 0x95, 0x8c, 0xc6, 0xff, 0xc4, 0x2c, 0x5d, 0xb7, 0x4e, 0x7a, 0x7e, 0x3f, 0xf4, 0xe7, 0xee, 0x59, 0xa7, 0xb9, 0xab, 0x5b,
+ 0x46, 0xee, 0x8c, 0x67, 0x64, 0x2e, 0x2d, 0x5b, 0xf1, 0xbf, 0x7f, 0x2e, 0xaa, 0xfb, 0x32, 0xae, 0xfb, 0xc6, 0xf5, 0x79,
+ 0x91, 0x6e, 0xfc, 0xf7, 0x32, 0xd4, 0x5f, 0xfd, 0x1d, 0xff, 0x3c, 0x57, 0x72, 0x8c, 0xdf, 0x91, 0x4e, 0xab, 0xae, 0xea,
+ 0xf6, 0x2c, 0xd2, 0xda, 0x35, 0xff, 0x7d, 0xf1, 0xff, 0x44, 0xad, 0x31, 0x33, 0xf3, 0xd9, 0xb9, 0x17, 0x99, 0xf2, 0x35,
+ 0x3d, 0x3d, 0xc2, 0xfa, 0xfc, 0x19, 0xbd, 0x6f, 0x47, 0xa3, 0x37, 0x65, 0xe3, 0x9d, 0x88, 0xff, 0xa3, 0x71, 0xbf, 0x62,
+ 0xff, 0x4e, 0xdf, 0x77, 0x66, 0x35, 0xce, 0x8d, 0x4f, 0x25, 0xcc, 0xbd, 0xbf, 0x67, 0x10, 0x3f, 0x17, 0x75, 0x7f, 0x6b,
+ 0xa9, 0xfd, 0x1d, 0xf1, 0xff, 0x4c, 0x8d, 0x3d, 0x3d, 0x12, 0x81, 0x4f, 0x8e, 0xa9, 0x33, 0x32, 0x02, 0xe7, 0xb7, 0xda,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa9, 0xf5, 0x63, 0x33, 0xf9, 0x89, 0xd6,
+ 0x6b, 0x9a, 0x6b, 0x2b, 0x21, 0xd2, 0x58, 0xaf, 0xbc, 0x97, 0x47, 0xbf, 0x9a, 0xd5, 0xe5, 0x7c, 0xbd, 0x4c, 0x2e, 0xae,
+ 0xa1, 0x59, 0xad, 0x10, 0xc9, 0xf6, 0x5a, 0xbc, 0xee, 0xae, 0x06, 0xab, 0x4f, 0xeb, 0x64, 0x65, 0x38, 0xdf, 0x4d, 0xa0,
+ 0xbb, 0x0f, 0xc0, 0x59, 0x96, 0x83, 0x94, 0x3f, 0xef, 0xec, 0x95, 0x29, 0xe7, 0x0a, 0x4b, 0x61, 0xed, 0x54, 0x5a, 0x57,
+ 0x68, 0x27, 0xa3, 0xc3, 0xff, 0x7e, 0x5e, 0xe5, 0x6c, 0x65, 0x79, 0xa5, 0x55, 0xb2, 0xf1, 0xd5, 0xf3, 0x9d, 0xac, 0x32,
+ 0x10, 0xf6, 0xf3, 0xe8, 0x67, 0x70, 0x05, 0x7e, 0x86, 0xfe, 0x5a, 0x59, 0x25, 0x96, 0xad, 0x3a, 0x3e, 0x43, 0x75, 0xed,
+ 0x6e, 0x79, 0xa5, 0x51, 0x73, 0xa7, 0x5d, 0xe3, 0x1f, 0xad, 0x0c, 0x09, 0x19, 0xc8, 0x08, 0x90, 0x56, 0x09, 0x9d, 0xb5,
+ 0x42, 0x69, 0xaf, 0x42, 0xac, 0x67, 0x39, 0x4a, 0xf9, 0x3b, 0x1e, 0x8d, 0x3c, 0xa8, 0xb3, 0xd9, 0x97, 0x76, 0xf6, 0xfd,
+ 0x98, 0xc9, 0x98, 0x39, 0xb5, 0x86, 0xbe, 0x97, 0x9b, 0xa9, 0xfe, 0xd9, 0x9d, 0xab, 0x2a, 0x1b, 0xbd, 0xd0, 0x14, 0x7f,
+ 0x5d, 0x2e, 0xb7, 0x71, 0x7f, 0x6e, 0xf5, 0xea, 0x71, 0x53, 0xcf, 0xa9, 0x34, 0x95, 0x3b, 0xe9, 0xae, 0xf8, 0x3f, 0xc6,
+ 0xb3, 0x9c, 0xf5, 0x7a, 0x21, 0xbb, 0x3d, 0xf5, 0xbd, 0xf8, 0x5f, 0xef, 0x52, 0xb4, 0x5f, 0xe3, 0xdf, 0x19, 0xff, 0xbd,
+ 0x5c, 0x88, 0x59, 0xf6, 0xba, 0xbb, 0x7b, 0xaf, 0xd5, 0xfa, 0xf1, 0x69, 0x67, 0x97, 0xed, 0xe5, 0xd1, 0xc8, 0x22, 0xb7,
+ 0x6c, 0x6f, 0xdd, 0xfe, 0x7e, 0xff, 0x7f, 0xdd, 0x8f, 0x3f, 0xab, 0x1b, 0xef, 0xc8, 0xff, 0x77, 0x7f, 0xfc, 0xd7, 0xb2,
+ 0x26, 0xf7, 0xda, 0xf0, 0x6b, 0x79, 0x74, 0x27, 0xb3, 0xdf, 0x7d, 0x2a, 0xfe, 0xeb, 0xe3, 0xea, 0xe9, 0x31, 0x45, 0xe7,
+ 0x0c, 0xe5, 0x42, 0x2e, 0xc3, 0xb4, 0xf2, 0xa7, 0x9e, 0x8f, 0x7a, 0x67, 0xb3, 0xf0, 0xdc, 0xf9, 0x3e, 0x57, 0xc6, 0x62,
+ 0xcf, 0xc5, 0x7f, 0x36, 0x46, 0xe0, 0x7b, 0xed, 0x56, 0x2e, 0xb7, 0x22, 0xf7, 0xc7, 0xff, 0xdc, 0x9e, 0x95, 0xfb, 0x79,
+ 0xfa, 0x7a, 0x7d, 0xfc, 0x6c, 0xcc, 0x82, 0x75, 0xce, 0xe8, 0xb5, 0xb9, 0x8e, 0x3c, 0x32, 0xeb, 0x9d, 0xad, 0xb8, 0xb9,
+ 0x7f, 0x4e, 0xbe, 0x36, 0x1b, 0x34, 0x1f, 0xff, 0x47, 0x71, 0xfc, 0x7d, 0x5c, 0xdc, 0xab, 0x63, 0x77, 0xdc, 0x9a, 0xad,
+ 0xfe, 0xf8, 0xec, 0x9c, 0x55, 0xfd, 0xbb, 0x3f, 0xdf, 0xff, 0xdf, 0xcb, 0x1a, 0x9b, 0x56, 0x3f, 0x38, 0x1b, 0x75, 0x69,
+ 0x27, 0xf3, 0xf2, 0x4e, 0x8c, 0x4d, 0xee, 0x53, 0x36, 0xf1, 0x1d, 0xcf, 0x47, 0x11, 0xd3, 0xf1, 0x5f, 0x2f, 0x85, 0x7c,
+ 0xb4, 0x1f, 0xd4, 0xbf, 0x5a, 0xfb, 0x11, 0x98, 0xc1, 0xb3, 0xf8, 0xfc, 0xfc, 0x5f, 0xda, 0x75, 0x5f, 0x36, 0x33, 0x9e,
+ 0x57, 0xdb, 0x8e, 0x67, 0xf3, 0x09, 0xe6, 0xa5, 0xf9, 0x0b, 0xfb, 0xb9, 0xff, 0xf3, 0x48, 0xa4, 0x4d, 0xe7, 0x9c, 0xbe,
+ 0xbf, 0x1e, 0xd9, 0xbb, 0x77, 0x96, 0xdb, 0xcf, 0x62, 0x6e, 0x7f, 0xf7, 0x2c, 0x9f, 0x33, 0xe8, 0xde, 0xdf, 0xc8, 0xe0,
+ 0xfd, 0x44, 0x8e, 0xad, 0x79, 0x9a, 0x7c, 0xf8, 0x3b, 0x1e, 0xce, 0xef, 0x43, 0xf1, 0xff, 0xe9, 0x72, 0xef, 0xcf, 0xd5,
+ 0xc9, 0x7a, 0xfb, 0xfd, 0xf1, 0xcf, 0x3b, 0xe3, 0xff, 0x78, 0x49, 0xfc, 0xf3, 0x7c, 0x0d, 0x2e, 0xfe, 0xdf, 0x77, 0x2e,
+ 0x77, 0x9f, 0xff, 0x7d, 0xfb, 0xaf, 0xd3, 0x96, 0xdf, 0x55, 0xaa, 0xca, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0xaf, 0x1c, 0xca, 0x50, 0x46, 0xa0, 0xe3, 0xff, 0x72, 0x97, 0xac, 0x73, 0x4d, 0x76, 0xf2,
+ 0xc6, 0xf7, 0x57, 0x53, 0xa5, 0x7d, 0x6c, 0x27, 0x17, 0x4b, 0x2e, 0xad, 0x00, 0xc9, 0xc8, 0x7e, 0x09, 0xfd, 0x52, 0x4a,
+ 0x29, 0x9b, 0x68, 0x25, 0x7f, 0x5b, 0x1a, 0x2b, 0x83, 0x7b, 0x59, 0x9f, 0x3e, 0x75, 0x9e, 0x57, 0x19, 0x57, 0xfa, 0xbf,
+ 0x26, 0x37, 0xac, 0x1e, 0xbc, 0xfa, 0x3d, 0x7a, 0x59, 0x58, 0x73, 0x69, 0xa5, 0x5b, 0xda, 0xb9, 0x5c, 0xfb, 0xeb, 0x29,
+ 0xd3, 0x5c, 0x4f, 0x99, 0xed, 0xd2, 0x5e, 0x45, 0x63, 0x2f, 0x5f, 0x6a, 0xb7, 0x8e, 0xdc, 0xcf, 0xf0, 0x9d, 0xed, 0x77,
+ 0xbe, 0xb2, 0x47, 0x41, 0xbe, 0xe8, 0x3c, 0x77, 0xeb, 0x86, 0xfe, 0xef, 0xcc, 0xed, 0xb1, 0xb3, 0x9b, 0xf9, 0xef, 0xca,
+ 0x55, 0xdf, 0xdb, 0x87, 0xe6, 0x8d, 0xab, 0x38, 0x77, 0xea, 0xf0, 0x6e, 0x1e, 0xb3, 0x6f, 0x58, 0xdf, 0x9b, 0x8f, 0xfe,
+ 0xae, 0xe7, 0xce, 0xf3, 0x3a, 0xcf, 0xe1, 0x1b, 0x7e, 0x6b, 0x25, 0xc3, 0x6b, 0xa7, 0xfd, 0xcf, 0xa5, 0xf2, 0xba, 0x92,
+ 0xdd, 0xb4, 0xb7, 0xeb, 0xd5, 0x67, 0x8e, 0x1e, 0x9b, 0xd9, 0xb6, 0x3a, 0xd9, 0xae, 0xcf, 0x77, 0xac, 0xaa, 0x1f, 0xd9,
+ 0x6d, 0xff, 0xbb, 0x7f, 0xed, 0xec, 0x43, 0xf4, 0x89, 0xf3, 0xdc, 0xdb, 0x1d, 0x2d, 0x8b, 0x51, 0xf7, 0x95, 0x32, 0xae,
+ 0x1d, 0xdb, 0xed, 0x25, 0xef, 0x8d, 0xff, 0xab, 0xed, 0xff, 0x51, 0xbe, 0xea, 0x77, 0x7a, 0xda, 0x6f, 0x3b, 0xba, 0x93,
+ 0x71, 0xf3, 0xa9, 0x23, 0x77, 0xc4, 0x7f, 0x4e, 0xb3, 0xf1, 0xe7, 0xd2, 0x2c, 0xc3, 0x4e, 0x66, 0xe7, 0xfa, 0xd1, 0x5c,
+ 0x2a, 0x8f, 0xf3, 0x36, 0xf4, 0xfb, 0xe2, 0x7f, 0xef, 0xbd, 0xd7, 0xf1, 0x5d, 0xcf, 0x50, 0x7b, 0xb4, 0xe7, 0xe1, 0xee,
+ 0x8b, 0xe1, 0xa3, 0xfd, 0xad, 0xf2, 0x9a, 0x28, 0xaf, 0xe5, 0x04, 0xbd, 0xbb, 0xfd, 0xbf, 0x96, 0xdd, 0xfc, 0x3d, 0x47,
+ 0xaf, 0xb5, 0x49, 0xef, 0x88, 0xff, 0xdc, 0x3a, 0x26, 0x4c, 0x69, 0xa6, 0xf5, 0x28, 0xee, 0x7d, 0x94, 0xd7, 0xb5, 0x0b,
+ 0xeb, 0x3d, 0x35, 0xae, 0xb4, 0x29, 0xb3, 0x11, 0xdb, 0x3b, 0xf2, 0xa6, 0xfe, 0xff, 0x2f, 0xc5, 0xff, 0x1d, 0x31, 0xfe,
+ 0x4c, 0xfc, 0xef, 0xf5, 0x00, 0xfa, 0xfb, 0x2d, 0x75, 0x6a, 0x86, 0x9d, 0xbd, 0x6d, 0x76, 0x8f, 0x76, 0x6b, 0x87, 0xfc,
+ 0xa1, 0x36, 0xec, 0xcd, 0xb4, 0x7e, 0x5b, 0xff, 0xff, 0xfc, 0xfe, 0x4f, 0xda, 0xf3, 0xcb, 0xef, 0x8b, 0xff, 0x7e, 0x0b,
+ 0x70, 0x4f, 0xfc, 0xe7, 0xc1, 0x79, 0xd2, 0xb4, 0x67, 0x3d, 0xd3, 0xb8, 0x6f, 0xfc, 0xc6, 0x71, 0x61, 0xe5, 0xec, 0x77,
+ 0xf6, 0xd0, 0xfc, 0xee, 0xf8, 0x5f, 0xcf, 0x2f, 0xfd, 0x4a, 0xff, 0x3f, 0x1b, 0xb3, 0xa0, 0xd3, 0xf1, 0xff, 0x3d, 0xf9,
+ 0x46, 0x33, 0x36, 0xee, 0xf8, 0xbe, 0x56, 0xa3, 0x1b, 0x57, 0x3b, 0xa3, 0x89, 0xeb, 0x73, 0xae, 0xcf, 0xec, 0x76, 0x92,
+ 0x57, 0x9d, 0xab, 0x3b, 0xee, 0x58, 0x7e, 0x66, 0xfe, 0xef, 0x5b, 0x22, 0x5f, 0xfc, 0xaf, 0xe6, 0xd0, 0xcf, 0xc7, 0xcf,
+ 0xb5, 0x23, 0x95, 0xe7, 0x0c, 0x3f, 0x17, 0xff, 0x9f, 0x9b, 0xe7, 0xb9, 0x67, 0x37, 0x93, 0xce, 0x33, 0x36, 0xc7, 0x2d,
+ 0xcf, 0xce, 0xbd, 0xef, 0x59, 0x8b, 0xe3, 0x0b, 0xe2, 0x7f, 0x66, 0x36, 0xb4, 0x53, 0x12, 0x59, 0xec, 0x8b, 0x9c, 0xe2,
+ 0x33, 0xd7, 0x77, 0xf5, 0xff, 0x67, 0x5b, 0xc5, 0x4f, 0x3e, 0xe7, 0xf1, 0xfc, 0x95, 0xde, 0x3d, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf6, 0xda, 0xba, 0x7a, 0xd6, 0xbd, 0x34, 0xd7, 0xef, 0xf6, 0xd7,
+ 0xa9, 0xd6, 0x77, 0x0d, 0xb8, 0xf2, 0x9e, 0x29, 0xaf, 0xbf, 0xa9, 0x7d, 0x52, 0xe5, 0x5b, 0xdf, 0x93, 0x75, 0xff, 0x58,
+ 0xe4, 0x18, 0xc8, 0xc8, 0x35, 0x91, 0x72, 0x4e, 0x87, 0xa3, 0x99, 0x95, 0x28, 0xe5, 0xab, 0x2e, 0x8d, 0xbf, 0xa7, 0xbc,
+ 0x32, 0xf3, 0x68, 0x7c, 0xef, 0x37, 0xaf, 0xb9, 0xef, 0x66, 0xf2, 0xec, 0xef, 0x50, 0x31, 0xbd, 0xea, 0x31, 0xcd, 0x3c,
+ 0xdc, 0x19, 0x5b, 0xef, 0x9a, 0x8d, 0x15, 0xcd, 0x9d, 0x48, 0xaf, 0xd4, 0xd7, 0x69, 0xc7, 0x46, 0xad, 0x3e, 0xcb, 0xe8,
+ 0x75, 0x3a, 0xb7, 0x43, 0x4c, 0x46, 0x33, 0x69, 0xbe, 0x79, 0x5d, 0x5e, 0x9a, 0xd9, 0x35, 0xf2, 0x05, 0xeb, 0x90, 0xb3,
+ 0xb1, 0x5b, 0x4a, 0x1a, 0x3b, 0x9d, 0x7c, 0x66, 0xa5, 0xf3, 0xde, 0x95, 0xf9, 0xce, 0x55, 0xa3, 0xd5, 0x7c, 0x6e, 0x4f,
+ 0x5d, 0x75, 0xbd, 0x9c, 0x1f, 0x19, 0x7f, 0xc7, 0x67, 0xe2, 0xbf, 0x93, 0x77, 0x37, 0xcb, 0x3e, 0xe5, 0xb3, 0xab, 0x9e,
+ 0xbb, 0xd9, 0xc6, 0xd2, 0xda, 0x6d, 0x60, 0xff, 0xef, 0x9f, 0xc8, 0xba, 0x73, 0x6f, 0xfb, 0x3f, 0xdf, 0xc7, 0xae, 0x66,
+ 0x38, 0xe8, 0x5d, 0xdd, 0xdd, 0x9d, 0x2e, 0xf2, 0x33, 0xf1, 0xbf, 0xce, 0xba, 0x98, 0x91, 0xd9, 0x84, 0x4f, 0x1c, 0x4b,
+ 0x73, 0xd7, 0xa7, 0x0c, 0x8d, 0x17, 0xd6, 0xb9, 0x2e, 0x9f, 0x88, 0xff, 0x9c, 0xf4, 0xce, 0xd3, 0xd8, 0xd9, 0x62, 0xea,
+ 0xef, 0x93, 0xb3, 0x15, 0xfd, 0x5d, 0x6b, 0xe6, 0xe2, 0x3f, 0xc3, 0x3b, 0xb0, 0xbd, 0x3d, 0xfe, 0xa7, 0x67, 0x00, 0xfa,
+ 0x31, 0x9e, 0xf6, 0x68, 0x6d, 0x62, 0x94, 0xdb, 0xf9, 0xfb, 0x73, 0x59, 0xf7, 0xcf, 0xf2, 0x2a, 0xa7, 0x75, 0x45, 0x64,
+ 0x60, 0x1e, 0x25, 0xed, 0x1e, 0xf6, 0xfd, 0xf1, 0xbf, 0xb3, 0xe7, 0x4f, 0xbe, 0x2e, 0xfe, 0x57, 0x35, 0x5a, 0x3d, 0xbf,
+ 0x6d, 0x5a, 0xb1, 0xda, 0x3b, 0x96, 0x8d, 0xd9, 0x9f, 0x2c, 0xb3, 0xe6, 0xdf, 0xd3, 0xfb, 0xaf, 0x7d, 0xdb, 0x99, 0xf8,
+ 0x9f, 0x89, 0xce, 0x4f, 0xc6, 0x7f, 0x36, 0xf6, 0x8e, 0x99, 0x6c, 0xdd, 0xd2, 0xcc, 0x14, 0x9a, 0x97, 0xce, 0xff, 0x75,
+ 0x46, 0x34, 0xf3, 0x7b, 0x75, 0xdc, 0x71, 0x6c, 0x6f, 0xe6, 0x2b, 0x37, 0x8e, 0x7d, 0x8f, 0x0f, 0xb4, 0xff, 0x13, 0x35,
+ 0xc3, 0x67, 0xdb, 0xff, 0x63, 0xf4, 0x7a, 0x5c, 0xff, 0xfa, 0x3c, 0xd0, 0xa3, 0x7c, 0x4b, 0xfc, 0xe7, 0x4b, 0xe3, 0xff,
+ 0xb8, 0xb0, 0xa3, 0xdc, 0x5b, 0x6b, 0x80, 0x3c, 0x3a, 0xfe, 0x7f, 0x57, 0xfc, 0xcf, 0xde, 0x01, 0xc9, 0xf2, 0x1e, 0x67,
+ 0x2d, 0xca, 0xd3, 0xb8, 0xd3, 0x98, 0xe2, 0x6e, 0x6a, 0xef, 0x79, 0xfe, 0x27, 0xcd, 0xd1, 0x49, 0x35, 0x1e, 0xef, 0x39,
+ 0x76, 0xcf, 0xac, 0x6b, 0xca, 0x73, 0x8a, 0x19, 0xb9, 0xce, 0x9f, 0xcc, 0xba, 0xbb, 0x1a, 0xc5, 0x3d, 0xff, 0xeb, 0x77,
+ 0xef, 0xa7, 0x66, 0xe8, 0xc8, 0xe4, 0xb3, 0x44, 0x6f, 0x79, 0x3a, 0x60, 0xfa, 0x1e, 0xda, 0x37, 0xe4, 0x21, 0xce, 0xcf,
+ 0x67, 0x4c, 0xbf, 0xef, 0xa9, 0x01, 0xee, 0xed, 0xe9, 0x7d, 0xcf, 0xb3, 0xc1, 0x88, 0x7e, 0xd6, 0xcf, 0xa8, 0xfc, 0xe6,
+ 0xef, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa6, 0xfd, 0xfb, 0x9f, 0x72, 0x00, 0xf1, 0x0f, 0xfc, 0x75, 0xf1, 0xff, 0x2f };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle lavandaFontRecs[189] = {
+ { 4, 4, 5 , 16 },
+ { 17, 4, 1 , 9 },
+ { 26, 4, 3 , 3 },
+ { 37, 4, 7 , 8 },
+ { 52, 4, 5 , 11 },
+ { 65, 4, 10 , 8 },
+ { 83, 4, 7 , 9 },
+ { 98, 4, 1 , 3 },
+ { 107, 4, 3 , 12 },
+ { 118, 4, 3 , 12 },
+ { 129, 4, 5 , 4 },
+ { 142, 4, 5 , 5 },
+ { 155, 4, 2 , 3 },
+ { 165, 4, 3 , 1 },
+ { 176, 4, 1 , 1 },
+ { 185, 4, 4 , 12 },
+ { 197, 4, 5 , 9 },
+ { 210, 4, 3 , 9 },
+ { 221, 4, 5 , 9 },
+ { 234, 4, 5 , 9 },
+ { 247, 4, 5 , 9 },
+ { 260, 4, 5 , 9 },
+ { 273, 4, 5 , 9 },
+ { 286, 4, 5 , 9 },
+ { 299, 4, 5 , 9 },
+ { 312, 4, 5 , 9 },
+ { 325, 4, 1 , 4 },
+ { 334, 4, 2 , 6 },
+ { 344, 4, 4 , 5 },
+ { 356, 4, 4 , 3 },
+ { 368, 4, 4 , 5 },
+ { 380, 4, 5 , 9 },
+ { 393, 4, 7 , 10 },
+ { 408, 4, 7 , 9 },
+ { 423, 4, 6 , 9 },
+ { 437, 4, 5 , 9 },
+ { 450, 4, 6 , 9 },
+ { 464, 4, 5 , 9 },
+ { 477, 4, 5 , 9 },
+ { 490, 4, 6 , 9 },
+ { 4, 28, 5 , 10 },
+ { 17, 28, 1 , 9 },
+ { 26, 28, 6 , 9 },
+ { 40, 28, 6 , 9 },
+ { 54, 28, 5 , 9 },
+ { 67, 28, 8 , 11 },
+ { 83, 28, 6 , 10 },
+ { 97, 28, 7 , 9 },
+ { 112, 28, 5 , 9 },
+ { 125, 28, 7 , 11 },
+ { 140, 28, 5 , 9 },
+ { 153, 28, 6 , 9 },
+ { 167, 28, 7 , 9 },
+ { 182, 28, 6 , 9 },
+ { 196, 28, 6 , 10 },
+ { 210, 28, 9 , 10 },
+ { 227, 28, 6 , 11 },
+ { 241, 28, 5 , 10 },
+ { 254, 28, 5 , 9 },
+ { 267, 28, 3 , 12 },
+ { 278, 28, 4 , 12 },
+ { 290, 28, 3 , 12 },
+ { 301, 28, 5 , 4 },
+ { 314, 28, 6 , 1 },
+ { 328, 28, 3 , 3 },
+ { 339, 28, 6 , 7 },
+ { 353, 28, 5 , 9 },
+ { 366, 28, 4 , 7 },
+ { 378, 28, 5 , 10 },
+ { 391, 28, 4 , 7 },
+ { 403, 28, 3 , 10 },
+ { 414, 28, 4 , 11 },
+ { 426, 28, 5 , 11 },
+ { 439, 28, 1 , 9 },
+ { 448, 28, 5 , 12 },
+ { 461, 28, 5 , 9 },
+ { 474, 28, 1 , 9 },
+ { 483, 28, 8 , 9 },
+ { 4, 52, 5 , 9 },
+ { 17, 52, 4 , 7 },
+ { 29, 52, 5 , 10 },
+ { 42, 52, 5 , 10 },
+ { 55, 52, 5 , 7 },
+ { 68, 52, 5 , 7 },
+ { 81, 52, 3 , 9 },
+ { 92, 52, 5 , 7 },
+ { 105, 52, 5 , 8 },
+ { 118, 52, 9 , 8 },
+ { 135, 52, 5 , 9 },
+ { 148, 52, 6 , 9 },
+ { 162, 52, 4 , 7 },
+ { 174, 52, 5 , 12 },
+ { 187, 52, 1 , 12 },
+ { 196, 52, 5 , 12 },
+ { 209, 52, 6 , 2 },
+ { 223, 52, 1 , 9 },
+ { 232, 52, 5 , 10 },
+ { 245, 52, 6 , 9 },
+ { 259, 52, 7 , 9 },
+ { 274, 52, 5 , 9 },
+ { 287, 52, 6 , 12 },
+ { 301, 52, 5 , 10 },
+ { 314, 52, 5 , 10 },
+ { 327, 52, 8 , 8 },
+ { 343, 52, 4 , 7 },
+ { 355, 52, 6 , 5 },
+ { 369, 52, 6 , 3 },
+ { 383, 52, 8 , 8 },
+ { 399, 52, 5 , 1 },
+ { 412, 52, 4 , 4 },
+ { 424, 52, 5 , 7 },
+ { 437, 52, 3 , 4 },
+ { 448, 52, 3 , 4 },
+ { 459, 52, 5 , 12 },
+ { 472, 52, 5 , 10 },
+ { 485, 52, 7 , 11 },
+ { 500, 52, 1 , 1 },
+ { 4, 76, 4 , 10 },
+ { 16, 76, 2 , 4 },
+ { 26, 76, 4 , 7 },
+ { 38, 76, 6 , 5 },
+ { 52, 76, 11 , 9 },
+ { 71, 76, 7 , 7 },
+ { 86, 76, 5 , 12 },
+ { 99, 76, 5 , 9 },
+ { 112, 76, 7 , 12 },
+ { 127, 76, 7 , 12 },
+ { 142, 76, 7 , 12 },
+ { 157, 76, 7 , 12 },
+ { 172, 76, 7 , 11 },
+ { 187, 76, 7 , 12 },
+ { 202, 76, 10 , 9 },
+ { 220, 76, 5 , 12 },
+ { 233, 76, 5 , 12 },
+ { 246, 76, 5 , 12 },
+ { 259, 76, 5 , 12 },
+ { 272, 76, 5 , 11 },
+ { 285, 76, 2 , 12 },
+ { 295, 76, 2 , 12 },
+ { 305, 76, 3 , 12 },
+ { 316, 76, 3 , 11 },
+ { 327, 76, 7 , 9 },
+ { 342, 76, 6 , 12 },
+ { 356, 76, 7 , 12 },
+ { 371, 76, 7 , 12 },
+ { 386, 76, 7 , 12 },
+ { 401, 76, 7 , 12 },
+ { 416, 76, 7 , 11 },
+ { 431, 76, 5 , 5 },
+ { 444, 76, 7 , 9 },
+ { 459, 76, 6 , 12 },
+ { 473, 76, 6 , 12 },
+ { 487, 76, 6 , 12 },
+ { 4, 100, 6 , 11 },
+ { 18, 100, 5 , 13 },
+ { 31, 100, 5 , 9 },
+ { 44, 100, 5 , 11 },
+ { 57, 100, 6 , 10 },
+ { 71, 100, 6 , 10 },
+ { 85, 100, 6 , 10 },
+ { 99, 100, 6 , 10 },
+ { 113, 100, 6 , 9 },
+ { 127, 100, 6 , 11 },
+ { 141, 100, 7 , 7 },
+ { 156, 100, 4 , 10 },
+ { 168, 100, 4 , 10 },
+ { 180, 100, 4 , 10 },
+ { 192, 100, 4 , 10 },
+ { 204, 100, 4 , 9 },
+ { 216, 100, 2 , 10 },
+ { 226, 100, 2 , 10 },
+ { 236, 100, 3 , 10 },
+ { 247, 100, 3 , 9 },
+ { 258, 100, 5 , 9 },
+ { 271, 100, 5 , 12 },
+ { 284, 100, 4 , 10 },
+ { 296, 100, 4 , 10 },
+ { 308, 100, 4 , 10 },
+ { 320, 100, 5 , 10 },
+ { 333, 100, 4 , 9 },
+ { 345, 100, 5 , 5 },
+ { 358, 100, 6 , 7 },
+ { 372, 100, 5 , 10 },
+ { 385, 100, 5 , 10 },
+ { 398, 100, 5 , 10 },
+ { 411, 100, 5 , 9 },
+ { 424, 100, 6 , 12 },
+ { 438, 100, 5 , 12 },
+ { 451, 100, 6 , 11 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo lavandaFontGlyphs[189] = {
+ { 32, 0, 12, 5, { 0 }},
+ { 33, 0, 3, 2, { 0 }},
+ { 34, 0, 3, 4, { 0 }},
+ { 35, 0, 3, 8, { 0 }},
+ { 36, 0, 2, 6, { 0 }},
+ { 37, 0, 4, 11, { 0 }},
+ { 38, 0, 3, 8, { 0 }},
+ { 39, 0, 3, 2, { 0 }},
+ { 40, 0, 2, 4, { 0 }},
+ { 41, 0, 2, 4, { 0 }},
+ { 42, 0, 3, 6, { 0 }},
+ { 43, 0, 5, 6, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 7, 4, { 0 }},
+ { 46, 0, 11, 2, { 0 }},
+ { 47, 0, 2, 5, { 0 }},
+ { 48, 0, 3, 6, { 0 }},
+ { 49, 0, 3, 4, { 0 }},
+ { 50, 0, 3, 6, { 0 }},
+ { 51, 0, 3, 6, { 0 }},
+ { 52, 0, 3, 6, { 0 }},
+ { 53, 0, 3, 6, { 0 }},
+ { 54, 0, 3, 6, { 0 }},
+ { 55, 0, 3, 6, { 0 }},
+ { 56, 0, 3, 6, { 0 }},
+ { 57, 0, 3, 6, { 0 }},
+ { 58, 0, 7, 2, { 0 }},
+ { 59, 0, 7, 3, { 0 }},
+ { 60, 0, 5, 5, { 0 }},
+ { 61, 0, 6, 5, { 0 }},
+ { 62, 0, 5, 5, { 0 }},
+ { 63, 0, 3, 6, { 0 }},
+ { 64, 0, 4, 8, { 0 }},
+ { 65, 0, 3, 8, { 0 }},
+ { 66, 0, 3, 7, { 0 }},
+ { 67, 0, 3, 6, { 0 }},
+ { 68, 0, 3, 7, { 0 }},
+ { 69, 0, 3, 6, { 0 }},
+ { 70, 0, 3, 6, { 0 }},
+ { 71, 0, 3, 7, { 0 }},
+ { 72, 0, 2, 6, { 0 }},
+ { 73, 0, 3, 2, { 0 }},
+ { 74, 0, 3, 7, { 0 }},
+ { 75, 0, 3, 7, { 0 }},
+ { 76, 0, 3, 6, { 0 }},
+ { 77, 0, 3, 9, { 0 }},
+ { 78, 0, 2, 7, { 0 }},
+ { 79, 0, 3, 8, { 0 }},
+ { 80, 0, 3, 6, { 0 }},
+ { 81, 0, 3, 8, { 0 }},
+ { 82, 0, 3, 6, { 0 }},
+ { 83, 0, 3, 7, { 0 }},
+ { 84, 0, 3, 8, { 0 }},
+ { 85, 0, 3, 7, { 0 }},
+ { 86, 0, 2, 7, { 0 }},
+ { 87, 0, 2, 10, { 0 }},
+ { 88, 0, 3, 7, { 0 }},
+ { 89, 0, 3, 6, { 0 }},
+ { 90, 0, 3, 6, { 0 }},
+ { 91, 0, 2, 4, { 0 }},
+ { 92, 0, 2, 5, { 0 }},
+ { 93, 0, 2, 4, { 0 }},
+ { 94, 0, 3, 6, { 0 }},
+ { 95, 0, 13, 7, { 0 }},
+ { 96, 0, 3, 4, { 0 }},
+ { 97, 0, 5, 7, { 0 }},
+ { 98, 0, 3, 6, { 0 }},
+ { 99, 0, 5, 5, { 0 }},
+ { 100, 0, 2, 6, { 0 }},
+ { 101, 0, 5, 5, { 0 }},
+ { 102, 0, 2, 4, { 0 }},
+ { 103, 0, 4, 5, { 0 }},
+ { 104, 0, 3, 6, { 0 }},
+ { 105, 0, 3, 2, { 0 }},
+ { 106, -1, 3, 5, { 0 }},
+ { 107, 0, 3, 6, { 0 }},
+ { 108, 0, 3, 2, { 0 }},
+ { 109, 0, 5, 9, { 0 }},
+ { 110, 0, 5, 6, { 0 }},
+ { 111, 0, 5, 5, { 0 }},
+ { 112, 0, 5, 6, { 0 }},
+ { 113, 0, 5, 6, { 0 }},
+ { 114, 0, 5, 6, { 0 }},
+ { 115, 0, 5, 6, { 0 }},
+ { 116, 0, 3, 4, { 0 }},
+ { 117, 0, 5, 6, { 0 }},
+ { 118, 0, 4, 6, { 0 }},
+ { 119, 0, 4, 10, { 0 }},
+ { 120, 0, 5, 6, { 0 }},
+ { 121, -1, 5, 6, { 0 }},
+ { 122, 0, 5, 5, { 0 }},
+ { 123, 0, 2, 6, { 0 }},
+ { 124, 0, 2, 2, { 0 }},
+ { 125, 0, 2, 6, { 0 }},
+ { 126, 0, 7, 7, { 0 }},
+ { 161, 0, 5, 2, { 0 }},
+ { 162, 0, 4, 6, { 0 }},
+ { 163, 0, 3, 7, { 0 }},
+ { 8364, 0, 3, 8, { 0 }},
+ { 165, 0, 3, 6, { 0 }},
+ { 352, 0, 0, 7, { 0 }},
+ { 167, 0, 3, 6, { 0 }},
+ { 353, 0, 2, 6, { 0 }},
+ { 169, 0, 4, 9, { 0 }},
+ { 170, 0, 3, 5, { 0 }},
+ { 171, 0, 6, 7, { 0 }},
+ { 172, 0, 6, 7, { 0 }},
+ { 174, 0, 4, 9, { 0 }},
+ { 175, 0, 2, 6, { 0 }},
+ { 176, 0, 3, 5, { 0 }},
+ { 177, 0, 5, 6, { 0 }},
+ { 178, 0, 3, 4, { 0 }},
+ { 179, 0, 3, 4, { 0 }},
+ { 381, 0, 0, 6, { 0 }},
+ { 181, 0, 5, 6, { 0 }},
+ { 182, 0, 3, 8, { 0 }},
+ { 183, 0, 7, 2, { 0 }},
+ { 382, 0, 2, 5, { 0 }},
+ { 185, 0, 3, 3, { 0 }},
+ { 186, 0, 3, 5, { 0 }},
+ { 187, 0, 6, 7, { 0 }},
+ { 338, 0, 3, 12, { 0 }},
+ { 339, 0, 5, 8, { 0 }},
+ { 376, 0, 1, 6, { 0 }},
+ { 191, 0, 5, 6, { 0 }},
+ { 192, 0, 0, 8, { 0 }},
+ { 193, 0, 0, 8, { 0 }},
+ { 194, 0, 0, 8, { 0 }},
+ { 195, 0, 0, 8, { 0 }},
+ { 196, 0, 1, 8, { 0 }},
+ { 197, 0, 0, 8, { 0 }},
+ { 198, 0, 3, 11, { 0 }},
+ { 199, 0, 3, 6, { 0 }},
+ { 200, 0, 0, 6, { 0 }},
+ { 201, 0, 0, 6, { 0 }},
+ { 202, 0, 0, 6, { 0 }},
+ { 203, 0, 1, 6, { 0 }},
+ { 204, -1, 0, 2, { 0 }},
+ { 205, 0, 0, 3, { 0 }},
+ { 206, -1, 0, 3, { 0 }},
+ { 207, -1, 1, 3, { 0 }},
+ { 208, -1, 3, 7, { 0 }},
+ { 209, 0, 0, 7, { 0 }},
+ { 210, 0, 0, 8, { 0 }},
+ { 211, 0, 0, 8, { 0 }},
+ { 212, 0, 0, 8, { 0 }},
+ { 213, 0, 0, 8, { 0 }},
+ { 214, 0, 1, 8, { 0 }},
+ { 215, 0, 5, 6, { 0 }},
+ { 216, 0, 3, 8, { 0 }},
+ { 217, 0, 0, 7, { 0 }},
+ { 218, 0, 0, 7, { 0 }},
+ { 219, 0, 0, 7, { 0 }},
+ { 220, 0, 1, 7, { 0 }},
+ { 221, 0, 0, 6, { 0 }},
+ { 222, 0, 3, 6, { 0 }},
+ { 223, 0, 3, 6, { 0 }},
+ { 224, 0, 2, 7, { 0 }},
+ { 225, 0, 2, 7, { 0 }},
+ { 226, 0, 2, 7, { 0 }},
+ { 227, 0, 2, 7, { 0 }},
+ { 228, 0, 3, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 5, 8, { 0 }},
+ { 231, 0, 5, 5, { 0 }},
+ { 232, 0, 2, 5, { 0 }},
+ { 233, 0, 2, 5, { 0 }},
+ { 234, 0, 2, 5, { 0 }},
+ { 235, 0, 3, 5, { 0 }},
+ { 236, -1, 2, 2, { 0 }},
+ { 237, 0, 2, 3, { 0 }},
+ { 238, -1, 2, 3, { 0 }},
+ { 239, -1, 3, 3, { 0 }},
+ { 240, 0, 3, 6, { 0 }},
+ { 241, 0, 2, 6, { 0 }},
+ { 242, 0, 2, 5, { 0 }},
+ { 243, 0, 2, 5, { 0 }},
+ { 244, 0, 2, 5, { 0 }},
+ { 245, 0, 2, 6, { 0 }},
+ { 246, 0, 3, 5, { 0 }},
+ { 247, 0, 5, 6, { 0 }},
+ { 248, -1, 5, 6, { 0 }},
+ { 249, 0, 2, 6, { 0 }},
+ { 250, 0, 2, 6, { 0 }},
+ { 251, 0, 2, 6, { 0 }},
+ { 252, 0, 3, 6, { 0 }},
+ { 253, -1, 2, 6, { 0 }},
+ { 254, 0, 3, 6, { 0 }},
+ { 255, -1, 3, 6, { 0 }},
+};
+
+// Style loading function: Lavanda
+static void GuiLoadStyleLavanda(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < LAVANDA_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(lavandaStyleProps[i].controlId, lavandaStyleProps[i].propertyId, lavandaStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int lavandaFontDataSize = 0;
+ unsigned char *data = DecompressData(lavandaFontData, LAVANDA_STYLE_FONT_ATLAS_COMP_SIZE, &lavandaFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, lavandaFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, lavandaFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/examples/styles/style_terminal.h b/external/raygui-4.0/examples/styles/style_terminal.h
new file mode 100644
index 0000000..f50d0c5
--- /dev/null
+++ b/external/raygui-4.0/examples/styles/style_terminal.h
@@ -0,0 +1,333 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v1.2 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleTerminal(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define TERMINAL_STYLE_PROPS_COUNT 16
+
+// Custom style name: terminal
+static const GuiStyleProp terminalStyleProps[TERMINAL_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x1c8d00ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x161313ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x38f620ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xc3fbc6ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x43bf2eff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xdcfadcff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x1f5b19ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x43ff28ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x1e6f15ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x223b22ff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x182c18ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x244125ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0xe6fce3ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x0c1505ff }, // DEFAULT_BACKGROUND_COLOR
+};
+
+// WARNING: This style uses a custom font: (size: 16, spacing: 0)
+
+#define TERMINAL_COMPRESSED_DATA_SIZE 964
+
+// Font image pixels data compressed (DEFLATE)
+// NOTE: Original pixel data simplified to GRAYSCALE
+static unsigned char terminalFontData[TERMINAL_COMPRESSED_DATA_SIZE] = { 0xed,
+ 0xdd, 0x41, 0xb6, 0x9b, 0x30, 0x0c, 0x05, 0x50, 0xf6, 0xbf, 0x69, 0x75, 0xd0, 0xd3, 0x41, 0x7b, 0x9a, 0x0f, 0x92, 0x65,
+ 0xc7, 0xc0, 0xed, 0x9d, 0xa5, 0x09, 0x9f, 0xf0, 0x02, 0x38, 0xb6, 0xec, 0xc4, 0x01, 0x00, 0xf0, 0x8f, 0xf8, 0xef, 0x23,
+ 0xf1, 0xf1, 0x99, 0x71, 0x79, 0x3b, 0xbf, 0x1f, 0x8d, 0x8f, 0x7f, 0xe5, 0xcf, 0xbf, 0x2b, 0x5b, 0xba, 0xfe, 0xac, 0x48,
+ 0xed, 0xdd, 0xd8, 0x5e, 0xd5, 0xb6, 0x93, 0x7d, 0xf6, 0xcf, 0xfb, 0x13, 0x1b, 0xe4, 0x7f, 0xfe, 0x6e, 0x33, 0xc7, 0x33,
+ 0xca, 0xe9, 0xe5, 0x3f, 0x9d, 0x33, 0xcf, 0xa1, 0xec, 0x3e, 0xd6, 0x8e, 0xc9, 0x1e, 0xf9, 0x67, 0xff, 0x46, 0x6e, 0xbf,
+ 0x63, 0x68, 0xcf, 0x6b, 0xe7, 0xf4, 0xd8, 0xde, 0xdd, 0x39, 0xff, 0xe3, 0xe3, 0x95, 0xbc, 0x7a, 0x1c, 0x57, 0xe5, 0x3f,
+ 0xfe, 0x2e, 0xe5, 0x7f, 0xf6, 0xcc, 0x7c, 0x96, 0x3f, 0xa7, 0x17, 0x37, 0xcf, 0x3f, 0xdb, 0xee, 0x79, 0x66, 0xfe, 0x9f,
+ 0xae, 0x0c, 0x3f, 0xdf, 0x93, 0x3f, 0xbf, 0x66, 0xe5, 0xdd, 0x7b, 0x4e, 0xfe, 0x67, 0xf7, 0xd1, 0xeb, 0xc7, 0x22, 0xdb,
+ 0x32, 0x5c, 0x9f, 0xff, 0x48, 0x8b, 0xec, 0xde, 0xf9, 0xc7, 0xc9, 0xb1, 0x8a, 0x81, 0xf6, 0xed, 0xe8, 0x35, 0x43, 0xfe,
+ 0xdf, 0xce, 0xff, 0xb8, 0x41, 0xfe, 0x47, 0x43, 0xfb, 0xaf, 0xf2, 0xce, 0x9e, 0x90, 0x7f, 0xed, 0xdd, 0xdd, 0x33, 0xff,
+ 0xea, 0xf7, 0xff, 0xcf, 0x7d, 0x1e, 0xf2, 0x7f, 0xd2, 0xf5, 0x3f, 0x4e, 0xae, 0x1d, 0x23, 0xed, 0x97, 0x3d, 0xf3, 0x8f,
+ 0x4b, 0x57, 0xcb, 0xf1, 0xde, 0xc2, 0xec, 0x35, 0xf7, 0x0d, 0x7d, 0xd4, 0xbb, 0xe7, 0xcf, 0x8a, 0x51, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd0, 0x83, 0x5e, 0xa9, 0x31, 0xef, 0xfd, 0x9f, 0x5c, 0xed, 0x5c, 0xbd, 0x9e, 0xfe, 0xea, 0x1e, 0xc6,
+ 0xf2, 0xa3, 0x32, 0x3b, 0x97, 0x39, 0x23, 0xc8, 0x99, 0xd1, 0xfb, 0xd1, 0xba, 0xc4, 0x98, 0x5e, 0x81, 0x1b, 0xd3, 0xde,
+ 0x61, 0xa5, 0x1e, 0x20, 0x16, 0x8d, 0xf9, 0xdf, 0x23, 0xff, 0x28, 0x8c, 0xa7, 0x77, 0xcc, 0x26, 0x91, 0xff, 0xd3, 0xce,
+ 0xff, 0xb3, 0x7d, 0xff, 0xfb, 0x13, 0x25, 0xff, 0x5d, 0xf2, 0x3f, 0xd2, 0xf7, 0xb5, 0x18, 0xaa, 0x1c, 0x78, 0x4f, 0xfe,
+ 0xf9, 0x16, 0xc8, 0x51, 0x9c, 0xf1, 0xd7, 0x51, 0x97, 0x3e, 0x7f, 0x6e, 0xce, 0x59, 0xfe, 0x95, 0xb6, 0x5c, 0x25, 0xff,
+ 0xb3, 0x5c, 0x72, 0xd5, 0xe5, 0xbd, 0x73, 0x15, 0xeb, 0xb3, 0x77, 0xf6, 0xad, 0xce, 0x7e, 0xce, 0xf5, 0xff, 0x5e, 0xf9,
+ 0xaf, 0xaf, 0xe1, 0x8a, 0x0b, 0x75, 0xac, 0xf2, 0xff, 0xde, 0xf9, 0x1f, 0x5f, 0xbc, 0x2a, 0xc8, 0x5f, 0xfe, 0x6f, 0xca,
+ 0xbf, 0xda, 0x62, 0x8b, 0xd6, 0xad, 0xed, 0x78, 0xff, 0xcf, 0xae, 0xaf, 0xb1, 0xae, 0xff, 0xef, 0x28, 0xf6, 0x86, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x86, 0xfa, 0xff, 0x7c, 0x15, 0x7e, 0xd7, 0xd8, 0x67, 0x6c, 0x31, 0xfb, 0x60, 0xc6,
+ 0x5c, 0x86, 0xea, 0x11, 0xea, 0xda, 0x62, 0x7e, 0x0d, 0xb5, 0x9e, 0x95, 0xf8, 0xf3, 0x5b, 0x99, 0x31, 0xce, 0x3e, 0x7b,
+ 0xd4, 0xbe, 0x52, 0xff, 0xb0, 0x32, 0xff, 0x4a, 0xad, 0x85, 0xfc, 0xe5, 0x2f, 0x7f, 0xf9, 0xcb, 0x7f, 0xaf, 0xfc, 0xcf,
+ 0xd7, 0x8b, 0x8f, 0xa1, 0x2a, 0xba, 0x5a, 0x9d, 0x51, 0x67, 0xed, 0xfb, 0x8a, 0x76, 0xcf, 0x48, 0x9d, 0x7d, 0x7c, 0x39,
+ 0xff, 0xb3, 0xd9, 0x6f, 0x63, 0x35, 0x94, 0xdf, 0x3e, 0xff, 0x77, 0x99, 0x67, 0x17, 0xc5, 0x33, 0xbd, 0x6b, 0xaf, 0x23,
+ 0x7d, 0xfe, 0x8f, 0x9f, 0xfb, 0xf2, 0xdf, 0x3f, 0xff, 0x91, 0x2a, 0x6c, 0xf9, 0xef, 0x93, 0xff, 0x59, 0xc2, 0xf2, 0x7f,
+ 0x7a, 0xfe, 0x9f, 0x7f, 0x87, 0xee, 0x2e, 0xf9, 0x77, 0x57, 0xc5, 0x57, 0xf3, 0xef, 0xac, 0x8c, 0xaf, 0xf6, 0xa2, 0x45,
+ 0x71, 0x3d, 0x82, 0x48, 0xf7, 0x83, 0x56, 0xf2, 0x37, 0x0f, 0x00, 0xf6, 0x9b, 0x79, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xab, 0x7a, 0xc5, 0x73, 0x95, 0x6f, 0x7d, 0xeb, 0x81, 0x1d, 0x93, 0x47, 0xf6, 0x6a, 0xe3, 0x98, 0xe3, 0xbf, 0x5e, 0x70,
+ 0xa4, 0x46, 0x54, 0x2b, 0x7b, 0xdd, 0xb9, 0xbe, 0x5a, 0xa4, 0x47, 0x4a, 0xb2, 0x35, 0x4a, 0xf9, 0xf1, 0x98, 0x9e, 0xd5,
+ 0xf0, 0x3a, 0xab, 0x15, 0xaa, 0x55, 0xa2, 0xfd, 0xc7, 0x20, 0xca, 0x75, 0x0c, 0x47, 0x53, 0x05, 0xc1, 0x8c, 0xb5, 0xbd,
+ 0xe5, 0x2f, 0xff, 0xae, 0x5f, 0x8f, 0x99, 0x51, 0x0d, 0xdc, 0x53, 0x8d, 0x12, 0x83, 0xd5, 0x37, 0xeb, 0xf2, 0xff, 0xce,
+ 0x0a, 0xde, 0xeb, 0x6a, 0xbe, 0xb2, 0x9f, 0xa6, 0x68, 0x4c, 0x50, 0xfe, 0xdf, 0xcf, 0xbf, 0x7a, 0x34, 0xde, 0x93, 0x7f,
+ 0x47, 0x6d, 0xf9, 0x93, 0xf2, 0x8f, 0x86, 0x99, 0xcf, 0x63, 0xf3, 0x66, 0xde, 0x90, 0xff, 0x8c, 0xfb, 0x6f, 0x4f, 0x6b,
+ 0xe2, 0x7d, 0xe7, 0x7f, 0x47, 0x75, 0xf1, 0xfc, 0x2b, 0xc3, 0x9c, 0xd7, 0xec, 0x98, 0xff, 0xfa, 0xaa, 0x48, 0xf9, 0xcf,
+ 0xbf, 0xfe, 0xef, 0x9c, 0x7f, 0xa5, 0x77, 0x68, 0xf5, 0x9d, 0xa1, 0xfb, 0x35, 0x33, 0xd7, 0x4f, 0x91, 0xbf, 0x0a, 0xf4,
+ 0x3b, 0xf4, 0xff, 0x77, 0x3e, 0x1f, 0x67, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x8d, 0xac, 0x75, 0xfe, 0x9e, 0x75,
+ 0xb6, 0xe2, 0x62, 0xe5, 0x3a, 0x8a, 0xb5, 0x15, 0xc0, 0xe2, 0x72, 0x7d, 0xcf, 0xde, 0xe3, 0x01, 0x6b, 0xd6, 0x4c, 0xae,
+ 0xae, 0xae, 0xf7, 0xdd, 0xfc, 0xb3, 0xa3, 0xa0, 0xd7, 0x1f, 0xdb, 0xef, 0xb7, 0xf0, 0x9f, 0x9e, 0x7f, 0xf7, 0x3a, 0xda,
+ 0xdd, 0x9f, 0x89, 0xa7, 0xe7, 0xff, 0xf3, 0x9d, 0x61, 0x45, 0xfe, 0xf5, 0x35, 0x3b, 0x8f, 0x87, 0x64, 0xfd, 0xbd, 0xfc,
+ 0xb3, 0x33, 0x7b, 0x76, 0x39, 0xff, 0xe7, 0xdc, 0x13, 0xe4, 0x7f, 0x97, 0xf6, 0xdf, 0x21, 0xff, 0xcd, 0xf2, 0xef, 0x5f,
+ 0x47, 0xbb, 0x3a, 0xb7, 0xec, 0x7a, 0x5b, 0xef, 0x4d, 0xdf, 0xff, 0x8e, 0x86, 0x79, 0xe0, 0xe7, 0x6b, 0x2f, 0x77, 0xaf,
+ 0xa3, 0x5c, 0xf9, 0xfe, 0xf7, 0xf4, 0x6a, 0xc9, 0x58, 0x52, 0xcf, 0xb6, 0xcf, 0xf1, 0x89, 0x29, 0xf3, 0xe6, 0xe5, 0xbf,
+ 0x7b, 0xfe, 0xb5, 0x6f, 0xe3, 0xcf, 0xcf, 0x7f, 0xe5, 0xd1, 0x7f, 0xc6, 0xd9, 0x21, 0xff, 0x77, 0xd7, 0x72, 0xcb, 0xff,
+ 0x5d, 0xd7, 0xad, 0xd1, 0xfe, 0x7f, 0xcc, 0xef, 0x40, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0d, 0x7e, 0x01 };
+
+// Font characters rectangles data
+static const Rectangle terminalFontRecs[95] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 1 , 11 },
+ { 25, 4, 3 , 3 },
+ { 36, 4, 6 , 11 },
+ { 50, 4, 5 , 11 },
+ { 63, 4, 5 , 11 },
+ { 76, 4, 5 , 11 },
+ { 89, 4, 1 , 2 },
+ { 98, 4, 2 , 13 },
+ { 108, 4, 2 , 13 },
+ { 118, 4, 3 , 3 },
+ { 129, 4, 5 , 5 },
+ { 142, 4, 1 , 3 },
+ { 151, 4, 5 , 1 },
+ { 164, 4, 1 , 1 },
+ { 173, 4, 6 , 12 },
+ { 187, 4, 5 , 11 },
+ { 200, 4, 2 , 11 },
+ { 210, 4, 5 , 11 },
+ { 223, 4, 5 , 11 },
+ { 236, 4, 5 , 11 },
+ { 4, 28, 5 , 11 },
+ { 17, 28, 5 , 11 },
+ { 30, 28, 5 , 11 },
+ { 43, 28, 5 , 11 },
+ { 56, 28, 5 , 11 },
+ { 69, 28, 1 , 8 },
+ { 78, 28, 1 , 10 },
+ { 87, 28, 4 , 5 },
+ { 99, 28, 5 , 3 },
+ { 112, 28, 4 , 5 },
+ { 124, 28, 5 , 11 },
+ { 137, 28, 11 , 11 },
+ { 156, 28, 5 , 11 },
+ { 169, 28, 5 , 11 },
+ { 182, 28, 5 , 11 },
+ { 195, 28, 5 , 11 },
+ { 208, 28, 5 , 11 },
+ { 221, 28, 5 , 11 },
+ { 234, 28, 5 , 11 },
+ { 4, 52, 5 , 11 },
+ { 17, 52, 1 , 11 },
+ { 26, 52, 5 , 11 },
+ { 39, 52, 5 , 11 },
+ { 52, 52, 5 , 11 },
+ { 65, 52, 7 , 11 },
+ { 80, 52, 5 , 11 },
+ { 93, 52, 5 , 11 },
+ { 106, 52, 5 , 11 },
+ { 119, 52, 5 , 13 },
+ { 132, 52, 5 , 11 },
+ { 145, 52, 5 , 11 },
+ { 158, 52, 5 , 11 },
+ { 171, 52, 5 , 11 },
+ { 184, 52, 5 , 11 },
+ { 197, 52, 7 , 11 },
+ { 212, 52, 5 , 11 },
+ { 225, 52, 5 , 11 },
+ { 238, 52, 5 , 11 },
+ { 4, 76, 2 , 13 },
+ { 14, 76, 6 , 12 },
+ { 28, 76, 2 , 13 },
+ { 38, 76, 5 , 4 },
+ { 51, 76, 5 , 1 },
+ { 64, 76, 2 , 2 },
+ { 74, 76, 5 , 8 },
+ { 87, 76, 5 , 11 },
+ { 100, 76, 5 , 8 },
+ { 113, 76, 5 , 11 },
+ { 126, 76, 5 , 8 },
+ { 139, 76, 4 , 11 },
+ { 151, 76, 5 , 10 },
+ { 164, 76, 5 , 11 },
+ { 177, 76, 1 , 11 },
+ { 186, 76, 1 , 13 },
+ { 195, 76, 5 , 11 },
+ { 208, 76, 1 , 11 },
+ { 217, 76, 7 , 8 },
+ { 232, 76, 5 , 8 },
+ { 4, 100, 5 , 8 },
+ { 17, 100, 5 , 10 },
+ { 30, 100, 5 , 10 },
+ { 43, 100, 4 , 8 },
+ { 55, 100, 5 , 8 },
+ { 68, 100, 3 , 11 },
+ { 79, 100, 5 , 8 },
+ { 92, 100, 5 , 8 },
+ { 105, 100, 7 , 8 },
+ { 120, 100, 5 , 8 },
+ { 133, 100, 5 , 10 },
+ { 146, 100, 5 , 8 },
+ { 159, 100, 3 , 13 },
+ { 170, 100, 1 , 15 },
+ { 179, 100, 3 , 13 },
+ { 190, 100, 5 , 3 },
+};
+
+// Font characters info data
+// NOTE: No chars.image data provided
+static const GlyphInfo terminalFontChars[95] = {
+ { 32, 0, 14, 4, { 0 }},
+ { 33, 1, 3, 3, { 0 }},
+ { 34, 1, 3, 5, { 0 }},
+ { 35, 1, 3, 8, { 0 }},
+ { 36, 1, 3, 7, { 0 }},
+ { 37, 1, 3, 7, { 0 }},
+ { 38, 1, 3, 7, { 0 }},
+ { 39, 1, 3, 3, { 0 }},
+ { 40, 1, 2, 4, { 0 }},
+ { 41, 1, 2, 4, { 0 }},
+ { 42, 1, 3, 5, { 0 }},
+ { 43, 1, 7, 7, { 0 }},
+ { 44, 1, 13, 3, { 0 }},
+ { 45, 1, 9, 7, { 0 }},
+ { 46, 1, 13, 3, { 0 }},
+ { 47, 1, 2, 8, { 0 }},
+ { 48, 1, 3, 7, { 0 }},
+ { 49, 1, 3, 4, { 0 }},
+ { 50, 1, 3, 7, { 0 }},
+ { 51, 1, 3, 7, { 0 }},
+ { 52, 1, 3, 7, { 0 }},
+ { 53, 1, 3, 7, { 0 }},
+ { 54, 1, 3, 7, { 0 }},
+ { 55, 1, 3, 7, { 0 }},
+ { 56, 1, 3, 7, { 0 }},
+ { 57, 1, 3, 7, { 0 }},
+ { 58, 1, 6, 3, { 0 }},
+ { 59, 1, 6, 3, { 0 }},
+ { 60, 1, 7, 6, { 0 }},
+ { 61, 1, 8, 7, { 0 }},
+ { 62, 1, 7, 6, { 0 }},
+ { 63, 1, 3, 7, { 0 }},
+ { 64, 2, 3, 15, { 0 }},
+ { 65, 1, 3, 7, { 0 }},
+ { 66, 1, 3, 7, { 0 }},
+ { 67, 1, 3, 7, { 0 }},
+ { 68, 1, 3, 7, { 0 }},
+ { 69, 1, 3, 7, { 0 }},
+ { 70, 1, 3, 7, { 0 }},
+ { 71, 1, 3, 7, { 0 }},
+ { 72, 1, 3, 7, { 0 }},
+ { 73, 1, 3, 3, { 0 }},
+ { 74, 1, 3, 7, { 0 }},
+ { 75, 1, 3, 7, { 0 }},
+ { 76, 1, 3, 7, { 0 }},
+ { 77, 1, 3, 9, { 0 }},
+ { 78, 1, 3, 7, { 0 }},
+ { 79, 1, 3, 7, { 0 }},
+ { 80, 1, 3, 7, { 0 }},
+ { 81, 1, 3, 7, { 0 }},
+ { 82, 1, 3, 7, { 0 }},
+ { 83, 1, 3, 7, { 0 }},
+ { 84, 1, 3, 7, { 0 }},
+ { 85, 1, 3, 7, { 0 }},
+ { 86, 1, 3, 7, { 0 }},
+ { 87, 1, 3, 9, { 0 }},
+ { 88, 1, 3, 7, { 0 }},
+ { 89, 1, 3, 7, { 0 }},
+ { 90, 1, 3, 7, { 0 }},
+ { 91, 1, 2, 4, { 0 }},
+ { 92, 1, 2, 8, { 0 }},
+ { 93, 1, 2, 4, { 0 }},
+ { 94, 1, 3, 7, { 0 }},
+ { 95, 1, 15, 7, { 0 }},
+ { 96, 1, 0, 4, { 0 }},
+ { 97, 1, 6, 7, { 0 }},
+ { 98, 1, 3, 7, { 0 }},
+ { 99, 1, 6, 7, { 0 }},
+ { 100, 1, 3, 7, { 0 }},
+ { 101, 1, 6, 7, { 0 }},
+ { 102, 1, 3, 6, { 0 }},
+ { 103, 1, 6, 7, { 0 }},
+ { 104, 1, 3, 7, { 0 }},
+ { 105, 1, 3, 3, { 0 }},
+ { 106, 1, 3, 3, { 0 }},
+ { 107, 1, 3, 7, { 0 }},
+ { 108, 1, 3, 3, { 0 }},
+ { 109, 1, 6, 9, { 0 }},
+ { 110, 1, 6, 7, { 0 }},
+ { 111, 1, 6, 7, { 0 }},
+ { 112, 1, 6, 7, { 0 }},
+ { 113, 1, 6, 7, { 0 }},
+ { 114, 1, 6, 6, { 0 }},
+ { 115, 1, 6, 7, { 0 }},
+ { 116, 1, 3, 5, { 0 }},
+ { 117, 1, 6, 7, { 0 }},
+ { 118, 1, 6, 7, { 0 }},
+ { 119, 1, 6, 9, { 0 }},
+ { 120, 1, 6, 7, { 0 }},
+ { 121, 1, 6, 7, { 0 }},
+ { 122, 1, 6, 7, { 0 }},
+ { 123, 1, 2, 5, { 0 }},
+ { 124, 1, 1, 3, { 0 }},
+ { 125, 1, 2, 5, { 0 }},
+ { 126, 1, 8, 7, { 0 }},
+};
+
+// Style loading function: terminal
+static void GuiLoadStyleTerminal(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < TERMINAL_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(terminalStyleProps[i].controlId, terminalStyleProps[i].propertyId, terminalStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int terminalFontDataSize = 0;
+ unsigned char *data = DecompressData(terminalFontData, TERMINAL_COMPRESSED_DATA_SIZE, &terminalFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 95;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)malloc(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, terminalFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)malloc(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, terminalFontChars, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // this way we make sure all gui can be drawn on a single pass because no texture change is required
+ // NOTE: Setting up this rectangle is a manual process (for the moment)
+ Rectangle whiteChar = { 63, 4, 2, 2 };
+ SetShapesTexture(font.texture, whiteChar);
+}
diff --git a/external/raygui-4.0/icons/raygui_icons.h b/external/raygui-4.0/icons/raygui_icons.h
new file mode 100644
index 0000000..e491101
--- /dev/null
+++ b/external/raygui-4.0/icons/raygui_icons.h
@@ -0,0 +1,547 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// raygui Icons exporter v1.1 - Icons data exported as a values array //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2019-2022 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+#define RAYGUI_ICON_SIZE 16 // Size of icons (squared)
+#define RAYGUI_ICON_MAX_ICONS 256 // Maximum number of icons
+#define RAYGUI_ICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id
+
+// Icons data is defined by bit array (every bit represents one pixel)
+// Those arrays are stored as unsigned int data arrays, so every array
+// element defines 32 pixels (bits) of information
+// Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels)
+#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32)
+
+//----------------------------------------------------------------------------------
+// Icons enumeration
+//----------------------------------------------------------------------------------
+typedef enum {
+ ICON_NONE = 0,
+ ICON_FOLDER_FILE_OPEN = 1,
+ ICON_FILE_SAVE_CLASSIC = 2,
+ ICON_FOLDER_OPEN = 3,
+ ICON_FOLDER_SAVE = 4,
+ ICON_FILE_OPEN = 5,
+ ICON_FILE_SAVE = 6,
+ ICON_FILE_EXPORT = 7,
+ ICON_FILE_ADD = 8,
+ ICON_FILE_DELETE = 9,
+ ICON_FILETYPE_TEXT = 10,
+ ICON_FILETYPE_AUDIO = 11,
+ ICON_FILETYPE_IMAGE = 12,
+ ICON_FILETYPE_PLAY = 13,
+ ICON_FILETYPE_VIDEO = 14,
+ ICON_FILETYPE_INFO = 15,
+ ICON_FILE_COPY = 16,
+ ICON_FILE_CUT = 17,
+ ICON_FILE_PASTE = 18,
+ ICON_CURSOR_HAND = 19,
+ ICON_CURSOR_POINTER = 20,
+ ICON_CURSOR_CLASSIC = 21,
+ ICON_PENCIL = 22,
+ ICON_PENCIL_BIG = 23,
+ ICON_BRUSH_CLASSIC = 24,
+ ICON_BRUSH_PAINTER = 25,
+ ICON_WATER_DROP = 26,
+ ICON_COLOR_PICKER = 27,
+ ICON_RUBBER = 28,
+ ICON_COLOR_BUCKET = 29,
+ ICON_TEXT_T = 30,
+ ICON_TEXT_A = 31,
+ ICON_SCALE = 32,
+ ICON_RESIZE = 33,
+ ICON_FILTER_POINT = 34,
+ ICON_FILTER_BILINEAR = 35,
+ ICON_CROP = 36,
+ ICON_CROP_ALPHA = 37,
+ ICON_SQUARE_TOGGLE = 38,
+ ICON_SYMMETRY = 39,
+ ICON_SYMMETRY_HORIZONTAL = 40,
+ ICON_SYMMETRY_VERTICAL = 41,
+ ICON_LENS = 42,
+ ICON_LENS_BIG = 43,
+ ICON_EYE_ON = 44,
+ ICON_EYE_OFF = 45,
+ ICON_FILTER_TOP = 46,
+ ICON_FILTER = 47,
+ ICON_TARGET_POINT = 48,
+ ICON_TARGET_SMALL = 49,
+ ICON_TARGET_BIG = 50,
+ ICON_TARGET_MOVE = 51,
+ ICON_CURSOR_MOVE = 52,
+ ICON_CURSOR_SCALE = 53,
+ ICON_CURSOR_SCALE_RIGHT = 54,
+ ICON_CURSOR_SCALE_LEFT = 55,
+ ICON_UNDO = 56,
+ ICON_REDO = 57,
+ ICON_REREDO = 58,
+ ICON_MUTATE = 59,
+ ICON_ROTATE = 60,
+ ICON_REPEAT = 61,
+ ICON_SHUFFLE = 62,
+ ICON_EMPTYBOX = 63,
+ ICON_TARGET = 64,
+ ICON_TARGET_SMALL_FILL = 65,
+ ICON_TARGET_BIG_FILL = 66,
+ ICON_TARGET_MOVE_FILL = 67,
+ ICON_CURSOR_MOVE_FILL = 68,
+ ICON_CURSOR_SCALE_FILL = 69,
+ ICON_CURSOR_SCALE_RIGHT_FILL = 70,
+ ICON_CURSOR_SCALE_LEFT_FILL = 71,
+ ICON_UNDO_FILL = 72,
+ ICON_REDO_FILL = 73,
+ ICON_REREDO_FILL = 74,
+ ICON_MUTATE_FILL = 75,
+ ICON_ROTATE_FILL = 76,
+ ICON_REPEAT_FILL = 77,
+ ICON_SHUFFLE_FILL = 78,
+ ICON_EMPTYBOX_SMALL = 79,
+ ICON_BOX = 80,
+ ICON_BOX_TOP = 81,
+ ICON_BOX_TOP_RIGHT = 82,
+ ICON_BOX_RIGHT = 83,
+ ICON_BOX_BOTTOM_RIGHT = 84,
+ ICON_BOX_BOTTOM = 85,
+ ICON_BOX_BOTTOM_LEFT = 86,
+ ICON_BOX_LEFT = 87,
+ ICON_BOX_TOP_LEFT = 88,
+ ICON_BOX_CENTER = 89,
+ ICON_BOX_CIRCLE_MASK = 90,
+ ICON_POT = 91,
+ ICON_ALPHA_MULTIPLY = 92,
+ ICON_ALPHA_CLEAR = 93,
+ ICON_DITHERING = 94,
+ ICON_MIPMAPS = 95,
+ ICON_BOX_GRID = 96,
+ ICON_GRID = 97,
+ ICON_BOX_CORNERS_SMALL = 98,
+ ICON_BOX_CORNERS_BIG = 99,
+ ICON_FOUR_BOXES = 100,
+ ICON_GRID_FILL = 101,
+ ICON_BOX_MULTISIZE = 102,
+ ICON_ZOOM_SMALL = 103,
+ ICON_ZOOM_MEDIUM = 104,
+ ICON_ZOOM_BIG = 105,
+ ICON_ZOOM_ALL = 106,
+ ICON_ZOOM_CENTER = 107,
+ ICON_BOX_DOTS_SMALL = 108,
+ ICON_BOX_DOTS_BIG = 109,
+ ICON_BOX_CONCENTRIC = 110,
+ ICON_BOX_GRID_BIG = 111,
+ ICON_OK_TICK = 112,
+ ICON_CROSS = 113,
+ ICON_ARROW_LEFT = 114,
+ ICON_ARROW_RIGHT = 115,
+ ICON_ARROW_DOWN = 116,
+ ICON_ARROW_UP = 117,
+ ICON_ARROW_LEFT_FILL = 118,
+ ICON_ARROW_RIGHT_FILL = 119,
+ ICON_ARROW_DOWN_FILL = 120,
+ ICON_ARROW_UP_FILL = 121,
+ ICON_AUDIO = 122,
+ ICON_FX = 123,
+ ICON_WAVE = 124,
+ ICON_WAVE_SINUS = 125,
+ ICON_WAVE_SQUARE = 126,
+ ICON_WAVE_TRIANGULAR = 127,
+ ICON_CROSS_SMALL = 128,
+ ICON_PLAYER_PREVIOUS = 129,
+ ICON_PLAYER_PLAY_BACK = 130,
+ ICON_PLAYER_PLAY = 131,
+ ICON_PLAYER_PAUSE = 132,
+ ICON_PLAYER_STOP = 133,
+ ICON_PLAYER_NEXT = 134,
+ ICON_PLAYER_RECORD = 135,
+ ICON_MAGNET = 136,
+ ICON_LOCK_CLOSE = 137,
+ ICON_LOCK_OPEN = 138,
+ ICON_CLOCK = 139,
+ ICON_TOOLS = 140,
+ ICON_GEAR = 141,
+ ICON_GEAR_BIG = 142,
+ ICON_BIN = 143,
+ ICON_HAND_POINTER = 144,
+ ICON_LASER = 145,
+ ICON_COIN = 146,
+ ICON_EXPLOSION = 147,
+ ICON_1UP = 148,
+ ICON_PLAYER = 149,
+ ICON_PLAYER_JUMP = 150,
+ ICON_KEY = 151,
+ ICON_DEMON = 152,
+ ICON_TEXT_POPUP = 153,
+ ICON_GEAR_EX = 154,
+ ICON_CRACK = 155,
+ ICON_CRACK_POINTS = 156,
+ ICON_STAR = 157,
+ ICON_DOOR = 158,
+ ICON_EXIT = 159,
+ ICON_MODE_2D = 160,
+ ICON_MODE_3D = 161,
+ ICON_CUBE = 162,
+ ICON_CUBE_FACE_TOP = 163,
+ ICON_CUBE_FACE_LEFT = 164,
+ ICON_CUBE_FACE_FRONT = 165,
+ ICON_CUBE_FACE_BOTTOM = 166,
+ ICON_CUBE_FACE_RIGHT = 167,
+ ICON_CUBE_FACE_BACK = 168,
+ ICON_CAMERA = 169,
+ ICON_SPECIAL = 170,
+ ICON_LINK_NET = 171,
+ ICON_LINK_BOXES = 172,
+ ICON_LINK_MULTI = 173,
+ ICON_LINK = 174,
+ ICON_LINK_BROKE = 175,
+ ICON_TEXT_NOTES = 176,
+ ICON_NOTEBOOK = 177,
+ ICON_SUITCASE = 178,
+ ICON_SUITCASE_ZIP = 179,
+ ICON_MAILBOX = 180,
+ ICON_MONITOR = 181,
+ ICON_PRINTER = 182,
+ ICON_PHOTO_CAMERA = 183,
+ ICON_PHOTO_CAMERA_FLASH = 184,
+ ICON_HOUSE = 185,
+ ICON_HEART = 186,
+ ICON_CORNER = 187,
+ ICON_VERTICAL_BARS = 188,
+ ICON_VERTICAL_BARS_FILL = 189,
+ ICON_LIFE_BARS = 190,
+ ICON_INFO = 191,
+ ICON_CROSSLINE = 192,
+ ICON_HELP = 193,
+ ICON_FILETYPE_ALPHA = 194,
+ ICON_FILETYPE_HOME = 195,
+ ICON_LAYERS_VISIBLE = 196,
+ ICON_LAYERS = 197,
+ ICON_WINDOW = 198,
+ ICON_HIDPI = 199,
+ ICON_FILETYPE_BINARY = 200,
+ ICON_HEX = 201,
+ ICON_SHIELD = 202,
+ ICON_FILE_NEW = 203,
+ ICON_FOLDER_ADD = 204,
+ ICON_ALARM = 205,
+ ICON_CPU = 206,
+ ICON_ROM = 207,
+ ICON_STEP_OVER = 208,
+ ICON_STEP_INTO = 209,
+ ICON_STEP_OUT = 210,
+ ICON_RESTART = 211,
+ ICON_BREAKPOINT_ON = 212,
+ ICON_BREAKPOINT_OFF = 213,
+ ICON_BURGER_MENU = 214,
+ ICON_CASE_SENSITIVE = 215,
+ ICON_REG_EXP = 216,
+ ICON_217 = 217,
+ ICON_218 = 218,
+ ICON_219 = 219,
+ ICON_220 = 220,
+ ICON_221 = 221,
+ ICON_222 = 222,
+ ICON_223 = 223,
+ ICON_224 = 224,
+ ICON_225 = 225,
+ ICON_226 = 226,
+ ICON_227 = 227,
+ ICON_228 = 228,
+ ICON_229 = 229,
+ ICON_230 = 230,
+ ICON_231 = 231,
+ ICON_232 = 232,
+ ICON_233 = 233,
+ ICON_234 = 234,
+ ICON_235 = 235,
+ ICON_236 = 236,
+ ICON_237 = 237,
+ ICON_238 = 238,
+ ICON_239 = 239,
+ ICON_240 = 240,
+ ICON_241 = 241,
+ ICON_242 = 242,
+ ICON_243 = 243,
+ ICON_244 = 244,
+ ICON_245 = 245,
+ ICON_246 = 246,
+ ICON_247 = 247,
+ ICON_248 = 248,
+ ICON_249 = 249,
+ ICON_250 = 250,
+ ICON_251 = 251,
+ ICON_252 = 252,
+ ICON_253 = 253,
+ ICON_254 = 254,
+ ICON_255 = 255,
+} guiIconName;
+
+//----------------------------------------------------------------------------------
+// Icons data
+//----------------------------------------------------------------------------------
+static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_NONE
+ 0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // ICON_FOLDER_FILE_OPEN
+ 0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // ICON_FILE_SAVE_CLASSIC
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // ICON_FOLDER_OPEN
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // ICON_FOLDER_SAVE
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // ICON_FILE_OPEN
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // ICON_FILE_SAVE
+ 0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // ICON_FILE_EXPORT
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // ICON_FILE_ADD
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // ICON_FILE_DELETE
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_FILETYPE_TEXT
+ 0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // ICON_FILETYPE_AUDIO
+ 0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // ICON_FILETYPE_IMAGE
+ 0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // ICON_FILETYPE_PLAY
+ 0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // ICON_FILETYPE_VIDEO
+ 0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // ICON_FILETYPE_INFO
+ 0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // ICON_FILE_COPY
+ 0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // ICON_FILE_CUT
+ 0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // ICON_FILE_PASTE
+ 0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_CURSOR_HAND
+ 0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // ICON_CURSOR_POINTER
+ 0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // ICON_CURSOR_CLASSIC
+ 0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // ICON_PENCIL
+ 0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // ICON_PENCIL_BIG
+ 0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // ICON_BRUSH_CLASSIC
+ 0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // ICON_BRUSH_PAINTER
+ 0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // ICON_WATER_DROP
+ 0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // ICON_COLOR_PICKER
+ 0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // ICON_RUBBER
+ 0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // ICON_COLOR_BUCKET
+ 0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // ICON_TEXT_T
+ 0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // ICON_TEXT_A
+ 0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // ICON_SCALE
+ 0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // ICON_RESIZE
+ 0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_POINT
+ 0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_BILINEAR
+ 0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // ICON_CROP
+ 0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // ICON_CROP_ALPHA
+ 0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // ICON_SQUARE_TOGGLE
+ 0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // ICON_SYMMETRY
+ 0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // ICON_SYMMETRY_HORIZONTAL
+ 0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // ICON_SYMMETRY_VERTICAL
+ 0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // ICON_LENS
+ 0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // ICON_LENS_BIG
+ 0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // ICON_EYE_ON
+ 0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // ICON_EYE_OFF
+ 0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // ICON_FILTER_TOP
+ 0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // ICON_FILTER
+ 0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_POINT
+ 0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL
+ 0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG
+ 0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // ICON_TARGET_MOVE
+ 0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // ICON_CURSOR_MOVE
+ 0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // ICON_CURSOR_SCALE
+ 0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // ICON_CURSOR_SCALE_RIGHT
+ 0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // ICON_CURSOR_SCALE_LEFT
+ 0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO
+ 0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // ICON_REREDO
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // ICON_MUTATE
+ 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // ICON_ROTATE
+ 0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // ICON_REPEAT
+ 0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // ICON_SHUFFLE
+ 0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // ICON_EMPTYBOX
+ 0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // ICON_TARGET
+ 0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL_FILL
+ 0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG_FILL
+ 0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // ICON_TARGET_MOVE_FILL
+ 0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // ICON_CURSOR_MOVE_FILL
+ 0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // ICON_CURSOR_SCALE_FILL
+ 0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // ICON_CURSOR_SCALE_RIGHT_FILL
+ 0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // ICON_CURSOR_SCALE_LEFT_FILL
+ 0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO_FILL
+ 0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO_FILL
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // ICON_REREDO_FILL
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // ICON_MUTATE_FILL
+ 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // ICON_ROTATE_FILL
+ 0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // ICON_REPEAT_FILL
+ 0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // ICON_SHUFFLE_FILL
+ 0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // ICON_EMPTYBOX_SMALL
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX
+ 0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP
+ 0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_RIGHT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_RIGHT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // ICON_BOX_BOTTOM_RIGHT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // ICON_BOX_BOTTOM
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // ICON_BOX_BOTTOM_LEFT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_LEFT
+ 0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_LEFT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_CENTER
+ 0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // ICON_BOX_CIRCLE_MASK
+ 0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // ICON_POT
+ 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // ICON_ALPHA_MULTIPLY
+ 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // ICON_ALPHA_CLEAR
+ 0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // ICON_DITHERING
+ 0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // ICON_MIPMAPS
+ 0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // ICON_BOX_GRID
+ 0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // ICON_GRID
+ 0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // ICON_BOX_CORNERS_SMALL
+ 0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // ICON_BOX_CORNERS_BIG
+ 0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // ICON_FOUR_BOXES
+ 0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // ICON_GRID_FILL
+ 0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // ICON_BOX_MULTISIZE
+ 0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_SMALL
+ 0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_MEDIUM
+ 0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // ICON_ZOOM_BIG
+ 0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // ICON_ZOOM_ALL
+ 0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // ICON_ZOOM_CENTER
+ 0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // ICON_BOX_DOTS_SMALL
+ 0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // ICON_BOX_DOTS_BIG
+ 0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // ICON_BOX_CONCENTRIC
+ 0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // ICON_BOX_GRID_BIG
+ 0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // ICON_OK_TICK
+ 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // ICON_CROSS
+ 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // ICON_ARROW_LEFT
+ 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // ICON_ARROW_RIGHT
+ 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // ICON_ARROW_DOWN
+ 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP
+ 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // ICON_ARROW_LEFT_FILL
+ 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // ICON_ARROW_RIGHT_FILL
+ 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // ICON_ARROW_DOWN_FILL
+ 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP_FILL
+ 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // ICON_AUDIO
+ 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // ICON_FX
+ 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // ICON_WAVE
+ 0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // ICON_WAVE_SINUS
+ 0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // ICON_WAVE_SQUARE
+ 0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // ICON_WAVE_TRIANGULAR
+ 0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // ICON_CROSS_SMALL
+ 0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // ICON_PLAYER_PREVIOUS
+ 0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // ICON_PLAYER_PLAY_BACK
+ 0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // ICON_PLAYER_PLAY
+ 0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // ICON_PLAYER_PAUSE
+ 0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // ICON_PLAYER_STOP
+ 0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // ICON_PLAYER_NEXT
+ 0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // ICON_PLAYER_RECORD
+ 0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // ICON_MAGNET
+ 0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_CLOSE
+ 0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_OPEN
+ 0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // ICON_CLOCK
+ 0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // ICON_TOOLS
+ 0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // ICON_GEAR
+ 0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // ICON_GEAR_BIG
+ 0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // ICON_BIN
+ 0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // ICON_HAND_POINTER
+ 0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // ICON_LASER
+ 0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // ICON_COIN
+ 0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // ICON_EXPLOSION
+ 0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // ICON_1UP
+ 0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // ICON_PLAYER
+ 0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // ICON_PLAYER_JUMP
+ 0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // ICON_KEY
+ 0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // ICON_DEMON
+ 0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // ICON_TEXT_POPUP
+ 0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // ICON_GEAR_EX
+ 0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK
+ 0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK_POINTS
+ 0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // ICON_STAR
+ 0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // ICON_DOOR
+ 0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // ICON_EXIT
+ 0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // ICON_MODE_2D
+ 0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // ICON_MODE_3D
+ 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE
+ 0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_TOP
+ 0x7fe00000, 0x50386030, 0x47fe483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // ICON_CUBE_FACE_LEFT
+ 0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // ICON_CUBE_FACE_FRONT
+ 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3ff27fe2, 0x0ffe1ffa, 0x000007fe, // ICON_CUBE_FACE_BOTTOM
+ 0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // ICON_CUBE_FACE_RIGHT
+ 0x7fe00000, 0x7fe87ff0, 0x7ffe7fe4, 0x7fe27fe2, 0x7fe27fe2, 0x24127fe2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_BACK
+ 0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // ICON_CAMERA
+ 0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // ICON_SPECIAL
+ 0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // ICON_LINK_NET
+ 0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // ICON_LINK_BOXES
+ 0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // ICON_LINK_MULTI
+ 0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // ICON_LINK
+ 0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // ICON_LINK_BROKE
+ 0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_TEXT_NOTES
+ 0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // ICON_NOTEBOOK
+ 0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // ICON_SUITCASE
+ 0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // ICON_SUITCASE_ZIP
+ 0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // ICON_MAILBOX
+ 0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // ICON_MONITOR
+ 0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // ICON_PRINTER
+ 0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA
+ 0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA_FLASH
+ 0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // ICON_HOUSE
+ 0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // ICON_HEART
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // ICON_CORNER
+ 0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // ICON_VERTICAL_BARS
+ 0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // ICON_VERTICAL_BARS_FILL
+ 0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // ICON_LIFE_BARS
+ 0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // ICON_INFO
+ 0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // ICON_CROSSLINE
+ 0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // ICON_HELP
+ 0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // ICON_FILETYPE_ALPHA
+ 0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // ICON_FILETYPE_HOME
+ 0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS_VISIBLE
+ 0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS
+ 0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_WINDOW
+ 0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // ICON_HIDPI
+ 0x3ff00000, 0x201c2010, 0x2a842e84, 0x2e842a84, 0x2ba42004, 0x2aa42aa4, 0x20042ba4, 0x00003ffc, // ICON_FILETYPE_BINARY
+ 0x00000000, 0x00000000, 0x00120012, 0x4a5e4bd2, 0x485233d2, 0x00004bd2, 0x00000000, 0x00000000, // ICON_HEX
+ 0x01800000, 0x381c0660, 0x23c42004, 0x23c42044, 0x13c82204, 0x08101008, 0x02400420, 0x00000180, // ICON_SHIELD
+ 0x007e0000, 0x20023fc2, 0x40227fe2, 0x400a403a, 0x400a400a, 0x400a400a, 0x4008400e, 0x00007ff8, // ICON_FILE_NEW
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x44024002, 0x5f024402, 0x44024402, 0x7ffe4002, 0x00000000, // ICON_FOLDER_ADD
+ 0x44220000, 0x12482244, 0xf3cf0000, 0x14280420, 0x48122424, 0x08100810, 0x1ff81008, 0x03c00420, // ICON_ALARM
+ 0x0aa00000, 0x1ff80aa0, 0x1068700e, 0x1008706e, 0x1008700e, 0x1008700e, 0x0aa01ff8, 0x00000aa0, // ICON_CPU
+ 0x07e00000, 0x04201db8, 0x04a01c38, 0x04a01d38, 0x04a01d38, 0x04a01d38, 0x04201d38, 0x000007e0, // ICON_ROM
+ 0x00000000, 0x03c00000, 0x3c382ff0, 0x3c04380c, 0x01800000, 0x03c003c0, 0x00000180, 0x00000000, // ICON_STEP_OVER
+ 0x01800000, 0x01800180, 0x01800180, 0x03c007e0, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_INTO
+ 0x01800000, 0x07e003c0, 0x01800180, 0x01800180, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_OUT
+ 0x00000000, 0x0ff003c0, 0x181c1c34, 0x303c301c, 0x30003000, 0x1c301800, 0x03c00ff0, 0x00000000, // ICON_RESTART
+ 0x00000000, 0x00000000, 0x07e003c0, 0x0ff00ff0, 0x0ff00ff0, 0x03c007e0, 0x00000000, 0x00000000, // ICON_BREAKPOINT_ON
+ 0x00000000, 0x00000000, 0x042003c0, 0x08100810, 0x08100810, 0x03c00420, 0x00000000, 0x00000000, // ICON_BREAKPOINT_OFF
+ 0x00000000, 0x00000000, 0x1ff81ff8, 0x1ff80000, 0x00001ff8, 0x1ff81ff8, 0x00000000, 0x00000000, // ICON_BURGER_MENU
+ 0x00000000, 0x00000000, 0x00880070, 0x0c880088, 0x1e8810f8, 0x3e881288, 0x00000000, 0x00000000, // ICON_CASE_SENSITIVE
+ 0x00000000, 0x02000000, 0x07000a80, 0x07001fc0, 0x02000a80, 0x00300030, 0x00000000, 0x00000000, // ICON_REG_EXP
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_217
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_218
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_219
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_220
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_221
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_222
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_223
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_224
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_225
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_226
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_227
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_228
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_229
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_230
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_231
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_232
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_233
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_234
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_235
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_236
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_237
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_238
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_239
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_240
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_241
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_242
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_243
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_244
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_245
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_246
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_247
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_248
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_249
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_250
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_251
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_252
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_253
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_254
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_255
+};
diff --git a/external/raygui-4.0/icons/raygui_icons.png b/external/raygui-4.0/icons/raygui_icons.png
new file mode 100644
index 0000000..bb555f7
Binary files /dev/null and b/external/raygui-4.0/icons/raygui_icons.png differ
diff --git a/external/raygui-4.0/icons/raygui_icons.rgi b/external/raygui-4.0/icons/raygui_icons.rgi
new file mode 100644
index 0000000..949dbea
Binary files /dev/null and b/external/raygui-4.0/icons/raygui_icons.rgi differ
diff --git a/external/raygui-4.0/images/raygui_controls_panel.png b/external/raygui-4.0/images/raygui_controls_panel.png
new file mode 100644
index 0000000..50dbc9c
Binary files /dev/null and b/external/raygui-4.0/images/raygui_controls_panel.png differ
diff --git a/external/raygui-4.0/images/raygui_ricons.png b/external/raygui-4.0/images/raygui_ricons.png
new file mode 100644
index 0000000..d269476
Binary files /dev/null and b/external/raygui-4.0/images/raygui_ricons.png differ
diff --git a/external/raygui-4.0/images/raygui_style_table_multi.png b/external/raygui-4.0/images/raygui_style_table_multi.png
new file mode 100644
index 0000000..ab41b5d
Binary files /dev/null and b/external/raygui-4.0/images/raygui_style_table_multi.png differ
diff --git a/external/raygui-4.0/images/rguiicons_v100.png b/external/raygui-4.0/images/rguiicons_v100.png
new file mode 100644
index 0000000..4d29b1e
Binary files /dev/null and b/external/raygui-4.0/images/rguiicons_v100.png differ
diff --git a/external/raygui-4.0/images/rguilayout_v220.png b/external/raygui-4.0/images/rguilayout_v220.png
new file mode 100644
index 0000000..2318fd0
Binary files /dev/null and b/external/raygui-4.0/images/rguilayout_v220.png differ
diff --git a/external/raygui-4.0/images/rguistyler_v210.png b/external/raygui-4.0/images/rguistyler_v210.png
new file mode 100644
index 0000000..abf4838
Binary files /dev/null and b/external/raygui-4.0/images/rguistyler_v210.png differ
diff --git a/external/raygui-4.0/images/rguistyler_v300.png b/external/raygui-4.0/images/rguistyler_v300.png
new file mode 100644
index 0000000..82bbcb0
Binary files /dev/null and b/external/raygui-4.0/images/rguistyler_v300.png differ
diff --git a/external/raygui-4.0/logo/raygui.ico b/external/raygui-4.0/logo/raygui.ico
new file mode 100644
index 0000000..cc8498b
Binary files /dev/null and b/external/raygui-4.0/logo/raygui.ico differ
diff --git a/external/raygui-4.0/logo/raygui_128x128.png b/external/raygui-4.0/logo/raygui_128x128.png
new file mode 100644
index 0000000..d22ea7d
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_128x128.png differ
diff --git a/external/raygui-4.0/logo/raygui_16x16.png b/external/raygui-4.0/logo/raygui_16x16.png
new file mode 100644
index 0000000..0e9c485
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_16x16.png differ
diff --git a/external/raygui-4.0/logo/raygui_24x24.png b/external/raygui-4.0/logo/raygui_24x24.png
new file mode 100644
index 0000000..4cea8e0
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_24x24.png differ
diff --git a/external/raygui-4.0/logo/raygui_256x256.png b/external/raygui-4.0/logo/raygui_256x256.png
new file mode 100644
index 0000000..75a76a0
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_256x256.png differ
diff --git a/external/raygui-4.0/logo/raygui_32x32.png b/external/raygui-4.0/logo/raygui_32x32.png
new file mode 100644
index 0000000..d56878a
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_32x32.png differ
diff --git a/external/raygui-4.0/logo/raygui_48x48.png b/external/raygui-4.0/logo/raygui_48x48.png
new file mode 100644
index 0000000..863e07f
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_48x48.png differ
diff --git a/external/raygui-4.0/logo/raygui_512x512.png b/external/raygui-4.0/logo/raygui_512x512.png
new file mode 100644
index 0000000..bde5703
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_512x512.png differ
diff --git a/external/raygui-4.0/logo/raygui_64x64.png b/external/raygui-4.0/logo/raygui_64x64.png
new file mode 100644
index 0000000..c72b09d
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_64x64.png differ
diff --git a/external/raygui-4.0/logo/raygui_96x96.png b/external/raygui-4.0/logo/raygui_96x96.png
new file mode 100644
index 0000000..d0098c7
Binary files /dev/null and b/external/raygui-4.0/logo/raygui_96x96.png differ
diff --git a/external/raygui-4.0/projects/CMake/CMakeLists.txt b/external/raygui-4.0/projects/CMake/CMakeLists.txt
new file mode 100644
index 0000000..56b4c6a
--- /dev/null
+++ b/external/raygui-4.0/projects/CMake/CMakeLists.txt
@@ -0,0 +1,75 @@
+cmake_minimum_required(VERSION 3.11)
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+
+project(raygui C)
+
+# Config options
+option(BUILD_RAYGUI_EXAMPLES "Build the examples." OFF)
+
+# Force building examples if building in the root as standalone.
+if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+ set(BUILD_RAYGUI_EXAMPLES TRUE)
+endif()
+
+# Directory Variables
+set(RAYGUI_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..)
+set(RAYGUI_SRC ${RAYGUI_ROOT}/src)
+set(RAYGUI_EXAMPLES ${RAYGUI_ROOT}/examples)
+
+# raygui
+add_library(raygui INTERFACE)
+file(GLOB sources ${RAYGUI_SRC}/*.h)
+set(RAYGUI_HEADERS ${sources})
+install(FILES
+ ${RAYGUI_HEADERS} DESTINATION include
+)
+target_include_directories(raygui INTERFACE ${RAYGUI_SRC})
+
+# Examples
+if(${BUILD_RAYGUI_EXAMPLES})
+ find_package(Raylib)
+
+ # Get the sources together
+ set(example_dirs
+ controls_test_suite
+ custom_file_dialog
+ custom_sliders
+ image_exporter
+ image_importer_raw
+ portable_window
+ property_list
+ scroll_panel
+ style_selector
+ )
+
+ set(example_sources)
+ set(example_resources)
+
+ foreach(example_dir ${example_dirs})
+ # Get the .c files
+ file(GLOB sources ${RAYGUI_EXAMPLES}/${example_dir}/*.c)
+ list(APPEND example_sources ${sources})
+
+ # Any any resources
+ file(GLOB resources ${RAYGUI_EXAMPLES}/${example_dir}/resources/*)
+ list(APPEND example_resources ${resources})
+ endforeach()
+
+ # Do each example
+ foreach(example_source ${example_sources})
+ # Create the basename for the example
+ get_filename_component(example_name ${example_source} NAME)
+ string(REPLACE ".c" "${OUTPUT_EXT}" example_name ${example_name})
+
+ # Setup the example
+ add_executable(${example_name} ${example_source})
+
+ target_link_libraries(${example_name} PUBLIC raylib raygui)
+
+ string(REGEX MATCH ".*/.*/" resources_dir ${example_source})
+ string(APPEND resources_dir "resources")
+ endforeach()
+
+ # Copy all of the resource files to the destination
+ file(COPY ${example_resources} DESTINATION "resources/")
+endif()
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/CMake/README.md b/external/raygui-4.0/projects/CMake/README.md
new file mode 100644
index 0000000..b384a8d
--- /dev/null
+++ b/external/raygui-4.0/projects/CMake/README.md
@@ -0,0 +1,13 @@
+# raygui CMake Definitions
+
+This provides CMake definition files for raygui.
+
+## Usage
+
+```
+cd projects/CMake
+mkdir build
+cd build
+cmake ..
+make
+```
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/CMake/cmake/FindRaylib.cmake b/external/raygui-4.0/projects/CMake/cmake/FindRaylib.cmake
new file mode 100644
index 0000000..c8c3a64
--- /dev/null
+++ b/external/raygui-4.0/projects/CMake/cmake/FindRaylib.cmake
@@ -0,0 +1,17 @@
+find_package(raylib 4.5.0 QUIET CONFIG)
+if (NOT raylib_FOUND)
+ include(FetchContent)
+ FetchContent_Declare(
+ raylib
+ GIT_REPOSITORY https://github.com/raysan5/raylib.git
+ GIT_TAG 4.5.0
+ )
+ FetchContent_GetProperties(raylib)
+ if (NOT raylib_POPULATED) # Have we downloaded raylib yet?
+ set(FETCHCONTENT_QUIET NO)
+ FetchContent_Populate(raylib)
+ set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
+ set(BUILD_GAMES OFF CACHE BOOL "" FORCE) # or games
+ add_subdirectory(${raylib_SOURCE_DIR} ${raylib_BINARY_DIR})
+ endif()
+endif()
diff --git a/external/raygui-4.0/projects/VS2022/examples/animation_curve.vcxproj b/external/raygui-4.0/projects/VS2022/examples/animation_curve.vcxproj
new file mode 100644
index 0000000..8e90f64
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/animation_curve.vcxproj
@@ -0,0 +1,363 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}
+ Win32Proj
+ style_selector
+ animation_curve
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/controls_test_suite.vcxproj b/external/raygui-4.0/projects/VS2022/examples/controls_test_suite.vcxproj
new file mode 100644
index 0000000..e9a5715
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/controls_test_suite.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}
+ Win32Proj
+ controls_test_suite
+ controls_test_suite
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/custom_file_dialog.vcxproj b/external/raygui-4.0/projects/VS2022/examples/custom_file_dialog.vcxproj
new file mode 100644
index 0000000..fcf7fe8
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/custom_file_dialog.vcxproj
@@ -0,0 +1,363 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}
+ Win32Proj
+ custom_file_dialog
+ custom_file_dialog
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/image_exporter.vcxproj b/external/raygui-4.0/projects/VS2022/examples/image_exporter.vcxproj
new file mode 100644
index 0000000..a1bc4db
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/image_exporter.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {67B2B88C-EA52-403F-A596-5107008C71F2}
+ Win32Proj
+ image_exporter
+ image_exporter
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/image_importer_raw.vcxproj b/external/raygui-4.0/projects/VS2022/examples/image_importer_raw.vcxproj
new file mode 100644
index 0000000..69f2a90
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/image_importer_raw.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}
+ Win32Proj
+ image_importer_raw
+ image_importer_raw
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/portable_window.vcxproj b/external/raygui-4.0/projects/VS2022/examples/portable_window.vcxproj
new file mode 100644
index 0000000..508ac84
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/portable_window.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}
+ Win32Proj
+ portable_window
+ portable_window
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/property_list.vcxproj b/external/raygui-4.0/projects/VS2022/examples/property_list.vcxproj
new file mode 100644
index 0000000..9bfa63f
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/property_list.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {D28301C9-C293-4F41-9F58-F2609F33134E}
+ Win32Proj
+ property_list
+ property_list
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/scroll_panel.vcxproj b/external/raygui-4.0/projects/VS2022/examples/scroll_panel.vcxproj
new file mode 100644
index 0000000..365d029
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/scroll_panel.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}
+ Win32Proj
+ scroll_panel
+ scroll_panel
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/style_selector.vcxproj b/external/raygui-4.0/projects/VS2022/examples/style_selector.vcxproj
new file mode 100644
index 0000000..90da635
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/style_selector.vcxproj
@@ -0,0 +1,360 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}
+ Win32Proj
+ style_selector
+ style_selector
+ 10.0
+
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+ Application
+ false
+ $(DefaultPlatformToolset)
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ true
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ false
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ /FS %(AdditionalOptions)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ CompileAsC
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+ Copy Debug DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions)
+ $(SolutionDir)..\..\src;$(SolutionDir)..\..\src\external;$(SolutionDir)..\..\..\raylib\src;%(AdditionalIncludeDirectories)
+ CompileAsC
+ true
+
+
+ Console
+ true
+ true
+ true
+ raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+ $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\
+
+
+ xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)"
+
+
+ Copy Release DLL to output directory
+
+
+
+
+ {e89d61ac-55de-4482-afd4-df7242ebc859}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/projects/VS2022/examples/test.props b/external/raygui-4.0/projects/VS2022/examples/test.props
new file mode 100644
index 0000000..e3a6e09
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/examples/test.props
@@ -0,0 +1,27 @@
+#
+# Property types:
+# b // Bool
+# i // Int
+# f // Float
+# t // Text
+# l // Select
+# g // Section (Group)
+# v2 // Vector 2D
+# v3 // Vector 3D
+# v4 // Vector 4D
+# r // Rectangle
+# c // Color
+#
+
+b Bool 0 1
+g #102#SECTION 0 2
+i Int 0 123 0 0 1
+f Float 0 0.990000 0.000000 0.000000 1.000000 3
+t Text 0 Hello! 30
+l Select 0 ONE;TWO;THREE;FOUR 0
+i Int Range 0 32 0 100 1
+r Rect 0 0 0 100 200
+v2 Vec2 0 20.000000 20.000000
+v3 Vec3 0 12.000000 13.000000 14.000000
+v4 Vec4 0 12.000000 13.000000 14.000000 15.000000
+c Color 0 0 255 0 255
diff --git a/external/raygui-4.0/projects/VS2022/raygui.sln b/external/raygui-4.0/projects/VS2022/raygui.sln
new file mode 100644
index 0000000..e6c7b56
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/raygui.sln
@@ -0,0 +1,218 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31912.275
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "controls_test_suite", "examples\controls_test_suite.vcxproj", "{0981CA98-E4A5-4DF1-987F-A41D09131EFC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "raylib", "raylib\raylib.vcxproj", "{E89D61AC-55DE-4482-AFD4-DF7242EBC859}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "custom_file_dialog", "examples\custom_file_dialog.vcxproj", "{E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "image_exporter", "examples\image_exporter.vcxproj", "{67B2B88C-EA52-403F-A596-5107008C71F2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "image_importer_raw", "examples\image_importer_raw.vcxproj", "{6628D753-270D-418D-A87F-6E2E63B9E3D0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portable_window", "examples\portable_window.vcxproj", "{FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "property_list", "examples\property_list.vcxproj", "{D28301C9-C293-4F41-9F58-F2609F33134E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scroll_panel", "examples\scroll_panel.vcxproj", "{56EE93DF-A3AF-4856-A4EC-E27358C6DA87}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "style_selector", "examples\style_selector.vcxproj", "{BCF5E746-FDBF-4CAC-9B95-44FE9A498430}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "animation_curve", "examples\animation_curve.vcxproj", "{50A98C3D-C898-4830-A00B-3F78DC2E742B}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug.DLL|x64 = Debug.DLL|x64
+ Debug.DLL|x86 = Debug.DLL|x86
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release.DLL|x64 = Release.DLL|x64
+ Release.DLL|x86 = Release.DLL|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug|x64.ActiveCfg = Debug|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug|x64.Build.0 = Debug|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug|x86.ActiveCfg = Debug|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Debug|x86.Build.0 = Debug|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release|x64.ActiveCfg = Release|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release|x64.Build.0 = Release|x64
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release|x86.ActiveCfg = Release|Win32
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC}.Release|x86.Build.0 = Release|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug|x64.ActiveCfg = Debug|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug|x64.Build.0 = Debug|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug|x86.ActiveCfg = Debug|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Debug|x86.Build.0 = Debug|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release|x64.ActiveCfg = Release|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release|x64.Build.0 = Release|x64
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release|x86.ActiveCfg = Release|Win32
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}.Release|x86.Build.0 = Release|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug|x64.ActiveCfg = Debug|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug|x64.Build.0 = Debug|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug|x86.ActiveCfg = Debug|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Debug|x86.Build.0 = Debug|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release|x64.ActiveCfg = Release|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release|x64.Build.0 = Release|x64
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release|x86.ActiveCfg = Release|Win32
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A}.Release|x86.Build.0 = Release|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug|x64.ActiveCfg = Debug|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug|x64.Build.0 = Debug|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug|x86.ActiveCfg = Debug|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Debug|x86.Build.0 = Debug|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release|x64.ActiveCfg = Release|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release|x64.Build.0 = Release|x64
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release|x86.ActiveCfg = Release|Win32
+ {67B2B88C-EA52-403F-A596-5107008C71F2}.Release|x86.Build.0 = Release|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug|x64.ActiveCfg = Debug|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug|x64.Build.0 = Debug|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug|x86.ActiveCfg = Debug|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Debug|x86.Build.0 = Debug|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release|x64.ActiveCfg = Release|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release|x64.Build.0 = Release|x64
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release|x86.ActiveCfg = Release|Win32
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0}.Release|x86.Build.0 = Release|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug|x64.ActiveCfg = Debug|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug|x64.Build.0 = Debug|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug|x86.ActiveCfg = Debug|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Debug|x86.Build.0 = Debug|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release|x64.ActiveCfg = Release|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release|x64.Build.0 = Release|x64
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release|x86.ActiveCfg = Release|Win32
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8}.Release|x86.Build.0 = Release|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug|x64.ActiveCfg = Debug|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug|x64.Build.0 = Debug|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug|x86.ActiveCfg = Debug|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Debug|x86.Build.0 = Debug|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release|x64.ActiveCfg = Release|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release|x64.Build.0 = Release|x64
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release|x86.ActiveCfg = Release|Win32
+ {D28301C9-C293-4F41-9F58-F2609F33134E}.Release|x86.Build.0 = Release|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug|x64.ActiveCfg = Debug|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug|x64.Build.0 = Debug|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug|x86.ActiveCfg = Debug|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Debug|x86.Build.0 = Debug|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release|x64.ActiveCfg = Release|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release|x64.Build.0 = Release|x64
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release|x86.ActiveCfg = Release|Win32
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87}.Release|x86.Build.0 = Release|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug|x64.ActiveCfg = Debug|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug|x64.Build.0 = Debug|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug|x86.ActiveCfg = Debug|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Debug|x86.Build.0 = Debug|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release|x64.ActiveCfg = Release|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release|x64.Build.0 = Release|x64
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release|x86.ActiveCfg = Release|Win32
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430}.Release|x86.Build.0 = Release|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug.DLL|x64.Build.0 = Debug.DLL|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug|x64.ActiveCfg = Debug|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug|x64.Build.0 = Debug|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug|x86.ActiveCfg = Debug|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Debug|x86.Build.0 = Debug|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release.DLL|x64.ActiveCfg = Release.DLL|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release.DLL|x64.Build.0 = Release.DLL|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release.DLL|x86.Build.0 = Release.DLL|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release|x64.ActiveCfg = Release|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release|x64.Build.0 = Release|x64
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release|x86.ActiveCfg = Release|Win32
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {0981CA98-E4A5-4DF1-987F-A41D09131EFC} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {E1CF5310-BCF6-4063-861D-EDFF65D9FE2A} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {67B2B88C-EA52-403F-A596-5107008C71F2} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {6628D753-270D-418D-A87F-6E2E63B9E3D0} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {FFDA97F5-4BAF-410A-AE87-0C8E3CB8C0D8} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {D28301C9-C293-4F41-9F58-F2609F33134E} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {56EE93DF-A3AF-4856-A4EC-E27358C6DA87} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {BCF5E746-FDBF-4CAC-9B95-44FE9A498430} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ {50A98C3D-C898-4830-A00B-3F78DC2E742B} = {5DC256E9-D698-4D07-8AD7-DFDAE9125DE3}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {E926C768-6307-4423-A1EC-57E95B1FAB29}
+ EndGlobalSection
+EndGlobal
diff --git a/external/raygui-4.0/projects/VS2022/raylib/raylib.vcxproj b/external/raygui-4.0/projects/VS2022/raylib/raylib.vcxproj
new file mode 100644
index 0000000..492eb1d
--- /dev/null
+++ b/external/raygui-4.0/projects/VS2022/raylib/raylib.vcxproj
@@ -0,0 +1,342 @@
+
+
+
+
+ Debug.DLL
+ Win32
+
+
+ Debug.DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release.DLL
+ Win32
+
+
+ Release.DLL
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {E89D61AC-55DE-4482-AFD4-DF7242EBC859}
+ Win32Proj
+ raylib
+ 10.0
+
+
+
+ StaticLibrary
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ StaticLibrary
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ DynamicLibrary
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ DynamicLibrary
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ StaticLibrary
+ false
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ StaticLibrary
+ false
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ DynamicLibrary
+ false
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ DynamicLibrary
+ false
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+
+
+ $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\
+ $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP
+ CompileAsC
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+
+
+ Windows
+
+
+ %(AdditionalLibraryDirectories)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP
+ CompileAsC
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+
+
+ Windows
+
+
+ %(AdditionalLibraryDirectories)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP;BUILD_LIBTYPE_SHARED
+ CompileAsC
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+ MultiThreadedDebug
+
+
+ Windows
+ kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ %(AdditionalLibraryDirectories)
+
+
+
+
+
+
+ Level3
+ Disabled
+ _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP;BUILD_LIBTYPE_SHARED
+ CompileAsC
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+ MultiThreadedDebug
+
+
+ Windows
+ kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+ %(AdditionalLibraryDirectories)
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+ CompileAsC
+ MultiThreaded
+
+
+ Windows
+ true
+ true
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+ CompileAsC
+
+ MultiThreaded
+
+
+ Windows
+ true
+ true
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP;BUILD_LIBTYPE_SHARED
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+ CompileAsC
+ MultiThreaded
+
+
+ Windows
+ true
+ true
+ kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);GRAPHICS_API_OPENGL_33;PLATFORM_DESKTOP;BUILD_LIBTYPE_SHARED
+ $(ProjectDir)..\..\..\..\raylib\src\external\glfw\include
+ CompileAsC
+ MultiThreaded
+
+
+
+ Windows
+ true
+ true
+ kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/raygui-4.0/src/raygui.h b/external/raygui-4.0/src/raygui.h
new file mode 100644
index 0000000..c1ea5df
--- /dev/null
+++ b/external/raygui-4.0/src/raygui.h
@@ -0,0 +1,5521 @@
+/*******************************************************************************************
+*
+* raygui v4.0 - A simple and easy-to-use immediate-mode gui library
+*
+* DESCRIPTION:
+* raygui is a tools-dev-focused immediate-mode-gui library based on raylib but also
+* available as a standalone library, as long as input and drawing functions are provided.
+*
+* FEATURES:
+* - Immediate-mode gui, minimal retained data
+* - +25 controls provided (basic and advanced)
+* - Styling system for colors, font and metrics
+* - Icons supported, embedded as a 1-bit icons pack
+* - Standalone mode option (custom input/graphics backend)
+* - Multiple support tools provided for raygui development
+*
+* POSSIBLE IMPROVEMENTS:
+* - Better standalone mode API for easy plug of custom backends
+* - Externalize required inputs, allow user easier customization
+*
+* LIMITATIONS:
+* - No editable multi-line word-wraped text box supported
+* - No auto-layout mechanism, up to the user to define controls position and size
+* - Standalone mode requires library modification and some user work to plug another backend
+*
+* NOTES:
+* - WARNING: GuiLoadStyle() and GuiLoadStyle{Custom}() functions, allocate memory for
+* font atlas recs and glyphs, freeing that memory is (usually) up to the user,
+* no unload function is explicitly provided... but note that GuiLoadStyleDefaulf() unloads
+* by default any previously loaded font (texture, recs, glyphs).
+* - Global UI alpha (guiAlpha) is applied inside GuiDrawRectangle() and GuiDrawText() functions
+*
+* CONTROLS PROVIDED:
+* # Container/separators Controls
+* - WindowBox --> StatusBar, Panel
+* - GroupBox --> Line
+* - Line
+* - Panel --> StatusBar
+* - ScrollPanel --> StatusBar
+* - TabBar --> Button
+*
+* # Basic Controls
+* - Label
+* - LabelButton --> Label
+* - Button
+* - Toggle
+* - ToggleGroup --> Toggle
+* - ToggleSlider
+* - CheckBox
+* - ComboBox
+* - DropdownBox
+* - TextBox
+* - ValueBox --> TextBox
+* - Spinner --> Button, ValueBox
+* - Slider
+* - SliderBar --> Slider
+* - ProgressBar
+* - StatusBar
+* - DummyRec
+* - Grid
+*
+* # Advance Controls
+* - ListView
+* - ColorPicker --> ColorPanel, ColorBarHue
+* - MessageBox --> Window, Label, Button
+* - TextInputBox --> Window, Label, TextBox, Button
+*
+* It also provides a set of functions for styling the controls based on its properties (size, color).
+*
+*
+* RAYGUI STYLE (guiStyle):
+* raygui uses a global data array for all gui style properties (allocated on data segment by default),
+* when a new style is loaded, it is loaded over the global style... but a default gui style could always be
+* recovered with GuiLoadStyleDefault() function, that overwrites the current style to the default one
+*
+* The global style array size is fixed and depends on the number of controls and properties:
+*
+* static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)];
+*
+* guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB
+*
+* Note that the first set of BASE properties (by default guiStyle[0..15]) belong to the generic style
+* used for all controls, when any of those base values is set, it is automatically populated to all
+* controls, so, specific control values overwriting generic style should be set after base values.
+*
+* After the first BASE set we have the EXTENDED properties (by default guiStyle[16..23]), those
+* properties are actually common to all controls and can not be overwritten individually (like BASE ones)
+* Some of those properties are: TEXT_SIZE, TEXT_SPACING, LINE_COLOR, BACKGROUND_COLOR
+*
+* Custom control properties can be defined using the EXTENDED properties for each independent control.
+*
+* TOOL: rGuiStyler is a visual tool to customize raygui style: github.com/raysan5/rguistyler
+*
+*
+* RAYGUI ICONS (guiIcons):
+* raygui could use a global array containing icons data (allocated on data segment by default),
+* a custom icons set could be loaded over this array using GuiLoadIcons(), but loaded icons set
+* must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS will be loaded
+*
+* Every icon is codified in binary form, using 1 bit per pixel, so, every 16x16 icon
+* requires 8 integers (16*16/32) to be stored in memory.
+*
+* When the icon is draw, actually one quad per pixel is drawn if the bit for that pixel is set.
+*
+* The global icons array size is fixed and depends on the number of icons and size:
+*
+* static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS];
+*
+* guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB
+*
+* TOOL: rGuiIcons is a visual tool to customize/create raygui icons: github.com/raysan5/rguiicons
+*
+* RAYGUI LAYOUT:
+* raygui currently does not provide an auto-layout mechanism like other libraries,
+* layouts must be defined manually on controls drawing, providing the right bounds Rectangle for it.
+*
+* TOOL: rGuiLayout is a visual tool to create raygui layouts: github.com/raysan5/rguilayout
+*
+* CONFIGURATION:
+* #define RAYGUI_IMPLEMENTATION
+* Generates the implementation of the library into the included file.
+* If not defined, the library is in header only mode and can be included in other headers
+* or source files without problems. But only ONE file should hold the implementation.
+*
+* #define RAYGUI_STANDALONE
+* Avoid raylib.h header inclusion in this file. Data types defined on raylib are defined
+* internally in the library and input management and drawing functions must be provided by
+* the user (check library implementation for further details).
+*
+* #define RAYGUI_NO_ICONS
+* Avoid including embedded ricons data (256 icons, 16x16 pixels, 1-bit per pixel, 2KB)
+*
+* #define RAYGUI_CUSTOM_ICONS
+* Includes custom ricons.h header defining a set of custom icons,
+* this file can be generated using rGuiIcons tool
+*
+* #define RAYGUI_DEBUG_RECS_BOUNDS
+* Draw control bounds rectangles for debug
+*
+* #define RAYGUI_DEBUG_TEXT_BOUNDS
+* Draw text bounds rectangles for debug
+*
+* VERSIONS HISTORY:
+* 4.0 (12-Sep-2023) ADDED: GuiToggleSlider()
+* ADDED: GuiColorPickerHSV() and GuiColorPanelHSV()
+* ADDED: Multiple new icons, mostly compiler related
+* ADDED: New DEFAULT properties: TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE
+* ADDED: New enum values: GuiTextAlignment, GuiTextAlignmentVertical, GuiTextWrapMode
+* ADDED: Support loading styles with custom font charset from external file
+* REDESIGNED: GuiTextBox(), support mouse cursor positioning
+* REDESIGNED: GuiDrawText(), support multiline and word-wrap modes (read only)
+* REDESIGNED: GuiProgressBar() to be more visual, progress affects border color
+* REDESIGNED: Global alpha consideration moved to GuiDrawRectangle() and GuiDrawText()
+* REDESIGNED: GuiScrollPanel(), get parameters by reference and return result value
+* REDESIGNED: GuiToggleGroup(), get parameters by reference and return result value
+* REDESIGNED: GuiComboBox(), get parameters by reference and return result value
+* REDESIGNED: GuiCheckBox(), get parameters by reference and return result value
+* REDESIGNED: GuiSlider(), get parameters by reference and return result value
+* REDESIGNED: GuiSliderBar(), get parameters by reference and return result value
+* REDESIGNED: GuiProgressBar(), get parameters by reference and return result value
+* REDESIGNED: GuiListView(), get parameters by reference and return result value
+* REDESIGNED: GuiColorPicker(), get parameters by reference and return result value
+* REDESIGNED: GuiColorPanel(), get parameters by reference and return result value
+* REDESIGNED: GuiColorBarAlpha(), get parameters by reference and return result value
+* REDESIGNED: GuiColorBarHue(), get parameters by reference and return result value
+* REDESIGNED: GuiGrid(), get parameters by reference and return result value
+* REDESIGNED: GuiGrid(), added extra parameter
+* REDESIGNED: GuiListViewEx(), change parameters order
+* REDESIGNED: All controls return result as int value
+* REVIEWED: GuiScrollPanel() to avoid smallish scroll-bars
+* REVIEWED: All examples and specially controls_test_suite
+* RENAMED: gui_file_dialog module to gui_window_file_dialog
+* UPDATED: All styles to include ISO-8859-15 charset (as much as possible)
+*
+* 3.6 (10-May-2023) ADDED: New icon: SAND_TIMER
+* ADDED: GuiLoadStyleFromMemory() (binary only)
+* REVIEWED: GuiScrollBar() horizontal movement key
+* REVIEWED: GuiTextBox() crash on cursor movement
+* REVIEWED: GuiTextBox(), additional inputs support
+* REVIEWED: GuiLabelButton(), avoid text cut
+* REVIEWED: GuiTextInputBox(), password input
+* REVIEWED: Local GetCodepointNext(), aligned with raylib
+* REDESIGNED: GuiSlider*()/GuiScrollBar() to support out-of-bounds
+*
+* 3.5 (20-Apr-2023) ADDED: GuiTabBar(), based on GuiToggle()
+* ADDED: Helper functions to split text in separate lines
+* ADDED: Multiple new icons, useful for code editing tools
+* REMOVED: Unneeded icon editing functions
+* REMOVED: GuiTextBoxMulti(), very limited and broken
+* REMOVED: MeasureTextEx() dependency, logic directly implemented
+* REMOVED: DrawTextEx() dependency, logic directly implemented
+* REVIEWED: GuiScrollBar(), improve mouse-click behaviour
+* REVIEWED: Library header info, more info, better organized
+* REDESIGNED: GuiTextBox() to support cursor movement
+* REDESIGNED: GuiDrawText() to divide drawing by lines
+*
+* 3.2 (22-May-2022) RENAMED: Some enum values, for unification, avoiding prefixes
+* REMOVED: GuiScrollBar(), only internal
+* REDESIGNED: GuiPanel() to support text parameter
+* REDESIGNED: GuiScrollPanel() to support text parameter
+* REDESIGNED: GuiColorPicker() to support text parameter
+* REDESIGNED: GuiColorPanel() to support text parameter
+* REDESIGNED: GuiColorBarAlpha() to support text parameter
+* REDESIGNED: GuiColorBarHue() to support text parameter
+* REDESIGNED: GuiTextInputBox() to support password
+*
+* 3.1 (12-Jan-2022) REVIEWED: Default style for consistency (aligned with rGuiLayout v2.5 tool)
+* REVIEWED: GuiLoadStyle() to support compressed font atlas image data and unload previous textures
+* REVIEWED: External icons usage logic
+* REVIEWED: GuiLine() for centered alignment when including text
+* RENAMED: Multiple controls properties definitions to prepend RAYGUI_
+* RENAMED: RICON_ references to RAYGUI_ICON_ for library consistency
+* Projects updated and multiple tweaks
+*
+* 3.0 (04-Nov-2021) Integrated ricons data to avoid external file
+* REDESIGNED: GuiTextBoxMulti()
+* REMOVED: GuiImageButton*()
+* Multiple minor tweaks and bugs corrected
+*
+* 2.9 (17-Mar-2021) REMOVED: Tooltip API
+* 2.8 (03-May-2020) Centralized rectangles drawing to GuiDrawRectangle()
+* 2.7 (20-Feb-2020) ADDED: Possible tooltips API
+* 2.6 (09-Sep-2019) ADDED: GuiTextInputBox()
+* REDESIGNED: GuiListView*(), GuiDropdownBox(), GuiSlider*(), GuiProgressBar(), GuiMessageBox()
+* REVIEWED: GuiTextBox(), GuiSpinner(), GuiValueBox(), GuiLoadStyle()
+* Replaced property INNER_PADDING by TEXT_PADDING, renamed some properties
+* ADDED: 8 new custom styles ready to use
+* Multiple minor tweaks and bugs corrected
+*
+* 2.5 (28-May-2019) Implemented extended GuiTextBox(), GuiValueBox(), GuiSpinner()
+* 2.3 (29-Apr-2019) ADDED: rIcons auxiliar library and support for it, multiple controls reviewed
+* Refactor all controls drawing mechanism to use control state
+* 2.2 (05-Feb-2019) ADDED: GuiScrollBar(), GuiScrollPanel(), reviewed GuiListView(), removed Gui*Ex() controls
+* 2.1 (26-Dec-2018) REDESIGNED: GuiCheckBox(), GuiComboBox(), GuiDropdownBox(), GuiToggleGroup() > Use combined text string
+* REDESIGNED: Style system (breaking change)
+* 2.0 (08-Nov-2018) ADDED: Support controls guiLock and custom fonts
+* REVIEWED: GuiComboBox(), GuiListView()...
+* 1.9 (09-Oct-2018) REVIEWED: GuiGrid(), GuiTextBox(), GuiTextBoxMulti(), GuiValueBox()...
+* 1.8 (01-May-2018) Lot of rework and redesign to align with rGuiStyler and rGuiLayout
+* 1.5 (21-Jun-2017) Working in an improved styles system
+* 1.4 (15-Jun-2017) Rewritten all GUI functions (removed useless ones)
+* 1.3 (12-Jun-2017) Complete redesign of style system
+* 1.1 (01-Jun-2017) Complete review of the library
+* 1.0 (07-Jun-2016) Converted to header-only by Ramon Santamaria.
+* 0.9 (07-Mar-2016) Reviewed and tested by Albert Martos, Ian Eito, Sergio Martinez and Ramon Santamaria.
+* 0.8 (27-Aug-2015) Initial release. Implemented by Kevin Gato, Daniel Nicolás and Ramon Santamaria.
+*
+* DEPENDENCIES:
+* raylib 4.6-dev Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing
+*
+* STANDALONE MODE:
+* By default raygui depends on raylib mostly for the inputs and the drawing functionality but that dependency can be disabled
+* with the config flag RAYGUI_STANDALONE. In that case is up to the user to provide another backend to cover library needs.
+*
+* The following functions should be redefined for a custom backend:
+*
+* - Vector2 GetMousePosition(void);
+* - float GetMouseWheelMove(void);
+* - bool IsMouseButtonDown(int button);
+* - bool IsMouseButtonPressed(int button);
+* - bool IsMouseButtonReleased(int button);
+* - bool IsKeyDown(int key);
+* - bool IsKeyPressed(int key);
+* - int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox()
+*
+* - void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle()
+* - void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker()
+*
+* - Font GetFontDefault(void); // -- GuiLoadStyleDefault()
+* - Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle()
+* - Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image
+* - void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization)
+* - char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data
+* - void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data
+* - const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs
+* - int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list
+* - void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list
+* - unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle()
+*
+* CONTRIBUTORS:
+* Ramon Santamaria: Supervision, review, redesign, update and maintenance
+* Vlad Adrian: Complete rewrite of GuiTextBox() to support extended features (2019)
+* Sergio Martinez: Review, testing (2015) and redesign of multiple controls (2018)
+* Adria Arranz: Testing and implementation of additional controls (2018)
+* Jordi Jorba: Testing and implementation of additional controls (2018)
+* Albert Martos: Review and testing of the library (2015)
+* Ian Eito: Review and testing of the library (2015)
+* Kevin Gato: Initial implementation of basic components (2014)
+* Daniel Nicolas: Initial implementation of basic components (2014)
+*
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2014-2023 Ramon Santamaria (@raysan5)
+*
+* 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 RAYGUI_H
+#define RAYGUI_H
+
+#define RAYGUI_VERSION_MAJOR 4
+#define RAYGUI_VERSION_MINOR 0
+#define RAYGUI_VERSION_PATCH 0
+#define RAYGUI_VERSION "4.0"
+
+#if !defined(RAYGUI_STANDALONE)
+ #include "raylib.h"
+#endif
+
+// Function specifiers in case library is build/used as a shared library (Windows)
+// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
+#if defined(_WIN32)
+ #if defined(BUILD_LIBTYPE_SHARED)
+ #define RAYGUIAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll)
+ #elif defined(USE_LIBTYPE_SHARED)
+ #define RAYGUIAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll)
+ #endif
+#endif
+
+// Function specifiers definition
+#ifndef RAYGUIAPI
+ #define RAYGUIAPI // Functions defined as 'extern' by default (implicit specifiers)
+#endif
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+// Allow custom memory allocators
+#ifndef RAYGUI_MALLOC
+ #define RAYGUI_MALLOC(sz) malloc(sz)
+#endif
+#ifndef RAYGUI_CALLOC
+ #define RAYGUI_CALLOC(n,sz) calloc(n,sz)
+#endif
+#ifndef RAYGUI_FREE
+ #define RAYGUI_FREE(p) free(p)
+#endif
+
+// Simple log system to avoid printf() calls if required
+// NOTE: Avoiding those calls, also avoids const strings memory usage
+#define RAYGUI_SUPPORT_LOG_INFO
+#if defined(RAYGUI_SUPPORT_LOG_INFO)
+ #define RAYGUI_LOG(...) printf(__VA_ARGS__)
+#else
+ #define RAYGUI_LOG(...)
+#endif
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+// NOTE: Some types are required for RAYGUI_STANDALONE usage
+//----------------------------------------------------------------------------------
+#if defined(RAYGUI_STANDALONE)
+ #ifndef __cplusplus
+ // Boolean type
+ #ifndef true
+ typedef enum { false, true } bool;
+ #endif
+ #endif
+
+ // Vector2 type
+ typedef struct Vector2 {
+ float x;
+ float y;
+ } Vector2;
+
+ // Vector3 type // -- ConvertHSVtoRGB(), ConvertRGBtoHSV()
+ typedef struct Vector3 {
+ float x;
+ float y;
+ float z;
+ } Vector3;
+
+ // 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 {
+ float x;
+ float y;
+ float width;
+ float height;
+ } Rectangle;
+
+ // TODO: Texture2D type is very coupled to raylib, required by Font type
+ // It should be redesigned to be provided by user
+ typedef struct Texture2D {
+ unsigned int id; // OpenGL texture id
+ int width; // Texture base width
+ int height; // Texture base height
+ int mipmaps; // Mipmap levels, 1 by default
+ int format; // Data format (PixelFormat type)
+ } Texture2D;
+
+ // Image, pixel data stored in CPU memory (RAM)
+ typedef struct Image {
+ void *data; // Image raw data
+ int width; // Image base width
+ int height; // Image base height
+ int mipmaps; // Mipmap levels, 1 by default
+ int format; // Data format (PixelFormat type)
+ } Image;
+
+ // GlyphInfo, font characters glyphs info
+ typedef struct GlyphInfo {
+ int value; // Character value (Unicode)
+ int offsetX; // Character offset X when drawing
+ int offsetY; // Character offset Y when drawing
+ int advanceX; // Character advance position X
+ Image image; // Character image data
+ } GlyphInfo;
+
+ // TODO: Font type is very coupled to raylib, mostly required by GuiLoadStyle()
+ // It should be redesigned to be provided by user
+ typedef struct Font {
+ int baseSize; // Base size (default chars height)
+ int glyphCount; // Number of glyph characters
+ int glyphPadding; // Padding around the glyph characters
+ Texture2D texture; // Texture atlas containing the glyphs
+ Rectangle *recs; // Rectangles in texture for the glyphs
+ GlyphInfo *glyphs; // Glyphs info data
+ } Font;
+#endif
+
+
+// Style property
+// NOTE: Used when exporting style as code for convenience
+typedef struct GuiStyleProp {
+ unsigned short controlId; // Control identifier
+ unsigned short propertyId; // Property identifier
+ int propertyValue; // Property value
+} GuiStyleProp;
+
+/*
+// Controls text style -NOT USED-
+// NOTE: Text style is defined by control
+typedef struct GuiTextStyle {
+ unsigned int size;
+ int charSpacing;
+ int lineSpacing;
+ int alignmentH;
+ int alignmentV;
+ int padding;
+} GuiTextStyle;
+*/
+
+// Gui control state
+typedef enum {
+ STATE_NORMAL = 0,
+ STATE_FOCUSED,
+ STATE_PRESSED,
+ STATE_DISABLED
+} GuiState;
+
+// Gui control text alignment
+typedef enum {
+ TEXT_ALIGN_LEFT = 0,
+ TEXT_ALIGN_CENTER,
+ TEXT_ALIGN_RIGHT
+} GuiTextAlignment;
+
+// Gui control text alignment vertical
+// NOTE: Text vertical position inside the text bounds
+typedef enum {
+ TEXT_ALIGN_TOP = 0,
+ TEXT_ALIGN_MIDDLE,
+ TEXT_ALIGN_BOTTOM
+} GuiTextAlignmentVertical;
+
+// Gui control text wrap mode
+// NOTE: Useful for multiline text
+typedef enum {
+ TEXT_WRAP_NONE = 0,
+ TEXT_WRAP_CHAR,
+ TEXT_WRAP_WORD
+} GuiTextWrapMode;
+
+// Gui controls
+typedef enum {
+ // Default -> populates to all controls when set
+ DEFAULT = 0,
+
+ // Basic controls
+ LABEL, // Used also for: LABELBUTTON
+ BUTTON,
+ TOGGLE, // Used also for: TOGGLEGROUP
+ SLIDER, // Used also for: SLIDERBAR, TOGGLESLIDER
+ PROGRESSBAR,
+ CHECKBOX,
+ COMBOBOX,
+ DROPDOWNBOX,
+ TEXTBOX, // Used also for: TEXTBOXMULTI
+ VALUEBOX,
+ SPINNER, // Uses: BUTTON, VALUEBOX
+ LISTVIEW,
+ COLORPICKER,
+ SCROLLBAR,
+ STATUSBAR
+} GuiControl;
+
+// Gui base properties for every control
+// NOTE: RAYGUI_MAX_PROPS_BASE properties (by default 16 properties)
+typedef enum {
+ BORDER_COLOR_NORMAL = 0, // Control border color in STATE_NORMAL
+ BASE_COLOR_NORMAL, // Control base color in STATE_NORMAL
+ TEXT_COLOR_NORMAL, // Control text color in STATE_NORMAL
+ BORDER_COLOR_FOCUSED, // Control border color in STATE_FOCUSED
+ BASE_COLOR_FOCUSED, // Control base color in STATE_FOCUSED
+ TEXT_COLOR_FOCUSED, // Control text color in STATE_FOCUSED
+ BORDER_COLOR_PRESSED, // Control border color in STATE_PRESSED
+ BASE_COLOR_PRESSED, // Control base color in STATE_PRESSED
+ TEXT_COLOR_PRESSED, // Control text color in STATE_PRESSED
+ BORDER_COLOR_DISABLED, // Control border color in STATE_DISABLED
+ BASE_COLOR_DISABLED, // Control base color in STATE_DISABLED
+ TEXT_COLOR_DISABLED, // Control text color in STATE_DISABLED
+ BORDER_WIDTH, // Control border size, 0 for no border
+ //TEXT_SIZE, // Control text size (glyphs max height) -> GLOBAL for all controls
+ //TEXT_SPACING, // Control text spacing between glyphs -> GLOBAL for all controls
+ //TEXT_LINE_SPACING // Control text spacing between lines -> GLOBAL for all controls
+ TEXT_PADDING, // Control text padding, not considering border
+ TEXT_ALIGNMENT, // Control text horizontal alignment inside control text bound (after border and padding)
+ //TEXT_WRAP_MODE // Control text wrap-mode inside text bounds -> GLOBAL for all controls
+} GuiControlProperty;
+
+// TODO: Which text styling properties should be global or per-control?
+// At this moment TEXT_PADDING and TEXT_ALIGNMENT is configured and saved per control while
+// TEXT_SIZE, TEXT_SPACING, TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE are global and
+// should be configured by user as needed while defining the UI layout
+
+
+// Gui extended properties depend on control
+// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default, max 8 properties)
+//----------------------------------------------------------------------------------
+// DEFAULT extended properties
+// NOTE: Those properties are common to all controls or global
+// WARNING: We only have 8 slots for those properties by default!!! -> New global control: TEXT?
+typedef enum {
+ TEXT_SIZE = 16, // Text size (glyphs max height)
+ TEXT_SPACING, // Text spacing between glyphs
+ LINE_COLOR, // Line control color
+ BACKGROUND_COLOR, // Background color
+ TEXT_LINE_SPACING, // Text spacing between lines
+ TEXT_ALIGNMENT_VERTICAL, // Text vertical alignment inside text bounds (after border and padding)
+ TEXT_WRAP_MODE // Text wrap-mode inside text bounds
+ //TEXT_DECORATION // Text decoration: 0-None, 1-Underline, 2-Line-through, 3-Overline
+ //TEXT_DECORATION_THICK // Text decoration line thikness
+} GuiDefaultProperty;
+
+// Other possible text properties:
+// TEXT_WEIGHT // Normal, Italic, Bold -> Requires specific font change
+// TEXT_INDENT // Text indentation -> Now using TEXT_PADDING...
+
+// Label
+//typedef enum { } GuiLabelProperty;
+
+// Button/Spinner
+//typedef enum { } GuiButtonProperty;
+
+// Toggle/ToggleGroup
+typedef enum {
+ GROUP_PADDING = 16, // ToggleGroup separation between toggles
+} GuiToggleProperty;
+
+// Slider/SliderBar
+typedef enum {
+ SLIDER_WIDTH = 16, // Slider size of internal bar
+ SLIDER_PADDING // Slider/SliderBar internal bar padding
+} GuiSliderProperty;
+
+// ProgressBar
+typedef enum {
+ PROGRESS_PADDING = 16, // ProgressBar internal padding
+} GuiProgressBarProperty;
+
+// ScrollBar
+typedef enum {
+ ARROWS_SIZE = 16, // ScrollBar arrows size
+ ARROWS_VISIBLE, // ScrollBar arrows visible
+ SCROLL_SLIDER_PADDING, // ScrollBar slider internal padding
+ SCROLL_SLIDER_SIZE, // ScrollBar slider size
+ SCROLL_PADDING, // ScrollBar scroll padding from arrows
+ SCROLL_SPEED, // ScrollBar scrolling speed
+} GuiScrollBarProperty;
+
+// CheckBox
+typedef enum {
+ CHECK_PADDING = 16 // CheckBox internal check padding
+} GuiCheckBoxProperty;
+
+// ComboBox
+typedef enum {
+ COMBO_BUTTON_WIDTH = 16, // ComboBox right button width
+ COMBO_BUTTON_SPACING // ComboBox button separation
+} GuiComboBoxProperty;
+
+// DropdownBox
+typedef enum {
+ ARROW_PADDING = 16, // DropdownBox arrow separation from border and items
+ DROPDOWN_ITEMS_SPACING // DropdownBox items separation
+} GuiDropdownBoxProperty;
+
+// TextBox/TextBoxMulti/ValueBox/Spinner
+typedef enum {
+ TEXT_READONLY = 16, // TextBox in read-only mode: 0-text editable, 1-text no-editable
+} GuiTextBoxProperty;
+
+// Spinner
+typedef enum {
+ SPIN_BUTTON_WIDTH = 16, // Spinner left/right buttons width
+ SPIN_BUTTON_SPACING, // Spinner buttons separation
+} GuiSpinnerProperty;
+
+// ListView
+typedef enum {
+ LIST_ITEMS_HEIGHT = 16, // ListView items height
+ LIST_ITEMS_SPACING, // ListView items separation
+ SCROLLBAR_WIDTH, // ListView scrollbar size (usually width)
+ SCROLLBAR_SIDE, // ListView scrollbar side (0-SCROLLBAR_LEFT_SIDE, 1-SCROLLBAR_RIGHT_SIDE)
+} GuiListViewProperty;
+
+// ColorPicker
+typedef enum {
+ COLOR_SELECTOR_SIZE = 16,
+ HUEBAR_WIDTH, // ColorPicker right hue bar width
+ HUEBAR_PADDING, // ColorPicker right hue bar separation from panel
+ HUEBAR_SELECTOR_HEIGHT, // ColorPicker right hue bar selector height
+ HUEBAR_SELECTOR_OVERFLOW // ColorPicker right hue bar selector overflow
+} GuiColorPickerProperty;
+
+#define SCROLLBAR_LEFT_SIDE 0
+#define SCROLLBAR_RIGHT_SIDE 1
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Module Functions Declaration
+//----------------------------------------------------------------------------------
+
+#if defined(__cplusplus)
+extern "C" { // Prevents name mangling of functions
+#endif
+
+// Global gui state control functions
+RAYGUIAPI void GuiEnable(void); // Enable gui controls (global state)
+RAYGUIAPI void GuiDisable(void); // Disable gui controls (global state)
+RAYGUIAPI void GuiLock(void); // Lock gui controls (global state)
+RAYGUIAPI void GuiUnlock(void); // Unlock gui controls (global state)
+RAYGUIAPI bool GuiIsLocked(void); // Check if gui is locked (global state)
+RAYGUIAPI void GuiSetAlpha(float alpha); // Set gui controls alpha (global state), alpha goes from 0.0f to 1.0f
+RAYGUIAPI void GuiSetState(int state); // Set gui state (global state)
+RAYGUIAPI int GuiGetState(void); // Get gui state (global state)
+
+// Font set/get functions
+RAYGUIAPI void GuiSetFont(Font font); // Set gui custom font (global state)
+RAYGUIAPI Font GuiGetFont(void); // Get gui custom font (global state)
+
+// Style set/get functions
+RAYGUIAPI void GuiSetStyle(int control, int property, int value); // Set one style property
+RAYGUIAPI int GuiGetStyle(int control, int property); // Get one style property
+
+// Styles loading functions
+RAYGUIAPI void GuiLoadStyle(const char *fileName); // Load style file over global style variable (.rgs)
+RAYGUIAPI void GuiLoadStyleDefault(void); // Load style default over global style
+
+// Tooltips management functions
+RAYGUIAPI void GuiEnableTooltip(void); // Enable gui tooltips (global state)
+RAYGUIAPI void GuiDisableTooltip(void); // Disable gui tooltips (global state)
+RAYGUIAPI void GuiSetTooltip(const char *tooltip); // Set tooltip string
+
+// Icons functionality
+RAYGUIAPI const char *GuiIconText(int iconId, const char *text); // Get text with icon id prepended (if supported)
+#if !defined(RAYGUI_NO_ICONS)
+RAYGUIAPI void GuiSetIconScale(int scale); // Set default icon drawing size
+RAYGUIAPI unsigned int *GuiGetIcons(void); // Get raygui icons data pointer
+RAYGUIAPI char **GuiLoadIcons(const char *fileName, bool loadIconsName); // Load raygui icons file (.rgi) into internal icons data
+RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); // Draw icon using pixel size at specified position
+#endif
+
+
+// Controls
+//----------------------------------------------------------------------------------------------------------
+// Container/separator controls, useful for controls organization
+RAYGUIAPI int GuiWindowBox(Rectangle bounds, const char *title); // Window Box control, shows a window that can be closed
+RAYGUIAPI int GuiGroupBox(Rectangle bounds, const char *text); // Group Box control with text name
+RAYGUIAPI int GuiLine(Rectangle bounds, const char *text); // Line separator control, could contain text
+RAYGUIAPI int GuiPanel(Rectangle bounds, const char *text); // Panel control, useful to group controls
+RAYGUIAPI int GuiTabBar(Rectangle bounds, const char **text, int count, int *active); // Tab Bar control, returns TAB to be closed or -1
+RAYGUIAPI int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view); // Scroll Panel control
+
+// Basic controls set
+RAYGUIAPI int GuiLabel(Rectangle bounds, const char *text); // Label control, shows text
+RAYGUIAPI int GuiButton(Rectangle bounds, const char *text); // Button control, returns true when clicked
+RAYGUIAPI int GuiLabelButton(Rectangle bounds, const char *text); // Label button control, show true when clicked
+RAYGUIAPI int GuiToggle(Rectangle bounds, const char *text, bool *active); // Toggle Button control, returns true when active
+RAYGUIAPI int GuiToggleGroup(Rectangle bounds, const char *text, int *active); // Toggle Group control, returns active toggle index
+RAYGUIAPI int GuiToggleSlider(Rectangle bounds, const char *text, int *active); // Toggle Slider control, returns true when clicked
+RAYGUIAPI int GuiCheckBox(Rectangle bounds, const char *text, bool *checked); // Check Box control, returns true when active
+RAYGUIAPI int GuiComboBox(Rectangle bounds, const char *text, int *active); // Combo Box control, returns selected item index
+
+RAYGUIAPI int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control, returns selected item
+RAYGUIAPI int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control, returns selected value
+RAYGUIAPI int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers
+RAYGUIAPI int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text
+
+RAYGUIAPI int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider control, returns selected value
+RAYGUIAPI int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control, returns selected value
+RAYGUIAPI int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Progress Bar control, shows current progress value
+RAYGUIAPI int GuiStatusBar(Rectangle bounds, const char *text); // Status Bar control, shows info text
+RAYGUIAPI int GuiDummyRec(Rectangle bounds, const char *text); // Dummy control for placeholders
+RAYGUIAPI int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell); // Grid control, returns mouse cell position
+
+// Advance controls set
+RAYGUIAPI int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active); // List View control, returns selected list item index
+RAYGUIAPI int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus); // List View with extended parameters
+RAYGUIAPI int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons); // Message Box control, displays a message
+RAYGUIAPI int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive); // Text Input Box control, ask for text, supports secret
+RAYGUIAPI int GuiColorPicker(Rectangle bounds, const char *text, Color *color); // Color Picker control (multiple color controls)
+RAYGUIAPI int GuiColorPanel(Rectangle bounds, const char *text, Color *color); // Color Panel control
+RAYGUIAPI int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha); // Color Bar Alpha control
+RAYGUIAPI int GuiColorBarHue(Rectangle bounds, const char *text, float *value); // Color Bar Hue control
+RAYGUIAPI int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Picker control that avoids conversion to RGB on each call (multiple color controls)
+RAYGUIAPI int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Panel control that returns HSV color value, used by GuiColorPickerHSV()
+//----------------------------------------------------------------------------------------------------------
+
+
+#if !defined(RAYGUI_NO_ICONS)
+
+#if !defined(RAYGUI_CUSTOM_ICONS)
+//----------------------------------------------------------------------------------
+// Icons enumeration
+//----------------------------------------------------------------------------------
+typedef enum {
+ ICON_NONE = 0,
+ ICON_FOLDER_FILE_OPEN = 1,
+ ICON_FILE_SAVE_CLASSIC = 2,
+ ICON_FOLDER_OPEN = 3,
+ ICON_FOLDER_SAVE = 4,
+ ICON_FILE_OPEN = 5,
+ ICON_FILE_SAVE = 6,
+ ICON_FILE_EXPORT = 7,
+ ICON_FILE_ADD = 8,
+ ICON_FILE_DELETE = 9,
+ ICON_FILETYPE_TEXT = 10,
+ ICON_FILETYPE_AUDIO = 11,
+ ICON_FILETYPE_IMAGE = 12,
+ ICON_FILETYPE_PLAY = 13,
+ ICON_FILETYPE_VIDEO = 14,
+ ICON_FILETYPE_INFO = 15,
+ ICON_FILE_COPY = 16,
+ ICON_FILE_CUT = 17,
+ ICON_FILE_PASTE = 18,
+ ICON_CURSOR_HAND = 19,
+ ICON_CURSOR_POINTER = 20,
+ ICON_CURSOR_CLASSIC = 21,
+ ICON_PENCIL = 22,
+ ICON_PENCIL_BIG = 23,
+ ICON_BRUSH_CLASSIC = 24,
+ ICON_BRUSH_PAINTER = 25,
+ ICON_WATER_DROP = 26,
+ ICON_COLOR_PICKER = 27,
+ ICON_RUBBER = 28,
+ ICON_COLOR_BUCKET = 29,
+ ICON_TEXT_T = 30,
+ ICON_TEXT_A = 31,
+ ICON_SCALE = 32,
+ ICON_RESIZE = 33,
+ ICON_FILTER_POINT = 34,
+ ICON_FILTER_BILINEAR = 35,
+ ICON_CROP = 36,
+ ICON_CROP_ALPHA = 37,
+ ICON_SQUARE_TOGGLE = 38,
+ ICON_SYMMETRY = 39,
+ ICON_SYMMETRY_HORIZONTAL = 40,
+ ICON_SYMMETRY_VERTICAL = 41,
+ ICON_LENS = 42,
+ ICON_LENS_BIG = 43,
+ ICON_EYE_ON = 44,
+ ICON_EYE_OFF = 45,
+ ICON_FILTER_TOP = 46,
+ ICON_FILTER = 47,
+ ICON_TARGET_POINT = 48,
+ ICON_TARGET_SMALL = 49,
+ ICON_TARGET_BIG = 50,
+ ICON_TARGET_MOVE = 51,
+ ICON_CURSOR_MOVE = 52,
+ ICON_CURSOR_SCALE = 53,
+ ICON_CURSOR_SCALE_RIGHT = 54,
+ ICON_CURSOR_SCALE_LEFT = 55,
+ ICON_UNDO = 56,
+ ICON_REDO = 57,
+ ICON_REREDO = 58,
+ ICON_MUTATE = 59,
+ ICON_ROTATE = 60,
+ ICON_REPEAT = 61,
+ ICON_SHUFFLE = 62,
+ ICON_EMPTYBOX = 63,
+ ICON_TARGET = 64,
+ ICON_TARGET_SMALL_FILL = 65,
+ ICON_TARGET_BIG_FILL = 66,
+ ICON_TARGET_MOVE_FILL = 67,
+ ICON_CURSOR_MOVE_FILL = 68,
+ ICON_CURSOR_SCALE_FILL = 69,
+ ICON_CURSOR_SCALE_RIGHT_FILL = 70,
+ ICON_CURSOR_SCALE_LEFT_FILL = 71,
+ ICON_UNDO_FILL = 72,
+ ICON_REDO_FILL = 73,
+ ICON_REREDO_FILL = 74,
+ ICON_MUTATE_FILL = 75,
+ ICON_ROTATE_FILL = 76,
+ ICON_REPEAT_FILL = 77,
+ ICON_SHUFFLE_FILL = 78,
+ ICON_EMPTYBOX_SMALL = 79,
+ ICON_BOX = 80,
+ ICON_BOX_TOP = 81,
+ ICON_BOX_TOP_RIGHT = 82,
+ ICON_BOX_RIGHT = 83,
+ ICON_BOX_BOTTOM_RIGHT = 84,
+ ICON_BOX_BOTTOM = 85,
+ ICON_BOX_BOTTOM_LEFT = 86,
+ ICON_BOX_LEFT = 87,
+ ICON_BOX_TOP_LEFT = 88,
+ ICON_BOX_CENTER = 89,
+ ICON_BOX_CIRCLE_MASK = 90,
+ ICON_POT = 91,
+ ICON_ALPHA_MULTIPLY = 92,
+ ICON_ALPHA_CLEAR = 93,
+ ICON_DITHERING = 94,
+ ICON_MIPMAPS = 95,
+ ICON_BOX_GRID = 96,
+ ICON_GRID = 97,
+ ICON_BOX_CORNERS_SMALL = 98,
+ ICON_BOX_CORNERS_BIG = 99,
+ ICON_FOUR_BOXES = 100,
+ ICON_GRID_FILL = 101,
+ ICON_BOX_MULTISIZE = 102,
+ ICON_ZOOM_SMALL = 103,
+ ICON_ZOOM_MEDIUM = 104,
+ ICON_ZOOM_BIG = 105,
+ ICON_ZOOM_ALL = 106,
+ ICON_ZOOM_CENTER = 107,
+ ICON_BOX_DOTS_SMALL = 108,
+ ICON_BOX_DOTS_BIG = 109,
+ ICON_BOX_CONCENTRIC = 110,
+ ICON_BOX_GRID_BIG = 111,
+ ICON_OK_TICK = 112,
+ ICON_CROSS = 113,
+ ICON_ARROW_LEFT = 114,
+ ICON_ARROW_RIGHT = 115,
+ ICON_ARROW_DOWN = 116,
+ ICON_ARROW_UP = 117,
+ ICON_ARROW_LEFT_FILL = 118,
+ ICON_ARROW_RIGHT_FILL = 119,
+ ICON_ARROW_DOWN_FILL = 120,
+ ICON_ARROW_UP_FILL = 121,
+ ICON_AUDIO = 122,
+ ICON_FX = 123,
+ ICON_WAVE = 124,
+ ICON_WAVE_SINUS = 125,
+ ICON_WAVE_SQUARE = 126,
+ ICON_WAVE_TRIANGULAR = 127,
+ ICON_CROSS_SMALL = 128,
+ ICON_PLAYER_PREVIOUS = 129,
+ ICON_PLAYER_PLAY_BACK = 130,
+ ICON_PLAYER_PLAY = 131,
+ ICON_PLAYER_PAUSE = 132,
+ ICON_PLAYER_STOP = 133,
+ ICON_PLAYER_NEXT = 134,
+ ICON_PLAYER_RECORD = 135,
+ ICON_MAGNET = 136,
+ ICON_LOCK_CLOSE = 137,
+ ICON_LOCK_OPEN = 138,
+ ICON_CLOCK = 139,
+ ICON_TOOLS = 140,
+ ICON_GEAR = 141,
+ ICON_GEAR_BIG = 142,
+ ICON_BIN = 143,
+ ICON_HAND_POINTER = 144,
+ ICON_LASER = 145,
+ ICON_COIN = 146,
+ ICON_EXPLOSION = 147,
+ ICON_1UP = 148,
+ ICON_PLAYER = 149,
+ ICON_PLAYER_JUMP = 150,
+ ICON_KEY = 151,
+ ICON_DEMON = 152,
+ ICON_TEXT_POPUP = 153,
+ ICON_GEAR_EX = 154,
+ ICON_CRACK = 155,
+ ICON_CRACK_POINTS = 156,
+ ICON_STAR = 157,
+ ICON_DOOR = 158,
+ ICON_EXIT = 159,
+ ICON_MODE_2D = 160,
+ ICON_MODE_3D = 161,
+ ICON_CUBE = 162,
+ ICON_CUBE_FACE_TOP = 163,
+ ICON_CUBE_FACE_LEFT = 164,
+ ICON_CUBE_FACE_FRONT = 165,
+ ICON_CUBE_FACE_BOTTOM = 166,
+ ICON_CUBE_FACE_RIGHT = 167,
+ ICON_CUBE_FACE_BACK = 168,
+ ICON_CAMERA = 169,
+ ICON_SPECIAL = 170,
+ ICON_LINK_NET = 171,
+ ICON_LINK_BOXES = 172,
+ ICON_LINK_MULTI = 173,
+ ICON_LINK = 174,
+ ICON_LINK_BROKE = 175,
+ ICON_TEXT_NOTES = 176,
+ ICON_NOTEBOOK = 177,
+ ICON_SUITCASE = 178,
+ ICON_SUITCASE_ZIP = 179,
+ ICON_MAILBOX = 180,
+ ICON_MONITOR = 181,
+ ICON_PRINTER = 182,
+ ICON_PHOTO_CAMERA = 183,
+ ICON_PHOTO_CAMERA_FLASH = 184,
+ ICON_HOUSE = 185,
+ ICON_HEART = 186,
+ ICON_CORNER = 187,
+ ICON_VERTICAL_BARS = 188,
+ ICON_VERTICAL_BARS_FILL = 189,
+ ICON_LIFE_BARS = 190,
+ ICON_INFO = 191,
+ ICON_CROSSLINE = 192,
+ ICON_HELP = 193,
+ ICON_FILETYPE_ALPHA = 194,
+ ICON_FILETYPE_HOME = 195,
+ ICON_LAYERS_VISIBLE = 196,
+ ICON_LAYERS = 197,
+ ICON_WINDOW = 198,
+ ICON_HIDPI = 199,
+ ICON_FILETYPE_BINARY = 200,
+ ICON_HEX = 201,
+ ICON_SHIELD = 202,
+ ICON_FILE_NEW = 203,
+ ICON_FOLDER_ADD = 204,
+ ICON_ALARM = 205,
+ ICON_CPU = 206,
+ ICON_ROM = 207,
+ ICON_STEP_OVER = 208,
+ ICON_STEP_INTO = 209,
+ ICON_STEP_OUT = 210,
+ ICON_RESTART = 211,
+ ICON_BREAKPOINT_ON = 212,
+ ICON_BREAKPOINT_OFF = 213,
+ ICON_BURGER_MENU = 214,
+ ICON_CASE_SENSITIVE = 215,
+ ICON_REG_EXP = 216,
+ ICON_FOLDER = 217,
+ ICON_FILE = 218,
+ ICON_SAND_TIMER = 219,
+ ICON_220 = 220,
+ ICON_221 = 221,
+ ICON_222 = 222,
+ ICON_223 = 223,
+ ICON_224 = 224,
+ ICON_225 = 225,
+ ICON_226 = 226,
+ ICON_227 = 227,
+ ICON_228 = 228,
+ ICON_229 = 229,
+ ICON_230 = 230,
+ ICON_231 = 231,
+ ICON_232 = 232,
+ ICON_233 = 233,
+ ICON_234 = 234,
+ ICON_235 = 235,
+ ICON_236 = 236,
+ ICON_237 = 237,
+ ICON_238 = 238,
+ ICON_239 = 239,
+ ICON_240 = 240,
+ ICON_241 = 241,
+ ICON_242 = 242,
+ ICON_243 = 243,
+ ICON_244 = 244,
+ ICON_245 = 245,
+ ICON_246 = 246,
+ ICON_247 = 247,
+ ICON_248 = 248,
+ ICON_249 = 249,
+ ICON_250 = 250,
+ ICON_251 = 251,
+ ICON_252 = 252,
+ ICON_253 = 253,
+ ICON_254 = 254,
+ ICON_255 = 255,
+} GuiIconName;
+#endif
+
+#endif
+
+#if defined(__cplusplus)
+} // Prevents name mangling of functions
+#endif
+
+#endif // RAYGUI_H
+
+/***********************************************************************************
+*
+* RAYGUI IMPLEMENTATION
+*
+************************************************************************************/
+
+#if defined(RAYGUI_IMPLEMENTATION)
+
+#include // Required for: FILE, fopen(), fclose(), fprintf(), feof(), fscanf(), vsprintf() [GuiLoadStyle(), GuiLoadIcons()]
+#include // Required for: malloc(), calloc(), free() [GuiLoadStyle(), GuiLoadIcons()]
+#include // Required for: strlen() [GuiTextBox(), GuiValueBox()], memset(), memcpy()
+#include // Required for: va_list, va_start(), vfprintf(), va_end() [TextFormat()]
+#include // Required for: roundf() [GuiColorPicker()]
+
+#ifdef __cplusplus
+ #define RAYGUI_CLITERAL(name) name
+#else
+ #define RAYGUI_CLITERAL(name) (name)
+#endif
+
+// Check if two rectangles are equal, used to validate a slider bounds as an id
+#ifndef CHECK_BOUNDS_ID
+ #define CHECK_BOUNDS_ID(src, dst) ((src.x == dst.x) && (src.y == dst.y) && (src.width == dst.width) && (src.height == dst.height))
+#endif
+
+#if !defined(RAYGUI_NO_ICONS) && !defined(RAYGUI_CUSTOM_ICONS)
+
+// Embedded icons, no external file provided
+#define RAYGUI_ICON_SIZE 16 // Size of icons in pixels (squared)
+#define RAYGUI_ICON_MAX_ICONS 256 // Maximum number of icons
+#define RAYGUI_ICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id
+
+// Icons data is defined by bit array (every bit represents one pixel)
+// Those arrays are stored as unsigned int data arrays, so,
+// every array element defines 32 pixels (bits) of information
+// One icon is defined by 8 int, (8 int * 32 bit = 256 bit = 16*16 pixels)
+// NOTE: Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels)
+#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32)
+
+//----------------------------------------------------------------------------------
+// Icons data for all gui possible icons (allocated on data segment by default)
+//
+// NOTE 1: Every icon is codified in binary form, using 1 bit per pixel, so,
+// every 16x16 icon requires 8 integers (16*16/32) to be stored
+//
+// NOTE 2: A different icon set could be loaded over this array using GuiLoadIcons(),
+// but loaded icons set must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS
+//
+// guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB
+//----------------------------------------------------------------------------------
+static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_NONE
+ 0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // ICON_FOLDER_FILE_OPEN
+ 0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // ICON_FILE_SAVE_CLASSIC
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // ICON_FOLDER_OPEN
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // ICON_FOLDER_SAVE
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // ICON_FILE_OPEN
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // ICON_FILE_SAVE
+ 0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // ICON_FILE_EXPORT
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // ICON_FILE_ADD
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // ICON_FILE_DELETE
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_FILETYPE_TEXT
+ 0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // ICON_FILETYPE_AUDIO
+ 0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // ICON_FILETYPE_IMAGE
+ 0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // ICON_FILETYPE_PLAY
+ 0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // ICON_FILETYPE_VIDEO
+ 0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // ICON_FILETYPE_INFO
+ 0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // ICON_FILE_COPY
+ 0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // ICON_FILE_CUT
+ 0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // ICON_FILE_PASTE
+ 0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_CURSOR_HAND
+ 0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // ICON_CURSOR_POINTER
+ 0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // ICON_CURSOR_CLASSIC
+ 0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // ICON_PENCIL
+ 0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // ICON_PENCIL_BIG
+ 0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // ICON_BRUSH_CLASSIC
+ 0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // ICON_BRUSH_PAINTER
+ 0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // ICON_WATER_DROP
+ 0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // ICON_COLOR_PICKER
+ 0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // ICON_RUBBER
+ 0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // ICON_COLOR_BUCKET
+ 0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // ICON_TEXT_T
+ 0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // ICON_TEXT_A
+ 0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // ICON_SCALE
+ 0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // ICON_RESIZE
+ 0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_POINT
+ 0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_BILINEAR
+ 0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // ICON_CROP
+ 0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // ICON_CROP_ALPHA
+ 0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // ICON_SQUARE_TOGGLE
+ 0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // ICON_SYMMETRY
+ 0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // ICON_SYMMETRY_HORIZONTAL
+ 0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // ICON_SYMMETRY_VERTICAL
+ 0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // ICON_LENS
+ 0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // ICON_LENS_BIG
+ 0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // ICON_EYE_ON
+ 0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // ICON_EYE_OFF
+ 0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // ICON_FILTER_TOP
+ 0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // ICON_FILTER
+ 0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_POINT
+ 0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL
+ 0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG
+ 0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // ICON_TARGET_MOVE
+ 0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // ICON_CURSOR_MOVE
+ 0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // ICON_CURSOR_SCALE
+ 0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // ICON_CURSOR_SCALE_RIGHT
+ 0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // ICON_CURSOR_SCALE_LEFT
+ 0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO
+ 0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // ICON_REREDO
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // ICON_MUTATE
+ 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // ICON_ROTATE
+ 0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // ICON_REPEAT
+ 0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // ICON_SHUFFLE
+ 0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // ICON_EMPTYBOX
+ 0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // ICON_TARGET
+ 0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL_FILL
+ 0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG_FILL
+ 0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // ICON_TARGET_MOVE_FILL
+ 0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // ICON_CURSOR_MOVE_FILL
+ 0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // ICON_CURSOR_SCALE_FILL
+ 0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // ICON_CURSOR_SCALE_RIGHT_FILL
+ 0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // ICON_CURSOR_SCALE_LEFT_FILL
+ 0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO_FILL
+ 0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO_FILL
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // ICON_REREDO_FILL
+ 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // ICON_MUTATE_FILL
+ 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // ICON_ROTATE_FILL
+ 0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // ICON_REPEAT_FILL
+ 0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // ICON_SHUFFLE_FILL
+ 0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // ICON_EMPTYBOX_SMALL
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX
+ 0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP
+ 0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_RIGHT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_RIGHT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // ICON_BOX_BOTTOM_RIGHT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // ICON_BOX_BOTTOM
+ 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // ICON_BOX_BOTTOM_LEFT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_LEFT
+ 0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_LEFT
+ 0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_CENTER
+ 0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // ICON_BOX_CIRCLE_MASK
+ 0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // ICON_POT
+ 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // ICON_ALPHA_MULTIPLY
+ 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // ICON_ALPHA_CLEAR
+ 0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // ICON_DITHERING
+ 0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // ICON_MIPMAPS
+ 0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // ICON_BOX_GRID
+ 0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // ICON_GRID
+ 0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // ICON_BOX_CORNERS_SMALL
+ 0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // ICON_BOX_CORNERS_BIG
+ 0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // ICON_FOUR_BOXES
+ 0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // ICON_GRID_FILL
+ 0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // ICON_BOX_MULTISIZE
+ 0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_SMALL
+ 0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_MEDIUM
+ 0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // ICON_ZOOM_BIG
+ 0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // ICON_ZOOM_ALL
+ 0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // ICON_ZOOM_CENTER
+ 0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // ICON_BOX_DOTS_SMALL
+ 0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // ICON_BOX_DOTS_BIG
+ 0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // ICON_BOX_CONCENTRIC
+ 0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // ICON_BOX_GRID_BIG
+ 0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // ICON_OK_TICK
+ 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // ICON_CROSS
+ 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // ICON_ARROW_LEFT
+ 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // ICON_ARROW_RIGHT
+ 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // ICON_ARROW_DOWN
+ 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP
+ 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // ICON_ARROW_LEFT_FILL
+ 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // ICON_ARROW_RIGHT_FILL
+ 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // ICON_ARROW_DOWN_FILL
+ 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP_FILL
+ 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // ICON_AUDIO
+ 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // ICON_FX
+ 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // ICON_WAVE
+ 0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // ICON_WAVE_SINUS
+ 0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // ICON_WAVE_SQUARE
+ 0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // ICON_WAVE_TRIANGULAR
+ 0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // ICON_CROSS_SMALL
+ 0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // ICON_PLAYER_PREVIOUS
+ 0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // ICON_PLAYER_PLAY_BACK
+ 0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // ICON_PLAYER_PLAY
+ 0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // ICON_PLAYER_PAUSE
+ 0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // ICON_PLAYER_STOP
+ 0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // ICON_PLAYER_NEXT
+ 0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // ICON_PLAYER_RECORD
+ 0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // ICON_MAGNET
+ 0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_CLOSE
+ 0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_OPEN
+ 0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // ICON_CLOCK
+ 0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // ICON_TOOLS
+ 0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // ICON_GEAR
+ 0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // ICON_GEAR_BIG
+ 0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // ICON_BIN
+ 0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // ICON_HAND_POINTER
+ 0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // ICON_LASER
+ 0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // ICON_COIN
+ 0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // ICON_EXPLOSION
+ 0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // ICON_1UP
+ 0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // ICON_PLAYER
+ 0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // ICON_PLAYER_JUMP
+ 0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // ICON_KEY
+ 0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // ICON_DEMON
+ 0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // ICON_TEXT_POPUP
+ 0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // ICON_GEAR_EX
+ 0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK
+ 0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK_POINTS
+ 0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // ICON_STAR
+ 0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // ICON_DOOR
+ 0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // ICON_EXIT
+ 0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // ICON_MODE_2D
+ 0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // ICON_MODE_3D
+ 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE
+ 0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_TOP
+ 0x7fe00000, 0x50386030, 0x47c2483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // ICON_CUBE_FACE_LEFT
+ 0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // ICON_CUBE_FACE_FRONT
+ 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3bf27be2, 0x0bfe1bfa, 0x000007fe, // ICON_CUBE_FACE_BOTTOM
+ 0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // ICON_CUBE_FACE_RIGHT
+ 0x7fe00000, 0x6fe85ff0, 0x781e77e4, 0x7be27be2, 0x7be27be2, 0x24127be2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_BACK
+ 0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // ICON_CAMERA
+ 0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // ICON_SPECIAL
+ 0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // ICON_LINK_NET
+ 0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // ICON_LINK_BOXES
+ 0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // ICON_LINK_MULTI
+ 0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // ICON_LINK
+ 0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // ICON_LINK_BROKE
+ 0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_TEXT_NOTES
+ 0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // ICON_NOTEBOOK
+ 0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // ICON_SUITCASE
+ 0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // ICON_SUITCASE_ZIP
+ 0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // ICON_MAILBOX
+ 0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // ICON_MONITOR
+ 0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // ICON_PRINTER
+ 0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA
+ 0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA_FLASH
+ 0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // ICON_HOUSE
+ 0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // ICON_HEART
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // ICON_CORNER
+ 0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // ICON_VERTICAL_BARS
+ 0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // ICON_VERTICAL_BARS_FILL
+ 0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // ICON_LIFE_BARS
+ 0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // ICON_INFO
+ 0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // ICON_CROSSLINE
+ 0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // ICON_HELP
+ 0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // ICON_FILETYPE_ALPHA
+ 0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // ICON_FILETYPE_HOME
+ 0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS_VISIBLE
+ 0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS
+ 0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_WINDOW
+ 0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // ICON_HIDPI
+ 0x3ff00000, 0x201c2010, 0x2a842e84, 0x2e842a84, 0x2ba42004, 0x2aa42aa4, 0x20042ba4, 0x00003ffc, // ICON_FILETYPE_BINARY
+ 0x00000000, 0x00000000, 0x00120012, 0x4a5e4bd2, 0x485233d2, 0x00004bd2, 0x00000000, 0x00000000, // ICON_HEX
+ 0x01800000, 0x381c0660, 0x23c42004, 0x23c42044, 0x13c82204, 0x08101008, 0x02400420, 0x00000180, // ICON_SHIELD
+ 0x007e0000, 0x20023fc2, 0x40227fe2, 0x400a403a, 0x400a400a, 0x400a400a, 0x4008400e, 0x00007ff8, // ICON_FILE_NEW
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x44024002, 0x5f024402, 0x44024402, 0x7ffe4002, 0x00000000, // ICON_FOLDER_ADD
+ 0x44220000, 0x12482244, 0xf3cf0000, 0x14280420, 0x48122424, 0x08100810, 0x1ff81008, 0x03c00420, // ICON_ALARM
+ 0x0aa00000, 0x1ff80aa0, 0x1068700e, 0x1008706e, 0x1008700e, 0x1008700e, 0x0aa01ff8, 0x00000aa0, // ICON_CPU
+ 0x07e00000, 0x04201db8, 0x04a01c38, 0x04a01d38, 0x04a01d38, 0x04a01d38, 0x04201d38, 0x000007e0, // ICON_ROM
+ 0x00000000, 0x03c00000, 0x3c382ff0, 0x3c04380c, 0x01800000, 0x03c003c0, 0x00000180, 0x00000000, // ICON_STEP_OVER
+ 0x01800000, 0x01800180, 0x01800180, 0x03c007e0, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_INTO
+ 0x01800000, 0x07e003c0, 0x01800180, 0x01800180, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_OUT
+ 0x00000000, 0x0ff003c0, 0x181c1c34, 0x303c301c, 0x30003000, 0x1c301800, 0x03c00ff0, 0x00000000, // ICON_RESTART
+ 0x00000000, 0x00000000, 0x07e003c0, 0x0ff00ff0, 0x0ff00ff0, 0x03c007e0, 0x00000000, 0x00000000, // ICON_BREAKPOINT_ON
+ 0x00000000, 0x00000000, 0x042003c0, 0x08100810, 0x08100810, 0x03c00420, 0x00000000, 0x00000000, // ICON_BREAKPOINT_OFF
+ 0x00000000, 0x00000000, 0x1ff81ff8, 0x1ff80000, 0x00001ff8, 0x1ff81ff8, 0x00000000, 0x00000000, // ICON_BURGER_MENU
+ 0x00000000, 0x00000000, 0x00880070, 0x0c880088, 0x1e8810f8, 0x3e881288, 0x00000000, 0x00000000, // ICON_CASE_SENSITIVE
+ 0x00000000, 0x02000000, 0x07000a80, 0x07001fc0, 0x02000a80, 0x00300030, 0x00000000, 0x00000000, // ICON_REG_EXP
+ 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_FOLDER
+ 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x00003ffc, // ICON_FILE
+ 0x1ff00000, 0x20082008, 0x17d02fe8, 0x05400ba0, 0x09200540, 0x23881010, 0x2fe827c8, 0x00001ff0, // ICON_SAND_TIMER
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_220
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_221
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_222
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_223
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_224
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_225
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_226
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_227
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_228
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_229
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_230
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_231
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_232
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_233
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_234
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_235
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_236
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_237
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_238
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_239
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_240
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_241
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_242
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_243
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_244
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_245
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_246
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_247
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_248
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_249
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_250
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_251
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_252
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_253
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_254
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_255
+};
+
+// NOTE: We keep a pointer to the icons array, useful to point to other sets if required
+static unsigned int *guiIconsPtr = guiIcons;
+
+#endif // !RAYGUI_NO_ICONS && !RAYGUI_CUSTOM_ICONS
+
+#ifndef RAYGUI_ICON_SIZE
+ #define RAYGUI_ICON_SIZE 0
+#endif
+
+// WARNING: Those values define the total size of the style data array,
+// if changed, previous saved styles could become incompatible
+#define RAYGUI_MAX_CONTROLS 16 // Maximum number of controls
+#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of base properties
+#define RAYGUI_MAX_PROPS_EXTENDED 8 // Maximum number of extended properties
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+// Gui control property style color element
+typedef enum { BORDER = 0, BASE, TEXT, OTHER } GuiPropertyElement;
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+static GuiState guiState = STATE_NORMAL; // Gui global state, if !STATE_NORMAL, forces defined state
+
+static Font guiFont = { 0 }; // Gui current font (WARNING: highly coupled to raylib)
+static bool guiLocked = false; // Gui lock state (no inputs processed)
+static float guiAlpha = 1.0f; // Gui controls transparency
+
+static unsigned int guiIconScale = 1; // Gui icon default scale (if icons enabled)
+
+static bool guiTooltip = false; // Tooltip enabled/disabled
+static const char *guiTooltipPtr = NULL; // Tooltip string pointer (string provided by user)
+
+static bool guiSliderDragging = false; // Gui slider drag state (no inputs processed except dragged slider)
+static Rectangle guiSliderActive = { 0 }; // Gui slider active bounds rectangle, used as an unique identifier
+
+static int textBoxCursorIndex = 0; // Cursor index, shared by all GuiTextBox*()
+//static int blinkCursorFrameCounter = 0; // Frame counter for cursor blinking
+static int autoCursorCooldownCounter = 0; // Cooldown frame counter for automatic cursor movement on key-down
+static int autoCursorDelayCounter = 0; // Delay frame counter for automatic cursor movement
+
+//----------------------------------------------------------------------------------
+// Style data array for all gui style properties (allocated on data segment by default)
+//
+// NOTE 1: First set of BASE properties are generic to all controls but could be individually
+// overwritten per control, first set of EXTENDED properties are generic to all controls and
+// can not be overwritten individually but custom EXTENDED properties can be used by control
+//
+// NOTE 2: A new style set could be loaded over this array using GuiLoadStyle(),
+// but default gui style could always be recovered with GuiLoadStyleDefault()
+//
+// guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB
+//----------------------------------------------------------------------------------
+static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)] = { 0 };
+
+static bool guiStyleLoaded = false; // Style loaded flag for lazy style initialization
+
+//----------------------------------------------------------------------------------
+// Standalone Mode Functions Declaration
+//
+// NOTE: raygui depend on some raylib input and drawing functions
+// To use raygui as standalone library, below functions must be defined by the user
+//----------------------------------------------------------------------------------
+#if defined(RAYGUI_STANDALONE)
+
+#define KEY_RIGHT 262
+#define KEY_LEFT 263
+#define KEY_DOWN 264
+#define KEY_UP 265
+#define KEY_BACKSPACE 259
+#define KEY_ENTER 257
+
+#define MOUSE_LEFT_BUTTON 0
+
+// Input required functions
+//-------------------------------------------------------------------------------
+static Vector2 GetMousePosition(void);
+static float GetMouseWheelMove(void);
+static bool IsMouseButtonDown(int button);
+static bool IsMouseButtonPressed(int button);
+static bool IsMouseButtonReleased(int button);
+
+static bool IsKeyDown(int key);
+static bool IsKeyPressed(int key);
+static int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox()
+//-------------------------------------------------------------------------------
+
+// Drawing required functions
+//-------------------------------------------------------------------------------
+static void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle()
+static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker()
+//-------------------------------------------------------------------------------
+
+// Text required functions
+//-------------------------------------------------------------------------------
+static Font GetFontDefault(void); // -- GuiLoadStyleDefault()
+static Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle(), load font
+
+static Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image
+static void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization)
+
+static char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data
+static void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data
+
+static const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs
+
+static int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list
+static void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list
+
+static unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle()
+//-------------------------------------------------------------------------------
+
+// raylib functions already implemented in raygui
+//-------------------------------------------------------------------------------
+static Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value
+static int ColorToInt(Color color); // Returns hexadecimal value for a Color
+static bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle
+static const char *TextFormat(const char *text, ...); // Formatting of text with variables to 'embed'
+static const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings
+static int TextToInteger(const char *text); // Get integer value from text
+
+static int GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded text
+static const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode codepoint into UTF-8 text (char array size returned as parameter)
+
+static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2); // Draw rectangle vertical gradient
+//-------------------------------------------------------------------------------
+
+#endif // RAYGUI_STANDALONE
+
+//----------------------------------------------------------------------------------
+// Module specific Functions Declaration
+//----------------------------------------------------------------------------------
+static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize); // Load style from memory (binary only)
+
+static int GetTextWidth(const char *text); // Gui get text width using gui font and style
+static Rectangle GetTextBounds(int control, Rectangle bounds); // Get text bounds considering control bounds
+static const char *GetTextIcon(const char *text, int *iconId); // Get text icon if provided and move text cursor
+
+static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint); // Gui draw text using default font
+static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color); // Gui draw rectangle using default raygui style
+
+static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow); // Split controls text into multiple strings
+static Vector3 ConvertHSVtoRGB(Vector3 hsv); // Convert color data from HSV to RGB
+static Vector3 ConvertRGBtoHSV(Vector3 rgb); // Convert color data from RGB to HSV
+
+static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue); // Scroll bar control, used by GuiScrollPanel()
+static void GuiTooltip(Rectangle controlRec); // Draw tooltip using control rec position
+
+static Color GuiFade(Color color, float alpha); // Fade color by an alpha factor
+
+//----------------------------------------------------------------------------------
+// Gui Setup Functions Definition
+//----------------------------------------------------------------------------------
+// Enable gui global state
+// NOTE: We check for STATE_DISABLED to avoid messing custom global state setups
+void GuiEnable(void) { if (guiState == STATE_DISABLED) guiState = STATE_NORMAL; }
+
+// Disable gui global state
+// NOTE: We check for STATE_NORMAL to avoid messing custom global state setups
+void GuiDisable(void) { if (guiState == STATE_NORMAL) guiState = STATE_DISABLED; }
+
+// Lock gui global state
+void GuiLock(void) { guiLocked = true; }
+
+// Unlock gui global state
+void GuiUnlock(void) { guiLocked = false; }
+
+// Check if gui is locked (global state)
+bool GuiIsLocked(void) { return guiLocked; }
+
+// Set gui controls alpha global state
+void GuiSetAlpha(float alpha)
+{
+ if (alpha < 0.0f) alpha = 0.0f;
+ else if (alpha > 1.0f) alpha = 1.0f;
+
+ guiAlpha = alpha;
+}
+
+// Set gui state (global state)
+void GuiSetState(int state) { guiState = (GuiState)state; }
+
+// Get gui state (global state)
+int GuiGetState(void) { return guiState; }
+
+// Set custom gui font
+// NOTE: Font loading/unloading is external to raygui
+void GuiSetFont(Font font)
+{
+ if (font.texture.id > 0)
+ {
+ // NOTE: If we try to setup a font but default style has not been
+ // lazily loaded before, it will be overwritten, so we need to force
+ // default style loading first
+ if (!guiStyleLoaded) GuiLoadStyleDefault();
+
+ guiFont = font;
+ }
+}
+
+// Get custom gui font
+Font GuiGetFont(void)
+{
+ return guiFont;
+}
+
+// Set control style property value
+void GuiSetStyle(int control, int property, int value)
+{
+ if (!guiStyleLoaded) GuiLoadStyleDefault();
+ guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value;
+
+ // Default properties are propagated to all controls
+ if ((control == 0) && (property < RAYGUI_MAX_PROPS_BASE))
+ {
+ for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) guiStyle[i*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value;
+ }
+}
+
+// Get control style property value
+int GuiGetStyle(int control, int property)
+{
+ if (!guiStyleLoaded) GuiLoadStyleDefault();
+ return guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property];
+}
+
+//----------------------------------------------------------------------------------
+// Gui Controls Functions Definition
+//----------------------------------------------------------------------------------
+
+// Window Box control
+int GuiWindowBox(Rectangle bounds, const char *title)
+{
+ // Window title bar height (including borders)
+ // NOTE: This define is also used by GuiMessageBox() and GuiTextInputBox()
+ #if !defined(RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT)
+ #define RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT 24
+ #endif
+
+ int result = 0;
+ //GuiState state = guiState;
+
+ int statusBarHeight = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT;
+
+ Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)statusBarHeight };
+ if (bounds.height < statusBarHeight*2.0f) bounds.height = statusBarHeight*2.0f;
+
+ Rectangle windowPanel = { bounds.x, bounds.y + (float)statusBarHeight - 1, bounds.width, bounds.height - (float)statusBarHeight + 1 };
+ Rectangle closeButtonRec = { statusBar.x + statusBar.width - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - 20,
+ statusBar.y + statusBarHeight/2.0f - 18.0f/2.0f, 18, 18 };
+
+ // Update control
+ //--------------------------------------------------------------------
+ // NOTE: Logic is directly managed by button
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiStatusBar(statusBar, title); // Draw window header as status bar
+ GuiPanel(windowPanel, NULL); // Draw window base
+
+ // Draw window close button
+ int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH);
+ int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, 1);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+#if defined(RAYGUI_NO_ICONS)
+ result = GuiButton(closeButtonRec, "x");
+#else
+ result = GuiButton(closeButtonRec, GuiIconText(ICON_CROSS_SMALL, NULL));
+#endif
+ GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment);
+ //--------------------------------------------------------------------
+
+ return result; // Window close button clicked: result = 1
+}
+
+// Group Box control with text name
+int GuiGroupBox(Rectangle bounds, const char *text)
+{
+ #if !defined(RAYGUI_GROUPBOX_LINE_THICK)
+ #define RAYGUI_GROUPBOX_LINE_THICK 1
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)));
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, RAYGUI_GROUPBOX_LINE_THICK }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)));
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)));
+
+ GuiLine(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y - GuiGetStyle(DEFAULT, TEXT_SIZE)/2, bounds.width, (float)GuiGetStyle(DEFAULT, TEXT_SIZE) }, text);
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Line control
+int GuiLine(Rectangle bounds, const char *text)
+{
+ #if !defined(RAYGUI_LINE_ORIGIN_SIZE)
+ #define RAYGUI_LINE_MARGIN_TEXT 12
+ #endif
+ #if !defined(RAYGUI_LINE_TEXT_PADDING)
+ #define RAYGUI_LINE_TEXT_PADDING 4
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ Color color = GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR));
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (text == NULL) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, bounds.width, 1 }, 0, BLANK, color);
+ else
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(text) + 2;
+ textBounds.height = bounds.height;
+ textBounds.x = bounds.x + RAYGUI_LINE_MARGIN_TEXT;
+ textBounds.y = bounds.y;
+
+ // Draw line with embedded text label: "--- text --------------"
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color);
+ GuiDrawText(text, textBounds, TEXT_ALIGN_LEFT, color);
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + 12 + textBounds.width + 4, bounds.y + bounds.height/2, bounds.width - textBounds.width - RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color);
+ }
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Panel control
+int GuiPanel(Rectangle bounds, const char *text)
+{
+ #if !defined(RAYGUI_PANEL_BORDER_WIDTH)
+ #define RAYGUI_PANEL_BORDER_WIDTH 1
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ // Text will be drawn as a header bar (if provided)
+ Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT };
+ if ((text != NULL) && (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f)) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f;
+
+ if (text != NULL)
+ {
+ // Move panel bounds after the header bar
+ bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1;
+ bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1;
+ }
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar
+
+ GuiDrawRectangle(bounds, RAYGUI_PANEL_BORDER_WIDTH, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED: LINE_COLOR)),
+ GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BASE_COLOR_DISABLED : BACKGROUND_COLOR)));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Tab Bar control
+// NOTE: Using GuiToggle() for the TABS
+int GuiTabBar(Rectangle bounds, const char **text, int count, int *active)
+{
+ #define RAYGUI_TABBAR_ITEM_WIDTH 160
+
+ int result = -1;
+ //GuiState state = guiState;
+
+ Rectangle tabBounds = { bounds.x, bounds.y, RAYGUI_TABBAR_ITEM_WIDTH, bounds.height };
+
+ if (*active < 0) *active = 0;
+ else if (*active > count - 1) *active = count - 1;
+
+ int offsetX = 0; // Required in case tabs go out of screen
+ offsetX = (*active + 2)*RAYGUI_TABBAR_ITEM_WIDTH - GetScreenWidth();
+ if (offsetX < 0) offsetX = 0;
+
+ bool toggle = false; // Required for individual toggles
+
+ // Draw control
+ //--------------------------------------------------------------------
+ for (int i = 0; i < count; i++)
+ {
+ tabBounds.x = bounds.x + (RAYGUI_TABBAR_ITEM_WIDTH + 4)*i - offsetX;
+
+ if (tabBounds.x < GetScreenWidth())
+ {
+ // Draw tabs as toggle controls
+ int textAlignment = GuiGetStyle(TOGGLE, TEXT_ALIGNMENT);
+ int textPadding = GuiGetStyle(TOGGLE, TEXT_PADDING);
+ GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiSetStyle(TOGGLE, TEXT_PADDING, 8);
+
+ if (i == (*active))
+ {
+ toggle = true;
+ GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle);
+ }
+ else
+ {
+ toggle = false;
+ GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle);
+ if (toggle) *active = i;
+ }
+
+ GuiSetStyle(TOGGLE, TEXT_PADDING, textPadding);
+ GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, textAlignment);
+
+ // Draw tab close button
+ // NOTE: Only draw close button for current tab: if (CheckCollisionPointRec(mousePosition, tabBounds))
+ int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH);
+ int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, 1);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+#if defined(RAYGUI_NO_ICONS)
+ if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, "x")) result = i;
+#else
+ if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, GuiIconText(ICON_CROSS_SMALL, NULL))) result = i;
+#endif
+ GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment);
+ }
+ }
+
+ // Draw tab-bar bottom line
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, 1 }, 0, BLANK, GetColor(GuiGetStyle(TOGGLE, BORDER_COLOR_NORMAL)));
+ //--------------------------------------------------------------------
+
+ return result; // Return as result the current TAB closing requested
+}
+
+// Scroll Panel control
+int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view)
+{
+ #define RAYGUI_MIN_SCROLLBAR_WIDTH 40
+ #define RAYGUI_MIN_SCROLLBAR_HEIGHT 40
+
+ int result = 0;
+ GuiState state = guiState;
+ float mouseWheelSpeed = 20.0f; // Default movement speed with mouse wheel
+
+ Rectangle temp = { 0 };
+ if (view == NULL) view = &temp;
+
+ Vector2 scrollPos = { 0.0f, 0.0f };
+ if (scroll != NULL) scrollPos = *scroll;
+
+ // Text will be drawn as a header bar (if provided)
+ Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT };
+ if (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f;
+
+ if (text != NULL)
+ {
+ // Move panel bounds after the header bar
+ bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1;
+ bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + 1;
+ }
+
+ bool hasHorizontalScrollBar = (content.width > bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false;
+ bool hasVerticalScrollBar = (content.height > bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false;
+
+ // Recheck to account for the other scrollbar being visible
+ if (!hasHorizontalScrollBar) hasHorizontalScrollBar = (hasVerticalScrollBar && (content.width > (bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false;
+ if (!hasVerticalScrollBar) hasVerticalScrollBar = (hasHorizontalScrollBar && (content.height > (bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false;
+
+ int horizontalScrollBarWidth = hasHorizontalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0;
+ int verticalScrollBarWidth = hasVerticalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0;
+ Rectangle horizontalScrollBar = {
+ (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + verticalScrollBarWidth : (float)bounds.x) + GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)bounds.y + bounds.height - horizontalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)bounds.width - verticalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)horizontalScrollBarWidth
+ };
+ Rectangle verticalScrollBar = {
+ (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)bounds.x + bounds.width - verticalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH)),
+ (float)bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)verticalScrollBarWidth,
+ (float)bounds.height - horizontalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH)
+ };
+
+ // Make sure scroll bars have a minimum width/height
+ // NOTE: If content >>> bounds, size could be very small or even 0
+ if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH)
+ {
+ horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH;
+ mouseWheelSpeed = 30.0f; // TODO: Calculate speed increment based on content.height vs bounds.height
+ }
+ if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT)
+ {
+ verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT;
+ mouseWheelSpeed = 30.0f; // TODO: Calculate speed increment based on content.width vs bounds.width
+ }
+
+ // Calculate view area (area without the scrollbars)
+ *view = (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)?
+ RAYGUI_CLITERAL(Rectangle){ bounds.x + verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth } :
+ RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth };
+
+ // Clip view area to the actual content size
+ if (view->width > content.width) view->width = content.width;
+ if (view->height > content.height) view->height = content.height;
+
+ float horizontalMin = hasHorizontalScrollBar? ((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ float horizontalMax = hasHorizontalScrollBar? content.width - bounds.width + (float)verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH) - (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)verticalScrollBarWidth : 0) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ float verticalMin = hasVerticalScrollBar? 0.0f : -1.0f;
+ float verticalMax = hasVerticalScrollBar? content.height - bounds.height + (float)horizontalScrollBarWidth + (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH);
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check button state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+
+#if defined(SUPPORT_SCROLLBAR_KEY_INPUT)
+ if (hasHorizontalScrollBar)
+ {
+ if (IsKeyDown(KEY_RIGHT)) scrollPos.x -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
+ if (IsKeyDown(KEY_LEFT)) scrollPos.x += GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
+ }
+
+ if (hasVerticalScrollBar)
+ {
+ if (IsKeyDown(KEY_DOWN)) scrollPos.y -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
+ if (IsKeyDown(KEY_UP)) scrollPos.y += GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
+ }
+#endif
+ float wheelMove = GetMouseWheelMove();
+
+ // Horizontal and vertical scrolling with mouse wheel
+ if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_LEFT_SHIFT))) scrollPos.x += wheelMove*mouseWheelSpeed;
+ else scrollPos.y += wheelMove*mouseWheelSpeed; // Vertical scroll
+ }
+ }
+
+ // Normalize scroll values
+ if (scrollPos.x > -horizontalMin) scrollPos.x = -horizontalMin;
+ if (scrollPos.x < -horizontalMax) scrollPos.x = -horizontalMax;
+ if (scrollPos.y > -verticalMin) scrollPos.y = -verticalMin;
+ if (scrollPos.y < -verticalMax) scrollPos.y = -verticalMax;
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar
+
+ GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background
+
+ // Save size of the scrollbar slider
+ const int slider = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE);
+
+ // Draw horizontal scrollbar if visible
+ if (hasHorizontalScrollBar)
+ {
+ // Change scrollbar slider size to show the diff in size between the content width and the widget width
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth)/(int)content.width)*((int)bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth)));
+ scrollPos.x = (float)-GuiScrollBar(horizontalScrollBar, (int)-scrollPos.x, (int)horizontalMin, (int)horizontalMax);
+ }
+ else scrollPos.x = 0.0f;
+
+ // Draw vertical scrollbar if visible
+ if (hasVerticalScrollBar)
+ {
+ // Change scrollbar slider size to show the diff in size between the content height and the widget height
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth)/(int)content.height)*((int)bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth)));
+ scrollPos.y = (float)-GuiScrollBar(verticalScrollBar, (int)-scrollPos.y, (int)verticalMin, (int)verticalMax);
+ }
+ else scrollPos.y = 0.0f;
+
+ // Draw detail corner rectangle if both scroll bars are visible
+ if (hasHorizontalScrollBar && hasVerticalScrollBar)
+ {
+ Rectangle corner = { (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) + 2) : (horizontalScrollBar.x + horizontalScrollBar.width + 2), verticalScrollBar.y + verticalScrollBar.height + 2, (float)horizontalScrollBarWidth - 4, (float)verticalScrollBarWidth - 4 };
+ GuiDrawRectangle(corner, 0, BLANK, GetColor(GuiGetStyle(LISTVIEW, TEXT + (state*3))));
+ }
+
+ // Draw scrollbar lines depending on current state
+ GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), BLANK);
+
+ // Set scrollbar slider size back to the way it was before
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider);
+ //--------------------------------------------------------------------
+
+ if (scroll != NULL) *scroll = scrollPos;
+
+ return result;
+}
+
+// Label control
+int GuiLabel(Rectangle bounds, const char *text)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ // Update control
+ //--------------------------------------------------------------------
+ //...
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3))));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Button control, returns true when clicked
+int GuiButton(Rectangle bounds, const char *text)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check button state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(BUTTON, BORDER_WIDTH), GetColor(GuiGetStyle(BUTTON, BORDER + (state*3))), GetColor(GuiGetStyle(BUTTON, BASE + (state*3))));
+ GuiDrawText(text, GetTextBounds(BUTTON, bounds), GuiGetStyle(BUTTON, TEXT_ALIGNMENT), GetColor(GuiGetStyle(BUTTON, TEXT + (state*3))));
+
+ if (state == STATE_FOCUSED) GuiTooltip(bounds);
+ //------------------------------------------------------------------
+
+ return result; // Button pressed: result = 1
+}
+
+// Label button control
+int GuiLabelButton(Rectangle bounds, const char *text)
+{
+ GuiState state = guiState;
+ bool pressed = false;
+
+ // NOTE: We force bounds.width to be all text
+ float textWidth = (float)GetTextWidth(text);
+ if ((bounds.width - 2*GuiGetStyle(LABEL, BORDER_WIDTH) - 2*GuiGetStyle(LABEL, TEXT_PADDING)) < textWidth) bounds.width = textWidth + 2*GuiGetStyle(LABEL, BORDER_WIDTH) + 2*GuiGetStyle(LABEL, TEXT_PADDING) + 2;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check checkbox state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3))));
+ //--------------------------------------------------------------------
+
+ return pressed;
+}
+
+// Toggle Button control, returns true when active
+int GuiToggle(Rectangle bounds, const char *text, bool *active)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ bool temp = false;
+ if (active == NULL) active = &temp;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check toggle button state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_NORMAL;
+ *active = !(*active);
+ }
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (state == STATE_NORMAL)
+ {
+ GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, ((*active)? BORDER_COLOR_PRESSED : (BORDER + state*3)))), GetColor(GuiGetStyle(TOGGLE, ((*active)? BASE_COLOR_PRESSED : (BASE + state*3)))));
+ GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, ((*active)? TEXT_COLOR_PRESSED : (TEXT + state*3)))));
+ }
+ else
+ {
+ GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + state*3)), GetColor(GuiGetStyle(TOGGLE, BASE + state*3)));
+ GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, TEXT + state*3)));
+ }
+
+ if (state == STATE_FOCUSED) GuiTooltip(bounds);
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Toggle Group control, returns toggled button codepointIndex
+int GuiToggleGroup(Rectangle bounds, const char *text, int *active)
+{
+ #if !defined(RAYGUI_TOGGLEGROUP_MAX_ITEMS)
+ #define RAYGUI_TOGGLEGROUP_MAX_ITEMS 32
+ #endif
+
+ int result = 0;
+ float initBoundsX = bounds.x;
+
+ int temp = 0;
+ if (active == NULL) active = &temp;
+
+ bool toggle = false; // Required for individual toggles
+
+ // Get substrings items from text (items pointers)
+ int rows[RAYGUI_TOGGLEGROUP_MAX_ITEMS] = { 0 };
+ int itemCount = 0;
+ const char **items = GuiTextSplit(text, ';', &itemCount, rows);
+
+ int prevRow = rows[0];
+
+ for (int i = 0; i < itemCount; i++)
+ {
+ if (prevRow != rows[i])
+ {
+ bounds.x = initBoundsX;
+ bounds.y += (bounds.height + GuiGetStyle(TOGGLE, GROUP_PADDING));
+ prevRow = rows[i];
+ }
+
+ if (i == (*active))
+ {
+ toggle = true;
+ GuiToggle(bounds, items[i], &toggle);
+ }
+ else
+ {
+ toggle = false;
+ GuiToggle(bounds, items[i], &toggle);
+ if (toggle) *active = i;
+ }
+
+ bounds.x += (bounds.width + GuiGetStyle(TOGGLE, GROUP_PADDING));
+ }
+
+ return result;
+}
+
+// Toggle Slider control extended, returns true when clicked
+int GuiToggleSlider(Rectangle bounds, const char *text, int *active)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ int temp = 0;
+ if (active == NULL) active = &temp;
+
+ //bool toggle = false; // Required for individual toggles
+
+ // Get substrings items from text (items pointers)
+ int itemCount = 0;
+ const char **items = GuiTextSplit(text, ';', &itemCount, NULL);
+
+ Rectangle slider = {
+ 0, // Calculated later depending on the active toggle
+ bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING),
+ (bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - (itemCount + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING))/itemCount,
+ bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+ (*active)++;
+ result = 1;
+ }
+ else state = STATE_FOCUSED;
+ }
+
+ if ((*active) && (state != STATE_FOCUSED)) state = STATE_PRESSED;
+ }
+
+ if (*active >= itemCount) *active = 0;
+ slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH) + (*active + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING) + (*active)*slider.width;
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + (state*3))),
+ GetColor(GuiGetStyle(TOGGLE, BASE_COLOR_NORMAL)));
+
+ // Draw internal slider
+ if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)));
+ else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_FOCUSED)));
+ else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)));
+
+ // Draw text in slider
+ if (text != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(text);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = slider.x + slider.width/2 - textBounds.width/2;
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(items[*active], textBounds, GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TOGGLE, TEXT + (state*3))), guiAlpha));
+ }
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Check Box control, returns true when active
+int GuiCheckBox(Rectangle bounds, const char *text, bool *checked)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ bool temp = false;
+ if (checked == NULL) checked = &temp;
+
+ Rectangle textBounds = { 0 };
+
+ if (text != NULL)
+ {
+ textBounds.width = (float)GetTextWidth(text) + 2;
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+ if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(CHECKBOX, TEXT_PADDING);
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ Rectangle totalBounds = {
+ (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT)? textBounds.x : bounds.x,
+ bounds.y,
+ bounds.width + textBounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING),
+ bounds.height,
+ };
+
+ // Check checkbox state
+ if (CheckCollisionPointRec(mousePoint, totalBounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) *checked = !(*checked);
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(CHECKBOX, BORDER_WIDTH), GetColor(GuiGetStyle(CHECKBOX, BORDER + (state*3))), BLANK);
+
+ if (*checked)
+ {
+ Rectangle check = { bounds.x + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING),
+ bounds.y + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING),
+ bounds.width - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)),
+ bounds.height - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)) };
+ GuiDrawRectangle(check, 0, BLANK, GetColor(GuiGetStyle(CHECKBOX, TEXT + state*3)));
+ }
+
+ GuiDrawText(text, textBounds, (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3))));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Combo Box control, returns selected item codepointIndex
+int GuiComboBox(Rectangle bounds, const char *text, int *active)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ int temp = 0;
+ if (active == NULL) active = &temp;
+
+ bounds.width -= (GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH) + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING));
+
+ Rectangle selector = { (float)bounds.x + bounds.width + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING),
+ (float)bounds.y, (float)GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH), (float)bounds.height };
+
+ // Get substrings items from text (items pointers, lengths and count)
+ int itemCount = 0;
+ const char **items = GuiTextSplit(text, ';', &itemCount, NULL);
+
+ if (*active < 0) *active = 0;
+ else if (*active > (itemCount - 1)) *active = itemCount - 1;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && (itemCount > 1) && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (CheckCollisionPointRec(mousePoint, bounds) ||
+ CheckCollisionPointRec(mousePoint, selector))
+ {
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ *active += 1;
+ if (*active >= itemCount) *active = 0; // Cyclic combobox
+ }
+
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ // Draw combo box main
+ GuiDrawRectangle(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), GetColor(GuiGetStyle(COMBOBOX, BORDER + (state*3))), GetColor(GuiGetStyle(COMBOBOX, BASE + (state*3))));
+ GuiDrawText(items[*active], GetTextBounds(COMBOBOX, bounds), GuiGetStyle(COMBOBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(COMBOBOX, TEXT + (state*3))));
+
+ // Draw selector using a custom button
+ // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values
+ int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH);
+ int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, 1);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ GuiButton(selector, TextFormat("%i/%i", *active + 1, itemCount));
+
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth);
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Dropdown Box control
+// NOTE: Returns mouse click
+int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ int itemSelected = *active;
+ int itemFocused = -1;
+
+ // Get substrings items from text (items pointers, lengths and count)
+ int itemCount = 0;
+ const char **items = GuiTextSplit(text, ';', &itemCount, NULL);
+
+ Rectangle boundsOpen = bounds;
+ boundsOpen.height = (itemCount + 1)*(bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING));
+
+ Rectangle itemBounds = bounds;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1) && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (editMode)
+ {
+ state = STATE_PRESSED;
+
+ // Check if mouse has been pressed or released outside limits
+ if (!CheckCollisionPointRec(mousePoint, boundsOpen))
+ {
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1;
+ }
+
+ // Check if already selected item has been pressed again
+ if (CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1;
+
+ // Check focused and selected item
+ for (int i = 0; i < itemCount; i++)
+ {
+ // Update item rectangle y position for next item
+ itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING));
+
+ if (CheckCollisionPointRec(mousePoint, itemBounds))
+ {
+ itemFocused = i;
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON))
+ {
+ itemSelected = i;
+ result = 1; // Item selected
+ }
+ break;
+ }
+ }
+
+ itemBounds = bounds;
+ }
+ else
+ {
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ result = 1;
+ state = STATE_PRESSED;
+ }
+ else state = STATE_FOCUSED;
+ }
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (editMode) GuiPanel(boundsOpen, NULL);
+
+ GuiDrawRectangle(bounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER + state*3)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE + state*3)));
+ GuiDrawText(items[itemSelected], GetTextBounds(DROPDOWNBOX, bounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + state*3)));
+
+ if (editMode)
+ {
+ // Draw visible items
+ for (int i = 0; i < itemCount; i++)
+ {
+ // Update item rectangle y position for next item
+ itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING));
+
+ if (i == itemSelected)
+ {
+ GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_PRESSED)));
+ GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_PRESSED)));
+ }
+ else if (i == itemFocused)
+ {
+ GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_FOCUSED)));
+ GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_FOCUSED)));
+ }
+ else GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL)));
+ }
+ }
+
+ // Draw arrows (using icon if available)
+#if defined(RAYGUI_NO_ICONS)
+ GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 },
+ TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))));
+#else
+ GuiDrawText("#120#", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 6, 10, 10 },
+ TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); // ICON_ARROW_DOWN_FILL
+#endif
+ //--------------------------------------------------------------------
+
+ *active = itemSelected;
+
+ // TODO: Use result to return more internal states: mouse-press out-of-bounds, mouse-press over selected-item...
+ return result; // Mouse click: result = 1
+}
+
+// Text Box control
+// NOTE: Returns true on ENTER pressed (useful for data validation)
+int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
+{
+ #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)
+ #define RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN 40 // Frames to wait for autocursor movement
+ #endif
+ #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY)
+ #define RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY 1 // Frames delay for autocursor movement
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ bool multiline = false; // TODO: Consider multiline text input
+ int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE);
+
+ Rectangle textBounds = GetTextBounds(TEXTBOX, bounds);
+ int textWidth = GetTextWidth(text) - GetTextWidth(text + textBoxCursorIndex);
+ int textIndexOffset = 0; // Text index offset to start drawing in the box
+
+ // Cursor rectangle
+ // NOTE: Position X value should be updated
+ Rectangle cursor = {
+ textBounds.x + textWidth + GuiGetStyle(DEFAULT, TEXT_SPACING),
+ textBounds.y + textBounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE),
+ 2,
+ (float)GuiGetStyle(DEFAULT, TEXT_SIZE)*2
+ };
+
+ if (cursor.height >= bounds.height) cursor.height = bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2;
+ if (cursor.y < (bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH))) cursor.y = bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH);
+
+ // Mouse cursor rectangle
+ // NOTE: Initialized outside of screen
+ Rectangle mouseCursor = cursor;
+ mouseCursor.x = -1;
+ mouseCursor.width = 1;
+
+ // Auto-cursor movement logic
+ // NOTE: Cursor moves automatically when key down after some time
+ if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_UP) || IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_BACKSPACE) || IsKeyDown(KEY_DELETE)) autoCursorCooldownCounter++;
+ else
+ {
+ autoCursorCooldownCounter = 0; // GLOBAL: Cursor cooldown counter
+ autoCursorDelayCounter = 0; // GLOBAL: Cursor delay counter
+ }
+
+ // Blink-cursor frame counter
+ //if (!autoCursorMode) blinkCursorFrameCounter++;
+ //else blinkCursorFrameCounter = 0;
+
+ // Update control
+ //--------------------------------------------------------------------
+ // WARNING: Text editing is only supported under certain conditions:
+ if ((state != STATE_DISABLED) && // Control not disabled
+ !GuiGetStyle(TEXTBOX, TEXT_READONLY) && // TextBox not on read-only mode
+ !guiLocked && // Gui not locked
+ !guiSliderDragging && // No gui slider on dragging
+ (wrapMode == TEXT_WRAP_NONE)) // No wrap mode
+ {
+ Vector2 mousePosition = GetMousePosition();
+
+ if (editMode)
+ {
+ state = STATE_PRESSED;
+
+ // If text does not fit in the textbox and current cursor position is out of bounds,
+ // we add an index offset to text for drawing only what requires depending on cursor
+ while (textWidth >= textBounds.width)
+ {
+ int nextCodepointSize = 0;
+ GetCodepointNext(text + textIndexOffset, &nextCodepointSize);
+
+ textIndexOffset += nextCodepointSize;
+
+ textWidth = GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex);
+ }
+
+ int textLength = (int)strlen(text); // Get current text length
+ int codepoint = GetCharPressed(); // Get Unicode codepoint
+ if (multiline && IsKeyPressed(KEY_ENTER)) codepoint = (int)'\n';
+
+ if (textBoxCursorIndex > textLength) textBoxCursorIndex = textLength;
+
+ // Encode codepoint as UTF-8
+ int codepointSize = 0;
+ const char *charEncoded = CodepointToUTF8(codepoint, &codepointSize);
+
+ // Add codepoint to text, at current cursor position
+ // NOTE: Make sure we do not overflow buffer size
+ if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < bufferSize))
+ {
+ // Move forward data from cursor position
+ for (int i = (textLength + codepointSize); i > textBoxCursorIndex; i--) text[i] = text[i - codepointSize];
+
+ // Add new codepoint in current cursor position
+ for (int i = 0; i < codepointSize; i++) text[textBoxCursorIndex + i] = charEncoded[i];
+
+ textBoxCursorIndex += codepointSize;
+ textLength += codepointSize;
+
+ // Make sure text last character is EOL
+ text[textLength] = '\0';
+ }
+
+ // Move cursor to start
+ if ((textLength > 0) && IsKeyPressed(KEY_HOME)) textBoxCursorIndex = 0;
+
+ // Move cursor to end
+ if ((textLength > textBoxCursorIndex) && IsKeyPressed(KEY_END)) textBoxCursorIndex = textLength;
+
+ // Delete codepoint from text, after current cursor position
+ if ((textLength > textBoxCursorIndex) && (IsKeyPressed(KEY_DELETE) || (IsKeyDown(KEY_DELETE) && (autoCursorCooldownCounter >= RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN))))
+ {
+ autoCursorDelayCounter++;
+
+ if (IsKeyPressed(KEY_DELETE) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames
+ {
+ int nextCodepointSize = 0;
+ GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize);
+
+ // Move backward text from cursor position
+ for (int i = textBoxCursorIndex; i < textLength; i++) text[i] = text[i + nextCodepointSize];
+
+ textLength -= codepointSize;
+
+ // Make sure text last character is EOL
+ text[textLength] = '\0';
+ }
+ }
+
+ // Delete codepoint from text, before current cursor position
+ if ((textLength > 0) && (IsKeyPressed(KEY_BACKSPACE) || (IsKeyDown(KEY_BACKSPACE) && (autoCursorCooldownCounter >= RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN))))
+ {
+ autoCursorDelayCounter++;
+
+ if (IsKeyPressed(KEY_BACKSPACE) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames
+ {
+ int prevCodepointSize = 0;
+ GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize);
+
+ // Move backward text from cursor position
+ for (int i = (textBoxCursorIndex - prevCodepointSize); i < textLength; i++) text[i] = text[i + prevCodepointSize];
+
+ // Prevent cursor index from decrementing past 0
+ if (textBoxCursorIndex > 0)
+ {
+ textBoxCursorIndex -= codepointSize;
+ textLength -= codepointSize;
+ }
+
+ // Make sure text last character is EOL
+ text[textLength] = '\0';
+ }
+ }
+
+ // Move cursor position with keys
+ if (IsKeyPressed(KEY_LEFT) || (IsKeyDown(KEY_LEFT) && (autoCursorCooldownCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)))
+ {
+ autoCursorDelayCounter++;
+
+ if (IsKeyPressed(KEY_LEFT) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames
+ {
+ int prevCodepointSize = 0;
+ GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize);
+
+ if (textBoxCursorIndex >= prevCodepointSize) textBoxCursorIndex -= prevCodepointSize;
+ }
+ }
+ else if (IsKeyPressed(KEY_RIGHT) || (IsKeyDown(KEY_RIGHT) && (autoCursorCooldownCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)))
+ {
+ autoCursorDelayCounter++;
+
+ if (IsKeyPressed(KEY_RIGHT) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames
+ {
+ int nextCodepointSize = 0;
+ GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize);
+
+ if ((textBoxCursorIndex + nextCodepointSize) <= textLength) textBoxCursorIndex += nextCodepointSize;
+ }
+ }
+
+ // Move cursor position with mouse
+ if (CheckCollisionPointRec(mousePosition, textBounds)) // Mouse hover text
+ {
+ float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize;
+ int codepoint = 0;
+ int codepointSize = 0;
+ int codepointIndex = 0;
+ float glyphWidth = 0.0f;
+ float widthToMouseX = 0;
+ int mouseCursorIndex = 0;
+
+ for (int i = textIndexOffset; i < textLength; i++)
+ {
+ codepoint = GetCodepointNext(&text[i], &codepointSize);
+ codepointIndex = GetGlyphIndex(guiFont, codepoint);
+
+ if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor);
+ else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor);
+
+ if (mousePosition.x <= (textBounds.x + (widthToMouseX + glyphWidth/2)))
+ {
+ mouseCursor.x = textBounds.x + widthToMouseX;
+ mouseCursorIndex = i;
+ break;
+ }
+
+ widthToMouseX += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
+ }
+
+ // Check if mouse cursor is at the last position
+ int textEndWidth = GetTextWidth(text + textIndexOffset);
+ if (GetMousePosition().x >= (textBounds.x + textEndWidth - glyphWidth/2))
+ {
+ mouseCursor.x = textBounds.x + textEndWidth;
+ mouseCursorIndex = strlen(text);
+ }
+
+ // Place cursor at required index on mouse click
+ if ((mouseCursor.x >= 0) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ cursor.x = mouseCursor.x;
+ textBoxCursorIndex = mouseCursorIndex;
+ }
+ }
+ else mouseCursor.x = -1;
+
+ // Recalculate cursor position.y depending on textBoxCursorIndex
+ cursor.x = bounds.x + GuiGetStyle(TEXTBOX, TEXT_PADDING) + GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex) + GuiGetStyle(DEFAULT, TEXT_SPACING);
+ //if (multiline) cursor.y = GetTextLines()
+
+ // Finish text editing on ENTER or mouse click outside bounds
+ if ((!multiline && IsKeyPressed(KEY_ENTER)) ||
+ (!CheckCollisionPointRec(mousePosition, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)))
+ {
+ textBoxCursorIndex = 0; // GLOBAL: Reset the shared cursor index
+ result = 1;
+ }
+ }
+ else
+ {
+ if (CheckCollisionPointRec(mousePosition, bounds))
+ {
+ state = STATE_FOCUSED;
+
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ textBoxCursorIndex = (int)strlen(text); // GLOBAL: Place cursor index to the end of current text
+ result = 1;
+ }
+ }
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (state == STATE_PRESSED)
+ {
+ GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED)));
+ }
+ else if (state == STATE_DISABLED)
+ {
+ GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED)));
+ }
+ else GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), BLANK);
+
+ // Draw text considering index offset if required
+ // NOTE: Text index offset depends on cursor position
+ GuiDrawText(text + textIndexOffset, textBounds, GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))));
+
+ // Draw cursor
+ if (editMode && !GuiGetStyle(TEXTBOX, TEXT_READONLY))
+ {
+ //if (autoCursorMode || ((blinkCursorFrameCounter/40)%2 == 0))
+ GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)));
+
+ // Draw mouse position cursor (if required)
+ if (mouseCursor.x >= 0) GuiDrawRectangle(mouseCursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)));
+ }
+ else if (state == STATE_FOCUSED) GuiTooltip(bounds);
+ //--------------------------------------------------------------------
+
+ return result; // Mouse button pressed: result = 1
+}
+
+/*
+// Text Box control with multiple lines and word-wrap
+// NOTE: This text-box is readonly, no editing supported by default
+bool GuiTextBoxMulti(Rectangle bounds, char *text, int bufferSize, bool editMode)
+{
+ bool pressed = false;
+
+ GuiSetStyle(TEXTBOX, TEXT_READONLY, 1);
+ GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_WORD); // WARNING: If wrap mode enabled, text editing is not supported
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_TOP);
+
+ // TODO: Implement methods to calculate cursor position properly
+ pressed = GuiTextBox(bounds, text, bufferSize, editMode);
+
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE);
+ GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE);
+ GuiSetStyle(TEXTBOX, TEXT_READONLY, 0);
+
+ return pressed;
+}
+*/
+
+// Spinner control, returns selected value
+int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode)
+{
+ int result = 1;
+ GuiState state = guiState;
+
+ int tempValue = *value;
+
+ Rectangle spinner = { bounds.x + GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING), bounds.y,
+ bounds.width - 2*(GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING)), bounds.height };
+ Rectangle leftButtonBound = { (float)bounds.x, (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height };
+ Rectangle rightButtonBound = { (float)bounds.x + bounds.width - GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height };
+
+ Rectangle textBounds = { 0 };
+ if (text != NULL)
+ {
+ textBounds.width = (float)GetTextWidth(text) + 2;
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(SPINNER, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+ if (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SPINNER, TEXT_PADDING);
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check spinner state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+ }
+ }
+
+#if defined(RAYGUI_NO_ICONS)
+ if (GuiButton(leftButtonBound, "<")) tempValue--;
+ if (GuiButton(rightButtonBound, ">")) tempValue++;
+#else
+ if (GuiButton(leftButtonBound, GuiIconText(ICON_ARROW_LEFT_FILL, NULL))) tempValue--;
+ if (GuiButton(rightButtonBound, GuiIconText(ICON_ARROW_RIGHT_FILL, NULL))) tempValue++;
+#endif
+
+ if (!editMode)
+ {
+ if (tempValue < minValue) tempValue = minValue;
+ if (tempValue > maxValue) tempValue = maxValue;
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ result = GuiValueBox(spinner, NULL, &tempValue, minValue, maxValue, editMode);
+
+ // Draw value selector custom buttons
+ // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values
+ int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH);
+ int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(SPINNER, BORDER_WIDTH));
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth);
+
+ // Draw text label if provided
+ GuiDrawText(text, textBounds, (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3))));
+ //--------------------------------------------------------------------
+
+ *value = tempValue;
+ return result;
+}
+
+// Value Box control, updates input text with numbers
+// NOTE: Requires static variables: frameCounter
+int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode)
+{
+ #if !defined(RAYGUI_VALUEBOX_MAX_CHARS)
+ #define RAYGUI_VALUEBOX_MAX_CHARS 32
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0";
+ sprintf(textValue, "%i", *value);
+
+ Rectangle textBounds = { 0 };
+ if (text != NULL)
+ {
+ textBounds.width = (float)GetTextWidth(text) + 2;
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+ if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING);
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ bool valueHasChanged = false;
+
+ if (editMode)
+ {
+ state = STATE_PRESSED;
+
+ int keyCount = (int)strlen(textValue);
+
+ // Only allow keys in range [48..57]
+ if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS)
+ {
+ if (GetTextWidth(textValue) < bounds.width)
+ {
+ int key = GetCharPressed();
+ if ((key >= 48) && (key <= 57))
+ {
+ textValue[keyCount] = (char)key;
+ keyCount++;
+ valueHasChanged = true;
+ }
+ }
+ }
+
+ // Delete text
+ if (keyCount > 0)
+ {
+ if (IsKeyPressed(KEY_BACKSPACE))
+ {
+ keyCount--;
+ textValue[keyCount] = '\0';
+ valueHasChanged = true;
+ }
+ }
+
+ if (valueHasChanged) *value = TextToInteger(textValue);
+
+ // NOTE: We are not clamp values until user input finishes
+ //if (*value > maxValue) *value = maxValue;
+ //else if (*value < minValue) *value = minValue;
+
+ if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) result = 1;
+ }
+ else
+ {
+ if (*value > maxValue) *value = maxValue;
+ else if (*value < minValue) *value = minValue;
+
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = STATE_FOCUSED;
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1;
+ }
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ Color baseColor = BLANK;
+ if (state == STATE_PRESSED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED));
+ else if (state == STATE_DISABLED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED));
+
+ GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), GetColor(GuiGetStyle(VALUEBOX, BORDER + (state*3))), baseColor);
+ GuiDrawText(textValue, GetTextBounds(VALUEBOX, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(VALUEBOX, TEXT + (state*3))));
+
+ // Draw cursor
+ if (editMode)
+ {
+ // NOTE: ValueBox internal text is always centered
+ Rectangle cursor = { bounds.x + GetTextWidth(textValue)/2 + bounds.width/2 + 1, bounds.y + 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), 4, bounds.height - 4*GuiGetStyle(VALUEBOX, BORDER_WIDTH) };
+ GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED)));
+ }
+
+ // Draw text label if provided
+ GuiDrawText(text, textBounds, (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3))));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Slider control with pro parameters
+// NOTE: Other GuiSlider*() controls use this one
+int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ float temp = (maxValue - minValue)/2.0f;
+ if (value == NULL) value = &temp;
+
+ int sliderValue = (int)(((*value - minValue)/(maxValue - minValue))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH)));
+
+ Rectangle slider = { bounds.x, bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING),
+ 0, bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) };
+
+ if (sliderWidth > 0) // Slider
+ {
+ slider.x += (sliderValue - sliderWidth/2);
+ slider.width = (float)sliderWidth;
+ }
+ else if (sliderWidth == 0) // SliderBar
+ {
+ slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH);
+ slider.width = (float)sliderValue;
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (guiSliderDragging) // Keep dragging outside of bounds
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
+ {
+ state = STATE_PRESSED;
+
+ // Get equivalent value and slider position from mousePosition.x
+ *value = ((maxValue - minValue)*(mousePoint.x - (float)(bounds.x + sliderWidth/2)))/(float)(bounds.width - sliderWidth) + minValue;
+ }
+ }
+ else
+ {
+ guiSliderDragging = false;
+ guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
+ }
+ }
+ else if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+ guiSliderDragging = true;
+ guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
+
+ if (!CheckCollisionPointRec(mousePoint, slider))
+ {
+ // Get equivalent value and slider position from mousePosition.x
+ *value = ((maxValue - minValue)*(mousePoint.x - (float)(bounds.x + sliderWidth/2)))/(float)(bounds.width - sliderWidth) + minValue;
+
+ if (sliderWidth > 0) slider.x = mousePoint.x - slider.width/2; // Slider
+ else if (sliderWidth == 0) slider.width = (float)sliderValue; // SliderBar
+ }
+ }
+ else state = STATE_FOCUSED;
+ }
+
+ if (*value > maxValue) *value = maxValue;
+ else if (*value < minValue) *value = minValue;
+ }
+
+ // Bar limits check
+ if (sliderWidth > 0) // Slider
+ {
+ if (slider.x <= (bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH);
+ else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) slider.x = bounds.x + bounds.width - slider.width - GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ else if (sliderWidth == 0) // SliderBar
+ {
+ if (slider.width > bounds.width) slider.width = bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH);
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)));
+
+ // Draw slider internal bar (depends on state)
+ if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)));
+ else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED)));
+ else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_PRESSED)));
+
+ // Draw left/right text if provided
+ if (textLeft != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textLeft);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SLIDER, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))));
+ }
+
+ if (textRight != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textRight);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(SLIDER, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))));
+ }
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Slider control extended, returns selected value and has text
+int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue)
+{
+ return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH));
+}
+
+// Slider Bar control extended, returns selected value
+int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue)
+{
+ return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, 0);
+}
+
+// Progress Bar control extended, shows current progress value
+int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ float temp = (maxValue - minValue)/2.0f;
+ if (value == NULL) value = &temp;
+
+ // Progress bar
+ Rectangle progress = { bounds.x + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH),
+ bounds.y + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) + GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING), 0,
+ bounds.height - 2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) - 2*GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING) };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if (*value > maxValue) *value = maxValue;
+
+ // WARNING: Working with floats could lead to rounding issues
+ if ((state != STATE_DISABLED)) progress.width = (float)(*value/(maxValue - minValue))*bounds.width - ((*value >= maxValue) ? (float)(2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)) : 0.0f);
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (state == STATE_DISABLED)
+ {
+ GuiDrawRectangle(bounds, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(PROGRESSBAR, BORDER + (state*3))), BLANK);
+ }
+ else
+ {
+ if (*value > minValue)
+ {
+ // Draw progress bar with colored border, more visual
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED)));
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED)));
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED)));
+ }
+ else GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL)));
+
+ if (*value >= maxValue) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + progress.width + 1, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED)));
+ else
+ {
+ // Draw borders not yet reached by value
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + 1, bounds.y, bounds.width - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL)));
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + 1, bounds.y + bounds.height - 1, bounds.width - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL)));
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL)));
+ }
+
+ // Draw slider internal progress bar (depends on state)
+ GuiDrawRectangle(progress, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BASE_COLOR_PRESSED)));
+ }
+
+ // Draw left/right text if provided
+ if (textLeft != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textLeft);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x - textBounds.width - GuiGetStyle(PROGRESSBAR, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3))));
+ }
+
+ if (textRight != NULL)
+ {
+ Rectangle textBounds = { 0 };
+ textBounds.width = (float)GetTextWidth(textRight);
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ textBounds.x = bounds.x + bounds.width + GuiGetStyle(PROGRESSBAR, TEXT_PADDING);
+ textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+
+ GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3))));
+ }
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Status Bar control
+int GuiStatusBar(Rectangle bounds, const char *text)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(STATUSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(STATUSBAR, BORDER + (state*3))), GetColor(GuiGetStyle(STATUSBAR, BASE + (state*3))));
+ GuiDrawText(text, GetTextBounds(STATUSBAR, bounds), GuiGetStyle(STATUSBAR, TEXT_ALIGNMENT), GetColor(GuiGetStyle(STATUSBAR, TEXT + (state*3))));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Dummy rectangle control, intended for placeholding
+int GuiDummyRec(Rectangle bounds, const char *text)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check button state
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED;
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)));
+ GuiDrawText(text, GetTextBounds(DEFAULT, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(BUTTON, (state != STATE_DISABLED)? TEXT_COLOR_NORMAL : TEXT_COLOR_DISABLED)));
+ //------------------------------------------------------------------
+
+ return result;
+}
+
+// List View control
+int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active)
+{
+ int result = 0;
+ int itemCount = 0;
+ const char **items = NULL;
+
+ if (text != NULL) items = GuiTextSplit(text, ';', &itemCount, NULL);
+
+ result = GuiListViewEx(bounds, items, itemCount, scrollIndex, active, NULL);
+
+ return result;
+}
+
+// List View control with extended parameters
+int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus)
+{
+ int result = 0;
+ GuiState state = guiState;
+
+ int itemFocused = (focus == NULL)? -1 : *focus;
+ int itemSelected = (active == NULL)? -1 : *active;
+
+ // Check if we need a scroll bar
+ bool useScrollBar = false;
+ if ((GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING))*count > bounds.height) useScrollBar = true;
+
+ // Define base item rectangle [0]
+ Rectangle itemBounds = { 0 };
+ itemBounds.x = bounds.x + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING);
+ itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ itemBounds.width = bounds.width - 2*GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) - GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ itemBounds.height = (float)GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT);
+ if (useScrollBar) itemBounds.width -= GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH);
+
+ // Get items on the list
+ int visibleItems = (int)bounds.height/(GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING));
+ if (visibleItems > count) visibleItems = count;
+
+ int startIndex = (scrollIndex == NULL)? 0 : *scrollIndex;
+ if ((startIndex < 0) || (startIndex > (count - visibleItems))) startIndex = 0;
+ int endIndex = startIndex + visibleItems;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ // Check mouse inside list view
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = STATE_FOCUSED;
+
+ // Check focused and selected item
+ for (int i = 0; i < visibleItems; i++)
+ {
+ if (CheckCollisionPointRec(mousePoint, itemBounds))
+ {
+ itemFocused = startIndex + i;
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ if (itemSelected == (startIndex + i)) itemSelected = -1;
+ else itemSelected = startIndex + i;
+ }
+ break;
+ }
+
+ // Update item rectangle y position for next item
+ itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING));
+ }
+
+ if (useScrollBar)
+ {
+ int wheelMove = (int)GetMouseWheelMove();
+ startIndex -= wheelMove;
+
+ if (startIndex < 0) startIndex = 0;
+ else if (startIndex > (count - visibleItems)) startIndex = count - visibleItems;
+
+ endIndex = startIndex + visibleItems;
+ if (endIndex > count) endIndex = count;
+ }
+ }
+ else itemFocused = -1;
+
+ // Reset item rectangle y to [0]
+ itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH);
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background
+
+ // Draw visible items
+ for (int i = 0; ((i < visibleItems) && (text != NULL)); i++)
+ {
+ if (state == STATE_DISABLED)
+ {
+ if ((startIndex + i) == itemSelected) GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED)));
+
+ GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED)));
+ }
+ else
+ {
+ if (((startIndex + i) == itemSelected) && (active != NULL))
+ {
+ // Draw item selected
+ GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED)));
+ GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED)));
+ }
+ else if (((startIndex + i) == itemFocused)) // && (focus != NULL)) // NOTE: We want items focused, despite not returned!
+ {
+ // Draw item focused
+ GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED)));
+ GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED)));
+ }
+ else
+ {
+ // Draw item normal
+ GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL)));
+ }
+ }
+
+ // Update item rectangle y position for next item
+ itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING));
+ }
+
+ if (useScrollBar)
+ {
+ Rectangle scrollBarBounds = {
+ bounds.x + bounds.width - GuiGetStyle(LISTVIEW, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH),
+ bounds.y + GuiGetStyle(LISTVIEW, BORDER_WIDTH), (float)GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH),
+ bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH)
+ };
+
+ // Calculate percentage of visible items and apply same percentage to scrollbar
+ float percentVisible = (float)(endIndex - startIndex)/count;
+ float sliderSize = bounds.height*percentVisible;
+
+ int prevSliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); // Save default slider size
+ int prevScrollSpeed = GuiGetStyle(SCROLLBAR, SCROLL_SPEED); // Save default scroll speed
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)sliderSize); // Change slider size
+ GuiSetStyle(SCROLLBAR, SCROLL_SPEED, count - visibleItems); // Change scroll speed
+
+ startIndex = GuiScrollBar(scrollBarBounds, startIndex, 0, count - visibleItems);
+
+ GuiSetStyle(SCROLLBAR, SCROLL_SPEED, prevScrollSpeed); // Reset scroll speed to default
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, prevSliderSize); // Reset slider size to default
+ }
+ //--------------------------------------------------------------------
+
+ if (active != NULL) *active = itemSelected;
+ if (focus != NULL) *focus = itemFocused;
+ if (scrollIndex != NULL) *scrollIndex = startIndex;
+
+ return result;
+}
+
+// Color Panel control
+int GuiColorPanel(Rectangle bounds, const char *text, Color *color)
+{
+ int result = 0;
+ GuiState state = guiState;
+ Vector2 pickerSelector = { 0 };
+
+ const Color colWhite = { 255, 255, 255, 255 };
+ const Color colBlack = { 0, 0, 0, 255 };
+
+ Vector3 vcolor = { (float)color->r/255.0f, (float)color->g/255.0f, (float)color->b/255.0f };
+ Vector3 hsv = ConvertRGBtoHSV(vcolor);
+
+ pickerSelector.x = bounds.x + (float)hsv.y*bounds.width; // HSV: Saturation
+ pickerSelector.y = bounds.y + (1.0f - (float)hsv.z)*bounds.height; // HSV: Value
+
+ float hue = -1.0f;
+ Vector3 maxHue = { hue >= 0.0f ? hue : hsv.x, 1.0f, 1.0f };
+ Vector3 rgbHue = ConvertHSVtoRGB(maxHue);
+ Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x),
+ (unsigned char)(255.0f*rgbHue.y),
+ (unsigned char)(255.0f*rgbHue.z), 255 };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+ pickerSelector = mousePoint;
+
+ // Calculate color from picker
+ Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y };
+
+ colorPick.x /= (float)bounds.width; // Get normalized value on x
+ colorPick.y /= (float)bounds.height; // Get normalized value on y
+
+ hsv.y = colorPick.x;
+ hsv.z = 1.0f - colorPick.y;
+
+ Vector3 rgb = ConvertHSVtoRGB(hsv);
+
+ // NOTE: Vector3ToColor() only available on raylib 1.8.1
+ *color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x),
+ (unsigned char)(255.0f*rgb.y),
+ (unsigned char)(255.0f*rgb.z),
+ (unsigned char)(255.0f*(float)color->a/255.0f) };
+
+ }
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (state != STATE_DISABLED)
+ {
+ DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha));
+ DrawRectangleGradientEx(bounds, Fade(colBlack, 0), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, 0));
+
+ // Draw color picker: selector
+ Rectangle selector = { pickerSelector.x - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, pickerSelector.y - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE) };
+ GuiDrawRectangle(selector, 0, BLANK, colWhite);
+ }
+ else
+ {
+ DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.6f), guiAlpha));
+ }
+
+ GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK);
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Color Bar Alpha control
+// NOTE: Returns alpha value normalized [0..1]
+int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha)
+{
+ #if !defined(RAYGUI_COLORBARALPHA_CHECKED_SIZE)
+ #define RAYGUI_COLORBARALPHA_CHECKED_SIZE 10
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+ Rectangle selector = { (float)bounds.x + (*alpha)*bounds.width - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.y - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT), (float)bounds.height + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2 };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (guiSliderDragging) // Keep dragging outside of bounds
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
+ {
+ state = STATE_PRESSED;
+
+ *alpha = (mousePoint.x - bounds.x)/bounds.width;
+ if (*alpha <= 0.0f) *alpha = 0.0f;
+ if (*alpha >= 1.0f) *alpha = 1.0f;
+ }
+ }
+ else
+ {
+ guiSliderDragging = false;
+ guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
+ }
+ }
+ else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+ guiSliderDragging = true;
+ guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
+
+ *alpha = (mousePoint.x - bounds.x)/bounds.width;
+ if (*alpha <= 0.0f) *alpha = 0.0f;
+ if (*alpha >= 1.0f) *alpha = 1.0f;
+ //selector.x = bounds.x + (int)(((alpha - 0)/(100 - 0))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH))) - selector.width/2;
+ }
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+
+ // Draw alpha bar: checked background
+ if (state != STATE_DISABLED)
+ {
+ int checksX = (int)bounds.width/RAYGUI_COLORBARALPHA_CHECKED_SIZE;
+ int checksY = (int)bounds.height/RAYGUI_COLORBARALPHA_CHECKED_SIZE;
+
+ for (int x = 0; x < checksX; x++)
+ {
+ for (int y = 0; y < checksY; y++)
+ {
+ Rectangle check = { bounds.x + x*RAYGUI_COLORBARALPHA_CHECKED_SIZE, bounds.y + y*RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE };
+ GuiDrawRectangle(check, 0, BLANK, ((x + y)%2)? Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.4f) : Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.4f));
+ }
+ }
+
+ DrawRectangleGradientEx(bounds, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha));
+ }
+ else DrawRectangleGradientEx(bounds, Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha));
+
+ GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK);
+
+ // Draw alpha bar: selector
+ GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Color Bar Hue control
+// Returns hue value normalized [0..1]
+// NOTE: Other similar bars (for reference):
+// Color GuiColorBarSat() [WHITE->color]
+// Color GuiColorBarValue() [BLACK->color], HSV/HSL
+// float GuiColorBarLuminance() [BLACK->WHITE]
+int GuiColorBarHue(Rectangle bounds, const char *text, float *hue)
+{
+ int result = 0;
+ GuiState state = guiState;
+ Rectangle selector = { (float)bounds.x - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)bounds.y + (*hue)/360.0f*bounds.height - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2, (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT) };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (guiSliderDragging) // Keep dragging outside of bounds
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
+ {
+ state = STATE_PRESSED;
+
+ *hue = (mousePoint.y - bounds.y)*360/bounds.height;
+ if (*hue <= 0.0f) *hue = 0.0f;
+ if (*hue >= 359.0f) *hue = 359.0f;
+ }
+ }
+ else
+ {
+ guiSliderDragging = false;
+ guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
+ }
+ }
+ else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+ guiSliderDragging = true;
+ guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
+
+ *hue = (mousePoint.y - bounds.y)*360/bounds.height;
+ if (*hue <= 0.0f) *hue = 0.0f;
+ if (*hue >= 359.0f) *hue = 359.0f;
+
+ }
+ else state = STATE_FOCUSED;
+
+ /*if (IsKeyDown(KEY_UP))
+ {
+ hue -= 2.0f;
+ if (hue <= 0.0f) hue = 0.0f;
+ }
+ else if (IsKeyDown(KEY_DOWN))
+ {
+ hue += 2.0f;
+ if (hue >= 360.0f) hue = 360.0f;
+ }*/
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (state != STATE_DISABLED)
+ {
+ // Draw hue bar:color bars
+ // TODO: Use directly DrawRectangleGradientEx(bounds, color1, color2, color2, color1);
+ DrawRectangleGradientV((int)bounds.x, (int)(bounds.y), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha));
+ DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + bounds.height/6), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha));
+ DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 2*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha));
+ DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 3*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha));
+ DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 4*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha));
+ DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 5*(bounds.height/6)), (int)bounds.width, (int)(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha));
+ }
+ else DrawRectangleGradientV((int)bounds.x, (int)bounds.y, (int)bounds.width, (int)bounds.height, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha));
+
+ GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK);
+
+ // Draw hue bar: selector
+ GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)));
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Color Picker control
+// NOTE: It's divided in multiple controls:
+// Color GuiColorPanel(Rectangle bounds, Color color)
+// float GuiColorBarAlpha(Rectangle bounds, float alpha)
+// float GuiColorBarHue(Rectangle bounds, float value)
+// NOTE: bounds define GuiColorPanel() size
+int GuiColorPicker(Rectangle bounds, const char *text, Color *color)
+{
+ int result = 0;
+
+ Color temp = { 200, 0, 0, 255 };
+ if (color == NULL) color = &temp;
+
+ GuiColorPanel(bounds, NULL, color);
+
+ Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height };
+ //Rectangle boundsAlpha = { bounds.x, bounds.y + bounds.height + GuiGetStyle(COLORPICKER, BARS_PADDING), bounds.width, GuiGetStyle(COLORPICKER, BARS_THICK) };
+
+ Vector3 hsv = ConvertRGBtoHSV(RAYGUI_CLITERAL(Vector3){ (*color).r/255.0f, (*color).g/255.0f, (*color).b/255.0f });
+
+ GuiColorBarHue(boundsHue, NULL, &hsv.x);
+
+ //color.a = (unsigned char)(GuiColorBarAlpha(boundsAlpha, (float)color.a/255.0f)*255.0f);
+ Vector3 rgb = ConvertHSVtoRGB(hsv);
+
+ *color = RAYGUI_CLITERAL(Color){ (unsigned char)roundf(rgb.x*255.0f), (unsigned char)roundf(rgb.y*255.0f), (unsigned char)roundf(rgb.z*255.0f), (*color).a };
+
+ return result;
+}
+
+// Color Picker control that avoids conversion to RGB and back to HSV on each call, thus avoiding jittering.
+// The user can call ConvertHSVtoRGB() to convert *colorHsv value to RGB.
+// NOTE: It's divided in multiple controls:
+// int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
+// int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha)
+// float GuiColorBarHue(Rectangle bounds, float value)
+// NOTE: bounds define GuiColorPanelHSV() size
+int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
+{
+ int result = 0;
+
+ Vector3 tempHsv = { 0 };
+
+ if (colorHsv == NULL)
+ {
+ const Vector3 tempColor = { 200.0f/255.0f, 0.0f, 0.0f };
+ tempHsv = ConvertRGBtoHSV(tempColor);
+ colorHsv = &tempHsv;
+ }
+
+ GuiColorPanelHSV(bounds, NULL, colorHsv);
+
+ const Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height };
+
+ GuiColorBarHue(boundsHue, NULL, &colorHsv->x);
+
+ return result;
+}
+
+// Color Panel control, returns HSV color value in *colorHsv.
+// Used by GuiColorPickerHSV()
+int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
+{
+ int result = 0;
+ GuiState state = guiState;
+ Vector2 pickerSelector = { 0 };
+
+ const Color colWhite = { 255, 255, 255, 255 };
+ const Color colBlack = { 0, 0, 0, 255 };
+
+ pickerSelector.x = bounds.x + (float)colorHsv->y*bounds.width; // HSV: Saturation
+ pickerSelector.y = bounds.y + (1.0f - (float)colorHsv->z)*bounds.height; // HSV: Value
+
+ float hue = -1.0f;
+ Vector3 maxHue = { hue >= 0.0f ? hue : colorHsv->x, 1.0f, 1.0f };
+ Vector3 rgbHue = ConvertHSVtoRGB(maxHue);
+ Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x),
+ (unsigned char)(255.0f*rgbHue.y),
+ (unsigned char)(255.0f*rgbHue.z), 255 };
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
+ {
+ state = STATE_PRESSED;
+ pickerSelector = mousePoint;
+
+ // Calculate color from picker
+ Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y };
+
+ colorPick.x /= (float)bounds.width; // Get normalized value on x
+ colorPick.y /= (float)bounds.height; // Get normalized value on y
+
+ colorHsv->y = colorPick.x;
+ colorHsv->z = 1.0f - colorPick.y;
+ }
+ else state = STATE_FOCUSED;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (state != STATE_DISABLED)
+ {
+ DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha));
+ DrawRectangleGradientEx(bounds, Fade(colBlack, 0), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, 0));
+
+ // Draw color picker: selector
+ Rectangle selector = { pickerSelector.x - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, pickerSelector.y - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE) };
+ GuiDrawRectangle(selector, 0, BLANK, colWhite);
+ }
+ else
+ {
+ DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.6f), guiAlpha));
+ }
+
+ GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK);
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Message Box control
+int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons)
+{
+ #if !defined(RAYGUI_MESSAGEBOX_BUTTON_HEIGHT)
+ #define RAYGUI_MESSAGEBOX_BUTTON_HEIGHT 24
+ #endif
+ #if !defined(RAYGUI_MESSAGEBOX_BUTTON_PADDING)
+ #define RAYGUI_MESSAGEBOX_BUTTON_PADDING 12
+ #endif
+
+ int result = -1; // Returns clicked button from buttons list, 0 refers to closed window button
+
+ int buttonCount = 0;
+ const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL);
+ Rectangle buttonBounds = { 0 };
+ buttonBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING;
+ buttonBounds.y = bounds.y + bounds.height - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT - RAYGUI_MESSAGEBOX_BUTTON_PADDING;
+ buttonBounds.width = (bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount;
+ buttonBounds.height = RAYGUI_MESSAGEBOX_BUTTON_HEIGHT;
+
+ int textWidth = GetTextWidth(message) + 2;
+
+ Rectangle textBounds = { 0 };
+ textBounds.x = bounds.x + bounds.width/2 - textWidth/2;
+ textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + RAYGUI_MESSAGEBOX_BUTTON_PADDING;
+ textBounds.width = (float)textWidth;
+ textBounds.height = bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 3*RAYGUI_MESSAGEBOX_BUTTON_PADDING - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT;
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (GuiWindowBox(bounds, title)) result = 0;
+
+ int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT);
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ GuiLabel(textBounds, message);
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment);
+
+ prevTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ for (int i = 0; i < buttonCount; i++)
+ {
+ if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1;
+ buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING);
+ }
+
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevTextAlignment);
+ //--------------------------------------------------------------------
+
+ return result;
+}
+
+// Text Input Box control, ask for text
+int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive)
+{
+ #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT)
+ #define RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT 24
+ #endif
+ #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_PADDING)
+ #define RAYGUI_TEXTINPUTBOX_BUTTON_PADDING 12
+ #endif
+ #if !defined(RAYGUI_TEXTINPUTBOX_HEIGHT)
+ #define RAYGUI_TEXTINPUTBOX_HEIGHT 26
+ #endif
+
+ // Used to enable text edit mode
+ // WARNING: No more than one GuiTextInputBox() should be open at the same time
+ static bool textEditMode = false;
+
+ int result = -1;
+
+ int buttonCount = 0;
+ const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL);
+ Rectangle buttonBounds = { 0 };
+ buttonBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING;
+ buttonBounds.y = bounds.y + bounds.height - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING;
+ buttonBounds.width = (bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount;
+ buttonBounds.height = RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT;
+
+ int messageInputHeight = (int)bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - 2*RAYGUI_TEXTINPUTBOX_BUTTON_PADDING;
+
+ Rectangle textBounds = { 0 };
+ if (message != NULL)
+ {
+ int textSize = GetTextWidth(message) + 2;
+
+ textBounds.x = bounds.x + bounds.width/2 - textSize/2;
+ textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + messageInputHeight/4 - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/2;
+ textBounds.width = (float)textSize;
+ textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+ }
+
+ Rectangle textBoxBounds = { 0 };
+ textBoxBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING;
+ textBoxBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - RAYGUI_TEXTINPUTBOX_HEIGHT/2;
+ if (message == NULL) textBoxBounds.y = bounds.y + 24 + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING;
+ else textBoxBounds.y += (messageInputHeight/2 + messageInputHeight/4);
+ textBoxBounds.width = bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*2;
+ textBoxBounds.height = RAYGUI_TEXTINPUTBOX_HEIGHT;
+
+ // Draw control
+ //--------------------------------------------------------------------
+ if (GuiWindowBox(bounds, title)) result = 0;
+
+ // Draw message if available
+ if (message != NULL)
+ {
+ int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT);
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ GuiLabel(textBounds, message);
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment);
+ }
+
+ if (secretViewActive != NULL)
+ {
+ static char stars[] = "****************";
+ if (GuiTextBox(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x, textBoxBounds.y, textBoxBounds.width - 4 - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.height },
+ ((*secretViewActive == 1) || textEditMode)? text : stars, textMaxSize, textEditMode)) textEditMode = !textEditMode;
+
+ GuiToggle(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x + textBoxBounds.width - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.y, RAYGUI_TEXTINPUTBOX_HEIGHT, RAYGUI_TEXTINPUTBOX_HEIGHT }, (*secretViewActive == 1)? "#44#" : "#45#", secretViewActive);
+ }
+ else
+ {
+ if (GuiTextBox(textBoxBounds, text, textMaxSize, textEditMode)) textEditMode = !textEditMode;
+ }
+
+ int prevBtnTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ for (int i = 0; i < buttonCount; i++)
+ {
+ if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1;
+ buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING);
+ }
+
+ if (result >= 0) textEditMode = false;
+
+ GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevBtnTextAlignment);
+ //--------------------------------------------------------------------
+
+ return result; // Result is the pressed button index
+}
+
+// Grid control
+// NOTE: Returns grid mouse-hover selected cell
+// About drawing lines at subpixel spacing, simple put, not easy solution:
+// https://stackoverflow.com/questions/4435450/2d-opengl-drawing-lines-that-dont-exactly-fit-pixel-raster
+int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell)
+{
+ // Grid lines alpha amount
+ #if !defined(RAYGUI_GRID_ALPHA)
+ #define RAYGUI_GRID_ALPHA 0.15f
+ #endif
+
+ int result = 0;
+ GuiState state = guiState;
+
+ Vector2 mousePoint = GetMousePosition();
+ Vector2 currentMouseCell = { 0 };
+
+ float spaceWidth = spacing/(float)subdivs;
+ int linesV = (int)(bounds.width/spaceWidth) + 1;
+ int linesH = (int)(bounds.height/spaceWidth) + 1;
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
+ {
+ if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ // NOTE: Cell values must be the upper left of the cell the mouse is in
+ currentMouseCell.x = floorf((mousePoint.x - bounds.x)/spacing);
+ currentMouseCell.y = floorf((mousePoint.y - bounds.y)/spacing);
+ }
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ switch (state)
+ {
+ case STATE_NORMAL:
+ {
+ if (subdivs > 0)
+ {
+ // Draw vertical grid lines
+ for (int i = 0; i < linesV; i++)
+ {
+ Rectangle lineV = { bounds.x + spacing*i/subdivs, bounds.y, 1, bounds.height };
+ GuiDrawRectangle(lineV, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA));
+ }
+
+ // Draw horizontal grid lines
+ for (int i = 0; i < linesH; i++)
+ {
+ Rectangle lineH = { bounds.x, bounds.y + spacing*i/subdivs, bounds.width, 1 };
+ GuiDrawRectangle(lineH, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA));
+ }
+ }
+ } break;
+ default: break;
+ }
+
+ if (mouseCell != NULL) *mouseCell = currentMouseCell;
+ return result;
+}
+
+//----------------------------------------------------------------------------------
+// Tooltip management functions
+// NOTE: Tooltips requires some global variables: tooltipPtr
+//----------------------------------------------------------------------------------
+// Enable gui tooltips (global state)
+void GuiEnableTooltip(void) { guiTooltip = true; }
+
+// Disable gui tooltips (global state)
+void GuiDisableTooltip(void) { guiTooltip = false; }
+
+// Set tooltip string
+void GuiSetTooltip(const char *tooltip) { guiTooltipPtr = tooltip; }
+
+
+//----------------------------------------------------------------------------------
+// Styles loading functions
+//----------------------------------------------------------------------------------
+
+// Load raygui style file (.rgs)
+// NOTE: By default a binary file is expected, that file could contain a custom font,
+// in that case, custom font image atlas is GRAY+ALPHA and pixel data can be compressed (DEFLATE)
+void GuiLoadStyle(const char *fileName)
+{
+ #define MAX_LINE_BUFFER_SIZE 256
+
+ bool tryBinary = false;
+
+ // Try reading the files as text file first
+ FILE *rgsFile = fopen(fileName, "rt");
+
+ if (rgsFile != NULL)
+ {
+ char buffer[MAX_LINE_BUFFER_SIZE] = { 0 };
+ fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile);
+
+ if (buffer[0] == '#')
+ {
+ int controlId = 0;
+ int propertyId = 0;
+ unsigned int propertyValue = 0;
+
+ while (!feof(rgsFile))
+ {
+ switch (buffer[0])
+ {
+ case 'p':
+ {
+ // Style property: p
+
+ sscanf(buffer, "p %d %d 0x%x", &controlId, &propertyId, &propertyValue);
+ GuiSetStyle(controlId, propertyId, (int)propertyValue);
+
+ } break;
+ case 'f':
+ {
+ // Style font: f
+
+ int fontSize = 0;
+ char charmapFileName[256] = { 0 };
+ char fontFileName[256] = { 0 };
+ sscanf(buffer, "f %d %s %[^\r\n]s", &fontSize, charmapFileName, fontFileName);
+
+ Font font = { 0 };
+ int *codepoints = NULL;
+ int codepointCount = 0;
+
+ if (charmapFileName[0] != '0')
+ {
+ // Load text data from file
+ // NOTE: Expected an UTF-8 array of codepoints, no separation
+ char *textData = LoadFileText(TextFormat("%s/%s", GetDirectoryPath(fileName), charmapFileName));
+ codepoints = LoadCodepoints(textData, &codepointCount);
+ UnloadFileText(textData);
+ }
+
+ if (fontFileName[0] != '\0')
+ {
+ // In case a font is already loaded and it is not default internal font, unload it
+ if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture);
+
+ if (codepointCount > 0) font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, codepoints, codepointCount);
+ else font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, NULL, 0); // Default to 95 standard codepoints
+ }
+
+ // If font texture not properly loaded, revert to default font and size/spacing
+ if (font.texture.id == 0)
+ {
+ font = GetFontDefault();
+ GuiSetStyle(DEFAULT, TEXT_SIZE, 10);
+ GuiSetStyle(DEFAULT, TEXT_SPACING, 1);
+ }
+
+ UnloadCodepoints(codepoints);
+
+ if ((font.texture.id > 0) && (font.glyphCount > 0)) GuiSetFont(font);
+
+ } break;
+ default: break;
+ }
+
+ fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile);
+ }
+ }
+ else tryBinary = true;
+
+ fclose(rgsFile);
+ }
+
+ if (tryBinary)
+ {
+ rgsFile = fopen(fileName, "rb");
+
+ if (rgsFile != NULL)
+ {
+ fseek(rgsFile, 0, SEEK_END);
+ int fileDataSize = ftell(rgsFile);
+ fseek(rgsFile, 0, SEEK_SET);
+
+ if (fileDataSize > 0)
+ {
+ unsigned char *fileData = (unsigned char *)RAYGUI_MALLOC(fileDataSize*sizeof(unsigned char));
+ fread(fileData, sizeof(unsigned char), fileDataSize, rgsFile);
+
+ GuiLoadStyleFromMemory(fileData, fileDataSize);
+
+ RAYGUI_FREE(fileData);
+ }
+
+ fclose(rgsFile);
+ }
+ }
+}
+
+// Load style default over global style
+void GuiLoadStyleDefault(void)
+{
+ // We set this variable first to avoid cyclic function calls
+ // when calling GuiSetStyle() and GuiGetStyle()
+ guiStyleLoaded = true;
+
+ // Initialize default LIGHT style property values
+ // WARNING: Default value are applied to all controls on set but
+ // they can be overwritten later on for every custom control
+ GuiSetStyle(DEFAULT, BORDER_COLOR_NORMAL, 0x838383ff);
+ GuiSetStyle(DEFAULT, BASE_COLOR_NORMAL, 0xc9c9c9ff);
+ GuiSetStyle(DEFAULT, TEXT_COLOR_NORMAL, 0x686868ff);
+ GuiSetStyle(DEFAULT, BORDER_COLOR_FOCUSED, 0x5bb2d9ff);
+ GuiSetStyle(DEFAULT, BASE_COLOR_FOCUSED, 0xc9effeff);
+ GuiSetStyle(DEFAULT, TEXT_COLOR_FOCUSED, 0x6c9bbcff);
+ GuiSetStyle(DEFAULT, BORDER_COLOR_PRESSED, 0x0492c7ff);
+ GuiSetStyle(DEFAULT, BASE_COLOR_PRESSED, 0x97e8ffff);
+ GuiSetStyle(DEFAULT, TEXT_COLOR_PRESSED, 0x368bafff);
+ GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, 0xb5c1c2ff);
+ GuiSetStyle(DEFAULT, BASE_COLOR_DISABLED, 0xe6e9e9ff);
+ GuiSetStyle(DEFAULT, TEXT_COLOR_DISABLED, 0xaeb7b8ff);
+ GuiSetStyle(DEFAULT, BORDER_WIDTH, 1);
+ GuiSetStyle(DEFAULT, TEXT_PADDING, 0);
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+
+ // Initialize default extended property values
+ // NOTE: By default, extended property values are initialized to 0
+ GuiSetStyle(DEFAULT, TEXT_SIZE, 10); // DEFAULT, shared by all controls
+ GuiSetStyle(DEFAULT, TEXT_SPACING, 1); // DEFAULT, shared by all controls
+ GuiSetStyle(DEFAULT, LINE_COLOR, 0x90abb5ff); // DEFAULT specific property
+ GuiSetStyle(DEFAULT, BACKGROUND_COLOR, 0xf5f5f5ff); // DEFAULT specific property
+ GuiSetStyle(DEFAULT, TEXT_LINE_SPACING, 15); // DEFAULT, 15 pixels between lines
+ GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); // DEFAULT, text aligned vertically to middle of text-bounds
+
+ // Initialize control-specific property values
+ // NOTE: Those properties are in default list but require specific values by control type
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiSetStyle(BUTTON, BORDER_WIDTH, 2);
+ GuiSetStyle(SLIDER, TEXT_PADDING, 4);
+ GuiSetStyle(PROGRESSBAR, TEXT_PADDING, 4);
+ GuiSetStyle(CHECKBOX, TEXT_PADDING, 4);
+ GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_RIGHT);
+ GuiSetStyle(DROPDOWNBOX, TEXT_PADDING, 0);
+ GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ GuiSetStyle(TEXTBOX, TEXT_PADDING, 4);
+ GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiSetStyle(VALUEBOX, TEXT_PADDING, 0);
+ GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiSetStyle(SPINNER, TEXT_PADDING, 0);
+ GuiSetStyle(SPINNER, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+ GuiSetStyle(STATUSBAR, TEXT_PADDING, 8);
+ GuiSetStyle(STATUSBAR, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
+
+ // Initialize extended property values
+ // NOTE: By default, extended property values are initialized to 0
+ GuiSetStyle(TOGGLE, GROUP_PADDING, 2);
+ GuiSetStyle(SLIDER, SLIDER_WIDTH, 16);
+ GuiSetStyle(SLIDER, SLIDER_PADDING, 1);
+ GuiSetStyle(PROGRESSBAR, PROGRESS_PADDING, 1);
+ GuiSetStyle(CHECKBOX, CHECK_PADDING, 1);
+ GuiSetStyle(COMBOBOX, COMBO_BUTTON_WIDTH, 32);
+ GuiSetStyle(COMBOBOX, COMBO_BUTTON_SPACING, 2);
+ GuiSetStyle(DROPDOWNBOX, ARROW_PADDING, 16);
+ GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 2);
+ GuiSetStyle(SPINNER, SPIN_BUTTON_WIDTH, 24);
+ GuiSetStyle(SPINNER, SPIN_BUTTON_SPACING, 2);
+ GuiSetStyle(SCROLLBAR, BORDER_WIDTH, 0);
+ GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, 0);
+ GuiSetStyle(SCROLLBAR, ARROWS_SIZE, 6);
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, 0);
+ GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, 16);
+ GuiSetStyle(SCROLLBAR, SCROLL_PADDING, 0);
+ GuiSetStyle(SCROLLBAR, SCROLL_SPEED, 12);
+ GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, 28);
+ GuiSetStyle(LISTVIEW, LIST_ITEMS_SPACING, 2);
+ GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 12);
+ GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, SCROLLBAR_RIGHT_SIDE);
+ GuiSetStyle(COLORPICKER, COLOR_SELECTOR_SIZE, 8);
+ GuiSetStyle(COLORPICKER, HUEBAR_WIDTH, 16);
+ GuiSetStyle(COLORPICKER, HUEBAR_PADDING, 8);
+ GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT, 8);
+ GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW, 2);
+
+ if (guiFont.texture.id != GetFontDefault().texture.id)
+ {
+ // Unload previous font texture
+ UnloadTexture(guiFont.texture);
+ RL_FREE(guiFont.recs);
+ RL_FREE(guiFont.glyphs);
+ guiFont.recs = NULL;
+ guiFont.glyphs = NULL;
+
+ // Setup default raylib font
+ guiFont = GetFontDefault();
+
+ // NOTE: Default raylib font character 95 is a white square
+ Rectangle whiteChar = guiFont.recs[95];
+
+ // NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding on MSAA filtering
+ SetShapesTexture(guiFont.texture, RAYGUI_CLITERAL(Rectangle){ whiteChar.x + 1, whiteChar.y + 1, whiteChar.width - 2, whiteChar.height - 2 });
+ }
+}
+
+// Get text with icon id prepended
+// NOTE: Useful to add icons by name id (enum) instead of
+// a number that can change between ricon versions
+const char *GuiIconText(int iconId, const char *text)
+{
+#if defined(RAYGUI_NO_ICONS)
+ return NULL;
+#else
+ static char buffer[1024] = { 0 };
+ static char iconBuffer[6] = { 0 };
+
+ if (text != NULL)
+ {
+ memset(buffer, 0, 1024);
+ sprintf(buffer, "#%03i#", iconId);
+
+ for (int i = 5; i < 1024; i++)
+ {
+ buffer[i] = text[i - 5];
+ if (text[i - 5] == '\0') break;
+ }
+
+ return buffer;
+ }
+ else
+ {
+ sprintf(iconBuffer, "#%03i#", iconId & 0x1ff);
+
+ return iconBuffer;
+ }
+#endif
+}
+
+#if !defined(RAYGUI_NO_ICONS)
+// Get full icons data pointer
+unsigned int *GuiGetIcons(void) { return guiIconsPtr; }
+
+// Load raygui icons file (.rgi)
+// NOTE: In case nameIds are required, they can be requested with loadIconsName,
+// they are returned as a guiIconsName[iconCount][RAYGUI_ICON_MAX_NAME_LENGTH],
+// WARNING: guiIconsName[]][] memory should be manually freed!
+char **GuiLoadIcons(const char *fileName, bool loadIconsName)
+{
+ // Style File Structure (.rgi)
+ // ------------------------------------------------------
+ // Offset | Size | Type | Description
+ // ------------------------------------------------------
+ // 0 | 4 | char | Signature: "rGI "
+ // 4 | 2 | short | Version: 100
+ // 6 | 2 | short | reserved
+
+ // 8 | 2 | short | Num icons (N)
+ // 10 | 2 | short | Icons size (Options: 16, 32, 64) (S)
+
+ // Icons name id (32 bytes per name id)
+ // foreach (icon)
+ // {
+ // 12+32*i | 32 | char | Icon NameId
+ // }
+
+ // Icons data: One bit per pixel, stored as unsigned int array (depends on icon size)
+ // S*S pixels/32bit per unsigned int = K unsigned int per icon
+ // foreach (icon)
+ // {
+ // ... | K | unsigned int | Icon Data
+ // }
+
+ FILE *rgiFile = fopen(fileName, "rb");
+
+ char **guiIconsName = NULL;
+
+ if (rgiFile != NULL)
+ {
+ char signature[5] = { 0 };
+ short version = 0;
+ short reserved = 0;
+ short iconCount = 0;
+ short iconSize = 0;
+
+ fread(signature, 1, 4, rgiFile);
+ fread(&version, sizeof(short), 1, rgiFile);
+ fread(&reserved, sizeof(short), 1, rgiFile);
+ fread(&iconCount, sizeof(short), 1, rgiFile);
+ fread(&iconSize, sizeof(short), 1, rgiFile);
+
+ if ((signature[0] == 'r') &&
+ (signature[1] == 'G') &&
+ (signature[2] == 'I') &&
+ (signature[3] == ' '))
+ {
+ if (loadIconsName)
+ {
+ guiIconsName = (char **)RAYGUI_MALLOC(iconCount*sizeof(char **));
+ for (int i = 0; i < iconCount; i++)
+ {
+ guiIconsName[i] = (char *)RAYGUI_MALLOC(RAYGUI_ICON_MAX_NAME_LENGTH);
+ fread(guiIconsName[i], 1, RAYGUI_ICON_MAX_NAME_LENGTH, rgiFile);
+ }
+ }
+ else fseek(rgiFile, iconCount*RAYGUI_ICON_MAX_NAME_LENGTH, SEEK_CUR);
+
+ // Read icons data directly over internal icons array
+ fread(guiIconsPtr, sizeof(unsigned int), iconCount*(iconSize*iconSize/32), rgiFile);
+ }
+
+ fclose(rgiFile);
+ }
+
+ return guiIconsName;
+}
+
+// Draw selected icon using rectangles pixel-by-pixel
+void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color)
+{
+ #define BIT_CHECK(a,b) ((a) & (1u<<(b)))
+
+ for (int i = 0, y = 0; i < RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32; i++)
+ {
+ for (int k = 0; k < 32; k++)
+ {
+ if (BIT_CHECK(guiIconsPtr[iconId*RAYGUI_ICON_DATA_ELEMENTS + i], k))
+ {
+ #if !defined(RAYGUI_STANDALONE)
+ GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ (float)posX + (k%RAYGUI_ICON_SIZE)*pixelSize, (float)posY + y*pixelSize, (float)pixelSize, (float)pixelSize }, 0, BLANK, color);
+ #endif
+ }
+
+ if ((k == 15) || (k == 31)) y++;
+ }
+ }
+}
+
+// Set icon drawing size
+void GuiSetIconScale(int scale)
+{
+ if (scale >= 1) guiIconScale = scale;
+}
+
+#endif // !RAYGUI_NO_ICONS
+
+//----------------------------------------------------------------------------------
+// Module specific Functions Definition
+//----------------------------------------------------------------------------------
+
+// Load style from memory
+// WARNING: Binary files only
+static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize)
+{
+ unsigned char *fileDataPtr = (unsigned char *)fileData;
+
+ char signature[5] = { 0 };
+ short version = 0;
+ short reserved = 0;
+ int propertyCount = 0;
+
+ memcpy(signature, fileDataPtr, 4);
+ memcpy(&version, fileDataPtr + 4, sizeof(short));
+ memcpy(&reserved, fileDataPtr + 4 + 2, sizeof(short));
+ memcpy(&propertyCount, fileDataPtr + 4 + 2 + 2, sizeof(int));
+ fileDataPtr += 12;
+
+ if ((signature[0] == 'r') &&
+ (signature[1] == 'G') &&
+ (signature[2] == 'S') &&
+ (signature[3] == ' '))
+ {
+ short controlId = 0;
+ short propertyId = 0;
+ unsigned int propertyValue = 0;
+
+ for (int i = 0; i < propertyCount; i++)
+ {
+ memcpy(&controlId, fileDataPtr, sizeof(short));
+ memcpy(&propertyId, fileDataPtr + 2, sizeof(short));
+ memcpy(&propertyValue, fileDataPtr + 2 + 2, sizeof(unsigned int));
+ fileDataPtr += 8;
+
+ if (controlId == 0) // DEFAULT control
+ {
+ // If a DEFAULT property is loaded, it is propagated to all controls
+ // NOTE: All DEFAULT properties should be defined first in the file
+ GuiSetStyle(0, (int)propertyId, propertyValue);
+
+ if (propertyId < RAYGUI_MAX_PROPS_BASE) for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) GuiSetStyle(i, (int)propertyId, propertyValue);
+ }
+ else GuiSetStyle((int)controlId, (int)propertyId, propertyValue);
+ }
+
+ // Font loading is highly dependant on raylib API to load font data and image
+
+#if !defined(RAYGUI_STANDALONE)
+ // Load custom font if available
+ int fontDataSize = 0;
+ memcpy(&fontDataSize, fileDataPtr, sizeof(int));
+ fileDataPtr += 4;
+
+ if (fontDataSize > 0)
+ {
+ Font font = { 0 };
+ int fontType = 0; // 0-Normal, 1-SDF
+
+ memcpy(&font.baseSize, fileDataPtr, sizeof(int));
+ memcpy(&font.glyphCount, fileDataPtr + 4, sizeof(int));
+ memcpy(&fontType, fileDataPtr + 4 + 4, sizeof(int));
+ fileDataPtr += 12;
+
+ // Load font white rectangle
+ Rectangle fontWhiteRec = { 0 };
+ memcpy(&fontWhiteRec, fileDataPtr, sizeof(Rectangle));
+ fileDataPtr += 16;
+
+ // Load font image parameters
+ int fontImageUncompSize = 0;
+ int fontImageCompSize = 0;
+ memcpy(&fontImageUncompSize, fileDataPtr, sizeof(int));
+ memcpy(&fontImageCompSize, fileDataPtr + 4, sizeof(int));
+ fileDataPtr += 8;
+
+ Image imFont = { 0 };
+ imFont.mipmaps = 1;
+ memcpy(&imFont.width, fileDataPtr, sizeof(int));
+ memcpy(&imFont.height, fileDataPtr + 4, sizeof(int));
+ memcpy(&imFont.format, fileDataPtr + 4 + 4, sizeof(int));
+ fileDataPtr += 12;
+
+ if ((fontImageCompSize > 0) && (fontImageCompSize != fontImageUncompSize))
+ {
+ // Compressed font atlas image data (DEFLATE), it requires DecompressData()
+ int dataUncompSize = 0;
+ unsigned char *compData = (unsigned char *)RAYGUI_MALLOC(fontImageCompSize);
+ memcpy(compData, fileDataPtr, fontImageCompSize);
+ fileDataPtr += fontImageCompSize;
+
+ imFont.data = DecompressData(compData, fontImageCompSize, &dataUncompSize);
+
+ // Security check, dataUncompSize must match the provided fontImageUncompSize
+ if (dataUncompSize != fontImageUncompSize) RAYGUI_LOG("WARNING: Uncompressed font atlas image data could be corrupted");
+
+ RAYGUI_FREE(compData);
+ }
+ else
+ {
+ // Font atlas image data is not compressed
+ imFont.data = (unsigned char *)RAYGUI_MALLOC(fontImageUncompSize);
+ memcpy(imFont.data, fileDataPtr, fontImageUncompSize);
+ fileDataPtr += fontImageUncompSize;
+ }
+
+ if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture);
+ font.texture = LoadTextureFromImage(imFont);
+
+ RAYGUI_FREE(imFont.data);
+
+ // Validate font atlas texture was loaded correctly
+ if (font.texture.id != 0)
+ {
+ // Load font recs data
+ int recsDataSize = font.glyphCount*sizeof(Rectangle);
+ int recsDataCompressedSize = 0;
+
+ // WARNING: Version 400 adds the compression size parameter
+ if (version >= 400)
+ {
+ // RGS files version 400 support compressed recs data
+ memcpy(&recsDataCompressedSize, fileDataPtr, sizeof(int));
+ fileDataPtr += sizeof(int);
+ }
+
+ if ((recsDataCompressedSize > 0) && (recsDataCompressedSize != recsDataSize))
+ {
+ // Recs data is compressed, uncompress it
+ unsigned char *recsDataCompressed = (unsigned char *)RAYGUI_MALLOC(recsDataCompressedSize);
+
+ memcpy(recsDataCompressed, fileDataPtr, recsDataCompressedSize);
+ fileDataPtr += recsDataCompressedSize;
+
+ int recsDataUncompSize = 0;
+ font.recs = (Rectangle *)DecompressData(recsDataCompressed, recsDataCompressedSize, &recsDataUncompSize);
+
+ // Security check, data uncompressed size must match the expected original data size
+ if (recsDataUncompSize != recsDataSize) RAYGUI_LOG("WARNING: Uncompressed font recs data could be corrupted");
+
+ RAYGUI_FREE(recsDataCompressed);
+ }
+ else
+ {
+ // Recs data is uncompressed
+ font.recs = (Rectangle *)RAYGUI_CALLOC(font.glyphCount, sizeof(Rectangle));
+ for (int i = 0; i < font.glyphCount; i++)
+ {
+ memcpy(&font.recs[i], fileDataPtr, sizeof(Rectangle));
+ fileDataPtr += sizeof(Rectangle);
+ }
+ }
+
+ // Load font glyphs info data
+ int glyphsDataSize = font.glyphCount*16; // 16 bytes data per glyph
+ int glyphsDataCompressedSize = 0;
+
+ // WARNING: Version 400 adds the compression size parameter
+ if (version >= 400)
+ {
+ // RGS files version 400 support compressed glyphs data
+ memcpy(&glyphsDataCompressedSize, fileDataPtr, sizeof(int));
+ fileDataPtr += sizeof(int);
+ }
+
+ // Allocate required glyphs space to fill with data
+ font.glyphs = (GlyphInfo *)RAYGUI_CALLOC(font.glyphCount, sizeof(GlyphInfo));
+
+ if ((glyphsDataCompressedSize > 0) && (glyphsDataCompressedSize != glyphsDataSize))
+ {
+ // Glyphs data is compressed, uncompress it
+ unsigned char *glypsDataCompressed = (unsigned char *)RAYGUI_MALLOC(glyphsDataCompressedSize);
+
+ memcpy(glypsDataCompressed, fileDataPtr, glyphsDataCompressedSize);
+ fileDataPtr += glyphsDataCompressedSize;
+
+ int glyphsDataUncompSize = 0;
+ unsigned char *glyphsDataUncomp = DecompressData(glypsDataCompressed, glyphsDataCompressedSize, &glyphsDataUncompSize);
+
+ // Security check, data uncompressed size must match the expected original data size
+ if (glyphsDataUncompSize != glyphsDataSize) RAYGUI_LOG("WARNING: Uncompressed font glyphs data could be corrupted");
+
+ unsigned char *glyphsDataUncompPtr = glyphsDataUncomp;
+
+ for (int i = 0; i < font.glyphCount; i++)
+ {
+ memcpy(&font.glyphs[i].value, glyphsDataUncompPtr, sizeof(int));
+ memcpy(&font.glyphs[i].offsetX, glyphsDataUncompPtr + 4, sizeof(int));
+ memcpy(&font.glyphs[i].offsetY, glyphsDataUncompPtr + 8, sizeof(int));
+ memcpy(&font.glyphs[i].advanceX, glyphsDataUncompPtr + 12, sizeof(int));
+ glyphsDataUncompPtr += 16;
+ }
+
+ RAYGUI_FREE(glypsDataCompressed);
+ RAYGUI_FREE(glyphsDataUncomp);
+ }
+ else
+ {
+ // Glyphs data is uncompressed
+ for (int i = 0; i < font.glyphCount; i++)
+ {
+ memcpy(&font.glyphs[i].value, fileDataPtr, sizeof(int));
+ memcpy(&font.glyphs[i].offsetX, fileDataPtr + 4, sizeof(int));
+ memcpy(&font.glyphs[i].offsetY, fileDataPtr + 8, sizeof(int));
+ memcpy(&font.glyphs[i].advanceX, fileDataPtr + 12, sizeof(int));
+ fileDataPtr += 16;
+ }
+ }
+ }
+ else font = GetFontDefault(); // Fallback in case of errors loading font atlas texture
+
+ GuiSetFont(font);
+
+ // Set font texture source rectangle to be used as white texture to draw shapes
+ // NOTE: It makes possible to draw shapes and text (full UI) in a single draw call
+ if ((fontWhiteRec.x > 0) &&
+ (fontWhiteRec.y > 0) &&
+ (fontWhiteRec.width > 0) &&
+ (fontWhiteRec.height > 0)) SetShapesTexture(font.texture, fontWhiteRec);
+ }
+#endif
+ }
+}
+
+// Gui get text width considering icon
+static int GetTextWidth(const char *text)
+{
+ #if !defined(ICON_TEXT_PADDING)
+ #define ICON_TEXT_PADDING 4
+ #endif
+
+ Vector2 textSize = { 0 };
+ int textIconOffset = 0;
+
+ if ((text != NULL) && (text[0] != '\0'))
+ {
+ if (text[0] == '#')
+ {
+ for (int i = 1; (i < 5) && (text[i] != '\0'); i++)
+ {
+ if (text[i] == '#')
+ {
+ textIconOffset = i;
+ break;
+ }
+ }
+ }
+
+ text += textIconOffset;
+
+ // Make sure guiFont is set, GuiGetStyle() initializes it lazynessly
+ float fontSize = (float)GuiGetStyle(DEFAULT, TEXT_SIZE);
+
+ // Custom MeasureText() implementation
+ if ((guiFont.texture.id > 0) && (text != NULL))
+ {
+ // Get size in bytes of text, considering end of line and line break
+ int size = 0;
+ for (int i = 0; i < MAX_LINE_BUFFER_SIZE; i++)
+ {
+ if ((text[i] != '\0') && (text[i] != '\n')) size++;
+ else break;
+ }
+
+ float scaleFactor = fontSize/(float)guiFont.baseSize;
+ textSize.y = (float)guiFont.baseSize*scaleFactor;
+ float glyphWidth = 0.0f;
+
+ for (int i = 0, codepointSize = 0; i < size; i += codepointSize)
+ {
+ int codepoint = GetCodepointNext(&text[i], &codepointSize);
+ int codepointIndex = GetGlyphIndex(guiFont, codepoint);
+
+ if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor);
+ else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor);
+
+ textSize.x += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
+ }
+ }
+
+ if (textIconOffset > 0) textSize.x += (RAYGUI_ICON_SIZE - ICON_TEXT_PADDING);
+ }
+
+ return (int)textSize.x;
+}
+
+// Get text bounds considering control bounds
+static Rectangle GetTextBounds(int control, Rectangle bounds)
+{
+ Rectangle textBounds = bounds;
+
+ textBounds.x = bounds.x + GuiGetStyle(control, BORDER_WIDTH);
+ textBounds.y = bounds.y + GuiGetStyle(control, BORDER_WIDTH) + GuiGetStyle(control, TEXT_PADDING);
+ textBounds.width = bounds.width - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING);
+ textBounds.height = bounds.height - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); // NOTE: Text is processed line per line!
+
+ // Depending on control, TEXT_PADDING and TEXT_ALIGNMENT properties could affect the text-bounds
+ switch (control)
+ {
+ case COMBOBOX:
+ case DROPDOWNBOX:
+ case LISTVIEW:
+ // TODO: Special cases (no label): COMBOBOX, DROPDOWNBOX, LISTVIEW
+ case SLIDER:
+ case CHECKBOX:
+ case VALUEBOX:
+ case SPINNER:
+ // TODO: More special cases (label on side): SLIDER, CHECKBOX, VALUEBOX, SPINNER
+ default:
+ {
+ // TODO: WARNING: TEXT_ALIGNMENT is already considered in GuiDrawText()
+ if (GuiGetStyle(control, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT) textBounds.x -= GuiGetStyle(control, TEXT_PADDING);
+ else textBounds.x += GuiGetStyle(control, TEXT_PADDING);
+ }
+ break;
+ }
+
+ return textBounds;
+}
+
+// Get text icon if provided and move text cursor
+// NOTE: We support up to 999 values for iconId
+static const char *GetTextIcon(const char *text, int *iconId)
+{
+#if !defined(RAYGUI_NO_ICONS)
+ *iconId = -1;
+ if (text[0] == '#') // Maybe we have an icon!
+ {
+ char iconValue[4] = { 0 }; // Maximum length for icon value: 3 digits + '\0'
+
+ int pos = 1;
+ while ((pos < 4) && (text[pos] >= '0') && (text[pos] <= '9'))
+ {
+ iconValue[pos - 1] = text[pos];
+ pos++;
+ }
+
+ if (text[pos] == '#')
+ {
+ *iconId = TextToInteger(iconValue);
+
+ // Move text pointer after icon
+ // WARNING: If only icon provided, it could point to EOL character: '\0'
+ if (*iconId >= 0) text += (pos + 1);
+ }
+ }
+#endif
+
+ return text;
+}
+
+// Get text divided into lines (by line-breaks '\n')
+const char **GetTextLines(const char *text, int *count)
+{
+ #define RAYGUI_MAX_TEXT_LINES 128
+
+ static const char *lines[RAYGUI_MAX_TEXT_LINES] = { 0 };
+ for (int i = 0; i < RAYGUI_MAX_TEXT_LINES; i++) lines[i] = NULL; // Init NULL pointers to substrings
+
+ int textSize = (int)strlen(text);
+
+ lines[0] = text;
+ int len = 0;
+ *count = 1;
+ //int lineSize = 0; // Stores current line size, not returned
+
+ for (int i = 0, k = 0; (i < textSize) && (*count < RAYGUI_MAX_TEXT_LINES); i++)
+ {
+ if (text[i] == '\n')
+ {
+ //lineSize = len;
+ k++;
+ lines[k] = &text[i + 1]; // WARNING: next value is valid?
+ len = 0;
+ *count += 1;
+ }
+ else len++;
+ }
+
+ //lines[*count - 1].size = len;
+
+ return lines;
+}
+
+// Get text width to next space for provided string
+static float GetNextSpaceWidth(const char *text, int *nextSpaceIndex)
+{
+ float width = 0;
+ int codepointByteCount = 0;
+ int codepoint = 0;
+ int index = 0;
+ float glyphWidth = 0;
+ float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize;
+
+ for (int i = 0; text[i] != '\0'; i++)
+ {
+ if (text[i] != ' ')
+ {
+ codepoint = GetCodepoint(&text[i], &codepointByteCount);
+ index = GetGlyphIndex(guiFont, codepoint);
+ glyphWidth = (guiFont.glyphs[index].advanceX == 0)? guiFont.recs[index].width*scaleFactor : guiFont.glyphs[index].advanceX*scaleFactor;
+ width += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
+ }
+ else
+ {
+ *nextSpaceIndex = i;
+ break;
+ }
+ }
+
+ return width;
+}
+
+// Gui draw text using default font
+static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint)
+{
+ #define TEXT_VALIGN_PIXEL_OFFSET(h) ((int)h%2) // Vertical alignment for pixel perfect
+
+ #if !defined(ICON_TEXT_PADDING)
+ #define ICON_TEXT_PADDING 4
+ #endif
+
+ if ((text == NULL) || (text[0] == '\0')) return; // Security check
+
+ // PROCEDURE:
+ // - Text is processed line per line
+ // - For every line, horizontal alignment is defined
+ // - For all text, vertical alignment is defined (multiline text only)
+ // - For every line, wordwrap mode is checked (useful for GuitextBox(), read-only)
+
+ // Get text lines (using '\n' as delimiter) to be processed individually
+ // WARNING: We can't use GuiTextSplit() function because it can be already used
+ // before the GuiDrawText() call and its buffer is static, it would be overriden :(
+ int lineCount = 0;
+ const char **lines = GetTextLines(text, &lineCount);
+
+ // Text style variables
+ //int alignment = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT);
+ int alignmentVertical = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL);
+ int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); // Wrap-mode only available in read-only mode, no for text editing
+
+ // TODO: WARNING: This totalHeight is not valid for vertical alignment in case of word-wrap
+ float totalHeight = (float)(lineCount*GuiGetStyle(DEFAULT, TEXT_SIZE) + (lineCount - 1)*GuiGetStyle(DEFAULT, TEXT_SIZE)/2);
+ float posOffsetY = 0.0f;
+
+ for (int i = 0; i < lineCount; i++)
+ {
+ int iconId = 0;
+ lines[i] = GetTextIcon(lines[i], &iconId); // Check text for icon and move cursor
+
+ // Get text position depending on alignment and iconId
+ //---------------------------------------------------------------------------------
+ Vector2 textBoundsPosition = { textBounds.x, textBounds.y };
+
+ // NOTE: We get text size after icon has been processed
+ // WARNING: GetTextWidth() also processes text icon to get width! -> Really needed?
+ int textSizeX = GetTextWidth(lines[i]);
+
+ // If text requires an icon, add size to measure
+ if (iconId >= 0)
+ {
+ textSizeX += RAYGUI_ICON_SIZE*guiIconScale;
+
+ // WARNING: If only icon provided, text could be pointing to EOF character: '\0'
+#if !defined(RAYGUI_NO_ICONS)
+ if ((lines[i] != NULL) && (lines[i][0] != '\0')) textSizeX += ICON_TEXT_PADDING;
+#endif
+ }
+
+ // Check guiTextAlign global variables
+ switch (alignment)
+ {
+ case TEXT_ALIGN_LEFT: textBoundsPosition.x = textBounds.x; break;
+ case TEXT_ALIGN_CENTER: textBoundsPosition.x = textBounds.x + textBounds.width/2 - textSizeX/2; break;
+ case TEXT_ALIGN_RIGHT: textBoundsPosition.x = textBounds.x + textBounds.width - textSizeX; break;
+ default: break;
+ }
+
+ switch (alignmentVertical)
+ {
+ // Only valid in case of wordWrap = 0;
+ case TEXT_ALIGN_TOP: textBoundsPosition.y = textBounds.y + posOffsetY; break;
+ case TEXT_ALIGN_MIDDLE: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height/2 - totalHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break;
+ case TEXT_ALIGN_BOTTOM: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height - totalHeight + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break;
+ default: break;
+ }
+
+ // NOTE: Make sure we get pixel-perfect coordinates,
+ // In case of decimals we got weird text positioning
+ textBoundsPosition.x = (float)((int)textBoundsPosition.x);
+ textBoundsPosition.y = (float)((int)textBoundsPosition.y);
+ //---------------------------------------------------------------------------------
+
+ // Draw text (with icon if available)
+ //---------------------------------------------------------------------------------
+#if !defined(RAYGUI_NO_ICONS)
+ if (iconId >= 0)
+ {
+ // NOTE: We consider icon height, probably different than text size
+ GuiDrawIcon(iconId, (int)textBoundsPosition.x, (int)(textBounds.y + textBounds.height/2 - RAYGUI_ICON_SIZE*guiIconScale/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height)), guiIconScale, tint);
+ textBoundsPosition.x += (RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING);
+ }
+#endif
+ // Get size in bytes of text,
+ // considering end of line and line break
+ int lineSize = 0;
+ for (int c = 0; (lines[i][c] != '\0') && (lines[i][c] != '\n') && (lines[i][c] != '\r'); c++, lineSize++){ }
+ float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize;
+
+ int textOffsetY = 0;
+ float textOffsetX = 0.0f;
+ float glyphWidth = 0;
+ for (int c = 0, codepointSize = 0; c < lineSize; c += codepointSize)
+ {
+ int codepoint = GetCodepointNext(&lines[i][c], &codepointSize);
+ int index = GetGlyphIndex(guiFont, codepoint);
+
+ // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f)
+ // but we need to draw all of the bad bytes using the '?' symbol moving one byte
+ if (codepoint == 0x3f) codepointSize = 1; // TODO: Review not recognized codepoints size
+
+ // Wrap mode text measuring to space to validate if it can be drawn or
+ // a new line is required
+ if (wrapMode == TEXT_WRAP_CHAR)
+ {
+ // Get glyph width to check if it goes out of bounds
+ if (guiFont.glyphs[index].advanceX == 0) glyphWidth = ((float)guiFont.recs[index].width*scaleFactor);
+ else glyphWidth = (float)guiFont.glyphs[index].advanceX*scaleFactor;
+
+ // Jump to next line if current character reach end of the box limits
+ if ((textOffsetX + glyphWidth) > textBounds.width)
+ {
+ textOffsetX = 0.0f;
+ textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING);
+ }
+ }
+ else if (wrapMode == TEXT_WRAP_WORD)
+ {
+ // Get width to next space in line
+ int nextSpaceIndex = 0;
+ float nextSpaceWidth = GetNextSpaceWidth(lines[i] + c, &nextSpaceIndex);
+
+ if ((textOffsetX + nextSpaceWidth) > textBounds.width)
+ {
+ textOffsetX = 0.0f;
+ textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING);
+ }
+
+ // TODO: Consider case: (nextSpaceWidth >= textBounds.width)
+ }
+
+ if (codepoint == '\n') break; // WARNING: Lines are already processed manually, no need to keep drawing after this codepoint
+ else
+ {
+ // TODO: There are multiple types of spaces in Unicode,
+ // maybe it's a good idea to add support for more: http://jkorpela.fi/chars/spaces.html
+ if ((codepoint != ' ') && (codepoint != '\t')) // Do not draw codepoints with no glyph
+ {
+ if (wrapMode == TEXT_WRAP_NONE)
+ {
+ // Draw only required text glyphs fitting the textBounds.width
+ if (textOffsetX <= (textBounds.width - glyphWidth))
+ {
+ DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha));
+ }
+ }
+ else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD))
+ {
+ // Draw only glyphs inside the bounds
+ if ((textBoundsPosition.y + textOffsetY) <= (textBounds.y + textBounds.height - GuiGetStyle(DEFAULT, TEXT_SIZE)))
+ {
+ DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha));
+ }
+ }
+ }
+
+ if (guiFont.glyphs[index].advanceX == 0) textOffsetX += ((float)guiFont.recs[index].width*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
+ else textOffsetX += ((float)guiFont.glyphs[index].advanceX*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
+ }
+ }
+
+ if (wrapMode == TEXT_WRAP_NONE) posOffsetY += (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING);
+ else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) posOffsetY += (textOffsetY + (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING));
+ //---------------------------------------------------------------------------------
+ }
+
+#if defined(RAYGUI_DEBUG_TEXT_BOUNDS)
+ GuiDrawRectangle(textBounds, 0, WHITE, Fade(BLUE, 0.4f));
+#endif
+}
+
+// Gui draw rectangle using default raygui plain style with borders
+static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color)
+{
+ if (color.a > 0)
+ {
+ // Draw rectangle filled with color
+ DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, GuiFade(color, guiAlpha));
+ }
+
+ if (borderWidth > 0)
+ {
+ // Draw rectangle border lines with color
+ DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha));
+ DrawRectangle((int)rec.x, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha));
+ DrawRectangle((int)rec.x + (int)rec.width - borderWidth, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha));
+ DrawRectangle((int)rec.x, (int)rec.y + (int)rec.height - borderWidth, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha));
+ }
+
+#if defined(RAYGUI_DEBUG_RECS_BOUNDS)
+ DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, Fade(RED, 0.4f));
+#endif
+}
+
+// Draw tooltip using control bounds
+static void GuiTooltip(Rectangle controlRec)
+{
+ if (!guiLocked && guiTooltip && (guiTooltipPtr != NULL) && !guiSliderDragging)
+ {
+ Vector2 textSize = MeasureTextEx(GuiGetFont(), guiTooltipPtr, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
+
+ if ((controlRec.x + textSize.x + 16) > GetScreenWidth()) controlRec.x -= (textSize.x + 16 - controlRec.width);
+
+ GuiPanel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, NULL);
+
+ int textPadding = GuiGetStyle(LABEL, TEXT_PADDING);
+ int textAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT);
+ GuiSetStyle(LABEL, TEXT_PADDING, 0);
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
+ GuiLabel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, guiTooltipPtr);
+ GuiSetStyle(LABEL, TEXT_ALIGNMENT, textAlignment);
+ GuiSetStyle(LABEL, TEXT_PADDING, textPadding);
+ }
+}
+
+// Split controls text into multiple strings
+// Also check for multiple columns (required by GuiToggleGroup())
+static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow)
+{
+ // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter)
+ // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated,
+ // all used memory is static... it has some limitations:
+ // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS
+ // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE
+ // NOTE: Those definitions could be externally provided if required
+
+ // TODO: HACK: GuiTextSplit() - Review how textRows are returned to user
+ // textRow is an externally provided array of integers that stores row number for every splitted string
+
+ #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS)
+ #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128
+ #endif
+ #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE)
+ #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024
+ #endif
+
+ static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; // String pointers array (points to buffer data)
+ static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; // Buffer data (text input copy with '\0' added)
+ memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE);
+
+ result[0] = buffer;
+ int counter = 1;
+
+ if (textRow != NULL) textRow[0] = 0;
+
+ // Count how many substrings we have on text and point to every one
+ for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++)
+ {
+ buffer[i] = text[i];
+ if (buffer[i] == '\0') break;
+ else if ((buffer[i] == delimiter) || (buffer[i] == '\n'))
+ {
+ result[counter] = buffer + i + 1;
+
+ if (textRow != NULL)
+ {
+ if (buffer[i] == '\n') textRow[counter] = textRow[counter - 1] + 1;
+ else textRow[counter] = textRow[counter - 1];
+ }
+
+ buffer[i] = '\0'; // Set an end of string at this point
+
+ counter++;
+ if (counter == RAYGUI_TEXTSPLIT_MAX_ITEMS) break;
+ }
+ }
+
+ *count = counter;
+
+ return result;
+}
+
+// Convert color data from RGB to HSV
+// NOTE: Color data should be passed normalized
+static Vector3 ConvertRGBtoHSV(Vector3 rgb)
+{
+ Vector3 hsv = { 0 };
+ float min = 0.0f;
+ float max = 0.0f;
+ float delta = 0.0f;
+
+ min = (rgb.x < rgb.y)? rgb.x : rgb.y;
+ min = (min < rgb.z)? min : rgb.z;
+
+ max = (rgb.x > rgb.y)? rgb.x : rgb.y;
+ max = (max > rgb.z)? max : rgb.z;
+
+ hsv.z = max; // Value
+ delta = max - min;
+
+ if (delta < 0.00001f)
+ {
+ hsv.y = 0.0f;
+ hsv.x = 0.0f; // Undefined, maybe NAN?
+ return hsv;
+ }
+
+ if (max > 0.0f)
+ {
+ // NOTE: If max is 0, this divide would cause a crash
+ hsv.y = (delta/max); // Saturation
+ }
+ else
+ {
+ // NOTE: If max is 0, then r = g = b = 0, s = 0, h is undefined
+ hsv.y = 0.0f;
+ hsv.x = 0.0f; // Undefined, maybe NAN?
+ return hsv;
+ }
+
+ // NOTE: Comparing float values could not work properly
+ if (rgb.x >= max) hsv.x = (rgb.y - rgb.z)/delta; // Between yellow & magenta
+ else
+ {
+ if (rgb.y >= max) hsv.x = 2.0f + (rgb.z - rgb.x)/delta; // Between cyan & yellow
+ else hsv.x = 4.0f + (rgb.x - rgb.y)/delta; // Between magenta & cyan
+ }
+
+ hsv.x *= 60.0f; // Convert to degrees
+
+ if (hsv.x < 0.0f) hsv.x += 360.0f;
+
+ return hsv;
+}
+
+// Convert color data from HSV to RGB
+// NOTE: Color data should be passed normalized
+static Vector3 ConvertHSVtoRGB(Vector3 hsv)
+{
+ Vector3 rgb = { 0 };
+ float hh = 0.0f, p = 0.0f, q = 0.0f, t = 0.0f, ff = 0.0f;
+ long i = 0;
+
+ // NOTE: Comparing float values could not work properly
+ if (hsv.y <= 0.0f)
+ {
+ rgb.x = hsv.z;
+ rgb.y = hsv.z;
+ rgb.z = hsv.z;
+ return rgb;
+ }
+
+ hh = hsv.x;
+ if (hh >= 360.0f) hh = 0.0f;
+ hh /= 60.0f;
+
+ i = (long)hh;
+ ff = hh - i;
+ p = hsv.z*(1.0f - hsv.y);
+ q = hsv.z*(1.0f - (hsv.y*ff));
+ t = hsv.z*(1.0f - (hsv.y*(1.0f - ff)));
+
+ switch (i)
+ {
+ case 0:
+ {
+ rgb.x = hsv.z;
+ rgb.y = t;
+ rgb.z = p;
+ } break;
+ case 1:
+ {
+ rgb.x = q;
+ rgb.y = hsv.z;
+ rgb.z = p;
+ } break;
+ case 2:
+ {
+ rgb.x = p;
+ rgb.y = hsv.z;
+ rgb.z = t;
+ } break;
+ case 3:
+ {
+ rgb.x = p;
+ rgb.y = q;
+ rgb.z = hsv.z;
+ } break;
+ case 4:
+ {
+ rgb.x = t;
+ rgb.y = p;
+ rgb.z = hsv.z;
+ } break;
+ case 5:
+ default:
+ {
+ rgb.x = hsv.z;
+ rgb.y = p;
+ rgb.z = q;
+ } break;
+ }
+
+ return rgb;
+}
+
+// Scroll bar control (used by GuiScrollPanel())
+static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue)
+{
+ GuiState state = guiState;
+
+ // Is the scrollbar horizontal or vertical?
+ bool isVertical = (bounds.width > bounds.height)? false : true;
+
+ // The size (width or height depending on scrollbar type) of the spinner buttons
+ const int spinnerSize = GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)?
+ (isVertical? (int)bounds.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) :
+ (int)bounds.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH)) : 0;
+
+ // Arrow buttons [<] [>] [∧] [∨]
+ Rectangle arrowUpLeft = { 0 };
+ Rectangle arrowDownRight = { 0 };
+
+ // Actual area of the scrollbar excluding the arrow buttons
+ Rectangle scrollbar = { 0 };
+
+ // Slider bar that moves --[///]-----
+ Rectangle slider = { 0 };
+
+ // Normalize value
+ if (value > maxValue) value = maxValue;
+ if (value < minValue) value = minValue;
+
+ const int valueRange = maxValue - minValue;
+ int sliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE);
+
+ // Calculate rectangles for all of the components
+ arrowUpLeft = RAYGUI_CLITERAL(Rectangle){
+ (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH),
+ (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH),
+ (float)spinnerSize, (float)spinnerSize };
+
+ if (isVertical)
+ {
+ arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + bounds.height - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize };
+ scrollbar = RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), arrowUpLeft.y + arrowUpLeft.height, bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)), bounds.height - arrowUpLeft.height - arrowDownRight.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) };
+
+ // Make sure the slider won't get outside of the scrollbar
+ sliderSize = (sliderSize >= scrollbar.height)? ((int)scrollbar.height - 2) : sliderSize;
+ slider = RAYGUI_CLITERAL(Rectangle){
+ bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING),
+ scrollbar.y + (int)(((float)(value - minValue)/valueRange)*(scrollbar.height - sliderSize)),
+ bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)),
+ (float)sliderSize };
+ }
+ else // horizontal
+ {
+ arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + bounds.width - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize };
+ scrollbar = RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x + arrowUpLeft.width, bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), bounds.width - arrowUpLeft.width - arrowDownRight.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH), bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)) };
+
+ // Make sure the slider won't get outside of the scrollbar
+ sliderSize = (sliderSize >= scrollbar.width)? ((int)scrollbar.width - 2) : sliderSize;
+ slider = RAYGUI_CLITERAL(Rectangle){
+ scrollbar.x + (int)(((float)(value - minValue)/valueRange)*(scrollbar.width - sliderSize)),
+ bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING),
+ (float)sliderSize,
+ bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)) };
+ }
+
+ // Update control
+ //--------------------------------------------------------------------
+ if ((state != STATE_DISABLED) && !guiLocked)
+ {
+ Vector2 mousePoint = GetMousePosition();
+
+ if (guiSliderDragging) // Keep dragging outside of bounds
+ {
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) &&
+ !CheckCollisionPointRec(mousePoint, arrowUpLeft) &&
+ !CheckCollisionPointRec(mousePoint, arrowDownRight))
+ {
+ if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
+ {
+ state = STATE_PRESSED;
+
+ if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue);
+ else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue);
+ }
+ }
+ else
+ {
+ guiSliderDragging = false;
+ guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
+ }
+ }
+ else if (CheckCollisionPointRec(mousePoint, bounds))
+ {
+ state = STATE_FOCUSED;
+
+ // Handle mouse wheel
+ int wheel = (int)GetMouseWheelMove();
+ if (wheel != 0) value += wheel;
+
+ // Handle mouse button down
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ guiSliderDragging = true;
+ guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
+
+ // Check arrows click
+ if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) value -= valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
+ else if (CheckCollisionPointRec(mousePoint, arrowDownRight)) value += valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
+ else if (!CheckCollisionPointRec(mousePoint, slider))
+ {
+ // If click on scrollbar position but not on slider, place slider directly on that position
+ if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue);
+ else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue);
+ }
+
+ state = STATE_PRESSED;
+ }
+
+ // Keyboard control on mouse hover scrollbar
+ /*
+ if (isVertical)
+ {
+ if (IsKeyDown(KEY_DOWN)) value += 5;
+ else if (IsKeyDown(KEY_UP)) value -= 5;
+ }
+ else
+ {
+ if (IsKeyDown(KEY_RIGHT)) value += 5;
+ else if (IsKeyDown(KEY_LEFT)) value -= 5;
+ }
+ */
+ }
+
+ // Normalize value
+ if (value > maxValue) value = maxValue;
+ if (value < minValue) value = minValue;
+ }
+ //--------------------------------------------------------------------
+
+ // Draw control
+ //--------------------------------------------------------------------
+ GuiDrawRectangle(bounds, GuiGetStyle(SCROLLBAR, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED))); // Draw the background
+
+ GuiDrawRectangle(scrollbar, 0, BLANK, GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL))); // Draw the scrollbar active area background
+ GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BORDER + state*3))); // Draw the slider bar
+
+ // Draw arrows (using icon if available)
+ if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE))
+ {
+#if defined(RAYGUI_NO_ICONS)
+ GuiDrawText(isVertical? "^" : "<",
+ RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height },
+ TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))));
+ GuiDrawText(isVertical? "v" : ">",
+ RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height },
+ TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))));
+#else
+ GuiDrawText(isVertical? "#121#" : "#118#",
+ RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height },
+ TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_UP_FILL / ICON_ARROW_LEFT_FILL
+ GuiDrawText(isVertical? "#120#" : "#119#",
+ RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height },
+ TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_DOWN_FILL / ICON_ARROW_RIGHT_FILL
+#endif
+ }
+ //--------------------------------------------------------------------
+
+ return value;
+}
+
+// Color fade-in or fade-out, alpha goes from 0.0f to 1.0f
+// WARNING: It multiplies current alpha by alpha scale factor
+static Color GuiFade(Color color, float alpha)
+{
+ if (alpha < 0.0f) alpha = 0.0f;
+ else if (alpha > 1.0f) alpha = 1.0f;
+
+ Color result = { color.r, color.g, color.b, (unsigned char)(color.a*alpha) };
+
+ return result;
+}
+
+#if defined(RAYGUI_STANDALONE)
+// Returns a Color struct from hexadecimal value
+static 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
+static int ColorToInt(Color color)
+{
+ return (((int)color.r << 24) | ((int)color.g << 16) | ((int)color.b << 8) | (int)color.a);
+}
+
+// Check if point is inside rectangle
+static bool CheckCollisionPointRec(Vector2 point, Rectangle rec)
+{
+ bool collision = false;
+
+ if ((point.x >= rec.x) && (point.x <= (rec.x + rec.width)) &&
+ (point.y >= rec.y) && (point.y <= (rec.y + rec.height))) collision = true;
+
+ return collision;
+}
+
+// Formatting of text with variables to 'embed'
+static const char *TextFormat(const char *text, ...)
+{
+ #if !defined(RAYGUI_TEXTFORMAT_MAX_SIZE)
+ #define RAYGUI_TEXTFORMAT_MAX_SIZE 256
+ #endif
+
+ static char buffer[RAYGUI_TEXTFORMAT_MAX_SIZE];
+
+ va_list args;
+ va_start(args, text);
+ vsprintf(buffer, text, args);
+ va_end(args);
+
+ return buffer;
+}
+
+// Draw rectangle with vertical gradient fill color
+// NOTE: This function is only used by GuiColorPicker()
+static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2)
+{
+ Rectangle bounds = { (float)posX, (float)posY, (float)width, (float)height };
+ DrawRectangleGradientEx(bounds, color1, color2, color2, color1);
+}
+
+// Split string into multiple strings
+const char **TextSplit(const char *text, char delimiter, int *count)
+{
+ // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter)
+ // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated,
+ // all used memory is static... it has some limitations:
+ // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS
+ // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE
+
+ #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS)
+ #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128
+ #endif
+ #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE)
+ #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024
+ #endif
+
+ static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL };
+ static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 };
+ memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE);
+
+ result[0] = buffer;
+ int counter = 0;
+
+ if (text != NULL)
+ {
+ counter = 1;
+
+ // Count how many substrings we have on text and point to every one
+ for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++)
+ {
+ buffer[i] = text[i];
+ if (buffer[i] == '\0') break;
+ else if (buffer[i] == delimiter)
+ {
+ buffer[i] = '\0'; // Set an end of string at this point
+ result[counter] = buffer + i + 1;
+ counter++;
+
+ if (counter == RAYGUI_TEXTSPLIT_MAX_ITEMS) break;
+ }
+ }
+ }
+
+ *count = counter;
+ return result;
+}
+
+// Get integer value from text
+// NOTE: This function replaces atoi() [stdlib.h]
+static int TextToInteger(const char *text)
+{
+ int value = 0;
+ int sign = 1;
+
+ if ((text[0] == '+') || (text[0] == '-'))
+ {
+ if (text[0] == '-') sign = -1;
+ text++;
+ }
+
+ for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); ++i) value = value*10 + (int)(text[i] - '0');
+
+ return value*sign;
+}
+
+// Encode codepoint into UTF-8 text (char array size returned as parameter)
+static const char *CodepointToUTF8(int codepoint, int *byteSize)
+{
+ static char utf8[6] = { 0 };
+ int size = 0;
+
+ if (codepoint <= 0x7f)
+ {
+ utf8[0] = (char)codepoint;
+ size = 1;
+ }
+ else if (codepoint <= 0x7ff)
+ {
+ utf8[0] = (char)(((codepoint >> 6) & 0x1f) | 0xc0);
+ utf8[1] = (char)((codepoint & 0x3f) | 0x80);
+ size = 2;
+ }
+ else if (codepoint <= 0xffff)
+ {
+ utf8[0] = (char)(((codepoint >> 12) & 0x0f) | 0xe0);
+ utf8[1] = (char)(((codepoint >> 6) & 0x3f) | 0x80);
+ utf8[2] = (char)((codepoint & 0x3f) | 0x80);
+ size = 3;
+ }
+ else if (codepoint <= 0x10ffff)
+ {
+ utf8[0] = (char)(((codepoint >> 18) & 0x07) | 0xf0);
+ utf8[1] = (char)(((codepoint >> 12) & 0x3f) | 0x80);
+ utf8[2] = (char)(((codepoint >> 6) & 0x3f) | 0x80);
+ utf8[3] = (char)((codepoint & 0x3f) | 0x80);
+ size = 4;
+ }
+
+ *byteSize = size;
+
+ return utf8;
+}
+
+// Get next codepoint in a UTF-8 encoded text, scanning until '\0' is found
+// When a invalid UTF-8 byte is encountered we exit as soon as possible and a '?'(0x3f) codepoint is returned
+// Total number of bytes processed are returned as a parameter
+// NOTE: the standard says U+FFFD should be returned in case of errors
+// but that character is not supported by the default font in raylib
+static int GetCodepointNext(const char *text, int *codepointSize)
+{
+ const char *ptr = text;
+ int codepoint = 0x3f; // Codepoint (defaults to '?')
+ *codepointSize = 1;
+
+ // Get current codepoint and bytes processed
+ if (0xf0 == (0xf8 & ptr[0]))
+ {
+ // 4 byte UTF-8 codepoint
+ if(((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80) || ((ptr[3] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks
+ codepoint = ((0x07 & ptr[0]) << 18) | ((0x3f & ptr[1]) << 12) | ((0x3f & ptr[2]) << 6) | (0x3f & ptr[3]);
+ *codepointSize = 4;
+ }
+ else if (0xe0 == (0xf0 & ptr[0]))
+ {
+ // 3 byte UTF-8 codepoint */
+ if(((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks
+ codepoint = ((0x0f & ptr[0]) << 12) | ((0x3f & ptr[1]) << 6) | (0x3f & ptr[2]);
+ *codepointSize = 3;
+ }
+ else if (0xc0 == (0xe0 & ptr[0]))
+ {
+ // 2 byte UTF-8 codepoint
+ if((ptr[1] & 0xC0) ^ 0x80) { return codepoint; } //10xxxxxx checks
+ codepoint = ((0x1f & ptr[0]) << 6) | (0x3f & ptr[1]);
+ *codepointSize = 2;
+ }
+ else if (0x00 == (0x80 & ptr[0]))
+ {
+ // 1 byte UTF-8 codepoint
+ codepoint = ptr[0];
+ *codepointSize = 1;
+ }
+
+
+ return codepoint;
+}
+#endif // RAYGUI_STANDALONE
+
+#endif // RAYGUI_IMPLEMENTATION
diff --git a/external/raygui-4.0/styles/README.md b/external/raygui-4.0/styles/README.md
new file mode 100644
index 0000000..56eaa14
--- /dev/null
+++ b/external/raygui-4.0/styles/README.md
@@ -0,0 +1,50 @@
+# raygui styles
+
+`raygui` comes with **12 custom styles** carefully designed for the best visual experience. Those styles have been created using [rGuiStyler](https://raylibtech.itch.io/rguistyler) tool and they complement internal [default style](default), always available by `raygui`.
+
+## styles usage
+
+To use those styles with your `raygui` development, you need to call `GuiLoadStyle()` function at initialization, passing the `.rgs` file to load. Note that `.rgs` is by default a binary file containing the style required font data (glyphs data + glyph atlas image data).
+
+Styles can also be embedded in the code if desired, `.h` files are provided with every style containing all the required style data, including the font data. To embed those fonts just add the `.h` to your project and call the required function as specified in the header info.
+
+Here it is a quick overview of those styles, you can navigate to each directory for additional information.
+
+#### 1. style: [default](default)
+![default style](default/style_default.png)
+
+#### 2. style: [dark](dark)
+![dark style](dark/style_dark.png)
+
+#### 3. style: [bluish](bluish)
+![bluish style](bluish/style_bluish.png)
+
+#### 4. style: [candy](candy)
+![candy style](candy/style_candy.png)
+
+#### 5. style: [cherry](cherry)
+![cherry style](cherry/style_cherry.png)
+
+#### 6. style: [cyber](cyber)
+![cyber style](cyber/style_cyber.png)
+
+#### 7. style: [jungle](jungle)
+![jungle style](jungle/style_jungle.png)
+
+#### 8. style: [lavanda](lavanda)
+![lavanda style](lavanda/style_lavanda.png)
+
+#### 9. style: [terminal](terminal)
+![terminal style](terminal/style_terminal.png)
+
+#### 10. style: [sunny](sunny)
+![sunny style](sunny/style_sunny.png)
+
+#### 11. style: [ashes](ashes)
+![ashes style](ashes/style_ashes.png)
+
+#### 12. enefete: [enefete](enefete)
+![enefete style](enefete/style_enefete.png)
+
+
+*NOTE: Those styles require raylib 4.5+ and raygui 4.0*
diff --git a/external/raygui-4.0/styles/ashes/README.md b/external/raygui-4.0/styles/ashes/README.md
new file mode 100644
index 0000000..b1d4de5
--- /dev/null
+++ b/external/raygui-4.0/styles/ashes/README.md
@@ -0,0 +1,27 @@
+## style: ashes
+
+What once was life now is ashes, just as slight reminiscense covers the ground, a gray sequence of tones that reminds to a distant past.
+
+![ashes style table](style_ashes.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_ashes.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_ashes.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_ashes.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_ashes.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_ashes.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![ashes style screen](screenshot.png)
+
+## about font
+
+"V5 Loxica Lixera" font by vFive Digital (Roberto Christen).
+
+100% free font, downloaded from dafont.com: [v5loxica-lixera](https://www.dafont.com/v5loxica-lixera.font)
diff --git a/external/raygui-4.0/styles/ashes/charset.txt b/external/raygui-4.0/styles/ashes/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/ashes/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/ashes/font_readme.txt b/external/raygui-4.0/styles/ashes/font_readme.txt
new file mode 100644
index 0000000..1a6b338
--- /dev/null
+++ b/external/raygui-4.0/styles/ashes/font_readme.txt
@@ -0,0 +1,51 @@
+
+V5 Loxica
+---------------
+Instructions:
+
+
+++ Loxica (LIXERA) ++
+
+For screen use, set at 16pt. Turn
+antialiasing off. Set tracking to zero
+for best results.
+
+++ Loxica (ROBUSTA) ++
+
+For screen use, set at 18pt. Turn
+antialiasing off. Set tracking to zero
+for best results.
+
+
+Notes:
+
+1. These faces do not contain any hinting
+information since they were built for use
+at the sizes listed above. Naturally, for
+print use you are free to experiment.
+
+2. Although the intended size for _lixera_
+is 16pt (vs. 18pt for _robusta_), they share
+the same optical size (where lixera is the
+regular weight, and robusta is the bold).
+
+3. Pronounciation: "lo-hee-ka lee-he-ra", and
+"lo-hee-ka ro-bus-ta."
+
+
+
+---------------
+Usage: This is a free font--you may use
+this and other V5 fonts at will. It may not
+be sold, altered, or improperly credited,
+however. All I ask is that you kindly inform
+me if you find this font useful, and where
+you've used it.
+
+Enjoy,
+
+2000
+Roberto Christen
+rob@vfive.com
+
+
diff --git a/external/raygui-4.0/styles/ashes/screenshot.png b/external/raygui-4.0/styles/ashes/screenshot.png
new file mode 100644
index 0000000..fb20893
Binary files /dev/null and b/external/raygui-4.0/styles/ashes/screenshot.png differ
diff --git a/external/raygui-4.0/styles/ashes/style_ashes.h b/external/raygui-4.0/styles/ashes/style_ashes.h
new file mode 100644
index 0000000..b741154
--- /dev/null
+++ b/external/raygui-4.0/styles/ashes/style_ashes.h
@@ -0,0 +1,578 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleAshes(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define ASHES_STYLE_PROPS_COUNT 16
+
+// Custom style name: Ashes
+static const GuiStyleProp ashesStyleProps[ASHES_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0xf0f0f0ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x868686ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xe6e6e6ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x929999ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xeaeaeaff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x98a1a8ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x3f3f3fff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xf6f6f6ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x414141ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x8b8b8bff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x777777ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x959595ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 18, 0x9dadb1ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x6b6b6bff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "v5loxical.ttf" (size: 16, spacing: 1)
+
+#define ASHES_STYLE_FONT_ATLAS_COMP_SIZE 2042
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char ashesFontData[ASHES_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0xd1, 0xb2, 0xab, 0x36, 0x0c, 0x05, 0x50, 0xff, 0xff, 0x4f, 0xab, 0x0f, 0x9d, 0x4e, 0xdb, 0x69, 0x13, 0x90, 0x2c,
+ 0x83, 0x21, 0xeb, 0xae, 0xb7, 0x9c, 0xdc, 0x40, 0x0c, 0x1b, 0x63, 0x88, 0x45, 0x0c, 0x00, 0x00, 0x00, 0xe0, 0xe7, 0xc5,
+ 0xff, 0xbe, 0x12, 0x1f, 0xdf, 0x19, 0xa7, 0x3f, 0xe7, 0xdf, 0xaf, 0xc7, 0x87, 0xbf, 0xe6, 0x3e, 0x2f, 0x4e, 0x2f, 0xb7,
+ 0xf2, 0x97, 0xf8, 0xdf, 0xf5, 0x8b, 0xe9, 0xa5, 0xc6, 0xe9, 0x6f, 0xf3, 0xed, 0xbd, 0xdf, 0x96, 0xf9, 0xe9, 0x93, 0x22,
+ 0xb1, 0x8c, 0xec, 0xfb, 0x3f, 0x7f, 0xce, 0xd5, 0x2d, 0x1e, 0x5f, 0xfe, 0xf2, 0xfd, 0xaf, 0xd9, 0xd7, 0xe3, 0xe4, 0xab,
+ 0xdf, 0xfe, 0x12, 0x07, 0x7f, 0x39, 0x9b, 0xbb, 0x78, 0x40, 0xfe, 0xe3, 0xcb, 0xe7, 0x7d, 0xff, 0xc4, 0x98, 0x38, 0x26,
+ 0x9c, 0x5b, 0xee, 0x95, 0xed, 0xf9, 0x69, 0x4f, 0xcf, 0x6d, 0xeb, 0xef, 0x6d, 0x9c, 0xcb, 0x5c, 0x34, 0xac, 0xff, 0x6c,
+ 0xab, 0x45, 0xc3, 0xbb, 0xe3, 0xc4, 0xde, 0x92, 0xd9, 0x9b, 0xb3, 0x69, 0xab, 0xbd, 0x7f, 0x34, 0x6c, 0xaf, 0x6b, 0xf3,
+ 0xff, 0xcf, 0x7f, 0x23, 0x75, 0x14, 0x1c, 0x4d, 0xf9, 0xcf, 0xf7, 0xb9, 0xdf, 0x8e, 0xbe, 0x71, 0xd1, 0xd9, 0xd4, 0xb9,
+ 0x3d, 0xb4, 0xfe, 0x7a, 0xdf, 0xa7, 0x5f, 0x9d, 0xff, 0x68, 0xfc, 0x1f, 0x47, 0x6b, 0x17, 0xf2, 0x3f, 0xbd, 0x15, 0xa2,
+ 0xd8, 0xdb, 0x56, 0x7b, 0xa2, 0xd9, 0xad, 0x1f, 0x8b, 0x7b, 0xfa, 0x55, 0x09, 0xad, 0x1d, 0xcd, 0x22, 0xf9, 0x7f, 0x72,
+ 0x7d, 0x6c, 0x4c, 0x6f, 0xbd, 0xf3, 0xfb, 0x44, 0x7e, 0xfd, 0x8e, 0xf7, 0x00, 0xf9, 0xbf, 0x22, 0xff, 0x95, 0xe4, 0xc6,
+ 0x92, 0xa3, 0x7f, 0xf5, 0xca, 0xc0, 0x8a, 0xb6, 0xcc, 0xe5, 0x3f, 0x1a, 0x5b, 0x20, 0xdb, 0x6f, 0xe7, 0xd7, 0xff, 0xec,
+ 0x48, 0x3d, 0x6e, 0xec, 0xff, 0xbf, 0x1d, 0x1d, 0x33, 0x47, 0xcd, 0x6c, 0x3a, 0x73, 0xcb, 0xfd, 0x7b, 0x5d, 0xe7, 0xaf,
+ 0x88, 0xac, 0xc8, 0x7f, 0xf5, 0xfc, 0xbf, 0x72, 0x86, 0x3a, 0x36, 0xc9, 0xf3, 0xf5, 0xf9, 0x8f, 0xf6, 0x16, 0x58, 0x99,
+ 0xff, 0xb3, 0x6d, 0x1f, 0x0b, 0xc7, 0xff, 0xb9, 0xab, 0xab, 0xfb, 0xf7, 0xff, 0xf7, 0x5f, 0xff, 0x1b, 0xe5, 0xeb, 0x46,
+ 0xd9, 0x6b, 0x80, 0x71, 0xea, 0xec, 0xe1, 0x29, 0xf9, 0xef, 0x38, 0xfe, 0x55, 0x47, 0x4a, 0x1d, 0x57, 0xb8, 0xb2, 0xf9,
+ 0x8f, 0x86, 0xb6, 0x8f, 0xa5, 0x47, 0xff, 0x4a, 0xaf, 0x24, 0xff, 0xbd, 0xe3, 0xff, 0x38, 0x71, 0x06, 0x18, 0xaf, 0xe8,
+ 0xff, 0xf3, 0xa3, 0x9c, 0x68, 0xb8, 0x07, 0x57, 0xb9, 0xbb, 0x9a, 0xed, 0x31, 0x2b, 0xf7, 0x24, 0x77, 0x68, 0x77, 0xfd,
+ 0xff, 0x75, 0xdb, 0xa0, 0xb6, 0x2f, 0xfc, 0xf5, 0xff, 0x9e, 0xdf, 0xff, 0xef, 0xb4, 0x35, 0x90, 0xff, 0xab, 0xf7, 0xdb,
+ 0xb8, 0xb5, 0x7f, 0x95, 0x7f, 0xbf, 0x60, 0xeb, 0xca, 0xff, 0xda, 0xdf, 0xff, 0xc4, 0x41, 0x6f, 0x38, 0x1e, 0xd9, 0xff,
+ 0x5f, 0xb3, 0x36, 0x21, 0x79, 0xe0, 0x58, 0x2f, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0xd0, 0xec, 0x99, 0xcc, 0xec, 0xe5, 0x6a, 0x15, 0xe0, 0x8e, 0xf7, 0x57, 0x97, 0x10, 0x6d, 0xf5, 0x1f, 0xfb,
+ 0xaa, 0x49, 0x7e, 0x9e, 0x4d, 0x9a, 0x99, 0xf7, 0x9c, 0xab, 0x6f, 0x9e, 0xab, 0x24, 0x17, 0xc9, 0x9a, 0x6d, 0x91, 0xac,
+ 0x5b, 0x9c, 0xdd, 0x8e, 0xf3, 0xb3, 0xec, 0xe7, 0xfe, 0xff, 0xdf, 0xb5, 0x2a, 0xfa, 0xf6, 0xe5, 0xd1, 0xd4, 0x32, 0xd7,
+ 0xe5, 0x7f, 0xb4, 0xd7, 0x54, 0xcd, 0x57, 0xa8, 0xca, 0xd7, 0xc7, 0x1f, 0x9b, 0xe5, 0x3f, 0xb3, 0x3f, 0x66, 0xeb, 0xfe,
+ 0x44, 0x61, 0x56, 0x64, 0x4c, 0xcf, 0xb7, 0x8c, 0x85, 0xfb, 0x5d, 0x57, 0x05, 0xc9, 0x31, 0x99, 0xff, 0x3b, 0xf7, 0xfd,
+ 0x4a, 0x6d, 0x46, 0xf9, 0x7f, 0x43, 0xfe, 0x2b, 0xd5, 0x3d, 0x3b, 0xe6, 0x45, 0x77, 0xd5, 0xc7, 0x8d, 0xf4, 0x79, 0x51,
+ 0x66, 0x7f, 0x88, 0xa9, 0xca, 0xea, 0x91, 0x3e, 0x0e, 0xef, 0x98, 0x7f, 0xfd, 0x7f, 0xa5, 0x36, 0xde, 0xdd, 0xf9, 0x9f,
+ 0x7b, 0x22, 0xc0, 0xea, 0xea, 0x07, 0x6b, 0xfb, 0xa7, 0xde, 0xfe, 0x3f, 0x26, 0xf2, 0x9f, 0x7d, 0x86, 0xd9, 0x5e, 0xf9,
+ 0x9f, 0x3f, 0xff, 0xaf, 0x57, 0x3b, 0xef, 0x1a, 0x05, 0x8f, 0x86, 0xe3, 0x7d, 0xf5, 0x49, 0x82, 0x5d, 0xf9, 0x1f, 0x85,
+ 0xa7, 0xc0, 0xcd, 0x9e, 0x8f, 0x3e, 0x3b, 0xff, 0xb9, 0x2b, 0x11, 0xeb, 0xf2, 0xff, 0xec, 0xfe, 0x7f, 0xbc, 0xe0, 0xfc,
+ 0xbf, 0x63, 0x7b, 0x8f, 0x4d, 0xcf, 0xff, 0xbb, 0x46, 0xd1, 0xef, 0xcb, 0x7f, 0xf6, 0x7b, 0x76, 0x7c, 0xfe, 0x5b, 0xcf,
+ 0xff, 0xe5, 0xff, 0xed, 0xf9, 0xbf, 0xeb, 0x49, 0x66, 0x7b, 0xe4, 0x3f, 0x9a, 0xaa, 0xef, 0xca, 0xff, 0x5b, 0xf3, 0xbf,
+ 0xeb, 0xf5, 0xbf, 0xe7, 0xe6, 0x7f, 0x94, 0xc6, 0x66, 0x73, 0xef, 0x7e, 0x42, 0xff, 0x3f, 0x0a, 0xd7, 0xac, 0xf2, 0x23,
+ 0xd9, 0xeb, 0xc6, 0xff, 0xf2, 0x7f, 0xee, 0xee, 0xd9, 0xdd, 0xf9, 0x5f, 0x73, 0xff, 0xab, 0xef, 0xbc, 0xa0, 0xe3, 0xdd,
+ 0x7b, 0x8f, 0xff, 0x57, 0xff, 0x16, 0x67, 0xed, 0xf2, 0x7b, 0xae, 0xb4, 0x45, 0xf9, 0xba, 0x7d, 0xcf, 0x6f, 0x49, 0xf2,
+ 0xd7, 0xdf, 0xb2, 0x47, 0xce, 0x38, 0x78, 0x7f, 0x34, 0xf5, 0x73, 0x95, 0xea, 0xf0, 0x3b, 0xe4, 0x3f, 0xfb, 0xd4, 0x9f,
+ 0xec, 0xbb, 0xf7, 0xc8, 0xff, 0xfa, 0x96, 0xbd, 0x3a, 0xff, 0x4f, 0xfc, 0xb5, 0xe2, 0xef, 0xb5, 0x42, 0x2c, 0x7e, 0xff,
+ 0x6f, 0xef, 0x0b, 0x7b, 0x3d, 0x31, 0xcb, 0x76, 0xe5, 0xca, 0xbe, 0x15, 0xad, 0x05, 0x8e, 0xac, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x9b, 0xfb, 0x70, 0x34, 0x7f, 0x32, 0x9a, 0xaa, 0x20, 0x64, 0xeb, 0xc0,
+ 0x8d, 0xd3, 0xb5, 0xf0, 0xa3, 0x54, 0x79, 0x76, 0xbe, 0xba, 0xc2, 0xf7, 0x19, 0xcd, 0x9f, 0xbf, 0x69, 0x14, 0x66, 0x09,
+ 0x67, 0x9f, 0x6d, 0x50, 0xa9, 0xad, 0x50, 0x5f, 0x56, 0x14, 0xab, 0x48, 0xce, 0xb7, 0x41, 0x14, 0x9e, 0xef, 0x70, 0xf4,
+ 0x5d, 0xf2, 0x5b, 0x21, 0xf3, 0x5a, 0x65, 0x6e, 0xf9, 0x38, 0xf1, 0xdc, 0x81, 0x38, 0x9c, 0xdf, 0xd0, 0x9b, 0xff, 0xd5,
+ 0x75, 0xb0, 0x2b, 0xb5, 0x3c, 0xfe, 0xfb, 0xda, 0x7d, 0x75, 0x27, 0xbe, 0x1d, 0x77, 0x2a, 0x55, 0x28, 0xb2, 0xc7, 0xe1,
+ 0xfc, 0x5e, 0x38, 0xb7, 0xac, 0x91, 0xda, 0x02, 0x95, 0x7a, 0xe6, 0x9d, 0x6d, 0x1a, 0x85, 0x9a, 0x17, 0xe7, 0x7b, 0x9f,
+ 0x28, 0xb6, 0xfd, 0x4c, 0xcd, 0x9d, 0x33, 0x33, 0x8a, 0xa3, 0xb0, 0xe7, 0x75, 0xd5, 0xc1, 0x8d, 0x96, 0x4c, 0x77, 0x54,
+ 0xc1, 0xca, 0xd5, 0xee, 0xcd, 0xce, 0x24, 0x8d, 0xc9, 0xfd, 0x38, 0xbf, 0x7f, 0x47, 0x4b, 0x35, 0xae, 0xe3, 0x65, 0xc5,
+ 0x97, 0x65, 0x65, 0xf2, 0x5f, 0xef, 0x4b, 0xd7, 0xe7, 0x3f, 0xbf, 0x06, 0x99, 0x0a, 0x52, 0x73, 0xbd, 0xe3, 0x7c, 0xfe,
+ 0x77, 0xed, 0xff, 0xef, 0xce, 0x7f, 0xbe, 0x06, 0xcc, 0xd1, 0x79, 0x77, 0x65, 0x2f, 0x8a, 0x52, 0x26, 0xb3, 0xfb, 0x60,
+ 0xbd, 0xff, 0x8f, 0xd2, 0x39, 0x55, 0xe7, 0xb6, 0xbd, 0x22, 0xff, 0x63, 0x61, 0xfe, 0xef, 0xee, 0xff, 0xf7, 0xcc, 0x7f,
+ 0x5f, 0x2d, 0xdf, 0xb9, 0xfc, 0xe7, 0x53, 0x3e, 0x8a, 0x6b, 0xde, 0x77, 0xfe, 0x1f, 0xe9, 0xf1, 0xd3, 0xcc, 0xb2, 0xa2,
+ 0xe5, 0x5c, 0x6b, 0x1c, 0x3c, 0x9f, 0xf0, 0xf9, 0xf9, 0x1f, 0xc5, 0x33, 0xe0, 0xa3, 0xa7, 0x61, 0xe4, 0xdb, 0x67, 0x76,
+ 0x84, 0xbb, 0xbe, 0x0a, 0xf2, 0xf5, 0xcf, 0xc1, 0x88, 0x86, 0xb3, 0xfc, 0xa3, 0xca, 0x85, 0xb1, 0x41, 0xfe, 0xeb, 0xd7,
+ 0x87, 0xbb, 0xfa, 0xff, 0xee, 0xeb, 0xd6, 0x3d, 0xf9, 0x1f, 0xa5, 0x71, 0x4c, 0x5f, 0x3b, 0x8f, 0xa9, 0xfe, 0x7f, 0xbc,
+ 0x2c, 0xff, 0xd7, 0x3f, 0x07, 0x23, 0x5a, 0x46, 0xf9, 0x51, 0x7c, 0xde, 0x50, 0xef, 0xf9, 0xff, 0xb7, 0xe7, 0xe2, 0x46,
+ 0xf9, 0xd9, 0x70, 0x6b, 0xf3, 0x7f, 0xee, 0x6a, 0xf5, 0xca, 0xfc, 0x0f, 0xf9, 0x3f, 0x79, 0x87, 0xeb, 0xe8, 0x5e, 0xc5,
+ 0x48, 0xdf, 0x75, 0x99, 0xbd, 0x77, 0x74, 0xe5, 0xf9, 0xff, 0x75, 0xfd, 0xff, 0x58, 0x72, 0xfd, 0x7f, 0x45, 0x3f, 0xfb,
+ 0xa4, 0xfe, 0xff, 0xfb, 0x9e, 0xfd, 0x9c, 0xfc, 0x9f, 0x49, 0xdc, 0x78, 0x44, 0x45, 0xd1, 0xae, 0x4a, 0xd0, 0xd7, 0x5e,
+ 0xff, 0xeb, 0xbe, 0x9f, 0xd1, 0x73, 0xfe, 0x9f, 0xef, 0x49, 0xe7, 0x46, 0xb9, 0x9d, 0xcb, 0xba, 0xee, 0xfc, 0xff, 0x1d,
+ 0xf9, 0xef, 0x59, 0xbb, 0xfb, 0x2b, 0x20, 0xee, 0x99, 0xff, 0x51, 0xfc, 0x7d, 0xcd, 0xbd, 0xe7, 0xff, 0x57, 0xe6, 0x6c,
+ 0x8f, 0x7d, 0xe6, 0xbd, 0xf9, 0x3f, 0xfa, 0xfd, 0xcf, 0x13, 0xb7, 0xdb, 0xec, 0xd1, 0x27, 0x16, 0xbd, 0xf7, 0xae, 0xb3,
+ 0xa3, 0x98, 0xba, 0x56, 0x21, 0xff, 0x9d, 0xf9, 0x7f, 0x53, 0xc2, 0x9e, 0x92, 0xff, 0x55, 0x47, 0x8c, 0xa7, 0x3c, 0x19,
+ 0x42, 0xfe, 0xaf, 0xcd, 0xff, 0xaf, 0x24, 0xec, 0xbd, 0xf9, 0x7f, 0xdf, 0xd1, 0x2c, 0x3b, 0x86, 0x8e, 0x0b, 0xc7, 0xdd,
+ 0x71, 0xe3, 0x18, 0xbf, 0xba, 0x5e, 0xd7, 0xac, 0xf3, 0xae, 0x2d, 0xf3, 0x84, 0xb5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x67, 0xb9, 0x44, 0xcb, 0x6c, 0xd9, 0x51, 0xaa, 0xc3, 0x9e, 0x9f, 0x0b, 0x99, 0xad,
+ 0x35, 0x3f, 0x5a, 0xea, 0x14, 0x57, 0xaa, 0xc5, 0x1e, 0xcf, 0x37, 0x8d, 0x64, 0x5b, 0xde, 0xb5, 0xad, 0xa2, 0xbc, 0xf4,
+ 0x95, 0xdb, 0xe4, 0xf3, 0xac, 0xa0, 0xfc, 0x93, 0x16, 0x2a, 0xd5, 0x33, 0xae, 0xcb, 0xc1, 0xea, 0xd9, 0xfc, 0xf9, 0xba,
+ 0xfc, 0xf3, 0x55, 0x4f, 0xfb, 0x9e, 0x14, 0xd0, 0xfd, 0x2d, 0x32, 0x75, 0x5e, 0xcf, 0xb5, 0x42, 0x34, 0xb5, 0xe5, 0x5d,
+ 0xdb, 0xea, 0x68, 0x8d, 0x62, 0xf9, 0xda, 0x76, 0xd5, 0xeb, 0x8e, 0x52, 0x3f, 0x78, 0x47, 0x0e, 0x2a, 0xfd, 0xd1, 0xfd,
+ 0xb3, 0x5c, 0xe7, 0xe7, 0xf7, 0xd6, 0xf3, 0xff, 0xd4, 0xf3, 0xb1, 0x67, 0x7c, 0xa7, 0xef, 0xb5, 0xb4, 0x76, 0xfa, 0x0e,
+ 0xd5, 0xfc, 0x77, 0x54, 0x97, 0xe9, 0x9c, 0xe7, 0x1e, 0x5f, 0x6a, 0x2e, 0x47, 0xeb, 0xf9, 0xff, 0x4e, 0xaf, 0x57, 0xf3,
+ 0x9f, 0x1f, 0x2f, 0xcc, 0x8e, 0x2f, 0xe6, 0x9f, 0x50, 0x94, 0xaf, 0xde, 0x79, 0xdf, 0xeb, 0xdd, 0xcf, 0x48, 0x5a, 0xfd,
+ 0x7a, 0x25, 0xff, 0xbb, 0xf6, 0x0d, 0x3d, 0xf9, 0x8f, 0x0d, 0xb7, 0x52, 0x7e, 0xf4, 0x36, 0x7f, 0x9e, 0x59, 0x3d, 0xbe,
+ 0x74, 0xe7, 0x7f, 0xc7, 0xb6, 0xcf, 0x8f, 0xff, 0x9f, 0x97, 0xff, 0x28, 0xf4, 0xc3, 0xf7, 0xf5, 0x83, 0x99, 0xa7, 0x58,
+ 0xd6, 0xc7, 0xf8, 0xfb, 0xef, 0x83, 0xf2, 0x7f, 0x77, 0xdb, 0x8f, 0x1f, 0xe8, 0xff, 0xf7, 0xd9, 0xef, 0xba, 0xc7, 0xc1,
+ 0xf2, 0x2f, 0xff, 0xf2, 0x1f, 0x27, 0xc6, 0x63, 0x7b, 0xbc, 0x7e, 0x5d, 0xfe, 0x73, 0x95, 0xf9, 0xd7, 0xbf, 0x5e, 0xcb,
+ 0xed, 0xda, 0x6d, 0x24, 0xff, 0xfb, 0xe5, 0x7f, 0xe6, 0x89, 0x61, 0x4f, 0x68, 0xf3, 0xde, 0xfb, 0x7f, 0xcf, 0x1a, 0x6b,
+ 0xea, 0xff, 0xe5, 0xbf, 0x7e, 0xff, 0xff, 0x1d, 0xf9, 0xef, 0xbe, 0x97, 0xf7, 0x94, 0xeb, 0x7f, 0xe3, 0xe0, 0xb9, 0x40,
+ 0x71, 0xcb, 0x73, 0xc4, 0xd6, 0xe4, 0xff, 0x19, 0xdb, 0xe4, 0x78, 0xaf, 0x7a, 0x52, 0xfe, 0x9f, 0xdf, 0xe6, 0x9d, 0xf7,
+ 0x25, 0xdf, 0xf1, 0xbd, 0x9f, 0x99, 0xff, 0x37, 0x6c, 0x93, 0xa3, 0x11, 0xd3, 0x9e, 0xfd, 0xff, 0xf3, 0x73, 0x10, 0x8b,
+ 0x7f, 0x83, 0xb2, 0x6f, 0xfe, 0xc7, 0x6b, 0xfa, 0xff, 0xe7, 0x6f, 0x93, 0xb8, 0xf1, 0x5b, 0xf4, 0xe6, 0x7f, 0xb7, 0xfb,
+ 0x7f, 0x77, 0xff, 0x06, 0xed, 0x69, 0xe7, 0x3d, 0xcf, 0xfb, 0xfd, 0x4f, 0x6d, 0x4c, 0xfd, 0xa4, 0x7d, 0xf1, 0xae, 0x3b,
+ 0xe7, 0x2a, 0xe2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xd6, 0x55, 0xdf, 0x3c, 0x8a,
+ 0x33, 0xab, 0xce, 0xbd, 0x56, 0xa9, 0xe6, 0x1e, 0xcb, 0xbe, 0x6b, 0xa5, 0x36, 0x4b, 0xb4, 0xcd, 0x5d, 0xea, 0xda, 0x32,
+ 0x9f, 0x97, 0x1b, 0xc5, 0x2a, 0x2c, 0xbc, 0xeb, 0x08, 0xb0, 0xaa, 0x42, 0xfe, 0x68, 0xa8, 0x92, 0x5f, 0xab, 0xe6, 0x78,
+ 0x4f, 0x2d, 0xf7, 0xb9, 0x99, 0xb2, 0xeb, 0xb6, 0x4c, 0x6f, 0x9d, 0x7c, 0xde, 0x75, 0x04, 0x58, 0xf9, 0x1c, 0x91, 0x68,
+ 0xfc, 0xcc, 0xd8, 0xea, 0xbb, 0x8e, 0xaf, 0x33, 0xcf, 0x46, 0xa2, 0xf2, 0xc4, 0xfa, 0xb5, 0x8d, 0xd6, 0x96, 0x85, 0x3b,
+ 0x8e, 0x59, 0xcf, 0xde, 0x4b, 0xf7, 0xeb, 0x51, 0xe5, 0xff, 0xd7, 0x92, 0xb4, 0x7a, 0x8e, 0xf8, 0x6c, 0x5d, 0x8e, 0xfc,
+ 0x59, 0xea, 0x7e, 0x35, 0x1b, 0xa2, 0x30, 0xa7, 0x7f, 0x78, 0x4e, 0x06, 0x37, 0xf5, 0x3f, 0x9d, 0x75, 0x3b, 0xae, 0xcf,
+ 0xff, 0x5e, 0xaf, 0xd7, 0xfa, 0x7f, 0xf9, 0x47, 0xfe, 0xe5, 0x5f, 0xfe, 0x91, 0xff, 0xf7, 0xe6, 0x3f, 0xe4, 0x9f, 0x5b,
+ 0x47, 0xff, 0x2b, 0x9f, 0xdb, 0x21, 0xff, 0x73, 0x77, 0xff, 0xe4, 0x9f, 0x3b, 0xee, 0xfe, 0xf7, 0x55, 0xc8, 0x95, 0xff,
+ 0xda, 0xaf, 0xaf, 0xe4, 0x1f, 0xf9, 0x7f, 0x7b, 0xff, 0x2f, 0xff, 0xb8, 0xff, 0x77, 0x4d, 0xfe, 0xd5, 0xc9, 0xce, 0xfd,
+ 0x4a, 0x3a, 0xf7, 0x24, 0x44, 0xb8, 0xfe, 0xba, 0x85, 0xbd, 0xb1, 0xff, 0xb7, 0x99, 0x47, 0x2d, 0xab, 0xc5, 0xe1, 0x17,
+ 0xe6, 0x7f, 0xc9, 0x3f, 0xfc, 0xda, 0xc8, 0xaf, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe3, 0xcf, 0x7f, 0xda, 0x01, 0xe4, 0x1f, 0xf8, 0xb9, 0xfc, 0xff,
+ 0x01 };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle ashesFontRecs[189] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 1 , 10 },
+ { 25, 4, 3 , 3 },
+ { 36, 4, 6 , 8 },
+ { 50, 4, 5 , 11 },
+ { 63, 4, 7 , 8 },
+ { 78, 4, 6 , 9 },
+ { 92, 4, 1 , 3 },
+ { 101, 4, 3 , 12 },
+ { 112, 4, 3 , 12 },
+ { 123, 4, 5 , 5 },
+ { 136, 4, 5 , 5 },
+ { 149, 4, 2 , 2 },
+ { 159, 4, 4 , 1 },
+ { 171, 4, 1 , 1 },
+ { 180, 4, 5 , 10 },
+ { 193, 4, 4 , 8 },
+ { 205, 4, 2 , 8 },
+ { 215, 4, 4 , 8 },
+ { 227, 4, 4 , 8 },
+ { 239, 4, 6 , 8 },
+ { 253, 4, 4 , 8 },
+ { 265, 4, 4 , 8 },
+ { 277, 4, 4 , 8 },
+ { 289, 4, 4 , 8 },
+ { 301, 4, 4 , 8 },
+ { 313, 4, 1 , 5 },
+ { 322, 4, 2 , 6 },
+ { 332, 4, 4 , 7 },
+ { 344, 4, 4 , 4 },
+ { 356, 4, 4 , 7 },
+ { 368, 4, 4 , 10 },
+ { 380, 4, 8 , 7 },
+ { 396, 4, 4 , 10 },
+ { 408, 4, 4 , 10 },
+ { 420, 4, 4 , 10 },
+ { 432, 4, 4 , 10 },
+ { 444, 4, 4 , 10 },
+ { 456, 4, 5 , 10 },
+ { 469, 4, 4 , 10 },
+ { 481, 4, 4 , 10 },
+ { 493, 4, 1 , 10 },
+ { 4, 28, 3 , 10 },
+ { 15, 28, 4 , 10 },
+ { 27, 28, 4 , 10 },
+ { 39, 28, 7 , 10 },
+ { 54, 28, 4 , 10 },
+ { 66, 28, 4 , 10 },
+ { 78, 28, 4 , 10 },
+ { 90, 28, 5 , 11 },
+ { 103, 28, 4 , 10 },
+ { 115, 28, 4 , 10 },
+ { 127, 28, 5 , 10 },
+ { 140, 28, 4 , 10 },
+ { 152, 28, 4 , 10 },
+ { 164, 28, 7 , 10 },
+ { 179, 28, 4 , 10 },
+ { 191, 28, 4 , 10 },
+ { 203, 28, 4 , 10 },
+ { 215, 28, 2 , 12 },
+ { 225, 28, 5 , 10 },
+ { 238, 28, 2 , 12 },
+ { 248, 28, 5 , 3 },
+ { 261, 28, 5 , 1 },
+ { 274, 28, 2 , 2 },
+ { 284, 28, 4 , 8 },
+ { 296, 28, 4 , 10 },
+ { 308, 28, 3 , 8 },
+ { 319, 28, 4 , 10 },
+ { 331, 28, 4 , 8 },
+ { 343, 28, 3 , 10 },
+ { 354, 28, 5 , 11 },
+ { 367, 28, 4 , 10 },
+ { 379, 28, 1 , 10 },
+ { 388, 28, 3 , 13 },
+ { 399, 28, 4 , 10 },
+ { 411, 28, 2 , 10 },
+ { 421, 28, 7 , 8 },
+ { 436, 28, 4 , 8 },
+ { 448, 28, 4 , 8 },
+ { 460, 28, 4 , 11 },
+ { 472, 28, 4 , 11 },
+ { 484, 28, 3 , 8 },
+ { 495, 28, 4 , 8 },
+ { 4, 52, 3 , 10 },
+ { 15, 52, 4 , 8 },
+ { 27, 52, 5 , 8 },
+ { 40, 52, 7 , 8 },
+ { 55, 52, 4 , 8 },
+ { 67, 52, 4 , 11 },
+ { 79, 52, 4 , 8 },
+ { 91, 52, 4 , 12 },
+ { 103, 52, 1 , 10 },
+ { 112, 52, 4 , 12 },
+ { 124, 52, 4 , 2 },
+ { 136, 52, 1 , 10 },
+ { 145, 52, 4 , 12 },
+ { 157, 52, 5 , 10 },
+ { 170, 52, 5 , 10 },
+ { 183, 52, 5 , 10 },
+ { 196, 52, 6 , 13 },
+ { 210, 52, 4 , 10 },
+ { 222, 52, 6 , 13 },
+ { 236, 52, 7 , 9 },
+ { 251, 52, 3 , 7 },
+ { 262, 52, 6 , 5 },
+ { 276, 52, 6 , 13 },
+ { 290, 52, 7 , 9 },
+ { 305, 52, 4 , 1 },
+ { 317, 52, 3 , 5 },
+ { 328, 52, 5 , 7 },
+ { 341, 52, 3 , 5 },
+ { 352, 52, 6 , 13 },
+ { 366, 52, 6 , 13 },
+ { 380, 52, 4 , 11 },
+ { 392, 52, 6 , 10 },
+ { 406, 52, 3 , 3 },
+ { 417, 52, 6 , 13 },
+ { 431, 52, 2 , 5 },
+ { 441, 52, 3 , 5 },
+ { 452, 52, 6 , 5 },
+ { 466, 52, 7 , 10 },
+ { 481, 52, 7 , 8 },
+ { 496, 52, 6 , 13 },
+ { 4, 76, 4 , 10 },
+ { 16, 76, 4 , 13 },
+ { 28, 76, 4 , 13 },
+ { 40, 76, 4 , 13 },
+ { 52, 76, 4 , 13 },
+ { 64, 76, 4 , 13 },
+ { 76, 76, 4 , 13 },
+ { 88, 76, 7 , 10 },
+ { 103, 76, 4 , 13 },
+ { 115, 76, 4 , 13 },
+ { 127, 76, 4 , 13 },
+ { 139, 76, 4 , 13 },
+ { 151, 76, 4 , 13 },
+ { 163, 76, 2 , 13 },
+ { 173, 76, 2 , 13 },
+ { 183, 76, 3 , 13 },
+ { 194, 76, 3 , 13 },
+ { 205, 76, 5 , 10 },
+ { 218, 76, 4 , 13 },
+ { 230, 76, 4 , 13 },
+ { 242, 76, 4 , 13 },
+ { 254, 76, 4 , 13 },
+ { 266, 76, 4 , 13 },
+ { 278, 76, 4 , 13 },
+ { 290, 76, 5 , 5 },
+ { 303, 76, 6 , 12 },
+ { 317, 76, 4 , 13 },
+ { 329, 76, 4 , 13 },
+ { 341, 76, 4 , 13 },
+ { 353, 76, 4 , 13 },
+ { 365, 76, 4 , 13 },
+ { 377, 76, 6 , 13 },
+ { 391, 76, 5 , 12 },
+ { 404, 76, 4 , 12 },
+ { 416, 76, 4 , 12 },
+ { 428, 76, 4 , 12 },
+ { 440, 76, 4 , 12 },
+ { 452, 76, 4 , 12 },
+ { 464, 76, 4 , 12 },
+ { 476, 76, 7 , 8 },
+ { 491, 76, 3 , 11 },
+ { 4, 100, 4 , 12 },
+ { 16, 100, 4 , 12 },
+ { 28, 100, 4 , 12 },
+ { 40, 100, 4 , 12 },
+ { 52, 100, 3 , 12 },
+ { 63, 100, 3 , 12 },
+ { 74, 100, 3 , 12 },
+ { 85, 100, 3 , 12 },
+ { 96, 100, 6 , 13 },
+ { 110, 100, 4 , 12 },
+ { 122, 100, 4 , 12 },
+ { 134, 100, 4 , 12 },
+ { 146, 100, 4 , 12 },
+ { 158, 100, 4 , 12 },
+ { 170, 100, 4 , 12 },
+ { 182, 100, 5 , 5 },
+ { 195, 100, 6 , 10 },
+ { 209, 100, 4 , 12 },
+ { 221, 100, 4 , 12 },
+ { 233, 100, 4 , 12 },
+ { 245, 100, 4 , 12 },
+ { 257, 100, 4 , 15 },
+ { 269, 100, 6 , 13 },
+ { 283, 100, 4 , 15 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo ashesFontGlyphs[189] = {
+ { 32, 0, 13, 4, { 0 }},
+ { 33, 0, 3, 4, { 0 }},
+ { 34, 0, 1, 5, { 0 }},
+ { 35, 0, 4, 8, { 0 }},
+ { 36, 0, 2, 7, { 0 }},
+ { 37, 0, 5, 9, { 0 }},
+ { 38, 0, 4, 8, { 0 }},
+ { 39, 0, 1, 3, { 0 }},
+ { 40, 0, 2, 5, { 0 }},
+ { 41, 0, 2, 5, { 0 }},
+ { 42, 0, 3, 7, { 0 }},
+ { 43, 0, 6, 7, { 0 }},
+ { 44, 0, 12, 4, { 0 }},
+ { 45, 0, 9, 5, { 0 }},
+ { 46, 0, 12, 3, { 0 }},
+ { 47, 0, 3, 7, { 0 }},
+ { 48, 0, 5, 6, { 0 }},
+ { 49, 0, 5, 4, { 0 }},
+ { 50, 0, 5, 6, { 0 }},
+ { 51, 0, 5, 6, { 0 }},
+ { 52, 0, 5, 8, { 0 }},
+ { 53, 0, 5, 6, { 0 }},
+ { 54, 0, 5, 6, { 0 }},
+ { 55, 0, 5, 6, { 0 }},
+ { 56, 0, 5, 6, { 0 }},
+ { 57, 0, 5, 6, { 0 }},
+ { 58, 0, 8, 3, { 0 }},
+ { 59, 0, 8, 4, { 0 }},
+ { 60, 0, 5, 6, { 0 }},
+ { 61, 0, 7, 7, { 0 }},
+ { 62, 0, 5, 6, { 0 }},
+ { 63, 1, 3, 7, { 0 }},
+ { 64, 0, 5, 10, { 0 }},
+ { 65, 0, 3, 6, { 0 }},
+ { 66, 0, 3, 6, { 0 }},
+ { 67, 0, 3, 6, { 0 }},
+ { 68, 0, 3, 6, { 0 }},
+ { 69, 0, 3, 6, { 0 }},
+ { 70, 0, 3, 6, { 0 }},
+ { 71, 0, 3, 6, { 0 }},
+ { 72, 0, 3, 6, { 0 }},
+ { 73, 0, 3, 3, { 0 }},
+ { 74, 0, 3, 5, { 0 }},
+ { 75, 0, 3, 6, { 0 }},
+ { 76, 0, 3, 6, { 0 }},
+ { 77, 0, 3, 9, { 0 }},
+ { 78, 0, 3, 6, { 0 }},
+ { 79, 0, 3, 6, { 0 }},
+ { 80, 0, 3, 6, { 0 }},
+ { 81, 0, 3, 7, { 0 }},
+ { 82, 0, 3, 6, { 0 }},
+ { 83, 0, 3, 6, { 0 }},
+ { 84, 0, 3, 6, { 0 }},
+ { 85, 0, 3, 6, { 0 }},
+ { 86, 0, 3, 6, { 0 }},
+ { 87, 0, 3, 9, { 0 }},
+ { 88, 0, 3, 6, { 0 }},
+ { 89, 0, 3, 6, { 0 }},
+ { 90, 0, 3, 6, { 0 }},
+ { 91, 0, 2, 4, { 0 }},
+ { 92, 0, 3, 7, { 0 }},
+ { 93, 0, 2, 4, { 0 }},
+ { 94, 0, 3, 7, { 0 }},
+ { 95, 0, 12, 7, { 0 }},
+ { 96, 0, 1, 4, { 0 }},
+ { 97, 0, 5, 6, { 0 }},
+ { 98, 0, 3, 6, { 0 }},
+ { 99, 0, 5, 5, { 0 }},
+ { 100, 0, 3, 6, { 0 }},
+ { 101, 0, 5, 6, { 0 }},
+ { 102, 0, 3, 5, { 0 }},
+ { 103, 0, 5, 6, { 0 }},
+ { 104, 0, 3, 6, { 0 }},
+ { 105, 0, 3, 3, { 0 }},
+ { 106, 0, 3, 5, { 0 }},
+ { 107, 0, 3, 6, { 0 }},
+ { 108, 0, 3, 4, { 0 }},
+ { 109, 0, 5, 9, { 0 }},
+ { 110, 0, 5, 6, { 0 }},
+ { 111, 0, 5, 6, { 0 }},
+ { 112, 0, 5, 6, { 0 }},
+ { 113, 0, 5, 6, { 0 }},
+ { 114, 0, 5, 5, { 0 }},
+ { 115, 0, 5, 6, { 0 }},
+ { 116, 0, 3, 5, { 0 }},
+ { 117, 0, 5, 6, { 0 }},
+ { 118, 0, 5, 7, { 0 }},
+ { 119, 0, 5, 9, { 0 }},
+ { 120, 0, 5, 6, { 0 }},
+ { 121, 0, 5, 6, { 0 }},
+ { 122, 0, 5, 6, { 0 }},
+ { 123, 0, 2, 6, { 0 }},
+ { 124, 0, 3, 3, { 0 }},
+ { 125, 0, 2, 6, { 0 }},
+ { 126, 0, 1, 6, { 0 }},
+ { 161, 0, 4, 4, { 0 }},
+ { 162, 0, 3, 6, { 0 }},
+ { 163, 0, 3, 7, { 0 }},
+ { 8364, 0, 3, 7, { 0 }},
+ { 165, 0, 3, 7, { 0 }},
+ { 352, 1, 0, 8, { 0 }},
+ { 167, 0, 3, 6, { 0 }},
+ { 353, 1, 0, 8, { 0 }},
+ { 169, 0, 1, 9, { 0 }},
+ { 170, 0, 1, 5, { 0 }},
+ { 171, 0, 6, 8, { 0 }},
+ { 172, 1, 0, 8, { 0 }},
+ { 174, 0, 1, 9, { 0 }},
+ { 175, 0, 0, 6, { 0 }},
+ { 176, 0, 1, 5, { 0 }},
+ { 177, 0, 5, 7, { 0 }},
+ { 178, 0, 1, 5, { 0 }},
+ { 179, 1, 0, 8, { 0 }},
+ { 381, 1, 0, 8, { 0 }},
+ { 181, 0, 5, 6, { 0 }},
+ { 182, 0, 3, 8, { 0 }},
+ { 183, 0, 7, 5, { 0 }},
+ { 382, 1, 0, 8, { 0 }},
+ { 185, 0, 1, 4, { 0 }},
+ { 186, 0, 1, 5, { 0 }},
+ { 187, 0, 6, 8, { 0 }},
+ { 338, 0, 3, 9, { 0 }},
+ { 339, 0, 5, 9, { 0 }},
+ { 376, 1, 0, 8, { 0 }},
+ { 191, 0, 4, 6, { 0 }},
+ { 192, 0, 0, 6, { 0 }},
+ { 193, 0, 0, 6, { 0 }},
+ { 194, 0, 0, 6, { 0 }},
+ { 195, 0, 0, 6, { 0 }},
+ { 196, 0, 0, 6, { 0 }},
+ { 197, 0, 0, 6, { 0 }},
+ { 198, 0, 3, 9, { 0 }},
+ { 199, 0, 3, 6, { 0 }},
+ { 200, 0, 0, 6, { 0 }},
+ { 201, 0, 0, 6, { 0 }},
+ { 202, 0, 0, 6, { 0 }},
+ { 203, 0, 0, 6, { 0 }},
+ { 204, 0, 0, 4, { 0 }},
+ { 205, 0, 0, 4, { 0 }},
+ { 206, 0, 0, 5, { 0 }},
+ { 207, 0, 0, 5, { 0 }},
+ { 208, 0, 3, 7, { 0 }},
+ { 209, 0, 0, 6, { 0 }},
+ { 210, 0, 0, 6, { 0 }},
+ { 211, 0, 0, 6, { 0 }},
+ { 212, 0, 0, 6, { 0 }},
+ { 213, 0, 0, 6, { 0 }},
+ { 214, 0, 0, 6, { 0 }},
+ { 215, 0, 7, 7, { 0 }},
+ { 216, 0, 2, 8, { 0 }},
+ { 217, 0, 0, 6, { 0 }},
+ { 218, 0, 0, 6, { 0 }},
+ { 219, 0, 0, 6, { 0 }},
+ { 220, 0, 0, 6, { 0 }},
+ { 221, 0, 0, 6, { 0 }},
+ { 222, 1, 0, 8, { 0 }},
+ { 223, 0, 3, 7, { 0 }},
+ { 224, 0, 1, 6, { 0 }},
+ { 225, 0, 1, 6, { 0 }},
+ { 226, 0, 1, 6, { 0 }},
+ { 227, 0, 1, 6, { 0 }},
+ { 228, 0, 1, 6, { 0 }},
+ { 229, 0, 1, 6, { 0 }},
+ { 230, 0, 5, 9, { 0 }},
+ { 231, 0, 5, 5, { 0 }},
+ { 232, 0, 1, 6, { 0 }},
+ { 233, 0, 1, 6, { 0 }},
+ { 234, 0, 1, 6, { 0 }},
+ { 235, 0, 1, 6, { 0 }},
+ { 236, 0, 1, 5, { 0 }},
+ { 237, 0, 1, 5, { 0 }},
+ { 238, 0, 1, 5, { 0 }},
+ { 239, 0, 1, 5, { 0 }},
+ { 240, 1, 0, 8, { 0 }},
+ { 241, 0, 1, 6, { 0 }},
+ { 242, 0, 1, 6, { 0 }},
+ { 243, 0, 1, 6, { 0 }},
+ { 244, 0, 1, 6, { 0 }},
+ { 245, 0, 1, 6, { 0 }},
+ { 246, 0, 1, 6, { 0 }},
+ { 247, 0, 7, 7, { 0 }},
+ { 248, 0, 4, 8, { 0 }},
+ { 249, 0, 1, 6, { 0 }},
+ { 250, 0, 1, 6, { 0 }},
+ { 251, 0, 1, 6, { 0 }},
+ { 252, 0, 1, 6, { 0 }},
+ { 253, 0, 1, 6, { 0 }},
+ { 254, 1, 0, 8, { 0 }},
+ { 255, 0, 1, 6, { 0 }},
+};
+
+// Style loading function: Ashes
+static void GuiLoadStyleAshes(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < ASHES_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(ashesStyleProps[i].controlId, ashesStyleProps[i].propertyId, ashesStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int ashesFontDataSize = 0;
+ unsigned char *data = DecompressData(ashesFontData, ASHES_STYLE_FONT_ATLAS_COMP_SIZE, &ashesFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, ashesFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, ashesFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/ashes/style_ashes.old.rgs b/external/raygui-4.0/styles/ashes/style_ashes.old.rgs
new file mode 100644
index 0000000..f6710cf
Binary files /dev/null and b/external/raygui-4.0/styles/ashes/style_ashes.old.rgs differ
diff --git a/external/raygui-4.0/styles/ashes/style_ashes.png b/external/raygui-4.0/styles/ashes/style_ashes.png
new file mode 100644
index 0000000..6711599
Binary files /dev/null and b/external/raygui-4.0/styles/ashes/style_ashes.png differ
diff --git a/external/raygui-4.0/styles/ashes/style_ashes.rgs b/external/raygui-4.0/styles/ashes/style_ashes.rgs
new file mode 100644
index 0000000..0847490
Binary files /dev/null and b/external/raygui-4.0/styles/ashes/style_ashes.rgs differ
diff --git a/external/raygui-4.0/styles/ashes/style_ashes.txt.rgs b/external/raygui-4.0/styles/ashes/style_ashes.txt.rgs
new file mode 100644
index 0000000..c66a8b4
--- /dev/null
+++ b/external/raygui-4.0/styles/ashes/style_ashes.txt.rgs
@@ -0,0 +1,26 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 16 charset.txt v5loxical.ttf
+p 00 00 0xf0f0f0ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x868686ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0xe6e6e6ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0x929999ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0xeaeaeaff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0x98a1a8ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0x3f3f3fff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xf6f6f6ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x414141ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x8b8b8bff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x777777ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x959595ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x00000010 TEXT_SIZE
+p 00 18 0x9dadb1ff LINE_COLOR
+p 00 19 0x6b6b6bff BACKGROUND_COLOR
+p 00 20 0x00000018 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/ashes/v5loxical.ttf b/external/raygui-4.0/styles/ashes/v5loxical.ttf
new file mode 100644
index 0000000..61501cb
Binary files /dev/null and b/external/raygui-4.0/styles/ashes/v5loxical.ttf differ
diff --git a/external/raygui-4.0/styles/bluish/README.md b/external/raygui-4.0/styles/bluish/README.md
new file mode 100644
index 0000000..c8390b3
--- /dev/null
+++ b/external/raygui-4.0/styles/bluish/README.md
@@ -0,0 +1,27 @@
+## style: bluish
+
+Like a breeze, a slight touch of color cover the clear sky, a spacious and relaxing feeling.
+
+![bluish style table](style_bluish.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_bluish.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_bluish.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_bluish.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_bluish.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_bluish.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![bluish style screen](screenshot.png)
+
+## about font
+
+"Homespun BRK" font by AEnigma (Brian Kent).
+
+100% free font, downloaded from dafont.com: [homespun-brk](https://www.dafont.com/homespun-brk.font)
diff --git a/external/raygui-4.0/styles/bluish/charset.txt b/external/raygui-4.0/styles/bluish/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/bluish/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/bluish/font_readme.txt b/external/raygui-4.0/styles/bluish/font_readme.txt
new file mode 100644
index 0000000..8dd9bdc
--- /dev/null
+++ b/external/raygui-4.0/styles/bluish/font_readme.txt
@@ -0,0 +1,76 @@
+_______________________________
+Homespun Created by Brian Kent
+
+Thanks for Downloading Homespun.
+
+Homespun TT [.ttf]
+Homespun [8pt] [.fon]
+
+
+ 'homespun.fon' is a Windows Bitmap Font (.fon). This font is best
+used at 8pt. To use it at larger point sizes (for images), try using
+a graphics program like Photoshop, Paint Shop Pro, or the Paint
+program that comes with Windows. Type out your text at the recommended
+point size [8pt], then resize the image. Set the color mode to 256
+or 2 colors so the edges don't get blured when resizing, then after you
+have the text to the size that you want, then change back to a higher
+color mode and edit the image.
+
+ For programs that don't show Bitmap Fonts in the Font Selector, you
+may be able to get the font to work by typing in:
+homespun brk
+
+ When using the TTF version, try using it with anti-aliasing off.
+
+
+If you have any questions or comments, you can e-mail me at
+kentpw@norwich.net
+
+You can visit my Webpage at
+http://www.aenigmafonts.com/
+
+________________
+INSTALLING FONTS
+
+ There's a couple of ways to install Fonts. The 'easy' way to
+install fonts is to just Unzip/place the font file [.ttf] into your
+Windows\Fonts directory (I always use this method). If you're unable
+to do it the 'easy' way, then try to do it this way (for Windows
+95/98/NT):
+
+1] Unzip the Font(s) to a folder (or somewhere, just remember where
+you unzipped it) on your Computer.
+
+2] Next, click on the START button, then select SETTINGS then
+CONTROL PANEL.
+
+3] When the Control Panel Window pops up, Double Click on FONTS.
+
+4] When the FONTS window pops up, select File then Install New Font...
+
+5] A Add Fonts window will pop up, just go to the folder that you
+unzipped the Font(s) to, select the Font(s) and then click on OK.
+Now the Font(s) are installed.
+
+ Now you can use the Font(s) in programs that utilize Fonts. Make
+sure that you install the font(s) first, then open up your apps
+(so the app will recognize the font). Sometimes you'll have to
+wait until your computer 'auto-refreshes' for programs to recognize
+fonts (Windows is sometimes slow to do that). You can refresh your
+computer quicker by going into Windows Explorer -or- My Computer and
+press F5 (or in the menubar select VIEW then REFRESH).
+
+
+__________
+DISCLAIMER
+
+-The font(s) in this zip file were created by me (Brian Kent). All
+of my Fonts are Freeware, you can use them any way you want to
+(Personal use, Commercial use, or whatever).
+
+-If you have a Font related site and would like to offer my fonts on
+your site, go right ahead. All I ask is that you keep this text file
+intact with the Font.
+
+-You may not Sell or Distribute my Fonts for profit or alter them in
+any way without asking me first. [e-mail - kentpw@norwich.net]
diff --git a/external/raygui-4.0/styles/bluish/homespun.ttf b/external/raygui-4.0/styles/bluish/homespun.ttf
new file mode 100644
index 0000000..45c23e0
Binary files /dev/null and b/external/raygui-4.0/styles/bluish/homespun.ttf differ
diff --git a/external/raygui-4.0/styles/bluish/screenshot.png b/external/raygui-4.0/styles/bluish/screenshot.png
new file mode 100644
index 0000000..ac09b88
Binary files /dev/null and b/external/raygui-4.0/styles/bluish/screenshot.png differ
diff --git a/external/raygui-4.0/styles/bluish/style_bluish.h b/external/raygui-4.0/styles/bluish/style_bluish.h
new file mode 100644
index 0000000..36e1378
--- /dev/null
+++ b/external/raygui-4.0/styles/bluish/style_bluish.h
@@ -0,0 +1,619 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleBluish(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define BLUISH_STYLE_PROPS_COUNT 14
+
+// Custom style name: Bluish
+static const GuiStyleProp bluishStyleProps[BLUISH_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x5ca6a6ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0xb4e8f3ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x447e77ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x5f8792ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xcdeff7ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x4c6c74ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x3b5b5fff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xeaffffff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x275057ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x96aaacff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0xc8d7d9ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x8c9c9eff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 18, 0x84adb7ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0xe8eef1ff }, // DEFAULT_BACKGROUND_COLOR
+};
+
+// WARNING: This style uses a custom font: "homespun.ttf" (size: 10, spacing: 1)
+
+#define BLUISH_STYLE_FONT_ATLAS_COMP_SIZE 2914
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char bluishFontData[BLUISH_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0x9d, 0xb1, 0x8e, 0x24, 0x49, 0x11, 0x86, 0x2b, 0xf3, 0x00, 0x09, 0x13, 0x01, 0x12, 0xe0, 0x20, 0x81, 0x90, 0xf0, 0x10,
+ 0x12, 0x2e, 0x16, 0x3c, 0x02, 0x2f, 0x02, 0x0e, 0xef, 0x81, 0x07, 0x12, 0x06, 0x12, 0xce, 0x99, 0x38, 0x48, 0x20, 0xe1,
+ 0x81, 0x83, 0xc0, 0xc3, 0xc5, 0xe5, 0x2c, 0x8c, 0xc3, 0x81, 0x93, 0x26, 0x33, 0xd0, 0x4e, 0xcf, 0x2e, 0xe2, 0xae, 0xfe,
+ 0xc8, 0x8a, 0xac, 0xa8, 0xea, 0xea, 0x9b, 0x6f, 0x3f, 0xed, 0x1a, 0x95, 0x5d, 0xd5, 0x99, 0x19, 0x59, 0x35, 0xb3, 0x9d,
+ 0x5f, 0x47, 0xd8, 0x02, 0x00, 0x00, 0x00, 0xf0, 0x09, 0xaa, 0x38, 0x56, 0xe5, 0xab, 0x6b, 0xe0, 0x4a, 0xb7, 0xe3, 0xd5,
+ 0x69, 0x8f, 0x5d, 0xad, 0x06, 0xae, 0xe0, 0xb5, 0xf8, 0x6d, 0x1f, 0xa7, 0xbc, 0x90, 0x31, 0xb3, 0xf5, 0xdd, 0x7c, 0xac,
+ 0xcf, 0x52, 0xe4, 0xf5, 0x35, 0x34, 0x8a, 0x75, 0x4c, 0x1c, 0xeb, 0xab, 0xe3, 0x35, 0x2b, 0xa2, 0xa5, 0x9a, 0x89, 0xfe,
+ 0xd8, 0xf3, 0x59, 0xeb, 0x57, 0xf4, 0xce, 0x5a, 0x7b, 0x8f, 0xb6, 0x72, 0x8d, 0x26, 0x57, 0xc5, 0x9b, 0x77, 0x54, 0x33,
+ 0xd4, 0x45, 0x3c, 0x6d, 0xf5, 0xb5, 0x37, 0xca, 0xa6, 0x57, 0x7b, 0xef, 0x60, 0xd6, 0xac, 0xbd, 0xcc, 0xc7, 0xc7, 0x47,
+ 0x61, 0xa1, 0xd7, 0xeb, 0x96, 0xfd, 0xf1, 0xef, 0xcf, 0xfd, 0x29, 0x2b, 0xf7, 0xc1, 0x9b, 0x68, 0x75, 0x11, 0x2f, 0xd5,
+ 0x9f, 0xdb, 0xcc, 0x95, 0xd5, 0x2b, 0x7a, 0x67, 0x2d, 0x9b, 0x67, 0x7b, 0xfd, 0xfc, 0x5b, 0x4f, 0xd7, 0xc7, 0x51, 0x9e,
+ 0xdb, 0xd6, 0xe6, 0xae, 0x25, 0x3d, 0x57, 0xd5, 0x78, 0x17, 0xf7, 0xde, 0x5a, 0x9f, 0x85, 0x1e, 0x6a, 0xd9, 0x1f, 0x7f,
+ 0xbd, 0xa2, 0xed, 0xe5, 0xaf, 0x1a, 0x59, 0x13, 0xfd, 0x29, 0xa2, 0xc5, 0x3f, 0x6b, 0x4f, 0xfc, 0xcb, 0x4b, 0x4f, 0xab,
+ 0xb8, 0x9f, 0x4d, 0xdc, 0xd1, 0x47, 0x46, 0x3f, 0x1e, 0xff, 0xf2, 0xb2, 0x56, 0x8b, 0xf8, 0xa9, 0x74, 0x6e, 0xfc, 0xcb,
+ 0xcb, 0xf3, 0xbf, 0x8a, 0xde, 0x17, 0x19, 0x7d, 0xfd, 0xb4, 0x8d, 0xfc, 0x5c, 0x8d, 0xdd, 0xff, 0xb7, 0x79, 0x56, 0x6b,
+ 0xeb, 0xb8, 0xd8, 0xfb, 0xe3, 0x8d, 0xc5, 0xdf, 0xe4, 0x4f, 0x9e, 0xb7, 0xab, 0x78, 0xef, 0x28, 0x7a, 0xd2, 0xfd, 0xdf,
+ 0x65, 0x7f, 0xca, 0xcb, 0xf3, 0x7f, 0x7d, 0xcc, 0x91, 0xbb, 0x30, 0x12, 0xff, 0x51, 0x8c, 0x8f, 0xbc, 0xf7, 0xf5, 0xb5,
+ 0xe3, 0xf1, 0xbf, 0x5d, 0x71, 0xed, 0x5d, 0x8e, 0x5e, 0xc5, 0x4b, 0xe8, 0xf7, 0xbf, 0xe2, 0xfc, 0xce, 0xf3, 0x76, 0xed,
+ 0x44, 0xc6, 0x97, 0x15, 0xe7, 0xf3, 0xb1, 0xe1, 0x08, 0x22, 0xf1, 0x2f, 0x72, 0x56, 0xcb, 0xe9, 0x3f, 0xff, 0xbd, 0xf8,
+ 0x7b, 0x3d, 0xf5, 0xe2, 0x1f, 0x1b, 0x85, 0x05, 0x7f, 0x07, 0xbf, 0x5e, 0xfc, 0xed, 0xdd, 0xff, 0x87, 0xb6, 0x8d, 0x4d,
+ 0xbd, 0xde, 0xbb, 0xd2, 0x7d, 0x46, 0x3d, 0xd3, 0x9f, 0xab, 0x8d, 0x02, 0xf6, 0xf0, 0x34, 0x11, 0xc7, 0x27, 0x62, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x66, 0xf9, 0x64, 0x19, 0x26, 0xd9, 0x2d, 0xfb, 0xac, 0x20, 0x6d, 0xe7,
+ 0x78, 0x46, 0x92, 0xdf, 0xcb, 0xb3, 0xe6, 0x63, 0x39, 0xc9, 0xf9, 0xb1, 0x09, 0x23, 0xe5, 0xac, 0x96, 0xb6, 0xd9, 0xc2,
+ 0x58, 0xdf, 0xcd, 0xd5, 0x76, 0x4e, 0x17, 0x73, 0x35, 0xea, 0xe5, 0x79, 0xf3, 0x51, 0x27, 0x7a, 0x37, 0xf3, 0x69, 0xb9,
+ 0x0d, 0x76, 0xe7, 0x5a, 0xa8, 0xa5, 0x0f, 0xf7, 0xfa, 0x62, 0xe6, 0xcb, 0xbe, 0x7d, 0x55, 0xcf, 0xce, 0x53, 0xfe, 0x87,
+ 0xd7, 0x4b, 0xe5, 0x55, 0xd8, 0xf4, 0xa8, 0x5b, 0xea, 0x39, 0x6d, 0x2a, 0xfe, 0x7a, 0x54, 0x7a, 0x6f, 0xde, 0xb7, 0x1e,
+ 0xf5, 0xd5, 0x62, 0x2d, 0xdb, 0xed, 0x03, 0x15, 0x63, 0xed, 0x48, 0x44, 0xdd, 0x19, 0x73, 0xbc, 0x8a, 0xd1, 0xd8, 0x5a,
+ 0x68, 0x6f, 0xd2, 0x06, 0x73, 0xb8, 0xdf, 0x96, 0xd9, 0x66, 0x67, 0x74, 0x67, 0xbc, 0xbe, 0x61, 0xd2, 0x43, 0xe7, 0xf4,
+ 0x04, 0x5f, 0x25, 0xba, 0x7a, 0x3c, 0x0f, 0xa7, 0x3b, 0xf1, 0xaf, 0xc1, 0xb1, 0xdd, 0x5a, 0x6a, 0x68, 0x2f, 0xd8, 0x06,
+ 0x73, 0xb8, 0xdf, 0x96, 0xd9, 0x36, 0x7f, 0x65, 0xfa, 0x89, 0x9d, 0x75, 0xce, 0x71, 0x2b, 0xc0, 0xc2, 0xd7, 0xb1, 0x77,
+ 0x2b, 0x35, 0xf3, 0xf9, 0x5f, 0x26, 0x7e, 0x22, 0x97, 0xdd, 0xae, 0xc6, 0xf6, 0x27, 0xf6, 0x9c, 0x61, 0x92, 0x75, 0xce,
+ 0xb5, 0xdc, 0x8d, 0x32, 0xf9, 0xc4, 0x3e, 0xa7, 0xe5, 0x88, 0xf8, 0xcf, 0x1a, 0x26, 0x3d, 0xed, 0x9c, 0xe5, 0x74, 0xa7,
+ 0xc7, 0xe4, 0xfd, 0xef, 0xcd, 0x47, 0xe6, 0x1c, 0x7a, 0x1e, 0x90, 0xdf, 0x83, 0xd7, 0x40, 0xe3, 0x33, 0x1b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xff, 0xe3, 0xdb, 0x37, 0x31, 0x43, 0xc5, 0xb7, 0x76, 0xa2, 0x39, 0x7a,
+ 0xea, 0xe9, 0xd6, 0x4d, 0x76, 0xcb, 0xcc, 0x5c, 0x8c, 0x5a, 0x62, 0x67, 0x8e, 0x3f, 0xef, 0xd6, 0x4e, 0x89, 0xfa, 0x54,
+ 0xbb, 0x3d, 0x9f, 0x95, 0xb3, 0xfb, 0x67, 0xc3, 0x9e, 0xdd, 0xfe, 0xad, 0x17, 0xf4, 0x93, 0x3c, 0x73, 0xe9, 0x6d, 0xcf,
+ 0x33, 0x77, 0x0b, 0x6f, 0x2d, 0x6d, 0x75, 0x2e, 0x66, 0xf7, 0xd0, 0x66, 0x3c, 0x14, 0x7f, 0x37, 0x2c, 0x2f, 0xfe, 0xb3,
+ 0x63, 0x3e, 0xb7, 0x25, 0x9a, 0x47, 0xe4, 0x7a, 0xf1, 0xf7, 0x2c, 0x9f, 0xac, 0xf8, 0xef, 0xf3, 0x60, 0xf2, 0xe2, 0x3f,
+ 0xe3, 0x70, 0xe9, 0xbe, 0x7b, 0x1e, 0xd4, 0x99, 0xf1, 0xd7, 0x79, 0xb4, 0xb6, 0xc4, 0x3f, 0x6e, 0xf9, 0xc4, 0xe3, 0xbf,
+ 0xcf, 0x83, 0xc9, 0x8b, 0xff, 0x8c, 0xc3, 0xd1, 0x9d, 0x6c, 0x51, 0x3d, 0x9c, 0x7b, 0xc4, 0x06, 0x8e, 0x61, 0x9b, 0x88,
+ 0x7f, 0x91, 0x7d, 0xdc, 0xeb, 0x7f, 0x46, 0xee, 0xff, 0x72, 0x98, 0x07, 0x93, 0xfb, 0xfc, 0xcf, 0x9a, 0x87, 0x32, 0xb0,
+ 0x0f, 0xcb, 0x84, 0x2d, 0xd2, 0x93, 0xe7, 0x62, 0x9b, 0xef, 0x90, 0x13, 0xff, 0x99, 0x6b, 0x6d, 0x3b, 0x27, 0x1a, 0xff,
+ 0x32, 0x11, 0xff, 0xcc, 0xbe, 0xfb, 0xf1, 0x2f, 0x8e, 0x2d, 0x32, 0x3e, 0x27, 0x3b, 0xfe, 0xb3, 0x56, 0x4b, 0x49, 0xbc,
+ 0x96, 0x25, 0xc7, 0x3f, 0xee, 0xc9, 0xe4, 0xf6, 0xdd, 0x8f, 0xff, 0x7c, 0xef, 0x6e, 0x7f, 0xea, 0x01, 0x0e, 0x3d, 0x90,
+ 0x71, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xb3, 0x38, 0x15, 0xa9, 0x7c, 0xcb, 0x68, 0xbb,
+ 0x2d, 0xf4, 0xd6, 0xa0, 0x58, 0xf7, 0x27, 0x72, 0x32, 0xfd, 0x8c, 0x6b, 0x77, 0x45, 0xdf, 0x47, 0xcd, 0xd6, 0x4c, 0xdf,
+ 0x8e, 0xae, 0x71, 0xb6, 0xcd, 0xf2, 0xf1, 0xbc, 0x97, 0xd8, 0x77, 0x50, 0x55, 0x6e, 0x9a, 0x2a, 0x32, 0xdd, 0x44, 0xbf,
+ 0xbb, 0xef, 0xe5, 0xaa, 0xd0, 0xd7, 0xc9, 0xcc, 0x62, 0x61, 0x72, 0xbd, 0xda, 0x44, 0xdf, 0x9a, 0x38, 0xaa, 0xae, 0x51,
+ 0xa7, 0xbf, 0x29, 0x3d, 0x9f, 0xcb, 0x61, 0x6b, 0x4e, 0x25, 0xbd, 0x63, 0x78, 0xdb, 0xeb, 0x8e, 0xae, 0x80, 0x2e, 0xef,
+ 0xb1, 0xf5, 0xbe, 0x56, 0xe9, 0xb7, 0x2c, 0xb2, 0x9a, 0x59, 0x3c, 0x57, 0x8d, 0x89, 0xaa, 0x61, 0xfe, 0xfe, 0x91, 0xea,
+ 0x9b, 0xaa, 0x96, 0xb4, 0x88, 0x6b, 0xb4, 0xe9, 0xef, 0x84, 0xdb, 0xa0, 0x8e, 0x54, 0xe4, 0xca, 0xde, 0x0a, 0xf0, 0x2a,
+ 0xb9, 0xb5, 0x84, 0x5a, 0x25, 0xf1, 0x5c, 0x35, 0x9e, 0x79, 0xe0, 0x5f, 0x2d, 0x9a, 0x9b, 0x45, 0xaf, 0x99, 0xd8, 0x93,
+ 0x21, 0x2b, 0xc3, 0xcc, 0xb6, 0x27, 0x67, 0x71, 0x46, 0xb4, 0x84, 0x57, 0xc0, 0xb1, 0x95, 0x3c, 0x8e, 0x33, 0x0f, 0xb6,
+ 0x8e, 0x22, 0x7b, 0x67, 0x79, 0x7b, 0xfc, 0x97, 0x5d, 0x39, 0x41, 0xca, 0xb4, 0x2b, 0x13, 0x5b, 0x01, 0x47, 0xc7, 0xff,
+ 0x28, 0xf3, 0x20, 0x2b, 0x03, 0x47, 0xbf, 0x68, 0xfc, 0x47, 0xd9, 0x66, 0xe2, 0xb1, 0x8c, 0x1b, 0xa3, 0xcb, 0x5d, 0x9e,
+ 0x0c, 0xd9, 0xe7, 0x2c, 0xe1, 0xff, 0xc9, 0x5c, 0x23, 0xfe, 0x73, 0x19, 0x6a, 0x4a, 0x38, 0x97, 0xd0, 0xbd, 0xe2, 0x1f,
+ 0xaf, 0x23, 0x35, 0x77, 0x4e, 0xbe, 0x7b, 0x79, 0x46, 0xfc, 0xe1, 0x71, 0x32, 0x1f, 0x35, 0xfc, 0x24, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x52, 0xfe, 0x8f, 0x88, 0xbd, 0x72, 0xff, 0x96, 0x3a, 0xd8, 0xd5, 0x2a, 0xd3, 0x2d,
+ 0x25, 0xed, 0x9a, 0x9e, 0x63, 0xb4, 0xb7, 0xe6, 0xd9, 0xdb, 0x6b, 0x97, 0x69, 0xfb, 0xe7, 0x7f, 0x7b, 0xd0, 0xb7, 0x7f,
+ 0x6b, 0xd2, 0xce, 0x7a, 0x7e, 0xcb, 0xf1, 0xdf, 0xe6, 0x3f, 0x22, 0xdf, 0x80, 0x97, 0x21, 0xa2, 0x6e, 0x76, 0x2b, 0x9a,
+ 0xdc, 0x53, 0xed, 0x32, 0x67, 0x40, 0x9b, 0xd8, 0x83, 0xb8, 0x7f, 0x96, 0x9d, 0x16, 0xac, 0x43, 0x55, 0x4f, 0xcc, 0xb1,
+ 0xd1, 0x07, 0x3e, 0x4c, 0xcc, 0xa1, 0xd1, 0x39, 0x14, 0x96, 0xd0, 0x6b, 0x55, 0x4d, 0xa2, 0xf2, 0x90, 0xf1, 0x5f, 0x82,
+ 0x6e, 0x5f, 0xdf, 0x90, 0x2f, 0x23, 0x2b, 0xc7, 0x46, 0x99, 0x30, 0x7c, 0x8a, 0x53, 0x7f, 0x2c, 0x16, 0x7f, 0x55, 0xad,
+ 0x2e, 0xfe, 0x6c, 0x3c, 0x23, 0xcb, 0x46, 0x7e, 0x05, 0x9b, 0xbc, 0x6c, 0x1e, 0xf9, 0x39, 0x36, 0xbc, 0x9d, 0x72, 0xed,
+ 0x55, 0xc6, 0xe2, 0x1f, 0xcd, 0xed, 0x70, 0x46, 0xfc, 0x67, 0x6b, 0xdb, 0xe4, 0x66, 0xe6, 0x28, 0x17, 0xc9, 0xb1, 0x11,
+ 0xcd, 0x10, 0xb2, 0xff, 0xf9, 0x9f, 0xed, 0x23, 0xe4, 0xed, 0x54, 0x9f, 0x93, 0x67, 0x63, 0xc6, 0xd3, 0x39, 0x6a, 0x67,
+ 0x3e, 0xbe, 0x3b, 0x1f, 0x71, 0x2b, 0xfb, 0x43, 0xc5, 0xff, 0xca, 0x6e, 0xcf, 0x95, 0x38, 0xb2, 0xe6, 0x19, 0xf6, 0xcf,
+ 0xa3, 0xae, 0x69, 0xe6, 0xe0, 0x75, 0x5b, 0x5e, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x93, 0x01,
+ 0x68, 0x91, 0x39, 0x6d, 0x3e, 0x79, 0xfc, 0x8b, 0x56, 0xed, 0x5b, 0xf6, 0x35, 0xfb, 0x8e, 0x7d, 0xd7, 0xbe, 0xe2, 0x5c,
+ 0xb1, 0xa6, 0xe5, 0x1b, 0x1a, 0x9d, 0x53, 0x83, 0x75, 0xca, 0x4a, 0xd8, 0xd7, 0xd9, 0x57, 0x8b, 0x2c, 0x36, 0xf3, 0xd1,
+ 0x6b, 0x8d, 0xe2, 0xe1, 0xfb, 0x5f, 0x9e, 0x45, 0xb1, 0x9e, 0xb7, 0xe7, 0xe7, 0xf6, 0x64, 0x1f, 0xda, 0x3f, 0xed, 0x1f,
+ 0xf6, 0x37, 0xfb, 0xd0, 0x3e, 0x2b, 0x3f, 0xc3, 0x5c, 0xf7, 0x52, 0xde, 0x8c, 0xe1, 0x29, 0x58, 0x4d, 0xcb, 0x3f, 0x47,
+ 0x55, 0x08, 0x53, 0xd7, 0x2b, 0xcf, 0xd6, 0x44, 0x0b, 0xf9, 0x3a, 0xe3, 0x77, 0x52, 0xdf, 0xf1, 0x6e, 0xe1, 0x0a, 0x01,
+ 0x7e, 0x55, 0xb1, 0x78, 0x3c, 0xe6, 0x32, 0xa7, 0xdc, 0xf6, 0xd7, 0xd6, 0xc6, 0xf4, 0x7b, 0xfb, 0x8f, 0xfd, 0xc0, 0xaa,
+ 0xfd, 0xd0, 0xbe, 0x6a, 0x7f, 0xb5, 0xcf, 0xc9, 0xbc, 0x36, 0xeb, 0xe3, 0x6b, 0xd2, 0x87, 0xd1, 0xb9, 0x60, 0xbc, 0x73,
+ 0xca, 0xcb, 0x2e, 0x60, 0x5d, 0xbd, 0x5f, 0xd6, 0xad, 0xac, 0xe2, 0xe6, 0xaa, 0xd1, 0xde, 0x50, 0x19, 0xe6, 0x39, 0x5a,
+ 0x9b, 0x8b, 0x2e, 0x72, 0x0c, 0x75, 0x71, 0xe7, 0xa9, 0x7e, 0xab, 0xe3, 0xa3, 0x78, 0x8c, 0xf7, 0x1b, 0xd6, 0xb3, 0x20,
+ 0x99, 0x18, 0xe9, 0xaf, 0xed, 0xcf, 0xf6, 0x0d, 0xfb, 0xb6, 0xfd, 0xcb, 0xfe, 0x6d, 0x1f, 0xd9, 0x67, 0x56, 0xef, 0x22,
+ 0xe5, 0xe6, 0xe8, 0x27, 0xa5, 0x97, 0x0d, 0xa9, 0x38, 0x39, 0x9c, 0xba, 0x8c, 0xa7, 0xbe, 0xf7, 0xba, 0x5c, 0x9d, 0xde,
+ 0x3c, 0xf5, 0xe1, 0xca, 0x51, 0x7b, 0xc3, 0x25, 0x34, 0x47, 0xaa, 0x72, 0xa0, 0xba, 0xff, 0x47, 0xf1, 0x18, 0xc7, 0xbf,
+ 0x08, 0x43, 0x65, 0x7d, 0x8e, 0x7e, 0x61, 0x7f, 0xb7, 0xaf, 0xdb, 0x97, 0xec, 0x0b, 0xf6, 0x79, 0x7b, 0x5f, 0xc4, 0x4b,
+ 0xad, 0xed, 0x51, 0x06, 0xa5, 0xb8, 0x01, 0x7a, 0x8b, 0xc7, 0x7a, 0xfc, 0x6b, 0x9a, 0x1d, 0x60, 0xef, 0x9e, 0x0b, 0x73,
+ 0x75, 0xb6, 0x22, 0xcf, 0x7f, 0xf5, 0x13, 0x59, 0x3d, 0x53, 0x47, 0xf1, 0x98, 0x75, 0x28, 0x4c, 0xdc, 0x75, 0x7f, 0xb0,
+ 0x9f, 0xd9, 0x4f, 0xed, 0x7b, 0xf6, 0x2b, 0xfb, 0xc8, 0x9a, 0x7d, 0x33, 0xb8, 0xb6, 0x4b, 0xb8, 0xde, 0xa0, 0x4d, 0xde,
+ 0xff, 0x5d, 0xda, 0x77, 0xd7, 0x8e, 0xbf, 0xea, 0xb7, 0x3a, 0x3e, 0x8a, 0xc7, 0xac, 0x43, 0xa1, 0x5c, 0xc9, 0xf7, 0xed,
+ 0xc7, 0xf6, 0x81, 0xfd, 0xd2, 0x7e, 0x64, 0xdf, 0xb7, 0xdf, 0xd8, 0x97, 0x27, 0xc6, 0x66, 0xa1, 0xdf, 0xbd, 0xbc, 0xdf,
+ 0xca, 0xca, 0x20, 0xef, 0x54, 0x6e, 0x1e, 0xa1, 0x33, 0xde, 0x29, 0xce, 0x96, 0x78, 0xc4, 0x6d, 0x2c, 0xbd, 0x32, 0x7e,
+ 0x62, 0xbf, 0xb5, 0x3f, 0xd9, 0x07, 0xf6, 0x3b, 0xfb, 0xa3, 0xfd, 0xc5, 0xde, 0x73, 0x4c, 0xba, 0x68, 0xcd, 0xbc, 0x59,
+ 0xbf, 0xce, 0xe4, 0xef, 0x2a, 0xd9, 0xae, 0x51, 0xd6, 0x3b, 0x59, 0xa2, 0xbd, 0x34, 0x8a, 0xc7, 0xb5, 0xfc, 0x96, 0x99,
+ 0xac, 0x7b, 0x8f, 0xed, 0x79, 0xc1, 0x96, 0x58, 0xce, 0x59, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
+ 0xc5, 0xfe, 0xf1, 0xdd, 0x9a, 0x65, 0x53, 0x76, 0x89, 0xb1, 0x15, 0x14, 0x71, 0x5a, 0x8a, 0xcc, 0x61, 0x51, 0x37, 0xd4,
+ 0xda, 0x2a, 0xa1, 0x91, 0xce, 0x1c, 0x1f, 0xf9, 0x3b, 0xfa, 0x78, 0x9e, 0x15, 0x35, 0xe3, 0x23, 0x45, 0x3f, 0x75, 0x6d,
+ 0x6e, 0xe5, 0x9e, 0x88, 0x85, 0xa2, 0x6b, 0x89, 0x99, 0x70, 0x34, 0x9a, 0xf0, 0x04, 0x9a, 0x3c, 0xcb, 0x5e, 0x76, 0x1e,
+ 0x4d, 0x66, 0xc4, 0x79, 0x92, 0xce, 0x8d, 0x3a, 0xfe, 0x9e, 0x8c, 0xf2, 0x93, 0xcc, 0xeb, 0xb3, 0x7e, 0x96, 0x3d, 0x1f,
+ 0xef, 0xa1, 0xbe, 0x99, 0x5b, 0x85, 0xcd, 0x9c, 0xb6, 0xb6, 0xe9, 0x13, 0xf3, 0x51, 0xfc, 0xb7, 0x7b, 0x12, 0x63, 0x0b,
+ 0xc5, 0xe4, 0x0e, 0xfe, 0xba, 0xa3, 0xa5, 0xb3, 0xed, 0xf8, 0x6d, 0xca, 0x9e, 0xf1, 0x73, 0x69, 0x69, 0x83, 0x23, 0xba,
+ 0x62, 0x54, 0x2c, 0x9b, 0x34, 0x99, 0x7c, 0x2b, 0xa6, 0x3a, 0xee, 0x83, 0x97, 0x91, 0xa8, 0x9d, 0x1a, 0xff, 0xb1, 0x85,
+ 0x12, 0x89, 0x7f, 0x77, 0x33, 0x24, 0x68, 0xbb, 0x64, 0x94, 0x11, 0x47, 0xbb, 0x58, 0x65, 0xea, 0xe9, 0x9b, 0xd3, 0xe2,
+ 0xdf, 0xe5, 0x4d, 0xee, 0x7d, 0x7b, 0xf3, 0x10, 0xcf, 0xff, 0xb2, 0x66, 0x71, 0x6c, 0x8f, 0xff, 0xd8, 0x42, 0x31, 0x51,
+ 0x03, 0x6f, 0xce, 0xc4, 0x8a, 0x65, 0x77, 0xf2, 0x57, 0xba, 0xce, 0xec, 0x74, 0x56, 0x8e, 0xbb, 0x99, 0x8c, 0x59, 0x9e,
+ 0x65, 0xb3, 0x6c, 0xcc, 0x01, 0x66, 0x03, 0x5b, 0x63, 0x7b, 0xfc, 0xc7, 0x16, 0x4a, 0xc4, 0x69, 0x19, 0x9b, 0x38, 0x25,
+ 0xb8, 0xab, 0xee, 0xf9, 0x45, 0x3a, 0x8f, 0xd0, 0x4c, 0x25, 0xc8, 0xb3, 0x5a, 0xbc, 0x79, 0x28, 0x1b, 0x23, 0xe7, 0xe7,
+ 0xd0, 0x89, 0xc4, 0x7f, 0x9f, 0x85, 0x12, 0x33, 0x08, 0xe2, 0xfe, 0xe6, 0xd8, 0x22, 0xea, 0x77, 0xcf, 0x71, 0x19, 0x7f,
+ 0x66, 0x74, 0xb9, 0x36, 0xb6, 0x1a, 0x13, 0xfe, 0x2b, 0x23, 0xf3, 0x7c, 0x96, 0x85, 0x32, 0x6b, 0xce, 0x94, 0x09, 0xbf,
+ 0xe4, 0xdc, 0xec, 0x87, 0xf1, 0x96, 0x3e, 0x88, 0x1d, 0xf9, 0x46, 0xb6, 0x3e, 0xe9, 0xe2, 0xbf, 0x1d, 0xdf, 0xbb, 0x65,
+ 0x64, 0xf5, 0x61, 0xd2, 0xec, 0xb7, 0xc8, 0x1e, 0x37, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x19,
+ 0x2e, 0x4b, 0xb0, 0x86, 0x95, 0x6e, 0xd3, 0x47, 0x6b, 0x28, 0x6b, 0x8e, 0xe7, 0xdd, 0xdc, 0xdf, 0xef, 0x29, 0xee, 0x3e,
+ 0x5d, 0x5e, 0x9f, 0xbd, 0x4f, 0x80, 0xf3, 0x0c, 0x17, 0xcf, 0x7d, 0xa8, 0xa1, 0x77, 0xa9, 0xce, 0x3b, 0x3c, 0x89, 0x3d,
+ 0xaf, 0xb8, 0x77, 0x73, 0x7f, 0xbf, 0x47, 0x19, 0x1c, 0x55, 0x7a, 0x1f, 0x33, 0x7d, 0x1e, 0xad, 0x80, 0x2c, 0xc3, 0xc5,
+ 0xf3, 0xce, 0x62, 0xef, 0xd2, 0x44, 0x8b, 0xbe, 0xbe, 0xfe, 0x7c, 0xbf, 0x39, 0x19, 0x84, 0xee, 0xed, 0xf7, 0xe8, 0x6a,
+ 0x54, 0xca, 0xfb, 0xa8, 0x72, 0x05, 0xdc, 0x72, 0x5a, 0xd5, 0xe0, 0xd3, 0xff, 0x1c, 0x8f, 0x25, 0x9a, 0xd3, 0x4c, 0x1d,
+ 0xbf, 0x39, 0x6f, 0x3a, 0x5b, 0x51, 0x2c, 0xe7, 0xd0, 0xfd, 0xfd, 0x9e, 0xee, 0xe6, 0x9b, 0x3a, 0x7e, 0xaf, 0x60, 0x94,
+ 0x8f, 0xa7, 0x4f, 0x54, 0x64, 0x5c, 0xcf, 0x77, 0x64, 0xc2, 0xff, 0x88, 0x1d, 0x5f, 0x64, 0x46, 0x27, 0x73, 0x76, 0xc3,
+ 0xaf, 0xb0, 0x57, 0x1f, 0x8b, 0xcc, 0xcd, 0x72, 0xb0, 0x13, 0xe2, 0x5f, 0x9c, 0x7a, 0x68, 0x79, 0x2d, 0xcb, 0xa0, 0xee,
+ 0x5a, 0xd6, 0xf1, 0xeb, 0xee, 0xd5, 0x47, 0xe3, 0x6f, 0x27, 0xc5, 0xdf, 0x77, 0xdf, 0xb2, 0x5a, 0x88, 0x7f, 0x34, 0xfe,
+ 0xfd, 0xa4, 0xe7, 0xbf, 0x76, 0xdf, 0x32, 0x5b, 0xce, 0x88, 0xbf, 0xb9, 0x35, 0xf5, 0x1e, 0x2d, 0xfe, 0xe5, 0x14, 0x57,
+ 0x20, 0xbb, 0x8a, 0xa7, 0x9f, 0x4d, 0xee, 0xc8, 0xf8, 0xcf, 0x59, 0x1c, 0xe5, 0xce, 0x2d, 0x71, 0x5b, 0x25, 0xf3, 0x5d,
+ 0xf2, 0xab, 0x78, 0xfa, 0x2d, 0xc7, 0x1d, 0xdf, 0xf3, 0x1d, 0x07, 0xbb, 0x63, 0x4b, 0xdc, 0xcb, 0xcb, 0x7c, 0x17, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x2d, 0xfe, 0x4f, 0xd4, 0xe5, 0x99, 0x31, 0x53, 0xaa, 0xeb, 0xe7, 0x5c, 0x35,
+ 0xc7, 0x8e, 0x97, 0x4f, 0x48, 0xb7, 0xdc, 0xdb, 0xa9, 0xaa, 0xa1, 0xe8, 0xc7, 0x5d, 0x1e, 0xed, 0x99, 0xd8, 0xc4, 0x0e,
+ 0xb8, 0xef, 0x06, 0xb5, 0x09, 0x07, 0xa7, 0x3a, 0x0e, 0x4e, 0x0b, 0xe5, 0xd8, 0xe8, 0x4e, 0x3e, 0x21, 0x73, 0x72, 0x17,
+ 0x64, 0x8e, 0x48, 0xf7, 0xbb, 0x89, 0x55, 0xd1, 0xc2, 0x9f, 0x33, 0x3e, 0x85, 0xf2, 0xe5, 0x68, 0xcf, 0x64, 0x76, 0x07,
+ 0x7c, 0xce, 0xc1, 0x69, 0x21, 0x07, 0xc7, 0xab, 0x22, 0x55, 0x07, 0x55, 0xba, 0xf4, 0x6e, 0x4b, 0xae, 0x53, 0x15, 0xeb,
+ 0xb7, 0x9e, 0x81, 0x8c, 0xfc, 0x6f, 0xd9, 0x3b, 0x60, 0x45, 0x98, 0x6e, 0x33, 0x4f, 0xd8, 0x99, 0x16, 0x9d, 0xff, 0xc1,
+ 0xab, 0xde, 0x37, 0x53, 0xc9, 0x28, 0xb7, 0xdf, 0x5e, 0x85, 0xbe, 0x12, 0xca, 0x64, 0x75, 0xdf, 0x6f, 0x38, 0x77, 0x51,
+ 0x39, 0x27, 0xb7, 0x22, 0x90, 0x6e, 0x29, 0x32, 0x27, 0x4a, 0x71, 0x6b, 0x52, 0xf5, 0x70, 0x7d, 0x9c, 0x6c, 0x77, 0xa8,
+ 0x38, 0x96, 0x60, 0xd9, 0x91, 0xfb, 0x69, 0xdf, 0xbd, 0xdc, 0x27, 0x72, 0xec, 0xf4, 0x89, 0xb8, 0x64, 0xb5, 0xd8, 0x54,
+ 0x7d, 0xa9, 0x71, 0x7e, 0x94, 0xe3, 0xb3, 0x06, 0x75, 0xc7, 0xb7, 0xb9, 0x47, 0xfc, 0xc7, 0xf3, 0x15, 0x7f, 0x32, 0x9c,
+ 0x73, 0x1f, 0x45, 0x57, 0xe0, 0x5c, 0x8e, 0x8d, 0x6c, 0xa7, 0xb2, 0x0c, 0xec, 0x8d, 0xb3, 0xe3, 0x5f, 0x06, 0xe7, 0xe8,
+ 0xac, 0x5d, 0x76, 0x57, 0x07, 0x23, 0xfe, 0xbc, 0xde, 0x93, 0x69, 0x26, 0xaf, 0xc5, 0xaf, 0xd0, 0xb7, 0x37, 0xfe, 0x67,
+ 0xd8, 0x2c, 0x57, 0x30, 0x50, 0x72, 0x33, 0x03, 0x9d, 0x37, 0xa2, 0xe8, 0x4a, 0xb3, 0x8b, 0xf6, 0xf5, 0xd3, 0x95, 0x19,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xd1, 0xf3, 0xff, 0xd4, 0x70, 0xcb, 0x95, 0xb3, 0xec, 0xe4, 0xe5,
+ 0x1f, 0xca, 0x76, 0x78, 0xe6, 0x5c, 0xaa, 0xb9, 0x4c, 0x3f, 0xca, 0x47, 0xa9, 0x81, 0xfc, 0x2b, 0x37, 0xeb, 0x44, 0x55,
+ 0xaa, 0xaa, 0x27, 0xf8, 0x30, 0x33, 0x86, 0x8f, 0x3a, 0xea, 0xed, 0xfc, 0x9c, 0xe3, 0xf0, 0xe8, 0xab, 0xd9, 0xc0, 0xd9,
+ 0xc9, 0xc9, 0xef, 0xde, 0x9c, 0xb9, 0x99, 0x59, 0x31, 0xed, 0x92, 0x86, 0xcf, 0x8c, 0x5b, 0x91, 0xeb, 0xf0, 0xe8, 0x19,
+ 0x6d, 0xd2, 0x2f, 0xf0, 0xab, 0x2f, 0x66, 0x7d, 0x5a, 0x1d, 0xdd, 0x91, 0x6a, 0x61, 0x8b, 0xa2, 0xdc, 0xdd, 0x94, 0xe9,
+ 0xae, 0xc3, 0xd3, 0x43, 0x11, 0x9b, 0x69, 0x19, 0xed, 0xa5, 0x96, 0x44, 0x97, 0x2e, 0x6b, 0xb7, 0xd2, 0x82, 0x4f, 0xcc,
+ 0x6b, 0x67, 0xd9, 0x29, 0x4e, 0xf6, 0x93, 0x47, 0xac, 0xfc, 0x72, 0xaf, 0xf8, 0x3f, 0xe6, 0x8c, 0xf9, 0x39, 0x29, 0x1e,
+ 0x2d, 0xca, 0x36, 0xe9, 0xab, 0xe4, 0xc4, 0xff, 0xda, 0xf3, 0x92, 0x97, 0x65, 0xe3, 0x9c, 0x9e, 0xcd, 0x19, 0x61, 0x99,
+ 0xfb, 0xd5, 0xd1, 0xf8, 0x97, 0xe4, 0xd1, 0x9f, 0x61, 0xf8, 0xcc, 0x64, 0xd9, 0x38, 0xcb, 0x3d, 0x9a, 0xb5, 0x2c, 0x8e,
+ 0xbe, 0xff, 0x33, 0xef, 0x98, 0x7b, 0x1b, 0x3e, 0x57, 0x76, 0x78, 0xe2, 0x2e, 0x9d, 0xf6, 0xd5, 0xe1, 0xd1, 0xd0, 0xb1,
+ 0x7c, 0x3d, 0x95, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe6, 0xb9, 0xfd, 0x61, 0x1e, 0x88, 0x3f, 0xbc, 0xda, 0xf8, 0xff, 0x17 };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle bluishFontRecs[189] = {
+ { 4, 4, 5 , 10 },
+ { 17, 4, 2 , 8 },
+ { 27, 4, 4 , 3 },
+ { 39, 4, 6 , 8 },
+ { 53, 4, 5 , 10 },
+ { 66, 4, 6 , 8 },
+ { 80, 4, 5 , 10 },
+ { 93, 4, 2 , 3 },
+ { 103, 4, 3 , 8 },
+ { 114, 4, 3 , 8 },
+ { 125, 4, 6 , 6 },
+ { 139, 4, 6 , 6 },
+ { 153, 4, 2 , 3 },
+ { 163, 4, 5 , 2 },
+ { 176, 4, 2 , 2 },
+ { 186, 4, 6 , 8 },
+ { 200, 4, 5 , 8 },
+ { 213, 4, 3 , 8 },
+ { 224, 4, 5 , 8 },
+ { 237, 4, 5 , 8 },
+ { 4, 22, 5 , 8 },
+ { 17, 22, 5 , 8 },
+ { 30, 22, 5 , 8 },
+ { 43, 22, 5 , 8 },
+ { 56, 22, 5 , 8 },
+ { 69, 22, 5 , 8 },
+ { 82, 22, 2 , 8 },
+ { 92, 22, 2 , 9 },
+ { 102, 22, 4 , 6 },
+ { 114, 22, 5 , 4 },
+ { 127, 22, 4 , 6 },
+ { 139, 22, 5 , 8 },
+ { 152, 22, 6 , 8 },
+ { 166, 22, 5 , 8 },
+ { 179, 22, 5 , 8 },
+ { 192, 22, 5 , 8 },
+ { 205, 22, 5 , 8 },
+ { 218, 22, 5 , 8 },
+ { 231, 22, 5 , 8 },
+ { 4, 40, 5 , 8 },
+ { 17, 40, 5 , 8 },
+ { 30, 40, 4 , 8 },
+ { 42, 40, 5 , 8 },
+ { 55, 40, 5 , 8 },
+ { 68, 40, 5 , 8 },
+ { 81, 40, 8 , 8 },
+ { 97, 40, 5 , 8 },
+ { 110, 40, 5 , 8 },
+ { 123, 40, 5 , 8 },
+ { 136, 40, 5 , 9 },
+ { 149, 40, 5 , 8 },
+ { 162, 40, 5 , 8 },
+ { 175, 40, 6 , 8 },
+ { 189, 40, 5 , 8 },
+ { 202, 40, 5 , 8 },
+ { 215, 40, 8 , 8 },
+ { 231, 40, 5 , 8 },
+ { 4, 58, 5 , 8 },
+ { 17, 58, 5 , 8 },
+ { 30, 58, 3 , 8 },
+ { 41, 58, 6 , 8 },
+ { 55, 58, 3 , 8 },
+ { 66, 58, 6 , 4 },
+ { 80, 58, 5 , 1 },
+ { 93, 58, 2 , 3 },
+ { 103, 58, 5 , 6 },
+ { 116, 58, 5 , 8 },
+ { 129, 58, 5 , 6 },
+ { 142, 58, 5 , 8 },
+ { 155, 58, 5 , 6 },
+ { 168, 58, 5 , 8 },
+ { 181, 58, 5 , 7 },
+ { 194, 58, 5 , 8 },
+ { 207, 58, 2 , 8 },
+ { 217, 58, 3 , 9 },
+ { 228, 58, 5 , 8 },
+ { 241, 58, 2 , 8 },
+ { 4, 76, 8 , 6 },
+ { 20, 76, 5 , 6 },
+ { 33, 76, 5 , 6 },
+ { 46, 76, 5 , 7 },
+ { 59, 76, 5 , 7 },
+ { 72, 76, 5 , 6 },
+ { 85, 76, 5 , 6 },
+ { 98, 76, 5 , 8 },
+ { 111, 76, 5 , 6 },
+ { 124, 76, 5 , 6 },
+ { 137, 76, 8 , 6 },
+ { 153, 76, 5 , 6 },
+ { 166, 76, 5 , 7 },
+ { 179, 76, 5 , 6 },
+ { 192, 76, 4 , 8 },
+ { 204, 76, 2 , 10 },
+ { 214, 76, 4 , 8 },
+ { 226, 76, 6 , 4 },
+ { 240, 76, 2 , 8 },
+ { 4, 94, 5 , 8 },
+ { 17, 94, 5 , 8 },
+ { 30, 94, 8 , 8 },
+ { 46, 94, 6 , 8 },
+ { 60, 94, 5 , 10 },
+ { 73, 94, 5 , 10 },
+ { 86, 94, 5 , 9 },
+ { 99, 94, 7 , 8 },
+ { 114, 94, 4 , 6 },
+ { 126, 94, 5 , 4 },
+ { 139, 94, 5 , 3 },
+ { 152, 94, 7 , 8 },
+ { 167, 94, 5 , 2 },
+ { 180, 94, 4 , 4 },
+ { 192, 94, 6 , 8 },
+ { 206, 94, 4 , 6 },
+ { 218, 94, 4 , 6 },
+ { 230, 94, 8 , 8 },
+ { 4, 112, 5 , 9 },
+ { 17, 112, 6 , 8 },
+ { 31, 112, 2 , 2 },
+ { 41, 112, 8 , 8 },
+ { 57, 112, 3 , 6 },
+ { 68, 112, 4 , 6 },
+ { 80, 112, 5 , 4 },
+ { 93, 112, 6 , 8 },
+ { 107, 112, 6 , 6 },
+ { 121, 112, 5 , 10 },
+ { 134, 112, 5 , 8 },
+ { 147, 112, 5 , 10 },
+ { 160, 112, 5 , 10 },
+ { 173, 112, 5 , 10 },
+ { 186, 112, 5 , 10 },
+ { 199, 112, 5 , 10 },
+ { 212, 112, 5 , 10 },
+ { 225, 112, 6 , 8 },
+ { 239, 112, 5 , 9 },
+ { 4, 130, 5 , 10 },
+ { 17, 130, 5 , 10 },
+ { 30, 130, 5 , 10 },
+ { 43, 130, 5 , 10 },
+ { 56, 130, 4 , 10 },
+ { 68, 130, 4 , 10 },
+ { 80, 130, 4 , 10 },
+ { 92, 130, 4 , 10 },
+ { 104, 130, 6 , 8 },
+ { 118, 130, 5 , 10 },
+ { 131, 130, 5 , 10 },
+ { 144, 130, 5 , 10 },
+ { 157, 130, 5 , 10 },
+ { 170, 130, 5 , 10 },
+ { 183, 130, 5 , 10 },
+ { 196, 130, 4 , 4 },
+ { 208, 130, 5 , 10 },
+ { 221, 130, 5 , 10 },
+ { 234, 130, 5 , 10 },
+ { 4, 148, 5 , 10 },
+ { 17, 148, 5 , 10 },
+ { 30, 148, 5 , 10 },
+ { 43, 148, 5 , 8 },
+ { 56, 148, 5 , 8 },
+ { 69, 148, 5 , 9 },
+ { 82, 148, 5 , 9 },
+ { 95, 148, 5 , 9 },
+ { 108, 148, 5 , 9 },
+ { 121, 148, 5 , 8 },
+ { 134, 148, 5 , 10 },
+ { 147, 148, 6 , 6 },
+ { 161, 148, 5 , 7 },
+ { 174, 148, 5 , 9 },
+ { 187, 148, 5 , 9 },
+ { 200, 148, 5 , 9 },
+ { 213, 148, 5 , 8 },
+ { 226, 148, 3 , 9 },
+ { 237, 148, 3 , 9 },
+ { 4, 166, 4 , 9 },
+ { 16, 166, 4 , 8 },
+ { 28, 166, 5 , 9 },
+ { 41, 166, 5 , 9 },
+ { 54, 166, 5 , 9 },
+ { 67, 166, 5 , 9 },
+ { 80, 166, 5 , 9 },
+ { 93, 166, 5 , 9 },
+ { 106, 166, 5 , 8 },
+ { 119, 166, 4 , 6 },
+ { 131, 166, 5 , 8 },
+ { 144, 166, 5 , 9 },
+ { 157, 166, 5 , 9 },
+ { 170, 166, 5 , 9 },
+ { 183, 166, 5 , 8 },
+ { 196, 166, 5 , 10 },
+ { 209, 166, 5 , 10 },
+ { 222, 166, 5 , 9 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo bluishFontGlyphs[189] = {
+ { 32, 0, 9, 5, { 0 }},
+ { 33, 0, 1, 2, { 0 }},
+ { 34, 0, 1, 4, { 0 }},
+ { 35, 0, 1, 6, { 0 }},
+ { 36, 0, 0, 5, { 0 }},
+ { 37, 0, 1, 6, { 0 }},
+ { 38, 0, 0, 5, { 0 }},
+ { 39, 0, 1, 2, { 0 }},
+ { 40, 0, 1, 3, { 0 }},
+ { 41, 0, 1, 3, { 0 }},
+ { 42, 0, 1, 6, { 0 }},
+ { 43, 0, 2, 6, { 0 }},
+ { 44, 0, 7, 2, { 0 }},
+ { 45, 0, 4, 5, { 0 }},
+ { 46, 0, 7, 2, { 0 }},
+ { 47, 0, 1, 6, { 0 }},
+ { 48, 0, 1, 5, { 0 }},
+ { 49, 0, 1, 3, { 0 }},
+ { 50, 0, 1, 5, { 0 }},
+ { 51, 0, 1, 5, { 0 }},
+ { 52, 0, 1, 5, { 0 }},
+ { 53, 0, 1, 5, { 0 }},
+ { 54, 0, 1, 5, { 0 }},
+ { 55, 0, 1, 5, { 0 }},
+ { 56, 0, 1, 5, { 0 }},
+ { 57, 0, 1, 5, { 0 }},
+ { 58, 0, 1, 2, { 0 }},
+ { 59, 0, 1, 2, { 0 }},
+ { 60, 0, 2, 4, { 0 }},
+ { 61, 0, 3, 5, { 0 }},
+ { 62, 0, 2, 4, { 0 }},
+ { 63, 0, 1, 5, { 0 }},
+ { 64, 0, 1, 6, { 0 }},
+ { 65, 0, 1, 5, { 0 }},
+ { 66, 0, 1, 5, { 0 }},
+ { 67, 0, 1, 5, { 0 }},
+ { 68, 0, 1, 5, { 0 }},
+ { 69, 0, 1, 5, { 0 }},
+ { 70, 0, 1, 5, { 0 }},
+ { 71, 0, 1, 5, { 0 }},
+ { 72, 0, 1, 5, { 0 }},
+ { 73, 0, 1, 4, { 0 }},
+ { 74, 0, 1, 5, { 0 }},
+ { 75, 0, 1, 5, { 0 }},
+ { 76, 0, 1, 5, { 0 }},
+ { 77, 0, 1, 8, { 0 }},
+ { 78, 0, 1, 5, { 0 }},
+ { 79, 0, 1, 5, { 0 }},
+ { 80, 0, 1, 5, { 0 }},
+ { 81, 0, 1, 5, { 0 }},
+ { 82, 0, 1, 5, { 0 }},
+ { 83, 0, 1, 5, { 0 }},
+ { 84, 0, 1, 6, { 0 }},
+ { 85, 0, 1, 5, { 0 }},
+ { 86, 0, 1, 5, { 0 }},
+ { 87, 0, 1, 8, { 0 }},
+ { 88, 0, 1, 5, { 0 }},
+ { 89, 0, 1, 5, { 0 }},
+ { 90, 0, 1, 5, { 0 }},
+ { 91, 0, 1, 3, { 0 }},
+ { 92, 0, 1, 6, { 0 }},
+ { 93, 0, 1, 3, { 0 }},
+ { 94, 0, 1, 6, { 0 }},
+ { 95, 0, 9, 5, { 0 }},
+ { 96, 0, 1, 2, { 0 }},
+ { 97, 0, 3, 5, { 0 }},
+ { 98, 0, 1, 5, { 0 }},
+ { 99, 0, 3, 5, { 0 }},
+ { 100, 0, 1, 5, { 0 }},
+ { 101, 0, 3, 5, { 0 }},
+ { 102, 0, 1, 5, { 0 }},
+ { 103, 0, 3, 5, { 0 }},
+ { 104, 0, 1, 5, { 0 }},
+ { 105, 0, 1, 2, { 0 }},
+ { 106, 0, 1, 3, { 0 }},
+ { 107, 0, 1, 5, { 0 }},
+ { 108, 0, 1, 2, { 0 }},
+ { 109, 0, 3, 8, { 0 }},
+ { 110, 0, 3, 5, { 0 }},
+ { 111, 0, 3, 5, { 0 }},
+ { 112, 0, 3, 5, { 0 }},
+ { 113, 0, 3, 5, { 0 }},
+ { 114, 0, 3, 5, { 0 }},
+ { 115, 0, 3, 5, { 0 }},
+ { 116, 0, 1, 5, { 0 }},
+ { 117, 0, 3, 5, { 0 }},
+ { 118, 0, 3, 5, { 0 }},
+ { 119, 0, 3, 8, { 0 }},
+ { 120, 0, 3, 5, { 0 }},
+ { 121, 0, 3, 5, { 0 }},
+ { 122, 0, 3, 5, { 0 }},
+ { 123, 0, 1, 4, { 0 }},
+ { 124, 0, 0, 2, { 0 }},
+ { 125, 0, 1, 4, { 0 }},
+ { 126, 0, 3, 6, { 0 }},
+ { 161, 0, 1, 2, { 0 }},
+ { 162, 0, 2, 5, { 0 }},
+ { 163, 0, 1, 5, { 0 }},
+ { 8364, 0, 1, 7, { 0 }},
+ { 165, 0, 1, 6, { 0 }},
+ { 352, 0, -1, 5, { 0 }},
+ { 167, 0, 0, 5, { 0 }},
+ { 353, 0, 0, 5, { 0 }},
+ { 169, 0, 1, 7, { 0 }},
+ { 170, 0, -1, 4, { 0 }},
+ { 171, 0, 3, 5, { 0 }},
+ { 172, 0, 4, 5, { 0 }},
+ { 174, 0, 1, 7, { 0 }},
+ { 175, 0, -1, 5, { 0 }},
+ { 176, 0, -1, 4, { 0 }},
+ { 177, 0, 1, 6, { 0 }},
+ { 178, 0, -1, 4, { 0 }},
+ { 179, 0, -1, 4, { 0 }},
+ { 381, 0, 1, 7, { 0 }},
+ { 181, 0, 1, 5, { 0 }},
+ { 182, 0, 1, 6, { 0 }},
+ { 183, 0, 4, 2, { 0 }},
+ { 382, 0, 1, 7, { 0 }},
+ { 185, 0, -1, 3, { 0 }},
+ { 186, 0, -1, 4, { 0 }},
+ { 187, 0, 3, 5, { 0 }},
+ { 338, 0, 1, 6, { 0 }},
+ { 339, 0, 3, 6, { 0 }},
+ { 376, 0, -1, 5, { 0 }},
+ { 191, 0, 1, 5, { 0 }},
+ { 192, 0, -1, 5, { 0 }},
+ { 193, 0, -1, 5, { 0 }},
+ { 194, 0, -1, 5, { 0 }},
+ { 195, 0, -1, 5, { 0 }},
+ { 196, 0, -1, 5, { 0 }},
+ { 197, 0, -1, 5, { 0 }},
+ { 198, 0, 1, 6, { 0 }},
+ { 199, 0, 1, 5, { 0 }},
+ { 200, 0, -1, 5, { 0 }},
+ { 201, 0, -1, 5, { 0 }},
+ { 202, 0, -1, 5, { 0 }},
+ { 203, 0, -1, 5, { 0 }},
+ { 204, 0, -1, 4, { 0 }},
+ { 205, 0, -1, 4, { 0 }},
+ { 206, 0, -1, 4, { 0 }},
+ { 207, 0, -1, 4, { 0 }},
+ { 208, 0, 1, 6, { 0 }},
+ { 209, 0, -1, 5, { 0 }},
+ { 210, 0, -1, 5, { 0 }},
+ { 211, 0, -1, 5, { 0 }},
+ { 212, 0, -1, 5, { 0 }},
+ { 213, 0, -1, 5, { 0 }},
+ { 214, 0, -1, 5, { 0 }},
+ { 215, 0, 3, 4, { 0 }},
+ { 216, 0, 0, 5, { 0 }},
+ { 217, 0, -1, 5, { 0 }},
+ { 218, 0, -1, 5, { 0 }},
+ { 219, 0, -1, 5, { 0 }},
+ { 220, 0, -1, 5, { 0 }},
+ { 221, 0, -1, 5, { 0 }},
+ { 222, 0, 1, 5, { 0 }},
+ { 223, 0, 1, 5, { 0 }},
+ { 224, 0, 0, 5, { 0 }},
+ { 225, 0, 0, 5, { 0 }},
+ { 226, 0, 0, 5, { 0 }},
+ { 227, 0, 0, 5, { 0 }},
+ { 228, 0, 1, 5, { 0 }},
+ { 229, 0, -1, 5, { 0 }},
+ { 230, 0, 3, 6, { 0 }},
+ { 231, 0, 3, 5, { 0 }},
+ { 232, 0, 0, 5, { 0 }},
+ { 233, 0, 0, 5, { 0 }},
+ { 234, 0, 0, 5, { 0 }},
+ { 235, 0, 1, 5, { 0 }},
+ { 236, 0, 0, 3, { 0 }},
+ { 237, 0, 0, 2, { 0 }},
+ { 238, 0, 0, 3, { 0 }},
+ { 239, 0, 1, 3, { 0 }},
+ { 240, 0, 0, 5, { 0 }},
+ { 241, 0, 0, 5, { 0 }},
+ { 242, 0, 0, 5, { 0 }},
+ { 243, 0, 0, 5, { 0 }},
+ { 244, 0, 0, 5, { 0 }},
+ { 245, 0, 0, 5, { 0 }},
+ { 246, 0, 1, 5, { 0 }},
+ { 247, 0, 2, 4, { 0 }},
+ { 248, 0, 2, 5, { 0 }},
+ { 249, 0, 0, 5, { 0 }},
+ { 250, 0, 0, 5, { 0 }},
+ { 251, 0, 0, 5, { 0 }},
+ { 252, 0, 1, 5, { 0 }},
+ { 253, 0, 0, 5, { 0 }},
+ { 254, 0, 0, 5, { 0 }},
+ { 255, 0, 1, 5, { 0 }},
+};
+
+// Style loading function: Bluish
+static void GuiLoadStyleBluish(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < BLUISH_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(bluishStyleProps[i].controlId, bluishStyleProps[i].propertyId, bluishStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int bluishFontDataSize = 0;
+ unsigned char *data = DecompressData(bluishFontData, BLUISH_STYLE_FONT_ATLAS_COMP_SIZE, &bluishFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 10;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, bluishFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, bluishFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 254, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/bluish/style_bluish.old.rgs b/external/raygui-4.0/styles/bluish/style_bluish.old.rgs
new file mode 100644
index 0000000..347bebc
Binary files /dev/null and b/external/raygui-4.0/styles/bluish/style_bluish.old.rgs differ
diff --git a/external/raygui-4.0/styles/bluish/style_bluish.png b/external/raygui-4.0/styles/bluish/style_bluish.png
new file mode 100644
index 0000000..a46b512
Binary files /dev/null and b/external/raygui-4.0/styles/bluish/style_bluish.png differ
diff --git a/external/raygui-4.0/styles/bluish/style_bluish.rgs b/external/raygui-4.0/styles/bluish/style_bluish.rgs
new file mode 100644
index 0000000..09575fb
Binary files /dev/null and b/external/raygui-4.0/styles/bluish/style_bluish.rgs differ
diff --git a/external/raygui-4.0/styles/bluish/style_bluish.txt.rgs b/external/raygui-4.0/styles/bluish/style_bluish.txt.rgs
new file mode 100644
index 0000000..f94aefc
--- /dev/null
+++ b/external/raygui-4.0/styles/bluish/style_bluish.txt.rgs
@@ -0,0 +1,24 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 10 charset.txt homespun.ttf
+p 00 00 0x5ca6a6ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0xb4e8f3ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0x447e77ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0x5f8792ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0xcdeff7ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0x4c6c74ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0x3b5b5fff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xeaffffff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x275057ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x96aaacff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0xc8d7d9ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x8c9c9eff DEFAULT_TEXT_COLOR_DISABLED
+p 00 18 0x84adb7ff LINE_COLOR
+p 00 19 0xe8eef1ff BACKGROUND_COLOR
diff --git a/external/raygui-4.0/styles/candy/README.md b/external/raygui-4.0/styles/candy/README.md
new file mode 100644
index 0000000..712185d
--- /dev/null
+++ b/external/raygui-4.0/styles/candy/README.md
@@ -0,0 +1,27 @@
+## style: candy
+
+Sweet, colorful, tasty! Enjoy this funfair ride and be careful with the witch of the candy house!
+
+![candy style table](style_candy.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_candy.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_candy.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_candy.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_candy.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_candy.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![candy style screen](screenshot.png)
+
+## about font
+
+"V5 Eastergothic" font by vFive Digital (Roberto Christen).
+
+100% free font, downloaded from dafont.com: [v5eastergothic](https://www.dafont.com/v5eastergothic.font)
diff --git a/external/raygui-4.0/styles/candy/charset.txt b/external/raygui-4.0/styles/candy/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/candy/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/candy/font_readme.txt b/external/raygui-4.0/styles/candy/font_readme.txt
new file mode 100644
index 0000000..cfd8cb2
--- /dev/null
+++ b/external/raygui-4.0/styles/candy/font_readme.txt
@@ -0,0 +1,27 @@
+
+V5 Easter Gothic
+----------------
+Instructions:
+
+
+++ Easter Gothic ++
+
+For screen use, set at 15pt or any multiple
+of 15 (display). Turn antialiasing off. Set
+tracking to 100 for best results.
+
+---------------
+Usage: This is a free font--you may use
+this and other V5 fonts at will. It may not
+be sold, altered, or improperly credited,
+however. All I ask is that you kindly inform
+me if you find this font useful, and where
+you've used it.
+
+Enjoy,
+
+2000
+Roberto Christen
+rob@vfive.com
+
+
diff --git a/external/raygui-4.0/styles/candy/screenshot.png b/external/raygui-4.0/styles/candy/screenshot.png
new file mode 100644
index 0000000..8d71945
Binary files /dev/null and b/external/raygui-4.0/styles/candy/screenshot.png differ
diff --git a/external/raygui-4.0/styles/candy/style_candy.h b/external/raygui-4.0/styles/candy/style_candy.h
new file mode 100644
index 0000000..c42c399
--- /dev/null
+++ b/external/raygui-4.0/styles/candy/style_candy.h
@@ -0,0 +1,589 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleCandy(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define CANDY_STYLE_PROPS_COUNT 17
+
+// Custom style name: Candy
+static const GuiStyleProp candyStyleProps[CANDY_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0xe58b68ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0xfeda96ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xe59b5fff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xee813fff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xfcd85bff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xfc6955ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xb34848ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xeb7272ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0xbd4a4aff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x94795dff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0xc2a37aff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x9c8369ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x0000000f }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0xd77575ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0xfff5e1ff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000016 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "v5easter.ttf" (size: 15, spacing: 0)
+
+#define CANDY_STYLE_FONT_ATLAS_COMP_SIZE 2260
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char candyFontData[CANDY_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0x4d, 0x92, 0xd4, 0x38, 0x10, 0x06, 0x50, 0xdd, 0x80, 0xfb, 0xcc, 0x61, 0xe6, 0x4a, 0x73, 0x45, 0x8e, 0xc0, 0x86,
+ 0x25, 0xa1, 0x89, 0x61, 0x88, 0x20, 0x80, 0x2e, 0x4b, 0x4a, 0xa5, 0x6c, 0xd9, 0xf5, 0x78, 0x1b, 0xa2, 0xdd, 0x5d, 0x55,
+ 0xfe, 0xf9, 0x2c, 0xc9, 0x2e, 0xa5, 0x6b, 0x01, 0x00, 0x00, 0x00, 0xde, 0xdc, 0x7f, 0xff, 0xfe, 0xfc, 0x59, 0xf9, 0xe0,
+ 0xa7, 0x3f, 0x7f, 0xb7, 0x7e, 0xb8, 0xf4, 0x68, 0x49, 0xfc, 0x2f, 0x8f, 0x3f, 0x49, 0xdf, 0x2b, 0x94, 0x83, 0x25, 0xed,
+ 0xcf, 0xfc, 0xfb, 0xcf, 0x6a, 0xca, 0xbb, 0xbf, 0x7a, 0x9d, 0xd6, 0x27, 0x8a, 0x2c, 0x3b, 0x7a, 0xd5, 0x7a, 0xb0, 0x4e,
+ 0xa5, 0x63, 0x49, 0x0d, 0xad, 0x5d, 0x9d, 0xde, 0xab, 0x63, 0x7b, 0xa7, 0xbd, 0xfe, 0x65, 0x78, 0x1d, 0xcb, 0x82, 0x65,
+ 0x75, 0x72, 0x1f, 0xaf, 0xcc, 0xff, 0xef, 0xff, 0x32, 0xf3, 0x7f, 0xfc, 0x9a, 0x33, 0xc7, 0xc4, 0xcf, 0xb5, 0xa9, 0x09,
+ 0xf9, 0x1f, 0x3f, 0x8b, 0x1c, 0xaf, 0xc1, 0xeb, 0xa3, 0xb8, 0x0c, 0xff, 0x4d, 0xfb, 0xfc, 0x9a, 0xf9, 0xaa, 0x2b, 0x97,
+ 0xf5, 0xa5, 0x76, 0xfe, 0x38, 0x6f, 0x7d, 0x9a, 0xb9, 0x7d, 0x78, 0xe6, 0xb2, 0xdc, 0xfc, 0xb7, 0x7e, 0x37, 0x7a, 0x66,
+ 0x8f, 0xf7, 0x0e, 0x7a, 0x5b, 0xf3, 0x3a, 0x74, 0xec, 0xb7, 0x5b, 0xb1, 0x9c, 0x2d, 0x3c, 0xba, 0xc6, 0xc7, 0xe7, 0x92,
+ 0xd6, 0xd2, 0xf9, 0x36, 0x77, 0xe4, 0xd8, 0xb8, 0xe2, 0x28, 0x6e, 0xef, 0xcd, 0x8c, 0x76, 0xa9, 0xfe, 0xb2, 0xb5, 0xe5,
+ 0xbf, 0xf7, 0xa8, 0xad, 0x8b, 0x5b, 0xda, 0x32, 0xdc, 0xd2, 0xc6, 0xfa, 0x2c, 0x79, 0x5b, 0x38, 0x2b, 0xff, 0x75, 0x22,
+ 0xfd, 0x25, 0xd0, 0xe3, 0x3c, 0x3e, 0x6b, 0xb7, 0x3e, 0x7f, 0xf4, 0x28, 0xc9, 0x3d, 0x66, 0x67, 0xf3, 0x7f, 0xdc, 0x1f,
+ 0x2e, 0x87, 0xe7, 0x9b, 0xf3, 0x7a, 0x5c, 0x3b, 0xe5, 0x3f, 0xda, 0x43, 0xee, 0x1f, 0xdd, 0xe4, 0xb5, 0xff, 0xeb, 0xf3,
+ 0xdf, 0x4a, 0x64, 0x1d, 0x1c, 0xa9, 0xe6, 0xb6, 0xc6, 0x3d, 0xe3, 0xe9, 0xe8, 0x19, 0x7d, 0x7c, 0x8c, 0x7b, 0x7e, 0xff,
+ 0xbf, 0x3d, 0x6e, 0xac, 0xcb, 0x46, 0x4e, 0xf9, 0x09, 0xdb, 0xb7, 0xff, 0xdf, 0xd7, 0x2f, 0x58, 0xd3, 0xff, 0x6f, 0x8d,
+ 0xff, 0xcb, 0xe9, 0xad, 0x7f, 0x2b, 0x59, 0xf1, 0xbd, 0x5f, 0x43, 0x3d, 0xa0, 0xb9, 0xab, 0x0a, 0xb1, 0xfd, 0x39, 0x97,
+ 0xff, 0x15, 0x7d, 0x80, 0xd1, 0xd1, 0xdf, 0x33, 0xfa, 0xff, 0x91, 0x2d, 0x18, 0xbd, 0xce, 0x9c, 0xb5, 0x66, 0xe3, 0xd7,
+ 0xf9, 0xaf, 0xdb, 0x62, 0x79, 0xe7, 0xf9, 0xd9, 0x2d, 0x98, 0xff, 0xaa, 0xb1, 0x5e, 0xf5, 0xe8, 0x51, 0x5c, 0x2f, 0xbd,
+ 0x37, 0x56, 0x6f, 0x71, 0xe5, 0xf4, 0x8c, 0xf6, 0xbf, 0x75, 0xfd, 0x7f, 0xe6, 0xea, 0xc0, 0xd8, 0x9d, 0x8d, 0xba, 0xe1,
+ 0xb1, 0x22, 0xff, 0x77, 0x69, 0xc5, 0xb2, 0x7a, 0xd5, 0xae, 0xff, 0x45, 0xee, 0x69, 0x67, 0xf4, 0xe7, 0xee, 0x92, 0xff,
+ 0xda, 0x71, 0x36, 0xed, 0x5f, 0x12, 0xbf, 0xe3, 0xbe, 0xea, 0x5b, 0x05, 0xad, 0xbb, 0x8d, 0xe7, 0xdd, 0xc5, 0xde, 0x31,
+ 0xff, 0xf7, 0xb8, 0xff, 0xbf, 0xc7, 0xb6, 0x5c, 0x3b, 0x92, 0xdb, 0x31, 0xff, 0xf0, 0x1e, 0xdf, 0x26, 0x3c, 0xef, 0x5b,
+ 0x8b, 0xf2, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdd, 0x67, 0xe7, 0xc4, 0x2b,
+ 0x44, 0x8e, 0xcd, 0xb9, 0xa9, 0x4b, 0xea, 0x22, 0xc5, 0xe6, 0x46, 0x9f, 0x5b, 0xc3, 0x39, 0x5a, 0x35, 0x7b, 0x6e, 0x5e,
+ 0xf8, 0xeb, 0x7a, 0x42, 0x33, 0xaf, 0x7b, 0x3c, 0x17, 0x79, 0x64, 0x5e, 0x76, 0xb4, 0xd6, 0xf9, 0x68, 0x4d, 0xa0, 0x48,
+ 0xed, 0xa4, 0xd9, 0xda, 0xe9, 0xe3, 0x6b, 0x1c, 0x99, 0xc1, 0x3a, 0x3b, 0xe7, 0xed, 0xac, 0x8a, 0xcd, 0xd1, 0x9c, 0xf6,
+ 0x55, 0xbd, 0xad, 0xc3, 0x95, 0xea, 0x76, 0xab, 0xd3, 0x90, 0x5d, 0x35, 0x63, 0x65, 0xfe, 0x4b, 0x57, 0x6d, 0xec, 0xbe,
+ 0xf9, 0xce, 0x35, 0x71, 0x46, 0xfb, 0x79, 0x35, 0xf7, 0xca, 0xf4, 0x3e, 0x19, 0x6d, 0xa9, 0x9e, 0x9f, 0xff, 0xe8, 0xba,
+ 0xb7, 0xb6, 0x6a, 0xdd, 0xb6, 0x8a, 0xfd, 0x95, 0xf9, 0x8f, 0xf6, 0xed, 0x8e, 0x5b, 0xbe, 0xf1, 0x8a, 0x07, 0xe7, 0x54,
+ 0xb4, 0xa9, 0x1b, 0xe5, 0x7f, 0xfc, 0xdd, 0x56, 0xce, 0x61, 0x9f, 0x6b, 0x7b, 0x6b, 0x5a, 0xfe, 0xe3, 0x7d, 0x9f, 0xdd,
+ 0xda, 0xf8, 0xdc, 0xaa, 0x39, 0xeb, 0xf2, 0x5f, 0xd2, 0xab, 0x32, 0xed, 0x99, 0xff, 0x9e, 0xf6, 0x21, 0x32, 0x36, 0x18,
+ 0xff, 0xcb, 0xe8, 0x19, 0x77, 0xf4, 0xdd, 0x22, 0xed, 0xff, 0xf1, 0x5a, 0xde, 0xb9, 0xfd, 0xdf, 0x25, 0xff, 0x65, 0xab,
+ 0xfe, 0xff, 0xec, 0xd1, 0x38, 0x96, 0xf3, 0xeb, 0x6a, 0xb3, 0xed, 0xfe, 0x24, 0xa3, 0x91, 0x2d, 0x3e, 0x5b, 0x1d, 0x39,
+ 0x7a, 0xdd, 0x21, 0xf3, 0x89, 0x4d, 0xf7, 0xba, 0xc6, 0x55, 0xde, 0x72, 0xfc, 0x1f, 0xbf, 0xee, 0x2b, 0xff, 0xb3, 0xfd,
+ 0xe9, 0x72, 0x41, 0xfe, 0x57, 0x6d, 0xbb, 0x3b, 0xe7, 0x7f, 0xa6, 0xe7, 0x77, 0x56, 0xfe, 0xcb, 0xcb, 0xa7, 0x50, 0xcd,
+ 0xe6, 0x3f, 0xfe, 0x6c, 0x9c, 0xd1, 0x9c, 0xd7, 0x0b, 0xef, 0x6f, 0xad, 0x38, 0x07, 0xc6, 0xef, 0x37, 0x14, 0xf9, 0xbf,
+ 0x55, 0xfe, 0xaf, 0x6f, 0xff, 0x7b, 0x9f, 0xad, 0xf8, 0xde, 0xf9, 0x2f, 0x53, 0xd7, 0xf8, 0x56, 0xfc, 0xdd, 0x6e, 0xfd,
+ 0xff, 0xec, 0x73, 0xe7, 0xb9, 0xe7, 0xd3, 0x75, 0x7d, 0xdc, 0xd8, 0xf5, 0xa4, 0xd8, 0xd3, 0x0c, 0x62, 0x55, 0xb3, 0xd7,
+ 0x1c, 0x53, 0x25, 0xfc, 0x0c, 0xaf, 0x32, 0x7c, 0x06, 0x90, 0xff, 0x5f, 0x97, 0xac, 0x7b, 0x3a, 0x32, 0xac, 0xce, 0xd3,
+ 0xbd, 0xf2, 0x3f, 0xf7, 0x4d, 0x83, 0xfc, 0xa7, 0x0d, 0xd6, 0x0b, 0xda, 0x7f, 0x58, 0x7b, 0x97, 0x3d, 0xef, 0xf7, 0xc9,
+ 0xe8, 0xd3, 0x03, 0xef, 0xdb, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x38, 0x57,
+ 0xe0, 0xf5, 0x2c, 0xcf, 0xe3, 0x2a, 0x18, 0x25, 0x58, 0x05, 0xbb, 0x74, 0x54, 0x4e, 0xae, 0xc1, 0xf7, 0x1b, 0x99, 0xa5,
+ 0xbc, 0x5b, 0x2d, 0x82, 0xd1, 0xfa, 0x88, 0x23, 0xb5, 0xb1, 0xcb, 0x70, 0x9d, 0xaf, 0x68, 0x15, 0x9b, 0x32, 0x59, 0x73,
+ 0x34, 0x3e, 0xff, 0x2e, 0x3a, 0x83, 0xfa, 0x68, 0x7f, 0x7e, 0xaa, 0xdf, 0xea, 0x97, 0xef, 0xbe, 0xd6, 0x7f, 0x86, 0xdf,
+ 0xb5, 0x76, 0xcd, 0xf7, 0x9b, 0xdd, 0x27, 0x3d, 0x5b, 0x28, 0x92, 0xff, 0x1d, 0xab, 0xee, 0x65, 0x55, 0xf9, 0xb8, 0x53,
+ 0xbd, 0xed, 0x91, 0x3a, 0xbc, 0xed, 0x7a, 0x1e, 0xf3, 0xf9, 0xef, 0xad, 0x29, 0x50, 0x27, 0xab, 0x7e, 0x8e, 0x9e, 0x2b,
+ 0x8e, 0xb7, 0xcb, 0xd1, 0xdc, 0xe4, 0xd7, 0xad, 0xdc, 0xa7, 0xfa, 0xf9, 0xc7, 0xff, 0xfe, 0xfe, 0x30, 0xff, 0x35, 0x3c,
+ 0x1b, 0xa7, 0xfd, 0x89, 0x32, 0xe7, 0x57, 0xbf, 0x47, 0xfe, 0xc7, 0xcf, 0x99, 0x77, 0xa8, 0xb7, 0x5d, 0x12, 0x7e, 0x9a,
+ 0x39, 0xf3, 0x3d, 0x5a, 0x53, 0x24, 0x9a, 0xff, 0x91, 0x34, 0xbd, 0x3e, 0xcb, 0x95, 0x8e, 0x0a, 0x6a, 0xa3, 0xf9, 0x6f,
+ 0xbd, 0x6b, 0x24, 0xff, 0x75, 0xb8, 0xf6, 0x4a, 0xff, 0xb6, 0x1c, 0x6b, 0x5d, 0xf6, 0xcc, 0x7f, 0xa4, 0xc7, 0x59, 0x4f,
+ 0xcc, 0xff, 0x5c, 0x8d, 0xaf, 0x72, 0x7a, 0xfe, 0x73, 0x9f, 0x53, 0xd1, 0x37, 0x92, 0xe9, 0x4d, 0x76, 0xff, 0xef, 0xd6,
+ 0x46, 0x5b, 0xbc, 0x2e, 0xff, 0xf5, 0x83, 0xf7, 0x5f, 0xd5, 0xfe, 0xc7, 0xeb, 0xab, 0xd6, 0x83, 0x4f, 0xf8, 0x84, 0xfc,
+ 0x97, 0x4d, 0xfa, 0xff, 0xf9, 0xcf, 0x52, 0xdb, 0x33, 0xff, 0xe3, 0x3d, 0xae, 0xf1, 0x76, 0x7d, 0xac, 0xaf, 0xd0, 0x1e,
+ 0x01, 0xd4, 0xc0, 0x19, 0xa0, 0x27, 0xff, 0xb1, 0xf6, 0x3f, 0x3a, 0xfe, 0x8f, 0x27, 0xa3, 0x3e, 0xb6, 0xfd, 0xcf, 0x1d,
+ 0xff, 0xaf, 0xaa, 0x45, 0x98, 0xfb, 0xbc, 0xad, 0xac, 0x5a, 0x9b, 0xb1, 0xbe, 0x56, 0xb4, 0xfd, 0x6f, 0xf5, 0x0e, 0x66,
+ 0xf2, 0x5f, 0x26, 0x93, 0xf8, 0xf1, 0xf5, 0xbf, 0x55, 0xed, 0xff, 0xf9, 0xd7, 0xff, 0x6b, 0x20, 0x21, 0xab, 0xaa, 0x6e,
+ 0xd6, 0xe1, 0x6b, 0x31, 0xb3, 0x55, 0xd5, 0xfa, 0xef, 0x34, 0xf4, 0x9c, 0x9b, 0x5f, 0xdf, 0xa5, 0xe8, 0xd9, 0x2a, 0x19,
+ 0xa3, 0xbe, 0x5d, 0xfb, 0xff, 0xd7, 0xb4, 0xff, 0x3d, 0xad, 0x7f, 0xa4, 0x0e, 0xd9, 0xba, 0xeb, 0x7f, 0xd1, 0xf1, 0xd3,
+ 0xdc, 0xfd, 0xbf, 0xeb, 0xeb, 0x08, 0x66, 0x5f, 0xf9, 0x39, 0xf3, 0xb5, 0xae, 0xfa, 0x44, 0x3b, 0xf6, 0xff, 0xe3, 0x63,
+ 0xab, 0x91, 0x51, 0x7d, 0xde, 0xfd, 0xbf, 0x98, 0x56, 0xfe, 0xd7, 0xbc, 0xeb, 0xba, 0x63, 0x4e, 0xfe, 0xf7, 0xdc, 0x07,
+ 0x7b, 0xe5, 0xbf, 0xf7, 0x29, 0xe6, 0x35, 0xfd, 0x4e, 0xfc, 0x6e, 0x7b, 0xb0, 0x9d, 0xff, 0x7b, 0x7d, 0xff, 0xe7, 0xfc,
+ 0x27, 0x8f, 0x5e, 0x9d, 0xff, 0xdd, 0xce, 0x00, 0x59, 0x4f, 0xbc, 0x2e, 0x49, 0x7b, 0x32, 0x72, 0x17, 0x6f, 0xf7, 0xf3,
+ 0xa5, 0xfc, 0xf3, 0xfc, 0xef, 0x6f, 0xd6, 0xc7, 0xf7, 0x9b, 0xae, 0xef, 0x5b, 0xcb, 0x3f, 0xbc, 0xaf, 0xf6, 0xf7, 0x7f,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x9e, 0x0f, 0x58, 0x27, 0xe7, 0x0a, 0xc6, 0x2a,
+ 0x0d, 0x95, 0xe6, 0x8c, 0xd3, 0x1a, 0xfe, 0x9d, 0x91, 0x75, 0x89, 0xd7, 0xb0, 0x88, 0xd4, 0xe0, 0x2e, 0x8d, 0xba, 0x35,
+ 0x39, 0xdb, 0xe6, 0x9c, 0xf5, 0x6c, 0xd7, 0xda, 0x1b, 0x3b, 0x2e, 0x46, 0xb6, 0x54, 0xbb, 0x86, 0xca, 0x79, 0xdb, 0x21,
+ 0xba, 0xbf, 0x6b, 0x63, 0x76, 0x77, 0x6d, 0x54, 0xae, 0xc9, 0xa9, 0x07, 0x50, 0x1b, 0x75, 0x54, 0xe2, 0xf3, 0xd5, 0x46,
+ 0xcf, 0x00, 0xf5, 0x8f, 0xda, 0x4e, 0x35, 0xf4, 0x3b, 0xa3, 0x7b, 0x3d, 0xb6, 0xac, 0xa7, 0xaa, 0x63, 0x5e, 0xa5, 0xe8,
+ 0xc8, 0xb6, 0x59, 0xbf, 0x9e, 0xe3, 0xc7, 0x45, 0x4d, 0x7a, 0x87, 0xde, 0xba, 0x24, 0xfb, 0xef, 0xef, 0x76, 0x05, 0xd9,
+ 0xba, 0xac, 0xfd, 0xcf, 0xc8, 0xff, 0x58, 0x0d, 0xd6, 0x91, 0x3a, 0x63, 0x99, 0xf9, 0xdf, 0xab, 0x3f, 0x16, 0x7f, 0x1e,
+ 0x44, 0x56, 0xc5, 0xfd, 0x7b, 0xcc, 0xda, 0x8d, 0x3f, 0x99, 0xe0, 0x3e, 0xfb, 0x7b, 0xf5, 0xfa, 0xf5, 0x9c, 0x29, 0xe7,
+ 0xea, 0x42, 0x5c, 0x95, 0xff, 0xbc, 0xfe, 0x7f, 0xb4, 0x3f, 0x1d, 0x79, 0x26, 0xd2, 0x6c, 0x2d, 0xc5, 0x99, 0x27, 0x8b,
+ 0x9c, 0xbd, 0x2e, 0x73, 0xa3, 0x82, 0x9e, 0x31, 0xeb, 0x0e, 0xdb, 0x61, 0x66, 0x1b, 0x95, 0xe0, 0x93, 0x17, 0xb2, 0xf2,
+ 0x9f, 0x51, 0xcf, 0x74, 0x7c, 0xfc, 0xd7, 0xde, 0x56, 0xb9, 0xe7, 0xc5, 0xd8, 0xeb, 0xed, 0xba, 0xac, 0x4e, 0x8c, 0x63,
+ 0xae, 0x7d, 0x92, 0x51, 0x4e, 0xfe, 0xfb, 0x7b, 0xb5, 0xbb, 0xef, 0xd3, 0xd2, 0x31, 0x4e, 0xde, 0x3f, 0xff, 0xa3, 0x9f,
+ 0x25, 0xb3, 0x8f, 0x3b, 0x5b, 0x5d, 0xfa, 0x9a, 0x65, 0xf3, 0x4f, 0x2a, 0xd9, 0xfd, 0xd8, 0xbe, 0x3a, 0xff, 0x6b, 0x9e,
+ 0x06, 0x93, 0xbd, 0x8d, 0x5a, 0xa3, 0x86, 0xac, 0xf6, 0xbf, 0x35, 0x02, 0xa9, 0x5b, 0x8c, 0x0b, 0xfb, 0xb2, 0x3d, 0x7e,
+ 0xfd, 0x7f, 0xee, 0x58, 0x59, 0xb1, 0x6c, 0xfe, 0xb8, 0xdd, 0x37, 0xe3, 0xbb, 0xe4, 0xff, 0x0e, 0xe7, 0xc8, 0x78, 0xab,
+ 0x9d, 0xd1, 0xf7, 0x3d, 0xbf, 0xfd, 0xcf, 0xc8, 0x7f, 0xfe, 0x15, 0xd0, 0x3b, 0x2e, 0x5b, 0x9f, 0xd5, 0xd9, 0x6b, 0x70,
+ 0xf2, 0x2f, 0xff, 0xf1, 0xbe, 0x4a, 0x4d, 0xaf, 0x70, 0xb9, 0xe2, 0xe9, 0x60, 0x57, 0x8d, 0xff, 0x73, 0xaf, 0x43, 0xdd,
+ 0xb5, 0xff, 0x7f, 0xf7, 0x7d, 0x3a, 0xd3, 0x6b, 0xa7, 0xbc, 0x55, 0xdf, 0x60, 0xf6, 0x6c, 0xff, 0xb4, 0xfc, 0x3f, 0x7b,
+ 0x9f, 0x4a, 0xbd, 0xfc, 0xe7, 0x9e, 0x01, 0xd6, 0x65, 0x7c, 0x24, 0xbb, 0xef, 0x97, 0xff, 0xbb, 0x3c, 0x35, 0x48, 0xfe,
+ 0x9f, 0x31, 0xe6, 0x3b, 0xf7, 0x7b, 0x0e, 0x39, 0xdf, 0xff, 0x2b, 0x27, 0x3e, 0x01, 0xef, 0xec, 0xfb, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x33, 0x7e, 0x33, 0x2b, 0x3d, 0x1f, 0xfd, 0xe5, 0xa7, 0xfa,
+ 0xad, 0x7e, 0xf9, 0xee, 0x6b, 0xfd, 0xe7, 0xb0, 0xce, 0xc9, 0x19, 0x6b, 0xa1, 0x2e, 0xf7, 0xda, 0xba, 0xdc, 0xc7, 0x7b,
+ 0xfb, 0x2e, 0x55, 0xb9, 0x7b, 0x8f, 0xd9, 0x3a, 0xb8, 0x85, 0x57, 0xa6, 0x2f, 0xab, 0x9e, 0x43, 0x74, 0xee, 0xe1, 0xab,
+ 0xd7, 0xfc, 0x54, 0x3f, 0xff, 0xf8, 0xdf, 0xdf, 0x1f, 0x6e, 0xcb, 0xbe, 0x7a, 0x60, 0x79, 0x6b, 0xa1, 0x2e, 0xf7, 0xca,
+ 0xba, 0xdc, 0x7d, 0x7b, 0x7b, 0xf7, 0xaa, 0xdc, 0xfd, 0x6b, 0x51, 0x37, 0x49, 0xdf, 0xb5, 0xb3, 0xe4, 0xe2, 0xdb, 0x72,
+ 0xaf, 0x1a, 0xce, 0x35, 0x5c, 0x5b, 0x73, 0xae, 0x2e, 0xef, 0xf9, 0xeb, 0xb2, 0xaa, 0x87, 0xd9, 0x4a, 0xce, 0x6e, 0x47,
+ 0x74, 0x6c, 0x2d, 0xae, 0xd9, 0x9b, 0xfd, 0xef, 0xb8, 0xd3, 0xec, 0xe7, 0x99, 0xfc, 0xef, 0x54, 0xa7, 0xb9, 0xbd, 0xbd,
+ 0xe3, 0xcf, 0x51, 0x7a, 0x4e, 0x5d, 0xee, 0xd6, 0xde, 0x2e, 0x27, 0xcf, 0xbc, 0x8d, 0x6d, 0xa1, 0xfe, 0x3e, 0xeb, 0x1e,
+ 0x75, 0x96, 0xee, 0x9e, 0xff, 0x9d, 0xb6, 0x63, 0x0d, 0xd6, 0xe5, 0xdf, 0xab, 0xf6, 0xf6, 0xae, 0xf9, 0xbf, 0x47, 0xa5,
+ 0x95, 0x9e, 0xfc, 0xef, 0x76, 0xdc, 0x3e, 0xb1, 0xfd, 0x2f, 0x1d, 0xd5, 0xee, 0x33, 0x97, 0xe5, 0xd4, 0x8c, 0x7f, 0xe7,
+ 0xba, 0xbc, 0xef, 0x93, 0xff, 0x22, 0xff, 0xa7, 0xf4, 0xff, 0xcf, 0x5b, 0x36, 0xdf, 0x37, 0x58, 0x71, 0xfd, 0xff, 0x5e,
+ 0x75, 0x79, 0xdf, 0xa9, 0xfd, 0xdf, 0xa7, 0xce, 0xe2, 0x33, 0xf3, 0xbf, 0x63, 0x7b, 0xaa, 0x2e, 0xa7, 0xfc, 0xd7, 0xcd,
+ 0xd2, 0xb7, 0xcb, 0x11, 0x15, 0x3f, 0x22, 0x76, 0xaa, 0x57, 0x9d, 0x7d, 0x6d, 0xb0, 0xff, 0x0e, 0xfb, 0x13, 0xea, 0x72,
+ 0xde, 0x27, 0xff, 0x33, 0xd7, 0xff, 0xcf, 0x4f, 0x5f, 0x19, 0x7a, 0x0e, 0xf8, 0x15, 0x67, 0xa0, 0xd8, 0xfd, 0xff, 0xb3,
+ 0xaf, 0x8b, 0x67, 0x3d, 0x97, 0x28, 0xf7, 0x3b, 0x59, 0xcf, 0xa9, 0xcb, 0x79, 0x9f, 0xbb, 0x3d, 0x33, 0xf7, 0xff, 0xfb,
+ 0xee, 0x2c, 0x96, 0xe1, 0x1c, 0x67, 0x3c, 0xeb, 0xbf, 0x5c, 0x54, 0xc5, 0x38, 0xfa, 0xfd, 0x9f, 0x3b, 0x7d, 0xa3, 0x52,
+ 0x7d, 0xd7, 0xd5, 0xc9, 0xb1, 0x16, 0xeb, 0x8f, 0xd6, 0x35, 0x55, 0x8c, 0x5f, 0xe7, 0xbf, 0xf5, 0x5d, 0x4a, 0x9e, 0x94,
+ 0xff, 0x27, 0xec, 0x6d, 0xc7, 0x2c, 0xac, 0xf4, 0x97, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xd0, 0x3d, 0x43, 0xf3, 0xf8, 0xbb, 0xcd, 0x3b, 0xd7, 0x20, 0x05, 0x66, 0xe7, 0xe3, 0x3c, 0x63, 0x3e, 0x1e, 0x90, 0x3d,
+ 0xb7, 0x71, 0xaf, 0x7a, 0xdc, 0x40, 0xee, 0xfc, 0x7f, 0xf9, 0x07, 0xf9, 0x97, 0x7f, 0x90, 0x7f, 0xf9, 0x07, 0xf9, 0xff,
+ 0xf9, 0x97, 0x55, 0xfe, 0xe1, 0xe6, 0xf9, 0xaf, 0x4b, 0x6a, 0x9b, 0x03, 0x77, 0x39, 0x03, 0x44, 0xf2, 0x5f, 0xf4, 0xff,
+ 0xe1, 0xb1, 0xdf, 0x01, 0x30, 0xfe, 0x07, 0xe3, 0x7f, 0xf9, 0x87, 0x77, 0xcc, 0x7f, 0xeb, 0xfb, 0xbf, 0x46, 0xff, 0xf0,
+ 0x8c, 0xf1, 0xbf, 0x2d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xf2, 0xff, 0x3f, 0xdb, 0x01, 0xe4, 0x1f, 0x78, 0xbb, 0xfc, 0xff, 0x0b };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle candyFontRecs[189] = {
+ { 4, 4, 3 , 15 },
+ { 15, 4, 2 , 9 },
+ { 25, 4, 3 , 2 },
+ { 36, 4, 8 , 9 },
+ { 52, 4, 6 , 11 },
+ { 66, 4, 7 , 9 },
+ { 81, 4, 7 , 9 },
+ { 96, 4, 1 , 2 },
+ { 105, 4, 3 , 11 },
+ { 116, 4, 3 , 11 },
+ { 127, 4, 7 , 7 },
+ { 142, 4, 6 , 5 },
+ { 156, 4, 2 , 3 },
+ { 166, 4, 5 , 1 },
+ { 179, 4, 2 , 2 },
+ { 189, 4, 5 , 10 },
+ { 202, 4, 6 , 9 },
+ { 216, 4, 4 , 9 },
+ { 228, 4, 6 , 9 },
+ { 242, 4, 6 , 9 },
+ { 256, 4, 7 , 9 },
+ { 271, 4, 6 , 9 },
+ { 285, 4, 6 , 9 },
+ { 299, 4, 6 , 9 },
+ { 313, 4, 6 , 9 },
+ { 327, 4, 6 , 9 },
+ { 341, 4, 2 , 6 },
+ { 351, 4, 2 , 7 },
+ { 361, 4, 4 , 6 },
+ { 373, 4, 5 , 3 },
+ { 386, 4, 4 , 6 },
+ { 398, 4, 6 , 9 },
+ { 412, 4, 8 , 7 },
+ { 428, 4, 6 , 9 },
+ { 442, 4, 6 , 9 },
+ { 456, 4, 6 , 9 },
+ { 470, 4, 6 , 9 },
+ { 484, 4, 6 , 9 },
+ { 4, 27, 6 , 9 },
+ { 18, 27, 6 , 9 },
+ { 32, 27, 6 , 9 },
+ { 46, 27, 2 , 9 },
+ { 56, 27, 6 , 9 },
+ { 70, 27, 6 , 9 },
+ { 84, 27, 6 , 9 },
+ { 98, 27, 8 , 9 },
+ { 114, 27, 6 , 9 },
+ { 128, 27, 6 , 9 },
+ { 142, 27, 6 , 9 },
+ { 156, 27, 6 , 9 },
+ { 170, 27, 6 , 9 },
+ { 184, 27, 6 , 9 },
+ { 198, 27, 6 , 9 },
+ { 212, 27, 6 , 9 },
+ { 226, 27, 6 , 9 },
+ { 240, 27, 8 , 9 },
+ { 256, 27, 6 , 9 },
+ { 270, 27, 6 , 9 },
+ { 284, 27, 6 , 9 },
+ { 298, 27, 3 , 11 },
+ { 309, 27, 5 , 10 },
+ { 322, 27, 3 , 11 },
+ { 333, 27, 6 , 4 },
+ { 347, 27, 6 , 1 },
+ { 361, 27, 3 , 2 },
+ { 372, 27, 6 , 7 },
+ { 386, 27, 6 , 10 },
+ { 400, 27, 6 , 7 },
+ { 414, 27, 6 , 10 },
+ { 428, 27, 6 , 7 },
+ { 442, 27, 5 , 10 },
+ { 455, 27, 7 , 10 },
+ { 470, 27, 6 , 10 },
+ { 484, 27, 2 , 10 },
+ { 494, 27, 2 , 12 },
+ { 4, 50, 6 , 10 },
+ { 18, 50, 3 , 10 },
+ { 29, 50, 8 , 7 },
+ { 45, 50, 6 , 7 },
+ { 59, 50, 6 , 7 },
+ { 73, 50, 6 , 10 },
+ { 87, 50, 6 , 10 },
+ { 101, 50, 6 , 7 },
+ { 115, 50, 6 , 7 },
+ { 129, 50, 3 , 10 },
+ { 140, 50, 6 , 7 },
+ { 154, 50, 6 , 7 },
+ { 168, 50, 8 , 7 },
+ { 184, 50, 6 , 7 },
+ { 198, 50, 6 , 10 },
+ { 212, 50, 6 , 7 },
+ { 226, 50, 4 , 11 },
+ { 238, 50, 1 , 11 },
+ { 247, 50, 4 , 11 },
+ { 259, 50, 6 , 2 },
+ { 273, 50, 2 , 10 },
+ { 283, 50, 6 , 11 },
+ { 297, 50, 8 , 9 },
+ { 313, 50, 7 , 9 },
+ { 328, 50, 6 , 9 },
+ { 342, 50, 0 , 0 },
+ { 350, 50, 6 , 11 },
+ { 364, 50, 0 , 0 },
+ { 372, 50, 8 , 8 },
+ { 388, 50, 5 , 7 },
+ { 401, 50, 7 , 6 },
+ { 416, 50, 7 , 12 },
+ { 431, 50, 8 , 8 },
+ { 447, 50, 6 , 1 },
+ { 461, 50, 4 , 5 },
+ { 473, 50, 6 , 7 },
+ { 487, 50, 3 , 5 },
+ { 498, 50, 3 , 5 },
+ { 4, 73, 0 , 0 },
+ { 12, 73, 6 , 9 },
+ { 26, 73, 6 , 9 },
+ { 40, 73, 4 , 4 },
+ { 52, 73, 0 , 0 },
+ { 60, 73, 2 , 5 },
+ { 70, 73, 4 , 7 },
+ { 82, 73, 7 , 6 },
+ { 97, 73, 10 , 9 },
+ { 115, 73, 10 , 7 },
+ { 133, 73, 0 , 0 },
+ { 141, 73, 6 , 9 },
+ { 155, 73, 6 , 12 },
+ { 169, 73, 6 , 12 },
+ { 183, 73, 6 , 12 },
+ { 197, 73, 6 , 12 },
+ { 211, 73, 6 , 11 },
+ { 225, 73, 6 , 12 },
+ { 239, 73, 10 , 9 },
+ { 257, 73, 6 , 12 },
+ { 271, 73, 6 , 12 },
+ { 285, 73, 6 , 12 },
+ { 299, 73, 6 , 12 },
+ { 313, 73, 6 , 11 },
+ { 327, 73, 3 , 12 },
+ { 338, 73, 3 , 12 },
+ { 349, 73, 4 , 12 },
+ { 361, 73, 4 , 11 },
+ { 373, 73, 8 , 9 },
+ { 389, 73, 6 , 12 },
+ { 403, 73, 6 , 12 },
+ { 417, 73, 6 , 12 },
+ { 431, 73, 6 , 12 },
+ { 445, 73, 6 , 12 },
+ { 459, 73, 6 , 11 },
+ { 473, 73, 5 , 5 },
+ { 486, 73, 9 , 10 },
+ { 4, 96, 6 , 12 },
+ { 18, 96, 6 , 12 },
+ { 32, 96, 6 , 12 },
+ { 46, 96, 6 , 11 },
+ { 60, 96, 6 , 12 },
+ { 74, 96, 7 , 12 },
+ { 89, 96, 6 , 10 },
+ { 103, 96, 6 , 10 },
+ { 117, 96, 6 , 10 },
+ { 131, 96, 6 , 10 },
+ { 145, 96, 6 , 10 },
+ { 159, 96, 6 , 9 },
+ { 173, 96, 6 , 11 },
+ { 187, 96, 10 , 7 },
+ { 205, 96, 6 , 10 },
+ { 219, 96, 6 , 10 },
+ { 233, 96, 6 , 10 },
+ { 247, 96, 6 , 10 },
+ { 261, 96, 6 , 9 },
+ { 275, 96, 3 , 10 },
+ { 286, 96, 3 , 10 },
+ { 297, 96, 4 , 10 },
+ { 309, 96, 4 , 9 },
+ { 321, 96, 7 , 12 },
+ { 336, 96, 6 , 13 },
+ { 350, 96, 6 , 10 },
+ { 364, 96, 6 , 10 },
+ { 378, 96, 6 , 10 },
+ { 392, 96, 6 , 10 },
+ { 406, 96, 6 , 9 },
+ { 420, 96, 7 , 12 },
+ { 435, 96, 8 , 8 },
+ { 451, 96, 6 , 10 },
+ { 465, 96, 6 , 10 },
+ { 479, 96, 6 , 10 },
+ { 493, 96, 6 , 9 },
+ { 4, 119, 6 , 13 },
+ { 18, 119, 7 , 12 },
+ { 33, 119, 6 , 12 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo candyFontGlyphs[189] = {
+ { 32, 0, 12, 3, { 0 }},
+ { 33, 0, 3, 3, { 0 }},
+ { 34, 0, 2, 4, { 0 }},
+ { 35, 0, 3, 9, { 0 }},
+ { 36, 0, 2, 7, { 0 }},
+ { 37, 0, 3, 8, { 0 }},
+ { 38, 0, 3, 8, { 0 }},
+ { 39, 0, 2, 2, { 0 }},
+ { 40, 1, 2, 5, { 0 }},
+ { 41, 1, 2, 5, { 0 }},
+ { 42, 0, 4, 8, { 0 }},
+ { 43, 0, 6, 7, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 7, 6, { 0 }},
+ { 46, 0, 10, 3, { 0 }},
+ { 47, 1, 3, 7, { 0 }},
+ { 48, 0, 3, 7, { 0 }},
+ { 49, 0, 3, 5, { 0 }},
+ { 50, 0, 3, 7, { 0 }},
+ { 51, 0, 3, 7, { 0 }},
+ { 52, 0, 3, 8, { 0 }},
+ { 53, 0, 3, 7, { 0 }},
+ { 54, 0, 3, 7, { 0 }},
+ { 55, 0, 3, 7, { 0 }},
+ { 56, 0, 3, 7, { 0 }},
+ { 57, 0, 3, 7, { 0 }},
+ { 58, 0, 6, 3, { 0 }},
+ { 59, 0, 6, 3, { 0 }},
+ { 60, 1, 5, 6, { 0 }},
+ { 61, 1, 7, 7, { 0 }},
+ { 62, 1, 5, 6, { 0 }},
+ { 63, 0, 3, 7, { 0 }},
+ { 64, 0, 4, 9, { 0 }},
+ { 65, 0, 3, 7, { 0 }},
+ { 66, 0, 3, 7, { 0 }},
+ { 67, 0, 3, 7, { 0 }},
+ { 68, 0, 3, 7, { 0 }},
+ { 69, 0, 3, 7, { 0 }},
+ { 70, 0, 3, 7, { 0 }},
+ { 71, 0, 3, 7, { 0 }},
+ { 72, 0, 3, 7, { 0 }},
+ { 73, 0, 3, 3, { 0 }},
+ { 74, 0, 3, 7, { 0 }},
+ { 75, 0, 3, 7, { 0 }},
+ { 76, 0, 3, 7, { 0 }},
+ { 77, 0, 3, 9, { 0 }},
+ { 78, 0, 3, 7, { 0 }},
+ { 79, 0, 3, 7, { 0 }},
+ { 80, 0, 3, 7, { 0 }},
+ { 81, 0, 3, 7, { 0 }},
+ { 82, 0, 3, 7, { 0 }},
+ { 83, 0, 3, 7, { 0 }},
+ { 84, 0, 3, 7, { 0 }},
+ { 85, 0, 3, 7, { 0 }},
+ { 86, 0, 3, 7, { 0 }},
+ { 87, 0, 3, 9, { 0 }},
+ { 88, 0, 3, 7, { 0 }},
+ { 89, 0, 3, 7, { 0 }},
+ { 90, 0, 3, 7, { 0 }},
+ { 91, 1, 2, 5, { 0 }},
+ { 92, 1, 3, 7, { 0 }},
+ { 93, 1, 2, 5, { 0 }},
+ { 94, 0, 3, 7, { 0 }},
+ { 95, 0, 11, 7, { 0 }},
+ { 96, 0, 0, 4, { 0 }},
+ { 97, 0, 5, 7, { 0 }},
+ { 98, 0, 2, 7, { 0 }},
+ { 99, 0, 5, 7, { 0 }},
+ { 100, 0, 2, 7, { 0 }},
+ { 101, 0, 5, 7, { 0 }},
+ { 102, 0, 2, 6, { 0 }},
+ { 103, 0, 5, 7, { 0 }},
+ { 104, 0, 2, 7, { 0 }},
+ { 105, 0, 2, 3, { 0 }},
+ { 106, 0, 2, 3, { 0 }},
+ { 107, 0, 2, 7, { 0 }},
+ { 108, 0, 2, 4, { 0 }},
+ { 109, 0, 5, 9, { 0 }},
+ { 110, 0, 5, 7, { 0 }},
+ { 111, 0, 5, 7, { 0 }},
+ { 112, 0, 5, 7, { 0 }},
+ { 113, 0, 5, 7, { 0 }},
+ { 114, 0, 5, 7, { 0 }},
+ { 115, 0, 5, 7, { 0 }},
+ { 116, 0, 2, 4, { 0 }},
+ { 117, 0, 5, 7, { 0 }},
+ { 118, 0, 5, 7, { 0 }},
+ { 119, 0, 5, 9, { 0 }},
+ { 120, 0, 5, 7, { 0 }},
+ { 121, 0, 5, 7, { 0 }},
+ { 122, 0, 5, 7, { 0 }},
+ { 123, 1, 2, 6, { 0 }},
+ { 124, 1, 2, 3, { 0 }},
+ { 125, 1, 2, 6, { 0 }},
+ { 126, 0, 0, 7, { 0 }},
+ { 161, 0, 3, 3, { 0 }},
+ { 162, 0, 2, 7, { 0 }},
+ { 163, 0, 3, 9, { 0 }},
+ { 8364, 0, 3, 8, { 0 }},
+ { 165, 0, 3, 7, { 0 }},
+ { 352, 0, 12, 1, { 0 }},
+ { 167, 0, 2, 7, { 0 }},
+ { 353, 0, 12, 1, { 0 }},
+ { 169, 0, 0, 9, { 0 }},
+ { 170, 0, 0, 6, { 0 }},
+ { 171, 1, 5, 9, { 0 }},
+ { 172, 0, 0, 7, { 0 }},
+ { 174, 0, 0, 9, { 0 }},
+ { 175, 0, 0, 7, { 0 }},
+ { 176, 0, 0, 5, { 0 }},
+ { 177, 0, 4, 7, { 0 }},
+ { 178, 0, 0, 4, { 0 }},
+ { 179, 0, 0, 4, { 0 }},
+ { 381, 0, 12, 1, { 0 }},
+ { 181, 0, 5, 7, { 0 }},
+ { 182, 0, 3, 7, { 0 }},
+ { 183, 0, 6, 5, { 0 }},
+ { 382, 0, 12, 1, { 0 }},
+ { 185, 0, 0, 3, { 0 }},
+ { 186, 0, 0, 5, { 0 }},
+ { 187, 1, 5, 9, { 0 }},
+ { 338, 0, 3, 11, { 0 }},
+ { 339, 0, 5, 11, { 0 }},
+ { 376, 0, 12, 1, { 0 }},
+ { 191, 0, 4, 7, { 0 }},
+ { 192, 0, 0, 7, { 0 }},
+ { 193, 0, 0, 7, { 0 }},
+ { 194, 0, 0, 7, { 0 }},
+ { 195, 0, 0, 7, { 0 }},
+ { 196, 0, 1, 7, { 0 }},
+ { 197, 0, 0, 7, { 0 }},
+ { 198, 0, 3, 11, { 0 }},
+ { 199, 0, 3, 7, { 0 }},
+ { 200, 0, 0, 7, { 0 }},
+ { 201, 0, 0, 7, { 0 }},
+ { 202, 0, 0, 7, { 0 }},
+ { 203, 0, 1, 7, { 0 }},
+ { 204, -1, 0, 3, { 0 }},
+ { 205, 0, 0, 3, { 0 }},
+ { 206, -1, 0, 3, { 0 }},
+ { 207, -1, 1, 3, { 0 }},
+ { 208, 0, 3, 9, { 0 }},
+ { 209, 0, 0, 7, { 0 }},
+ { 210, 0, 0, 7, { 0 }},
+ { 211, 0, 0, 7, { 0 }},
+ { 212, 0, 0, 7, { 0 }},
+ { 213, 0, 0, 7, { 0 }},
+ { 214, 0, 1, 7, { 0 }},
+ { 215, 0, 7, 6, { 0 }},
+ { 216, 0, 3, 10, { 0 }},
+ { 217, 0, 0, 7, { 0 }},
+ { 218, 0, 0, 7, { 0 }},
+ { 219, 0, 0, 7, { 0 }},
+ { 220, 0, 1, 7, { 0 }},
+ { 221, 0, 0, 7, { 0 }},
+ { 222, 0, 0, 7, { 0 }},
+ { 223, 0, 3, 7, { 0 }},
+ { 224, 0, 2, 7, { 0 }},
+ { 225, 0, 2, 7, { 0 }},
+ { 226, 0, 2, 7, { 0 }},
+ { 227, 0, 2, 7, { 0 }},
+ { 228, 0, 3, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 5, 11, { 0 }},
+ { 231, 0, 5, 7, { 0 }},
+ { 232, 0, 2, 7, { 0 }},
+ { 233, 0, 2, 7, { 0 }},
+ { 234, 0, 2, 7, { 0 }},
+ { 235, 0, 3, 7, { 0 }},
+ { 236, 0, 2, 4, { 0 }},
+ { 237, 0, 2, 4, { 0 }},
+ { 238, 0, 2, 4, { 0 }},
+ { 239, 0, 3, 4, { 0 }},
+ { 240, 0, 0, 7, { 0 }},
+ { 241, 0, 2, 7, { 0 }},
+ { 242, 0, 2, 7, { 0 }},
+ { 243, 0, 2, 7, { 0 }},
+ { 244, 0, 2, 7, { 0 }},
+ { 245, 0, 2, 7, { 0 }},
+ { 246, 0, 3, 7, { 0 }},
+ { 247, 0, 0, 7, { 0 }},
+ { 248, 0, 5, 9, { 0 }},
+ { 249, 0, 2, 7, { 0 }},
+ { 250, 0, 2, 7, { 0 }},
+ { 251, 0, 2, 7, { 0 }},
+ { 252, 0, 3, 7, { 0 }},
+ { 253, 0, 2, 7, { 0 }},
+ { 254, 0, 0, 7, { 0 }},
+ { 255, 0, 3, 7, { 0 }},
+};
+
+// Style loading function: Candy
+static void GuiLoadStyleCandy(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < CANDY_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(candyStyleProps[i].controlId, candyStyleProps[i].propertyId, candyStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int candyFontDataSize = 0;
+ unsigned char *data = DecompressData(candyFontData, CANDY_STYLE_FONT_ATLAS_COMP_SIZE, &candyFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 15;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, candyFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, candyFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/candy/style_candy.old.rgs b/external/raygui-4.0/styles/candy/style_candy.old.rgs
new file mode 100644
index 0000000..24606c5
Binary files /dev/null and b/external/raygui-4.0/styles/candy/style_candy.old.rgs differ
diff --git a/external/raygui-4.0/styles/candy/style_candy.png b/external/raygui-4.0/styles/candy/style_candy.png
new file mode 100644
index 0000000..abceeb7
Binary files /dev/null and b/external/raygui-4.0/styles/candy/style_candy.png differ
diff --git a/external/raygui-4.0/styles/candy/style_candy.rgs b/external/raygui-4.0/styles/candy/style_candy.rgs
new file mode 100644
index 0000000..75a70f5
Binary files /dev/null and b/external/raygui-4.0/styles/candy/style_candy.rgs differ
diff --git a/external/raygui-4.0/styles/candy/style_candy.txt.rgs b/external/raygui-4.0/styles/candy/style_candy.txt.rgs
new file mode 100644
index 0000000..69b6088
--- /dev/null
+++ b/external/raygui-4.0/styles/candy/style_candy.txt.rgs
@@ -0,0 +1,27 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 15 charset.txt v5easter.ttf
+p 00 00 0xe58b68ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0xfeda96ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0xe59b5fff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xee813fff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0xfcd85bff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xfc6955ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0xb34848ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xeb7272ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0xbd4a4aff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x94795dff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0xc2a37aff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x9c8369ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x0000000f TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0xd77575ff LINE_COLOR
+p 00 19 0xfff5e1ff BACKGROUND_COLOR
+p 00 20 0x00000016 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/candy/v5easter.ttf b/external/raygui-4.0/styles/candy/v5easter.ttf
new file mode 100644
index 0000000..77a911a
Binary files /dev/null and b/external/raygui-4.0/styles/candy/v5easter.ttf differ
diff --git a/external/raygui-4.0/styles/cherry/README.md b/external/raygui-4.0/styles/cherry/README.md
new file mode 100644
index 0000000..2830c03
--- /dev/null
+++ b/external/raygui-4.0/styles/cherry/README.md
@@ -0,0 +1,27 @@
+## style: cherry
+
+Sweet with a touch of liquour, covered in chocolate, just give it a try! Not suitable for every palate, only the most demanding.
+
+![cherry style table](style_cherry.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_cherry.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_cherry.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_cherry.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_cherry.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_cherry.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![cherry style screen](screenshot.png)
+
+## about font
+
+"Westington" font by Hazel Abbiati.
+
+100% free font, downloaded from dafont.com: [westington](https://www.dafont.com/westington.font)
diff --git a/external/raygui-4.0/styles/cherry/Westington.ttf b/external/raygui-4.0/styles/cherry/Westington.ttf
new file mode 100644
index 0000000..68efae8
Binary files /dev/null and b/external/raygui-4.0/styles/cherry/Westington.ttf differ
diff --git a/external/raygui-4.0/styles/cherry/charset.txt b/external/raygui-4.0/styles/cherry/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/cherry/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/cherry/screenshot.png b/external/raygui-4.0/styles/cherry/screenshot.png
new file mode 100644
index 0000000..3c139e9
Binary files /dev/null and b/external/raygui-4.0/styles/cherry/screenshot.png differ
diff --git a/external/raygui-4.0/styles/cherry/style_cherry.h b/external/raygui-4.0/styles/cherry/style_cherry.h
new file mode 100644
index 0000000..81e840b
--- /dev/null
+++ b/external/raygui-4.0/styles/cherry/style_cherry.h
@@ -0,0 +1,617 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleCherry(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define CHERRY_STYLE_PROPS_COUNT 17
+
+// Custom style name: Cherry
+static const GuiStyleProp cherryStyleProps[CHERRY_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0xda5757ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x753233ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xe17373ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xfaaa97ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xe06262ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xfdb4aaff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xe03c46ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x5b1e20ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0xc2474fff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0xa19292ff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x706060ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x9e8585ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x0000000f }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0xfb8170ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x3a1720ff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000016 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Westington.ttf" (size: 15, spacing: 0)
+
+#define CHERRY_STYLE_FONT_ATLAS_COMP_SIZE 2821
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char cherryFontData[CHERRY_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0x59, 0x92, 0xdc, 0xba, 0x11, 0x05, 0x50, 0xee, 0x7f, 0xd3, 0xd7, 0xe1, 0x70, 0x84, 0xed, 0x27, 0xa9, 0x09, 0x20,
+ 0x91, 0x20, 0xab, 0x5b, 0x47, 0xe7, 0xaf, 0xa1, 0x1a, 0x38, 0x24, 0x26, 0x16, 0x12, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xf2,
+ 0xef, 0x7f, 0x5f, 0xfd, 0xf5, 0xcf, 0x65, 0xff, 0xff, 0xaa, 0xdc, 0xbe, 0x73, 0xfd, 0xb3, 0xb3, 0xf8, 0xae, 0x59, 0xf8,
+ 0x7f, 0xf9, 0xf2, 0xbb, 0x64, 0xfa, 0x33, 0xd7, 0x8f, 0x7b, 0xfd, 0x58, 0xef, 0xce, 0xfd, 0xfa, 0x31, 0x5c, 0x37, 0x9f,
+ 0xbf, 0xf6, 0xdd, 0x2a, 0xaf, 0xb9, 0x2f, 0x59, 0xbf, 0x7b, 0x3a, 0xae, 0xc8, 0xdc, 0x35, 0xb8, 0x3f, 0xa7, 0xd7, 0xf0,
+ 0x95, 0xeb, 0xef, 0x9c, 0xe1, 0x59, 0x1c, 0x7f, 0xab, 0xb5, 0x1a, 0xe0, 0xeb, 0xbf, 0x8e, 0xee, 0xa6, 0x14, 0xee, 0xab,
+ 0xff, 0xbd, 0x22, 0x8b, 0x65, 0xa3, 0xd7, 0xec, 0xdd, 0x57, 0x59, 0xa8, 0xa5, 0x2a, 0x57, 0x21, 0x8b, 0xe7, 0x61, 0xf5,
+ 0xdc, 0xa5, 0x54, 0xff, 0x8c, 0xbe, 0x6d, 0x5a, 0x8e, 0xe7, 0xae, 0x24, 0xd3, 0x7f, 0x1d, 0xbf, 0xa2, 0xf2, 0x6e, 0x33,
+ 0xf7, 0xd5, 0xdd, 0xab, 0xfb, 0xdf, 0x39, 0x53, 0xf7, 0xef, 0xd9, 0xf8, 0x1f, 0xd5, 0x97, 0xf7, 0xe7, 0xfb, 0xee, 0x28,
+ 0xf2, 0xdf, 0xde, 0x45, 0xed, 0xbe, 0xdb, 0x89, 0xf4, 0xdc, 0xdc, 0x9d, 0x29, 0x9e, 0x8d, 0xfa, 0xff, 0xbb, 0x8f, 0x97,
+ 0x14, 0x7b, 0x5e, 0x59, 0xb8, 0x4f, 0xb3, 0x54, 0xeb, 0xcd, 0xf4, 0x26, 0x2a, 0x35, 0xdd, 0x6e, 0x2f, 0x6a, 0xbf, 0xa7,
+ 0xfb, 0xf5, 0x35, 0xb8, 0x3b, 0xdf, 0x99, 0x3c, 0x82, 0x94, 0xe2, 0xff, 0x5a, 0xac, 0xb1, 0x9f, 0x8a, 0xff, 0x71, 0xac,
+ 0x8c, 0xe2, 0x29, 0xc3, 0x2b, 0x9c, 0x96, 0xef, 0x9f, 0x52, 0x8d, 0x76, 0x6a, 0x9c, 0x55, 0xbf, 0x7f, 0x66, 0xcf, 0x5e,
+ 0x06, 0xa3, 0xb9, 0xee, 0x5e, 0xe8, 0x7c, 0xaf, 0x2f, 0xc5, 0xda, 0x75, 0xa5, 0x8f, 0x9f, 0xad, 0xde, 0xfa, 0x28, 0x7e,
+ 0xb3, 0x5c, 0x17, 0x67, 0xa2, 0x3f, 0x74, 0xa2, 0x4f, 0xf2, 0x09, 0xf1, 0x9f, 0xc2, 0x08, 0xae, 0x5a, 0xc7, 0xa7, 0xa9,
+ 0x6d, 0xce, 0xa1, 0xfa, 0xb5, 0x3b, 0xfe, 0xd7, 0xcb, 0xc6, 0x91, 0x91, 0xd6, 0x71, 0x58, 0x4a, 0x23, 0xe9, 0x7a, 0x1b,
+ 0xbe, 0xfb, 0xda, 0xbb, 0xb9, 0xa2, 0x4c, 0xd4, 0x9e, 0x59, 0x9e, 0x01, 0xd8, 0x89, 0xff, 0xfe, 0xf1, 0x7f, 0x4a, 0xaf,
+ 0x98, 0xab, 0x8d, 0x6b, 0x35, 0x71, 0x16, 0xbe, 0x59, 0x9a, 0x6a, 0xb6, 0x1c, 0x9d, 0x65, 0xbd, 0x1a, 0xe3, 0xbf, 0x36,
+ 0x72, 0x4a, 0xdb, 0xdc, 0x44, 0x7d, 0xec, 0x96, 0xa6, 0xfb, 0x35, 0xad, 0xaf, 0xb8, 0x8f, 0xff, 0xbb, 0xf6, 0x7f, 0xbf,
+ 0xff, 0xff, 0x7e, 0xfb, 0xdf, 0x3d, 0xfa, 0x9f, 0x9f, 0xc5, 0x18, 0x9f, 0xd3, 0xe7, 0xe2, 0xff, 0x64, 0xdf, 0xbf, 0x36,
+ 0x96, 0x4f, 0x71, 0x9e, 0x32, 0x4d, 0x23, 0xf6, 0x94, 0x47, 0xe7, 0x69, 0x99, 0xd5, 0xe9, 0xab, 0xab, 0x53, 0xfe, 0x8c,
+ 0xfa, 0x3c, 0xf6, 0x4f, 0x1d, 0xff, 0x67, 0xe9, 0xd9, 0xc0, 0xb8, 0x6f, 0x75, 0x77, 0x66, 0xd2, 0x3e, 0xff, 0xf7, 0xde,
+ 0x53, 0xd6, 0xb5, 0x5a, 0x27, 0x85, 0x31, 0x76, 0x65, 0xd6, 0xbc, 0xfa, 0x34, 0xb1, 0xf3, 0xd9, 0xe4, 0xfb, 0xd7, 0xa9,
+ 0x3a, 0xd7, 0x98, 0x72, 0xed, 0x9e, 0x89, 0x67, 0x3f, 0xeb, 0xb3, 0x0a, 0x4f, 0xf5, 0xa6, 0x66, 0xe6, 0x62, 0xae, 0xe2,
+ 0xbc, 0x69, 0x0a, 0x3d, 0x9c, 0x4f, 0x8f, 0xff, 0x4f, 0xaa, 0x89, 0x3e, 0xf1, 0xf7, 0x27, 0x69, 0x1e, 0xe9, 0x77, 0x45,
+ 0x40, 0x26, 0x46, 0xe2, 0x57, 0xa1, 0x9e, 0xfe, 0x0e, 0xcf, 0xff, 0xc7, 0xf1, 0x5f, 0x1d, 0xff, 0x67, 0xea, 0xf7, 0x18,
+ 0x6b, 0xcf, 0x01, 0xf2, 0xe1, 0xad, 0xbf, 0x1a, 0xa0, 0x67, 0x4e, 0xfe, 0xe9, 0xfa, 0x39, 0x87, 0xc7, 0x85, 0x7f, 0xe3,
+ 0x75, 0x05, 0xf7, 0x0f, 0x20, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x5e, 0x37,
+ 0xb8, 0xbe, 0x16, 0xb1, 0x3b, 0x4b, 0x6b, 0xe5, 0xfd, 0x7e, 0x2f, 0x1d, 0xbd, 0x47, 0xf5, 0x68, 0x2b, 0xb9, 0xa0, 0x33,
+ 0xf5, 0xdd, 0xb3, 0xbc, 0xa2, 0x73, 0x74, 0x34, 0xf9, 0xc7, 0x1a, 0xd5, 0x99, 0x73, 0xba, 0x73, 0x5d, 0xc6, 0x99, 0x77,
+ 0x57, 0xf2, 0xfb, 0xae, 0xad, 0x06, 0x5e, 0x5d, 0x21, 0xd0, 0x99, 0xed, 0x60, 0xf6, 0xfa, 0x56, 0xee, 0xa8, 0x95, 0x4f,
+ 0xdb, 0x59, 0x8b, 0x78, 0x9f, 0x81, 0xf9, 0x1a, 0x66, 0x88, 0xee, 0xca, 0x51, 0x97, 0x8d, 0x35, 0xfb, 0xbf, 0xdf, 0xc9,
+ 0x95, 0x55, 0xdb, 0xe3, 0x7b, 0xaa, 0x92, 0x77, 0xa9, 0x9a, 0xb3, 0x39, 0x2d, 0x9f, 0x3b, 0xf3, 0xcd, 0xe6, 0x32, 0xfa,
+ 0xd4, 0x33, 0xb6, 0x5f, 0x8b, 0xfb, 0x30, 0xac, 0xad, 0xe5, 0xce, 0xf2, 0x5a, 0xf8, 0xb4, 0xe5, 0x8b, 0x48, 0xf1, 0x3d,
+ 0x6b, 0xf7, 0xda, 0x99, 0xec, 0x3f, 0xd5, 0x2c, 0x59, 0x67, 0xe2, 0x3f, 0xe5, 0xef, 0x92, 0xdb, 0x7b, 0xe2, 0x1a, 0x66,
+ 0x28, 0xaa, 0x66, 0x5e, 0xca, 0x46, 0xbd, 0x96, 0x8d, 0xb5, 0xee, 0x5d, 0xf1, 0xbf, 0x13, 0xe1, 0xb3, 0xf9, 0x7b, 0xd3,
+ 0xb2, 0xba, 0x7f, 0x25, 0x1b, 0x7a, 0xb5, 0x1f, 0xdc, 0x19, 0x21, 0x77, 0xc7, 0x9e, 0x8d, 0x33, 0x73, 0x26, 0xfe, 0xf3,
+ 0x01, 0xf1, 0xbf, 0x53, 0x17, 0x7d, 0xcf, 0xf8, 0x4f, 0x43, 0xed, 0x9c, 0xd2, 0x15, 0xfa, 0x3d, 0x76, 0x2b, 0x7b, 0x59,
+ 0x5c, 0xe5, 0x8c, 0xce, 0x69, 0x6e, 0x8f, 0x3a, 0xd6, 0x14, 0x3f, 0x19, 0xff, 0xeb, 0xf5, 0xcd, 0xa9, 0xf8, 0xbf, 0xdb,
+ 0xad, 0x23, 0xa5, 0xdd, 0x9e, 0xfa, 0xf6, 0xc1, 0x5a, 0xa9, 0x8b, 0x32, 0x9d, 0x5b, 0xb4, 0x12, 0xff, 0x19, 0xee, 0xa0,
+ 0x51, 0xd9, 0xb7, 0xa0, 0x9a, 0x0d, 0xb9, 0x23, 0xfe, 0xe7, 0xf3, 0x9b, 0x67, 0xb2, 0xee, 0xed, 0x88, 0xf3, 0x77, 0xe2,
+ 0x7f, 0x74, 0x05, 0x53, 0xcc, 0xd6, 0xb7, 0x9e, 0xe5, 0x7b, 0xfc, 0x69, 0xbd, 0x59, 0xd4, 0x67, 0xf6, 0x9a, 0xc9, 0x37,
+ 0x68, 0xff, 0xcf, 0xc7, 0x7f, 0xe5, 0x5d, 0x67, 0xe7, 0x66, 0xf2, 0x5a, 0xfc, 0x67, 0xbb, 0x85, 0x4f, 0xf3, 0xe8, 0xf2,
+ 0x8d, 0xbc, 0x5f, 0x33, 0xf3, 0x05, 0xb5, 0x18, 0x4f, 0xeb, 0x78, 0xa3, 0xf6, 0x69, 0x27, 0x7a, 0x98, 0xeb, 0xf1, 0x9f,
+ 0xa3, 0xe3, 0xff, 0x95, 0x4f, 0xa8, 0xf7, 0xff, 0xef, 0x3e, 0xbb, 0x77, 0xfe, 0xaf, 0x6b, 0xee, 0x69, 0xa6, 0xed, 0x4e,
+ 0x43, 0x2f, 0xe2, 0x7c, 0xcd, 0x90, 0xd7, 0x9e, 0x91, 0x55, 0x3e, 0xff, 0x44, 0x44, 0x56, 0x63, 0xab, 0x1a, 0xff, 0xbd,
+ 0xf3, 0xff, 0x1d, 0xf3, 0xcc, 0x73, 0x47, 0x9f, 0x42, 0xa4, 0xa6, 0x38, 0xbe, 0xca, 0xd6, 0x0c, 0x79, 0x36, 0xe2, 0x3f,
+ 0x0d, 0xf1, 0x7f, 0xf7, 0xfc, 0x6e, 0x37, 0xfe, 0x33, 0x78, 0xbe, 0x91, 0x6f, 0x13, 0xff, 0x29, 0xc5, 0x7f, 0x9a, 0x23,
+ 0x32, 0xe5, 0xd8, 0xba, 0x96, 0x9f, 0x4f, 0x9e, 0x79, 0xfe, 0x3f, 0x7e, 0xca, 0xba, 0xf3, 0x24, 0x79, 0xf6, 0x3b, 0xd5,
+ 0x7f, 0xed, 0x30, 0x3a, 0x4b, 0x59, 0x8e, 0xb0, 0x94, 0x72, 0xf3, 0xcf, 0x8f, 0xf9, 0xb2, 0xd9, 0x4a, 0x8d, 0x6b, 0x88,
+ 0x6a, 0x4e, 0xea, 0xd5, 0x7d, 0xd5, 0xf3, 0xfa, 0xbe, 0x36, 0xcf, 0xbc, 0x72, 0x67, 0xaf, 0x06, 0x39, 0x89, 0xf9, 0x19,
+ 0xbf, 0x49, 0x73, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xd6, 0x60,
+ 0xa6, 0x94, 0xd5, 0x6b, 0xf6, 0x7f, 0x55, 0x73, 0x90, 0xe5, 0x36, 0xcb, 0xf4, 0xda, 0x5a, 0xdf, 0x0c, 0x8f, 0xb1, 0x63,
+ 0xa5, 0xf4, 0xd9, 0x2c, 0xdc, 0xf3, 0xe7, 0xb6, 0x76, 0xf5, 0xb3, 0x98, 0xcf, 0x32, 0xed, 0x2b, 0xd3, 0xc7, 0xeb, 0xad,
+ 0xef, 0xd7, 0xd0, 0xd7, 0x5f, 0x77, 0x15, 0x56, 0x38, 0xaf, 0x5e, 0xad, 0x99, 0x5c, 0xf1, 0x6f, 0xd4, 0x15, 0xd7, 0x44,
+ 0x86, 0xbb, 0x9d, 0x1c, 0xfa, 0x77, 0xe7, 0xfe, 0xeb, 0xfb, 0xf5, 0xee, 0x7b, 0xf5, 0xe5, 0x2d, 0xbc, 0xb6, 0x33, 0xe8,
+ 0x5e, 0x8f, 0x64, 0xe1, 0xce, 0xe2, 0x7d, 0x38, 0xfb, 0x3f, 0x47, 0x59, 0x04, 0x53, 0xc8, 0xf4, 0x71, 0xee, 0x78, 0x67,
+ 0xf2, 0x3f, 0x8d, 0xf2, 0x3c, 0xfe, 0xf9, 0xef, 0x2b, 0xf7, 0x53, 0x2d, 0x67, 0x72, 0x06, 0xb9, 0x24, 0x7b, 0xd7, 0x5a,
+ 0xe7, 0xf6, 0x5e, 0x5d, 0xef, 0x47, 0x9c, 0xb9, 0xa2, 0xf5, 0xf8, 0x5f, 0x6f, 0x77, 0x4e, 0xc5, 0xff, 0x7e, 0x16, 0xde,
+ 0x9d, 0x1c, 0x3d, 0xfb, 0x7f, 0xbf, 0x6f, 0xfd, 0xaf, 0xe5, 0xde, 0xd9, 0xb5, 0x95, 0xeb, 0x76, 0x9c, 0x09, 0x67, 0x9c,
+ 0x61, 0x6a, 0xf5, 0x38, 0xae, 0xc5, 0xfc, 0xce, 0x9f, 0x13, 0xff, 0x57, 0x29, 0xfe, 0xaf, 0x0f, 0x8a, 0xff, 0xbb, 0x76,
+ 0xe7, 0x2a, 0xee, 0x27, 0x72, 0xd7, 0x33, 0xbb, 0x1a, 0xdb, 0x9c, 0xdf, 0x6b, 0xd5, 0x94, 0xfa, 0xc3, 0x29, 0x67, 0x4f,
+ 0x7c, 0x2b, 0x07, 0xd7, 0x78, 0x77, 0x93, 0x71, 0xdf, 0xbf, 0x56, 0x53, 0xd6, 0x32, 0x31, 0xdd, 0x8f, 0x28, 0xb2, 0xb4,
+ 0x3b, 0x41, 0x3d, 0x2f, 0x58, 0x0e, 0x64, 0x47, 0x59, 0xad, 0xe9, 0x53, 0xe8, 0xff, 0x5f, 0x5b, 0xfb, 0x48, 0x54, 0xf3,
+ 0x1e, 0xd7, 0x72, 0xac, 0xa7, 0xd0, 0xee, 0xcc, 0xc4, 0xdf, 0x5e, 0x16, 0xde, 0x4c, 0x8e, 0xb2, 0xae, 0xc5, 0x3a, 0xf2,
+ 0x6a, 0xab, 0x31, 0xd6, 0x7a, 0x98, 0xd9, 0x1a, 0x6d, 0xcd, 0xd4, 0x0d, 0x59, 0xdc, 0xab, 0xa1, 0xde, 0x5e, 0x54, 0xf2,
+ 0xc9, 0xd5, 0x6b, 0x80, 0xbc, 0x36, 0xff, 0x77, 0x15, 0x32, 0xd5, 0xaf, 0xe5, 0xe6, 0xab, 0xcc, 0xbd, 0x55, 0x8e, 0xaf,
+ 0x96, 0x73, 0x6f, 0x26, 0x6b, 0x7b, 0x4f, 0xfe, 0xe2, 0xd5, 0xf3, 0x73, 0x4d, 0xcd, 0x6a, 0xe5, 0xa5, 0xf6, 0x7f, 0x3d,
+ 0x02, 0xe6, 0x76, 0xa5, 0xdc, 0xe9, 0xd5, 0x54, 0x33, 0x76, 0xf7, 0xf7, 0x7e, 0xde, 0x9f, 0xff, 0x5f, 0xcb, 0xe0, 0xfd,
+ 0x59, 0xd9, 0x59, 0xd3, 0xf0, 0x3f, 0xfa, 0x3e, 0xeb, 0xed, 0x67, 0x38, 0x39, 0x5a, 0xfb, 0xf7, 0xc6, 0x7f, 0x8a, 0xe3,
+ 0xc9, 0xd9, 0x7a, 0x38, 0x4b, 0x39, 0x87, 0xc7, 0xf3, 0x5b, 0xe7, 0xc6, 0x3f, 0x9f, 0x78, 0x3f, 0xed, 0xe4, 0xb2, 0x7f,
+ 0xf6, 0x7b, 0xe6, 0xb1, 0x1e, 0xd3, 0x89, 0xd9, 0x97, 0xe7, 0xce, 0xc4, 0xda, 0x31, 0xa5, 0xf1, 0x8e, 0xad, 0xcd, 0xff,
+ 0x65, 0x63, 0x8e, 0x6f, 0x77, 0xbf, 0xde, 0x14, 0x66, 0x15, 0xff, 0x86, 0x5f, 0x0a, 0x7c, 0x3d, 0x03, 0x91, 0xbf, 0x22,
+ 0xf7, 0xf0, 0x4f, 0x3c, 0xc6, 0x8e, 0xe7, 0xff, 0xd5, 0x7e, 0x53, 0x6d, 0xe7, 0x80, 0xb9, 0x79, 0x9f, 0xca, 0xfc, 0x6e,
+ 0x75, 0xcc, 0x08, 0x54, 0x9e, 0x31, 0x57, 0x76, 0x0e, 0xe8, 0x18, 0xc1, 0x65, 0xf9, 0xf9, 0x3f, 0xf0, 0x53, 0x6a, 0xa2,
+ 0xda, 0xbc, 0x22, 0xf0, 0xfd, 0x47, 0x3b, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
+ 0x9e, 0xbf, 0x88, 0x5e, 0x5f, 0xeb, 0xba, 0x9e, 0xeb, 0xb0, 0x9e, 0x71, 0x65, 0x76, 0x7d, 0xea, 0x55, 0xca, 0x1a, 0xb9,
+ 0x97, 0x9b, 0x66, 0x2e, 0x5b, 0x73, 0x3d, 0x5b, 0x5d, 0x35, 0x43, 0xd6, 0x5e, 0xe9, 0xf8, 0x95, 0xf5, 0x57, 0x5f, 0xd3,
+ 0xe7, 0x2d, 0xaf, 0x1c, 0x77, 0x16, 0x73, 0x18, 0xac, 0xdc, 0x53, 0xfd, 0xc7, 0xba, 0x77, 0x2e, 0xae, 0x62, 0x46, 0x9f,
+ 0x4a, 0xb6, 0xe3, 0x4a, 0xbc, 0xde, 0xe5, 0x3b, 0xcd, 0xe2, 0x67, 0x65, 0x39, 0xa7, 0xf3, 0xa8, 0x16, 0xc9, 0x60, 0xc5,
+ 0x68, 0x26, 0xd6, 0x9c, 0xee, 0xe5, 0x1b, 0xa8, 0x96, 0x8d, 0xaf, 0x7a, 0x3d, 0xcf, 0x49, 0x16, 0xeb, 0x8f, 0xb5, 0x1c,
+ 0x7d, 0x27, 0x8f, 0x7b, 0x7d, 0x0d, 0x73, 0x96, 0x73, 0x64, 0x5d, 0x8b, 0xad, 0x4d, 0x26, 0xda, 0x87, 0xea, 0xb9, 0x98,
+ 0x6d, 0x01, 0x57, 0xdb, 0xcd, 0xd5, 0x9a, 0xa4, 0x1a, 0xff, 0xd5, 0xcf, 0x3a, 0x13, 0xff, 0x77, 0xc7, 0x96, 0xdb, 0x9c,
+ 0x13, 0xd9, 0xcc, 0x6f, 0xf8, 0x6c, 0xaf, 0xb0, 0xa7, 0xfd, 0x4d, 0x71, 0x8d, 0xfe, 0xf9, 0x75, 0x81, 0xa7, 0x56, 0x07,
+ 0xd6, 0x73, 0x47, 0xbf, 0x71, 0x0f, 0xa4, 0x2d, 0x6b, 0xe4, 0x5c, 0x3e, 0xd6, 0xf5, 0xf8, 0x5f, 0x1d, 0x2f, 0xac, 0xe6,
+ 0x33, 0xcc, 0x44, 0xeb, 0x34, 0xdb, 0xfe, 0x67, 0xeb, 0xea, 0x3f, 0xdf, 0xff, 0xbf, 0x36, 0xda, 0xd0, 0xb9, 0xd1, 0xc1,
+ 0x6c, 0x1e, 0x8e, 0xd5, 0xbb, 0xa9, 0x5e, 0x3a, 0xce, 0x0d, 0xbc, 0xf7, 0xd7, 0xf1, 0xfd, 0x77, 0xf7, 0x4e, 0x95, 0x91,
+ 0x52, 0xb6, 0x33, 0x36, 0x65, 0xf9, 0x6c, 0xdc, 0x1f, 0xf5, 0x7a, 0xce, 0xe5, 0xd5, 0xf8, 0x1f, 0xd5, 0x26, 0x6b, 0x23,
+ 0xb8, 0x71, 0xfb, 0x3f, 0x93, 0x6b, 0x72, 0x6f, 0xb7, 0x8a, 0x1c, 0x89, 0xc3, 0x7a, 0xe9, 0xce, 0x4e, 0x27, 0x7f, 0xaa,
+ 0x13, 0x53, 0xae, 0x99, 0x72, 0xac, 0xf4, 0xc4, 0xf8, 0x7f, 0x9c, 0x71, 0x24, 0x85, 0x7c, 0x25, 0x3b, 0xa3, 0xa8, 0xdd,
+ 0xf6, 0xa5, 0xe3, 0xdd, 0xb2, 0xb5, 0x97, 0xc3, 0xb9, 0x6f, 0xdd, 0x31, 0xfe, 0x3f, 0x3b, 0xff, 0xb7, 0xbf, 0xe3, 0x58,
+ 0xcf, 0x6e, 0x45, 0xab, 0xb5, 0xd9, 0xaf, 0xe7, 0x22, 0x1f, 0xd2, 0xab, 0xa9, 0xd5, 0x0e, 0xfb, 0x7f, 0x1d, 0xcf, 0x59,
+ 0xe7, 0xa5, 0xf8, 0xef, 0x1d, 0x09, 0xe5, 0xc0, 0xfc, 0xe4, 0xf3, 0xd1, 0xbf, 0x32, 0xfe, 0xef, 0x98, 0x31, 0xab, 0xee,
+ 0x38, 0x72, 0xb6, 0xb4, 0xb2, 0xe3, 0xea, 0xfc, 0x3d, 0xf9, 0x44, 0x0b, 0xdf, 0xb5, 0x4f, 0xc2, 0x4f, 0x8d, 0xff, 0x37,
+ 0xf7, 0x18, 0xd9, 0x89, 0xff, 0xf3, 0x59, 0x9a, 0xf3, 0x87, 0x79, 0xbd, 0xdd, 0x4f, 0x1c, 0xed, 0x11, 0x9b, 0xf6, 0x38,
+ 0xdc, 0x8f, 0xe1, 0x9d, 0xd2, 0xb9, 0x7d, 0x78, 0x6a, 0x51, 0xba, 0x53, 0xfa, 0x56, 0xfb, 0x3f, 0x33, 0x0b, 0xf5, 0x74,
+ 0xfc, 0x77, 0xce, 0x86, 0xe6, 0x50, 0xeb, 0xb8, 0x3e, 0x9a, 0xe8, 0x9f, 0x1b, 0xed, 0xf8, 0xc4, 0x6a, 0xcb, 0xf0, 0x4e,
+ 0xff, 0xbf, 0xfe, 0xfb, 0x8b, 0x7f, 0xce, 0x66, 0xa5, 0x38, 0xab, 0xf5, 0x93, 0xc6, 0xff, 0xd7, 0xd4, 0xae, 0x51, 0x79,
+ 0x69, 0xfc, 0xff, 0x19, 0xaf, 0xff, 0x7b, 0x7f, 0x81, 0x75, 0x1d, 0x6e, 0x87, 0x9f, 0x2e, 0x3d, 0xdf, 0x63, 0xdc, 0x2b,
+ 0xcd, 0x2b, 0xed, 0xff, 0xdc, 0x48, 0xf4, 0xbd, 0xf8, 0xef, 0xea, 0x2f, 0xab, 0x09, 0x3a, 0xe7, 0x59, 0xde, 0x6d, 0xc3,
+ 0x6b, 0xbb, 0x38, 0xee, 0xfd, 0xda, 0x66, 0x76, 0x74, 0x50, 0x2b, 0xcd, 0xe1, 0xf1, 0xff, 0xee, 0x55, 0xae, 0x1c, 0xcf,
+ 0xa7, 0xc4, 0xbf, 0xbc, 0xea, 0xa7, 0xea, 0x8c, 0x4a, 0x1c, 0x3e, 0x15, 0xc3, 0xcf, 0xdf, 0x4d, 0x7b, 0xcf, 0xff, 0xd7,
+ 0xeb, 0xe8, 0xb5, 0xe7, 0xff, 0x3b, 0x2d, 0xc3, 0xd3, 0xcf, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0xef, 0xb7, 0xfe, 0x6c, 0x9c, 0x99, 0xa6, 0x9e, 0xd5, 0x7b, 0x37, 0x2b, 0xc0, 0xde, 0x11, 0xa5, 0xb4, 0xf6,
+ 0x6c, 0x36, 0xb7, 0x75, 0xf7, 0xfa, 0xb4, 0x7a, 0x7e, 0xf0, 0x6c, 0xac, 0x3a, 0xac, 0xff, 0xba, 0xfc, 0xd4, 0x71, 0x9e,
+ 0xca, 0xc2, 0x55, 0xb9, 0x1f, 0x9e, 0xbb, 0x96, 0x69, 0xbf, 0xc2, 0xb3, 0xef, 0x51, 0xcd, 0x05, 0x9d, 0xa5, 0x1c, 0x10,
+ 0xab, 0x71, 0x96, 0xcd, 0x0c, 0xf5, 0xf5, 0xb5, 0x67, 0xb3, 0xb5, 0x4e, 0x6f, 0xe6, 0xea, 0x6c, 0xe4, 0x87, 0xae, 0x9f,
+ 0xa3, 0x9d, 0xd5, 0xa5, 0xdd, 0xc7, 0xb9, 0x7e, 0xc5, 0x3a, 0x72, 0x73, 0x67, 0xe3, 0xcc, 0x67, 0xf9, 0xcc, 0x64, 0x50,
+ 0x3b, 0xe5, 0x91, 0x75, 0xa5, 0xbd, 0x99, 0x0b, 0x56, 0x57, 0x34, 0x3e, 0xb7, 0xd6, 0xb6, 0xbe, 0x0a, 0x6c, 0x37, 0xbf,
+ 0xd5, 0x73, 0xfd, 0xb7, 0x6a, 0x5f, 0xe4, 0xd7, 0xa3, 0xcc, 0x07, 0xe4, 0x74, 0x38, 0xbb, 0x9a, 0xed, 0xcc, 0x5e, 0x23,
+ 0xe7, 0xbf, 0xe1, 0xde, 0xde, 0x21, 0x3b, 0x6b, 0x08, 0x53, 0xec, 0x51, 0x8d, 0x32, 0x1a, 0xdc, 0xc7, 0xe7, 0x6e, 0xf9,
+ 0x5c, 0x0e, 0xb8, 0x6b, 0x22, 0x33, 0x6d, 0x0a, 0xd9, 0x2f, 0x32, 0x58, 0xd7, 0xde, 0x5d, 0x56, 0xbb, 0x47, 0x67, 0xf2,
+ 0x96, 0xe7, 0xc0, 0x1d, 0x75, 0xbd, 0x98, 0x9b, 0xeb, 0x5a, 0x6e, 0x93, 0x53, 0x6c, 0x7b, 0x3b, 0x4b, 0x3a, 0xea, 0xe7,
+ 0x6a, 0x2f, 0x6f, 0xa6, 0x6c, 0x3d, 0xa3, 0xe1, 0x4c, 0xcf, 0xf2, 0x99, 0xf2, 0xf5, 0x5c, 0xe6, 0xb3, 0xd9, 0x6f, 0xf2,
+ 0x58, 0x59, 0xca, 0x77, 0xdb, 0x35, 0x91, 0x87, 0xff, 0xd4, 0x5d, 0xf3, 0x7c, 0x36, 0x8b, 0x4a, 0x0d, 0x5a, 0xcb, 0x91,
+ 0xf8, 0x5c, 0xc9, 0x6c, 0xae, 0x83, 0x13, 0x57, 0xeb, 0x2a, 0xde, 0x39, 0x9f, 0x11, 0xff, 0xb9, 0xbd, 0xe6, 0xd7, 0x56,
+ 0xdd, 0xd6, 0xdd, 0x2e, 0xce, 0xb4, 0x99, 0xf5, 0x7a, 0xa3, 0xfa, 0xb9, 0xb5, 0xac, 0x34, 0x73, 0xd9, 0x79, 0xae, 0xe9,
+ 0x91, 0x7e, 0x65, 0x8f, 0xca, 0x95, 0x4f, 0xad, 0xb4, 0x03, 0x4f, 0x95, 0x54, 0x46, 0x30, 0x4f, 0xc5, 0xff, 0x67, 0xb4,
+ 0xef, 0xb5, 0xdd, 0x0d, 0xc7, 0xe3, 0xff, 0x94, 0x7b, 0x45, 0xfd, 0x65, 0x29, 0xcf, 0xde, 0x74, 0xcc, 0x0b, 0xa5, 0xb5,
+ 0xec, 0x6a, 0x9a, 0x9f, 0xaf, 0xec, 0x66, 0xf7, 0xb9, 0xf1, 0x5f, 0xdd, 0x3b, 0xe6, 0xad, 0xf8, 0xcf, 0xc7, 0xb7, 0xff,
+ 0xeb, 0xbb, 0x9b, 0xfe, 0xf9, 0x19, 0x55, 0x4a, 0x3d, 0x8b, 0xce, 0xb2, 0xab, 0xb8, 0xef, 0xda, 0x6e, 0xaf, 0xf9, 0xc4,
+ 0xf8, 0x66, 0x36, 0x27, 0xf0, 0x93, 0xf1, 0x5f, 0xb9, 0x2a, 0xbd, 0x25, 0xbb, 0x33, 0x43, 0x6f, 0xb4, 0xff, 0xf3, 0xcf,
+ 0x0d, 0xde, 0x8a, 0xff, 0xea, 0xf3, 0xff, 0x99, 0xbd, 0x3c, 0x4f, 0xb4, 0x8c, 0x95, 0x96, 0xfc, 0xec, 0x3e, 0x09, 0x27,
+ 0xc6, 0x39, 0xa7, 0xdb, 0xff, 0xca, 0x78, 0xe4, 0x1a, 0xee, 0xfc, 0x7e, 0xba, 0xe4, 0xda, 0x9e, 0xf9, 0xfd, 0xb4, 0x19,
+ 0x99, 0xa7, 0xc6, 0xf7, 0x9f, 0xb5, 0xdf, 0xea, 0xf5, 0xda, 0xf3, 0xb4, 0x9f, 0x70, 0xac, 0x1d, 0x33, 0x00, 0xcf, 0x3f,
+ 0x73, 0xfc, 0xb4, 0x73, 0x57, 0xdd, 0x89, 0xe5, 0xb9, 0xef, 0xd3, 0x51, 0x3e, 0xf3, 0xbd, 0xe5, 0x4c, 0xe5, 0x6f, 0xfa,
+ 0xf5, 0xef, 0x67, 0xe5, 0x10, 0x1e, 0xff, 0x86, 0x76, 0xaf, 0xfc, 0xb9, 0xdf, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xa9, 0xdf, 0xde, 0xd7, 0xd7, 0xbd, 0x57, 0xd7, 0x7c, 0xf7, 0x67, 0xe2, 0x8e, 0x35,
+ 0x3c, 0xd0, 0xb6, 0x16, 0x34, 0x93, 0xb9, 0xe0, 0xba, 0x63, 0x31, 0x5b, 0x99, 0x4d, 0x80, 0xf9, 0x36, 0xff, 0x8d, 0x75,
+ 0x7e, 0xd5, 0xcf, 0xcd, 0x30, 0xf3, 0x82, 0x55, 0x7c, 0x30, 0x1f, 0xff, 0x19, 0xe6, 0x32, 0xea, 0x2e, 0xbd, 0x26, 0xb2,
+ 0x0b, 0x5c, 0x85, 0xfc, 0x55, 0xd1, 0x47, 0x80, 0xa5, 0xf8, 0x9f, 0xc9, 0xc8, 0xfd, 0x49, 0xa5, 0x29, 0xef, 0x3e, 0x06,
+ 0xfc, 0x79, 0x94, 0xfd, 0xbd, 0xe2, 0x7f, 0x27, 0x7f, 0x3d, 0xf0, 0x7e, 0xfc, 0xa7, 0x58, 0x5a, 0xcf, 0x15, 0x0b, 0xfc,
+ 0xda, 0xfb, 0x9f, 0x99, 0xfd, 0x4f, 0x7b, 0xe9, 0xd5, 0xb0, 0xc7, 0x44, 0xf5, 0xa9, 0x24, 0xd0, 0xf1, 0x7c, 0x70, 0xa7,
+ 0xb4, 0xfe, 0x9b, 0x84, 0x99, 0xe7, 0x19, 0xae, 0x1c, 0x7c, 0xff, 0xe7, 0x92, 0xb5, 0xfa, 0xca, 0x19, 0x84, 0xef, 0xdf,
+ 0xef, 0x70, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x79, 0xff, 0xf9, 0xe7, 0x3c, 0x80, 0xf8, 0x07, 0xfe, 0xba, 0xf8, 0xff, 0x17 };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle cherryFontRecs[189] = {
+ { 4, 4, 5 , 15 },
+ { 17, 4, 3 , 10 },
+ { 28, 4, 5 , 2 },
+ { 41, 4, 10 , 10 },
+ { 59, 4, 7 , 11 },
+ { 74, 4, 7 , 10 },
+ { 89, 4, 8 , 10 },
+ { 105, 4, 1 , 2 },
+ { 114, 4, 3 , 10 },
+ { 125, 4, 3 , 10 },
+ { 136, 4, 3 , 3 },
+ { 147, 4, 7 , 7 },
+ { 162, 4, 2 , 2 },
+ { 172, 4, 6 , 3 },
+ { 186, 4, 1 , 1 },
+ { 195, 4, 4 , 10 },
+ { 207, 4, 5 , 8 },
+ { 220, 4, 5 , 8 },
+ { 233, 4, 5 , 8 },
+ { 246, 4, 5 , 8 },
+ { 259, 4, 5 , 8 },
+ { 272, 4, 5 , 8 },
+ { 285, 4, 5 , 8 },
+ { 298, 4, 5 , 8 },
+ { 311, 4, 5 , 8 },
+ { 324, 4, 5 , 8 },
+ { 337, 4, 3 , 10 },
+ { 348, 4, 3 , 12 },
+ { 359, 4, 6 , 7 },
+ { 373, 4, 6 , 4 },
+ { 387, 4, 6 , 7 },
+ { 401, 4, 5 , 10 },
+ { 414, 4, 8 , 10 },
+ { 430, 4, 7 , 9 },
+ { 445, 4, 7 , 9 },
+ { 460, 4, 6 , 9 },
+ { 474, 4, 6 , 9 },
+ { 488, 4, 7 , 9 },
+ { 4, 27, 6 , 9 },
+ { 18, 27, 6 , 9 },
+ { 32, 27, 7 , 9 },
+ { 47, 27, 3 , 9 },
+ { 58, 27, 6 , 9 },
+ { 72, 27, 7 , 9 },
+ { 87, 27, 7 , 9 },
+ { 102, 27, 11 , 9 },
+ { 121, 27, 8 , 9 },
+ { 137, 27, 6 , 9 },
+ { 151, 27, 6 , 9 },
+ { 165, 27, 7 , 9 },
+ { 180, 27, 7 , 9 },
+ { 195, 27, 6 , 9 },
+ { 209, 27, 7 , 9 },
+ { 224, 27, 8 , 9 },
+ { 240, 27, 9 , 9 },
+ { 257, 27, 11 , 9 },
+ { 276, 27, 7 , 9 },
+ { 291, 27, 7 , 9 },
+ { 306, 27, 7 , 9 },
+ { 321, 27, 3 , 9 },
+ { 332, 27, 4 , 10 },
+ { 344, 27, 3 , 9 },
+ { 355, 27, 3 , 3 },
+ { 366, 27, 7 , 2 },
+ { 381, 27, 2 , 2 },
+ { 391, 27, 6 , 6 },
+ { 405, 27, 6 , 9 },
+ { 419, 27, 6 , 6 },
+ { 433, 27, 6 , 9 },
+ { 447, 27, 6 , 6 },
+ { 461, 27, 5 , 9 },
+ { 474, 27, 5 , 9 },
+ { 487, 27, 7 , 9 },
+ { 4, 50, 3 , 7 },
+ { 15, 50, 3 , 8 },
+ { 26, 50, 6 , 9 },
+ { 40, 50, 4 , 9 },
+ { 52, 50, 11 , 6 },
+ { 71, 50, 7 , 6 },
+ { 86, 50, 5 , 6 },
+ { 99, 50, 6 , 8 },
+ { 113, 50, 6 , 8 },
+ { 127, 50, 5 , 6 },
+ { 140, 50, 5 , 6 },
+ { 153, 50, 5 , 9 },
+ { 166, 50, 7 , 6 },
+ { 181, 50, 7 , 6 },
+ { 196, 50, 11 , 6 },
+ { 215, 50, 7 , 6 },
+ { 230, 50, 7 , 8 },
+ { 245, 50, 6 , 6 },
+ { 259, 50, 5 , 9 },
+ { 272, 50, 1 , 9 },
+ { 281, 50, 5 , 9 },
+ { 294, 50, 7 , 3 },
+ { 309, 50, 3 , 10 },
+ { 320, 50, 7 , 10 },
+ { 335, 50, 7 , 10 },
+ { 350, 50, 6 , 9 },
+ { 364, 50, 7 , 9 },
+ { 379, 50, 6 , 12 },
+ { 393, 50, 7 , 11 },
+ { 408, 50, 5 , 9 },
+ { 421, 50, 5 , 5 },
+ { 434, 50, 4 , 5 },
+ { 446, 50, 6 , 7 },
+ { 460, 50, 6 , 3 },
+ { 474, 50, 5 , 5 },
+ { 487, 50, 6 , 1 },
+ { 4, 73, 3 , 3 },
+ { 15, 73, 7 , 10 },
+ { 30, 73, 3 , 5 },
+ { 41, 73, 3 , 5 },
+ { 52, 73, 7 , 12 },
+ { 67, 73, 6 , 8 },
+ { 81, 73, 7 , 9 },
+ { 96, 73, 2 , 3 },
+ { 106, 73, 6 , 9 },
+ { 120, 73, 3 , 5 },
+ { 131, 73, 3 , 5 },
+ { 142, 73, 6 , 7 },
+ { 156, 73, 13 , 9 },
+ { 177, 73, 10 , 6 },
+ { 195, 73, 7 , 11 },
+ { 210, 73, 5 , 10 },
+ { 223, 73, 7 , 12 },
+ { 238, 73, 7 , 12 },
+ { 253, 73, 7 , 12 },
+ { 268, 73, 7 , 12 },
+ { 283, 73, 7 , 11 },
+ { 298, 73, 7 , 11 },
+ { 313, 73, 12 , 9 },
+ { 333, 73, 6 , 11 },
+ { 347, 73, 7 , 12 },
+ { 362, 73, 7 , 12 },
+ { 377, 73, 7 , 12 },
+ { 392, 73, 7 , 11 },
+ { 407, 73, 3 , 12 },
+ { 418, 73, 3 , 12 },
+ { 429, 73, 3 , 12 },
+ { 440, 73, 3 , 11 },
+ { 451, 73, 7 , 9 },
+ { 466, 73, 8 , 12 },
+ { 482, 73, 6 , 12 },
+ { 496, 73, 6 , 12 },
+ { 4, 96, 6 , 12 },
+ { 18, 96, 6 , 12 },
+ { 32, 96, 6 , 11 },
+ { 46, 96, 5 , 5 },
+ { 59, 96, 8 , 9 },
+ { 75, 96, 8 , 12 },
+ { 91, 96, 8 , 12 },
+ { 107, 96, 8 , 12 },
+ { 123, 96, 8 , 11 },
+ { 139, 96, 7 , 12 },
+ { 154, 96, 7 , 9 },
+ { 169, 96, 8 , 9 },
+ { 185, 96, 6 , 9 },
+ { 199, 96, 6 , 9 },
+ { 213, 96, 6 , 9 },
+ { 227, 96, 6 , 9 },
+ { 241, 96, 6 , 8 },
+ { 255, 96, 6 , 10 },
+ { 269, 96, 10 , 6 },
+ { 287, 96, 6 , 8 },
+ { 301, 96, 6 , 9 },
+ { 315, 96, 6 , 9 },
+ { 329, 96, 6 , 9 },
+ { 343, 96, 6 , 8 },
+ { 357, 96, 3 , 10 },
+ { 368, 96, 3 , 10 },
+ { 379, 96, 3 , 10 },
+ { 390, 96, 3 , 9 },
+ { 401, 96, 6 , 10 },
+ { 415, 96, 7 , 9 },
+ { 430, 96, 5 , 9 },
+ { 443, 96, 5 , 9 },
+ { 456, 96, 5 , 9 },
+ { 469, 96, 5 , 9 },
+ { 482, 96, 5 , 8 },
+ { 495, 96, 7 , 9 },
+ { 4, 119, 8 , 8 },
+ { 20, 119, 7 , 9 },
+ { 35, 119, 7 , 9 },
+ { 50, 119, 7 , 9 },
+ { 65, 119, 7 , 8 },
+ { 80, 119, 7 , 11 },
+ { 95, 119, 5 , 8 },
+ { 108, 119, 7 , 10 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo cherryFontGlyphs[189] = {
+ { 32, 0, 12, 5, { 0 }},
+ { 33, 0, 2, 4, { 0 }},
+ { 34, 0, 2, 6, { 0 }},
+ { 35, 0, 2, 11, { 0 }},
+ { 36, 0, 2, 8, { 0 }},
+ { 37, 0, 2, 8, { 0 }},
+ { 38, 0, 2, 9, { 0 }},
+ { 39, 0, 2, 2, { 0 }},
+ { 40, 0, 2, 4, { 0 }},
+ { 41, 0, 2, 4, { 0 }},
+ { 42, 0, 2, 4, { 0 }},
+ { 43, 0, 4, 8, { 0 }},
+ { 44, 0, 11, 3, { 0 }},
+ { 45, 0, 6, 7, { 0 }},
+ { 46, 0, 11, 2, { 0 }},
+ { 47, 0, 2, 5, { 0 }},
+ { 48, 0, 4, 6, { 0 }},
+ { 49, 0, 4, 6, { 0 }},
+ { 50, 0, 4, 6, { 0 }},
+ { 51, 0, 4, 6, { 0 }},
+ { 52, 0, 4, 6, { 0 }},
+ { 53, 0, 4, 6, { 0 }},
+ { 54, 0, 4, 6, { 0 }},
+ { 55, 0, 4, 6, { 0 }},
+ { 56, 0, 4, 6, { 0 }},
+ { 57, 0, 4, 6, { 0 }},
+ { 58, 0, 2, 4, { 0 }},
+ { 59, 0, 2, 4, { 0 }},
+ { 60, 0, 4, 7, { 0 }},
+ { 61, 0, 5, 7, { 0 }},
+ { 62, 0, 4, 7, { 0 }},
+ { 63, 0, 2, 6, { 0 }},
+ { 64, 0, 2, 9, { 0 }},
+ { 65, 0, 3, 8, { 0 }},
+ { 66, 0, 3, 8, { 0 }},
+ { 67, 0, 3, 7, { 0 }},
+ { 68, 0, 3, 7, { 0 }},
+ { 69, 0, 3, 8, { 0 }},
+ { 70, 0, 3, 7, { 0 }},
+ { 71, 0, 3, 7, { 0 }},
+ { 72, 0, 3, 8, { 0 }},
+ { 73, 0, 3, 4, { 0 }},
+ { 74, 0, 3, 7, { 0 }},
+ { 75, 0, 3, 8, { 0 }},
+ { 76, 0, 3, 8, { 0 }},
+ { 77, 0, 3, 12, { 0 }},
+ { 78, 0, 3, 9, { 0 }},
+ { 79, 0, 3, 7, { 0 }},
+ { 80, 0, 3, 7, { 0 }},
+ { 81, 0, 3, 8, { 0 }},
+ { 82, 0, 3, 8, { 0 }},
+ { 83, 0, 3, 7, { 0 }},
+ { 84, 0, 3, 8, { 0 }},
+ { 85, 0, 3, 9, { 0 }},
+ { 86, 0, 3, 10, { 0 }},
+ { 87, 0, 3, 12, { 0 }},
+ { 88, 0, 3, 8, { 0 }},
+ { 89, 0, 3, 8, { 0 }},
+ { 90, 0, 3, 8, { 0 }},
+ { 91, 0, 3, 4, { 0 }},
+ { 92, 0, 2, 5, { 0 }},
+ { 93, 0, 3, 4, { 0 }},
+ { 94, 0, 3, 4, { 0 }},
+ { 95, 0, 10, 8, { 0 }},
+ { 96, 0, 2, 3, { 0 }},
+ { 97, 0, 6, 7, { 0 }},
+ { 98, 0, 3, 7, { 0 }},
+ { 99, 0, 6, 7, { 0 }},
+ { 100, 0, 3, 7, { 0 }},
+ { 101, 0, 6, 7, { 0 }},
+ { 102, 0, 3, 6, { 0 }},
+ { 103, 0, 5, 6, { 0 }},
+ { 104, 0, 3, 8, { 0 }},
+ { 105, 0, 5, 4, { 0 }},
+ { 106, 0, 5, 4, { 0 }},
+ { 107, 0, 3, 7, { 0 }},
+ { 108, 0, 3, 5, { 0 }},
+ { 109, 0, 6, 12, { 0 }},
+ { 110, 0, 6, 8, { 0 }},
+ { 111, 0, 6, 6, { 0 }},
+ { 112, 0, 6, 7, { 0 }},
+ { 113, 0, 6, 7, { 0 }},
+ { 114, 0, 6, 6, { 0 }},
+ { 115, 0, 6, 6, { 0 }},
+ { 116, 0, 3, 6, { 0 }},
+ { 117, 0, 6, 8, { 0 }},
+ { 118, 0, 6, 8, { 0 }},
+ { 119, 0, 6, 12, { 0 }},
+ { 120, 0, 6, 8, { 0 }},
+ { 121, 0, 6, 8, { 0 }},
+ { 122, 0, 6, 7, { 0 }},
+ { 123, 0, 3, 6, { 0 }},
+ { 124, 0, 3, 2, { 0 }},
+ { 125, 0, 3, 6, { 0 }},
+ { 126, 0, 6, 8, { 0 }},
+ { 161, 0, 4, 4, { 0 }},
+ { 162, 0, 4, 8, { 0 }},
+ { 163, 0, 2, 8, { 0 }},
+ { 8364, 0, 3, 7, { 0 }},
+ { 165, 0, 3, 8, { 0 }},
+ { 352, 0, 0, 7, { 0 }},
+ { 167, 0, 2, 8, { 0 }},
+ { 353, 0, 3, 6, { 0 }},
+ { 169, 0, 1, 6, { 0 }},
+ { 170, 0, 2, 5, { 0 }},
+ { 171, 0, 5, 7, { 0 }},
+ { 172, 0, 6, 7, { 0 }},
+ { 174, 0, 1, 6, { 0 }},
+ { 175, 0, 2, 7, { 0 }},
+ { 176, 0, 2, 4, { 0 }},
+ { 177, 0, 3, 8, { 0 }},
+ { 178, 0, 2, 4, { 0 }},
+ { 179, 0, 2, 4, { 0 }},
+ { 381, 0, 0, 8, { 0 }},
+ { 181, 0, 6, 7, { 0 }},
+ { 182, 0, 3, 8, { 0 }},
+ { 183, 0, 6, 3, { 0 }},
+ { 382, 0, 3, 7, { 0 }},
+ { 185, 0, 2, 4, { 0 }},
+ { 186, 0, 2, 4, { 0 }},
+ { 187, 0, 5, 7, { 0 }},
+ { 338, 0, 3, 14, { 0 }},
+ { 339, 0, 6, 11, { 0 }},
+ { 376, 0, 1, 8, { 0 }},
+ { 191, 0, 4, 6, { 0 }},
+ { 192, 0, 0, 8, { 0 }},
+ { 193, 0, 0, 8, { 0 }},
+ { 194, 0, 0, 8, { 0 }},
+ { 195, 0, 0, 8, { 0 }},
+ { 196, 0, 1, 8, { 0 }},
+ { 197, 0, 1, 8, { 0 }},
+ { 198, 0, 3, 13, { 0 }},
+ { 199, 0, 3, 7, { 0 }},
+ { 200, 0, 0, 8, { 0 }},
+ { 201, 0, 0, 8, { 0 }},
+ { 202, 0, 0, 8, { 0 }},
+ { 203, 0, 1, 8, { 0 }},
+ { 204, 0, 0, 4, { 0 }},
+ { 205, 0, 0, 4, { 0 }},
+ { 206, 0, 0, 4, { 0 }},
+ { 207, 0, 1, 4, { 0 }},
+ { 208, 0, 3, 8, { 0 }},
+ { 209, 0, 0, 9, { 0 }},
+ { 210, 0, 0, 7, { 0 }},
+ { 211, 0, 0, 7, { 0 }},
+ { 212, 0, 0, 7, { 0 }},
+ { 213, 0, 0, 7, { 0 }},
+ { 214, 0, 1, 7, { 0 }},
+ { 215, 1, 5, 7, { 0 }},
+ { 216, 0, 3, 9, { 0 }},
+ { 217, 0, 0, 9, { 0 }},
+ { 218, 0, 0, 9, { 0 }},
+ { 219, 0, 0, 9, { 0 }},
+ { 220, 0, 1, 9, { 0 }},
+ { 221, 0, 0, 8, { 0 }},
+ { 222, 0, 2, 8, { 0 }},
+ { 223, 0, 3, 9, { 0 }},
+ { 224, 0, 3, 7, { 0 }},
+ { 225, 0, 3, 7, { 0 }},
+ { 226, 0, 3, 7, { 0 }},
+ { 227, 0, 3, 7, { 0 }},
+ { 228, 0, 4, 7, { 0 }},
+ { 229, 0, 2, 7, { 0 }},
+ { 230, 0, 6, 11, { 0 }},
+ { 231, 0, 6, 7, { 0 }},
+ { 232, 0, 3, 7, { 0 }},
+ { 233, 0, 3, 7, { 0 }},
+ { 234, 0, 3, 7, { 0 }},
+ { 235, 0, 4, 7, { 0 }},
+ { 236, 0, 2, 4, { 0 }},
+ { 237, 0, 2, 4, { 0 }},
+ { 238, 0, 2, 4, { 0 }},
+ { 239, 0, 3, 4, { 0 }},
+ { 240, 0, 2, 7, { 0 }},
+ { 241, 0, 3, 8, { 0 }},
+ { 242, 0, 3, 6, { 0 }},
+ { 243, 0, 3, 6, { 0 }},
+ { 244, 0, 3, 6, { 0 }},
+ { 245, 0, 3, 6, { 0 }},
+ { 246, 0, 4, 6, { 0 }},
+ { 247, 0, 3, 8, { 0 }},
+ { 248, 0, 4, 9, { 0 }},
+ { 249, 0, 3, 8, { 0 }},
+ { 250, 0, 3, 8, { 0 }},
+ { 251, 0, 3, 8, { 0 }},
+ { 252, 0, 4, 8, { 0 }},
+ { 253, 0, 3, 8, { 0 }},
+ { 254, 0, 4, 6, { 0 }},
+ { 255, 0, 4, 8, { 0 }},
+};
+
+// Style loading function: Cherry
+static void GuiLoadStyleCherry(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < CHERRY_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(cherryStyleProps[i].controlId, cherryStyleProps[i].propertyId, cherryStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int cherryFontDataSize = 0;
+ unsigned char *data = DecompressData(cherryFontData, CHERRY_STYLE_FONT_ATLAS_COMP_SIZE, &cherryFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 15;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, cherryFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, cherryFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/cherry/style_cherry.old.rgs b/external/raygui-4.0/styles/cherry/style_cherry.old.rgs
new file mode 100644
index 0000000..bc9ce94
Binary files /dev/null and b/external/raygui-4.0/styles/cherry/style_cherry.old.rgs differ
diff --git a/external/raygui-4.0/styles/cherry/style_cherry.png b/external/raygui-4.0/styles/cherry/style_cherry.png
new file mode 100644
index 0000000..ffac60f
Binary files /dev/null and b/external/raygui-4.0/styles/cherry/style_cherry.png differ
diff --git a/external/raygui-4.0/styles/cherry/style_cherry.rgs b/external/raygui-4.0/styles/cherry/style_cherry.rgs
new file mode 100644
index 0000000..5a52e01
Binary files /dev/null and b/external/raygui-4.0/styles/cherry/style_cherry.rgs differ
diff --git a/external/raygui-4.0/styles/cherry/style_cherry.txt.rgs b/external/raygui-4.0/styles/cherry/style_cherry.txt.rgs
new file mode 100644
index 0000000..447c6d2
--- /dev/null
+++ b/external/raygui-4.0/styles/cherry/style_cherry.txt.rgs
@@ -0,0 +1,27 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 15 charset.txt Westington.ttf
+p 00 00 0xda5757ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x753233ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0xe17373ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xfaaa97ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0xe06262ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xfdb4aaff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0xe03c46ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0x5b1e20ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0xc2474fff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0xa19292ff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x706060ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x9e8585ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x0000000f TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0xfb8170ff LINE_COLOR
+p 00 19 0x3a1720ff BACKGROUND_COLOR
+p 00 20 0x00000016 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/cyber/Kyrou 7 Wide.ttf b/external/raygui-4.0/styles/cyber/Kyrou 7 Wide.ttf
new file mode 100644
index 0000000..165c3e7
Binary files /dev/null and b/external/raygui-4.0/styles/cyber/Kyrou 7 Wide.ttf differ
diff --git a/external/raygui-4.0/styles/cyber/README.md b/external/raygui-4.0/styles/cyber/README.md
new file mode 100644
index 0000000..12a5f4c
--- /dev/null
+++ b/external/raygui-4.0/styles/cyber/README.md
@@ -0,0 +1,27 @@
+## style: cyber
+
+Future is now! Neons and shadows, city never sleeps! Robots waiting in the corners and expensive vending machines! You got the style!
+
+![cyber style table](style_cyber.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_cyber.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_cyber.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_cyber.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_cyber.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_cyber.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![cyber style screen](screenshot.png)
+
+## about font
+
+"Grixel Kyrou 7 Wide" font by [Nikos Giannakopoulos](http://www.grixel.gr/).
+
+100% free font, downloaded from dafont.com: [grixel-kyrou-7-wide](https://www.dafont.com/grixel-kyrou-7-wide.font)
diff --git a/external/raygui-4.0/styles/cyber/charset.txt b/external/raygui-4.0/styles/cyber/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/cyber/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/cyber/font_readme.txt b/external/raygui-4.0/styles/cyber/font_readme.txt
new file mode 100644
index 0000000..45def0a
--- /dev/null
+++ b/external/raygui-4.0/styles/cyber/font_readme.txt
@@ -0,0 +1,36 @@
+Thank you for downloading the free Grixel fonts. You can use them in your personal and commercial projects too. They include Western European, Central European, Turkish and Greek characters. They are Unicode TrueType fonts and are optimized to work in both Windows XP and Mac OS X platforms using Adobe Photoshop CS2 and Macromedia Flash 8.
+
+
+Grixel fonts are under Creative Commons Attribution-NoDerivs 2.5 License which can be found here:
+
+http://creativecommons.org/licenses/by-nd/2.5/
+
+===============================================================
+Attribution-NoDerivs 2.5
+
+You are free:
+
+ * to copy, distribute, display, and perform the work
+ * to make commercial use of the work
+
+Under the following conditions:
+
+by
+Attribution. You must attribute the work in the manner specified by the author or licensor.
+
+nd
+No Derivative Works. You may not alter, transform, or build upon this work.
+
+ * For any reuse or distribution, you must make clear to others the license terms of this work.
+ * Any of these conditions can be waived if you get permission from the copyright holder.
+
+Your fair use and other rights are in no way affected by the above.
+===============================================================
+
+
+In no event shall Nikos Giannakopoulos be held liable to you for any consequential or incidental damages, including any lost revenue, profits, goodwill or savings, or for any claim by any third party caused by using these fonts.
+
+Please read the UsageGuides.pdf before you use them.
+
+
+Grixel - Greek pixel fonts | Nikos Giannakopoulos | www.grixel.gr
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/cyber/screenshot.png b/external/raygui-4.0/styles/cyber/screenshot.png
new file mode 100644
index 0000000..2ea08b5
Binary files /dev/null and b/external/raygui-4.0/styles/cyber/screenshot.png differ
diff --git a/external/raygui-4.0/styles/cyber/style_cyber.h b/external/raygui-4.0/styles/cyber/style_cyber.h
new file mode 100644
index 0000000..515f878
--- /dev/null
+++ b/external/raygui-4.0/styles/cyber/style_cyber.h
@@ -0,0 +1,591 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleCyber(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define CYBER_STYLE_PROPS_COUNT 17
+
+// Custom style name: Cyber
+static const GuiStyleProp cyberStyleProps[CYBER_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x2f7486ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x024658ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x51bfd3ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x82cde0ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x3299b4ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xb6e1eaff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xeb7630ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xffbc51ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0xd86f36ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x134b5aff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x02313dff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x17505fff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x0000000e }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x81c0d0ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x00222bff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000015 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Kyrou 7 Wide.ttf" (size: 14, spacing: 0)
+
+#define CYBER_STYLE_FONT_ATLAS_COMP_SIZE 2286
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char cyberFontData[CYBER_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0x81, 0x6e, 0xdb, 0x36, 0x10, 0x06, 0x60, 0x21, 0xef, 0xff, 0xc6, 0x99, 0xf6, 0x0f, 0xe8, 0xd0, 0x2d, 0x45, 0x6b,
+ 0x89, 0x3c, 0x92, 0xb2, 0xec, 0x7c, 0xfd, 0x80, 0x61, 0x88, 0x62, 0x5b, 0xa2, 0x78, 0xe4, 0x49, 0x0a, 0xcf, 0xd9, 0x00,
+ 0x00, 0x00, 0x00, 0x26, 0xcb, 0xc5, 0x9f, 0x96, 0xe6, 0x9f, 0xce, 0x3b, 0xa2, 0x9f, 0xff, 0x9e, 0x7b, 0xec, 0xfa, 0x57,
+ 0x7f, 0xbb, 0xe7, 0xe1, 0xb9, 0xd3, 0x9e, 0x5f, 0x7f, 0x92, 0xc3, 0xdf, 0x4d, 0xa9, 0x75, 0x73, 0x7a, 0xc6, 0x8e, 0xcf,
+ 0x4c, 0x5f, 0xbc, 0x3d, 0xde, 0x87, 0x74, 0xbf, 0x62, 0xe5, 0xc8, 0xf8, 0xf3, 0xdf, 0xde, 0xd5, 0xdf, 0x8f, 0x7b, 0x71,
+ 0x5b, 0x2f, 0xcf, 0xc9, 0x1e, 0xa5, 0xe1, 0x37, 0xce, 0x5e, 0xbf, 0x0d, 0xec, 0xfd, 0x7e, 0xe9, 0x5c, 0x94, 0xd3, 0x31,
+ 0x63, 0x5b, 0x70, 0x34, 0x19, 0x3c, 0x97, 0x19, 0x1e, 0xd1, 0xda, 0xe3, 0xff, 0xac, 0x5f, 0xe4, 0xb7, 0xff, 0x6e, 0xa5,
+ 0x48, 0xcb, 0xc2, 0xf8, 0xdf, 0xba, 0xc6, 0x97, 0xf5, 0x79, 0x51, 0x1a, 0x22, 0xbd, 0xff, 0x35, 0xad, 0x47, 0x5b, 0x1b,
+ 0xf1, 0xd2, 0xfc, 0xbb, 0x29, 0x1d, 0xf1, 0xac, 0x33, 0xd2, 0x3b, 0x72, 0x9e, 0xb5, 0xc6, 0x8a, 0xa3, 0xf9, 0xfa, 0xb3,
+ 0xcf, 0xc1, 0xd7, 0xef, 0xcb, 0xc7, 0xc8, 0xbd, 0xa1, 0xa5, 0xf6, 0xf2, 0x27, 0xa6, 0x90, 0xcd, 0xcd, 0x3a, 0xfb, 0xab,
+ 0xf3, 0xc2, 0x94, 0x63, 0x29, 0x43, 0x67, 0xef, 0xf8, 0x73, 0xab, 0xf3, 0xf7, 0xda, 0x11, 0xaf, 0x3f, 0xd7, 0xcf, 0xa4,
+ 0xd1, 0xbc, 0x36, 0x9a, 0xfd, 0x6c, 0xa9, 0x2c, 0x88, 0xdf, 0x79, 0x63, 0xf1, 0xcc, 0x1c, 0x69, 0x24, 0xef, 0x3c, 0xda,
+ 0xf6, 0xf9, 0x43, 0xfb, 0x5e, 0xbd, 0xca, 0xfc, 0x9f, 0x81, 0xf3, 0x97, 0x52, 0x3b, 0x9f, 0xe5, 0x94, 0xad, 0x47, 0x7c,
+ 0xfc, 0xe9, 0x7b, 0xe1, 0x98, 0x3f, 0xb2, 0xff, 0x67, 0x9b, 0x92, 0xd3, 0x66, 0xe2, 0xb9, 0x4c, 0xf7, 0xb5, 0xd2, 0xbf,
+ 0x71, 0x5b, 0xcf, 0x99, 0x93, 0xbf, 0x7f, 0xd8, 0x17, 0xe7, 0x62, 0x57, 0xc4, 0xff, 0xff, 0xa3, 0x58, 0x06, 0x22, 0x36,
+ 0x83, 0x33, 0xcc, 0xdc, 0xeb, 0xff, 0x71, 0xfb, 0xd0, 0xf9, 0xcb, 0xf4, 0xab, 0xda, 0xff, 0xa3, 0x37, 0xa5, 0xfc, 0x21,
+ 0xd3, 0x46, 0xd9, 0x7d, 0xe1, 0xbd, 0xe4, 0x2c, 0xca, 0xd2, 0x1e, 0xcd, 0xff, 0xd7, 0x65, 0x3b, 0x6b, 0xae, 0x96, 0x7a,
+ 0xee, 0x9d, 0x56, 0xaf, 0xff, 0xd3, 0x38, 0xba, 0xac, 0x8b, 0xff, 0xeb, 0xfd, 0x35, 0x78, 0xfe, 0x72, 0xf1, 0xf5, 0xf9,
+ 0x9c, 0x2b, 0xf4, 0x7a, 0xc6, 0xb3, 0xf6, 0xfa, 0xff, 0xaa, 0x11, 0x63, 0x45, 0xfe, 0x9f, 0x17, 0xcf, 0xff, 0x7b, 0xee,
+ 0xff, 0xe7, 0x4d, 0xe2, 0x3f, 0xc3, 0x4f, 0xa4, 0x32, 0xfd, 0xfe, 0x7c, 0x5b, 0xb6, 0x3b, 0xf6, 0x7c, 0x21, 0x43, 0x47,
+ 0x3c, 0xeb, 0x5e, 0x4c, 0x26, 0xfd, 0x6e, 0x1a, 0x67, 0xc5, 0xda, 0xfd, 0xdd, 0xe7, 0xde, 0xff, 0xf7, 0xfc, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x9e, 0xd5, 0x9d, 0xb9, 0xe0, 0x75, 0x95,
+ 0x55, 0xb4, 0x23, 0xab, 0x6e, 0x47, 0xd6, 0xec, 0x56, 0x5f, 0x79, 0x5e, 0x87, 0xa8, 0xbe, 0xce, 0xb8, 0x7d, 0x95, 0x73,
+ 0xdf, 0xba, 0xe1, 0xb1, 0xea, 0x28, 0x39, 0x5d, 0x47, 0xdf, 0x56, 0x8f, 0xe0, 0xbc, 0x76, 0xeb, 0x59, 0x25, 0xab, 0xf5,
+ 0xb5, 0x5f, 0x57, 0xd6, 0xa6, 0x4c, 0xb9, 0x05, 0x7b, 0x56, 0xbf, 0xa7, 0xab, 0x3e, 0x41, 0x75, 0x1d, 0xfa, 0x75, 0x55,
+ 0x01, 0xc7, 0x57, 0xc8, 0x1f, 0xbf, 0xf3, 0xbe, 0xfc, 0x28, 0xda, 0xf7, 0x38, 0x13, 0xce, 0xd9, 0x8a, 0xf8, 0xcf, 0x61,
+ 0x45, 0x80, 0x5c, 0x58, 0xdb, 0x75, 0x5d, 0x25, 0xdc, 0x75, 0x95, 0x76, 0xce, 0xe3, 0xbf, 0xbd, 0x66, 0x73, 0x26, 0x47,
+ 0x6b, 0xca, 0xd1, 0x33, 0x6b, 0x04, 0xa8, 0x8c, 0x5b, 0x33, 0xe2, 0xbf, 0x9a, 0x3b, 0xbc, 0x76, 0xfc, 0x57, 0xeb, 0x89,
+ 0xe5, 0xe0, 0xbc, 0xa7, 0xb1, 0x6f, 0xdf, 0x61, 0xfb, 0x76, 0xd3, 0xf8, 0x3f, 0x8f, 0xa9, 0x0c, 0x57, 0x29, 0x9e, 0xd7,
+ 0x9f, 0xe6, 0xd9, 0x9b, 0xa2, 0xb4, 0x56, 0xd3, 0x73, 0x2f, 0x8f, 0x2c, 0xab, 0xf2, 0xff, 0x9c, 0x5c, 0x79, 0xa4, 0x29,
+ 0x97, 0x9d, 0x3b, 0xc6, 0xb6, 0x8e, 0x5a, 0x8f, 0x2b, 0x8a, 0x9d, 0xd5, 0x2b, 0x7c, 0xfe, 0xfc, 0x3e, 0x56, 0x4f, 0xf9,
+ 0x9a, 0xf8, 0x1f, 0x8f, 0xc4, 0x3c, 0x65, 0xce, 0x9a, 0x73, 0x6f, 0x22, 0xc5, 0x79, 0x6b, 0xcd, 0x6b, 0xaf, 0x98, 0xff,
+ 0xf3, 0x52, 0xf3, 0x7f, 0xcb, 0xf5, 0x7f, 0x26, 0x5c, 0xbd, 0xd6, 0x5a, 0x6d, 0x6f, 0x3e, 0x97, 0x2b, 0xf2, 0xff, 0x96,
+ 0x99, 0x7d, 0x7c, 0xfe, 0x1f, 0xd9, 0x9a, 0xe6, 0x59, 0xf8, 0xfa, 0xf8, 0x6f, 0x3b, 0xa6, 0x5c, 0xfa, 0xda, 0xd7, 0x8b,
+ 0xff, 0xdc, 0xe2, 0xfe, 0x5f, 0x16, 0xd6, 0x66, 0xce, 0x94, 0xd1, 0x6d, 0x4d, 0xfc, 0xb7, 0xd5, 0x43, 0x1f, 0xb9, 0xfe,
+ 0x1f, 0x8b, 0xf0, 0xf3, 0x08, 0xf8, 0x4b, 0xfc, 0x4f, 0xca, 0xff, 0x67, 0xbd, 0xba, 0xff, 0x5e, 0xc9, 0xc8, 0x0c, 0xda,
+ 0x7e, 0x4c, 0x99, 0x9e, 0x7f, 0x8f, 0xd6, 0xf6, 0x5d, 0x9d, 0xff, 0xcf, 0x7a, 0xfd, 0x56, 0x3e, 0xef, 0xe7, 0x5b, 0xc6,
+ 0x7a, 0xe5, 0xf6, 0x84, 0x6f, 0x73, 0x58, 0xfd, 0x7c, 0xcf, 0x77, 0x94, 0xbe, 0xdf, 0x53, 0x6c, 0x6d, 0x70, 0xef, 0xe7,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x5e, 0x65, 0x75, 0xbf, 0x15,
+ 0x53, 0x69, 0x58, 0x1f, 0xda, 0x52, 0x3f, 0xf3, 0xb8, 0xfa, 0xe6, 0xa3, 0x1a, 0x12, 0x7b, 0x53, 0xed, 0xcd, 0x59, 0xad,
+ 0xd9, 0x5a, 0x07, 0x61, 0xb4, 0x4e, 0x67, 0xe5, 0xdd, 0x5b, 0x5a, 0xf9, 0x7c, 0xcd, 0x63, 0x4e, 0xd6, 0x01, 0x6f, 0x13,
+ 0x7b, 0xe0, 0xf9, 0x9a, 0xe7, 0x0c, 0xd4, 0x5c, 0x18, 0xa9, 0x22, 0x98, 0x85, 0x2b, 0x4c, 0x53, 0x6a, 0x95, 0xf6, 0x0a,
+ 0x1c, 0xad, 0x5b, 0x33, 0xa9, 0xca, 0xc3, 0xea, 0x7e, 0x3d, 0x63, 0x6b, 0x7f, 0x1d, 0x85, 0x67, 0xc4, 0xff, 0x71, 0x0f,
+ 0xc9, 0xe4, 0xb3, 0xdd, 0xf7, 0xd3, 0xb3, 0xd8, 0x7f, 0x5c, 0x5b, 0xf9, 0xa3, 0xb1, 0xdf, 0xf4, 0x6c, 0xcf, 0xf0, 0x59,
+ 0xce, 0x60, 0x25, 0x84, 0xbd, 0x73, 0xbe, 0x69, 0x8f, 0xfe, 0xb1, 0x9e, 0xb7, 0x6e, 0x05, 0xfc, 0x3b, 0xc5, 0xff, 0x56,
+ 0xac, 0x58, 0xb8, 0x3a, 0xfe, 0xb7, 0xa6, 0x7d, 0xca, 0xb4, 0x23, 0x9a, 0x57, 0x7d, 0xfb, 0xa3, 0x3b, 0xc7, 0x9a, 0x53,
+ 0xcb, 0x2a, 0x17, 0xd6, 0x7a, 0x48, 0x47, 0xef, 0xaa, 0x8e, 0x00, 0x29, 0xce, 0xff, 0xfd, 0x2d, 0x3d, 0x2b, 0xc7, 0x78,
+ 0xcd, 0xf8, 0xaf, 0xb5, 0x66, 0x06, 0xce, 0xf0, 0xda, 0xf9, 0x7f, 0x66, 0xe5, 0xee, 0x4a, 0x74, 0xec, 0x0f, 0xde, 0x65,
+ 0x2f, 0xcf, 0xce, 0xf5, 0xab, 0x83, 0xad, 0xe9, 0x3b, 0x19, 0xf6, 0xee, 0xd7, 0xe5, 0x97, 0xf8, 0xcc, 0x92, 0x6b, 0xf4,
+ 0x1c, 0xb4, 0x70, 0xb5, 0x1a, 0x69, 0x6f, 0xfc, 0xe7, 0xd2, 0xf9, 0x7f, 0x6b, 0xfc, 0xf6, 0x8c, 0xad, 0x74, 0xbe, 0xb6,
+ 0xe2, 0xbb, 0xd6, 0x5f, 0x99, 0xd3, 0x1e, 0xbb, 0xa6, 0x1e, 0xed, 0xcc, 0x6f, 0xe8, 0xc8, 0x84, 0x7e, 0x9b, 0x93, 0x4f,
+ 0x48, 0x31, 0x07, 0xef, 0xcd, 0xfc, 0x7b, 0xc6, 0xd9, 0x74, 0xdc, 0x19, 0xc8, 0xc1, 0x18, 0x98, 0x45, 0x39, 0xf8, 0xcc,
+ 0x79, 0x30, 0x53, 0xf3, 0xb5, 0x75, 0x77, 0x17, 0x57, 0x66, 0x74, 0xd7, 0xbc, 0xdb, 0xb3, 0xda, 0xe4, 0xca, 0xf9, 0x3f,
+ 0xdd, 0xd9, 0xee, 0xc8, 0xfc, 0x9f, 0xe1, 0x3a, 0x99, 0x67, 0xb9, 0xdf, 0x76, 0xbb, 0xf9, 0xbf, 0x2d, 0x36, 0x73, 0x79,
+ 0xfe, 0x2f, 0xfe, 0xaf, 0x7e, 0xd2, 0xb2, 0xbd, 0x44, 0xfc, 0xaf, 0xbd, 0xfe, 0x9f, 0x33, 0x82, 0x54, 0x67, 0xd9, 0x6d,
+ 0xf1, 0x33, 0x82, 0xfa, 0xab, 0xd6, 0xc5, 0xff, 0xf6, 0xad, 0xaa, 0x35, 0xbe, 0x5b, 0x6d, 0xca, 0x67, 0xc4, 0x7f, 0x4b,
+ 0xfe, 0x9f, 0xe2, 0xfd, 0xff, 0xf6, 0x6f, 0xd8, 0x4a, 0x57, 0xce, 0xd2, 0x9e, 0x77, 0xbc, 0x67, 0x8f, 0xe0, 0x9d, 0x47,
+ 0xb4, 0xb1, 0xe7, 0xff, 0x77, 0x1b, 0x83, 0xc7, 0xbe, 0x53, 0xe5, 0x3b, 0xf7, 0x7f, 0x75, 0x97, 0xf1, 0xd7, 0x72, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x5e, 0xb7, 0x90, 0x4b, 0xd7, 0xcb, 0x57, 0xeb,
+ 0xd6, 0xf5, 0xaf, 0x58, 0xcd, 0xa4, 0x96, 0xc9, 0xa4, 0xb3, 0xb5, 0x37, 0xac, 0xce, 0xcf, 0x60, 0xbb, 0x67, 0xf8, 0x77,
+ 0xd2, 0xb0, 0x22, 0x2c, 0xa5, 0x33, 0x7c, 0xbf, 0x75, 0xab, 0x23, 0xab, 0x06, 0x33, 0xb5, 0x75, 0x67, 0x9e, 0xef, 0x9c,
+ 0x56, 0xc3, 0xfe, 0x6a, 0x2f, 0x56, 0x5f, 0x49, 0x69, 0xc5, 0x64, 0xca, 0xb5, 0x09, 0x7a, 0xc7, 0xbb, 0x74, 0xb6, 0x59,
+ 0xef, 0xb9, 0xfe, 0xda, 0xc6, 0xad, 0x55, 0x66, 0xbe, 0x6e, 0xdf, 0xcb, 0x3d, 0xfb, 0x73, 0xa8, 0xdf, 0xa7, 0x3c, 0x42,
+ 0x6f, 0x53, 0xea, 0x7a, 0xb7, 0x54, 0xe3, 0xd8, 0x1b, 0xd6, 0xd0, 0x67, 0xb8, 0x36, 0x58, 0xca, 0xed, 0x30, 0xb3, 0xe7,
+ 0x8d, 0x7d, 0xda, 0xd9, 0x5a, 0xed, 0x0c, 0xcc, 0xa0, 0x29, 0xd6, 0xbf, 0xcb, 0x60, 0x65, 0x88, 0x1c, 0xac, 0xf1, 0xce,
+ 0xb2, 0xf5, 0xed, 0xe9, 0x8c, 0xfe, 0xf6, 0xe3, 0x4d, 0x73, 0x9b, 0xb6, 0xd5, 0xab, 0xfe, 0xb8, 0x7d, 0x56, 0xba, 0x97,
+ 0x66, 0x9b, 0x5a, 0x9b, 0x5e, 0x9d, 0x6f, 0xdc, 0xbd, 0xb6, 0xc7, 0x79, 0xf5, 0xb1, 0xf5, 0xd7, 0x06, 0x95, 0x5a, 0x2c,
+ 0xf3, 0xe2, 0x3f, 0xdd, 0x15, 0xa5, 0xf6, 0xa1, 0xab, 0x8e, 0xbe, 0xf8, 0x6f, 0x7b, 0xdf, 0x94, 0xe6, 0xff, 0xb3, 0xf8,
+ 0x5b, 0xbb, 0x7d, 0xb4, 0xda, 0x7e, 0x35, 0xfe, 0xfb, 0xfb, 0x40, 0x16, 0xd4, 0x48, 0x3d, 0xcb, 0x4a, 0x2a, 0x5b, 0xc6,
+ 0xaf, 0xb1, 0xd7, 0xc5, 0xff, 0x51, 0xeb, 0x8d, 0xe6, 0x1b, 0xb3, 0xe6, 0xff, 0x0c, 0xe7, 0xff, 0xad, 0x7d, 0x35, 0xcd,
+ 0xdf, 0x2f, 0xd4, 0x92, 0x53, 0x1d, 0x55, 0x77, 0xde, 0x4f, 0xbf, 0x29, 0x63, 0x2b, 0x7e, 0x1b, 0xc6, 0xea, 0xed, 0x3d,
+ 0xe3, 0xf6, 0x9c, 0xca, 0x9d, 0xd7, 0x6f, 0x9d, 0x31, 0xf6, 0xdd, 0x23, 0xfe, 0xb3, 0x28, 0xd3, 0xc9, 0x50, 0xbb, 0xa6,
+ 0x6b, 0xdf, 0xaf, 0xb9, 0xbb, 0x94, 0xcb, 0xaa, 0x8a, 0xce, 0xf9, 0x2e, 0x8c, 0x75, 0xdb, 0x5b, 0xc7, 0xc1, 0xfd, 0x82,
+ 0xf9, 0x7f, 0xe5, 0x1d, 0xd0, 0x7a, 0x55, 0xf8, 0x6b, 0xe2, 0xff, 0x59, 0xd7, 0x46, 0xeb, 0xfa, 0x76, 0x4f, 0xfc, 0xe7,
+ 0xe2, 0xe3, 0xb8, 0x3e, 0xfe, 0x3f, 0xfe, 0x18, 0x41, 0xe9, 0xc8, 0x6b, 0xd7, 0x6c, 0x9f, 0x39, 0xbe, 0x8c, 0x8e, 0x75,
+ 0xcf, 0xc9, 0xff, 0x9f, 0x1f, 0xff, 0x77, 0xbe, 0x43, 0x91, 0x37, 0xba, 0x43, 0x93, 0x5f, 0xee, 0xb2, 0x5c, 0xf7, 0x3c,
+ 0xb6, 0x7e, 0xfd, 0xfd, 0x5a, 0xdb, 0xc7, 0xee, 0xff, 0x7f, 0xdf, 0xfc, 0xff, 0xce, 0x7f, 0xb3, 0xe0, 0xef, 0x36, 0x56,
+ 0xb6, 0xd3, 0xfd, 0xe3, 0x7b, 0xfe, 0xc8, 0xfc, 0xe8, 0x6e, 0xc8, 0xf7, 0xcd, 0xff, 0xef, 0xff, 0x17, 0x4b, 0xaa, 0xad,
+ 0x5e, 0x71, 0x4d, 0x72, 0xc7, 0xfb, 0x7b, 0xb3, 0xfb, 0xfb, 0xd1, 0xbd, 0xd0, 0x55, 0xf9, 0xff, 0x76, 0xf3, 0xfb, 0xff,
+ 0xf0, 0x9a, 0xe3, 0x13, 0x20, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xf7, 0xaf, 0x29,
+ 0x53, 0x5e, 0x37, 0x91, 0x1f, 0x6b, 0xc8, 0x3f, 0x06, 0x56, 0x23, 0xad, 0xab, 0x22, 0x7b, 0x5c, 0x03, 0xeb, 0x73, 0xe0,
+ 0xef, 0x47, 0xd7, 0x1e, 0x57, 0x26, 0xad, 0x1f, 0x7d, 0xc6, 0x91, 0xa5, 0x78, 0xae, 0xc6, 0xd7, 0x32, 0xe7, 0xb7, 0xff,
+ 0x9f, 0xbb, 0xd6, 0xf7, 0x71, 0xbd, 0x84, 0xb1, 0x33, 0xd2, 0xb3, 0xf2, 0xf0, 0x5e, 0x15, 0x0a, 0xf7, 0x1f, 0xed, 0x91,
+ 0xc3, 0x3a, 0x92, 0x77, 0xae, 0x22, 0xbb, 0x97, 0xaa, 0xcb, 0xac, 0x3f, 0xae, 0xb1, 0x78, 0xc8, 0x49, 0x5d, 0xcf, 0xe7,
+ 0x54, 0xbb, 0x3d, 0x3b, 0x57, 0xc7, 0xb5, 0xb0, 0xf7, 0xc6, 0xf5, 0xf2, 0xc7, 0x55, 0x91, 0x33, 0x38, 0xfa, 0x9d, 0x47,
+ 0x7f, 0x4a, 0x47, 0xf7, 0xa7, 0x33, 0x96, 0xe6, 0x4f, 0xc8, 0xa4, 0xea, 0x5c, 0xc7, 0xad, 0xb1, 0xbf, 0xf0, 0x4a, 0xe1,
+ 0xbd, 0x2b, 0xfe, 0xf3, 0x25, 0x43, 0xc8, 0x0b, 0xae, 0x6e, 0x69, 0x1d, 0x8f, 0x5f, 0x6b, 0xe5, 0x4c, 0x9a, 0x57, 0x84,
+ 0x8f, 0x54, 0xdc, 0xb1, 0x9e, 0xaa, 0xbd, 0x27, 0x9e, 0xf7, 0xd3, 0x7b, 0x57, 0x91, 0xfd, 0x3c, 0x39, 0xae, 0xbc, 0x6c,
+ 0xf5, 0x9b, 0xb6, 0x56, 0x49, 0x21, 0x3b, 0x78, 0xd6, 0xd6, 0xe3, 0x2c, 0xee, 0x4f, 0xf3, 0x7f, 0x2d, 0xb3, 0x79, 0xd6,
+ 0xb1, 0xb7, 0xee, 0x6b, 0x96, 0x5c, 0x09, 0xb6, 0xf4, 0x84, 0x1c, 0x66, 0x5b, 0xaf, 0x18, 0x27, 0x2d, 0x99, 0xe8, 0x3d,
+ 0xf7, 0x3b, 0x8d, 0xbd, 0x21, 0x07, 0x79, 0xf8, 0x5d, 0xeb, 0xde, 0x8e, 0x8c, 0x4a, 0x69, 0xb8, 0xc2, 0x6f, 0xc9, 0x0e,
+ 0xf6, 0x4b, 0xb7, 0xde, 0x35, 0xfe, 0x5b, 0xe6, 0xff, 0xbc, 0x69, 0xfc, 0xef, 0x37, 0xdf, 0xef, 0xfa, 0xf7, 0x9f, 0xb5,
+ 0xce, 0xff, 0xf7, 0xda, 0x3a, 0x33, 0x83, 0x7f, 0x7c, 0xbf, 0x6d, 0x5d, 0xa5, 0xcf, 0xfe, 0xfb, 0x8e, 0xaf, 0x11, 0xff,
+ 0x77, 0x9e, 0x27, 0xeb, 0xf1, 0xff, 0xf9, 0x02, 0xfb, 0x9d, 0xd2, 0x1d, 0x9d, 0xb3, 0xf8, 0xdf, 0x6f, 0xb9, 0x75, 0x66,
+ 0x65, 0xab, 0xea, 0xb3, 0xaa, 0x95, 0x95, 0x3e, 0xef, 0x1b, 0xff, 0x2d, 0xf9, 0xd2, 0xab, 0x5e, 0x27, 0x6f, 0xc3, 0x11,
+ 0x74, 0xd7, 0xf8, 0x3f, 0x7f, 0xf2, 0x50, 0x7f, 0x42, 0xf6, 0x8c, 0xad, 0xfb, 0x45, 0x77, 0xf0, 0x9e, 0x77, 0xec, 0xcf,
+ 0x8b, 0xff, 0x91, 0x0a, 0x85, 0xc7, 0xf7, 0x5d, 0xee, 0x70, 0x9d, 0xbc, 0xa2, 0x1e, 0xe2, 0x3d, 0xf6, 0x3b, 0x8b, 0xe6,
+ 0xa2, 0x7b, 0x3f, 0xc9, 0x71, 0x07, 0xff, 0x9e, 0x4f, 0x0d, 0x6a, 0xfd, 0x78, 0xf5, 0xf6, 0x67, 0xf5, 0xc6, 0x2b, 0xf6,
+ 0x5b, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xa7, 0x95, 0x3c, 0x39, 0x59,
+ 0x05, 0xbc, 0x75, 0xd5, 0x2e, 0xfa, 0x55, 0xb5, 0x66, 0x6a, 0x26, 0x54, 0xc9, 0x7c, 0xb4, 0xf6, 0x66, 0xbf, 0xfc, 0x68,
+ 0xb6, 0xc1, 0x77, 0x86, 0xab, 0x56, 0xf3, 0xfd, 0x69, 0xbd, 0x78, 0xb5, 0xcf, 0x57, 0x6b, 0xa6, 0x8e, 0xd5, 0x8b, 0x3d,
+ 0x5b, 0x29, 0xfd, 0x59, 0x1c, 0xcf, 0x56, 0x55, 0x80, 0x3d, 0x7a, 0xe7, 0xf3, 0x7a, 0xbe, 0xd6, 0x03, 0x32, 0x1e, 0xfd,
+ 0xdf, 0xa1, 0x07, 0x65, 0x59, 0x5e, 0xb1, 0x72, 0x9f, 0x3f, 0xf4, 0x50, 0x9e, 0x94, 0x03, 0xb4, 0xad, 0x65, 0xdf, 0x6f,
+ 0xb5, 0xf5, 0xf1, 0x3e, 0xa7, 0xb1, 0xb2, 0xdf, 0xbd, 0xb6, 0x8e, 0xd4, 0xf3, 0x85, 0x96, 0x2b, 0xe2, 0xf3, 0xaa, 0xa8,
+ 0xaf, 0xb3, 0xb5, 0xe5, 0x68, 0xb7, 0x37, 0x39, 0x56, 0xf1, 0xcf, 0xac, 0x39, 0xff, 0x9d, 0x7a, 0x7d, 0x86, 0xda, 0x42,
+ 0xfc, 0x23, 0xfe, 0xbf, 0x5b, 0xaf, 0x17, 0xff, 0x7c, 0xdf, 0xfc, 0x7f, 0x1f, 0xaa, 0x17, 0xbf, 0xdd, 0x6a, 0xeb, 0xf8,
+ 0xb5, 0xd0, 0x7d, 0xb6, 0xde, 0xb5, 0x0a, 0x22, 0x70, 0xc5, 0x1d, 0xd8, 0xb1, 0x27, 0xb8, 0xc0, 0x6b, 0xe4, 0x60, 0x95,
+ 0xb8, 0x36, 0xfb, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xe2, 0xdf, 0x7f, 0xda, 0x01, 0xc4, 0x3f,
+ 0xf0, 0xed, 0xe2, 0xff, 0x1f };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle cyberFontRecs[189] = {
+ { 4, 4, 4 , 14 },
+ { 16, 4, 1 , 8 },
+ { 25, 4, 4 , 3 },
+ { 37, 4, 8 , 8 },
+ { 53, 4, 8 , 9 },
+ { 69, 4, 8 , 8 },
+ { 85, 4, 8 , 8 },
+ { 101, 4, 1 , 3 },
+ { 110, 4, 4 , 9 },
+ { 122, 4, 4 , 9 },
+ { 134, 4, 5 , 6 },
+ { 147, 4, 5 , 6 },
+ { 160, 4, 2 , 2 },
+ { 170, 4, 4 , 1 },
+ { 182, 4, 1 , 1 },
+ { 191, 4, 8 , 8 },
+ { 207, 4, 8 , 8 },
+ { 223, 4, 2 , 8 },
+ { 233, 4, 8 , 8 },
+ { 249, 4, 8 , 8 },
+ { 265, 4, 8 , 8 },
+ { 281, 4, 8 , 8 },
+ { 297, 4, 8 , 8 },
+ { 313, 4, 7 , 8 },
+ { 328, 4, 8 , 8 },
+ { 344, 4, 8 , 8 },
+ { 360, 4, 1 , 4 },
+ { 369, 4, 2 , 5 },
+ { 379, 4, 4 , 8 },
+ { 391, 4, 5 , 3 },
+ { 404, 4, 4 , 8 },
+ { 416, 4, 7 , 8 },
+ { 431, 4, 8 , 8 },
+ { 447, 4, 8 , 8 },
+ { 463, 4, 8 , 8 },
+ { 479, 4, 8 , 8 },
+ { 495, 4, 8 , 8 },
+ { 4, 26, 7 , 8 },
+ { 19, 26, 7 , 8 },
+ { 34, 26, 8 , 8 },
+ { 50, 26, 8 , 8 },
+ { 66, 26, 5 , 8 },
+ { 79, 26, 7 , 8 },
+ { 94, 26, 8 , 8 },
+ { 110, 26, 7 , 8 },
+ { 125, 26, 8 , 8 },
+ { 141, 26, 8 , 8 },
+ { 157, 26, 8 , 8 },
+ { 173, 26, 8 , 8 },
+ { 189, 26, 8 , 9 },
+ { 205, 26, 8 , 8 },
+ { 221, 26, 8 , 8 },
+ { 237, 26, 8 , 8 },
+ { 253, 26, 8 , 8 },
+ { 269, 26, 8 , 8 },
+ { 285, 26, 9 , 8 },
+ { 302, 26, 8 , 8 },
+ { 318, 26, 8 , 8 },
+ { 334, 26, 8 , 8 },
+ { 350, 26, 4 , 9 },
+ { 362, 26, 8 , 8 },
+ { 378, 26, 4 , 9 },
+ { 390, 26, 4 , 3 },
+ { 402, 26, 7 , 1 },
+ { 417, 26, 2 , 3 },
+ { 427, 26, 7 , 5 },
+ { 442, 26, 7 , 8 },
+ { 457, 26, 7 , 5 },
+ { 472, 26, 7 , 8 },
+ { 487, 26, 7 , 5 },
+ { 4, 48, 4 , 8 },
+ { 16, 48, 7 , 7 },
+ { 31, 48, 7 , 8 },
+ { 46, 48, 1 , 8 },
+ { 55, 48, 3 , 10 },
+ { 66, 48, 7 , 8 },
+ { 81, 48, 4 , 8 },
+ { 93, 48, 9 , 5 },
+ { 110, 48, 7 , 5 },
+ { 125, 48, 7 , 5 },
+ { 140, 48, 7 , 7 },
+ { 155, 48, 7 , 7 },
+ { 170, 48, 5 , 5 },
+ { 183, 48, 7 , 5 },
+ { 198, 48, 5 , 8 },
+ { 211, 48, 7 , 5 },
+ { 226, 48, 7 , 5 },
+ { 241, 48, 9 , 5 },
+ { 258, 48, 7 , 5 },
+ { 273, 48, 7 , 7 },
+ { 288, 48, 7 , 5 },
+ { 303, 48, 4 , 9 },
+ { 315, 48, 1 , 9 },
+ { 324, 48, 4 , 9 },
+ { 336, 48, 8 , 2 },
+ { 352, 48, 1 , 8 },
+ { 361, 48, 7 , 8 },
+ { 376, 48, 7 , 8 },
+ { 391, 48, 8 , 9 },
+ { 407, 48, 8 , 9 },
+ { 423, 48, 8 , 10 },
+ { 439, 48, 4 , 9 },
+ { 451, 48, 7 , 8 },
+ { 466, 48, 8 , 8 },
+ { 482, 48, 7 , 6 },
+ { 497, 48, 5 , 3 },
+ { 4, 70, 5 , 3 },
+ { 17, 70, 8 , 8 },
+ { 33, 70, 0 , 0 },
+ { 41, 70, 4 , 3 },
+ { 53, 70, 8 , 6 },
+ { 69, 70, 4 , 5 },
+ { 81, 70, 4 , 5 },
+ { 93, 70, 8 , 10 },
+ { 109, 70, 7 , 7 },
+ { 124, 70, 5 , 7 },
+ { 137, 70, 1 , 1 },
+ { 146, 70, 7 , 8 },
+ { 161, 70, 2 , 5 },
+ { 171, 70, 4 , 5 },
+ { 183, 70, 5 , 3 },
+ { 196, 70, 14 , 8 },
+ { 218, 70, 13 , 5 },
+ { 239, 70, 8 , 9 },
+ { 255, 70, 7 , 8 },
+ { 270, 70, 8 , 10 },
+ { 286, 70, 8 , 10 },
+ { 302, 70, 8 , 10 },
+ { 318, 70, 8 , 10 },
+ { 334, 70, 8 , 9 },
+ { 350, 70, 8 , 12 },
+ { 366, 70, 14 , 8 },
+ { 388, 70, 8 , 10 },
+ { 404, 70, 7 , 10 },
+ { 419, 70, 7 , 10 },
+ { 434, 70, 7 , 10 },
+ { 449, 70, 7 , 9 },
+ { 464, 70, 5 , 10 },
+ { 477, 70, 5 , 10 },
+ { 490, 70, 5 , 10 },
+ { 4, 92, 5 , 9 },
+ { 17, 92, 8 , 8 },
+ { 33, 92, 8 , 10 },
+ { 49, 92, 8 , 10 },
+ { 65, 92, 8 , 10 },
+ { 81, 92, 8 , 10 },
+ { 97, 92, 8 , 10 },
+ { 113, 92, 8 , 9 },
+ { 129, 92, 4 , 4 },
+ { 141, 92, 8 , 8 },
+ { 157, 92, 8 , 10 },
+ { 173, 92, 8 , 10 },
+ { 189, 92, 8 , 10 },
+ { 205, 92, 8 , 9 },
+ { 221, 92, 8 , 10 },
+ { 237, 92, 7 , 9 },
+ { 252, 92, 7 , 9 },
+ { 267, 92, 7 , 8 },
+ { 282, 92, 7 , 8 },
+ { 297, 92, 7 , 8 },
+ { 312, 92, 7 , 8 },
+ { 327, 92, 7 , 8 },
+ { 342, 92, 7 , 9 },
+ { 357, 92, 13 , 5 },
+ { 378, 92, 7 , 7 },
+ { 393, 92, 7 , 8 },
+ { 408, 92, 7 , 8 },
+ { 423, 92, 7 , 8 },
+ { 438, 92, 7 , 8 },
+ { 453, 92, 3 , 8 },
+ { 464, 92, 2 , 8 },
+ { 474, 92, 3 , 8 },
+ { 485, 92, 3 , 8 },
+ { 4, 114, 8 , 8 },
+ { 20, 114, 7 , 8 },
+ { 35, 114, 7 , 8 },
+ { 50, 114, 7 , 8 },
+ { 65, 114, 7 , 8 },
+ { 80, 114, 7 , 8 },
+ { 95, 114, 7 , 8 },
+ { 110, 114, 5 , 6 },
+ { 123, 114, 7 , 5 },
+ { 138, 114, 7 , 8 },
+ { 153, 114, 7 , 8 },
+ { 168, 114, 7 , 8 },
+ { 183, 114, 7 , 8 },
+ { 198, 114, 7 , 10 },
+ { 213, 114, 7 , 10 },
+ { 228, 114, 7 , 10 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo cyberFontGlyphs[189] = {
+ { 32, 0, 11, 4, { 0 }},
+ { 33, 0, 3, 2, { 0 }},
+ { 34, 0, 3, 4, { 0 }},
+ { 35, 0, 3, 8, { 0 }},
+ { 36, 0, 3, 8, { 0 }},
+ { 37, 0, 3, 8, { 0 }},
+ { 38, 0, 3, 8, { 0 }},
+ { 39, 0, 3, 2, { 0 }},
+ { 40, 0, 3, 4, { 0 }},
+ { 41, 0, 3, 4, { 0 }},
+ { 42, 0, 4, 6, { 0 }},
+ { 43, 0, 4, 6, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 7, 5, { 0 }},
+ { 46, 0, 10, 2, { 0 }},
+ { 47, 0, 3, 8, { 0 }},
+ { 48, 0, 3, 8, { 0 }},
+ { 49, 0, 3, 3, { 0 }},
+ { 50, 0, 3, 8, { 0 }},
+ { 51, 0, 3, 8, { 0 }},
+ { 52, 0, 3, 8, { 0 }},
+ { 53, 0, 3, 8, { 0 }},
+ { 54, 0, 3, 8, { 0 }},
+ { 55, 0, 3, 7, { 0 }},
+ { 56, 0, 3, 8, { 0 }},
+ { 57, 0, 3, 8, { 0 }},
+ { 58, 0, 6, 2, { 0 }},
+ { 59, 0, 6, 3, { 0 }},
+ { 60, 0, 3, 5, { 0 }},
+ { 61, 0, 6, 6, { 0 }},
+ { 62, 0, 3, 5, { 0 }},
+ { 63, 0, 3, 7, { 0 }},
+ { 64, 0, 3, 8, { 0 }},
+ { 65, 0, 3, 8, { 0 }},
+ { 66, 0, 3, 8, { 0 }},
+ { 67, 0, 3, 8, { 0 }},
+ { 68, 0, 3, 8, { 0 }},
+ { 69, 0, 3, 7, { 0 }},
+ { 70, 0, 3, 7, { 0 }},
+ { 71, 0, 3, 8, { 0 }},
+ { 72, 0, 3, 8, { 0 }},
+ { 73, 0, 3, 6, { 0 }},
+ { 74, 0, 3, 7, { 0 }},
+ { 75, 0, 3, 8, { 0 }},
+ { 76, 0, 3, 7, { 0 }},
+ { 77, 0, 3, 9, { 0 }},
+ { 78, 0, 3, 8, { 0 }},
+ { 79, 0, 3, 8, { 0 }},
+ { 80, 0, 3, 8, { 0 }},
+ { 81, 0, 3, 8, { 0 }},
+ { 82, 0, 3, 8, { 0 }},
+ { 83, 0, 3, 8, { 0 }},
+ { 84, 0, 3, 8, { 0 }},
+ { 85, 0, 3, 8, { 0 }},
+ { 86, 0, 3, 8, { 0 }},
+ { 87, 0, 3, 10, { 0 }},
+ { 88, 0, 3, 8, { 0 }},
+ { 89, 0, 3, 8, { 0 }},
+ { 90, 0, 3, 8, { 0 }},
+ { 91, 0, 3, 4, { 0 }},
+ { 92, 0, 3, 8, { 0 }},
+ { 93, 0, 3, 4, { 0 }},
+ { 94, 0, 3, 4, { 0 }},
+ { 95, 0, 11, 7, { 0 }},
+ { 96, 0, 3, 3, { 0 }},
+ { 97, 0, 6, 7, { 0 }},
+ { 98, 0, 3, 7, { 0 }},
+ { 99, 0, 6, 7, { 0 }},
+ { 100, 0, 3, 7, { 0 }},
+ { 101, 0, 6, 7, { 0 }},
+ { 102, 0, 3, 5, { 0 }},
+ { 103, 0, 6, 7, { 0 }},
+ { 104, 0, 3, 7, { 0 }},
+ { 105, 0, 3, 2, { 0 }},
+ { 106, -2, 3, 2, { 0 }},
+ { 107, 0, 3, 7, { 0 }},
+ { 108, 0, 3, 4, { 0 }},
+ { 109, 0, 6, 10, { 0 }},
+ { 110, 0, 6, 7, { 0 }},
+ { 111, 0, 6, 7, { 0 }},
+ { 112, 0, 6, 7, { 0 }},
+ { 113, 0, 6, 7, { 0 }},
+ { 114, 0, 6, 6, { 0 }},
+ { 115, 0, 6, 7, { 0 }},
+ { 116, 0, 3, 6, { 0 }},
+ { 117, 0, 6, 7, { 0 }},
+ { 118, 0, 6, 7, { 0 }},
+ { 119, 0, 6, 10, { 0 }},
+ { 120, 0, 6, 7, { 0 }},
+ { 121, 0, 6, 7, { 0 }},
+ { 122, 0, 6, 7, { 0 }},
+ { 123, 0, 3, 5, { 0 }},
+ { 124, 0, 3, 2, { 0 }},
+ { 125, 0, 3, 5, { 0 }},
+ { 126, 0, 6, 8, { 0 }},
+ { 161, 0, 3, 2, { 0 }},
+ { 162, 0, 4, 7, { 0 }},
+ { 163, 0, 3, 7, { 0 }},
+ { 8364, 0, 3, 9, { 0 }},
+ { 165, 0, 3, 8, { 0 }},
+ { 352, 0, 1, 8, { 0 }},
+ { 167, 0, 4, 5, { 0 }},
+ { 353, 0, 3, 7, { 0 }},
+ { 169, 0, 3, 9, { 0 }},
+ { 170, 0, 3, 7, { 0 }},
+ { 171, 0, 6, 6, { 0 }},
+ { 172, 0, 7, 6, { 0 }},
+ { 174, 0, 3, 9, { 0 }},
+ { 175, 0, 11, 3, { 0 }},
+ { 176, 0, 3, 4, { 0 }},
+ { 177, 0, 6, 8, { 0 }},
+ { 178, 0, 3, 4, { 0 }},
+ { 179, 0, 3, 4, { 0 }},
+ { 381, 0, 1, 8, { 0 }},
+ { 181, 0, 6, 7, { 0 }},
+ { 182, 0, 4, 6, { 0 }},
+ { 183, 0, 7, 2, { 0 }},
+ { 382, 0, 3, 7, { 0 }},
+ { 185, 0, 3, 4, { 0 }},
+ { 186, 0, 3, 5, { 0 }},
+ { 187, 0, 6, 6, { 0 }},
+ { 338, 0, 3, 14, { 0 }},
+ { 339, 0, 6, 13, { 0 }},
+ { 376, 0, 2, 8, { 0 }},
+ { 191, 0, 3, 7, { 0 }},
+ { 192, 0, 1, 8, { 0 }},
+ { 193, 0, 1, 8, { 0 }},
+ { 194, 0, 1, 8, { 0 }},
+ { 195, 0, 1, 8, { 0 }},
+ { 196, 0, 2, 8, { 0 }},
+ { 197, 0, -1, 8, { 0 }},
+ { 198, 0, 3, 14, { 0 }},
+ { 199, 0, 3, 8, { 0 }},
+ { 200, 0, 1, 7, { 0 }},
+ { 201, 0, 1, 7, { 0 }},
+ { 202, 0, 1, 7, { 0 }},
+ { 203, 0, 2, 7, { 0 }},
+ { 204, 0, 1, 6, { 0 }},
+ { 205, 0, 1, 6, { 0 }},
+ { 206, 0, 1, 6, { 0 }},
+ { 207, 0, 2, 6, { 0 }},
+ { 208, 0, 3, 9, { 0 }},
+ { 209, 0, 1, 8, { 0 }},
+ { 210, 0, 1, 8, { 0 }},
+ { 211, 0, 1, 8, { 0 }},
+ { 212, 0, 1, 8, { 0 }},
+ { 213, 0, 1, 8, { 0 }},
+ { 214, 0, 2, 8, { 0 }},
+ { 215, 1, 6, 6, { 0 }},
+ { 216, 0, 3, 8, { 0 }},
+ { 217, 0, 1, 8, { 0 }},
+ { 218, 0, 1, 8, { 0 }},
+ { 219, 0, 1, 8, { 0 }},
+ { 220, 0, 2, 8, { 0 }},
+ { 221, 0, 1, 8, { 0 }},
+ { 222, 0, 3, 7, { 0 }},
+ { 223, 0, 3, 7, { 0 }},
+ { 224, 0, 3, 7, { 0 }},
+ { 225, 0, 3, 7, { 0 }},
+ { 226, 0, 3, 7, { 0 }},
+ { 227, 0, 3, 7, { 0 }},
+ { 228, 0, 3, 7, { 0 }},
+ { 229, 0, 2, 7, { 0 }},
+ { 230, 0, 6, 13, { 0 }},
+ { 231, 0, 6, 7, { 0 }},
+ { 232, 0, 3, 7, { 0 }},
+ { 233, 0, 3, 7, { 0 }},
+ { 234, 0, 3, 7, { 0 }},
+ { 235, 0, 3, 7, { 0 }},
+ { 236, -1, 3, 2, { 0 }},
+ { 237, 0, 3, 2, { 0 }},
+ { 238, -1, 3, 2, { 0 }},
+ { 239, -1, 3, 2, { 0 }},
+ { 240, 0, 3, 8, { 0 }},
+ { 241, 0, 3, 7, { 0 }},
+ { 242, 0, 3, 7, { 0 }},
+ { 243, 0, 3, 7, { 0 }},
+ { 244, 0, 3, 7, { 0 }},
+ { 245, 0, 3, 7, { 0 }},
+ { 246, 0, 3, 7, { 0 }},
+ { 247, 0, 4, 6, { 0 }},
+ { 248, 0, 6, 7, { 0 }},
+ { 249, 0, 3, 7, { 0 }},
+ { 250, 0, 3, 7, { 0 }},
+ { 251, 0, 3, 7, { 0 }},
+ { 252, 0, 3, 7, { 0 }},
+ { 253, 0, 3, 7, { 0 }},
+ { 254, 0, 3, 7, { 0 }},
+ { 255, 0, 3, 7, { 0 }},
+};
+
+// Style loading function: Cyber
+static void GuiLoadStyleCyber(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < CYBER_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(cyberStyleProps[i].controlId, cyberStyleProps[i].propertyId, cyberStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int cyberFontDataSize = 0;
+ unsigned char *data = DecompressData(cyberFontData, CYBER_STYLE_FONT_ATLAS_COMP_SIZE, &cyberFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 14;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, cyberFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, cyberFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/cyber/style_cyber.old.rgs b/external/raygui-4.0/styles/cyber/style_cyber.old.rgs
new file mode 100644
index 0000000..3847d92
Binary files /dev/null and b/external/raygui-4.0/styles/cyber/style_cyber.old.rgs differ
diff --git a/external/raygui-4.0/styles/cyber/style_cyber.png b/external/raygui-4.0/styles/cyber/style_cyber.png
new file mode 100644
index 0000000..c391bf1
Binary files /dev/null and b/external/raygui-4.0/styles/cyber/style_cyber.png differ
diff --git a/external/raygui-4.0/styles/cyber/style_cyber.rgs b/external/raygui-4.0/styles/cyber/style_cyber.rgs
new file mode 100644
index 0000000..e0e2702
Binary files /dev/null and b/external/raygui-4.0/styles/cyber/style_cyber.rgs differ
diff --git a/external/raygui-4.0/styles/cyber/style_cyber.txt.rgs b/external/raygui-4.0/styles/cyber/style_cyber.txt.rgs
new file mode 100644
index 0000000..770213a
--- /dev/null
+++ b/external/raygui-4.0/styles/cyber/style_cyber.txt.rgs
@@ -0,0 +1,27 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 14 charset.txt Kyrou 7 Wide.ttf
+p 00 00 0x2f7486ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x024658ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0x51bfd3ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0x82cde0ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0x3299b4ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xb6e1eaff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0xeb7630ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xffbc51ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0xd86f36ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x134b5aff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x02313dff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x17505fff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x0000000e TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0x81c0d0ff LINE_COLOR
+p 00 19 0x00222bff BACKGROUND_COLOR
+p 00 20 0x00000015 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/dark/PixelOperator.ttf b/external/raygui-4.0/styles/dark/PixelOperator.ttf
new file mode 100644
index 0000000..34fe947
Binary files /dev/null and b/external/raygui-4.0/styles/dark/PixelOperator.ttf differ
diff --git a/external/raygui-4.0/styles/dark/README.md b/external/raygui-4.0/styles/dark/README.md
new file mode 100644
index 0000000..c3595fc
--- /dev/null
+++ b/external/raygui-4.0/styles/dark/README.md
@@ -0,0 +1,27 @@
+## style: dark
+
+Classical dark style with an extra high-def colour touch! Elegant and professional, perfect for the expensive tools!
+
+![dark style table](style_dark.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_dark.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_dark.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_dark.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_dark.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_dark.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![dark style screen](screenshot.png)
+
+## about font
+
+"Pixel Operator" font by de Jayvee Enaguas.
+
+CC0 1.0 Universal, downloaded from dafont.com: [pixel-operator](https://www.dafont.com/pixel-operator.font)
diff --git a/external/raygui-4.0/styles/dark/charset.txt b/external/raygui-4.0/styles/dark/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/dark/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/dark/font_LICENSE.txt b/external/raygui-4.0/styles/dark/font_LICENSE.txt
new file mode 100644
index 0000000..0e259d4
--- /dev/null
+++ b/external/raygui-4.0/styles/dark/font_LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/external/raygui-4.0/styles/dark/screenshot.png b/external/raygui-4.0/styles/dark/screenshot.png
new file mode 100644
index 0000000..712d30c
Binary files /dev/null and b/external/raygui-4.0/styles/dark/screenshot.png differ
diff --git a/external/raygui-4.0/styles/dark/style_dark.h b/external/raygui-4.0/styles/dark/style_dark.h
new file mode 100644
index 0000000..c3010ee
--- /dev/null
+++ b/external/raygui-4.0/styles/dark/style_dark.h
@@ -0,0 +1,589 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleDark(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define DARK_STYLE_PROPS_COUNT 23
+
+// Custom style name: Dark
+static const GuiStyleProp darkStyleProps[DARK_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x878787ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x2c2c2cff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xc3c3c3ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xe1e1e1ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x848484ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x181818ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x000000ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xefefefff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x202020ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x6a6a6aff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x818181ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x606060ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x9d9d9dff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x3c3c3cff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+ { 1, 5, 0xf7f7f7ff }, // LABEL_TEXT_COLOR_FOCUSED
+ { 1, 8, 0x898989ff }, // LABEL_TEXT_COLOR_PRESSED
+ { 4, 5, 0xb0b0b0ff }, // SLIDER_TEXT_COLOR_FOCUSED
+ { 5, 5, 0x848484ff }, // PROGRESSBAR_TEXT_COLOR_FOCUSED
+ { 9, 5, 0xf5f5f5ff }, // TEXTBOX_TEXT_COLOR_FOCUSED
+ { 10, 5, 0xf6f6f6ff }, // VALUEBOX_TEXT_COLOR_FOCUSED
+};
+
+// WARNING: This style uses a custom font: "PixelOperator.ttf" (size: 16, spacing: 0)
+
+#define DARK_STYLE_FONT_ATLAS_COMP_SIZE 2126
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char darkFontData[DARK_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0xdb, 0x72, 0xa4, 0x3a, 0x12, 0x05, 0x50, 0xfd, 0xff, 0x4f, 0xe7, 0x3c, 0x4c, 0x4c, 0x4c, 0x74, 0x9c, 0xd3, 0x20,
+ 0xa5, 0x52, 0x17, 0xec, 0xd5, 0xeb, 0xcd, 0xe5, 0x76, 0x51, 0xa0, 0x94, 0x84, 0x28, 0x36, 0xd1, 0x00, 0x00, 0x00, 0x80,
+ 0x5f, 0x2f, 0xfe, 0xf5, 0x27, 0xf1, 0xd7, 0xdf, 0x8c, 0xee, 0xbf, 0xf3, 0xfc, 0xf3, 0xff, 0xbd, 0x1a, 0x0f, 0xef, 0xd5,
+ 0xb7, 0xad, 0xa3, 0xef, 0x1b, 0x03, 0x7b, 0xe2, 0xdf, 0xb7, 0x2f, 0xba, 0xff, 0xee, 0xdf, 0x3e, 0xdf, 0xf8, 0xef, 0x3f,
+ 0xfd, 0xa5, 0xe7, 0xad, 0x8f, 0xa1, 0xfd, 0x3e, 0xfe, 0x7f, 0xc6, 0x8e, 0x62, 0x2c, 0xd9, 0xf7, 0xef, 0x5b, 0x37, 0xbe,
+ 0xed, 0x95, 0xff, 0x27, 0x1e, 0x3e, 0x4f, 0xe6, 0x28, 0xf5, 0xd4, 0xd6, 0x0d, 0xf5, 0x1f, 0x5d, 0x95, 0x18, 0xa5, 0x2d,
+ 0xe7, 0xff, 0xef, 0x1a, 0x85, 0x3d, 0x55, 0x76, 0x4f, 0x3e, 0x55, 0xfa, 0xf8, 0xfe, 0x78, 0x6a, 0xfd, 0xe3, 0x3d, 0x60,
+ 0x94, 0x7c, 0x96, 0xf9, 0xd6, 0x18, 0xd3, 0xbf, 0xdd, 0xd7, 0x92, 0x6a, 0x3e, 0xd5, 0xcc, 0x2b, 0xad, 0xe4, 0x28, 0x9d,
+ 0xa8, 0xff, 0x48, 0xf7, 0x54, 0x31, 0x58, 0xd1, 0x15, 0x7b, 0x30, 0xd3, 0x0f, 0xb7, 0x8d, 0xf5, 0x1f, 0xa5, 0x73, 0x97,
+ 0x28, 0x6b, 0x73, 0x27, 0xea, 0xff, 0x79, 0xd4, 0x6e, 0x25, 0xed, 0x26, 0x5e, 0xf6, 0x51, 0x6d, 0x2d, 0xaf, 0x9d, 0xa7,
+ 0xae, 0xae, 0xff, 0xe7, 0xdf, 0x1c, 0x1d, 0x6f, 0x63, 0x70, 0xec, 0xae, 0xd8, 0x4f, 0xb9, 0xf1, 0xbf, 0x7e, 0x3f, 0xc6,
+ 0x5f, 0xc7, 0xe6, 0xec, 0x3c, 0x64, 0x64, 0x0f, 0xc7, 0xe0, 0xd9, 0xd5, 0xec, 0x08, 0x7b, 0x72, 0xfc, 0xef, 0x9b, 0x0b,
+ 0xaa, 0xff, 0xb5, 0xf5, 0x9f, 0xf9, 0x24, 0xd1, 0xb9, 0x05, 0x99, 0x31, 0xb1, 0x5d, 0x50, 0xff, 0xa3, 0xfd, 0xd0, 0xf3,
+ 0xbe, 0xaa, 0x9a, 0xcb, 0x8f, 0xae, 0x4b, 0xf4, 0x9d, 0x61, 0xef, 0x6b, 0x85, 0xe3, 0x73, 0xa3, 0xf1, 0xfa, 0x1f, 0xef,
+ 0x3d, 0xdf, 0xfe, 0xda, 0xe8, 0x5e, 0xfd, 0xfb, 0x99, 0xdd, 0xfc, 0x1e, 0xdf, 0x57, 0xff, 0x91, 0x18, 0x53, 0xce, 0xd7,
+ 0x73, 0x4d, 0xfd, 0x47, 0x62, 0xe5, 0xa2, 0x95, 0xad, 0xf2, 0xe5, 0xd6, 0x25, 0xea, 0xd6, 0x0c, 0xce, 0x1f, 0x81, 0xf7,
+ 0xfa, 0x7f, 0x3b, 0x1f, 0x3c, 0x3f, 0xfe, 0xc7, 0x15, 0xe3, 0x7f, 0xa4, 0xd7, 0x86, 0x5b, 0xa2, 0xf7, 0xfd, 0x5a, 0xfd,
+ 0x47, 0xa2, 0x66, 0xa2, 0xe4, 0xbc, 0xbc, 0x2d, 0x59, 0xcb, 0xab, 0x5d, 0x33, 0xdc, 0x73, 0xb4, 0xde, 0x46, 0xd1, 0xaa,
+ 0xb3, 0x9a, 0x9f, 0x55, 0xff, 0xad, 0x60, 0xfc, 0xef, 0x9b, 0x03, 0xcc, 0x7e, 0x8e, 0xf8, 0xd8, 0xe8, 0x5f, 0x59, 0xff,
+ 0xbb, 0x56, 0xec, 0xd7, 0xb7, 0xc6, 0xb8, 0xe2, 0xc8, 0x58, 0xff, 0xaf, 0x9c, 0xff, 0xe7, 0xd7, 0x00, 0xc6, 0xce, 0x63,
+ 0xe2, 0xd2, 0xea, 0xcf, 0x9c, 0x33, 0x57, 0x5d, 0xb1, 0xaf, 0xfd, 0x36, 0x41, 0x24, 0xbe, 0xab, 0x51, 0xb3, 0x8a, 0xb3,
+ 0xfa, 0x18, 0x8c, 0x8f, 0xff, 0xbb, 0xae, 0xff, 0xbf, 0xcf, 0xb9, 0xef, 0x18, 0xff, 0xdb, 0xeb, 0xe8, 0x7e, 0xcb, 0xf6,
+ 0x00, 0x7b, 0x7b, 0x80, 0x50, 0xfd, 0xe0, 0x7b, 0xc4, 0x80, 0xfa, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xbf, 0x9f, 0x5f, 0x9f, 0x63, 0x30, 0x9e, 0x84, 0xbd, 0x3e, 0x81, 0x7d, 0x26, 0x13, 0x38, 0xbb,
+ 0x87, 0xaa, 0xfe, 0xe2, 0x73, 0x76, 0xfc, 0x48, 0xd2, 0x42, 0x7f, 0xcb, 0x88, 0xe1, 0xa7, 0x1f, 0x54, 0x26, 0x0a, 0x64,
+ 0x32, 0x0d, 0xda, 0x60, 0x9b, 0xa8, 0xcd, 0x52, 0x1a, 0xdb, 0xfa, 0x3d, 0x2d, 0xfe, 0x0b, 0xf5, 0x7f, 0xfe, 0x95, 0x96,
+ 0xc8, 0xef, 0xd9, 0x59, 0xff, 0xa3, 0x6d, 0x2f, 0x97, 0x8f, 0x3b, 0x37, 0x96, 0xec, 0x4e, 0x14, 0x8b, 0xc2, 0x63, 0xb8,
+ 0x6f, 0x5c, 0xfd, 0x33, 0x43, 0x67, 0x47, 0xbb, 0x9e, 0xa9, 0xff, 0xd1, 0xec, 0xd3, 0x78, 0xe8, 0x85, 0xef, 0xa9, 0xff,
+ 0xb6, 0xa5, 0xfe, 0xe3, 0x23, 0xf5, 0x5f, 0x9d, 0x24, 0x53, 0x95, 0x42, 0x9e, 0x49, 0xbe, 0x19, 0x3f, 0x86, 0xf9, 0x84,
+ 0xdf, 0x6c, 0x8b, 0xfb, 0x4e, 0xfd, 0x67, 0xda, 0xd6, 0x73, 0xce, 0xaa, 0xfa, 0x7f, 0xdf, 0xb7, 0x99, 0xd1, 0x64, 0xfe,
+ 0xe7, 0x35, 0x95, 0xbf, 0x27, 0x47, 0xf7, 0xed, 0x39, 0x5a, 0x6b, 0xdb, 0xca, 0xec, 0x58, 0xf9, 0x95, 0xfa, 0x8f, 0xe4,
+ 0x5f, 0x89, 0x97, 0x1e, 0xa5, 0x36, 0x81, 0xbd, 0x26, 0xb5, 0x6d, 0x6f, 0xfd, 0x57, 0x3f, 0xf7, 0xe7, 0x8e, 0xfa, 0x3f,
+ 0x9f, 0xa3, 0xbb, 0xea, 0x1c, 0xae, 0x76, 0xac, 0xfc, 0xd9, 0xe3, 0xff, 0x7b, 0x2f, 0xb9, 0xa3, 0x7d, 0xcc, 0x8c, 0xf4,
+ 0x27, 0xc7, 0xff, 0x73, 0x3f, 0x3f, 0x5b, 0xff, 0x55, 0xad, 0x3d, 0x36, 0xce, 0x4c, 0xb2, 0x63, 0xe5, 0xce, 0x55, 0xb2,
+ 0xdd, 0xe7, 0xff, 0xab, 0x3e, 0x59, 0x1b, 0x9e, 0x4d, 0xc4, 0xb5, 0xf5, 0x3f, 0xb3, 0x0a, 0xb9, 0x6e, 0xbe, 0x70, 0x66,
+ 0xfe, 0x9f, 0x7b, 0xbe, 0x6d, 0xe6, 0xa9, 0x80, 0xb7, 0x8d, 0xff, 0xbb, 0xae, 0x92, 0xb5, 0xcd, 0x35, 0xb9, 0xf7, 0xbd,
+ 0x2a, 0x9f, 0x52, 0x37, 0x9e, 0xdf, 0x1f, 0xc5, 0x33, 0xbc, 0xaf, 0xd7, 0x7f, 0x7e, 0x95, 0xbf, 0x15, 0xad, 0x4a, 0x9e,
+ 0x9b, 0xff, 0xef, 0x7e, 0xd2, 0x49, 0xe6, 0x5d, 0x6a, 0xfa, 0xdf, 0xbe, 0xab, 0xc2, 0xb5, 0xa3, 0xc0, 0xdf, 0xaf, 0x36,
+ 0x44, 0xd1, 0xc8, 0x51, 0x95, 0xdf, 0xff, 0xe7, 0xb6, 0x8d, 0x3f, 0xf1, 0x6c, 0xfc, 0x4a, 0x7c, 0x0c, 0x3e, 0x4f, 0xff,
+ 0x44, 0xfd, 0x67, 0xde, 0x39, 0xf3, 0xbf, 0x46, 0x8f, 0x61, 0x65, 0xfd, 0x9f, 0xeb, 0x01, 0xe4, 0x6e, 0xc2, 0x8d, 0xb3,
+ 0x18, 0xe0, 0xe7, 0xf4, 0x00, 0x9e, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xec, 0xbe, 0x13, 0xfb, 0xef, 0xd9, 0x5c, 0x99, 0xd4, 0xf8, 0xf1, 0xfb, 0xa4, 0x77, 0x26, 0xe6, 0xb7, 0x97, 0x14, 0xb2,
+ 0xe7, 0xdf, 0xfa, 0xf3, 0x95, 0x8a, 0x3c, 0xde, 0x28, 0xbc, 0x6b, 0xfd, 0x29, 0x93, 0xe4, 0x39, 0x4b, 0x71, 0x34, 0x77,
+ 0xe0, 0x7d, 0x0f, 0x8f, 0x1f, 0x97, 0x99, 0xd7, 0x5a, 0x61, 0x9a, 0x42, 0x24, 0xd2, 0x5e, 0xde, 0xf6, 0x7a, 0x7f, 0x36,
+ 0x70, 0x94, 0x6d, 0xf1, 0x58, 0x1d, 0x55, 0x65, 0x27, 0xdf, 0x9e, 0x98, 0x3f, 0x9f, 0xbc, 0x13, 0x2f, 0xad, 0xae, 0xbf,
+ 0xfe, 0x7b, 0x92, 0x23, 0xd6, 0xe7, 0x18, 0xf5, 0xfc, 0x34, 0x93, 0x7a, 0x31, 0x96, 0xc1, 0x36, 0xd7, 0x06, 0x56, 0x8f,
+ 0x50, 0x6d, 0xb2, 0x42, 0x62, 0xaa, 0xa5, 0xcc, 0x67, 0xff, 0xbd, 0x6f, 0x69, 0x1b, 0x1c, 0xb9, 0x6e, 0x48, 0xcc, 0x8c,
+ 0xce, 0xfa, 0xaa, 0xfe, 0x69, 0x1b, 0xec, 0x6f, 0x32, 0x79, 0x75, 0x51, 0x9a, 0x44, 0x91, 0xff, 0x3f, 0x91, 0x48, 0x6d,
+ 0x6e, 0xc9, 0x2c, 0xbe, 0x7c, 0x46, 0x7c, 0x26, 0xa7, 0x2a, 0x16, 0xef, 0xd9, 0x4c, 0xfd, 0xb7, 0x43, 0xf5, 0x9f, 0x49,
+ 0x3d, 0x38, 0x9f, 0x98, 0x1d, 0xa9, 0xda, 0xdd, 0x5b, 0xff, 0xd1, 0xd1, 0x7f, 0x65, 0x66, 0xd7, 0x51, 0x78, 0xce, 0xf0,
+ 0x3e, 0xe3, 0xad, 0x1e, 0xff, 0xdb, 0xe3, 0x7e, 0x1a, 0x4f, 0x75, 0x5b, 0x3f, 0x42, 0x65, 0x7a, 0x93, 0xb1, 0xfa, 0x5f,
+ 0xdd, 0x63, 0xcd, 0x3c, 0x07, 0x29, 0x3e, 0x37, 0xfe, 0x9f, 0x49, 0xcc, 0x8e, 0xc4, 0xd9, 0x75, 0xe6, 0x7d, 0xeb, 0xd7,
+ 0x5e, 0xa2, 0xb0, 0xfe, 0x33, 0x3d, 0x40, 0xbe, 0xfe, 0x77, 0xce, 0xa6, 0xb3, 0x79, 0x93, 0x31, 0xdd, 0x86, 0xce, 0xd4,
+ 0x7f, 0xe5, 0xd3, 0x96, 0x56, 0x24, 0xe6, 0x8e, 0x3f, 0xd9, 0xf1, 0xd4, 0xf8, 0xdf, 0x52, 0xe3, 0x7f, 0x6e, 0x9c, 0xa8,
+ 0x3b, 0xf6, 0xb5, 0x73, 0xe5, 0xf7, 0xfa, 0x8f, 0x0d, 0xef, 0xb6, 0xaf, 0xfe, 0x33, 0x3d, 0x61, 0x2c, 0x9b, 0xff, 0x67,
+ 0xab, 0x25, 0x86, 0xe7, 0xd7, 0x3b, 0x13, 0x73, 0x33, 0xeb, 0xcc, 0xf7, 0xd7, 0x7f, 0xe5, 0x33, 0x4c, 0xda, 0x54, 0xfa,
+ 0x72, 0x94, 0x8e, 0xc8, 0xfb, 0xc6, 0xff, 0x15, 0xb3, 0xe9, 0x4c, 0xfa, 0xfe, 0x3d, 0xeb, 0x7f, 0xad, 0xf8, 0x88, 0xb5,
+ 0xe3, 0x79, 0x88, 0x2b, 0x66, 0x85, 0x27, 0xce, 0xff, 0xab, 0x12, 0xd8, 0x73, 0xe7, 0xff, 0xd5, 0x2b, 0xf2, 0x73, 0xc7,
+ 0xf2, 0xde, 0xf1, 0x3f, 0xd7, 0x42, 0x62, 0x68, 0x7c, 0x6e, 0x9f, 0xaa, 0xff, 0x5b, 0xbe, 0xd1, 0x50, 0xd1, 0x6f, 0x45,
+ 0x49, 0xef, 0x96, 0x79, 0x6e, 0x4b, 0xe5, 0x3c, 0xaa, 0x72, 0xfd, 0x6a, 0xe6, 0xfa, 0xff, 0xcc, 0xb7, 0x53, 0x56, 0xbf,
+ 0x5b, 0xfe, 0xfa, 0xff, 0xda, 0xfa, 0x8f, 0xe2, 0x2d, 0xe6, 0x9e, 0x5e, 0xea, 0xe6, 0xf7, 0xd3, 0x7e, 0xee, 0x38, 0x82,
+ 0x6a, 0x59, 0xeb, 0x39, 0x71, 0x3e, 0xc4, 0xef, 0x9a, 0x33, 0xf3, 0xd3, 0xbf, 0xe1, 0x6d, 0x3f, 0x18, 0x9b, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xef, 0xde, 0xc3, 0x14, 0xaf, 0x77, 0x38, 0xbc, 0x65, 0x4b,
+ 0x64, 0x72, 0x29, 0x5b, 0x69, 0xce, 0x5d, 0x4b, 0x24, 0xf3, 0x67, 0xb7, 0xae, 0x77, 0xaf, 0xac, 0xff, 0x64, 0xb3, 0x69,
+ 0xe6, 0x99, 0xc4, 0xf9, 0xcc, 0x3e, 0x3e, 0x7b, 0x34, 0xdf, 0x32, 0x3c, 0x22, 0x91, 0xc6, 0x5a, 0x79, 0xbc, 0x5a, 0x6a,
+ 0xdf, 0x65, 0x5b, 0x59, 0x6f, 0x0f, 0xd0, 0x9f, 0x0f, 0x53, 0x7f, 0x8f, 0x69, 0xa4, 0xf6, 0x79, 0x4d, 0x32, 0xff, 0x4c,
+ 0x5b, 0x6a, 0xe9, 0x04, 0xe2, 0x6c, 0xab, 0xe9, 0xfd, 0x5b, 0x31, 0xfd, 0x97, 0xdf, 0xb3, 0x5a, 0xe3, 0x73, 0x47, 0x33,
+ 0x9b, 0x17, 0x5f, 0x7d, 0xbc, 0x6a, 0xd3, 0xdb, 0x6a, 0x7a, 0x80, 0x8a, 0xfa, 0xaf, 0xdb, 0xca, 0xfd, 0xf7, 0xc6, 0x46,
+ 0xf2, 0x7e, 0xfa, 0xf8, 0xfc, 0xfd, 0xa7, 0xf1, 0xd1, 0x24, 0x81, 0x5c, 0xca, 0xe4, 0xae, 0x4f, 0x95, 0xcb, 0xe5, 0xca,
+ 0xa7, 0xb7, 0xed, 0x1c, 0xff, 0x33, 0x49, 0x52, 0x99, 0xb4, 0xd0, 0xea, 0x57, 0xb2, 0xbd, 0x65, 0xae, 0xfe, 0x33, 0x99,
+ 0x4d, 0x51, 0x94, 0x67, 0x5c, 0xf7, 0xdc, 0x93, 0x48, 0xce, 0xaf, 0x4f, 0x1e, 0xcd, 0x78, 0x4d, 0x25, 0xaf, 0xca, 0xd8,
+ 0xdd, 0xfb, 0x4a, 0x4c, 0x26, 0x3e, 0x44, 0xd7, 0xf1, 0x8e, 0xe9, 0xb1, 0x70, 0xd7, 0xd3, 0x02, 0x33, 0xcf, 0xa4, 0x68,
+ 0xc9, 0xd4, 0xcc, 0x28, 0x9b, 0xe1, 0x57, 0xbf, 0xb2, 0xa2, 0xfe, 0xe3, 0xe1, 0x3c, 0xb9, 0xfa, 0x99, 0x65, 0xd5, 0x47,
+ 0xb3, 0xa7, 0x67, 0xf8, 0x62, 0xfd, 0xaf, 0x9d, 0xa7, 0xd5, 0x9c, 0xff, 0x47, 0xfa, 0x59, 0x3c, 0x77, 0xb6, 0x98, 0xe8,
+ 0x4c, 0x77, 0xfe, 0x69, 0xf5, 0xbf, 0x77, 0x1f, 0x57, 0xf7, 0xe6, 0xcf, 0x33, 0xec, 0xf6, 0xd1, 0xfa, 0x9f, 0x49, 0x8b,
+ 0xaf, 0x39, 0x5f, 0x79, 0x5f, 0xff, 0xaf, 0x5c, 0xd9, 0xb8, 0xa3, 0xfe, 0x6f, 0xa9, 0xf2, 0xb1, 0x7d, 0xbe, 0xb6, 0xfe,
+ 0xcf, 0xd7, 0xd0, 0x6c, 0xf2, 0xfb, 0xf9, 0x6d, 0x8f, 0xb2, 0xf3, 0xff, 0x9a, 0x75, 0xa1, 0xea, 0x79, 0xc4, 0x6d, 0x3d,
+ 0xe8, 0xaa, 0xa7, 0xab, 0xbd, 0xcd, 0x1d, 0xaa, 0xcf, 0x77, 0xef, 0x18, 0xff, 0x43, 0xfd, 0x2f, 0x58, 0x0b, 0xaf, 0x1d,
+ 0x25, 0xf3, 0x2b, 0xcc, 0x33, 0xfd, 0xc9, 0xf8, 0xb3, 0xec, 0x6b, 0x57, 0xc9, 0x32, 0x7d, 0x68, 0xcf, 0x2b, 0xf9, 0x27,
+ 0x6e, 0x7c, 0x75, 0xfe, 0xdf, 0xf3, 0x54, 0xa0, 0x6f, 0xd5, 0x7f, 0x24, 0xd7, 0xb7, 0xee, 0xa8, 0xff, 0xb5, 0x57, 0x06,
+ 0xd6, 0x5f, 0xcb, 0xbf, 0x79, 0xfe, 0xbf, 0xa2, 0xcf, 0xfb, 0x76, 0xfd, 0x7f, 0x61, 0x0e, 0xbd, 0xe6, 0x5b, 0x28, 0xe7,
+ 0xea, 0x7f, 0x6e, 0xdc, 0x56, 0xff, 0x2b, 0x56, 0x8c, 0xf3, 0x9f, 0x7a, 0xc5, 0xf9, 0x7f, 0xef, 0x4c, 0xe3, 0xe7, 0xd7,
+ 0x7f, 0x7d, 0xd2, 0xf9, 0x9a, 0xf3, 0xcd, 0x76, 0xe9, 0x77, 0x61, 0xee, 0xfa, 0x4e, 0xf2, 0x9e, 0x16, 0xb3, 0x66, 0xed,
+ 0x23, 0xf3, 0x94, 0xde, 0xda, 0xa7, 0x39, 0xc5, 0xa2, 0x4a, 0xcf, 0x5d, 0xe5, 0xdd, 0x73, 0xfd, 0x7f, 0xef, 0x37, 0x8a,
+ 0xaa, 0xb7, 0x50, 0xfd, 0x7f, 0xa3, 0x0f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xdb,
+ 0xee, 0xd0, 0xdb, 0x9b, 0xa8, 0x5f, 0x9f, 0x82, 0x71, 0x7b, 0xa2, 0xfe, 0xdb, 0x5d, 0x33, 0xed, 0xda, 0x44, 0xfd, 0xd6,
+ 0x95, 0x4c, 0xf4, 0xbd, 0x44, 0xfd, 0xdf, 0x78, 0xc7, 0xc7, 0x6d, 0x89, 0xfa, 0x75, 0x77, 0x4e, 0xdf, 0x9e, 0xa8, 0xdf,
+ 0x5e, 0xf2, 0x87, 0x6e, 0x4e, 0xd4, 0xcf, 0xdf, 0x3b, 0x75, 0x6b, 0xa2, 0x3e, 0x6b, 0xef, 0x98, 0xec, 0xed, 0xfb, 0xe3,
+ 0xe0, 0x31, 0x5b, 0x75, 0x77, 0x69, 0x7c, 0xf4, 0xce, 0xcf, 0xf1, 0x8c, 0xa6, 0x15, 0x3d, 0x4a, 0xe5, 0x5d, 0x9a, 0xeb,
+ 0x13, 0xf5, 0x7f, 0x4a, 0xbd, 0xee, 0x4a, 0xd4, 0x7f, 0xcf, 0x19, 0x8b, 0x4d, 0xdb, 0x1f, 0x43, 0xf3, 0xc6, 0xb5, 0x89,
+ 0x5a, 0xcf, 0xfd, 0xe8, 0xbd, 0xcf, 0x47, 0xf8, 0x76, 0xa2, 0xf6, 0x6f, 0xab, 0xff, 0x55, 0xfb, 0x29, 0x8a, 0xaa, 0xae,
+ 0xf7, 0x95, 0x7d, 0x59, 0x41, 0x75, 0xf5, 0x1f, 0xe5, 0xaf, 0xed, 0x4d, 0xd4, 0xca, 0xae, 0x27, 0xa8, 0xff, 0xef, 0xac,
+ 0x01, 0xe4, 0xd6, 0xad, 0xe6, 0x12, 0x75, 0x4f, 0xb6, 0x80, 0x9d, 0x89, 0x5a, 0x5f, 0xaf, 0xff, 0xcc, 0xac, 0x5c, 0xfd,
+ 0xdf, 0x39, 0xff, 0x8f, 0xb2, 0x57, 0x32, 0xbd, 0x46, 0x7e, 0xfd, 0xff, 0xcb, 0x4f, 0xd4, 0xfa, 0x99, 0xf5, 0x7f, 0x47,
+ 0xa2, 0xae, 0xfa, 0x3f, 0x33, 0xff, 0x5f, 0xf7, 0x54, 0x82, 0x9d, 0x89, 0xba, 0xc6, 0xff, 0x55, 0x15, 0x71, 0x77, 0x95,
+ 0xdf, 0x95, 0x9b, 0xfb, 0xcd, 0xf3, 0xff, 0xdc, 0x93, 0x40, 0xb3, 0x3d, 0xc0, 0xbe, 0x84, 0xd6, 0x13, 0x89, 0xfa, 0x12,
+ 0x75, 0x67, 0x8e, 0xd7, 0xf3, 0xec, 0xef, 0x9b, 0xd7, 0x63, 0x6e, 0x9f, 0xff, 0xd7, 0x5e, 0xab, 0xf9, 0xe7, 0x9a, 0xd2,
+ 0xea, 0x15, 0xef, 0x55, 0xf3, 0xff, 0xda, 0x2b, 0x5b, 0x12, 0x75, 0xab, 0x8f, 0xda, 0x6f, 0x5f, 0xff, 0x3b, 0xdb, 0xd3,
+ 0xc0, 0xee, 0x79, 0xed, 0xf9, 0x9e, 0x10, 0xf8, 0xda, 0x37, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xf9, 0xef, 0x3f, 0xfb, 0x01, 0xd4, 0x3f,
+ 0xf0, 0xeb, 0xea, 0xff, 0x3f };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle darkFontRecs[189] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 1 , 9 },
+ { 25, 4, 3 , 3 },
+ { 36, 4, 6 , 9 },
+ { 50, 4, 5 , 13 },
+ { 63, 4, 7 , 9 },
+ { 78, 4, 5 , 9 },
+ { 91, 4, 1 , 3 },
+ { 100, 4, 3 , 9 },
+ { 111, 4, 3 , 9 },
+ { 122, 4, 5 , 5 },
+ { 135, 4, 5 , 5 },
+ { 148, 4, 2 , 3 },
+ { 158, 4, 4 , 1 },
+ { 170, 4, 1 , 1 },
+ { 179, 4, 3 , 9 },
+ { 190, 4, 5 , 9 },
+ { 203, 4, 3 , 9 },
+ { 214, 4, 5 , 9 },
+ { 227, 4, 5 , 9 },
+ { 240, 4, 5 , 9 },
+ { 253, 4, 5 , 9 },
+ { 266, 4, 5 , 9 },
+ { 279, 4, 5 , 9 },
+ { 292, 4, 5 , 9 },
+ { 305, 4, 5 , 9 },
+ { 318, 4, 1 , 7 },
+ { 327, 4, 2 , 9 },
+ { 337, 4, 3 , 5 },
+ { 348, 4, 4 , 3 },
+ { 360, 4, 3 , 5 },
+ { 371, 4, 5 , 9 },
+ { 384, 4, 7 , 9 },
+ { 399, 4, 5 , 9 },
+ { 412, 4, 5 , 9 },
+ { 425, 4, 5 , 9 },
+ { 438, 4, 5 , 9 },
+ { 451, 4, 5 , 9 },
+ { 464, 4, 5 , 9 },
+ { 477, 4, 5 , 9 },
+ { 490, 4, 5 , 9 },
+ { 4, 28, 1 , 9 },
+ { 13, 28, 5 , 9 },
+ { 26, 28, 5 , 9 },
+ { 39, 28, 5 , 9 },
+ { 52, 28, 7 , 9 },
+ { 67, 28, 5 , 9 },
+ { 80, 28, 5 , 9 },
+ { 93, 28, 5 , 9 },
+ { 106, 28, 5 , 9 },
+ { 119, 28, 5 , 9 },
+ { 132, 28, 5 , 9 },
+ { 145, 28, 5 , 9 },
+ { 158, 28, 5 , 9 },
+ { 171, 28, 5 , 9 },
+ { 184, 28, 7 , 9 },
+ { 199, 28, 5 , 9 },
+ { 212, 28, 5 , 9 },
+ { 225, 28, 5 , 9 },
+ { 238, 28, 3 , 9 },
+ { 249, 28, 3 , 9 },
+ { 260, 28, 3 , 9 },
+ { 271, 28, 5 , 3 },
+ { 284, 28, 5 , 1 },
+ { 297, 28, 2 , 2 },
+ { 307, 28, 5 , 7 },
+ { 320, 28, 5 , 9 },
+ { 333, 28, 5 , 7 },
+ { 346, 28, 5 , 9 },
+ { 359, 28, 5 , 7 },
+ { 372, 28, 4 , 9 },
+ { 384, 28, 5 , 9 },
+ { 397, 28, 5 , 9 },
+ { 410, 28, 1 , 9 },
+ { 419, 28, 5 , 11 },
+ { 432, 28, 5 , 9 },
+ { 445, 28, 2 , 9 },
+ { 455, 28, 7 , 7 },
+ { 470, 28, 5 , 7 },
+ { 483, 28, 5 , 7 },
+ { 496, 28, 5 , 9 },
+ { 4, 52, 5 , 9 },
+ { 17, 52, 5 , 7 },
+ { 30, 52, 5 , 7 },
+ { 43, 52, 4 , 8 },
+ { 55, 52, 5 , 7 },
+ { 68, 52, 5 , 7 },
+ { 81, 52, 7 , 7 },
+ { 96, 52, 5 , 7 },
+ { 109, 52, 5 , 9 },
+ { 122, 52, 5 , 7 },
+ { 135, 52, 4 , 9 },
+ { 147, 52, 1 , 9 },
+ { 156, 52, 4 , 9 },
+ { 168, 52, 6 , 2 },
+ { 182, 52, 1 , 9 },
+ { 191, 52, 5 , 11 },
+ { 204, 52, 6 , 9 },
+ { 218, 52, 6 , 9 },
+ { 232, 52, 5 , 9 },
+ { 245, 52, 5 , 12 },
+ { 258, 52, 5 , 9 },
+ { 271, 52, 5 , 10 },
+ { 284, 52, 7 , 9 },
+ { 299, 52, 5 , 9 },
+ { 312, 52, 6 , 5 },
+ { 326, 52, 5 , 3 },
+ { 339, 52, 7 , 9 },
+ { 354, 52, 5 , 9 },
+ { 367, 52, 4 , 4 },
+ { 379, 52, 5 , 7 },
+ { 392, 52, 5 , 9 },
+ { 405, 52, 5 , 9 },
+ { 418, 52, 5 , 12 },
+ { 431, 52, 5 , 9 },
+ { 444, 52, 7 , 9 },
+ { 459, 52, 1 , 1 },
+ { 468, 52, 5 , 10 },
+ { 481, 52, 5 , 9 },
+ { 494, 52, 5 , 9 },
+ { 4, 76, 6 , 5 },
+ { 18, 76, 9 , 9 },
+ { 35, 76, 9 , 7 },
+ { 52, 76, 5 , 11 },
+ { 65, 76, 5 , 9 },
+ { 78, 76, 5 , 12 },
+ { 91, 76, 5 , 12 },
+ { 104, 76, 5 , 12 },
+ { 117, 76, 6 , 12 },
+ { 131, 76, 5 , 11 },
+ { 144, 76, 5 , 13 },
+ { 157, 76, 9 , 9 },
+ { 174, 76, 5 , 12 },
+ { 187, 76, 5 , 12 },
+ { 200, 76, 5 , 12 },
+ { 213, 76, 5 , 12 },
+ { 226, 76, 5 , 11 },
+ { 239, 76, 2 , 12 },
+ { 249, 76, 2 , 12 },
+ { 259, 76, 3 , 12 },
+ { 270, 76, 3 , 11 },
+ { 281, 76, 6 , 9 },
+ { 295, 76, 6 , 12 },
+ { 309, 76, 5 , 12 },
+ { 322, 76, 5 , 12 },
+ { 335, 76, 5 , 12 },
+ { 348, 76, 6 , 12 },
+ { 362, 76, 5 , 11 },
+ { 375, 76, 5 , 5 },
+ { 388, 76, 7 , 9 },
+ { 403, 76, 5 , 12 },
+ { 416, 76, 5 , 12 },
+ { 429, 76, 5 , 12 },
+ { 442, 76, 5 , 11 },
+ { 455, 76, 5 , 12 },
+ { 468, 76, 5 , 9 },
+ { 481, 76, 5 , 9 },
+ { 494, 76, 5 , 10 },
+ { 4, 100, 5 , 10 },
+ { 17, 100, 5 , 10 },
+ { 30, 100, 6 , 10 },
+ { 44, 100, 5 , 9 },
+ { 57, 100, 5 , 11 },
+ { 70, 100, 9 , 7 },
+ { 87, 100, 5 , 10 },
+ { 100, 100, 5 , 10 },
+ { 113, 100, 5 , 10 },
+ { 126, 100, 5 , 10 },
+ { 139, 100, 5 , 9 },
+ { 152, 100, 2 , 10 },
+ { 162, 100, 2 , 10 },
+ { 172, 100, 3 , 10 },
+ { 183, 100, 3 , 9 },
+ { 194, 100, 6 , 9 },
+ { 208, 100, 6 , 10 },
+ { 222, 100, 5 , 10 },
+ { 235, 100, 5 , 10 },
+ { 248, 100, 5 , 10 },
+ { 261, 100, 6 , 10 },
+ { 275, 100, 5 , 9 },
+ { 288, 100, 5 , 5 },
+ { 301, 100, 7 , 7 },
+ { 316, 100, 5 , 10 },
+ { 329, 100, 5 , 10 },
+ { 342, 100, 5 , 10 },
+ { 355, 100, 5 , 9 },
+ { 368, 100, 5 , 12 },
+ { 381, 100, 5 , 11 },
+ { 394, 100, 5 , 11 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo darkFontGlyphs[189] = {
+ { 32, 0, 13, 4, { 0 }},
+ { 33, 2, 4, 5, { 0 }},
+ { 34, 2, 4, 7, { 0 }},
+ { 35, 1, 4, 8, { 0 }},
+ { 36, 1, 2, 7, { 0 }},
+ { 37, 1, 4, 9, { 0 }},
+ { 38, 1, 4, 7, { 0 }},
+ { 39, 2, 4, 5, { 0 }},
+ { 40, 3, 4, 7, { 0 }},
+ { 41, 1, 4, 7, { 0 }},
+ { 42, 1, 4, 7, { 0 }},
+ { 43, 1, 6, 7, { 0 }},
+ { 44, 1, 12, 5, { 0 }},
+ { 45, 1, 8, 6, { 0 }},
+ { 46, 2, 12, 5, { 0 }},
+ { 47, 1, 4, 5, { 0 }},
+ { 48, 1, 4, 7, { 0 }},
+ { 49, 2, 4, 7, { 0 }},
+ { 50, 1, 4, 7, { 0 }},
+ { 51, 1, 4, 7, { 0 }},
+ { 52, 1, 4, 7, { 0 }},
+ { 53, 1, 4, 7, { 0 }},
+ { 54, 1, 4, 7, { 0 }},
+ { 55, 1, 4, 7, { 0 }},
+ { 56, 1, 4, 7, { 0 }},
+ { 57, 1, 4, 7, { 0 }},
+ { 58, 2, 6, 5, { 0 }},
+ { 59, 1, 6, 5, { 0 }},
+ { 60, 1, 6, 5, { 0 }},
+ { 61, 1, 7, 6, { 0 }},
+ { 62, 1, 6, 5, { 0 }},
+ { 63, 1, 4, 7, { 0 }},
+ { 64, 1, 4, 9, { 0 }},
+ { 65, 1, 4, 7, { 0 }},
+ { 66, 1, 4, 7, { 0 }},
+ { 67, 1, 4, 7, { 0 }},
+ { 68, 1, 4, 7, { 0 }},
+ { 69, 1, 4, 7, { 0 }},
+ { 70, 1, 4, 7, { 0 }},
+ { 71, 1, 4, 7, { 0 }},
+ { 72, 1, 4, 7, { 0 }},
+ { 73, 2, 4, 5, { 0 }},
+ { 74, 1, 4, 7, { 0 }},
+ { 75, 1, 4, 7, { 0 }},
+ { 76, 1, 4, 7, { 0 }},
+ { 77, 1, 4, 9, { 0 }},
+ { 78, 1, 4, 7, { 0 }},
+ { 79, 1, 4, 7, { 0 }},
+ { 80, 1, 4, 7, { 0 }},
+ { 81, 1, 4, 7, { 0 }},
+ { 82, 1, 4, 7, { 0 }},
+ { 83, 1, 4, 7, { 0 }},
+ { 84, 1, 4, 7, { 0 }},
+ { 85, 1, 4, 7, { 0 }},
+ { 86, 1, 4, 7, { 0 }},
+ { 87, 1, 4, 9, { 0 }},
+ { 88, 1, 4, 7, { 0 }},
+ { 89, 1, 4, 7, { 0 }},
+ { 90, 1, 4, 7, { 0 }},
+ { 91, 3, 4, 7, { 0 }},
+ { 92, 1, 4, 5, { 0 }},
+ { 93, 1, 4, 7, { 0 }},
+ { 94, 1, 4, 7, { 0 }},
+ { 95, 0, 14, 5, { 0 }},
+ { 96, 1, 4, 5, { 0 }},
+ { 97, 1, 6, 7, { 0 }},
+ { 98, 1, 4, 7, { 0 }},
+ { 99, 1, 6, 7, { 0 }},
+ { 100, 1, 4, 7, { 0 }},
+ { 101, 1, 6, 7, { 0 }},
+ { 102, 1, 4, 6, { 0 }},
+ { 103, 1, 6, 7, { 0 }},
+ { 104, 1, 4, 7, { 0 }},
+ { 105, 2, 4, 5, { 0 }},
+ { 106, 1, 4, 7, { 0 }},
+ { 107, 1, 4, 7, { 0 }},
+ { 108, 2, 4, 5, { 0 }},
+ { 109, 1, 6, 9, { 0 }},
+ { 110, 1, 6, 7, { 0 }},
+ { 111, 1, 6, 7, { 0 }},
+ { 112, 1, 6, 7, { 0 }},
+ { 113, 1, 6, 7, { 0 }},
+ { 114, 1, 6, 7, { 0 }},
+ { 115, 1, 6, 7, { 0 }},
+ { 116, 1, 5, 6, { 0 }},
+ { 117, 1, 6, 7, { 0 }},
+ { 118, 1, 6, 7, { 0 }},
+ { 119, 1, 6, 9, { 0 }},
+ { 120, 1, 6, 7, { 0 }},
+ { 121, 1, 6, 7, { 0 }},
+ { 122, 1, 6, 7, { 0 }},
+ { 123, 2, 4, 7, { 0 }},
+ { 124, 2, 4, 5, { 0 }},
+ { 125, 1, 4, 7, { 0 }},
+ { 126, 1, 4, 8, { 0 }},
+ { 161, 2, 6, 5, { 0 }},
+ { 162, 1, 4, 7, { 0 }},
+ { 163, 1, 4, 8, { 0 }},
+ { 8364, 1, 4, 8, { 0 }},
+ { 165, 1, 4, 7, { 0 }},
+ { 352, 1, 1, 7, { 0 }},
+ { 167, 2, 4, 9, { 0 }},
+ { 353, 1, 3, 7, { 0 }},
+ { 169, 1, 4, 9, { 0 }},
+ { 170, 2, 4, 9, { 0 }},
+ { 171, 1, 6, 8, { 0 }},
+ { 172, 1, 8, 7, { 0 }},
+ { 174, 1, 4, 9, { 0 }},
+ { 175, 2, 4, 9, { 0 }},
+ { 176, 1, 4, 6, { 0 }},
+ { 177, 1, 6, 7, { 0 }},
+ { 178, 2, 4, 9, { 0 }},
+ { 179, 2, 4, 9, { 0 }},
+ { 381, 1, 1, 7, { 0 }},
+ { 181, 1, 6, 7, { 0 }},
+ { 182, 1, 4, 9, { 0 }},
+ { 183, 2, 8, 5, { 0 }},
+ { 382, 1, 3, 7, { 0 }},
+ { 185, 2, 4, 9, { 0 }},
+ { 186, 2, 4, 9, { 0 }},
+ { 187, 1, 6, 8, { 0 }},
+ { 338, 1, 4, 11, { 0 }},
+ { 339, 1, 6, 11, { 0 }},
+ { 376, 1, 2, 7, { 0 }},
+ { 191, 1, 6, 7, { 0 }},
+ { 192, 1, 1, 7, { 0 }},
+ { 193, 1, 1, 7, { 0 }},
+ { 194, 1, 1, 7, { 0 }},
+ { 195, 1, 1, 7, { 0 }},
+ { 196, 1, 2, 7, { 0 }},
+ { 197, 1, 0, 7, { 0 }},
+ { 198, 1, 4, 11, { 0 }},
+ { 199, 1, 4, 7, { 0 }},
+ { 200, 1, 1, 7, { 0 }},
+ { 201, 1, 1, 7, { 0 }},
+ { 202, 1, 1, 7, { 0 }},
+ { 203, 1, 2, 7, { 0 }},
+ { 204, 1, 1, 5, { 0 }},
+ { 205, 2, 1, 5, { 0 }},
+ { 206, 1, 1, 5, { 0 }},
+ { 207, 1, 2, 5, { 0 }},
+ { 208, 0, 4, 7, { 0 }},
+ { 209, 1, 1, 7, { 0 }},
+ { 210, 1, 1, 7, { 0 }},
+ { 211, 1, 1, 7, { 0 }},
+ { 212, 1, 1, 7, { 0 }},
+ { 213, 1, 1, 7, { 0 }},
+ { 214, 1, 2, 7, { 0 }},
+ { 215, 1, 6, 7, { 0 }},
+ { 216, 0, 4, 7, { 0 }},
+ { 217, 1, 1, 7, { 0 }},
+ { 218, 1, 1, 7, { 0 }},
+ { 219, 1, 1, 7, { 0 }},
+ { 220, 1, 2, 7, { 0 }},
+ { 221, 1, 1, 7, { 0 }},
+ { 222, 1, 4, 7, { 0 }},
+ { 223, 1, 4, 7, { 0 }},
+ { 224, 1, 3, 7, { 0 }},
+ { 225, 1, 3, 7, { 0 }},
+ { 226, 1, 3, 7, { 0 }},
+ { 227, 1, 3, 7, { 0 }},
+ { 228, 1, 4, 7, { 0 }},
+ { 229, 1, 2, 7, { 0 }},
+ { 230, 1, 6, 11, { 0 }},
+ { 231, 1, 6, 7, { 0 }},
+ { 232, 1, 3, 7, { 0 }},
+ { 233, 1, 3, 7, { 0 }},
+ { 234, 1, 3, 7, { 0 }},
+ { 235, 1, 4, 7, { 0 }},
+ { 236, 1, 3, 5, { 0 }},
+ { 237, 2, 3, 5, { 0 }},
+ { 238, 1, 3, 5, { 0 }},
+ { 239, 1, 4, 5, { 0 }},
+ { 240, 1, 4, 7, { 0 }},
+ { 241, 1, 3, 7, { 0 }},
+ { 242, 1, 3, 7, { 0 }},
+ { 243, 1, 3, 7, { 0 }},
+ { 244, 1, 3, 7, { 0 }},
+ { 245, 1, 3, 7, { 0 }},
+ { 246, 1, 4, 7, { 0 }},
+ { 247, 1, 6, 7, { 0 }},
+ { 248, 0, 6, 7, { 0 }},
+ { 249, 1, 3, 7, { 0 }},
+ { 250, 1, 3, 7, { 0 }},
+ { 251, 1, 3, 7, { 0 }},
+ { 252, 1, 4, 7, { 0 }},
+ { 253, 1, 3, 7, { 0 }},
+ { 254, 1, 4, 7, { 0 }},
+ { 255, 1, 4, 7, { 0 }},
+};
+
+// Style loading function: Dark
+static void GuiLoadStyleDark(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < DARK_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(darkStyleProps[i].controlId, darkStyleProps[i].propertyId, darkStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int darkFontDataSize = 0;
+ unsigned char *data = DecompressData(darkFontData, DARK_STYLE_FONT_ATLAS_COMP_SIZE, &darkFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, darkFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, darkFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/dark/style_dark.old.rgs b/external/raygui-4.0/styles/dark/style_dark.old.rgs
new file mode 100644
index 0000000..746f4ca
Binary files /dev/null and b/external/raygui-4.0/styles/dark/style_dark.old.rgs differ
diff --git a/external/raygui-4.0/styles/dark/style_dark.png b/external/raygui-4.0/styles/dark/style_dark.png
new file mode 100644
index 0000000..05461d1
Binary files /dev/null and b/external/raygui-4.0/styles/dark/style_dark.png differ
diff --git a/external/raygui-4.0/styles/dark/style_dark.rgs b/external/raygui-4.0/styles/dark/style_dark.rgs
new file mode 100644
index 0000000..3f5be87
Binary files /dev/null and b/external/raygui-4.0/styles/dark/style_dark.rgs differ
diff --git a/external/raygui-4.0/styles/dark/style_dark.txt.rgs b/external/raygui-4.0/styles/dark/style_dark.txt.rgs
new file mode 100644
index 0000000..586cb0f
--- /dev/null
+++ b/external/raygui-4.0/styles/dark/style_dark.txt.rgs
@@ -0,0 +1,33 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 16 charset.txt PixelOperator.ttf
+p 00 00 0x878787ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x2c2c2cff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0xc3c3c3ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xe1e1e1ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0x848484ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0x181818ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0x000000ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xefefefff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x202020ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x6a6a6aff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x818181ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x606060ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x00000010 TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0x9d9d9dff LINE_COLOR
+p 00 19 0x3c3c3cff BACKGROUND_COLOR
+p 00 20 0x00000018 TEXT_LINE_SPACING
+p 01 05 0xf7f7f7ff LABEL_TEXT_COLOR_FOCUSED
+p 01 08 0x898989ff LABEL_TEXT_COLOR_PRESSED
+p 04 05 0xb0b0b0ff SLIDER_TEXT_COLOR_FOCUSED
+p 05 05 0x848484ff PROGRESSBAR_TEXT_COLOR_FOCUSED
+p 09 05 0xf5f5f5ff TEXTBOX_TEXT_COLOR_FOCUSED
+p 10 05 0xf6f6f6ff VALUEBOX_TEXT_COLOR_FOCUSED
diff --git a/external/raygui-4.0/styles/default/README.md b/external/raygui-4.0/styles/default/README.md
new file mode 100644
index 0000000..fa5db27
--- /dev/null
+++ b/external/raygui-4.0/styles/default/README.md
@@ -0,0 +1,22 @@
+## style: default
+
+raylib style, simple and easy-to-use. Light colors, wide borders, a sophisticated touch.
+
+![default style table](style_default.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_default.txt.rgs` | Text style file, no font data, uses raylib default font |
+| `style_default.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![default style screen](screenshot.png)
+
+## about font
+
+raylib font by Ramon Santamaria ([@raysan5](https://twitter.com/raysan5)).
diff --git a/external/raygui-4.0/styles/default/charset.txt b/external/raygui-4.0/styles/default/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/default/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/default/screenshot.png b/external/raygui-4.0/styles/default/screenshot.png
new file mode 100644
index 0000000..d26d948
Binary files /dev/null and b/external/raygui-4.0/styles/default/screenshot.png differ
diff --git a/external/raygui-4.0/styles/default/style_default.old.rgs b/external/raygui-4.0/styles/default/style_default.old.rgs
new file mode 100644
index 0000000..a60cb4c
Binary files /dev/null and b/external/raygui-4.0/styles/default/style_default.old.rgs differ
diff --git a/external/raygui-4.0/styles/default/style_default.png b/external/raygui-4.0/styles/default/style_default.png
new file mode 100644
index 0000000..3e6ad97
Binary files /dev/null and b/external/raygui-4.0/styles/default/style_default.png differ
diff --git a/external/raygui-4.0/styles/default/style_default.txt.rgs b/external/raygui-4.0/styles/default/style_default.txt.rgs
new file mode 100644
index 0000000..0ee964f
--- /dev/null
+++ b/external/raygui-4.0/styles/default/style_default.txt.rgs
@@ -0,0 +1,10 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 10 charset.txt PixelOperator.ttf
diff --git a/external/raygui-4.0/styles/enefete/GenericMobileSystemNuevo.ttf b/external/raygui-4.0/styles/enefete/GenericMobileSystemNuevo.ttf
new file mode 100644
index 0000000..777a528
Binary files /dev/null and b/external/raygui-4.0/styles/enefete/GenericMobileSystemNuevo.ttf differ
diff --git a/external/raygui-4.0/styles/enefete/README.md b/external/raygui-4.0/styles/enefete/README.md
new file mode 100644
index 0000000..897579d
--- /dev/null
+++ b/external/raygui-4.0/styles/enefete/README.md
@@ -0,0 +1,27 @@
+## style: enefete
+
+Inspired by money and pain, a desperate jump into the trendings train, a train to nowhere. Don't stare at it for too long!
+
+![enefete style table](style_enefete.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_enefete.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_enefete.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_enefete.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_enefete.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_enefete.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![enefete style screen](screenshot.png)
+
+## about font
+
+"Generic Mobile System" font by de Jayvee Enaguas.
+
+CC0 1.0 Universal, downloaded from dafont.com: [generic-mobile-system](https://www.dafont.com/generic-mobile-system.font)
diff --git a/external/raygui-4.0/styles/enefete/charset.txt b/external/raygui-4.0/styles/enefete/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/enefete/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/enefete/font_LICENSE.txt b/external/raygui-4.0/styles/enefete/font_LICENSE.txt
new file mode 100644
index 0000000..0e259d4
--- /dev/null
+++ b/external/raygui-4.0/styles/enefete/font_LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/external/raygui-4.0/styles/enefete/screenshot.png b/external/raygui-4.0/styles/enefete/screenshot.png
new file mode 100644
index 0000000..06f8143
Binary files /dev/null and b/external/raygui-4.0/styles/enefete/screenshot.png differ
diff --git a/external/raygui-4.0/styles/enefete/style_enefete.h b/external/raygui-4.0/styles/enefete/style_enefete.h
new file mode 100644
index 0000000..b219bfd
--- /dev/null
+++ b/external/raygui-4.0/styles/enefete/style_enefete.h
@@ -0,0 +1,600 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleEnefete(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define ENEFETE_STYLE_PROPS_COUNT 17
+
+// Custom style name: Enefete
+static const GuiStyleProp enefeteStyleProps[ENEFETE_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x1980d5ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x4df3ebff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x103e60ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xe7e2f7ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x23d4ddff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xf1f1f1ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x6413a6ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xea66d9ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x9f00bbff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x4b909eff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x73c7d0ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x448894ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x1d3f6cff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x29c9e5ff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "GenericMobileSystemNuevo.ttf" (size: 16, spacing: 0)
+
+#define ENEFETE_STYLE_FONT_ATLAS_COMP_SIZE 2462
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char enefeteFontData[ENEFETE_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0x59, 0xb2, 0xeb, 0x34, 0x10, 0x00, 0x50, 0x6d, 0x83, 0xfd, 0xef, 0x8d, 0x6d, 0x88, 0xa2, 0x28, 0x0a, 0xb8, 0x8f,
+ 0x58, 0x52, 0x77, 0xcb, 0x53, 0x0e, 0xa7, 0xf8, 0xb9, 0x7e, 0x49, 0x6c, 0xd9, 0x6d, 0x0d, 0xb6, 0x5a, 0xbd, 0x01, 0x00,
+ 0x00, 0x00, 0x5f, 0xef, 0xcf, 0xff, 0xfe, 0xff, 0x6f, 0xff, 0xb7, 0xe5, 0x78, 0xdb, 0xdf, 0xff, 0x62, 0xb4, 0xa5, 0x7f,
+ 0xdc, 0x93, 0x7e, 0xb0, 0x6d, 0xee, 0xb7, 0x62, 0xfb, 0xd5, 0x97, 0xca, 0xa6, 0x1f, 0x94, 0x5a, 0x4b, 0xff, 0xbd, 0x1d,
+ 0x96, 0x7d, 0x0f, 0x94, 0x5e, 0x3b, 0xdc, 0xe7, 0xcf, 0x9f, 0x1c, 0x6f, 0xa9, 0xdc, 0xcf, 0x95, 0x32, 0xad, 0x3c, 0x3f,
+ 0x2b, 0x25, 0xd8, 0x96, 0xb7, 0x1e, 0x97, 0x54, 0x9b, 0x2a, 0xc7, 0xf1, 0x37, 0xf7, 0x9b, 0xc4, 0xff, 0xf1, 0xd1, 0xfc,
+ 0x1d, 0x83, 0x47, 0x67, 0x7f, 0xfe, 0xda, 0x68, 0xd3, 0xf7, 0x84, 0x7f, 0x7e, 0xbb, 0x2e, 0x42, 0xb3, 0xdf, 0xd2, 0x87,
+ 0x77, 0xc2, 0x95, 0x12, 0x3a, 0x2e, 0xbd, 0x16, 0x8a, 0x89, 0xd1, 0x77, 0x46, 0xf6, 0x65, 0x66, 0xdb, 0xdc, 0xfe, 0xc5,
+ 0xae, 0xf9, 0xf1, 0xf7, 0x1d, 0x5f, 0x69, 0x47, 0x67, 0x78, 0x74, 0xe5, 0x1e, 0x1f, 0xdf, 0xfa, 0x59, 0xcd, 0x44, 0xfd,
+ 0x9e, 0xf8, 0xef, 0xff, 0x8a, 0xb3, 0x1e, 0x8c, 0xc1, 0x7c, 0xdd, 0xb0, 0x5e, 0x2b, 0x1c, 0xdf, 0xb3, 0xf6, 0x95, 0xf0,
+ 0x51, 0x39, 0xf5, 0xc0, 0x35, 0xbc, 0x7e, 0xce, 0xa2, 0xbf, 0xb3, 0x23, 0xfe, 0x2b, 0xa2, 0xb8, 0x4d, 0xd4, 0x88, 0x91,
+ 0x36, 0xc5, 0x71, 0x8b, 0x33, 0x1f, 0xe1, 0xa3, 0x7d, 0x89, 0xb4, 0x67, 0xf2, 0x65, 0xb9, 0xda, 0xe6, 0xd8, 0x17, 0xff,
+ 0x15, 0xf5, 0xed, 0x7a, 0x5d, 0xb2, 0xaf, 0x7c, 0x67, 0xea, 0xeb, 0xfb, 0xc7, 0xff, 0xfa, 0xb1, 0x55, 0xc4, 0x7f, 0xcd,
+ 0x59, 0x59, 0x8f, 0xff, 0x2e, 0xfe, 0xa7, 0xeb, 0xff, 0xcf, 0xa5, 0xde, 0x83, 0xfd, 0xaf, 0x7c, 0xaf, 0xbd, 0xaa, 0x9d,
+ 0x7f, 0x6d, 0xfc, 0x8f, 0xfa, 0x83, 0x6d, 0x39, 0xfe, 0x63, 0xbd, 0xcf, 0x48, 0x6f, 0xa3, 0xaa, 0xfd, 0xbf, 0xb7, 0xf5,
+ 0x70, 0xdc, 0x7b, 0x8c, 0x44, 0xf8, 0xda, 0x98, 0x47, 0xcd, 0x37, 0x5f, 0x11, 0xff, 0x6d, 0x62, 0x6f, 0xfa, 0xb0, 0xff,
+ 0x3f, 0x7b, 0x87, 0x5f, 0x8b, 0xff, 0xba, 0xba, 0xe3, 0xca, 0xf8, 0xef, 0xc1, 0x11, 0xb1, 0xea, 0x7e, 0x7c, 0xfc, 0xd8,
+ 0xd6, 0xc6, 0xe7, 0xce, 0xeb, 0xff, 0x8f, 0xda, 0x81, 0x99, 0xf8, 0xff, 0x96, 0xf6, 0xff, 0x4c, 0x4b, 0x7b, 0x54, 0x8a,
+ 0xf3, 0xf7, 0xb3, 0x2b, 0x6a, 0xf3, 0x6b, 0xe3, 0xbf, 0x4f, 0x8d, 0x61, 0xdf, 0x3b, 0xfe, 0xdb, 0x72, 0x2f, 0xaf, 0xf2,
+ 0xda, 0x8d, 0x5e, 0x51, 0xa3, 0x2b, 0x77, 0xe6, 0xae, 0x76, 0xcf, 0xf8, 0x8f, 0x5d, 0xcf, 0x7d, 0xd8, 0xca, 0xef, 0x89,
+ 0xf8, 0x6f, 0xaf, 0x89, 0xff, 0x1e, 0x1c, 0xed, 0xf8, 0xdc, 0xde, 0x8b, 0x8d, 0xc7, 0x45, 0x5a, 0xf2, 0x99, 0x36, 0x4a,
+ 0x55, 0xfc, 0xdf, 0xe3, 0x4c, 0xaa, 0xff, 0x2b, 0xc6, 0xff, 0xdb, 0x61, 0x0b, 0xff, 0xbb, 0xe2, 0xff, 0xf8, 0xf9, 0x5f,
+ 0xbb, 0xfd, 0xb3, 0xba, 0x68, 0xfc, 0xd7, 0x8c, 0xff, 0x9f, 0x7f, 0xb7, 0x9e, 0xe9, 0xb9, 0xe6, 0xe2, 0xff, 0x4e, 0xcf,
+ 0xff, 0xf6, 0xc6, 0xff, 0xe8, 0xa9, 0xf7, 0x9b, 0xda, 0xff, 0x95, 0xe3, 0xf8, 0xf1, 0x77, 0x6e, 0xf6, 0xbd, 0x53, 0xd4,
+ 0x42, 0x6f, 0x72, 0xdd, 0x33, 0xfa, 0xa3, 0xcf, 0x81, 0x72, 0xa3, 0x74, 0x57, 0xbf, 0xff, 0x53, 0x5f, 0x82, 0xe7, 0xed,
+ 0x4f, 0xbf, 0x71, 0x9b, 0x91, 0x77, 0xbd, 0x25, 0xeb, 0xea, 0x3a, 0xf3, 0xf9, 0x6c, 0xfc, 0xb7, 0x9c, 0x1f, 0x76, 0xd6,
+ 0x6c, 0x4a, 0xe2, 0x19, 0x63, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe4, 0xf9,
+ 0x0b, 0x91, 0xb9, 0x86, 0xd1, 0x3c, 0x04, 0xb5, 0xf9, 0x10, 0xfa, 0x8f, 0x3c, 0xac, 0xab, 0xdf, 0x3d, 0x3b, 0xd7, 0x32,
+ 0x33, 0x4f, 0xb3, 0xf6, 0xb3, 0x55, 0x99, 0x25, 0x6a, 0x67, 0x9e, 0x8f, 0xf3, 0xdd, 0xac, 0x66, 0x6b, 0x8e, 0x65, 0x41,
+ 0x5b, 0xcf, 0x69, 0x9e, 0xc9, 0xc3, 0x57, 0x3d, 0xb7, 0xba, 0x26, 0x3f, 0xda, 0xfc, 0x9c, 0xf7, 0x9a, 0x4c, 0x23, 0x75,
+ 0xf1, 0xbf, 0x7e, 0x1e, 0xfa, 0x8f, 0xfd, 0xe8, 0x17, 0x64, 0x62, 0xa8, 0xdf, 0x3a, 0xf7, 0xf7, 0x3b, 0xc5, 0xff, 0xec,
+ 0x3d, 0x38, 0x7b, 0xf5, 0xc6, 0x67, 0xdc, 0x8d, 0xb2, 0x4f, 0x5c, 0x9f, 0x5b, 0xa5, 0x15, 0xe5, 0x47, 0xad, 0x8f, 0xff,
+ 0x76, 0x52, 0xfd, 0x1f, 0x8d, 0xff, 0x3e, 0x5c, 0xcd, 0xe6, 0xbe, 0xf1, 0xbf, 0x9e, 0x77, 0x22, 0xfb, 0xab, 0xb9, 0x95,
+ 0x1c, 0xe2, 0xb9, 0xc6, 0xf3, 0xf1, 0x9f, 0xcb, 0x14, 0x74, 0x6e, 0xdd, 0x7a, 0x7d, 0xfc, 0x47, 0x4b, 0xe4, 0xaa, 0xf8,
+ 0x8f, 0x5f, 0x25, 0x7d, 0x98, 0xcd, 0xfa, 0x8e, 0xf1, 0xdf, 0xbf, 0x3e, 0xfe, 0xeb, 0x73, 0xf9, 0x46, 0x23, 0x20, 0x92,
+ 0x07, 0x7d, 0xa6, 0x5f, 0xbd, 0xda, 0xb3, 0x8b, 0xf7, 0xbb, 0xa2, 0xf5, 0xff, 0xe8, 0xf3, 0x33, 0x47, 0x72, 0x75, 0xfc,
+ 0xb7, 0x61, 0x84, 0xf7, 0x44, 0x94, 0xc6, 0x47, 0x40, 0x32, 0x39, 0xaf, 0xae, 0x89, 0xff, 0x16, 0x5a, 0x31, 0x30, 0x5e,
+ 0xcf, 0xdf, 0x3d, 0xfe, 0xab, 0xfb, 0x06, 0xd1, 0x11, 0x83, 0xea, 0x7d, 0xbc, 0x5f, 0xff, 0xbf, 0x17, 0xb4, 0x12, 0x77,
+ 0xc4, 0x7f, 0xb6, 0x7c, 0xa2, 0xd1, 0x14, 0x8b, 0xff, 0xf9, 0xda, 0x3d, 0xb6, 0x9a, 0x40, 0x6c, 0xdb, 0x7b, 0xe3, 0xbf,
+ 0x36, 0x7f, 0xea, 0xfa, 0x58, 0xf1, 0x9b, 0xe2, 0x3f, 0xda, 0xff, 0x9f, 0xef, 0x71, 0xdd, 0x2b, 0xfe, 0xdb, 0xc4, 0xfa,
+ 0x3c, 0x67, 0xc7, 0xff, 0x28, 0xdb, 0xea, 0xdb, 0xe2, 0x3f, 0x1a, 0x5b, 0xd1, 0xf5, 0x8c, 0x5a, 0xb8, 0xa6, 0x7b, 0x7b,
+ 0xfd, 0xdf, 0x5e, 0x1a, 0xff, 0xf1, 0xf5, 0x65, 0x9e, 0x15, 0xff, 0xd5, 0xad, 0x86, 0xeb, 0xf3, 0xea, 0x45, 0x47, 0x1b,
+ 0xe3, 0xa3, 0x94, 0xef, 0x6e, 0xff, 0xf7, 0x0d, 0xad, 0xf0, 0xec, 0xf3, 0xff, 0xab, 0xe2, 0x7f, 0xd7, 0xf3, 0xbf, 0x36,
+ 0xbd, 0xe6, 0xdf, 0xae, 0xbd, 0x12, 0xff, 0xd5, 0xf1, 0x5f, 0xb9, 0x76, 0xe2, 0xda, 0xbf, 0xa8, 0x7e, 0xff, 0xa7, 0x7e,
+ 0x24, 0x6d, 0xff, 0xfb, 0x3f, 0x7b, 0xca, 0xa7, 0x4d, 0xad, 0x98, 0xb6, 0xfe, 0xab, 0x6d, 0x72, 0x55, 0xe3, 0xd8, 0x3e,
+ 0xd7, 0xbf, 0x7d, 0x73, 0xf7, 0xf8, 0x8f, 0xbd, 0x6d, 0x10, 0xfd, 0x64, 0xfc, 0x13, 0xf7, 0x59, 0x0b, 0xec, 0x3b, 0xdf,
+ 0xa2, 0x54, 0x0a, 0xd5, 0x25, 0xa4, 0x54, 0x71, 0x07, 0x78, 0xd7, 0x7b, 0xe6, 0xbb, 0xfe, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf7, 0xcd, 0x5e, 0x99, 0xcd, 0xb9, 0xfd, 0xeb, 0x5f, 0x7b, 0x68, 0xbe,
+ 0x6b, 0x4f, 0x7e, 0xae, 0x2f, 0xe7, 0xc1, 0x58, 0x9b, 0x77, 0x5a, 0x91, 0x83, 0xa1, 0x3a, 0x8f, 0xd4, 0xb8, 0x5c, 0x66,
+ 0xcf, 0xf4, 0x78, 0x26, 0xf1, 0xea, 0x15, 0x12, 0x99, 0xd7, 0x93, 0xc9, 0xa8, 0x93, 0x59, 0x4b, 0x20, 0x9e, 0x09, 0xb1,
+ 0x2d, 0x7e, 0x6b, 0xec, 0xac, 0xfd, 0x3a, 0xbf, 0x3a, 0x9a, 0xef, 0xb3, 0x26, 0xfe, 0x63, 0xb9, 0x25, 0xaf, 0xc8, 0xb4,
+ 0x16, 0xbf, 0x9a, 0x6a, 0xf7, 0xb0, 0xbe, 0x54, 0xe6, 0xf6, 0x36, 0xf7, 0xf7, 0xcc, 0x9c, 0xfe, 0x5c, 0xee, 0x81, 0xd5,
+ 0x92, 0xe8, 0x53, 0xd9, 0x52, 0x56, 0x3f, 0xf9, 0xf9, 0x73, 0xc7, 0xdb, 0xfa, 0x54, 0xe6, 0x88, 0xd5, 0x6f, 0xfd, 0x6d,
+ 0xf0, 0xf9, 0x7e, 0x78, 0xe7, 0xad, 0x9d, 0xd1, 0xfa, 0x94, 0xf8, 0x5f, 0xbf, 0x77, 0x9f, 0x1d, 0xff, 0xf1, 0xfb, 0x54,
+ 0x2b, 0xcc, 0xd2, 0xb3, 0xbe, 0x36, 0x46, 0x64, 0xe6, 0x6e, 0x3e, 0x47, 0xd0, 0x19, 0x19, 0x35, 0x7e, 0x8d, 0xa6, 0x95,
+ 0xb3, 0x36, 0x17, 0xfd, 0x9f, 0xe2, 0xf7, 0xa8, 0xb5, 0xb5, 0x2f, 0xfe, 0x6b, 0x32, 0xf2, 0x3d, 0x27, 0xfe, 0x67, 0x7a,
+ 0x1b, 0xe7, 0xc5, 0xff, 0xf8, 0xef, 0x75, 0x59, 0xb5, 0x2b, 0x73, 0xed, 0x8c, 0x72, 0x2d, 0xb7, 0xd0, 0x19, 0xe9, 0xc1,
+ 0xfb, 0x4a, 0x2f, 0xce, 0x67, 0xde, 0x7f, 0xfc, 0x3f, 0x5b, 0x53, 0xcf, 0xc6, 0xff, 0xfa, 0x2f, 0xfe, 0x36, 0xd1, 0x7e,
+ 0xa8, 0x6e, 0xff, 0xaf, 0x5c, 0x2f, 0x4f, 0x8a, 0xff, 0x36, 0x95, 0x8b, 0xec, 0xde, 0xf5, 0x7f, 0x65, 0x4e, 0xad, 0xfa,
+ 0xf8, 0x8f, 0x45, 0x78, 0xa4, 0x26, 0x9f, 0x5f, 0xf1, 0x60, 0xed, 0xbc, 0x8d, 0x5b, 0xf9, 0x3d, 0xd1, 0xfe, 0xdf, 0x11,
+ 0xff, 0xd5, 0xe3, 0x7f, 0xf1, 0x35, 0x3c, 0xf6, 0x8c, 0x74, 0x45, 0xc6, 0xff, 0xda, 0x09, 0xfd, 0xff, 0x51, 0x3b, 0x31,
+ 0x5a, 0x2a, 0xf5, 0x6b, 0x53, 0x55, 0x66, 0xdb, 0x5e, 0x8d, 0xff, 0x4c, 0xfd, 0x1f, 0x1d, 0x87, 0xc8, 0xb4, 0x10, 0xdb,
+ 0x60, 0xe4, 0x60, 0xf4, 0x9b, 0xeb, 0x59, 0x43, 0x73, 0xed, 0xff, 0x1d, 0xf1, 0x7f, 0x56, 0xff, 0xbf, 0x25, 0x47, 0x35,
+ 0xeb, 0xda, 0xff, 0x2d, 0xd1, 0xca, 0xcc, 0xdc, 0x6d, 0x22, 0xa5, 0xbd, 0x5e, 0x66, 0x57, 0xd6, 0xff, 0xb9, 0xd5, 0xe6,
+ 0xda, 0xb6, 0x7c, 0xa7, 0x91, 0xf6, 0xff, 0x9e, 0xa7, 0x70, 0xcf, 0xae, 0xff, 0xcf, 0x7c, 0x3a, 0xb9, 0x73, 0x7f, 0xee,
+ 0x93, 0x77, 0x6e, 0x4f, 0x1e, 0xe9, 0x3b, 0xf4, 0xff, 0x23, 0xe3, 0xff, 0xd1, 0x9c, 0xc7, 0xe3, 0xda, 0xb8, 0x0f, 0x46,
+ 0xd3, 0xbe, 0x35, 0xfe, 0xef, 0x91, 0x9b, 0xf9, 0x7b, 0xe3, 0xbf, 0xa5, 0xf2, 0x4f, 0x5f, 0x11, 0xff, 0x73, 0x2d, 0xab,
+ 0xd8, 0x8a, 0x88, 0xb9, 0x15, 0x93, 0xa3, 0x7d, 0xba, 0x76, 0xea, 0x95, 0x9e, 0x79, 0xfe, 0xb7, 0xe7, 0xfd, 0x9f, 0xda,
+ 0x37, 0x0d, 0x9e, 0xfb, 0x3e, 0xd4, 0x3b, 0x8e, 0xe0, 0x8c, 0xfb, 0xf9, 0x78, 0xd5, 0x82, 0xbe, 0xe9, 0x98, 0x62, 0x4f,
+ 0x75, 0xa3, 0xcf, 0x89, 0xf7, 0xdd, 0xef, 0xa3, 0xef, 0xff, 0x44, 0xcb, 0x54, 0xa6, 0xe5, 0x6f, 0xb9, 0x83, 0x5d, 0x19,
+ 0xff, 0xfb, 0x5b, 0x49, 0x55, 0xef, 0x30, 0x7c, 0xdb, 0x95, 0xa2, 0x64, 0xbe, 0xe5, 0xbc, 0xae, 0x8f, 0xf4, 0xbe, 0xa5,
+ 0x24, 0x5c, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3b, 0xe7, 0x8a, 0xf5, 0xb2,
+ 0x4c, 0x0b, 0xb3, 0x79, 0xae, 0xfa, 0xc2, 0xcc, 0xcd, 0x36, 0xcc, 0xdd, 0x9c, 0xfd, 0x9e, 0x9f, 0xab, 0x1a, 0xf4, 0xc1,
+ 0xbf, 0x68, 0x81, 0x3d, 0xed, 0xe1, 0x79, 0xc8, 0xeb, 0x6b, 0x34, 0xfc, 0xdc, 0xe3, 0x96, 0x28, 0x91, 0x36, 0x31, 0x4f,
+ 0x75, 0x6d, 0xae, 0xde, 0xee, 0x63, 0xae, 0xc9, 0x96, 0x1e, 0xc9, 0xfb, 0x37, 0x9b, 0xbd, 0x64, 0x47, 0xa9, 0xe4, 0x66,
+ 0xbb, 0xf7, 0xa5, 0xbf, 0xc7, 0x72, 0x3f, 0xf4, 0xc3, 0x18, 0xaa, 0xb9, 0x3f, 0xcd, 0x65, 0xe8, 0x5b, 0x9f, 0xb3, 0x3e,
+ 0x97, 0xdf, 0xb3, 0x6d, 0xcc, 0x89, 0xbd, 0x7e, 0xb5, 0xc7, 0x23, 0x25, 0xb7, 0x75, 0x6e, 0xae, 0xfe, 0x8e, 0x63, 0x8e,
+ 0xe7, 0xb3, 0x9d, 0xff, 0x9e, 0x4c, 0xed, 0x37, 0x9e, 0x85, 0x99, 0xa9, 0x27, 0xda, 0xd4, 0xdd, 0x7a, 0x2d, 0xca, 0xa3,
+ 0x77, 0x99, 0xf5, 0xf8, 0xaf, 0x99, 0x83, 0xde, 0x87, 0xc7, 0x13, 0x5b, 0x81, 0x63, 0x26, 0xbf, 0xf7, 0xfb, 0x5a, 0x8b,
+ 0xf9, 0xf8, 0xff, 0xd6, 0x36, 0xf6, 0xfd, 0x4a, 0xa0, 0x2f, 0xd6, 0xf1, 0x9f, 0x23, 0x6c, 0xa6, 0x15, 0x5f, 0x13, 0xff,
+ 0xeb, 0xf7, 0xad, 0xfd, 0xf1, 0xdf, 0x43, 0xdf, 0x10, 0x6d, 0xcf, 0xde, 0x73, 0x6b, 0x2e, 0xfe, 0xc7, 0x57, 0xd0, 0x9e,
+ 0xad, 0x55, 0xab, 0x28, 0xe5, 0x72, 0x94, 0xb7, 0x60, 0xef, 0x21, 0x9b, 0x11, 0x68, 0x35, 0x1b, 0x5b, 0x0f, 0xf5, 0x46,
+ 0xf6, 0xd4, 0xff, 0xf9, 0xfe, 0xff, 0x7c, 0xbb, 0x2d, 0x3e, 0x7e, 0x90, 0xb9, 0x96, 0x76, 0xb4, 0xc3, 0xcf, 0xd8, 0x1a,
+ 0xc9, 0x1b, 0x77, 0xd5, 0xd6, 0xdd, 0xf1, 0xdf, 0xff, 0xb3, 0x8e, 0xe2, 0x51, 0x44, 0xad, 0xdf, 0x1d, 0xee, 0xd7, 0xb2,
+ 0x88, 0x8f, 0xff, 0xad, 0x1e, 0x43, 0xc5, 0x11, 0xcf, 0xf5, 0x0b, 0x67, 0xa3, 0xb4, 0xae, 0xfe, 0xcf, 0x9c, 0xf5, 0x2b,
+ 0xb7, 0x66, 0x46, 0xf7, 0xde, 0x1a, 0xff, 0x73, 0xe5, 0x76, 0x45, 0xfc, 0x57, 0xe7, 0x13, 0x9c, 0x69, 0x4d, 0x44, 0xb3,
+ 0x34, 0x5f, 0xd1, 0x97, 0x9c, 0xcd, 0xce, 0x9f, 0x5b, 0x7f, 0xf6, 0x4d, 0xf1, 0xdf, 0x8a, 0xda, 0xff, 0x67, 0x6e, 0xbd,
+ 0x47, 0xfb, 0xbf, 0xbf, 0xa0, 0xfe, 0xcf, 0x3e, 0xd7, 0x99, 0x3f, 0x86, 0x73, 0x8e, 0x36, 0x9e, 0x81, 0x3f, 0xf3, 0x04,
+ 0xe3, 0xca, 0xbe, 0x70, 0x76, 0x6b, 0x36, 0xfe, 0xbf, 0xb5, 0xfe, 0x7f, 0x43, 0xfc, 0xe7, 0x9f, 0x65, 0xaf, 0x8c, 0xff,
+ 0x9d, 0x75, 0x44, 0xf9, 0xf6, 0x51, 0xee, 0xd9, 0xff, 0x3b, 0xeb, 0xff, 0x9a, 0x35, 0xe7, 0x9f, 0x16, 0xff, 0x33, 0xa3,
+ 0x4c, 0x4f, 0x8d, 0xff, 0x8a, 0x18, 0xa9, 0x1a, 0xff, 0xaf, 0xbe, 0x03, 0xb4, 0xad, 0x99, 0xeb, 0x9f, 0x17, 0xe1, 0xe3,
+ 0xf8, 0x8f, 0xbc, 0xff, 0xf3, 0xee, 0xf8, 0x9f, 0x7b, 0x37, 0xe6, 0xd9, 0xf1, 0xdf, 0x93, 0x2b, 0xd6, 0xbc, 0xf3, 0xf9,
+ 0x70, 0x6c, 0xfd, 0xe9, 0xe7, 0xc5, 0x7f, 0xfc, 0xed, 0x8c, 0xb7, 0x3f, 0xff, 0xcb, 0xbd, 0x1d, 0xb0, 0xf7, 0xf9, 0xdf,
+ 0x13, 0xde, 0x2b, 0xe1, 0x4d, 0xf7, 0x42, 0xe7, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x6a, 0x46, 0x46, 0x3c, 0x67, 0xcf, 0xdc, 0x4c, 0xb1, 0x6b, 0x72, 0xdf, 0x47, 0x32, 0x15, 0xcc, 0xec, 0x4f, 0x3c,
+ 0xff, 0x41, 0x24, 0xdb, 0xfe, 0xd1, 0xb9, 0x89, 0xe6, 0x1c, 0xcf, 0xe4, 0x32, 0xda, 0x75, 0x8c, 0xeb, 0x59, 0xe1, 0xe7,
+ 0x7f, 0x61, 0x2e, 0xf7, 0x63, 0x2c, 0x2e, 0xee, 0x71, 0xae, 0x33, 0xf3, 0xee, 0x76, 0x67, 0x8a, 0xef, 0xc9, 0x5c, 0xef,
+ 0xf5, 0x7b, 0x95, 0xcd, 0xd3, 0x1f, 0xdb, 0xe7, 0x48, 0x09, 0xf7, 0xc4, 0x4a, 0x2c, 0x6d, 0xe2, 0x4a, 0xaa, 0xce, 0xef,
+ 0x93, 0x59, 0x99, 0x63, 0xfe, 0x8e, 0x5c, 0x99, 0xb3, 0xbf, 0x25, 0xf2, 0xf5, 0xdf, 0xe5, 0x5c, 0xdf, 0xb5, 0x65, 0x71,
+ 0x9c, 0xf1, 0xe8, 0xbe, 0xad, 0xa4, 0x1e, 0xca, 0x6e, 0xfa, 0x9c, 0x7c, 0x04, 0xb1, 0x3a, 0xf7, 0xbd, 0xed, 0xe2, 0xf7,
+ 0x1f, 0x73, 0x26, 0xb7, 0xc0, 0x4c, 0x1d, 0xde, 0x02, 0xf1, 0x7f, 0xc7, 0xfc, 0x55, 0xb9, 0xcc, 0x57, 0x33, 0xa5, 0x78,
+ 0xd6, 0xb6, 0x23, 0xbf, 0x07, 0x56, 0x62, 0xbb, 0xf2, 0x18, 0xf7, 0xe7, 0xec, 0x38, 0xce, 0x26, 0xf2, 0xe4, 0x73, 0xdd,
+ 0xb6, 0xe7, 0x82, 0x89, 0xd6, 0xff, 0x4f, 0x8d, 0xff, 0xd1, 0x6a, 0x04, 0x9f, 0xd7, 0x25, 0x3b, 0x6f, 0x5b, 0xc5, 0x5a,
+ 0x06, 0xab, 0x3d, 0xa0, 0x1d, 0xdb, 0xae, 0xcc, 0xd9, 0x75, 0xf6, 0xb1, 0xc6, 0xcb, 0xe8, 0xca, 0xf8, 0x9f, 0xe9, 0xd7,
+ 0x7d, 0x5b, 0xfd, 0xdf, 0x2f, 0xdf, 0x36, 0x7f, 0x17, 0xbb, 0xfb, 0xb5, 0xbd, 0x7f, 0xcd, 0x8e, 0x27, 0xc4, 0xf8, 0x5d,
+ 0xe3, 0xff, 0xaa, 0x8c, 0xc7, 0x35, 0x2b, 0x2d, 0x45, 0xfb, 0xff, 0x4f, 0xb8, 0x26, 0x7a, 0x72, 0x2d, 0xe3, 0xd8, 0x0a,
+ 0xce, 0xd5, 0xdb, 0xc4, 0xff, 0xdd, 0xeb, 0xff, 0x99, 0xb1, 0x95, 0xfb, 0xe5, 0xaf, 0xcc, 0xae, 0xd3, 0xfb, 0xee, 0xeb,
+ 0xa5, 0x85, 0x9e, 0x79, 0xed, 0xd8, 0x26, 0xfe, 0xc5, 0xbf, 0xf8, 0xbf, 0xe2, 0x7a, 0xe9, 0x5f, 0xd1, 0xff, 0x17, 0xff,
+ 0xe2, 0x3f, 0xf2, 0xcc, 0xec, 0xfe, 0xfd, 0xff, 0x5d, 0x4f, 0x2a, 0xdf, 0x36, 0xfe, 0x1f, 0x7d, 0xda, 0xfb, 0xa4, 0xf1,
+ 0xff, 0xdd, 0xcf, 0xff, 0xae, 0xf8, 0xdd, 0xdc, 0x3e, 0xbf, 0xff, 0x19, 0xf7, 0x3b, 0xf2, 0xc5, 0xf3, 0xfc, 0xeb, 0x50,
+ 0x19, 0x80, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe7, 0x00, 0xaf, 0xbe,
+ 0xa7, 0x7f, 0x66, 0xbe, 0xf7, 0xc8, 0x9c, 0xcf, 0xb9, 0xef, 0x04, 0xf1, 0x1f, 0x9b, 0xa7, 0x73, 0x66, 0xbe, 0xf7, 0xfc,
+ 0xdc, 0x7c, 0xe7, 0x1a, 0xde, 0x37, 0x53, 0x5c, 0x6c, 0x43, 0x2e, 0xc2, 0xa3, 0x39, 0x3a, 0xef, 0xb2, 0xed, 0x1d, 0x2b,
+ 0x73, 0xc0, 0xbd, 0x6a, 0xd5, 0xa7, 0xc4, 0x7f, 0xdb, 0x96, 0xef, 0x12, 0xbe, 0xb1, 0xff, 0x2f, 0xfe, 0x41, 0xfc, 0x8b,
+ 0x7f, 0xd0, 0xfe, 0x17, 0xff, 0x60, 0xfc, 0xff, 0xaa, 0x58, 0x9d, 0x59, 0x27, 0xe6, 0xc9, 0x4f, 0x31, 0xe0, 0x7e, 0x77,
+ 0x80, 0xf8, 0xdd, 0xa1, 0x7a, 0x5b, 0x1b, 0xde, 0x37, 0x3c, 0x23, 0x84, 0xb3, 0xe2, 0xff, 0x9a, 0x51, 0x8a, 0xd5, 0xf8,
+ 0xd7, 0xfe, 0x87, 0x37, 0xf5, 0x46, 0x22, 0xef, 0xff, 0x89, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe9, 0xaf, 0xff, 0x94, 0x03, 0x88, 0x7f, 0xe0, 0xeb, 0xe2, 0xff,
+ 0x0f };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle enefeteFontRecs[189] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 2 , 10 },
+ { 26, 4, 5 , 3 },
+ { 39, 4, 7 , 10 },
+ { 54, 4, 7 , 13 },
+ { 69, 4, 7 , 10 },
+ { 84, 4, 7 , 10 },
+ { 99, 4, 2 , 3 },
+ { 109, 4, 3 , 12 },
+ { 120, 4, 3 , 12 },
+ { 131, 4, 5 , 6 },
+ { 144, 4, 6 , 5 },
+ { 158, 4, 2 , 4 },
+ { 168, 4, 5 , 1 },
+ { 181, 4, 2 , 2 },
+ { 191, 4, 4 , 10 },
+ { 203, 4, 6 , 10 },
+ { 217, 4, 4 , 10 },
+ { 229, 4, 6 , 10 },
+ { 243, 4, 6 , 10 },
+ { 257, 4, 6 , 10 },
+ { 271, 4, 6 , 10 },
+ { 285, 4, 6 , 10 },
+ { 299, 4, 6 , 10 },
+ { 313, 4, 6 , 10 },
+ { 327, 4, 6 , 10 },
+ { 341, 4, 2 , 6 },
+ { 351, 4, 2 , 8 },
+ { 361, 4, 7 , 7 },
+ { 376, 4, 5 , 3 },
+ { 389, 4, 7 , 7 },
+ { 404, 4, 6 , 10 },
+ { 418, 4, 7 , 12 },
+ { 433, 4, 7 , 10 },
+ { 448, 4, 7 , 10 },
+ { 463, 4, 7 , 10 },
+ { 478, 4, 7 , 10 },
+ { 493, 4, 7 , 10 },
+ { 4, 28, 7 , 10 },
+ { 19, 28, 7 , 10 },
+ { 34, 28, 7 , 10 },
+ { 49, 28, 2 , 10 },
+ { 59, 28, 5 , 10 },
+ { 72, 28, 7 , 10 },
+ { 87, 28, 6 , 10 },
+ { 101, 28, 9 , 10 },
+ { 118, 28, 7 , 10 },
+ { 133, 28, 7 , 10 },
+ { 148, 28, 7 , 10 },
+ { 163, 28, 7 , 12 },
+ { 178, 28, 7 , 10 },
+ { 193, 28, 7 , 10 },
+ { 208, 28, 6 , 10 },
+ { 222, 28, 7 , 10 },
+ { 237, 28, 7 , 10 },
+ { 252, 28, 8 , 10 },
+ { 268, 28, 7 , 10 },
+ { 283, 28, 6 , 10 },
+ { 297, 28, 7 , 10 },
+ { 312, 28, 4 , 12 },
+ { 324, 28, 4 , 10 },
+ { 336, 28, 4 , 12 },
+ { 348, 28, 6 , 3 },
+ { 362, 28, 7 , 1 },
+ { 377, 28, 4 , 3 },
+ { 389, 28, 6 , 7 },
+ { 403, 28, 6 , 10 },
+ { 417, 28, 6 , 7 },
+ { 431, 28, 6 , 10 },
+ { 445, 28, 6 , 7 },
+ { 459, 28, 4 , 10 },
+ { 471, 28, 6 , 9 },
+ { 485, 28, 6 , 10 },
+ { 499, 28, 2 , 10 },
+ { 4, 52, 5 , 12 },
+ { 17, 52, 6 , 10 },
+ { 31, 52, 3 , 10 },
+ { 42, 52, 8 , 7 },
+ { 58, 52, 6 , 7 },
+ { 72, 52, 6 , 7 },
+ { 86, 52, 6 , 9 },
+ { 100, 52, 6 , 9 },
+ { 114, 52, 5 , 7 },
+ { 127, 52, 6 , 7 },
+ { 141, 52, 4 , 10 },
+ { 153, 52, 6 , 7 },
+ { 167, 52, 6 , 7 },
+ { 181, 52, 8 , 7 },
+ { 197, 52, 6 , 7 },
+ { 211, 52, 6 , 9 },
+ { 225, 52, 6 , 7 },
+ { 239, 52, 5 , 12 },
+ { 252, 52, 2 , 12 },
+ { 262, 52, 5 , 12 },
+ { 275, 52, 7 , 3 },
+ { 290, 52, 2 , 9 },
+ { 300, 52, 6 , 11 },
+ { 314, 52, 7 , 10 },
+ { 329, 52, 7 , 9 },
+ { 344, 52, 6 , 10 },
+ { 358, 52, 7 , 11 },
+ { 373, 52, 6 , 12 },
+ { 387, 52, 6 , 10 },
+ { 401, 52, 7 , 10 },
+ { 416, 52, 5 , 5 },
+ { 429, 52, 7 , 6 },
+ { 444, 52, 6 , 3 },
+ { 458, 52, 7 , 10 },
+ { 473, 52, 9 , 10 },
+ { 490, 52, 4 , 4 },
+ { 4, 76, 6 , 7 },
+ { 18, 76, 4 , 5 },
+ { 30, 76, 4 , 5 },
+ { 42, 76, 7 , 11 },
+ { 57, 76, 6 , 9 },
+ { 71, 76, 7 , 12 },
+ { 86, 76, 2 , 2 },
+ { 96, 76, 6 , 10 },
+ { 110, 76, 3 , 5 },
+ { 121, 76, 4 , 5 },
+ { 133, 76, 7 , 6 },
+ { 148, 76, 9 , 10 },
+ { 165, 76, 8 , 7 },
+ { 181, 76, 6 , 11 },
+ { 195, 76, 6 , 11 },
+ { 209, 76, 7 , 11 },
+ { 224, 76, 7 , 11 },
+ { 239, 76, 7 , 11 },
+ { 254, 76, 7 , 11 },
+ { 269, 76, 7 , 11 },
+ { 284, 76, 7 , 11 },
+ { 299, 76, 9 , 10 },
+ { 316, 76, 7 , 12 },
+ { 331, 76, 7 , 11 },
+ { 346, 76, 7 , 11 },
+ { 361, 76, 7 , 11 },
+ { 376, 76, 7 , 11 },
+ { 391, 76, 3 , 11 },
+ { 402, 76, 3 , 11 },
+ { 413, 76, 5 , 11 },
+ { 426, 76, 5 , 11 },
+ { 439, 76, 8 , 10 },
+ { 455, 76, 7 , 11 },
+ { 470, 76, 7 , 11 },
+ { 485, 76, 7 , 11 },
+ { 4, 100, 7 , 11 },
+ { 19, 100, 7 , 11 },
+ { 34, 100, 7 , 11 },
+ { 49, 100, 7 , 7 },
+ { 64, 100, 7 , 13 },
+ { 79, 100, 7 , 11 },
+ { 94, 100, 7 , 11 },
+ { 109, 100, 7 , 11 },
+ { 124, 100, 7 , 11 },
+ { 139, 100, 6 , 11 },
+ { 153, 100, 7 , 10 },
+ { 168, 100, 7 , 10 },
+ { 183, 100, 6 , 10 },
+ { 197, 100, 6 , 10 },
+ { 211, 100, 6 , 10 },
+ { 225, 100, 6 , 10 },
+ { 239, 100, 6 , 10 },
+ { 253, 100, 6 , 11 },
+ { 267, 100, 8 , 7 },
+ { 283, 100, 6 , 9 },
+ { 297, 100, 6 , 10 },
+ { 311, 100, 6 , 10 },
+ { 325, 100, 6 , 10 },
+ { 339, 100, 6 , 10 },
+ { 353, 100, 3 , 10 },
+ { 364, 100, 3 , 10 },
+ { 375, 100, 5 , 10 },
+ { 388, 100, 5 , 10 },
+ { 401, 100, 6 , 10 },
+ { 415, 100, 6 , 10 },
+ { 429, 100, 6 , 10 },
+ { 443, 100, 6 , 10 },
+ { 457, 100, 6 , 10 },
+ { 471, 100, 6 , 10 },
+ { 485, 100, 6 , 10 },
+ { 4, 124, 6 , 7 },
+ { 18, 124, 7 , 11 },
+ { 33, 124, 6 , 10 },
+ { 47, 124, 6 , 10 },
+ { 61, 124, 6 , 10 },
+ { 75, 124, 6 , 10 },
+ { 89, 124, 6 , 12 },
+ { 103, 124, 6 , 12 },
+ { 117, 124, 6 , 12 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo enefeteFontGlyphs[189] = {
+ { 32, 0, 12, 4, { 0 }},
+ { 33, 0, 2, 3, { 0 }},
+ { 34, 0, 2, 6, { 0 }},
+ { 35, 0, 2, 8, { 0 }},
+ { 36, 0, 1, 8, { 0 }},
+ { 37, 0, 2, 8, { 0 }},
+ { 38, 0, 2, 8, { 0 }},
+ { 39, 0, 2, 3, { 0 }},
+ { 40, 0, 2, 4, { 0 }},
+ { 41, 0, 2, 4, { 0 }},
+ { 42, 0, 4, 6, { 0 }},
+ { 43, 0, 6, 7, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 8, 6, { 0 }},
+ { 46, 0, 10, 3, { 0 }},
+ { 47, 0, 2, 5, { 0 }},
+ { 48, 0, 2, 7, { 0 }},
+ { 49, 0, 2, 7, { 0 }},
+ { 50, 0, 2, 7, { 0 }},
+ { 51, 0, 2, 7, { 0 }},
+ { 52, 0, 2, 7, { 0 }},
+ { 53, 0, 2, 7, { 0 }},
+ { 54, 0, 2, 7, { 0 }},
+ { 55, 0, 2, 7, { 0 }},
+ { 56, 0, 2, 7, { 0 }},
+ { 57, 0, 2, 7, { 0 }},
+ { 58, 0, 4, 3, { 0 }},
+ { 59, 0, 4, 3, { 0 }},
+ { 60, 0, 4, 8, { 0 }},
+ { 61, 0, 6, 6, { 0 }},
+ { 62, 0, 4, 8, { 0 }},
+ { 63, 0, 2, 7, { 0 }},
+ { 64, 0, 2, 8, { 0 }},
+ { 65, 0, 2, 8, { 0 }},
+ { 66, 0, 2, 8, { 0 }},
+ { 67, 0, 2, 8, { 0 }},
+ { 68, 0, 2, 8, { 0 }},
+ { 69, 0, 2, 8, { 0 }},
+ { 70, 0, 2, 8, { 0 }},
+ { 71, 0, 2, 8, { 0 }},
+ { 72, 0, 2, 8, { 0 }},
+ { 73, 0, 2, 3, { 0 }},
+ { 74, 0, 2, 6, { 0 }},
+ { 75, 0, 2, 8, { 0 }},
+ { 76, 0, 2, 7, { 0 }},
+ { 77, 0, 2, 10, { 0 }},
+ { 78, 0, 2, 8, { 0 }},
+ { 79, 0, 2, 8, { 0 }},
+ { 80, 0, 2, 8, { 0 }},
+ { 81, 0, 2, 8, { 0 }},
+ { 82, 0, 2, 8, { 0 }},
+ { 83, 0, 2, 8, { 0 }},
+ { 84, 0, 2, 7, { 0 }},
+ { 85, 0, 2, 8, { 0 }},
+ { 86, 0, 2, 8, { 0 }},
+ { 87, 0, 2, 9, { 0 }},
+ { 88, 0, 2, 8, { 0 }},
+ { 89, 0, 2, 7, { 0 }},
+ { 90, 0, 2, 8, { 0 }},
+ { 91, 0, 2, 5, { 0 }},
+ { 92, 0, 2, 5, { 0 }},
+ { 93, 0, 2, 5, { 0 }},
+ { 94, 0, 2, 7, { 0 }},
+ { 95, 0, 14, 8, { 0 }},
+ { 96, 0, 2, 5, { 0 }},
+ { 97, 0, 5, 7, { 0 }},
+ { 98, 0, 2, 7, { 0 }},
+ { 99, 0, 5, 7, { 0 }},
+ { 100, 0, 2, 7, { 0 }},
+ { 101, 0, 5, 7, { 0 }},
+ { 102, 0, 2, 5, { 0 }},
+ { 103, 0, 5, 7, { 0 }},
+ { 104, 0, 2, 7, { 0 }},
+ { 105, 0, 2, 3, { 0 }},
+ { 106, 0, 2, 6, { 0 }},
+ { 107, 0, 2, 7, { 0 }},
+ { 108, 0, 2, 4, { 0 }},
+ { 109, 0, 5, 9, { 0 }},
+ { 110, 0, 5, 7, { 0 }},
+ { 111, 0, 5, 7, { 0 }},
+ { 112, 0, 5, 7, { 0 }},
+ { 113, 0, 5, 7, { 0 }},
+ { 114, 0, 5, 6, { 0 }},
+ { 115, 0, 5, 7, { 0 }},
+ { 116, 0, 2, 5, { 0 }},
+ { 117, 0, 5, 7, { 0 }},
+ { 118, 0, 5, 7, { 0 }},
+ { 119, 0, 5, 9, { 0 }},
+ { 120, 0, 5, 7, { 0 }},
+ { 121, 0, 5, 7, { 0 }},
+ { 122, 0, 5, 7, { 0 }},
+ { 123, 0, 2, 6, { 0 }},
+ { 124, 0, 2, 3, { 0 }},
+ { 125, 0, 2, 6, { 0 }},
+ { 126, 0, 6, 8, { 0 }},
+ { 161, 0, 5, 3, { 0 }},
+ { 162, 0, 3, 7, { 0 }},
+ { 163, 0, 2, 8, { 0 }},
+ { 8364, 0, 3, 8, { 0 }},
+ { 165, 0, 2, 7, { 0 }},
+ { 352, 0, 1, 8, { 0 }},
+ { 167, 0, 2, 7, { 0 }},
+ { 353, 0, 2, 7, { 0 }},
+ { 169, 0, 2, 8, { 0 }},
+ { 170, 0, 2, 6, { 0 }},
+ { 171, 0, 6, 8, { 0 }},
+ { 172, 0, 7, 7, { 0 }},
+ { 174, 0, 2, 8, { 0 }},
+ { 175, 1, 3, 14, { 0 }},
+ { 176, 0, 2, 5, { 0 }},
+ { 177, 0, 4, 7, { 0 }},
+ { 178, 0, 2, 5, { 0 }},
+ { 179, 0, 2, 5, { 0 }},
+ { 381, 0, 1, 8, { 0 }},
+ { 181, 0, 5, 7, { 0 }},
+ { 182, 0, 2, 8, { 0 }},
+ { 183, 0, 6, 3, { 0 }},
+ { 382, 0, 2, 7, { 0 }},
+ { 185, 0, 2, 4, { 0 }},
+ { 186, 0, 2, 5, { 0 }},
+ { 187, 0, 6, 8, { 0 }},
+ { 338, 0, 2, 10, { 0 }},
+ { 339, 0, 5, 9, { 0 }},
+ { 376, 0, 1, 7, { 0 }},
+ { 191, 0, 3, 7, { 0 }},
+ { 192, 0, 1, 8, { 0 }},
+ { 193, 0, 1, 8, { 0 }},
+ { 194, 0, 1, 8, { 0 }},
+ { 195, 0, 1, 8, { 0 }},
+ { 196, 0, 1, 8, { 0 }},
+ { 197, 0, 1, 8, { 0 }},
+ { 198, 0, 2, 10, { 0 }},
+ { 199, 0, 2, 8, { 0 }},
+ { 200, 0, 1, 8, { 0 }},
+ { 201, 0, 1, 8, { 0 }},
+ { 202, 0, 1, 8, { 0 }},
+ { 203, 0, 1, 8, { 0 }},
+ { 204, 0, 1, 4, { 0 }},
+ { 205, 0, 1, 4, { 0 }},
+ { 206, 0, 1, 6, { 0 }},
+ { 207, 0, 1, 6, { 0 }},
+ { 208, 0, 2, 9, { 0 }},
+ { 209, 0, 1, 8, { 0 }},
+ { 210, 0, 1, 8, { 0 }},
+ { 211, 0, 1, 8, { 0 }},
+ { 212, 0, 1, 8, { 0 }},
+ { 213, 0, 1, 8, { 0 }},
+ { 214, 0, 1, 8, { 0 }},
+ { 215, 0, 5, 8, { 0 }},
+ { 216, 0, 1, 8, { 0 }},
+ { 217, 0, 1, 8, { 0 }},
+ { 218, 0, 1, 8, { 0 }},
+ { 219, 0, 1, 8, { 0 }},
+ { 220, 0, 1, 8, { 0 }},
+ { 221, 0, 1, 7, { 0 }},
+ { 222, 0, 2, 8, { 0 }},
+ { 223, 0, 2, 8, { 0 }},
+ { 224, 0, 2, 7, { 0 }},
+ { 225, 0, 2, 7, { 0 }},
+ { 226, 0, 2, 7, { 0 }},
+ { 227, 0, 2, 7, { 0 }},
+ { 228, 0, 2, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 5, 9, { 0 }},
+ { 231, 0, 5, 7, { 0 }},
+ { 232, 0, 2, 7, { 0 }},
+ { 233, 0, 2, 7, { 0 }},
+ { 234, 0, 2, 7, { 0 }},
+ { 235, 0, 2, 7, { 0 }},
+ { 236, 0, 2, 4, { 0 }},
+ { 237, 0, 2, 4, { 0 }},
+ { 238, 0, 2, 6, { 0 }},
+ { 239, 0, 2, 6, { 0 }},
+ { 240, 0, 2, 7, { 0 }},
+ { 241, 0, 2, 7, { 0 }},
+ { 242, 0, 2, 7, { 0 }},
+ { 243, 0, 2, 7, { 0 }},
+ { 244, 0, 2, 7, { 0 }},
+ { 245, 0, 2, 7, { 0 }},
+ { 246, 0, 2, 7, { 0 }},
+ { 247, 0, 4, 7, { 0 }},
+ { 248, 0, 3, 8, { 0 }},
+ { 249, 0, 2, 7, { 0 }},
+ { 250, 0, 2, 7, { 0 }},
+ { 251, 0, 2, 7, { 0 }},
+ { 252, 0, 2, 7, { 0 }},
+ { 253, 0, 2, 7, { 0 }},
+ { 254, 0, 2, 7, { 0 }},
+ { 255, 0, 2, 7, { 0 }},
+};
+
+// Style loading function: Enefete
+static void GuiLoadStyleEnefete(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < ENEFETE_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(enefeteStyleProps[i].controlId, enefeteStyleProps[i].propertyId, enefeteStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int enefeteFontDataSize = 0;
+ unsigned char *data = DecompressData(enefeteFontData, ENEFETE_STYLE_FONT_ATLAS_COMP_SIZE, &enefeteFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, enefeteFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, enefeteFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/enefete/style_enefete.old.rgs b/external/raygui-4.0/styles/enefete/style_enefete.old.rgs
new file mode 100644
index 0000000..50b0c1f
Binary files /dev/null and b/external/raygui-4.0/styles/enefete/style_enefete.old.rgs differ
diff --git a/external/raygui-4.0/styles/enefete/style_enefete.png b/external/raygui-4.0/styles/enefete/style_enefete.png
new file mode 100644
index 0000000..1f5b5a1
Binary files /dev/null and b/external/raygui-4.0/styles/enefete/style_enefete.png differ
diff --git a/external/raygui-4.0/styles/enefete/style_enefete.rgs b/external/raygui-4.0/styles/enefete/style_enefete.rgs
new file mode 100644
index 0000000..87b1274
Binary files /dev/null and b/external/raygui-4.0/styles/enefete/style_enefete.rgs differ
diff --git a/external/raygui-4.0/styles/enefete/style_enefete.txt.rgs b/external/raygui-4.0/styles/enefete/style_enefete.txt.rgs
new file mode 100644
index 0000000..d879663
--- /dev/null
+++ b/external/raygui-4.0/styles/enefete/style_enefete.txt.rgs
@@ -0,0 +1,27 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 16 charset.txt GenericMobileSystemNuevo.ttf
+p 00 00 0x1980d5ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x4df3ebff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0x103e60ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xe7e2f7ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0x23d4ddff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xf1f1f1ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0x6413a6ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xea66d9ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x9f00bbff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x4b909eff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x73c7d0ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x448894ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x00000010 TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0x1d3f6cff LINE_COLOR
+p 00 19 0x29c9e5ff BACKGROUND_COLOR
+p 00 20 0x00000018 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/jungle/Pixel Intv.otf b/external/raygui-4.0/styles/jungle/Pixel Intv.otf
new file mode 100644
index 0000000..e8c54a7
Binary files /dev/null and b/external/raygui-4.0/styles/jungle/Pixel Intv.otf differ
diff --git a/external/raygui-4.0/styles/jungle/README.md b/external/raygui-4.0/styles/jungle/README.md
new file mode 100644
index 0000000..da97773
--- /dev/null
+++ b/external/raygui-4.0/styles/jungle/README.md
@@ -0,0 +1,27 @@
+## style: jungle
+
+Sunset in the jungle, trees do not let to see the last rays of sun on the horizon, small creek in the path, mug on the shoes, a touch of danger and the adventure feeling, get into your jeep and drive with this style.
+
+![jungle style table](style_jungle.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_jungle.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_jungle.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_jungle.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_jungle.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_jungle.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![jungle style screen](screenshot.png)
+
+## about font
+
+"Pixel Intv" font by [Pixel Sagas](http://www.pixelsagas.com) (Neale and Shayna Davidson).
+
+100% free font, downloaded from dafont.com: [pixel-intv](https://www.dafont.com/pixel-intv.font)
diff --git a/external/raygui-4.0/styles/jungle/charset.txt b/external/raygui-4.0/styles/jungle/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/jungle/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/jungle/font_readme.txt b/external/raygui-4.0/styles/jungle/font_readme.txt
new file mode 100644
index 0000000..b4e6c6e
--- /dev/null
+++ b/external/raygui-4.0/styles/jungle/font_readme.txt
@@ -0,0 +1,47 @@
+Shareware/ Font License
+
+Pixel Sagas Freeware Fonts EULA (End User License Agreement) and Software Inclusion Agreement
+
+"Purchaser" and "User" may be used interchangeably in this agreement.
+
+"Pixel Sagas" and "Neale Davidson" may be used interchangeably in this agreement. These all refer to the intellectual and legal property of Neale Davidson.
+
+Usage
+
+Pixel Saga's Shareware Fonts are free to use for personal, non-commercial purposes. No payment is necessary to use Pixel Saga's Freeware Fonts for personal use, and there is no limit to the amount of prints, pages, or other medium to be produced using them. However, you cannot offer the font for commercial sale, or offer for direct download. The inclusion othe font name and/or site URL in the credits or documentation when it is used is appreciated, but this is not mandatory.
+
+Payment
+
+Payment is not required for the use of Pixel Saga's Shareware Fonts. Commercial use requires a modest fee which can be paid through the pixelsagas.com web site through Paypal.com's services. The transaction receipt for any shareware "commercial license" purchase will suffice as proof of license.
+
+Support
+
+Font installation help is available at http://www.pixelsagas.com. If you experience problems with any Pixel Saga's Freeware font (such as spacing issues or missing characters), please verify that you have the correct and current version of the fonts. In the case of Freeware fonts, downloading the font directly from the Pixel Sagas site will ensure that the font files have not been altered.
+
+Software Inclusion Agreement
+
+Pixel Saga's software products are protected by copyright laws and International copyright treaties, as well as other intellectual property laws and treaties. All Pixel Saga's software products are licensed, not sold.
+
+1) GRANT OF LICENSE
+
+This document grants the user the following rights:
+
+Installation and Use. The user may install and use an unlimited number of copies of the software product. The user may not offer Pixel Sagas freeware fonts for direct download unless the user has received explicit, written permission from Neale Davidson. Otherwise please direct users to the http://www.pixelsagas.com website. Pixel Sagas freeware fonts may, however, be embedded for web, publication, or general software use.
+
+2) WARRANTIES
+
+None
+
+Pixel Sagas expressly disclaims any warranty for the software product. The software product and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the software product remains with the user.
+
+No Liability For Consequential Damages.
+
+In no event shall Neale Davidson or Pixel Sagas be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if Pixel Sagas has been advised of the possibility of such damages.
+
+3) MISCELLANEOUS
+
+Should the user have any questions concerning this document or you desire to contact Neale Davidson for any reason, please email jaynz@pixelsagas.com .
+
+Governing Law
+
+This agreement is governed by and subject to the laws of the United States of America.
diff --git a/external/raygui-4.0/styles/jungle/screenshot.png b/external/raygui-4.0/styles/jungle/screenshot.png
new file mode 100644
index 0000000..a8a7dbb
Binary files /dev/null and b/external/raygui-4.0/styles/jungle/screenshot.png differ
diff --git a/external/raygui-4.0/styles/jungle/style_jungle.h b/external/raygui-4.0/styles/jungle/style_jungle.h
new file mode 100644
index 0000000..2213dda
--- /dev/null
+++ b/external/raygui-4.0/styles/jungle/style_jungle.h
@@ -0,0 +1,578 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleJungle(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define JUNGLE_STYLE_PROPS_COUNT 17
+
+// Custom style name: Jungle
+static const GuiStyleProp jungleStyleProps[JUNGLE_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x60827dff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x2c3334ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x82a29fff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0x5f9aa8ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x334e57ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0x6aa9b8ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xa9cb8dff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x3b6357ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x97af81ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x5b6462ff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x2c3334ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x666b69ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x0000000c }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x638465ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x2b3a3aff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000012 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Pixel Intv.otf" (size: 12, spacing: 0)
+
+#define JUNGLE_STYLE_FONT_ATLAS_COMP_SIZE 2030
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char jungleFontData[JUNGLE_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0x9d, 0x3d, 0x8e, 0x25, 0x35, 0x14, 0x85, 0x8d, 0xe9, 0x8c, 0x10, 0x11, 0x80, 0x84, 0x20, 0x41, 0x22, 0x21, 0x61, 0x34,
+ 0x12, 0x64, 0xb3, 0x00, 0x62, 0x84, 0x08, 0x10, 0x11, 0x09, 0xb0, 0x07, 0x66, 0x65, 0x93, 0x90, 0xb3, 0x01, 0x76, 0xc1,
+ 0x02, 0x2e, 0x9a, 0xbf, 0x9e, 0x9f, 0xae, 0xb2, 0x7d, 0x8f, 0xaf, 0xcb, 0xae, 0x7a, 0x5f, 0x7f, 0x9a, 0xd1, 0xcc, 0xf3,
+ 0x73, 0x95, 0xcb, 0xc7, 0xd7, 0x55, 0xaf, 0x7d, 0xde, 0xb5, 0x25, 0x00, 0x00, 0x00, 0x80, 0x07, 0x3c, 0xff, 0xd9, 0x7e,
+ 0x6d, 0xab, 0x24, 0xbd, 0x2a, 0x69, 0x3f, 0xd6, 0xeb, 0xd7, 0x5f, 0x96, 0xe4, 0xdd, 0x77, 0x6c, 0x1f, 0x31, 0xef, 0xb4,
+ 0x61, 0xaf, 0xd5, 0xfb, 0x2d, 0x4b, 0xae, 0x92, 0xfd, 0xe3, 0xef, 0xf7, 0x57, 0x72, 0x5c, 0xc3, 0xbb, 0x3f, 0xc9, 0x71,
+ 0x2d, 0xe5, 0x7a, 0xa3, 0xf5, 0x2f, 0xf7, 0xc1, 0x7e, 0xd9, 0xcb, 0x3f, 0xcf, 0x7b, 0x22, 0x3b, 0x8e, 0xb9, 0xff, 0xfe,
+ 0xe4, 0x1a, 0x81, 0xfe, 0x91, 0xe1, 0xeb, 0xdd, 0xd2, 0xbb, 0x6b, 0xd7, 0x60, 0xce, 0x16, 0xbc, 0x7e, 0x7d, 0xa4, 0xfe,
+ 0xe9, 0xfe, 0x1c, 0xed, 0xf1, 0x5f, 0x53, 0xc5, 0xec, 0x6e, 0xb3, 0x27, 0x52, 0x51, 0x9b, 0x2c, 0x9c, 0x29, 0x62, 0x34,
+ 0xa7, 0xa0, 0xde, 0xcd, 0xc5, 0x6b, 0x30, 0x41, 0x7f, 0x6d, 0x84, 0x46, 0x1d, 0x47, 0x8b, 0xff, 0xe7, 0xdc, 0xbd, 0x18,
+ 0x01, 0xe5, 0xa3, 0xf6, 0xb7, 0x38, 0x2a, 0xfe, 0xd3, 0x50, 0xf5, 0x7b, 0xf4, 0x3f, 0x62, 0xfe, 0x2f, 0xbf, 0xbf, 0xdc,
+ 0x67, 0xdb, 0xc7, 0xcb, 0xaf, 0xe2, 0xdf, 0x7f, 0xf7, 0x8c, 0xd0, 0xdf, 0x7f, 0xff, 0x1f, 0xab, 0x7e, 0xc4, 0xfc, 0xbf,
+ 0xe2, 0x73, 0x64, 0xed, 0x3e, 0xbe, 0x3d, 0x76, 0x6c, 0x78, 0xfc, 0xcf, 0xa0, 0xa4, 0x7e, 0xed, 0xf9, 0xcf, 0x3a, 0xe6,
+ 0xd9, 0xd1, 0xf1, 0xaf, 0x1c, 0xeb, 0x75, 0x4f, 0x98, 0x10, 0x9f, 0x67, 0xd5, 0xbf, 0xa4, 0x3e, 0x44, 0xcc, 0x35, 0x9e,
+ 0xbb, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x35, 0x57, 0x4c, 0xca, 0xeb, 0xef,
+ 0x91, 0x2b, 0x91, 0xa3, 0xca, 0xda, 0xdd, 0x06, 0x1e, 0xe7, 0x4a, 0x16, 0x7a, 0x6c, 0x56, 0xbf, 0x8c, 0x72, 0xfb, 0x25,
+ 0xb7, 0x37, 0xa3, 0xa5, 0x35, 0xea, 0xf9, 0x7a, 0xf4, 0xcf, 0xce, 0xb5, 0xd7, 0xb2, 0x43, 0x6f, 0xcf, 0xcf, 0xb8, 0xbf,
+ 0x72, 0xdd, 0x7b, 0x7d, 0xde, 0x32, 0xdf, 0x0c, 0x90, 0x0e, 0x89, 0xff, 0x36, 0x0f, 0xd3, 0x18, 0x77, 0xe3, 0xb6, 0xcf,
+ 0xac, 0xd4, 0xd6, 0x3b, 0xb7, 0xa3, 0xf0, 0xcd, 0x6a, 0xf3, 0xd8, 0xf1, 0x1d, 0xed, 0xfa, 0x54, 0x1d, 0x25, 0xca, 0x98,
+ 0x54, 0x1c, 0xac, 0x11, 0xf3, 0x7f, 0x4c, 0xfc, 0x97, 0xc6, 0xa9, 0xbd, 0xf7, 0x27, 0x66, 0x1e, 0x9f, 0xa5, 0xff, 0x88,
+ 0xb9, 0x3a, 0x35, 0xcc, 0x0a, 0x6a, 0x5b, 0xb4, 0xfb, 0xbf, 0xe2, 0xd4, 0x29, 0xb9, 0x95, 0xf4, 0xe7, 0xa9, 0x19, 0xf1,
+ 0xdf, 0x13, 0xe3, 0xda, 0xfc, 0x5f, 0xd6, 0x3f, 0xce, 0xdd, 0x66, 0x53, 0x9e, 0xa6, 0x5b, 0x62, 0x6c, 0xad, 0xfb, 0x3f,
+ 0x44, 0xfa, 0x19, 0xe7, 0x7d, 0x9e, 0x42, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0xeb, 0xc7, 0x3b, 0xca, 0x53, 0x62, 0x8d, 0x59, 0x7c, 0xf6, 0xfd, 0x5a, 0x47, 0xb9, 0xf5, 0x8e, 0xef, 0xef, 0x68,
+ 0xdf, 0x47, 0xc4, 0x9a, 0xb4, 0x92, 0xc1, 0xac, 0xdf, 0x8b, 0x68, 0x4b, 0x38, 0xf2, 0x46, 0xf4, 0xdb, 0x4c, 0xfd, 0x95,
+ 0xf6, 0xe8, 0xfa, 0x9b, 0x98, 0x61, 0xb0, 0x96, 0x19, 0x66, 0x2d, 0xfd, 0x15, 0xd7, 0x41, 0x8f, 0xfe, 0xf5, 0xb9, 0x2a,
+ 0x15, 0xf4, 0xf0, 0xcf, 0xf1, 0xaa, 0xfe, 0x26, 0xe6, 0x7d, 0x1c, 0x73, 0x17, 0x1b, 0xa3, 0xbf, 0xd2, 0x6f, 0x57, 0x99,
+ 0xff, 0xeb, 0xc7, 0xcc, 0xe2, 0xfc, 0x6f, 0xd5, 0x59, 0xc5, 0xc2, 0xdd, 0xa8, 0xfe, 0x98, 0x6a, 0xed, 0x9f, 0xdb, 0xd5,
+ 0x3f, 0x0d, 0xd1, 0x7f, 0xcc, 0x19, 0xcf, 0x73, 0xff, 0x57, 0xb2, 0x57, 0xcf, 0xf0, 0xb9, 0xf5, 0x79, 0xc3, 0x6b, 0xa5,
+ 0x47, 0xf4, 0xcc, 0xb8, 0xf9, 0x1f, 0x17, 0xe0, 0x79, 0x5c, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x47, 0xac, 0x51, 0xe8, 0x6b, 0x67, 0x23, 0x56, 0x00, 0x1f, 0xbe, 0x9e, 0x1b, 0xd6, 0x30, 0xdf, 0x7f,
+ 0x3d, 0xef, 0x38, 0x46, 0xcc, 0x99, 0xf3, 0x4f, 0xdb, 0x8f, 0xb7, 0x35, 0x0f, 0x9a, 0xee, 0x20, 0x8c, 0x58, 0x07, 0x3c,
+ 0x5e, 0xff, 0xd4, 0xb4, 0x1e, 0xfb, 0x50, 0xc9, 0x2c, 0x78, 0x86, 0xb2, 0x33, 0xe3, 0x53, 0x29, 0x43, 0x94, 0xdf, 0xcd,
+ 0x54, 0xef, 0x05, 0x25, 0xd7, 0x5d, 0xed, 0x68, 0xda, 0x0e, 0xc5, 0x25, 0x77, 0x4c, 0xcd, 0xcb, 0xe2, 0xbf, 0xf2, 0xec,
+ 0xbe, 0xb6, 0xdc, 0x30, 0x07, 0x8c, 0xf7, 0x48, 0x27, 0x77, 0x3c, 0xf6, 0xf9, 0xee, 0xc6, 0xeb, 0x9f, 0x1a, 0x3c, 0x7e,
+ 0xd1, 0x8e, 0x14, 0xab, 0xec, 0x7e, 0xab, 0x8c, 0x80, 0xd1, 0xfa, 0xd7, 0xae, 0x55, 0x77, 0x09, 0xa5, 0xd0, 0x71, 0x13,
+ 0xad, 0x7f, 0xcb, 0x38, 0x8d, 0x1e, 0xc1, 0xca, 0x08, 0x38, 0x26, 0xfe, 0xcd, 0xad, 0x7f, 0x79, 0x6e, 0x88, 0xef, 0x3d,
+ 0xc5, 0x05, 0xa4, 0xcd, 0x28, 0xbd, 0x6e, 0x35, 0x45, 0xc5, 0x2c, 0xcd, 0x1c, 0x47, 0x3c, 0x41, 0x6b, 0x7b, 0x55, 0x47,
+ 0x3b, 0x36, 0xb5, 0x9e, 0x38, 0x5e, 0x7f, 0x93, 0x77, 0xfc, 0xce, 0xcb, 0xed, 0x7e, 0xad, 0x45, 0x9d, 0xee, 0xd8, 0x8b,
+ 0x8f, 0xff, 0xf5, 0xbe, 0x8d, 0x76, 0x44, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xdb, 0xcc, 0x51, 0xe0, 0xcf, 0x54, 0x53, 0xaf, 0xa1, 0xee, 0x9d, 0x75, 0xe4, 0xde, 0xb9, 0xa3, 0xf6, 0xb7, 0xd3, 0xf3,
+ 0x82, 0xd9, 0x90, 0x1d, 0xe0, 0xe2, 0xd7, 0xcd, 0xfa, 0xb2, 0x98, 0xd5, 0x7a, 0x48, 0xcd, 0xb8, 0xe5, 0xf5, 0x60, 0xf4,
+ 0xf8, 0x7a, 0x54, 0xcf, 0x47, 0xbc, 0x0f, 0x2f, 0xc6, 0xdb, 0xa6, 0xc5, 0xbf, 0xe6, 0x0b, 0x59, 0x4d, 0xff, 0x74, 0x90,
+ 0x3f, 0xaf, 0x47, 0xff, 0xde, 0xdd, 0x9f, 0x75, 0x47, 0x96, 0xbf, 0x57, 0xaf, 0xa0, 0x7f, 0x9b, 0x7b, 0x57, 0xf1, 0x11,
+ 0x46, 0xfb, 0xf0, 0x66, 0xe9, 0x6f, 0xd2, 0xde, 0xb9, 0x3d, 0xfa, 0xf7, 0xf9, 0xe5, 0x8f, 0x8b, 0x7f, 0xfd, 0x8c, 0x69,
+ 0xc8, 0xce, 0xe8, 0xbd, 0xd1, 0xea, 0xcb, 0xd4, 0x38, 0xc3, 0xa9, 0x15, 0xef, 0x97, 0x1b, 0xe5, 0xec, 0x9a, 0xeb, 0x5e,
+ 0x8c, 0xf2, 0xaf, 0xf6, 0x66, 0xff, 0x9e, 0xa1, 0x3f, 0xde, 0xb1, 0x6b, 0x8f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5b, 0x5b, 0xc7, 0x89, 0xdb, 0x8f, 0xca, 0x9b, 0xd5, 0xcd, 0x36, 0x33, 0x7a, 0xa8,
+ 0xb9, 0x63, 0xbc, 0xde, 0x8a, 0xd2, 0x5a, 0xe5, 0x77, 0xf6, 0xe5, 0x3d, 0x8f, 0xec, 0x13, 0x57, 0xef, 0xd4, 0xea, 0xe6,
+ 0xb7, 0xea, 0x66, 0x77, 0xed, 0xd7, 0x59, 0x50, 0xb2, 0x70, 0x66, 0xbf, 0x03, 0xc0, 0x97, 0xab, 0xcd, 0xf7, 0x6a, 0x2e,
+ 0x3a, 0x45, 0x62, 0x5c, 0x17, 0x6a, 0x86, 0xbe, 0xc7, 0xef, 0xf4, 0xc1, 0xa3, 0xe0, 0xba, 0xf9, 0x1d, 0x25, 0x7d, 0xb5,
+ 0xf3, 0x7d, 0x66, 0xc3, 0xec, 0xae, 0xeb, 0xd3, 0x3f, 0xbb, 0x73, 0xb5, 0xf9, 0xd5, 0x89, 0xf1, 0x15, 0x6a, 0x59, 0x71,
+ 0x4a, 0xc7, 0xfc, 0xb2, 0xf0, 0xbf, 0xda, 0x35, 0xd5, 0xeb, 0xbe, 0x3d, 0xf3, 0xfa, 0x6b, 0xdf, 0xdd, 0xff, 0xed, 0xad,
+ 0xeb, 0x75, 0xf2, 0x68, 0x2e, 0xae, 0xde, 0x11, 0x10, 0x99, 0x4d, 0x51, 0x75, 0x64, 0xb5, 0xe8, 0xbf, 0x77, 0xce, 0x36,
+ 0xfd, 0xdf, 0xfc, 0xdb, 0x57, 0xbb, 0x14, 0xff, 0x9a, 0xfe, 0x71, 0x3e, 0xf7, 0xb1, 0xf1, 0x3f, 0x22, 0x2b, 0xde, 0x5e,
+ 0x49, 0x6b, 0xfc, 0x6b, 0x63, 0xa7, 0x27, 0xfe, 0x4b, 0xf7, 0x7f, 0xbf, 0xfe, 0xaa, 0x0b, 0xee, 0x68, 0xfd, 0x93, 0xec,
+ 0x53, 0xd5, 0x9e, 0x1a, 0xeb, 0x3d, 0xd9, 0x33, 0x77, 0x94, 0xee, 0xff, 0xaa, 0x86, 0xd1, 0xf1, 0xbf, 0x9e, 0xfe, 0xa9,
+ 0xc3, 0x59, 0xeb, 0x1d, 0x53, 0xad, 0x3d, 0x69, 0xe2, 0x0c, 0xbe, 0xff, 0xfc, 0x7f, 0xac, 0xfe, 0xb1, 0xce, 0x4a, 0x2d,
+ 0xab, 0xe3, 0x8a, 0xfc, 0xf2, 0xd6, 0x27, 0xa9, 0xc7, 0xf6, 0xbd, 0x6b, 0xfe, 0xaf, 0xd5, 0xed, 0x3b, 0xf3, 0xa8, 0xba,
+ 0x10, 0x39, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xa3, 0xd7, 0x89, 0xf6, 0xe9,
+ 0xa6, 0x43, 0xa4, 0x56, 0x6f, 0x74, 0x79, 0xcd, 0xd3, 0xf6, 0x95, 0x7d, 0x63, 0x9f, 0x3f, 0x78, 0xf5, 0x99, 0x3d, 0xb3,
+ 0x5f, 0x27, 0xb4, 0x35, 0xef, 0xee, 0x70, 0xbc, 0xf5, 0xa3, 0xbc, 0xa7, 0xb4, 0x8a, 0xd1, 0xe3, 0x44, 0xfb, 0xc1, 0x9e,
+ 0xd8, 0x1f, 0x1b, 0x47, 0xad, 0xd5, 0x1b, 0x5d, 0x5e, 0xd2, 0xff, 0x33, 0xfb, 0xd7, 0xfe, 0xb1, 0xa7, 0xf6, 0xc5, 0x66,
+ 0xad, 0xbf, 0x0e, 0x6f, 0x6b, 0xc9, 0xcd, 0xe3, 0xd9, 0x47, 0x59, 0xcb, 0x03, 0xd5, 0xe7, 0x44, 0xf9, 0xd9, 0x3e, 0xb0,
+ 0x1f, 0x37, 0x7c, 0x68, 0xb5, 0x7a, 0xa3, 0xcb, 0x4b, 0xfa, 0xff, 0x69, 0x66, 0x7f, 0xdb, 0x6f, 0xf6, 0xe1, 0x83, 0x92,
+ 0x27, 0xf6, 0x64, 0x42, 0x5b, 0x93, 0xdd, 0xbd, 0x68, 0xe7, 0x5d, 0xe7, 0x3e, 0xda, 0x6a, 0xfc, 0xf7, 0x38, 0xd1, 0x3e,
+ 0xb6, 0x9f, 0xec, 0x5b, 0xc1, 0x85, 0x30, 0x53, 0xff, 0xaf, 0xed, 0xbf, 0x1d, 0xfd, 0x35, 0x47, 0x45, 0x6f, 0x79, 0x6b,
+ 0xfc, 0xdb, 0xa0, 0xfc, 0x6f, 0x3d, 0xfa, 0xcf, 0xea, 0xb3, 0x76, 0x6f, 0xe6, 0x56, 0x9f, 0x7c, 0x64, 0x4f, 0x17, 0xd2,
+ 0xbf, 0x76, 0xff, 0x4f, 0x8e, 0x8c, 0xb3, 0xd1, 0xf7, 0xff, 0x33, 0xeb, 0x5f, 0x6a, 0xdf, 0xef, 0x0b, 0xe9, 0xdf, 0xe2,
+ 0xb0, 0x1a, 0xe7, 0x31, 0x19, 0xe3, 0x44, 0x43, 0xff, 0x38, 0xfd, 0xf5, 0xd8, 0x1e, 0xef, 0x81, 0x53, 0xeb, 0x8d, 0x2e,
+ 0xaf, 0xe1, 0xd1, 0x7f, 0x76, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xb4,
+ 0xe4, 0x8b, 0x2b, 0xaf, 0x3e, 0xe7, 0xe2, 0xda, 0x62, 0x69, 0xd5, 0x31, 0x17, 0x4a, 0x14, 0xa7, 0x43, 0xdb, 0xce, 0xc2,
+ 0x26, 0xe6, 0x3a, 0x8c, 0xbd, 0xce, 0xfa, 0xb5, 0xc4, 0x9e, 0x6f, 0x0f, 0x7f, 0xbe, 0xb8, 0xd6, 0xb6, 0xa4, 0x62, 0xf6,
+ 0xb0, 0xbc, 0xab, 0x71, 0x4f, 0x9f, 0x99, 0xbc, 0x8a, 0x5e, 0x7b, 0x4f, 0xfc, 0x75, 0x1e, 0x7b, 0xbe, 0x9e, 0x7c, 0x31,
+ 0x67, 0xcf, 0x70, 0xe1, 0xd1, 0xff, 0xd6, 0x68, 0x75, 0x52, 0x79, 0x33, 0xa0, 0xac, 0x5a, 0xa6, 0xe6, 0x0f, 0x3d, 0xdb,
+ 0x75, 0x46, 0xea, 0xaf, 0xc4, 0xd5, 0x59, 0xca, 0x3c, 0xd7, 0x79, 0x54, 0xd9, 0xc8, 0xe3, 0xaa, 0xfa, 0x9f, 0x59, 0xe3,
+ 0xde, 0xfb, 0xff, 0xad, 0xeb, 0x7f, 0xf6, 0xb9, 0xaf, 0xc5, 0x21, 0x6f, 0xe2, 0x3e, 0xe1, 0x23, 0xca, 0x8e, 0xd4, 0xbf,
+ 0xc7, 0x9d, 0x76, 0xb6, 0x18, 0x6f, 0xbd, 0x9e, 0x5b, 0x8a, 0xff, 0x51, 0xcf, 0xd5, 0xe7, 0xd3, 0xdf, 0xd0, 0xff, 0xa6,
+ 0xf5, 0x4f, 0x37, 0xf9, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xa5, 0xf6, 0x3b, 0x55,
+ 0xab, 0xec, 0x0c, 0x6a, 0x8b, 0xfb, 0x02, 0xdb, 0xae, 0x6f, 0x0d, 0xcf, 0x5f, 0x96, 0xf6, 0xce, 0xec, 0xfb, 0x9d, 0xaf,
+ 0xde, 0x77, 0x65, 0xaf, 0xe1, 0x3a, 0xbe, 0x40, 0x3d, 0x73, 0xd6, 0xd1, 0x9e, 0xbf, 0xd2, 0x4e, 0xbb, 0xca, 0x0e, 0xd6,
+ 0x31, 0xeb, 0x1e, 0xd7, 0xf1, 0xff, 0x6d, 0xbd, 0x9e, 0x4f, 0xb0, 0x5e, 0x32, 0x72, 0xdd, 0x4b, 0x1d, 0x5b, 0x56, 0xe8,
+ 0xdb, 0xb5, 0xd6, 0xbd, 0x6a, 0x25, 0xf9, 0x02, 0xde, 0xa6, 0xbe, 0x11, 0xac, 0xf8, 0xa6, 0x29, 0xbb, 0x1d, 0xdf, 0xcb,
+ 0x7e, 0xcc, 0x9d, 0xbb, 0x0f, 0xce, 0xa4, 0xf1, 0xc8, 0xfb, 0x7f, 0xdd, 0xdf, 0x1d, 0x79, 0xdf, 0x58, 0x4b, 0xff, 0x33,
+ 0x5c, 0x43, 0xdd, 0xef, 0x63, 0x43, 0xf4, 0xaf, 0xd7, 0x39, 0xb7, 0xfe, 0xab, 0xcd, 0x0d, 0xb3, 0xbc, 0x3b, 0xba, 0xfe,
+ 0xd7, 0xf5, 0x7e, 0xcd, 0x68, 0xe7, 0x2c, 0xed, 0x95, 0x71, 0x67, 0x85, 0xac, 0xd1, 0x57, 0xf0, 0xbd, 0xcd, 0x68, 0x27,
+ 0xbe, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x46, 0xf3, 0x39, 0xcd, 0xce, 0xe1, 0xb7, 0xba,
+ 0x9b, 0xef, 0xd8, 0xf3, 0xf5, 0x79, 0x00, 0x95, 0x96, 0x1e, 0x9b, 0xc3, 0xaf, 0x7f, 0x75, 0xe5, 0xec, 0x19, 0xfc, 0xea,
+ 0xab, 0x5c, 0x57, 0x5e, 0x3f, 0x68, 0x8b, 0xff, 0x5b, 0x76, 0x71, 0x6b, 0x33, 0xc0, 0xd1, 0xb9, 0x8d, 0x7a, 0xca, 0xfa,
+ 0xb2, 0xa2, 0xcc, 0x70, 0x1d, 0x7a, 0x33, 0xcd, 0xa8, 0x65, 0xbd, 0x2e, 0xc0, 0xf5, 0x33, 0xe3, 0xf5, 0xdd, 0xff, 0x57,
+ 0x5b, 0xcd, 0x8f, 0x2e, 0xd3, 0xf5, 0x3f, 0x4b, 0xfc, 0x47, 0x39, 0xd9, 0xd6, 0x58, 0xcd, 0x5f, 0x4b, 0xff, 0x24, 0xcc,
+ 0xb9, 0x47, 0x97, 0x79, 0xbe, 0xaf, 0x30, 0x7f, 0x0e, 0x9b, 0xa1, 0xbf, 0x75, 0xc6, 0xff, 0x95, 0xf3, 0x57, 0x5d, 0x25,
+ 0x8b, 0x25, 0xd9, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xcd, 0xfb, 0x67, 0x15,
+ 0x3f, 0xda, 0x3a, 0xde, 0x40, 0xc5, 0xfb, 0x12, 0x7d, 0x05, 0x3d, 0x59, 0xfc, 0x4c, 0xf0, 0xb5, 0x8d, 0x76, 0x0e, 0x95,
+ 0xf3, 0xf8, 0xad, 0xe4, 0x0d, 0xdc, 0xef, 0xbb, 0x1c, 0xee, 0xfb, 0x8c, 0xcf, 0xe2, 0x97, 0x96, 0xd4, 0xff, 0x7c, 0x0e,
+ 0xb7, 0xed, 0x92, 0x7c, 0x82, 0xbe, 0x5b, 0x71, 0xfd, 0xf6, 0xfc, 0x2b, 0xdc, 0x6a, 0x76, 0xbc, 0x51, 0x65, 0x4a, 0xcd,
+ 0x99, 0x99, 0x36, 0xcf, 0x93, 0xc7, 0x4d, 0xf3, 0x76, 0x1d, 0xeb, 0x52, 0x9a, 0xe5, 0x7d, 0xba, 0x05, 0xfd, 0xd3, 0xf2,
+ 0xee, 0x36, 0xf4, 0x47, 0x7f, 0x6b, 0xf0, 0x30, 0x9f, 0x47, 0xff, 0x73, 0x3b, 0xdc, 0xe6, 0x65, 0x1b, 0x36, 0xf9, 0x1b,
+ 0x0a, 0x3c, 0xeb, 0x5f, 0xe3, 0xd3, 0x8a, 0xf2, 0xfd, 0x2c, 0xf4, 0xbf, 0xee, 0xe7, 0xd4, 0xf3, 0x7d, 0x36, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xb2,
+ 0x0c, 0xa2, 0x3f, 0xfa, 0xdf, 0xb8, 0xfe, 0xff, 0x03 };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle jungleFontRecs[189] = {
+ { 4, 4, 5 , 12 },
+ { 17, 4, 2 , 7 },
+ { 27, 4, 5 , 3 },
+ { 40, 4, 5 , 5 },
+ { 53, 4, 6 , 7 },
+ { 67, 4, 7 , 7 },
+ { 82, 4, 5 , 7 },
+ { 95, 4, 3 , 3 },
+ { 106, 4, 4 , 8 },
+ { 118, 4, 4 , 8 },
+ { 130, 4, 5 , 5 },
+ { 143, 4, 5 , 5 },
+ { 156, 4, 2 , 3 },
+ { 166, 4, 5 , 1 },
+ { 179, 4, 2 , 2 },
+ { 189, 4, 7 , 7 },
+ { 204, 4, 7 , 6 },
+ { 219, 4, 6 , 6 },
+ { 233, 4, 6 , 6 },
+ { 4, 24, 6 , 6 },
+ { 18, 24, 6 , 6 },
+ { 32, 24, 6 , 6 },
+ { 46, 24, 6 , 6 },
+ { 60, 24, 6 , 6 },
+ { 74, 24, 6 , 6 },
+ { 88, 24, 6 , 6 },
+ { 102, 24, 2 , 5 },
+ { 112, 24, 2 , 6 },
+ { 122, 24, 3 , 5 },
+ { 133, 24, 5 , 3 },
+ { 146, 24, 3 , 5 },
+ { 157, 24, 6 , 7 },
+ { 171, 24, 7 , 7 },
+ { 186, 24, 6 , 7 },
+ { 200, 24, 6 , 7 },
+ { 214, 24, 6 , 7 },
+ { 228, 24, 6 , 7 },
+ { 4, 44, 6 , 7 },
+ { 18, 44, 6 , 7 },
+ { 32, 44, 6 , 7 },
+ { 46, 44, 6 , 7 },
+ { 60, 44, 6 , 7 },
+ { 74, 44, 6 , 7 },
+ { 88, 44, 6 , 7 },
+ { 102, 44, 6 , 7 },
+ { 116, 44, 7 , 7 },
+ { 131, 44, 6 , 7 },
+ { 145, 44, 6 , 7 },
+ { 159, 44, 6 , 7 },
+ { 173, 44, 7 , 8 },
+ { 188, 44, 6 , 7 },
+ { 202, 44, 6 , 7 },
+ { 216, 44, 6 , 7 },
+ { 230, 44, 6 , 7 },
+ { 4, 64, 6 , 7 },
+ { 18, 64, 7 , 7 },
+ { 33, 64, 6 , 7 },
+ { 47, 64, 6 , 7 },
+ { 61, 64, 6 , 7 },
+ { 75, 64, 4 , 8 },
+ { 87, 64, 7 , 7 },
+ { 102, 64, 4 , 8 },
+ { 114, 64, 4 , 2 },
+ { 126, 64, 6 , 1 },
+ { 140, 64, 2 , 2 },
+ { 150, 64, 6 , 5 },
+ { 164, 64, 6 , 7 },
+ { 178, 64, 6 , 5 },
+ { 192, 64, 6 , 7 },
+ { 206, 64, 6 , 5 },
+ { 220, 64, 6 , 7 },
+ { 234, 64, 6 , 7 },
+ { 4, 84, 6 , 7 },
+ { 18, 84, 6 , 7 },
+ { 32, 84, 5 , 8 },
+ { 45, 84, 6 , 7 },
+ { 59, 84, 6 , 7 },
+ { 73, 84, 7 , 5 },
+ { 88, 84, 6 , 5 },
+ { 102, 84, 6 , 5 },
+ { 116, 84, 6 , 7 },
+ { 130, 84, 6 , 7 },
+ { 144, 84, 6 , 5 },
+ { 158, 84, 6 , 5 },
+ { 172, 84, 6 , 6 },
+ { 186, 84, 6 , 5 },
+ { 200, 84, 6 , 5 },
+ { 214, 84, 7 , 5 },
+ { 229, 84, 6 , 5 },
+ { 4, 104, 6 , 7 },
+ { 18, 104, 6 , 5 },
+ { 32, 104, 4 , 8 },
+ { 44, 104, 2 , 8 },
+ { 54, 104, 4 , 8 },
+ { 66, 104, 5 , 2 },
+ { 79, 104, 2 , 7 },
+ { 89, 104, 6 , 6 },
+ { 103, 104, 6 , 7 },
+ { 117, 104, 6 , 7 },
+ { 131, 104, 6 , 7 },
+ { 145, 104, 8 , 8 },
+ { 161, 104, 6 , 9 },
+ { 175, 104, 8 , 8 },
+ { 191, 104, 7 , 7 },
+ { 206, 104, 8 , 8 },
+ { 222, 104, 6 , 5 },
+ { 236, 104, 8 , 8 },
+ { 4, 124, 7 , 7 },
+ { 19, 124, 8 , 8 },
+ { 35, 124, 4 , 4 },
+ { 47, 124, 8 , 8 },
+ { 63, 124, 8 , 8 },
+ { 79, 124, 8 , 8 },
+ { 95, 124, 8 , 8 },
+ { 111, 124, 6 , 7 },
+ { 125, 124, 5 , 8 },
+ { 138, 124, 3 , 3 },
+ { 149, 124, 8 , 8 },
+ { 165, 124, 8 , 8 },
+ { 181, 124, 8 , 8 },
+ { 197, 124, 6 , 5 },
+ { 211, 124, 10 , 7 },
+ { 229, 124, 10 , 5 },
+ { 4, 144, 8 , 8 },
+ { 20, 144, 6 , 7 },
+ { 34, 144, 6 , 10 },
+ { 48, 144, 6 , 10 },
+ { 62, 144, 6 , 10 },
+ { 76, 144, 6 , 10 },
+ { 90, 144, 6 , 10 },
+ { 104, 144, 6 , 10 },
+ { 118, 144, 10 , 7 },
+ { 136, 144, 6 , 9 },
+ { 150, 144, 6 , 10 },
+ { 164, 144, 6 , 10 },
+ { 178, 144, 6 , 10 },
+ { 192, 144, 6 , 10 },
+ { 206, 144, 6 , 10 },
+ { 220, 144, 6 , 10 },
+ { 234, 144, 6 , 10 },
+ { 4, 164, 6 , 10 },
+ { 18, 164, 6 , 7 },
+ { 32, 164, 6 , 10 },
+ { 46, 164, 6 , 10 },
+ { 60, 164, 6 , 10 },
+ { 74, 164, 6 , 10 },
+ { 88, 164, 6 , 10 },
+ { 102, 164, 6 , 10 },
+ { 116, 164, 6 , 5 },
+ { 130, 164, 6 , 7 },
+ { 144, 164, 6 , 10 },
+ { 158, 164, 6 , 10 },
+ { 172, 164, 6 , 10 },
+ { 186, 164, 6 , 10 },
+ { 200, 164, 6 , 10 },
+ { 214, 164, 6 , 7 },
+ { 228, 164, 6 , 7 },
+ { 4, 184, 6 , 8 },
+ { 18, 184, 6 , 8 },
+ { 32, 184, 6 , 8 },
+ { 46, 184, 6 , 8 },
+ { 60, 184, 6 , 8 },
+ { 74, 184, 6 , 8 },
+ { 88, 184, 9 , 5 },
+ { 105, 184, 6 , 7 },
+ { 119, 184, 6 , 8 },
+ { 133, 184, 6 , 8 },
+ { 147, 184, 6 , 8 },
+ { 161, 184, 6 , 8 },
+ { 175, 184, 6 , 8 },
+ { 189, 184, 6 , 8 },
+ { 203, 184, 6 , 8 },
+ { 217, 184, 6 , 8 },
+ { 231, 184, 6 , 7 },
+ { 4, 204, 6 , 8 },
+ { 18, 204, 6 , 8 },
+ { 32, 204, 6 , 8 },
+ { 46, 204, 6 , 8 },
+ { 60, 204, 6 , 8 },
+ { 74, 204, 6 , 8 },
+ { 88, 204, 5 , 5 },
+ { 101, 204, 6 , 5 },
+ { 115, 204, 6 , 8 },
+ { 129, 204, 6 , 8 },
+ { 143, 204, 6 , 8 },
+ { 157, 204, 6 , 8 },
+ { 171, 204, 6 , 10 },
+ { 185, 204, 6 , 9 },
+ { 199, 204, 6 , 10 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo jungleFontGlyphs[189] = {
+ { 32, 0, 9, 5, { 0 }},
+ { 33, 0, 2, 3, { 0 }},
+ { 34, 0, 2, 6, { 0 }},
+ { 35, 0, 3, 6, { 0 }},
+ { 36, 0, 2, 7, { 0 }},
+ { 37, 0, 2, 8, { 0 }},
+ { 38, 0, 2, 6, { 0 }},
+ { 39, 0, 2, 4, { 0 }},
+ { 40, 0, 2, 5, { 0 }},
+ { 41, 0, 2, 5, { 0 }},
+ { 42, 0, 2, 6, { 0 }},
+ { 43, 0, 3, 6, { 0 }},
+ { 44, 0, 7, 3, { 0 }},
+ { 45, 0, 5, 6, { 0 }},
+ { 46, 0, 7, 3, { 0 }},
+ { 47, 0, 2, 8, { 0 }},
+ { 48, 0, 3, 8, { 0 }},
+ { 49, 0, 3, 7, { 0 }},
+ { 50, 0, 3, 7, { 0 }},
+ { 51, 0, 3, 7, { 0 }},
+ { 52, 0, 3, 7, { 0 }},
+ { 53, 0, 3, 7, { 0 }},
+ { 54, 0, 3, 7, { 0 }},
+ { 55, 0, 3, 7, { 0 }},
+ { 56, 0, 3, 7, { 0 }},
+ { 57, 0, 3, 7, { 0 }},
+ { 58, 0, 4, 3, { 0 }},
+ { 59, 0, 4, 3, { 0 }},
+ { 60, 0, 3, 4, { 0 }},
+ { 61, 0, 4, 6, { 0 }},
+ { 62, 0, 3, 4, { 0 }},
+ { 63, 0, 2, 7, { 0 }},
+ { 64, 0, 2, 8, { 0 }},
+ { 65, 0, 2, 7, { 0 }},
+ { 66, 0, 2, 7, { 0 }},
+ { 67, 0, 2, 7, { 0 }},
+ { 68, 0, 2, 7, { 0 }},
+ { 69, 0, 2, 7, { 0 }},
+ { 70, 0, 2, 7, { 0 }},
+ { 71, 0, 2, 7, { 0 }},
+ { 72, 0, 2, 7, { 0 }},
+ { 73, 0, 2, 7, { 0 }},
+ { 74, 0, 2, 7, { 0 }},
+ { 75, 0, 2, 7, { 0 }},
+ { 76, 0, 2, 7, { 0 }},
+ { 77, 0, 2, 8, { 0 }},
+ { 78, 0, 2, 7, { 0 }},
+ { 79, 0, 2, 7, { 0 }},
+ { 80, 0, 2, 7, { 0 }},
+ { 81, 0, 2, 7, { 0 }},
+ { 82, 0, 2, 7, { 0 }},
+ { 83, 0, 2, 7, { 0 }},
+ { 84, 0, 2, 7, { 0 }},
+ { 85, 0, 2, 7, { 0 }},
+ { 86, 0, 2, 7, { 0 }},
+ { 87, 0, 2, 8, { 0 }},
+ { 88, 0, 2, 7, { 0 }},
+ { 89, 0, 2, 7, { 0 }},
+ { 90, 0, 2, 7, { 0 }},
+ { 91, 0, 2, 5, { 0 }},
+ { 92, 0, 2, 8, { 0 }},
+ { 93, 0, 2, 5, { 0 }},
+ { 94, 0, -1, 5, { 0 }},
+ { 95, 0, 10, 7, { 0 }},
+ { 96, 0, -1, 3, { 0 }},
+ { 97, 0, 4, 7, { 0 }},
+ { 98, 0, 2, 7, { 0 }},
+ { 99, 0, 4, 7, { 0 }},
+ { 100, 0, 2, 7, { 0 }},
+ { 101, 0, 4, 7, { 0 }},
+ { 102, 0, 2, 7, { 0 }},
+ { 103, 0, 4, 7, { 0 }},
+ { 104, 0, 2, 7, { 0 }},
+ { 105, 0, 2, 7, { 0 }},
+ { 106, 0, 2, 6, { 0 }},
+ { 107, 0, 2, 7, { 0 }},
+ { 108, 0, 2, 7, { 0 }},
+ { 109, 0, 4, 8, { 0 }},
+ { 110, 0, 4, 7, { 0 }},
+ { 111, 0, 4, 7, { 0 }},
+ { 112, 0, 4, 7, { 0 }},
+ { 113, 0, 4, 7, { 0 }},
+ { 114, 0, 4, 7, { 0 }},
+ { 115, 0, 4, 7, { 0 }},
+ { 116, 0, 3, 7, { 0 }},
+ { 117, 0, 4, 7, { 0 }},
+ { 118, 0, 4, 7, { 0 }},
+ { 119, 0, 4, 8, { 0 }},
+ { 120, 0, 4, 7, { 0 }},
+ { 121, 0, 4, 7, { 0 }},
+ { 122, 0, 4, 7, { 0 }},
+ { 123, 0, 2, 5, { 0 }},
+ { 124, 0, 2, 3, { 0 }},
+ { 125, 0, 2, 5, { 0 }},
+ { 126, 0, -1, 6, { 0 }},
+ { 161, 0, 2, 3, { 0 }},
+ { 162, 0, 3, 7, { 0 }},
+ { 163, 0, 2, 7, { 0 }},
+ { 8364, 0, 2, 7, { 0 }},
+ { 165, 0, 2, 7, { 0 }},
+ { 352, 0, 1, 8, { 0 }},
+ { 167, 0, 1, 7, { 0 }},
+ { 353, 0, 1, 8, { 0 }},
+ { 169, 0, 2, 8, { 0 }},
+ { 170, 0, 1, 8, { 0 }},
+ { 171, 0, 3, 7, { 0 }},
+ { 172, 0, 1, 8, { 0 }},
+ { 174, 0, 2, 8, { 0 }},
+ { 175, 0, 1, 8, { 0 }},
+ { 176, 0, 1, 2, { 0 }},
+ { 177, 0, 1, 8, { 0 }},
+ { 178, 0, 1, 8, { 0 }},
+ { 179, 0, 1, 8, { 0 }},
+ { 381, 0, 1, 8, { 0 }},
+ { 181, 0, 4, 7, { 0 }},
+ { 182, 0, 1, 4, { 0 }},
+ { 183, 0, 4, 4, { 0 }},
+ { 382, 0, 1, 8, { 0 }},
+ { 185, 0, 1, 8, { 0 }},
+ { 186, 0, 1, 8, { 0 }},
+ { 187, 0, 3, 7, { 0 }},
+ { 338, 0, 2, 11, { 0 }},
+ { 339, 0, 4, 11, { 0 }},
+ { 376, 0, 1, 8, { 0 }},
+ { 191, 0, 2, 7, { 0 }},
+ { 192, 0, -1, 7, { 0 }},
+ { 193, 0, -1, 7, { 0 }},
+ { 194, 0, -1, 7, { 0 }},
+ { 195, 0, -1, 7, { 0 }},
+ { 196, 0, -1, 7, { 0 }},
+ { 197, 0, -1, 7, { 0 }},
+ { 198, 0, 2, 11, { 0 }},
+ { 199, 0, 2, 7, { 0 }},
+ { 200, 0, -1, 7, { 0 }},
+ { 201, 0, -1, 7, { 0 }},
+ { 202, 0, -1, 7, { 0 }},
+ { 203, 0, -1, 7, { 0 }},
+ { 204, 0, -1, 7, { 0 }},
+ { 205, 0, -1, 7, { 0 }},
+ { 206, 0, -1, 7, { 0 }},
+ { 207, 0, -1, 7, { 0 }},
+ { 208, 0, 2, 7, { 0 }},
+ { 209, 0, -1, 7, { 0 }},
+ { 210, 0, -1, 7, { 0 }},
+ { 211, 0, -1, 7, { 0 }},
+ { 212, 0, -1, 7, { 0 }},
+ { 213, 0, -1, 7, { 0 }},
+ { 214, 0, -1, 7, { 0 }},
+ { 215, 0, 3, 7, { 0 }},
+ { 216, 0, 2, 7, { 0 }},
+ { 217, 0, -1, 7, { 0 }},
+ { 218, 0, -1, 7, { 0 }},
+ { 219, 0, -1, 7, { 0 }},
+ { 220, 0, -1, 7, { 0 }},
+ { 221, 0, -1, 7, { 0 }},
+ { 222, 0, 2, 7, { 0 }},
+ { 223, 0, 2, 7, { 0 }},
+ { 224, 0, 1, 7, { 0 }},
+ { 225, 0, 1, 7, { 0 }},
+ { 226, 0, 1, 7, { 0 }},
+ { 227, 0, 1, 7, { 0 }},
+ { 228, 0, 1, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 4, 10, { 0 }},
+ { 231, 0, 4, 7, { 0 }},
+ { 232, 0, 1, 7, { 0 }},
+ { 233, 0, 1, 7, { 0 }},
+ { 234, 0, 1, 7, { 0 }},
+ { 235, 0, 1, 7, { 0 }},
+ { 236, 0, 1, 7, { 0 }},
+ { 237, 0, 1, 7, { 0 }},
+ { 238, 0, 1, 7, { 0 }},
+ { 239, 0, 1, 7, { 0 }},
+ { 240, 0, 2, 7, { 0 }},
+ { 241, 0, 1, 7, { 0 }},
+ { 242, 0, 1, 7, { 0 }},
+ { 243, 0, 1, 7, { 0 }},
+ { 244, 0, 1, 7, { 0 }},
+ { 245, 0, 1, 7, { 0 }},
+ { 246, 0, 1, 7, { 0 }},
+ { 247, 0, 3, 6, { 0 }},
+ { 248, 0, 4, 7, { 0 }},
+ { 249, 0, 1, 7, { 0 }},
+ { 250, 0, 1, 7, { 0 }},
+ { 251, 0, 1, 7, { 0 }},
+ { 252, 0, 1, 7, { 0 }},
+ { 253, 0, 1, 7, { 0 }},
+ { 254, 0, 2, 7, { 0 }},
+ { 255, 0, 1, 7, { 0 }},
+};
+
+// Style loading function: Jungle
+static void GuiLoadStyleJungle(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < JUNGLE_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(jungleStyleProps[i].controlId, jungleStyleProps[i].propertyId, jungleStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int jungleFontDataSize = 0;
+ unsigned char *data = DecompressData(jungleFontData, JUNGLE_STYLE_FONT_ATLAS_COMP_SIZE, &jungleFontDataSize);
+ Image imFont = { data, 256, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 12;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, jungleFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, jungleFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 254, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/jungle/style_jungle.old.rgs b/external/raygui-4.0/styles/jungle/style_jungle.old.rgs
new file mode 100644
index 0000000..4bd2d9d
Binary files /dev/null and b/external/raygui-4.0/styles/jungle/style_jungle.old.rgs differ
diff --git a/external/raygui-4.0/styles/jungle/style_jungle.png b/external/raygui-4.0/styles/jungle/style_jungle.png
new file mode 100644
index 0000000..e598558
Binary files /dev/null and b/external/raygui-4.0/styles/jungle/style_jungle.png differ
diff --git a/external/raygui-4.0/styles/jungle/style_jungle.rgs b/external/raygui-4.0/styles/jungle/style_jungle.rgs
new file mode 100644
index 0000000..1702c8a
Binary files /dev/null and b/external/raygui-4.0/styles/jungle/style_jungle.rgs differ
diff --git a/external/raygui-4.0/styles/jungle/style_jungle.txt.rgs b/external/raygui-4.0/styles/jungle/style_jungle.txt.rgs
new file mode 100644
index 0000000..6901b7d
--- /dev/null
+++ b/external/raygui-4.0/styles/jungle/style_jungle.txt.rgs
@@ -0,0 +1,27 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 12 charset.txt Pixel Intv.otf
+p 00 00 0x60827dff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x2c3334ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0x82a29fff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0x5f9aa8ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0x334e57ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0x6aa9b8ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0xa9cb8dff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0x3b6357ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x97af81ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x5b6462ff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x2c3334ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x666b69ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x0000000c TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0x638465ff LINE_COLOR
+p 00 19 0x2b3a3aff BACKGROUND_COLOR
+p 00 20 0x00000012 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/lavanda/Cartridge.ttf b/external/raygui-4.0/styles/lavanda/Cartridge.ttf
new file mode 100644
index 0000000..19d7280
Binary files /dev/null and b/external/raygui-4.0/styles/lavanda/Cartridge.ttf differ
diff --git a/external/raygui-4.0/styles/lavanda/README.md b/external/raygui-4.0/styles/lavanda/README.md
new file mode 100644
index 0000000..8d45c03
--- /dev/null
+++ b/external/raygui-4.0/styles/lavanda/README.md
@@ -0,0 +1,27 @@
+## style: lavanda
+
+Walk thought the fields full of lavanda, feels like a dream, a touch of fantasy, just relax and close your eyes, could you feel it?
+
+![lavanda style table](style_lavanda.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_lavanda.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_lavanda.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_lavanda.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_lavanda.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_lavanda.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![lavanda style screen](screenshot.png)
+
+## about font
+
+"Cartridge" font by [jeti](https://fontenddev.com/)
+
+Licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), downloaded from dafont.com: [cartridge](https://www.dafont.com/cartridge.font)
diff --git a/external/raygui-4.0/styles/lavanda/charset.txt b/external/raygui-4.0/styles/lavanda/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/lavanda/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/lavanda/font_readme.txt b/external/raygui-4.0/styles/lavanda/font_readme.txt
new file mode 100644
index 0000000..c9ff454
--- /dev/null
+++ b/external/raygui-4.0/styles/lavanda/font_readme.txt
@@ -0,0 +1,6 @@
+Cartridge by jeti: A decorative, Art Nouveau-inspired font with a dainty, fantastical hand-lettered feel.
+
+You are free to use this font for personal or commercial projects, all I ask is that you include credit.
+
+Licensed under CC BY 4.0: https://creativecommons.org/licenses/by/4.0/
+More info: https://fontenddev.com/fonts/cartridge/
diff --git a/external/raygui-4.0/styles/lavanda/screenshot.png b/external/raygui-4.0/styles/lavanda/screenshot.png
new file mode 100644
index 0000000..f787e0f
Binary files /dev/null and b/external/raygui-4.0/styles/lavanda/screenshot.png differ
diff --git a/external/raygui-4.0/styles/lavanda/style_lavanda.h b/external/raygui-4.0/styles/lavanda/style_lavanda.h
new file mode 100644
index 0000000..cae04ca
--- /dev/null
+++ b/external/raygui-4.0/styles/lavanda/style_lavanda.h
@@ -0,0 +1,607 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleLavanda(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define LAVANDA_STYLE_PROPS_COUNT 16
+
+// Custom style name: Lavanda
+static const GuiStyleProp lavandaStyleProps[LAVANDA_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0xab9bd3ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x3e4350ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xdadaf4ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xee84a0ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xf4b7c7ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xb7657bff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xd5c8dbff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x966ec0ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0xd7ccf7ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x8fa2bdff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x6b798dff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x8292a9ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 18, 0x84adb7ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x5b5b81ff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Cartridge.ttf" (size: 16, spacing: 1)
+
+#define LAVANDA_STYLE_FONT_ATLAS_COMP_SIZE 2636
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char lavandaFontData[LAVANDA_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0xdb, 0xd2, 0xa4, 0xba, 0x0d, 0x06, 0x50, 0xde, 0xff, 0xa5, 0xbf, 0x5c, 0xa4, 0x52, 0x49, 0xaa, 0x66, 0x63, 0x24,
+ 0x0b, 0x9a, 0xee, 0x59, 0xb3, 0xee, 0x7e, 0xa6, 0x4f, 0x06, 0xf9, 0x04, 0x96, 0x73, 0x00, 0x00, 0x00, 0x00, 0x24, 0x7f,
+ 0xfc, 0x4b, 0x4e, 0xfe, 0x6f, 0x2e, 0xbf, 0xd3, 0x7f, 0xfe, 0x9e, 0xc5, 0xff, 0xf8, 0xff, 0xff, 0x75, 0xed, 0x7d, 0x73,
+ 0xf9, 0xf3, 0x3b, 0x47, 0xf2, 0xc7, 0xef, 0x97, 0x8d, 0xd7, 0xff, 0xd3, 0x3b, 0xd4, 0xff, 0xff, 0x7f, 0xff, 0x55, 0xca,
+ 0xf1, 0xfc, 0x35, 0x47, 0xf1, 0x73, 0xb2, 0xf8, 0x9c, 0xab, 0xbf, 0xb0, 0x56, 0xfa, 0xb5, 0x73, 0x9e, 0xd3, 0x2b, 0xb2,
+ 0xf3, 0xca, 0xf3, 0xd7, 0x1d, 0xe5, 0xb2, 0x3a, 0x96, 0x25, 0x5c, 0x3d, 0xcb, 0xef, 0x8b, 0xff, 0x5c, 0x78, 0xe5, 0xf9,
+ 0xf1, 0x6c, 0xd4, 0x09, 0xeb, 0x72, 0xac, 0xd6, 0x18, 0x3b, 0xa5, 0x7a, 0xf6, 0x1d, 0x2b, 0xff, 0xff, 0x5a, 0x6d, 0xbb,
+ 0x5f, 0x3b, 0xae, 0x4a, 0xbf, 0xfe, 0xad, 0xaf, 0x94, 0x5c, 0x06, 0xfe, 0x7f, 0x5a, 0xdf, 0x7e, 0xe2, 0xfa, 0xcf, 0xf6,
+ 0xb5, 0x7d, 0xa5, 0xad, 0x9c, 0xb8, 0x46, 0xab, 0xf1, 0x9f, 0x56, 0x8b, 0x90, 0x45, 0x99, 0xde, 0x1d, 0xff, 0x9d, 0x76,
+ 0x34, 0x37, 0x95, 0x6a, 0xb5, 0xbe, 0xad, 0x5f, 0x37, 0x29, 0xb6, 0xb4, 0xbd, 0xf8, 0x5f, 0x7f, 0x4e, 0xc6, 0xca, 0x6d,
+ 0xdd, 0x7b, 0xa9, 0x97, 0x76, 0xef, 0xb7, 0x75, 0x6b, 0x95, 0x34, 0x7a, 0x40, 0xfd, 0xfa, 0x7a, 0xaa, 0xc4, 0x6b, 0x51,
+ 0x7a, 0xa5, 0x75, 0xcb, 0x58, 0xbd, 0x9f, 0x72, 0x6b, 0x95, 0x47, 0xca, 0xf2, 0x68, 0xb7, 0x3a, 0xd5, 0x5f, 0x94, 0x72,
+ 0x5c, 0x56, 0xfa, 0xe5, 0xfd, 0xab, 0x30, 0xa5, 0xd1, 0x59, 0x6e, 0x6b, 0xff, 0xd7, 0xad, 0x71, 0x9a, 0x57, 0x72, 0xca,
+ 0x7d, 0x83, 0x94, 0x47, 0x95, 0xeb, 0x73, 0xbc, 0x1e, 0x8b, 0xcc, 0xc7, 0x7f, 0xaf, 0x1f, 0xf3, 0xa7, 0x72, 0xef, 0xf6,
+ 0x12, 0xe6, 0xeb, 0xc6, 0xb7, 0xc7, 0x7f, 0x1a, 0x7d, 0x8c, 0xea, 0x6b, 0x52, 0x9e, 0x7b, 0x39, 0x6f, 0x23, 0xaf, 0x5f,
+ 0x99, 0x19, 0xba, 0x26, 0x3b, 0xad, 0x41, 0x1a, 0xe3, 0xc5, 0xdd, 0x96, 0x7c, 0x7a, 0xce, 0xea, 0xc9, 0xf8, 0xcf, 0x85,
+ 0x19, 0x89, 0xd5, 0x95, 0x97, 0x65, 0x29, 0xe4, 0x86, 0xf6, 0xff, 0x0d, 0x73, 0xaa, 0x4f, 0xc5, 0x7f, 0x96, 0x73, 0x5b,
+ 0x13, 0xd7, 0x74, 0x46, 0xce, 0x43, 0x3e, 0x70, 0x16, 0xae, 0xc4, 0xff, 0xd1, 0x6c, 0xc9, 0x7f, 0x3b, 0xfe, 0x8f, 0x8b,
+ 0xbd, 0xf8, 0xa3, 0x31, 0x0b, 0xf8, 0x5b, 0xf1, 0x9f, 0x46, 0xcc, 0x64, 0x6c, 0x64, 0xde, 0xeb, 0x33, 0xcc, 0xc6, 0xff,
+ 0x7b, 0x6b, 0xe1, 0x55, 0xff, 0x3f, 0x17, 0xef, 0x30, 0xfd, 0x4e, 0xfc, 0x1f, 0xa3, 0xfd, 0xff, 0xf5, 0x15, 0x33, 0x31,
+ 0x6b, 0xf4, 0x77, 0xc4, 0x7f, 0x9a, 0xf5, 0x70, 0x06, 0x67, 0x6e, 0xbe, 0x39, 0xfe, 0x3b, 0xd1, 0x93, 0x76, 0x5d, 0x79,
+ 0xde, 0xba, 0xe5, 0xa4, 0xc7, 0x56, 0xad, 0x19, 0xee, 0x9e, 0xff, 0xef, 0xdf, 0xb7, 0xc9, 0xf6, 0xab, 0xf3, 0xf0, 0xf8,
+ 0xff, 0xb9, 0xf8, 0x3f, 0xca, 0x33, 0xd8, 0xe7, 0xf7, 0x5a, 0xea, 0xf5, 0x4f, 0x1a, 0xf7, 0xbb, 0x8f, 0x91, 0xdf, 0xf2,
+ 0xb6, 0xf3, 0x70, 0xed, 0x35, 0x29, 0xcf, 0x6d, 0x9c, 0xdf, 0x01, 0xfb, 0xe7, 0xd9, 0x88, 0xce, 0xbc, 0xec, 0xfb, 0xea,
+ 0xd8, 0xbc, 0xa6, 0x8d, 0xfd, 0x5b, 0x4a, 0x81, 0x67, 0x9e, 0x31, 0x40, 0xfc, 0x8b, 0x7f, 0x78, 0xfb, 0x73, 0xcb, 0xe2,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xdf, 0x5a, 0xa1, 0x57, 0x5b, 0x15, 0xbe,
+ 0x93, 0xcb, 0xb8, 0x93, 0x9d, 0x6e, 0xbd, 0x42, 0x3d, 0xad, 0x9c, 0x04, 0xbd, 0xd7, 0xe5, 0x34, 0x0b, 0x5a, 0x46, 0xf2,
+ 0x13, 0x74, 0xf3, 0x4e, 0x55, 0x32, 0x08, 0x54, 0xf7, 0x32, 0xe8, 0xee, 0x1b, 0x50, 0xfb, 0x8c, 0xce, 0x6a, 0xfd, 0x0c,
+ 0x65, 0x41, 0xe8, 0xe4, 0x16, 0xde, 0x5b, 0x95, 0x5a, 0xcf, 0xd1, 0xb6, 0x93, 0xf5, 0x23, 0xad, 0x55, 0x73, 0x93, 0xf1,
+ 0x9f, 0x4b, 0xb9, 0x0e, 0x3a, 0x19, 0x6a, 0x3a, 0x59, 0x6a, 0x32, 0x9c, 0x5f, 0xe7, 0x5a, 0x94, 0x5e, 0xcb, 0x39, 0x95,
+ 0xe2, 0x77, 0xaa, 0xef, 0xca, 0x90, 0x46, 0xa4, 0xd5, 0xca, 0xb0, 0xb3, 0x3e, 0x72, 0xa7, 0x55, 0xd9, 0xbb, 0x7a, 0x53,
+ 0xca, 0x45, 0x7c, 0x77, 0xde, 0x9d, 0x94, 0xe3, 0xe7, 0xd9, 0xf8, 0x4f, 0xe3, 0x17, 0xe5, 0x52, 0xce, 0xe5, 0x6e, 0x46,
+ 0xb6, 0x6e, 0x26, 0xa7, 0x5e, 0x16, 0x81, 0x7e, 0xfc, 0x5f, 0x3b, 0x03, 0xbf, 0x1d, 0xff, 0x3b, 0xfb, 0xc7, 0x4c, 0xc4,
+ 0x7f, 0xb6, 0x3f, 0x39, 0x23, 0xe5, 0x5a, 0x79, 0x97, 0x55, 0xfc, 0x3c, 0x19, 0xff, 0xfd, 0x8c, 0x85, 0x67, 0xbf, 0x38,
+ 0x5b, 0xf1, 0x3f, 0xf9, 0xba, 0xa3, 0x99, 0x5f, 0x6b, 0x3f, 0xfe, 0xd3, 0xec, 0xb9, 0xce, 0xf5, 0x3d, 0xa7, 0xf2, 0x06,
+ 0x77, 0xae, 0xcf, 0x5c, 0xc8, 0xd7, 0xbb, 0xdb, 0x33, 0xa8, 0xe5, 0xae, 0xce, 0xb2, 0x35, 0xde, 0x8d, 0xff, 0x3c, 0xd8,
+ 0xff, 0xaf, 0x8c, 0xc8, 0x32, 0xde, 0xfe, 0x7f, 0x57, 0xfc, 0xdf, 0xd5, 0xff, 0xbf, 0xd2, 0x92, 0x75, 0xf7, 0xf5, 0x7a,
+ 0x3a, 0xfe, 0xef, 0x98, 0x97, 0xca, 0x48, 0xcb, 0xd5, 0xaf, 0x31, 0xae, 0xf6, 0xff, 0x33, 0xb4, 0x2b, 0x55, 0x6f, 0xdc,
+ 0x92, 0x9b, 0xdb, 0xff, 0x34, 0x46, 0x4a, 0xbb, 0xf1, 0x7f, 0x5c, 0xca, 0x83, 0x9a, 0xe6, 0xb9, 0xae, 0xd4, 0xe1, 0x3b,
+ 0x3b, 0xef, 0xed, 0xf4, 0xe0, 0xd3, 0xdc, 0x79, 0x2e, 0x8d, 0x91, 0xea, 0x6f, 0xc4, 0xff, 0xce, 0x2e, 0x5d, 0x4f, 0xf5,
+ 0xdc, 0x8f, 0x0b, 0x6d, 0xde, 0x1b, 0xe3, 0x7f, 0x7e, 0xfe, 0x6f, 0xfd, 0x1d, 0xf2, 0xf0, 0xf8, 0x3f, 0x8d, 0x28, 0x7e,
+ 0x5f, 0xfc, 0xd7, 0xdb, 0xa3, 0x99, 0xfd, 0x90, 0xa7, 0x6b, 0x80, 0xce, 0xee, 0x99, 0x9d, 0x9d, 0x53, 0x53, 0xda, 0x89,
+ 0x6c, 0xae, 0x47, 0x32, 0xd5, 0xff, 0x7f, 0x2e, 0xfe, 0xd3, 0xba, 0x0e, 0x3b, 0xdf, 0xbf, 0xbf, 0x3b, 0x40, 0xb6, 0x5a,
+ 0x95, 0x8c, 0xc6, 0xff, 0xc4, 0x2c, 0x5d, 0xb7, 0x4e, 0x7a, 0x7e, 0x3f, 0xf4, 0xe7, 0xee, 0x59, 0xa7, 0xb9, 0xab, 0x5b,
+ 0x46, 0xee, 0x8c, 0x67, 0x64, 0x2e, 0x2d, 0x5b, 0xf1, 0xbf, 0x7f, 0x2e, 0xaa, 0xfb, 0x32, 0xae, 0xfb, 0xc6, 0xf5, 0x79,
+ 0x91, 0x6e, 0xfc, 0xf7, 0x32, 0xd4, 0x5f, 0xfd, 0x1d, 0xff, 0x3c, 0x57, 0x72, 0x8c, 0xdf, 0x91, 0x4e, 0xab, 0xae, 0xea,
+ 0xf6, 0x2c, 0xd2, 0xda, 0x35, 0xff, 0x7d, 0xf1, 0xff, 0x44, 0xad, 0x31, 0x33, 0xf3, 0xd9, 0xb9, 0x17, 0x99, 0xf2, 0x35,
+ 0x3d, 0x3d, 0xc2, 0xfa, 0xfc, 0x19, 0xbd, 0x6f, 0x47, 0xa3, 0x37, 0x65, 0xe3, 0x9d, 0x88, 0xff, 0xa3, 0x71, 0xbf, 0x62,
+ 0xff, 0x4e, 0xdf, 0x77, 0x66, 0x35, 0xce, 0x8d, 0x4f, 0x25, 0xcc, 0xbd, 0xbf, 0x67, 0x10, 0x3f, 0x17, 0x75, 0x7f, 0x6b,
+ 0xa9, 0xfd, 0x1d, 0xf1, 0xff, 0x4c, 0x8d, 0x3d, 0x3d, 0x12, 0x81, 0x4f, 0x8e, 0xa9, 0x33, 0x32, 0x02, 0xe7, 0xb7, 0xda,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa9, 0xf5, 0x63, 0x33, 0xf9, 0x89, 0xd6,
+ 0x6b, 0x9a, 0x6b, 0x2b, 0x21, 0xd2, 0x58, 0xaf, 0xbc, 0x97, 0x47, 0xbf, 0x9a, 0xd5, 0xe5, 0x7c, 0xbd, 0x4c, 0x2e, 0xae,
+ 0xa1, 0x59, 0xad, 0x10, 0xc9, 0xf6, 0x5a, 0xbc, 0xee, 0xae, 0x06, 0xab, 0x4f, 0xeb, 0x64, 0x65, 0x38, 0xdf, 0x4d, 0xa0,
+ 0xbb, 0x0f, 0xc0, 0x59, 0x96, 0x83, 0x94, 0x3f, 0xef, 0xec, 0x95, 0x29, 0xe7, 0x0a, 0x4b, 0x61, 0xed, 0x54, 0x5a, 0x57,
+ 0x68, 0x27, 0xa3, 0xc3, 0xff, 0x7e, 0x5e, 0xe5, 0x6c, 0x65, 0x79, 0xa5, 0x55, 0xb2, 0xf1, 0xd5, 0xf3, 0x9d, 0xac, 0x32,
+ 0x10, 0xf6, 0xf3, 0xe8, 0x67, 0x70, 0x05, 0x7e, 0x86, 0xfe, 0x5a, 0x59, 0x25, 0x96, 0xad, 0x3a, 0x3e, 0x43, 0x75, 0xed,
+ 0x6e, 0x79, 0xa5, 0x51, 0x73, 0xa7, 0x5d, 0xe3, 0x1f, 0xad, 0x0c, 0x09, 0x19, 0xc8, 0x08, 0x90, 0x56, 0x09, 0x9d, 0xb5,
+ 0x42, 0x69, 0xaf, 0x42, 0xac, 0x67, 0x39, 0x4a, 0xf9, 0x3b, 0x1e, 0x8d, 0x3c, 0xa8, 0xb3, 0xd9, 0x97, 0x76, 0xf6, 0xfd,
+ 0x98, 0xc9, 0x98, 0x39, 0xb5, 0x86, 0xbe, 0x97, 0x9b, 0xa9, 0xfe, 0xd9, 0x9d, 0xab, 0x2a, 0x1b, 0xbd, 0xd0, 0x14, 0x7f,
+ 0x5d, 0x2e, 0xb7, 0x71, 0x7f, 0x6e, 0xf5, 0xea, 0x71, 0x53, 0xcf, 0xa9, 0x34, 0x95, 0x3b, 0xe9, 0xae, 0xf8, 0x3f, 0xc6,
+ 0xb3, 0x9c, 0xf5, 0x7a, 0x21, 0xbb, 0x3d, 0xf5, 0xbd, 0xf8, 0x5f, 0xef, 0x52, 0xb4, 0x5f, 0xe3, 0xdf, 0x19, 0xff, 0xbd,
+ 0x5c, 0x88, 0x59, 0xf6, 0xba, 0xbb, 0x7b, 0xaf, 0xd5, 0xfa, 0xf1, 0x69, 0x67, 0x97, 0xed, 0xe5, 0xd1, 0xc8, 0x22, 0xb7,
+ 0x6c, 0x6f, 0xdd, 0xfe, 0x7e, 0xff, 0x7f, 0xdd, 0x8f, 0x3f, 0xab, 0x1b, 0xef, 0xc8, 0xff, 0x77, 0x7f, 0xfc, 0xd7, 0xb2,
+ 0x26, 0xf7, 0xda, 0xf0, 0x6b, 0x79, 0x74, 0x27, 0xb3, 0xdf, 0x7d, 0x2a, 0xfe, 0xeb, 0xe3, 0xea, 0xe9, 0x31, 0x45, 0xe7,
+ 0x0c, 0xe5, 0x42, 0x2e, 0xc3, 0xb4, 0xf2, 0xa7, 0x9e, 0x8f, 0x7a, 0x67, 0xb3, 0xf0, 0xdc, 0xf9, 0x3e, 0x57, 0xc6, 0x62,
+ 0xcf, 0xc5, 0x7f, 0x36, 0x46, 0xe0, 0x7b, 0xed, 0x56, 0x2e, 0xb7, 0x22, 0xf7, 0xc7, 0xff, 0xdc, 0x9e, 0x95, 0xfb, 0x79,
+ 0xfa, 0x7a, 0x7d, 0xfc, 0x6c, 0xcc, 0x82, 0x75, 0xce, 0xe8, 0xb5, 0xb9, 0x8e, 0x3c, 0x32, 0xeb, 0x9d, 0xad, 0xb8, 0xb9,
+ 0x7f, 0x4e, 0xbe, 0x36, 0x1b, 0x34, 0x1f, 0xff, 0x47, 0x71, 0xfc, 0x7d, 0x5c, 0xdc, 0xab, 0x63, 0x77, 0xdc, 0x9a, 0xad,
+ 0xfe, 0xf8, 0xec, 0x9c, 0x55, 0xfd, 0xbb, 0x3f, 0xdf, 0xff, 0xdf, 0xcb, 0x1a, 0x9b, 0x56, 0x3f, 0x38, 0x1b, 0x75, 0x69,
+ 0x27, 0xf3, 0xf2, 0x4e, 0x8c, 0x4d, 0xee, 0x53, 0x36, 0xf1, 0x1d, 0xcf, 0x47, 0x11, 0xd3, 0xf1, 0x5f, 0x2f, 0x85, 0x7c,
+ 0xb4, 0x1f, 0xd4, 0xbf, 0x5a, 0xfb, 0x11, 0x98, 0xc1, 0xb3, 0xf8, 0xfc, 0xfc, 0x5f, 0xda, 0x75, 0x5f, 0x36, 0x33, 0x9e,
+ 0x57, 0xdb, 0x8e, 0x67, 0xf3, 0x09, 0xe6, 0xa5, 0xf9, 0x0b, 0xfb, 0xb9, 0xff, 0xf3, 0x48, 0xa4, 0x4d, 0xe7, 0x9c, 0xbe,
+ 0xbf, 0x1e, 0xd9, 0xbb, 0x77, 0x96, 0xdb, 0xcf, 0x62, 0x6e, 0x7f, 0xf7, 0x2c, 0x9f, 0x33, 0xe8, 0xde, 0xdf, 0xc8, 0xe0,
+ 0xfd, 0x44, 0x8e, 0xad, 0x79, 0x9a, 0x7c, 0xf8, 0x3b, 0x1e, 0xce, 0xef, 0x43, 0xf1, 0xff, 0xe9, 0x72, 0xef, 0xcf, 0xd5,
+ 0xc9, 0x7a, 0xfb, 0xfd, 0xf1, 0xcf, 0x3b, 0xe3, 0xff, 0x78, 0x49, 0xfc, 0xf3, 0x7c, 0x0d, 0x2e, 0xfe, 0xdf, 0x77, 0x2e,
+ 0x77, 0x9f, 0xff, 0x7d, 0xfb, 0xaf, 0xd3, 0x96, 0xdf, 0x55, 0xaa, 0xca, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0xaf, 0x1c, 0xca, 0x50, 0x46, 0xa0, 0xe3, 0xff, 0x72, 0x97, 0xac, 0x73, 0x4d, 0x76, 0xf2,
+ 0xc6, 0xf7, 0x57, 0x53, 0xa5, 0x7d, 0x6c, 0x27, 0x17, 0x4b, 0x2e, 0xad, 0x00, 0xc9, 0xc8, 0x7e, 0x09, 0xfd, 0x52, 0x4a,
+ 0x29, 0x9b, 0x68, 0x25, 0x7f, 0x5b, 0x1a, 0x2b, 0x83, 0x7b, 0x59, 0x9f, 0x3e, 0x75, 0x9e, 0x57, 0x19, 0x57, 0xfa, 0xbf,
+ 0x26, 0x37, 0xac, 0x1e, 0xbc, 0xfa, 0x3d, 0x7a, 0x59, 0x58, 0x73, 0x69, 0xa5, 0x5b, 0xda, 0xb9, 0x5c, 0xfb, 0xeb, 0x29,
+ 0xd3, 0x5c, 0x4f, 0x99, 0xed, 0xd2, 0x5e, 0x45, 0x63, 0x2f, 0x5f, 0x6a, 0xb7, 0x8e, 0xdc, 0xcf, 0xf0, 0x9d, 0xed, 0x77,
+ 0xbe, 0xb2, 0x47, 0x41, 0xbe, 0xe8, 0x3c, 0x77, 0xeb, 0x86, 0xfe, 0xef, 0xcc, 0xed, 0xb1, 0xb3, 0x9b, 0xf9, 0xef, 0xca,
+ 0x55, 0xdf, 0xdb, 0x87, 0xe6, 0x8d, 0xab, 0x38, 0x77, 0xea, 0xf0, 0x6e, 0x1e, 0xb3, 0x6f, 0x58, 0xdf, 0x9b, 0x8f, 0xfe,
+ 0xae, 0xe7, 0xce, 0xf3, 0x3a, 0xcf, 0xe1, 0x1b, 0x7e, 0x6b, 0x25, 0xc3, 0x6b, 0xa7, 0xfd, 0xcf, 0xa5, 0xf2, 0xba, 0x92,
+ 0xdd, 0xb4, 0xb7, 0xeb, 0xd5, 0x67, 0x8e, 0x1e, 0x9b, 0xd9, 0xb6, 0x3a, 0xd9, 0xae, 0xcf, 0x77, 0xac, 0xaa, 0x1f, 0xd9,
+ 0x6d, 0xff, 0xbb, 0x7f, 0xed, 0xec, 0x43, 0xf4, 0x89, 0xf3, 0xdc, 0xdb, 0x1d, 0x2d, 0x8b, 0x51, 0xf7, 0x95, 0x32, 0xae,
+ 0x1d, 0xdb, 0xed, 0x25, 0xef, 0x8d, 0xff, 0xab, 0xed, 0xff, 0x51, 0xbe, 0xea, 0x77, 0x7a, 0xda, 0x6f, 0x3b, 0xba, 0x93,
+ 0x71, 0xf3, 0xa9, 0x23, 0x77, 0xc4, 0x7f, 0x4e, 0xb3, 0xf1, 0xe7, 0xd2, 0x2c, 0xc3, 0x4e, 0x66, 0xe7, 0xfa, 0xd1, 0x5c,
+ 0x2a, 0x8f, 0xf3, 0x36, 0xf4, 0xfb, 0xe2, 0x7f, 0xef, 0xbd, 0xd7, 0xf1, 0x5d, 0xcf, 0x50, 0x7b, 0xb4, 0xe7, 0xe1, 0xee,
+ 0x8b, 0xe1, 0xa3, 0xfd, 0xad, 0xf2, 0x9a, 0x28, 0xaf, 0xe5, 0x04, 0xbd, 0xbb, 0xfd, 0xbf, 0x96, 0xdd, 0xfc, 0x3d, 0x47,
+ 0xaf, 0xb5, 0x49, 0xef, 0x88, 0xff, 0xdc, 0x3a, 0x26, 0x4c, 0x69, 0xa6, 0xf5, 0x28, 0xee, 0x7d, 0x94, 0xd7, 0xb5, 0x0b,
+ 0xeb, 0x3d, 0x35, 0xae, 0xb4, 0x29, 0xb3, 0x11, 0xdb, 0x3b, 0xf2, 0xa6, 0xfe, 0xff, 0x2f, 0xc5, 0xff, 0x1d, 0x31, 0xfe,
+ 0x4c, 0xfc, 0xef, 0xf5, 0x00, 0xfa, 0xfb, 0x2d, 0x75, 0x6a, 0x86, 0x9d, 0xbd, 0x6d, 0x76, 0x8f, 0x76, 0x6b, 0x87, 0xfc,
+ 0xa1, 0x36, 0xec, 0xcd, 0xb4, 0x7e, 0x5b, 0xff, 0xff, 0xfc, 0xfe, 0x4f, 0xda, 0xf3, 0xcb, 0xef, 0x8b, 0xff, 0x7e, 0x0b,
+ 0x70, 0x4f, 0xfc, 0xe7, 0xc1, 0x79, 0xd2, 0xb4, 0x67, 0x3d, 0xd3, 0xb8, 0x6f, 0xfc, 0xc6, 0x71, 0x61, 0xe5, 0xec, 0x77,
+ 0xf6, 0xd0, 0xfc, 0xee, 0xf8, 0x5f, 0xcf, 0x2f, 0xfd, 0x4a, 0xff, 0x3f, 0x1b, 0xb3, 0xa0, 0xd3, 0xf1, 0xff, 0x3d, 0xf9,
+ 0x46, 0x33, 0x36, 0xee, 0xf8, 0xbe, 0x56, 0xa3, 0x1b, 0x57, 0x3b, 0xa3, 0x89, 0xeb, 0x73, 0xae, 0xcf, 0xec, 0x76, 0x92,
+ 0x57, 0x9d, 0xab, 0x3b, 0xee, 0x58, 0x7e, 0x66, 0xfe, 0xef, 0x5b, 0x22, 0x5f, 0xfc, 0xaf, 0xe6, 0xd0, 0xcf, 0xc7, 0xcf,
+ 0xb5, 0x23, 0x95, 0xe7, 0x0c, 0x3f, 0x17, 0xff, 0x9f, 0x9b, 0xe7, 0xb9, 0x67, 0x37, 0x93, 0xce, 0x33, 0x36, 0xc7, 0x2d,
+ 0xcf, 0xce, 0xbd, 0xef, 0x59, 0x8b, 0xe3, 0x0b, 0xe2, 0x7f, 0x66, 0x36, 0xb4, 0x53, 0x12, 0x59, 0xec, 0x8b, 0x9c, 0xe2,
+ 0x33, 0xd7, 0x77, 0xf5, 0xff, 0x67, 0x5b, 0xc5, 0x4f, 0x3e, 0xe7, 0xf1, 0xfc, 0x95, 0xde, 0x3d, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf6, 0xda, 0xba, 0x7a, 0xd6, 0xbd, 0x34, 0xd7, 0xef, 0xf6, 0xd7,
+ 0xa9, 0xd6, 0x77, 0x0d, 0xb8, 0xf2, 0x9e, 0x29, 0xaf, 0xbf, 0xa9, 0x7d, 0x52, 0xe5, 0x5b, 0xdf, 0x93, 0x75, 0xff, 0x58,
+ 0xe4, 0x18, 0xc8, 0xc8, 0x35, 0x91, 0x72, 0x4e, 0x87, 0xa3, 0x99, 0x95, 0x28, 0xe5, 0xab, 0x2e, 0x8d, 0xbf, 0xa7, 0xbc,
+ 0x32, 0xf3, 0x68, 0x7c, 0xef, 0x37, 0xaf, 0xb9, 0xef, 0x66, 0xf2, 0xec, 0xef, 0x50, 0x31, 0xbd, 0xea, 0x31, 0xcd, 0x3c,
+ 0xdc, 0x19, 0x5b, 0xef, 0x9a, 0x8d, 0x15, 0xcd, 0x9d, 0x48, 0xaf, 0xd4, 0xd7, 0x69, 0xc7, 0x46, 0xad, 0x3e, 0xcb, 0xe8,
+ 0x75, 0x3a, 0xb7, 0x43, 0x4c, 0x46, 0x33, 0x69, 0xbe, 0x79, 0x5d, 0x5e, 0x9a, 0xd9, 0x35, 0xf2, 0x05, 0xeb, 0x90, 0xb3,
+ 0xb1, 0x5b, 0x4a, 0x1a, 0x3b, 0x9d, 0x7c, 0x66, 0xa5, 0xf3, 0xde, 0x95, 0xf9, 0xce, 0x55, 0xa3, 0xd5, 0x7c, 0x6e, 0x4f,
+ 0x5d, 0x75, 0xbd, 0x9c, 0x1f, 0x19, 0x7f, 0xc7, 0x67, 0xe2, 0xbf, 0x93, 0x77, 0x37, 0xcb, 0x3e, 0xe5, 0xb3, 0xab, 0x9e,
+ 0xbb, 0xd9, 0xc6, 0xd2, 0xda, 0x6d, 0x60, 0xff, 0xef, 0x9f, 0xc8, 0xba, 0x73, 0x6f, 0xfb, 0x3f, 0xdf, 0xc7, 0xae, 0x66,
+ 0x38, 0xe8, 0x5d, 0xdd, 0xdd, 0x9d, 0x2e, 0xf2, 0x33, 0xf1, 0xbf, 0xce, 0xba, 0x98, 0x91, 0xd9, 0x84, 0x4f, 0x1c, 0x4b,
+ 0x73, 0xd7, 0xa7, 0x0c, 0x8d, 0x17, 0xd6, 0xb9, 0x2e, 0x9f, 0x88, 0xff, 0x9c, 0xf4, 0xce, 0xd3, 0xd8, 0xd9, 0x62, 0xea,
+ 0xef, 0x93, 0xb3, 0x15, 0xfd, 0x5d, 0x6b, 0xe6, 0xe2, 0x3f, 0xc3, 0x3b, 0xb0, 0xbd, 0x3d, 0xfe, 0xa7, 0x67, 0x00, 0xfa,
+ 0x31, 0x9e, 0xf6, 0x68, 0x6d, 0x62, 0x94, 0xdb, 0xf9, 0xfb, 0x73, 0x59, 0xf7, 0xcf, 0xf2, 0x2a, 0xa7, 0x75, 0x45, 0x64,
+ 0x60, 0x1e, 0x25, 0xed, 0x1e, 0xf6, 0xfd, 0xf1, 0xbf, 0xb3, 0xe7, 0x4f, 0xbe, 0x2e, 0xfe, 0x57, 0x35, 0x5a, 0x3d, 0xbf,
+ 0x6d, 0x5a, 0xb1, 0xda, 0x3b, 0x96, 0x8d, 0xd9, 0x9f, 0x2c, 0xb3, 0xe6, 0xdf, 0xd3, 0xfb, 0xaf, 0x7d, 0xdb, 0x99, 0xf8,
+ 0x9f, 0x89, 0xce, 0x4f, 0xc6, 0x7f, 0x36, 0xf6, 0x8e, 0x99, 0x6c, 0xdd, 0xd2, 0xcc, 0x14, 0x9a, 0x97, 0xce, 0xff, 0x75,
+ 0x46, 0x34, 0xf3, 0x7b, 0x75, 0xdc, 0x71, 0x6c, 0x6f, 0xe6, 0x2b, 0x37, 0x8e, 0x7d, 0x8f, 0x0f, 0xb4, 0xff, 0x13, 0x35,
+ 0xc3, 0x67, 0xdb, 0xff, 0x63, 0xf4, 0x7a, 0x5c, 0xff, 0xfa, 0x3c, 0xd0, 0xa3, 0x7c, 0x4b, 0xfc, 0xe7, 0x4b, 0xe3, 0xff,
+ 0xb8, 0xb0, 0xa3, 0xdc, 0x5b, 0x6b, 0x80, 0x3c, 0x3a, 0xfe, 0x7f, 0x57, 0xfc, 0xcf, 0xde, 0x01, 0xc9, 0xf2, 0x1e, 0x67,
+ 0x2d, 0xca, 0xd3, 0xb8, 0xd3, 0x98, 0xe2, 0x6e, 0x6a, 0xef, 0x79, 0xfe, 0x27, 0xcd, 0xd1, 0x49, 0x35, 0x1e, 0xef, 0x39,
+ 0x76, 0xcf, 0xac, 0x6b, 0xca, 0x73, 0x8a, 0x19, 0xb9, 0xce, 0x9f, 0xcc, 0xba, 0xbb, 0x1a, 0xc5, 0x3d, 0xff, 0xeb, 0x77,
+ 0xef, 0xa7, 0x66, 0xe8, 0xc8, 0xe4, 0xb3, 0x44, 0x6f, 0x79, 0x3a, 0x60, 0xfa, 0x1e, 0xda, 0x37, 0xe4, 0x21, 0xce, 0xcf,
+ 0x67, 0x4c, 0xbf, 0xef, 0xa9, 0x01, 0xee, 0xed, 0xe9, 0x7d, 0xcf, 0xb3, 0xc1, 0x88, 0x7e, 0xd6, 0xcf, 0xa8, 0xfc, 0xe6,
+ 0xef, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa6, 0xfd, 0xfb, 0x9f, 0x72, 0x00, 0xf1, 0x0f, 0xfc, 0x75, 0xf1, 0xff, 0x2f };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle lavandaFontRecs[189] = {
+ { 4, 4, 5 , 16 },
+ { 17, 4, 1 , 9 },
+ { 26, 4, 3 , 3 },
+ { 37, 4, 7 , 8 },
+ { 52, 4, 5 , 11 },
+ { 65, 4, 10 , 8 },
+ { 83, 4, 7 , 9 },
+ { 98, 4, 1 , 3 },
+ { 107, 4, 3 , 12 },
+ { 118, 4, 3 , 12 },
+ { 129, 4, 5 , 4 },
+ { 142, 4, 5 , 5 },
+ { 155, 4, 2 , 3 },
+ { 165, 4, 3 , 1 },
+ { 176, 4, 1 , 1 },
+ { 185, 4, 4 , 12 },
+ { 197, 4, 5 , 9 },
+ { 210, 4, 3 , 9 },
+ { 221, 4, 5 , 9 },
+ { 234, 4, 5 , 9 },
+ { 247, 4, 5 , 9 },
+ { 260, 4, 5 , 9 },
+ { 273, 4, 5 , 9 },
+ { 286, 4, 5 , 9 },
+ { 299, 4, 5 , 9 },
+ { 312, 4, 5 , 9 },
+ { 325, 4, 1 , 4 },
+ { 334, 4, 2 , 6 },
+ { 344, 4, 4 , 5 },
+ { 356, 4, 4 , 3 },
+ { 368, 4, 4 , 5 },
+ { 380, 4, 5 , 9 },
+ { 393, 4, 7 , 10 },
+ { 408, 4, 7 , 9 },
+ { 423, 4, 6 , 9 },
+ { 437, 4, 5 , 9 },
+ { 450, 4, 6 , 9 },
+ { 464, 4, 5 , 9 },
+ { 477, 4, 5 , 9 },
+ { 490, 4, 6 , 9 },
+ { 4, 28, 5 , 10 },
+ { 17, 28, 1 , 9 },
+ { 26, 28, 6 , 9 },
+ { 40, 28, 6 , 9 },
+ { 54, 28, 5 , 9 },
+ { 67, 28, 8 , 11 },
+ { 83, 28, 6 , 10 },
+ { 97, 28, 7 , 9 },
+ { 112, 28, 5 , 9 },
+ { 125, 28, 7 , 11 },
+ { 140, 28, 5 , 9 },
+ { 153, 28, 6 , 9 },
+ { 167, 28, 7 , 9 },
+ { 182, 28, 6 , 9 },
+ { 196, 28, 6 , 10 },
+ { 210, 28, 9 , 10 },
+ { 227, 28, 6 , 11 },
+ { 241, 28, 5 , 10 },
+ { 254, 28, 5 , 9 },
+ { 267, 28, 3 , 12 },
+ { 278, 28, 4 , 12 },
+ { 290, 28, 3 , 12 },
+ { 301, 28, 5 , 4 },
+ { 314, 28, 6 , 1 },
+ { 328, 28, 3 , 3 },
+ { 339, 28, 6 , 7 },
+ { 353, 28, 5 , 9 },
+ { 366, 28, 4 , 7 },
+ { 378, 28, 5 , 10 },
+ { 391, 28, 4 , 7 },
+ { 403, 28, 3 , 10 },
+ { 414, 28, 4 , 11 },
+ { 426, 28, 5 , 11 },
+ { 439, 28, 1 , 9 },
+ { 448, 28, 5 , 12 },
+ { 461, 28, 5 , 9 },
+ { 474, 28, 1 , 9 },
+ { 483, 28, 8 , 9 },
+ { 4, 52, 5 , 9 },
+ { 17, 52, 4 , 7 },
+ { 29, 52, 5 , 10 },
+ { 42, 52, 5 , 10 },
+ { 55, 52, 5 , 7 },
+ { 68, 52, 5 , 7 },
+ { 81, 52, 3 , 9 },
+ { 92, 52, 5 , 7 },
+ { 105, 52, 5 , 8 },
+ { 118, 52, 9 , 8 },
+ { 135, 52, 5 , 9 },
+ { 148, 52, 6 , 9 },
+ { 162, 52, 4 , 7 },
+ { 174, 52, 5 , 12 },
+ { 187, 52, 1 , 12 },
+ { 196, 52, 5 , 12 },
+ { 209, 52, 6 , 2 },
+ { 223, 52, 1 , 9 },
+ { 232, 52, 5 , 10 },
+ { 245, 52, 6 , 9 },
+ { 259, 52, 7 , 9 },
+ { 274, 52, 5 , 9 },
+ { 287, 52, 6 , 12 },
+ { 301, 52, 5 , 10 },
+ { 314, 52, 5 , 10 },
+ { 327, 52, 8 , 8 },
+ { 343, 52, 4 , 7 },
+ { 355, 52, 6 , 5 },
+ { 369, 52, 6 , 3 },
+ { 383, 52, 8 , 8 },
+ { 399, 52, 5 , 1 },
+ { 412, 52, 4 , 4 },
+ { 424, 52, 5 , 7 },
+ { 437, 52, 3 , 4 },
+ { 448, 52, 3 , 4 },
+ { 459, 52, 5 , 12 },
+ { 472, 52, 5 , 10 },
+ { 485, 52, 7 , 11 },
+ { 500, 52, 1 , 1 },
+ { 4, 76, 4 , 10 },
+ { 16, 76, 2 , 4 },
+ { 26, 76, 4 , 7 },
+ { 38, 76, 6 , 5 },
+ { 52, 76, 11 , 9 },
+ { 71, 76, 7 , 7 },
+ { 86, 76, 5 , 12 },
+ { 99, 76, 5 , 9 },
+ { 112, 76, 7 , 12 },
+ { 127, 76, 7 , 12 },
+ { 142, 76, 7 , 12 },
+ { 157, 76, 7 , 12 },
+ { 172, 76, 7 , 11 },
+ { 187, 76, 7 , 12 },
+ { 202, 76, 10 , 9 },
+ { 220, 76, 5 , 12 },
+ { 233, 76, 5 , 12 },
+ { 246, 76, 5 , 12 },
+ { 259, 76, 5 , 12 },
+ { 272, 76, 5 , 11 },
+ { 285, 76, 2 , 12 },
+ { 295, 76, 2 , 12 },
+ { 305, 76, 3 , 12 },
+ { 316, 76, 3 , 11 },
+ { 327, 76, 7 , 9 },
+ { 342, 76, 6 , 12 },
+ { 356, 76, 7 , 12 },
+ { 371, 76, 7 , 12 },
+ { 386, 76, 7 , 12 },
+ { 401, 76, 7 , 12 },
+ { 416, 76, 7 , 11 },
+ { 431, 76, 5 , 5 },
+ { 444, 76, 7 , 9 },
+ { 459, 76, 6 , 12 },
+ { 473, 76, 6 , 12 },
+ { 487, 76, 6 , 12 },
+ { 4, 100, 6 , 11 },
+ { 18, 100, 5 , 13 },
+ { 31, 100, 5 , 9 },
+ { 44, 100, 5 , 11 },
+ { 57, 100, 6 , 10 },
+ { 71, 100, 6 , 10 },
+ { 85, 100, 6 , 10 },
+ { 99, 100, 6 , 10 },
+ { 113, 100, 6 , 9 },
+ { 127, 100, 6 , 11 },
+ { 141, 100, 7 , 7 },
+ { 156, 100, 4 , 10 },
+ { 168, 100, 4 , 10 },
+ { 180, 100, 4 , 10 },
+ { 192, 100, 4 , 10 },
+ { 204, 100, 4 , 9 },
+ { 216, 100, 2 , 10 },
+ { 226, 100, 2 , 10 },
+ { 236, 100, 3 , 10 },
+ { 247, 100, 3 , 9 },
+ { 258, 100, 5 , 9 },
+ { 271, 100, 5 , 12 },
+ { 284, 100, 4 , 10 },
+ { 296, 100, 4 , 10 },
+ { 308, 100, 4 , 10 },
+ { 320, 100, 5 , 10 },
+ { 333, 100, 4 , 9 },
+ { 345, 100, 5 , 5 },
+ { 358, 100, 6 , 7 },
+ { 372, 100, 5 , 10 },
+ { 385, 100, 5 , 10 },
+ { 398, 100, 5 , 10 },
+ { 411, 100, 5 , 9 },
+ { 424, 100, 6 , 12 },
+ { 438, 100, 5 , 12 },
+ { 451, 100, 6 , 11 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo lavandaFontGlyphs[189] = {
+ { 32, 0, 12, 5, { 0 }},
+ { 33, 0, 3, 2, { 0 }},
+ { 34, 0, 3, 4, { 0 }},
+ { 35, 0, 3, 8, { 0 }},
+ { 36, 0, 2, 6, { 0 }},
+ { 37, 0, 4, 11, { 0 }},
+ { 38, 0, 3, 8, { 0 }},
+ { 39, 0, 3, 2, { 0 }},
+ { 40, 0, 2, 4, { 0 }},
+ { 41, 0, 2, 4, { 0 }},
+ { 42, 0, 3, 6, { 0 }},
+ { 43, 0, 5, 6, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 7, 4, { 0 }},
+ { 46, 0, 11, 2, { 0 }},
+ { 47, 0, 2, 5, { 0 }},
+ { 48, 0, 3, 6, { 0 }},
+ { 49, 0, 3, 4, { 0 }},
+ { 50, 0, 3, 6, { 0 }},
+ { 51, 0, 3, 6, { 0 }},
+ { 52, 0, 3, 6, { 0 }},
+ { 53, 0, 3, 6, { 0 }},
+ { 54, 0, 3, 6, { 0 }},
+ { 55, 0, 3, 6, { 0 }},
+ { 56, 0, 3, 6, { 0 }},
+ { 57, 0, 3, 6, { 0 }},
+ { 58, 0, 7, 2, { 0 }},
+ { 59, 0, 7, 3, { 0 }},
+ { 60, 0, 5, 5, { 0 }},
+ { 61, 0, 6, 5, { 0 }},
+ { 62, 0, 5, 5, { 0 }},
+ { 63, 0, 3, 6, { 0 }},
+ { 64, 0, 4, 8, { 0 }},
+ { 65, 0, 3, 8, { 0 }},
+ { 66, 0, 3, 7, { 0 }},
+ { 67, 0, 3, 6, { 0 }},
+ { 68, 0, 3, 7, { 0 }},
+ { 69, 0, 3, 6, { 0 }},
+ { 70, 0, 3, 6, { 0 }},
+ { 71, 0, 3, 7, { 0 }},
+ { 72, 0, 2, 6, { 0 }},
+ { 73, 0, 3, 2, { 0 }},
+ { 74, 0, 3, 7, { 0 }},
+ { 75, 0, 3, 7, { 0 }},
+ { 76, 0, 3, 6, { 0 }},
+ { 77, 0, 3, 9, { 0 }},
+ { 78, 0, 2, 7, { 0 }},
+ { 79, 0, 3, 8, { 0 }},
+ { 80, 0, 3, 6, { 0 }},
+ { 81, 0, 3, 8, { 0 }},
+ { 82, 0, 3, 6, { 0 }},
+ { 83, 0, 3, 7, { 0 }},
+ { 84, 0, 3, 8, { 0 }},
+ { 85, 0, 3, 7, { 0 }},
+ { 86, 0, 2, 7, { 0 }},
+ { 87, 0, 2, 10, { 0 }},
+ { 88, 0, 3, 7, { 0 }},
+ { 89, 0, 3, 6, { 0 }},
+ { 90, 0, 3, 6, { 0 }},
+ { 91, 0, 2, 4, { 0 }},
+ { 92, 0, 2, 5, { 0 }},
+ { 93, 0, 2, 4, { 0 }},
+ { 94, 0, 3, 6, { 0 }},
+ { 95, 0, 13, 7, { 0 }},
+ { 96, 0, 3, 4, { 0 }},
+ { 97, 0, 5, 7, { 0 }},
+ { 98, 0, 3, 6, { 0 }},
+ { 99, 0, 5, 5, { 0 }},
+ { 100, 0, 2, 6, { 0 }},
+ { 101, 0, 5, 5, { 0 }},
+ { 102, 0, 2, 4, { 0 }},
+ { 103, 0, 4, 5, { 0 }},
+ { 104, 0, 3, 6, { 0 }},
+ { 105, 0, 3, 2, { 0 }},
+ { 106, -1, 3, 5, { 0 }},
+ { 107, 0, 3, 6, { 0 }},
+ { 108, 0, 3, 2, { 0 }},
+ { 109, 0, 5, 9, { 0 }},
+ { 110, 0, 5, 6, { 0 }},
+ { 111, 0, 5, 5, { 0 }},
+ { 112, 0, 5, 6, { 0 }},
+ { 113, 0, 5, 6, { 0 }},
+ { 114, 0, 5, 6, { 0 }},
+ { 115, 0, 5, 6, { 0 }},
+ { 116, 0, 3, 4, { 0 }},
+ { 117, 0, 5, 6, { 0 }},
+ { 118, 0, 4, 6, { 0 }},
+ { 119, 0, 4, 10, { 0 }},
+ { 120, 0, 5, 6, { 0 }},
+ { 121, -1, 5, 6, { 0 }},
+ { 122, 0, 5, 5, { 0 }},
+ { 123, 0, 2, 6, { 0 }},
+ { 124, 0, 2, 2, { 0 }},
+ { 125, 0, 2, 6, { 0 }},
+ { 126, 0, 7, 7, { 0 }},
+ { 161, 0, 5, 2, { 0 }},
+ { 162, 0, 4, 6, { 0 }},
+ { 163, 0, 3, 7, { 0 }},
+ { 8364, 0, 3, 8, { 0 }},
+ { 165, 0, 3, 6, { 0 }},
+ { 352, 0, 0, 7, { 0 }},
+ { 167, 0, 3, 6, { 0 }},
+ { 353, 0, 2, 6, { 0 }},
+ { 169, 0, 4, 9, { 0 }},
+ { 170, 0, 3, 5, { 0 }},
+ { 171, 0, 6, 7, { 0 }},
+ { 172, 0, 6, 7, { 0 }},
+ { 174, 0, 4, 9, { 0 }},
+ { 175, 0, 2, 6, { 0 }},
+ { 176, 0, 3, 5, { 0 }},
+ { 177, 0, 5, 6, { 0 }},
+ { 178, 0, 3, 4, { 0 }},
+ { 179, 0, 3, 4, { 0 }},
+ { 381, 0, 0, 6, { 0 }},
+ { 181, 0, 5, 6, { 0 }},
+ { 182, 0, 3, 8, { 0 }},
+ { 183, 0, 7, 2, { 0 }},
+ { 382, 0, 2, 5, { 0 }},
+ { 185, 0, 3, 3, { 0 }},
+ { 186, 0, 3, 5, { 0 }},
+ { 187, 0, 6, 7, { 0 }},
+ { 338, 0, 3, 12, { 0 }},
+ { 339, 0, 5, 8, { 0 }},
+ { 376, 0, 1, 6, { 0 }},
+ { 191, 0, 5, 6, { 0 }},
+ { 192, 0, 0, 8, { 0 }},
+ { 193, 0, 0, 8, { 0 }},
+ { 194, 0, 0, 8, { 0 }},
+ { 195, 0, 0, 8, { 0 }},
+ { 196, 0, 1, 8, { 0 }},
+ { 197, 0, 0, 8, { 0 }},
+ { 198, 0, 3, 11, { 0 }},
+ { 199, 0, 3, 6, { 0 }},
+ { 200, 0, 0, 6, { 0 }},
+ { 201, 0, 0, 6, { 0 }},
+ { 202, 0, 0, 6, { 0 }},
+ { 203, 0, 1, 6, { 0 }},
+ { 204, -1, 0, 2, { 0 }},
+ { 205, 0, 0, 3, { 0 }},
+ { 206, -1, 0, 3, { 0 }},
+ { 207, -1, 1, 3, { 0 }},
+ { 208, -1, 3, 7, { 0 }},
+ { 209, 0, 0, 7, { 0 }},
+ { 210, 0, 0, 8, { 0 }},
+ { 211, 0, 0, 8, { 0 }},
+ { 212, 0, 0, 8, { 0 }},
+ { 213, 0, 0, 8, { 0 }},
+ { 214, 0, 1, 8, { 0 }},
+ { 215, 0, 5, 6, { 0 }},
+ { 216, 0, 3, 8, { 0 }},
+ { 217, 0, 0, 7, { 0 }},
+ { 218, 0, 0, 7, { 0 }},
+ { 219, 0, 0, 7, { 0 }},
+ { 220, 0, 1, 7, { 0 }},
+ { 221, 0, 0, 6, { 0 }},
+ { 222, 0, 3, 6, { 0 }},
+ { 223, 0, 3, 6, { 0 }},
+ { 224, 0, 2, 7, { 0 }},
+ { 225, 0, 2, 7, { 0 }},
+ { 226, 0, 2, 7, { 0 }},
+ { 227, 0, 2, 7, { 0 }},
+ { 228, 0, 3, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 5, 8, { 0 }},
+ { 231, 0, 5, 5, { 0 }},
+ { 232, 0, 2, 5, { 0 }},
+ { 233, 0, 2, 5, { 0 }},
+ { 234, 0, 2, 5, { 0 }},
+ { 235, 0, 3, 5, { 0 }},
+ { 236, -1, 2, 2, { 0 }},
+ { 237, 0, 2, 3, { 0 }},
+ { 238, -1, 2, 3, { 0 }},
+ { 239, -1, 3, 3, { 0 }},
+ { 240, 0, 3, 6, { 0 }},
+ { 241, 0, 2, 6, { 0 }},
+ { 242, 0, 2, 5, { 0 }},
+ { 243, 0, 2, 5, { 0 }},
+ { 244, 0, 2, 5, { 0 }},
+ { 245, 0, 2, 6, { 0 }},
+ { 246, 0, 3, 5, { 0 }},
+ { 247, 0, 5, 6, { 0 }},
+ { 248, -1, 5, 6, { 0 }},
+ { 249, 0, 2, 6, { 0 }},
+ { 250, 0, 2, 6, { 0 }},
+ { 251, 0, 2, 6, { 0 }},
+ { 252, 0, 3, 6, { 0 }},
+ { 253, -1, 2, 6, { 0 }},
+ { 254, 0, 3, 6, { 0 }},
+ { 255, -1, 3, 6, { 0 }},
+};
+
+// Style loading function: Lavanda
+static void GuiLoadStyleLavanda(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < LAVANDA_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(lavandaStyleProps[i].controlId, lavandaStyleProps[i].propertyId, lavandaStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int lavandaFontDataSize = 0;
+ unsigned char *data = DecompressData(lavandaFontData, LAVANDA_STYLE_FONT_ATLAS_COMP_SIZE, &lavandaFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, lavandaFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, lavandaFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/lavanda/style_lavanda.old.rgs b/external/raygui-4.0/styles/lavanda/style_lavanda.old.rgs
new file mode 100644
index 0000000..0ce7c02
Binary files /dev/null and b/external/raygui-4.0/styles/lavanda/style_lavanda.old.rgs differ
diff --git a/external/raygui-4.0/styles/lavanda/style_lavanda.png b/external/raygui-4.0/styles/lavanda/style_lavanda.png
new file mode 100644
index 0000000..6ce35e5
Binary files /dev/null and b/external/raygui-4.0/styles/lavanda/style_lavanda.png differ
diff --git a/external/raygui-4.0/styles/lavanda/style_lavanda.rgs b/external/raygui-4.0/styles/lavanda/style_lavanda.rgs
new file mode 100644
index 0000000..4b18673
Binary files /dev/null and b/external/raygui-4.0/styles/lavanda/style_lavanda.rgs differ
diff --git a/external/raygui-4.0/styles/lavanda/style_lavanda.txt.rgs b/external/raygui-4.0/styles/lavanda/style_lavanda.txt.rgs
new file mode 100644
index 0000000..33ee9bd
--- /dev/null
+++ b/external/raygui-4.0/styles/lavanda/style_lavanda.txt.rgs
@@ -0,0 +1,26 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 16 charset.txt Cartridge.ttf
+p 00 00 0xab9bd3ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x3e4350ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0xdadaf4ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xee84a0ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0xf4b7c7ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xb7657bff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0xd5c8dbff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0x966ec0ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0xd7ccf7ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x8fa2bdff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x6b798dff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x8292a9ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x00000010 TEXT_SIZE
+p 00 18 0x84adb7ff LINE_COLOR
+p 00 19 0x5b5b81ff BACKGROUND_COLOR
+p 00 20 0x00000018 TEXT_LINE_SPACING
diff --git a/external/raygui-4.0/styles/sunny/GenericMobileSystemNuevo.ttf b/external/raygui-4.0/styles/sunny/GenericMobileSystemNuevo.ttf
new file mode 100644
index 0000000..777a528
Binary files /dev/null and b/external/raygui-4.0/styles/sunny/GenericMobileSystemNuevo.ttf differ
diff --git a/external/raygui-4.0/styles/sunny/README.md b/external/raygui-4.0/styles/sunny/README.md
new file mode 100644
index 0000000..082c1a2
--- /dev/null
+++ b/external/raygui-4.0/styles/sunny/README.md
@@ -0,0 +1,27 @@
+## style: sunny
+
+Sweet, colorful, sunny! Inspired by the [Playdate](https://play.date/) console and its [pulp](https://play.date/pulp/) editor!
+
+![sunny style table](style_sunny.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_sunny.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_sunny.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_sunny.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_sunny.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_sunny.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![sunny style screen](screenshot.png)
+
+## about font
+
+"Generic Mobile System" font by Jayvee Enaguas (HarvettFox96).
+
+CC0 free font, downloaded from dafont.com: [generic-mobile-system](https://www.dafont.com/es/generic-mobile-system.font)
diff --git a/external/raygui-4.0/styles/sunny/charset.txt b/external/raygui-4.0/styles/sunny/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/sunny/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/sunny/font_LICENSE.txt b/external/raygui-4.0/styles/sunny/font_LICENSE.txt
new file mode 100644
index 0000000..60f42f6
--- /dev/null
+++ b/external/raygui-4.0/styles/sunny/font_LICENSE.txt
@@ -0,0 +1,160 @@
+===| Description |===
+
+Generic Mobile System is a raster proportional sans serif typeface, extracted from various generic/knockoff mobile devices, created with libre/free font editor software FontForge.
+
+Source files: https://notabug.org/HarvettFox96/ttf-genericmobile/
+
+===| Update log |===
+
+Version 20190323.02:
+
+- OS/2 and TeX metric fixes.
+- Updated Panose.
+
+Version 20190323.01:
+
+- Added outline variant.
+- Minor fixes.
+
+Version 20190103.03:
+
+- Minor bearing tweaks. (Clásico only)
+- Minor fixes.
+
+Version 20190103.02:
+
+- Bearing tweaks from the different generic mobile phone as Cherry Mobile S5. (Clásico only)
+- Minor fixes.
+
+Version 20190103.01:
+
+- Initial public release.
+
+===| Copyright/attribution notice |===
+
+© 2009-2019 Jayvee Enaguas (HarvettFox96). Released under a libre/free public domain licence as Creative Commons Zero (CC0) 1.0. Applies worldwide countries including the Philippines, Spain, etc.
+
+
+-------------------------------------------------------------------------------
+
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/external/raygui-4.0/styles/sunny/screenshot.png b/external/raygui-4.0/styles/sunny/screenshot.png
new file mode 100644
index 0000000..20151f8
Binary files /dev/null and b/external/raygui-4.0/styles/sunny/screenshot.png differ
diff --git a/external/raygui-4.0/styles/sunny/style_sunny.h b/external/raygui-4.0/styles/sunny/style_sunny.h
new file mode 100644
index 0000000..53be6a2
--- /dev/null
+++ b/external/raygui-4.0/styles/sunny/style_sunny.h
@@ -0,0 +1,616 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleSunny(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define SUNNY_STYLE_PROPS_COUNT 33
+
+// Custom style name: Sunny
+static const GuiStyleProp sunnyStyleProps[SUNNY_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x9c760aff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x594006ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0xf6d519ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xf6ee89ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0xf5f3d1ff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xf4cd19ff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0xf7e580ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0xf7f2c1ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x52470aff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0xc0be92ff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0xd3d3a1ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0xbcbc89ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0x725706ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0xf0be4bff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+ { 1, 2, 0x504506ff }, // LABEL_TEXT_COLOR_NORMAL
+ { 1, 5, 0xfdeb9bff }, // LABEL_TEXT_COLOR_FOCUSED
+ { 1, 8, 0xf5e8a4ff }, // LABEL_TEXT_COLOR_PRESSED
+ { 2, 2, 0xebc21fff }, // BUTTON_TEXT_COLOR_NORMAL
+ { 3, 2, 0xebc21fff }, // TOGGLE_TEXT_COLOR_NORMAL
+ { 4, 2, 0x81700fff }, // SLIDER_TEXT_COLOR_NORMAL
+ { 4, 5, 0xf4e49aff }, // SLIDER_TEXT_COLOR_FOCUSED
+ { 7, 2, 0xebc21fff }, // COMBOBOX_TEXT_COLOR_NORMAL
+ { 8, 2, 0xefd87bff }, // DROPDOWNBOX_TEXT_COLOR_NORMAL
+ { 8, 5, 0xd4b219ff }, // DROPDOWNBOX_TEXT_COLOR_FOCUSED
+ { 9, 2, 0x7a680bff }, // TEXTBOX_TEXT_COLOR_NORMAL
+ { 9, 5, 0xad931fff }, // TEXTBOX_TEXT_COLOR_FOCUSED
+ { 10, 2, 0x62570eff }, // VALUEBOX_TEXT_COLOR_NORMAL
+ { 10, 5, 0xf2df88ff }, // VALUEBOX_TEXT_COLOR_FOCUSED
+ { 12, 2, 0xf4e798ff }, // LISTVIEW_TEXT_COLOR_NORMAL
+ { 15, 2, 0xebc21fff }, // STATUSBAR_TEXT_COLOR_NORMAL
+};
+
+// WARNING: This style uses a custom font: "GenericMobileSystemNuevo.ttf" (size: 16, spacing: 0)
+
+#define SUNNY_STYLE_FONT_ATLAS_COMP_SIZE 2462
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char sunnyFontData[SUNNY_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0x59, 0xb2, 0xeb, 0x34, 0x10, 0x00, 0x50, 0x6d, 0x83, 0xfd, 0xef, 0x8d, 0x6d, 0x88, 0xa2, 0x28, 0x0a, 0xb8, 0x8f,
+ 0x58, 0x52, 0x77, 0xcb, 0x53, 0x0e, 0xa7, 0xf8, 0xb9, 0x7e, 0x49, 0x6c, 0xd9, 0x6d, 0x0d, 0xb6, 0x5a, 0xbd, 0x01, 0x00,
+ 0x00, 0x00, 0x5f, 0xef, 0xcf, 0xff, 0xfe, 0xff, 0x6f, 0xff, 0xb7, 0xe5, 0x78, 0xdb, 0xdf, 0xff, 0x62, 0xb4, 0xa5, 0x7f,
+ 0xdc, 0x93, 0x7e, 0xb0, 0x6d, 0xee, 0xb7, 0x62, 0xfb, 0xd5, 0x97, 0xca, 0xa6, 0x1f, 0x94, 0x5a, 0x4b, 0xff, 0xbd, 0x1d,
+ 0x96, 0x7d, 0x0f, 0x94, 0x5e, 0x3b, 0xdc, 0xe7, 0xcf, 0x9f, 0x1c, 0x6f, 0xa9, 0xdc, 0xcf, 0x95, 0x32, 0xad, 0x3c, 0x3f,
+ 0x2b, 0x25, 0xd8, 0x96, 0xb7, 0x1e, 0x97, 0x54, 0x9b, 0x2a, 0xc7, 0xf1, 0x37, 0xf7, 0x9b, 0xc4, 0xff, 0xf1, 0xd1, 0xfc,
+ 0x1d, 0x83, 0x47, 0x67, 0x7f, 0xfe, 0xda, 0x68, 0xd3, 0xf7, 0x84, 0x7f, 0x7e, 0xbb, 0x2e, 0x42, 0xb3, 0xdf, 0xd2, 0x87,
+ 0x77, 0xc2, 0x95, 0x12, 0x3a, 0x2e, 0xbd, 0x16, 0x8a, 0x89, 0xd1, 0x77, 0x46, 0xf6, 0x65, 0x66, 0xdb, 0xdc, 0xfe, 0xc5,
+ 0xae, 0xf9, 0xf1, 0xf7, 0x1d, 0x5f, 0x69, 0x47, 0x67, 0x78, 0x74, 0xe5, 0x1e, 0x1f, 0xdf, 0xfa, 0x59, 0xcd, 0x44, 0xfd,
+ 0x9e, 0xf8, 0xef, 0xff, 0x8a, 0xb3, 0x1e, 0x8c, 0xc1, 0x7c, 0xdd, 0xb0, 0x5e, 0x2b, 0x1c, 0xdf, 0xb3, 0xf6, 0x95, 0xf0,
+ 0x51, 0x39, 0xf5, 0xc0, 0x35, 0xbc, 0x7e, 0xce, 0xa2, 0xbf, 0xb3, 0x23, 0xfe, 0x2b, 0xa2, 0xb8, 0x4d, 0xd4, 0x88, 0x91,
+ 0x36, 0xc5, 0x71, 0x8b, 0x33, 0x1f, 0xe1, 0xa3, 0x7d, 0x89, 0xb4, 0x67, 0xf2, 0x65, 0xb9, 0xda, 0xe6, 0xd8, 0x17, 0xff,
+ 0x15, 0xf5, 0xed, 0x7a, 0x5d, 0xb2, 0xaf, 0x7c, 0x67, 0xea, 0xeb, 0xfb, 0xc7, 0xff, 0xfa, 0xb1, 0x55, 0xc4, 0x7f, 0xcd,
+ 0x59, 0x59, 0x8f, 0xff, 0x2e, 0xfe, 0xa7, 0xeb, 0xff, 0xcf, 0xa5, 0xde, 0x83, 0xfd, 0xaf, 0x7c, 0xaf, 0xbd, 0xaa, 0x9d,
+ 0x7f, 0x6d, 0xfc, 0x8f, 0xfa, 0x83, 0x6d, 0x39, 0xfe, 0x63, 0xbd, 0xcf, 0x48, 0x6f, 0xa3, 0xaa, 0xfd, 0xbf, 0xb7, 0xf5,
+ 0x70, 0xdc, 0x7b, 0x8c, 0x44, 0xf8, 0xda, 0x98, 0x47, 0xcd, 0x37, 0x5f, 0x11, 0xff, 0x6d, 0x62, 0x6f, 0xfa, 0xb0, 0xff,
+ 0x3f, 0x7b, 0x87, 0x5f, 0x8b, 0xff, 0xba, 0xba, 0xe3, 0xca, 0xf8, 0xef, 0xc1, 0x11, 0xb1, 0xea, 0x7e, 0x7c, 0xfc, 0xd8,
+ 0xd6, 0xc6, 0xe7, 0xce, 0xeb, 0xff, 0x8f, 0xda, 0x81, 0x99, 0xf8, 0xff, 0x96, 0xf6, 0xff, 0x4c, 0x4b, 0x7b, 0x54, 0x8a,
+ 0xf3, 0xf7, 0xb3, 0x2b, 0x6a, 0xf3, 0x6b, 0xe3, 0xbf, 0x4f, 0x8d, 0x61, 0xdf, 0x3b, 0xfe, 0xdb, 0x72, 0x2f, 0xaf, 0xf2,
+ 0xda, 0x8d, 0x5e, 0x51, 0xa3, 0x2b, 0x77, 0xe6, 0xae, 0x76, 0xcf, 0xf8, 0x8f, 0x5d, 0xcf, 0x7d, 0xd8, 0xca, 0xef, 0x89,
+ 0xf8, 0x6f, 0xaf, 0x89, 0xff, 0x1e, 0x1c, 0xed, 0xf8, 0xdc, 0xde, 0x8b, 0x8d, 0xc7, 0x45, 0x5a, 0xf2, 0x99, 0x36, 0x4a,
+ 0x55, 0xfc, 0xdf, 0xe3, 0x4c, 0xaa, 0xff, 0x2b, 0xc6, 0xff, 0xdb, 0x61, 0x0b, 0xff, 0xbb, 0xe2, 0xff, 0xf8, 0xf9, 0x5f,
+ 0xbb, 0xfd, 0xb3, 0xba, 0x68, 0xfc, 0xd7, 0x8c, 0xff, 0x9f, 0x7f, 0xb7, 0x9e, 0xe9, 0xb9, 0xe6, 0xe2, 0xff, 0x4e, 0xcf,
+ 0xff, 0xf6, 0xc6, 0xff, 0xe8, 0xa9, 0xf7, 0x9b, 0xda, 0xff, 0x95, 0xe3, 0xf8, 0xf1, 0x77, 0x6e, 0xf6, 0xbd, 0x53, 0xd4,
+ 0x42, 0x6f, 0x72, 0xdd, 0x33, 0xfa, 0xa3, 0xcf, 0x81, 0x72, 0xa3, 0x74, 0x57, 0xbf, 0xff, 0x53, 0x5f, 0x82, 0xe7, 0xed,
+ 0x4f, 0xbf, 0x71, 0x9b, 0x91, 0x77, 0xbd, 0x25, 0xeb, 0xea, 0x3a, 0xf3, 0xf9, 0x6c, 0xfc, 0xb7, 0x9c, 0x1f, 0x76, 0xd6,
+ 0x6c, 0x4a, 0xe2, 0x19, 0x63, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe4, 0xf9,
+ 0x0b, 0x91, 0xb9, 0x86, 0xd1, 0x3c, 0x04, 0xb5, 0xf9, 0x10, 0xfa, 0x8f, 0x3c, 0xac, 0xab, 0xdf, 0x3d, 0x3b, 0xd7, 0x32,
+ 0x33, 0x4f, 0xb3, 0xf6, 0xb3, 0x55, 0x99, 0x25, 0x6a, 0x67, 0x9e, 0x8f, 0xf3, 0xdd, 0xac, 0x66, 0x6b, 0x8e, 0x65, 0x41,
+ 0x5b, 0xcf, 0x69, 0x9e, 0xc9, 0xc3, 0x57, 0x3d, 0xb7, 0xba, 0x26, 0x3f, 0xda, 0xfc, 0x9c, 0xf7, 0x9a, 0x4c, 0x23, 0x75,
+ 0xf1, 0xbf, 0x7e, 0x1e, 0xfa, 0x8f, 0xfd, 0xe8, 0x17, 0x64, 0x62, 0xa8, 0xdf, 0x3a, 0xf7, 0xf7, 0x3b, 0xc5, 0xff, 0xec,
+ 0x3d, 0x38, 0x7b, 0xf5, 0xc6, 0x67, 0xdc, 0x8d, 0xb2, 0x4f, 0x5c, 0x9f, 0x5b, 0xa5, 0x15, 0xe5, 0x47, 0xad, 0x8f, 0xff,
+ 0x76, 0x52, 0xfd, 0x1f, 0x8d, 0xff, 0x3e, 0x5c, 0xcd, 0xe6, 0xbe, 0xf1, 0xbf, 0x9e, 0x77, 0x22, 0xfb, 0xab, 0xb9, 0x95,
+ 0x1c, 0xe2, 0xb9, 0xc6, 0xf3, 0xf1, 0x9f, 0xcb, 0x14, 0x74, 0x6e, 0xdd, 0x7a, 0x7d, 0xfc, 0x47, 0x4b, 0xe4, 0xaa, 0xf8,
+ 0x8f, 0x5f, 0x25, 0x7d, 0x98, 0xcd, 0xfa, 0x8e, 0xf1, 0xdf, 0xbf, 0x3e, 0xfe, 0xeb, 0x73, 0xf9, 0x46, 0x23, 0x20, 0x92,
+ 0x07, 0x7d, 0xa6, 0x5f, 0xbd, 0xda, 0xb3, 0x8b, 0xf7, 0xbb, 0xa2, 0xf5, 0xff, 0xe8, 0xf3, 0x33, 0x47, 0x72, 0x75, 0xfc,
+ 0xb7, 0x61, 0x84, 0xf7, 0x44, 0x94, 0xc6, 0x47, 0x40, 0x32, 0x39, 0xaf, 0xae, 0x89, 0xff, 0x16, 0x5a, 0x31, 0x30, 0x5e,
+ 0xcf, 0xdf, 0x3d, 0xfe, 0xab, 0xfb, 0x06, 0xd1, 0x11, 0x83, 0xea, 0x7d, 0xbc, 0x5f, 0xff, 0xbf, 0x17, 0xb4, 0x12, 0x77,
+ 0xc4, 0x7f, 0xb6, 0x7c, 0xa2, 0xd1, 0x14, 0x8b, 0xff, 0xf9, 0xda, 0x3d, 0xb6, 0x9a, 0x40, 0x6c, 0xdb, 0x7b, 0xe3, 0xbf,
+ 0x36, 0x7f, 0xea, 0xfa, 0x58, 0xf1, 0x9b, 0xe2, 0x3f, 0xda, 0xff, 0x9f, 0xef, 0x71, 0xdd, 0x2b, 0xfe, 0xdb, 0xc4, 0xfa,
+ 0x3c, 0x67, 0xc7, 0xff, 0x28, 0xdb, 0xea, 0xdb, 0xe2, 0x3f, 0x1a, 0x5b, 0xd1, 0xf5, 0x8c, 0x5a, 0xb8, 0xa6, 0x7b, 0x7b,
+ 0xfd, 0xdf, 0x5e, 0x1a, 0xff, 0xf1, 0xf5, 0x65, 0x9e, 0x15, 0xff, 0xd5, 0xad, 0x86, 0xeb, 0xf3, 0xea, 0x45, 0x47, 0x1b,
+ 0xe3, 0xa3, 0x94, 0xef, 0x6e, 0xff, 0xf7, 0x0d, 0xad, 0xf0, 0xec, 0xf3, 0xff, 0xab, 0xe2, 0x7f, 0xd7, 0xf3, 0xbf, 0x36,
+ 0xbd, 0xe6, 0xdf, 0xae, 0xbd, 0x12, 0xff, 0xd5, 0xf1, 0x5f, 0xb9, 0x76, 0xe2, 0xda, 0xbf, 0xa8, 0x7e, 0xff, 0xa7, 0x7e,
+ 0x24, 0x6d, 0xff, 0xfb, 0x3f, 0x7b, 0xca, 0xa7, 0x4d, 0xad, 0x98, 0xb6, 0xfe, 0xab, 0x6d, 0x72, 0x55, 0xe3, 0xd8, 0x3e,
+ 0xd7, 0xbf, 0x7d, 0x73, 0xf7, 0xf8, 0x8f, 0xbd, 0x6d, 0x10, 0xfd, 0x64, 0xfc, 0x13, 0xf7, 0x59, 0x0b, 0xec, 0x3b, 0xdf,
+ 0xa2, 0x54, 0x0a, 0xd5, 0x25, 0xa4, 0x54, 0x71, 0x07, 0x78, 0xd7, 0x7b, 0xe6, 0xbb, 0xfe, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf7, 0xcd, 0x5e, 0x99, 0xcd, 0xb9, 0xfd, 0xeb, 0x5f, 0x7b, 0x68, 0xbe,
+ 0x6b, 0x4f, 0x7e, 0xae, 0x2f, 0xe7, 0xc1, 0x58, 0x9b, 0x77, 0x5a, 0x91, 0x83, 0xa1, 0x3a, 0x8f, 0xd4, 0xb8, 0x5c, 0x66,
+ 0xcf, 0xf4, 0x78, 0x26, 0xf1, 0xea, 0x15, 0x12, 0x99, 0xd7, 0x93, 0xc9, 0xa8, 0x93, 0x59, 0x4b, 0x20, 0x9e, 0x09, 0xb1,
+ 0x2d, 0x7e, 0x6b, 0xec, 0xac, 0xfd, 0x3a, 0xbf, 0x3a, 0x9a, 0xef, 0xb3, 0x26, 0xfe, 0x63, 0xb9, 0x25, 0xaf, 0xc8, 0xb4,
+ 0x16, 0xbf, 0x9a, 0x6a, 0xf7, 0xb0, 0xbe, 0x54, 0xe6, 0xf6, 0x36, 0xf7, 0xf7, 0xcc, 0x9c, 0xfe, 0x5c, 0xee, 0x81, 0xd5,
+ 0x92, 0xe8, 0x53, 0xd9, 0x52, 0x56, 0x3f, 0xf9, 0xf9, 0x73, 0xc7, 0xdb, 0xfa, 0x54, 0xe6, 0x88, 0xd5, 0x6f, 0xfd, 0x6d,
+ 0xf0, 0xf9, 0x7e, 0x78, 0xe7, 0xad, 0x9d, 0xd1, 0xfa, 0x94, 0xf8, 0x5f, 0xbf, 0x77, 0x9f, 0x1d, 0xff, 0xf1, 0xfb, 0x54,
+ 0x2b, 0xcc, 0xd2, 0xb3, 0xbe, 0x36, 0x46, 0x64, 0xe6, 0x6e, 0x3e, 0x47, 0xd0, 0x19, 0x19, 0x35, 0x7e, 0x8d, 0xa6, 0x95,
+ 0xb3, 0x36, 0x17, 0xfd, 0x9f, 0xe2, 0xf7, 0xa8, 0xb5, 0xb5, 0x2f, 0xfe, 0x6b, 0x32, 0xf2, 0x3d, 0x27, 0xfe, 0x67, 0x7a,
+ 0x1b, 0xe7, 0xc5, 0xff, 0xf8, 0xef, 0x75, 0x59, 0xb5, 0x2b, 0x73, 0xed, 0x8c, 0x72, 0x2d, 0xb7, 0xd0, 0x19, 0xe9, 0xc1,
+ 0xfb, 0x4a, 0x2f, 0xce, 0x67, 0xde, 0x7f, 0xfc, 0x3f, 0x5b, 0x53, 0xcf, 0xc6, 0xff, 0xfa, 0x2f, 0xfe, 0x36, 0xd1, 0x7e,
+ 0xa8, 0x6e, 0xff, 0xaf, 0x5c, 0x2f, 0x4f, 0x8a, 0xff, 0x36, 0x95, 0x8b, 0xec, 0xde, 0xf5, 0x7f, 0x65, 0x4e, 0xad, 0xfa,
+ 0xf8, 0x8f, 0x45, 0x78, 0xa4, 0x26, 0x9f, 0x5f, 0xf1, 0x60, 0xed, 0xbc, 0x8d, 0x5b, 0xf9, 0x3d, 0xd1, 0xfe, 0xdf, 0x11,
+ 0xff, 0xd5, 0xe3, 0x7f, 0xf1, 0x35, 0x3c, 0xf6, 0x8c, 0x74, 0x45, 0xc6, 0xff, 0xda, 0x09, 0xfd, 0xff, 0x51, 0x3b, 0x31,
+ 0x5a, 0x2a, 0xf5, 0x6b, 0x53, 0x55, 0x66, 0xdb, 0x5e, 0x8d, 0xff, 0x4c, 0xfd, 0x1f, 0x1d, 0x87, 0xc8, 0xb4, 0x10, 0xdb,
+ 0x60, 0xe4, 0x60, 0xf4, 0x9b, 0xeb, 0x59, 0x43, 0x73, 0xed, 0xff, 0x1d, 0xf1, 0x7f, 0x56, 0xff, 0xbf, 0x25, 0x47, 0x35,
+ 0xeb, 0xda, 0xff, 0x2d, 0xd1, 0xca, 0xcc, 0xdc, 0x6d, 0x22, 0xa5, 0xbd, 0x5e, 0x66, 0x57, 0xd6, 0xff, 0xb9, 0xd5, 0xe6,
+ 0xda, 0xb6, 0x7c, 0xa7, 0x91, 0xf6, 0xff, 0x9e, 0xa7, 0x70, 0xcf, 0xae, 0xff, 0xcf, 0x7c, 0x3a, 0xb9, 0x73, 0x7f, 0xee,
+ 0x93, 0x77, 0x6e, 0x4f, 0x1e, 0xe9, 0x3b, 0xf4, 0xff, 0x23, 0xe3, 0xff, 0xd1, 0x9c, 0xc7, 0xe3, 0xda, 0xb8, 0x0f, 0x46,
+ 0xd3, 0xbe, 0x35, 0xfe, 0xef, 0x91, 0x9b, 0xf9, 0x7b, 0xe3, 0xbf, 0xa5, 0xf2, 0x4f, 0x5f, 0x11, 0xff, 0x73, 0x2d, 0xab,
+ 0xd8, 0x8a, 0x88, 0xb9, 0x15, 0x93, 0xa3, 0x7d, 0xba, 0x76, 0xea, 0x95, 0x9e, 0x79, 0xfe, 0xb7, 0xe7, 0xfd, 0x9f, 0xda,
+ 0x37, 0x0d, 0x9e, 0xfb, 0x3e, 0xd4, 0x3b, 0x8e, 0xe0, 0x8c, 0xfb, 0xf9, 0x78, 0xd5, 0x82, 0xbe, 0xe9, 0x98, 0x62, 0x4f,
+ 0x75, 0xa3, 0xcf, 0x89, 0xf7, 0xdd, 0xef, 0xa3, 0xef, 0xff, 0x44, 0xcb, 0x54, 0xa6, 0xe5, 0x6f, 0xb9, 0x83, 0x5d, 0x19,
+ 0xff, 0xfb, 0x5b, 0x49, 0x55, 0xef, 0x30, 0x7c, 0xdb, 0x95, 0xa2, 0x64, 0xbe, 0xe5, 0xbc, 0xae, 0x8f, 0xf4, 0xbe, 0xa5,
+ 0x24, 0x5c, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3b, 0xe7, 0x8a, 0xf5, 0xb2,
+ 0x4c, 0x0b, 0xb3, 0x79, 0xae, 0xfa, 0xc2, 0xcc, 0xcd, 0x36, 0xcc, 0xdd, 0x9c, 0xfd, 0x9e, 0x9f, 0xab, 0x1a, 0xf4, 0xc1,
+ 0xbf, 0x68, 0x81, 0x3d, 0xed, 0xe1, 0x79, 0xc8, 0xeb, 0x6b, 0x34, 0xfc, 0xdc, 0xe3, 0x96, 0x28, 0x91, 0x36, 0x31, 0x4f,
+ 0x75, 0x6d, 0xae, 0xde, 0xee, 0x63, 0xae, 0xc9, 0x96, 0x1e, 0xc9, 0xfb, 0x37, 0x9b, 0xbd, 0x64, 0x47, 0xa9, 0xe4, 0x66,
+ 0xbb, 0xf7, 0xa5, 0xbf, 0xc7, 0x72, 0x3f, 0xf4, 0xc3, 0x18, 0xaa, 0xb9, 0x3f, 0xcd, 0x65, 0xe8, 0x5b, 0x9f, 0xb3, 0x3e,
+ 0x97, 0xdf, 0xb3, 0x6d, 0xcc, 0x89, 0xbd, 0x7e, 0xb5, 0xc7, 0x23, 0x25, 0xb7, 0x75, 0x6e, 0xae, 0xfe, 0x8e, 0x63, 0x8e,
+ 0xe7, 0xb3, 0x9d, 0xff, 0x9e, 0x4c, 0xed, 0x37, 0x9e, 0x85, 0x99, 0xa9, 0x27, 0xda, 0xd4, 0xdd, 0x7a, 0x2d, 0xca, 0xa3,
+ 0x77, 0x99, 0xf5, 0xf8, 0xaf, 0x99, 0x83, 0xde, 0x87, 0xc7, 0x13, 0x5b, 0x81, 0x63, 0x26, 0xbf, 0xf7, 0xfb, 0x5a, 0x8b,
+ 0xf9, 0xf8, 0xff, 0xd6, 0x36, 0xf6, 0xfd, 0x4a, 0xa0, 0x2f, 0xd6, 0xf1, 0x9f, 0x23, 0x6c, 0xa6, 0x15, 0x5f, 0x13, 0xff,
+ 0xeb, 0xf7, 0xad, 0xfd, 0xf1, 0xdf, 0x43, 0xdf, 0x10, 0x6d, 0xcf, 0xde, 0x73, 0x6b, 0x2e, 0xfe, 0xc7, 0x57, 0xd0, 0x9e,
+ 0xad, 0x55, 0xab, 0x28, 0xe5, 0x72, 0x94, 0xb7, 0x60, 0xef, 0x21, 0x9b, 0x11, 0x68, 0x35, 0x1b, 0x5b, 0x0f, 0xf5, 0x46,
+ 0xf6, 0xd4, 0xff, 0xf9, 0xfe, 0xff, 0x7c, 0xbb, 0x2d, 0x3e, 0x7e, 0x90, 0xb9, 0x96, 0x76, 0xb4, 0xc3, 0xcf, 0xd8, 0x1a,
+ 0xc9, 0x1b, 0x77, 0xd5, 0xd6, 0xdd, 0xf1, 0xdf, 0xff, 0xb3, 0x8e, 0xe2, 0x51, 0x44, 0xad, 0xdf, 0x1d, 0xee, 0xd7, 0xb2,
+ 0x88, 0x8f, 0xff, 0xad, 0x1e, 0x43, 0xc5, 0x11, 0xcf, 0xf5, 0x0b, 0x67, 0xa3, 0xb4, 0xae, 0xfe, 0xcf, 0x9c, 0xf5, 0x2b,
+ 0xb7, 0x66, 0x46, 0xf7, 0xde, 0x1a, 0xff, 0x73, 0xe5, 0x76, 0x45, 0xfc, 0x57, 0xe7, 0x13, 0x9c, 0x69, 0x4d, 0x44, 0xb3,
+ 0x34, 0x5f, 0xd1, 0x97, 0x9c, 0xcd, 0xce, 0x9f, 0x5b, 0x7f, 0xf6, 0x4d, 0xf1, 0xdf, 0x8a, 0xda, 0xff, 0x67, 0x6e, 0xbd,
+ 0x47, 0xfb, 0xbf, 0xbf, 0xa0, 0xfe, 0xcf, 0x3e, 0xd7, 0x99, 0x3f, 0x86, 0x73, 0x8e, 0x36, 0x9e, 0x81, 0x3f, 0xf3, 0x04,
+ 0xe3, 0xca, 0xbe, 0x70, 0x76, 0x6b, 0x36, 0xfe, 0xbf, 0xb5, 0xfe, 0x7f, 0x43, 0xfc, 0xe7, 0x9f, 0x65, 0xaf, 0x8c, 0xff,
+ 0x9d, 0x75, 0x44, 0xf9, 0xf6, 0x51, 0xee, 0xd9, 0xff, 0x3b, 0xeb, 0xff, 0x9a, 0x35, 0xe7, 0x9f, 0x16, 0xff, 0x33, 0xa3,
+ 0x4c, 0x4f, 0x8d, 0xff, 0x8a, 0x18, 0xa9, 0x1a, 0xff, 0xaf, 0xbe, 0x03, 0xb4, 0xad, 0x99, 0xeb, 0x9f, 0x17, 0xe1, 0xe3,
+ 0xf8, 0x8f, 0xbc, 0xff, 0xf3, 0xee, 0xf8, 0x9f, 0x7b, 0x37, 0xe6, 0xd9, 0xf1, 0xdf, 0x93, 0x2b, 0xd6, 0xbc, 0xf3, 0xf9,
+ 0x70, 0x6c, 0xfd, 0xe9, 0xe7, 0xc5, 0x7f, 0xfc, 0xed, 0x8c, 0xb7, 0x3f, 0xff, 0xcb, 0xbd, 0x1d, 0xb0, 0xf7, 0xf9, 0xdf,
+ 0x13, 0xde, 0x2b, 0xe1, 0x4d, 0xf7, 0x42, 0xe7, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x6a, 0x46, 0x46, 0x3c, 0x67, 0xcf, 0xdc, 0x4c, 0xb1, 0x6b, 0x72, 0xdf, 0x47, 0x32, 0x15, 0xcc, 0xec, 0x4f, 0x3c,
+ 0xff, 0x41, 0x24, 0xdb, 0xfe, 0xd1, 0xb9, 0x89, 0xe6, 0x1c, 0xcf, 0xe4, 0x32, 0xda, 0x75, 0x8c, 0xeb, 0x59, 0xe1, 0xe7,
+ 0x7f, 0x61, 0x2e, 0xf7, 0x63, 0x2c, 0x2e, 0xee, 0x71, 0xae, 0x33, 0xf3, 0xee, 0x76, 0x67, 0x8a, 0xef, 0xc9, 0x5c, 0xef,
+ 0xf5, 0x7b, 0x95, 0xcd, 0xd3, 0x1f, 0xdb, 0xe7, 0x48, 0x09, 0xf7, 0xc4, 0x4a, 0x2c, 0x6d, 0xe2, 0x4a, 0xaa, 0xce, 0xef,
+ 0x93, 0x59, 0x99, 0x63, 0xfe, 0x8e, 0x5c, 0x99, 0xb3, 0xbf, 0x25, 0xf2, 0xf5, 0xdf, 0xe5, 0x5c, 0xdf, 0xb5, 0x65, 0x71,
+ 0x9c, 0xf1, 0xe8, 0xbe, 0xad, 0xa4, 0x1e, 0xca, 0x6e, 0xfa, 0x9c, 0x7c, 0x04, 0xb1, 0x3a, 0xf7, 0xbd, 0xed, 0xe2, 0xf7,
+ 0x1f, 0x73, 0x26, 0xb7, 0xc0, 0x4c, 0x1d, 0xde, 0x02, 0xf1, 0x7f, 0xc7, 0xfc, 0x55, 0xb9, 0xcc, 0x57, 0x33, 0xa5, 0x78,
+ 0xd6, 0xb6, 0x23, 0xbf, 0x07, 0x56, 0x62, 0xbb, 0xf2, 0x18, 0xf7, 0xe7, 0xec, 0x38, 0xce, 0x26, 0xf2, 0xe4, 0x73, 0xdd,
+ 0xb6, 0xe7, 0x82, 0x89, 0xd6, 0xff, 0x4f, 0x8d, 0xff, 0xd1, 0x6a, 0x04, 0x9f, 0xd7, 0x25, 0x3b, 0x6f, 0x5b, 0xc5, 0x5a,
+ 0x06, 0xab, 0x3d, 0xa0, 0x1d, 0xdb, 0xae, 0xcc, 0xd9, 0x75, 0xf6, 0xb1, 0xc6, 0xcb, 0xe8, 0xca, 0xf8, 0x9f, 0xe9, 0xd7,
+ 0x7d, 0x5b, 0xfd, 0xdf, 0x2f, 0xdf, 0x36, 0x7f, 0x17, 0xbb, 0xfb, 0xb5, 0xbd, 0x7f, 0xcd, 0x8e, 0x27, 0xc4, 0xf8, 0x5d,
+ 0xe3, 0xff, 0xaa, 0x8c, 0xc7, 0x35, 0x2b, 0x2d, 0x45, 0xfb, 0xff, 0x4f, 0xb8, 0x26, 0x7a, 0x72, 0x2d, 0xe3, 0xd8, 0x0a,
+ 0xce, 0xd5, 0xdb, 0xc4, 0xff, 0xdd, 0xeb, 0xff, 0x99, 0xb1, 0x95, 0xfb, 0xe5, 0xaf, 0xcc, 0xae, 0xd3, 0xfb, 0xee, 0xeb,
+ 0xa5, 0x85, 0x9e, 0x79, 0xed, 0xd8, 0x26, 0xfe, 0xc5, 0xbf, 0xf8, 0xbf, 0xe2, 0x7a, 0xe9, 0x5f, 0xd1, 0xff, 0x17, 0xff,
+ 0xe2, 0x3f, 0xf2, 0xcc, 0xec, 0xfe, 0xfd, 0xff, 0x5d, 0x4f, 0x2a, 0xdf, 0x36, 0xfe, 0x1f, 0x7d, 0xda, 0xfb, 0xa4, 0xf1,
+ 0xff, 0xdd, 0xcf, 0xff, 0xae, 0xf8, 0xdd, 0xdc, 0x3e, 0xbf, 0xff, 0x19, 0xf7, 0x3b, 0xf2, 0xc5, 0xf3, 0xfc, 0xeb, 0x50,
+ 0x19, 0x80, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe7, 0x00, 0xaf, 0xbe,
+ 0xa7, 0x7f, 0x66, 0xbe, 0xf7, 0xc8, 0x9c, 0xcf, 0xb9, 0xef, 0x04, 0xf1, 0x1f, 0x9b, 0xa7, 0x73, 0x66, 0xbe, 0xf7, 0xfc,
+ 0xdc, 0x7c, 0xe7, 0x1a, 0xde, 0x37, 0x53, 0x5c, 0x6c, 0x43, 0x2e, 0xc2, 0xa3, 0x39, 0x3a, 0xef, 0xb2, 0xed, 0x1d, 0x2b,
+ 0x73, 0xc0, 0xbd, 0x6a, 0xd5, 0xa7, 0xc4, 0x7f, 0xdb, 0x96, 0xef, 0x12, 0xbe, 0xb1, 0xff, 0x2f, 0xfe, 0x41, 0xfc, 0x8b,
+ 0x7f, 0xd0, 0xfe, 0x17, 0xff, 0x60, 0xfc, 0xff, 0xaa, 0x58, 0x9d, 0x59, 0x27, 0xe6, 0xc9, 0x4f, 0x31, 0xe0, 0x7e, 0x77,
+ 0x80, 0xf8, 0xdd, 0xa1, 0x7a, 0x5b, 0x1b, 0xde, 0x37, 0x3c, 0x23, 0x84, 0xb3, 0xe2, 0xff, 0x9a, 0x51, 0x8a, 0xd5, 0xf8,
+ 0xd7, 0xfe, 0x87, 0x37, 0xf5, 0x46, 0x22, 0xef, 0xff, 0x89, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe9, 0xaf, 0xff, 0x94, 0x03, 0x88, 0x7f, 0xe0, 0xeb, 0xe2, 0xff,
+ 0x0f };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle sunnyFontRecs[189] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 2 , 10 },
+ { 26, 4, 5 , 3 },
+ { 39, 4, 7 , 10 },
+ { 54, 4, 7 , 13 },
+ { 69, 4, 7 , 10 },
+ { 84, 4, 7 , 10 },
+ { 99, 4, 2 , 3 },
+ { 109, 4, 3 , 12 },
+ { 120, 4, 3 , 12 },
+ { 131, 4, 5 , 6 },
+ { 144, 4, 6 , 5 },
+ { 158, 4, 2 , 4 },
+ { 168, 4, 5 , 1 },
+ { 181, 4, 2 , 2 },
+ { 191, 4, 4 , 10 },
+ { 203, 4, 6 , 10 },
+ { 217, 4, 4 , 10 },
+ { 229, 4, 6 , 10 },
+ { 243, 4, 6 , 10 },
+ { 257, 4, 6 , 10 },
+ { 271, 4, 6 , 10 },
+ { 285, 4, 6 , 10 },
+ { 299, 4, 6 , 10 },
+ { 313, 4, 6 , 10 },
+ { 327, 4, 6 , 10 },
+ { 341, 4, 2 , 6 },
+ { 351, 4, 2 , 8 },
+ { 361, 4, 7 , 7 },
+ { 376, 4, 5 , 3 },
+ { 389, 4, 7 , 7 },
+ { 404, 4, 6 , 10 },
+ { 418, 4, 7 , 12 },
+ { 433, 4, 7 , 10 },
+ { 448, 4, 7 , 10 },
+ { 463, 4, 7 , 10 },
+ { 478, 4, 7 , 10 },
+ { 493, 4, 7 , 10 },
+ { 4, 28, 7 , 10 },
+ { 19, 28, 7 , 10 },
+ { 34, 28, 7 , 10 },
+ { 49, 28, 2 , 10 },
+ { 59, 28, 5 , 10 },
+ { 72, 28, 7 , 10 },
+ { 87, 28, 6 , 10 },
+ { 101, 28, 9 , 10 },
+ { 118, 28, 7 , 10 },
+ { 133, 28, 7 , 10 },
+ { 148, 28, 7 , 10 },
+ { 163, 28, 7 , 12 },
+ { 178, 28, 7 , 10 },
+ { 193, 28, 7 , 10 },
+ { 208, 28, 6 , 10 },
+ { 222, 28, 7 , 10 },
+ { 237, 28, 7 , 10 },
+ { 252, 28, 8 , 10 },
+ { 268, 28, 7 , 10 },
+ { 283, 28, 6 , 10 },
+ { 297, 28, 7 , 10 },
+ { 312, 28, 4 , 12 },
+ { 324, 28, 4 , 10 },
+ { 336, 28, 4 , 12 },
+ { 348, 28, 6 , 3 },
+ { 362, 28, 7 , 1 },
+ { 377, 28, 4 , 3 },
+ { 389, 28, 6 , 7 },
+ { 403, 28, 6 , 10 },
+ { 417, 28, 6 , 7 },
+ { 431, 28, 6 , 10 },
+ { 445, 28, 6 , 7 },
+ { 459, 28, 4 , 10 },
+ { 471, 28, 6 , 9 },
+ { 485, 28, 6 , 10 },
+ { 499, 28, 2 , 10 },
+ { 4, 52, 5 , 12 },
+ { 17, 52, 6 , 10 },
+ { 31, 52, 3 , 10 },
+ { 42, 52, 8 , 7 },
+ { 58, 52, 6 , 7 },
+ { 72, 52, 6 , 7 },
+ { 86, 52, 6 , 9 },
+ { 100, 52, 6 , 9 },
+ { 114, 52, 5 , 7 },
+ { 127, 52, 6 , 7 },
+ { 141, 52, 4 , 10 },
+ { 153, 52, 6 , 7 },
+ { 167, 52, 6 , 7 },
+ { 181, 52, 8 , 7 },
+ { 197, 52, 6 , 7 },
+ { 211, 52, 6 , 9 },
+ { 225, 52, 6 , 7 },
+ { 239, 52, 5 , 12 },
+ { 252, 52, 2 , 12 },
+ { 262, 52, 5 , 12 },
+ { 275, 52, 7 , 3 },
+ { 290, 52, 2 , 9 },
+ { 300, 52, 6 , 11 },
+ { 314, 52, 7 , 10 },
+ { 329, 52, 7 , 9 },
+ { 344, 52, 6 , 10 },
+ { 358, 52, 7 , 11 },
+ { 373, 52, 6 , 12 },
+ { 387, 52, 6 , 10 },
+ { 401, 52, 7 , 10 },
+ { 416, 52, 5 , 5 },
+ { 429, 52, 7 , 6 },
+ { 444, 52, 6 , 3 },
+ { 458, 52, 7 , 10 },
+ { 473, 52, 9 , 10 },
+ { 490, 52, 4 , 4 },
+ { 4, 76, 6 , 7 },
+ { 18, 76, 4 , 5 },
+ { 30, 76, 4 , 5 },
+ { 42, 76, 7 , 11 },
+ { 57, 76, 6 , 9 },
+ { 71, 76, 7 , 12 },
+ { 86, 76, 2 , 2 },
+ { 96, 76, 6 , 10 },
+ { 110, 76, 3 , 5 },
+ { 121, 76, 4 , 5 },
+ { 133, 76, 7 , 6 },
+ { 148, 76, 9 , 10 },
+ { 165, 76, 8 , 7 },
+ { 181, 76, 6 , 11 },
+ { 195, 76, 6 , 11 },
+ { 209, 76, 7 , 11 },
+ { 224, 76, 7 , 11 },
+ { 239, 76, 7 , 11 },
+ { 254, 76, 7 , 11 },
+ { 269, 76, 7 , 11 },
+ { 284, 76, 7 , 11 },
+ { 299, 76, 9 , 10 },
+ { 316, 76, 7 , 12 },
+ { 331, 76, 7 , 11 },
+ { 346, 76, 7 , 11 },
+ { 361, 76, 7 , 11 },
+ { 376, 76, 7 , 11 },
+ { 391, 76, 3 , 11 },
+ { 402, 76, 3 , 11 },
+ { 413, 76, 5 , 11 },
+ { 426, 76, 5 , 11 },
+ { 439, 76, 8 , 10 },
+ { 455, 76, 7 , 11 },
+ { 470, 76, 7 , 11 },
+ { 485, 76, 7 , 11 },
+ { 4, 100, 7 , 11 },
+ { 19, 100, 7 , 11 },
+ { 34, 100, 7 , 11 },
+ { 49, 100, 7 , 7 },
+ { 64, 100, 7 , 13 },
+ { 79, 100, 7 , 11 },
+ { 94, 100, 7 , 11 },
+ { 109, 100, 7 , 11 },
+ { 124, 100, 7 , 11 },
+ { 139, 100, 6 , 11 },
+ { 153, 100, 7 , 10 },
+ { 168, 100, 7 , 10 },
+ { 183, 100, 6 , 10 },
+ { 197, 100, 6 , 10 },
+ { 211, 100, 6 , 10 },
+ { 225, 100, 6 , 10 },
+ { 239, 100, 6 , 10 },
+ { 253, 100, 6 , 11 },
+ { 267, 100, 8 , 7 },
+ { 283, 100, 6 , 9 },
+ { 297, 100, 6 , 10 },
+ { 311, 100, 6 , 10 },
+ { 325, 100, 6 , 10 },
+ { 339, 100, 6 , 10 },
+ { 353, 100, 3 , 10 },
+ { 364, 100, 3 , 10 },
+ { 375, 100, 5 , 10 },
+ { 388, 100, 5 , 10 },
+ { 401, 100, 6 , 10 },
+ { 415, 100, 6 , 10 },
+ { 429, 100, 6 , 10 },
+ { 443, 100, 6 , 10 },
+ { 457, 100, 6 , 10 },
+ { 471, 100, 6 , 10 },
+ { 485, 100, 6 , 10 },
+ { 4, 124, 6 , 7 },
+ { 18, 124, 7 , 11 },
+ { 33, 124, 6 , 10 },
+ { 47, 124, 6 , 10 },
+ { 61, 124, 6 , 10 },
+ { 75, 124, 6 , 10 },
+ { 89, 124, 6 , 12 },
+ { 103, 124, 6 , 12 },
+ { 117, 124, 6 , 12 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo sunnyFontGlyphs[189] = {
+ { 32, 0, 12, 4, { 0 }},
+ { 33, 0, 2, 3, { 0 }},
+ { 34, 0, 2, 6, { 0 }},
+ { 35, 0, 2, 8, { 0 }},
+ { 36, 0, 1, 8, { 0 }},
+ { 37, 0, 2, 8, { 0 }},
+ { 38, 0, 2, 8, { 0 }},
+ { 39, 0, 2, 3, { 0 }},
+ { 40, 0, 2, 4, { 0 }},
+ { 41, 0, 2, 4, { 0 }},
+ { 42, 0, 4, 6, { 0 }},
+ { 43, 0, 6, 7, { 0 }},
+ { 44, 0, 10, 3, { 0 }},
+ { 45, 0, 8, 6, { 0 }},
+ { 46, 0, 10, 3, { 0 }},
+ { 47, 0, 2, 5, { 0 }},
+ { 48, 0, 2, 7, { 0 }},
+ { 49, 0, 2, 7, { 0 }},
+ { 50, 0, 2, 7, { 0 }},
+ { 51, 0, 2, 7, { 0 }},
+ { 52, 0, 2, 7, { 0 }},
+ { 53, 0, 2, 7, { 0 }},
+ { 54, 0, 2, 7, { 0 }},
+ { 55, 0, 2, 7, { 0 }},
+ { 56, 0, 2, 7, { 0 }},
+ { 57, 0, 2, 7, { 0 }},
+ { 58, 0, 4, 3, { 0 }},
+ { 59, 0, 4, 3, { 0 }},
+ { 60, 0, 4, 8, { 0 }},
+ { 61, 0, 6, 6, { 0 }},
+ { 62, 0, 4, 8, { 0 }},
+ { 63, 0, 2, 7, { 0 }},
+ { 64, 0, 2, 8, { 0 }},
+ { 65, 0, 2, 8, { 0 }},
+ { 66, 0, 2, 8, { 0 }},
+ { 67, 0, 2, 8, { 0 }},
+ { 68, 0, 2, 8, { 0 }},
+ { 69, 0, 2, 8, { 0 }},
+ { 70, 0, 2, 8, { 0 }},
+ { 71, 0, 2, 8, { 0 }},
+ { 72, 0, 2, 8, { 0 }},
+ { 73, 0, 2, 3, { 0 }},
+ { 74, 0, 2, 6, { 0 }},
+ { 75, 0, 2, 8, { 0 }},
+ { 76, 0, 2, 7, { 0 }},
+ { 77, 0, 2, 10, { 0 }},
+ { 78, 0, 2, 8, { 0 }},
+ { 79, 0, 2, 8, { 0 }},
+ { 80, 0, 2, 8, { 0 }},
+ { 81, 0, 2, 8, { 0 }},
+ { 82, 0, 2, 8, { 0 }},
+ { 83, 0, 2, 8, { 0 }},
+ { 84, 0, 2, 7, { 0 }},
+ { 85, 0, 2, 8, { 0 }},
+ { 86, 0, 2, 8, { 0 }},
+ { 87, 0, 2, 9, { 0 }},
+ { 88, 0, 2, 8, { 0 }},
+ { 89, 0, 2, 7, { 0 }},
+ { 90, 0, 2, 8, { 0 }},
+ { 91, 0, 2, 5, { 0 }},
+ { 92, 0, 2, 5, { 0 }},
+ { 93, 0, 2, 5, { 0 }},
+ { 94, 0, 2, 7, { 0 }},
+ { 95, 0, 14, 8, { 0 }},
+ { 96, 0, 2, 5, { 0 }},
+ { 97, 0, 5, 7, { 0 }},
+ { 98, 0, 2, 7, { 0 }},
+ { 99, 0, 5, 7, { 0 }},
+ { 100, 0, 2, 7, { 0 }},
+ { 101, 0, 5, 7, { 0 }},
+ { 102, 0, 2, 5, { 0 }},
+ { 103, 0, 5, 7, { 0 }},
+ { 104, 0, 2, 7, { 0 }},
+ { 105, 0, 2, 3, { 0 }},
+ { 106, 0, 2, 6, { 0 }},
+ { 107, 0, 2, 7, { 0 }},
+ { 108, 0, 2, 4, { 0 }},
+ { 109, 0, 5, 9, { 0 }},
+ { 110, 0, 5, 7, { 0 }},
+ { 111, 0, 5, 7, { 0 }},
+ { 112, 0, 5, 7, { 0 }},
+ { 113, 0, 5, 7, { 0 }},
+ { 114, 0, 5, 6, { 0 }},
+ { 115, 0, 5, 7, { 0 }},
+ { 116, 0, 2, 5, { 0 }},
+ { 117, 0, 5, 7, { 0 }},
+ { 118, 0, 5, 7, { 0 }},
+ { 119, 0, 5, 9, { 0 }},
+ { 120, 0, 5, 7, { 0 }},
+ { 121, 0, 5, 7, { 0 }},
+ { 122, 0, 5, 7, { 0 }},
+ { 123, 0, 2, 6, { 0 }},
+ { 124, 0, 2, 3, { 0 }},
+ { 125, 0, 2, 6, { 0 }},
+ { 126, 0, 6, 8, { 0 }},
+ { 161, 0, 5, 3, { 0 }},
+ { 162, 0, 3, 7, { 0 }},
+ { 163, 0, 2, 8, { 0 }},
+ { 8364, 0, 3, 8, { 0 }},
+ { 165, 0, 2, 7, { 0 }},
+ { 352, 0, 1, 8, { 0 }},
+ { 167, 0, 2, 7, { 0 }},
+ { 353, 0, 2, 7, { 0 }},
+ { 169, 0, 2, 8, { 0 }},
+ { 170, 0, 2, 6, { 0 }},
+ { 171, 0, 6, 8, { 0 }},
+ { 172, 0, 7, 7, { 0 }},
+ { 174, 0, 2, 8, { 0 }},
+ { 175, 1, 3, 14, { 0 }},
+ { 176, 0, 2, 5, { 0 }},
+ { 177, 0, 4, 7, { 0 }},
+ { 178, 0, 2, 5, { 0 }},
+ { 179, 0, 2, 5, { 0 }},
+ { 381, 0, 1, 8, { 0 }},
+ { 181, 0, 5, 7, { 0 }},
+ { 182, 0, 2, 8, { 0 }},
+ { 183, 0, 6, 3, { 0 }},
+ { 382, 0, 2, 7, { 0 }},
+ { 185, 0, 2, 4, { 0 }},
+ { 186, 0, 2, 5, { 0 }},
+ { 187, 0, 6, 8, { 0 }},
+ { 338, 0, 2, 10, { 0 }},
+ { 339, 0, 5, 9, { 0 }},
+ { 376, 0, 1, 7, { 0 }},
+ { 191, 0, 3, 7, { 0 }},
+ { 192, 0, 1, 8, { 0 }},
+ { 193, 0, 1, 8, { 0 }},
+ { 194, 0, 1, 8, { 0 }},
+ { 195, 0, 1, 8, { 0 }},
+ { 196, 0, 1, 8, { 0 }},
+ { 197, 0, 1, 8, { 0 }},
+ { 198, 0, 2, 10, { 0 }},
+ { 199, 0, 2, 8, { 0 }},
+ { 200, 0, 1, 8, { 0 }},
+ { 201, 0, 1, 8, { 0 }},
+ { 202, 0, 1, 8, { 0 }},
+ { 203, 0, 1, 8, { 0 }},
+ { 204, 0, 1, 4, { 0 }},
+ { 205, 0, 1, 4, { 0 }},
+ { 206, 0, 1, 6, { 0 }},
+ { 207, 0, 1, 6, { 0 }},
+ { 208, 0, 2, 9, { 0 }},
+ { 209, 0, 1, 8, { 0 }},
+ { 210, 0, 1, 8, { 0 }},
+ { 211, 0, 1, 8, { 0 }},
+ { 212, 0, 1, 8, { 0 }},
+ { 213, 0, 1, 8, { 0 }},
+ { 214, 0, 1, 8, { 0 }},
+ { 215, 0, 5, 8, { 0 }},
+ { 216, 0, 1, 8, { 0 }},
+ { 217, 0, 1, 8, { 0 }},
+ { 218, 0, 1, 8, { 0 }},
+ { 219, 0, 1, 8, { 0 }},
+ { 220, 0, 1, 8, { 0 }},
+ { 221, 0, 1, 7, { 0 }},
+ { 222, 0, 2, 8, { 0 }},
+ { 223, 0, 2, 8, { 0 }},
+ { 224, 0, 2, 7, { 0 }},
+ { 225, 0, 2, 7, { 0 }},
+ { 226, 0, 2, 7, { 0 }},
+ { 227, 0, 2, 7, { 0 }},
+ { 228, 0, 2, 7, { 0 }},
+ { 229, 0, 1, 7, { 0 }},
+ { 230, 0, 5, 9, { 0 }},
+ { 231, 0, 5, 7, { 0 }},
+ { 232, 0, 2, 7, { 0 }},
+ { 233, 0, 2, 7, { 0 }},
+ { 234, 0, 2, 7, { 0 }},
+ { 235, 0, 2, 7, { 0 }},
+ { 236, 0, 2, 4, { 0 }},
+ { 237, 0, 2, 4, { 0 }},
+ { 238, 0, 2, 6, { 0 }},
+ { 239, 0, 2, 6, { 0 }},
+ { 240, 0, 2, 7, { 0 }},
+ { 241, 0, 2, 7, { 0 }},
+ { 242, 0, 2, 7, { 0 }},
+ { 243, 0, 2, 7, { 0 }},
+ { 244, 0, 2, 7, { 0 }},
+ { 245, 0, 2, 7, { 0 }},
+ { 246, 0, 2, 7, { 0 }},
+ { 247, 0, 4, 7, { 0 }},
+ { 248, 0, 3, 8, { 0 }},
+ { 249, 0, 2, 7, { 0 }},
+ { 250, 0, 2, 7, { 0 }},
+ { 251, 0, 2, 7, { 0 }},
+ { 252, 0, 2, 7, { 0 }},
+ { 253, 0, 2, 7, { 0 }},
+ { 254, 0, 2, 7, { 0 }},
+ { 255, 0, 2, 7, { 0 }},
+};
+
+// Style loading function: Sunny
+static void GuiLoadStyleSunny(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < SUNNY_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(sunnyStyleProps[i].controlId, sunnyStyleProps[i].propertyId, sunnyStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int sunnyFontDataSize = 0;
+ unsigned char *data = DecompressData(sunnyFontData, SUNNY_STYLE_FONT_ATLAS_COMP_SIZE, &sunnyFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, sunnyFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, sunnyFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/sunny/style_sunny.old.rgs b/external/raygui-4.0/styles/sunny/style_sunny.old.rgs
new file mode 100644
index 0000000..f8be323
Binary files /dev/null and b/external/raygui-4.0/styles/sunny/style_sunny.old.rgs differ
diff --git a/external/raygui-4.0/styles/sunny/style_sunny.png b/external/raygui-4.0/styles/sunny/style_sunny.png
new file mode 100644
index 0000000..79ed986
Binary files /dev/null and b/external/raygui-4.0/styles/sunny/style_sunny.png differ
diff --git a/external/raygui-4.0/styles/sunny/style_sunny.rgs b/external/raygui-4.0/styles/sunny/style_sunny.rgs
new file mode 100644
index 0000000..7792670
Binary files /dev/null and b/external/raygui-4.0/styles/sunny/style_sunny.rgs differ
diff --git a/external/raygui-4.0/styles/sunny/style_sunny.txt.rgs b/external/raygui-4.0/styles/sunny/style_sunny.txt.rgs
new file mode 100644
index 0000000..4743798
--- /dev/null
+++ b/external/raygui-4.0/styles/sunny/style_sunny.txt.rgs
@@ -0,0 +1,43 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 16 charset.txt GenericMobileSystemNuevo.ttf
+p 00 00 0x9c760aff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x594006ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0xf6d519ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xf6ee89ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0xf5f3d1ff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xf4cd19ff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0xf7e580ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0xf7f2c1ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x52470aff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0xc0be92ff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0xd3d3a1ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0xbcbc89ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x00000010 TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0x725706ff LINE_COLOR
+p 00 19 0xf0be4bff BACKGROUND_COLOR
+p 00 20 0x00000018 TEXT_LINE_SPACING
+p 01 02 0x504506ff LABEL_TEXT_COLOR_NORMAL
+p 01 05 0xfdeb9bff LABEL_TEXT_COLOR_FOCUSED
+p 01 08 0xf5e8a4ff LABEL_TEXT_COLOR_PRESSED
+p 02 02 0xebc21fff BUTTON_TEXT_COLOR_NORMAL
+p 03 02 0xebc21fff TOGGLE_TEXT_COLOR_NORMAL
+p 04 02 0x81700fff SLIDER_TEXT_COLOR_NORMAL
+p 04 05 0xf4e49aff SLIDER_TEXT_COLOR_FOCUSED
+p 07 02 0xebc21fff COMBOBOX_TEXT_COLOR_NORMAL
+p 08 02 0xefd87bff DROPDOWNBOX_TEXT_COLOR_NORMAL
+p 08 05 0xd4b219ff DROPDOWNBOX_TEXT_COLOR_FOCUSED
+p 09 02 0x7a680bff TEXTBOX_TEXT_COLOR_NORMAL
+p 09 05 0xad931fff TEXTBOX_TEXT_COLOR_FOCUSED
+p 10 02 0x62570eff VALUEBOX_TEXT_COLOR_NORMAL
+p 10 05 0xf2df88ff VALUEBOX_TEXT_COLOR_FOCUSED
+p 12 02 0xf4e798ff LISTVIEW_TEXT_COLOR_NORMAL
+p 15 02 0xebc21fff STATUSBAR_TEXT_COLOR_NORMAL
diff --git a/external/raygui-4.0/styles/terminal/Mecha.ttf b/external/raygui-4.0/styles/terminal/Mecha.ttf
new file mode 100644
index 0000000..928f63a
Binary files /dev/null and b/external/raygui-4.0/styles/terminal/Mecha.ttf differ
diff --git a/external/raygui-4.0/styles/terminal/README.md b/external/raygui-4.0/styles/terminal/README.md
new file mode 100644
index 0000000..a30bc1e
--- /dev/null
+++ b/external/raygui-4.0/styles/terminal/README.md
@@ -0,0 +1,27 @@
+## style: terminal
+
+Start your terminal and type your commands! Feel the connection the data flow, that's your style!
+
+![terminal style table](style_terminal.png)
+
+## style: provided files
+
+Several options are provided to add the style to a `raygui` application, choose the one that better fits the project.
+
+| file name | description |
+| :-------- | :---------- |
+| `style_terminal.rgs` | Binary style file (raygui 4.0), font data compressed (recs, glyphs) |
+| `style_terminal.txt.rgs` | Text style file, no font data, requires external font provided |
+| `style_terminal.old.rgs` | Binary style file (raygui 3.x), font data uncompressed (recs, glyphs) |
+| `style_terminal.h` | Embeddable style as code file, self-contained, includes font data |
+| `style_terminal.png` | Style table image, contains `rGSf` chunk with binary `rgs` file data |
+
+## screenshot
+
+![terminal style screen](screenshot.png)
+
+## about font
+
+"Mecha" font by Captain Falcon.
+
+100% free font, downloaded from dafont.com: [mecha-cf](https://www.dafont.com/mecha-cf.font)
diff --git a/external/raygui-4.0/styles/terminal/charset.txt b/external/raygui-4.0/styles/terminal/charset.txt
new file mode 100644
index 0000000..611a673
--- /dev/null
+++ b/external/raygui-4.0/styles/terminal/charset.txt
@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
\ No newline at end of file
diff --git a/external/raygui-4.0/styles/terminal/screenshot.png b/external/raygui-4.0/styles/terminal/screenshot.png
new file mode 100644
index 0000000..55142e2
Binary files /dev/null and b/external/raygui-4.0/styles/terminal/screenshot.png differ
diff --git a/external/raygui-4.0/styles/terminal/style_terminal.h b/external/raygui-4.0/styles/terminal/style_terminal.h
new file mode 100644
index 0000000..10feebb
--- /dev/null
+++ b/external/raygui-4.0/styles/terminal/style_terminal.h
@@ -0,0 +1,569 @@
+//////////////////////////////////////////////////////////////////////////////////
+// //
+// StyleAsCode exporter v2.0 - Style data exported as a values array //
+// //
+// USAGE: On init call: GuiLoadStyleTerminal(); //
+// //
+// more info and bugs-report: github.com/raysan5/raygui //
+// feedback and support: ray[at]raylibtech.com //
+// //
+// Copyright (c) 2020-2023 raylib technologies (@raylibtech) //
+// //
+//////////////////////////////////////////////////////////////////////////////////
+
+#define TERMINAL_STYLE_PROPS_COUNT 17
+
+// Custom style name: Terminal
+static const GuiStyleProp terminalStyleProps[TERMINAL_STYLE_PROPS_COUNT] = {
+ { 0, 0, 0x1c8d00ff }, // DEFAULT_BORDER_COLOR_NORMAL
+ { 0, 1, 0x161313ff }, // DEFAULT_BASE_COLOR_NORMAL
+ { 0, 2, 0x38f620ff }, // DEFAULT_TEXT_COLOR_NORMAL
+ { 0, 3, 0xc3fbc6ff }, // DEFAULT_BORDER_COLOR_FOCUSED
+ { 0, 4, 0x43bf2eff }, // DEFAULT_BASE_COLOR_FOCUSED
+ { 0, 5, 0xdcfadcff }, // DEFAULT_TEXT_COLOR_FOCUSED
+ { 0, 6, 0x1f5b19ff }, // DEFAULT_BORDER_COLOR_PRESSED
+ { 0, 7, 0x43ff28ff }, // DEFAULT_BASE_COLOR_PRESSED
+ { 0, 8, 0x1e6f15ff }, // DEFAULT_TEXT_COLOR_PRESSED
+ { 0, 9, 0x223b22ff }, // DEFAULT_BORDER_COLOR_DISABLED
+ { 0, 10, 0x182c18ff }, // DEFAULT_BASE_COLOR_DISABLED
+ { 0, 11, 0x244125ff }, // DEFAULT_TEXT_COLOR_DISABLED
+ { 0, 16, 0x00000010 }, // DEFAULT_TEXT_SIZE
+ { 0, 17, 0x00000000 }, // DEFAULT_TEXT_SPACING
+ { 0, 18, 0xe6fce3ff }, // DEFAULT_LINE_COLOR
+ { 0, 19, 0x0c1505ff }, // DEFAULT_BACKGROUND_COLOR
+ { 0, 20, 0x00000018 }, // DEFAULT_TEXT_LINE_SPACING
+};
+
+// WARNING: This style uses a custom font: "Mecha.ttf" (size: 16, spacing: 0)
+
+#define TERMINAL_STYLE_FONT_ATLAS_COMP_SIZE 1860
+
+// Font atlas image pixels data: DEFLATE compressed
+static unsigned char terminalFontData[TERMINAL_STYLE_FONT_ATLAS_COMP_SIZE] = { 0xed,
+ 0xdd, 0x41, 0x92, 0xa4, 0x36, 0x10, 0x05, 0x50, 0xee, 0x7f, 0xe9, 0xf4, 0x62, 0x62, 0x16, 0x76, 0xb8, 0x1b, 0x94, 0x4a,
+ 0x89, 0x04, 0x9e, 0x5f, 0x78, 0xd3, 0xd5, 0x53, 0x4d, 0x01, 0xbf, 0x24, 0x84, 0x94, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x7c,
+ 0x5e, 0xfc, 0xef, 0x4f, 0xe2, 0xc7, 0xdf, 0x8c, 0xcb, 0xef, 0xf3, 0xe7, 0xa7, 0xf1, 0xe3, 0x5f, 0xf9, 0xfb, 0xdf, 0x95,
+ 0x77, 0xba, 0xfe, 0x5b, 0x31, 0xb4, 0x75, 0x73, 0x5b, 0x95, 0x7b, 0x9f, 0xd1, 0xdf, 0xfe, 0x7d, 0x7b, 0xaa, 0xde, 0xad,
+ 0xf6, 0x95, 0xb1, 0xb3, 0x23, 0xbf, 0xe7, 0xae, 0x6e, 0x61, 0x6c, 0xdf, 0x2b, 0xc7, 0xa6, 0x7d, 0x1c, 0x0d, 0xf2, 0x7f,
+ 0x7e, 0xcc, 0x46, 0xf2, 0x14, 0xe9, 0xf4, 0x8e, 0x7f, 0x3b, 0xad, 0xfc, 0x0e, 0x1d, 0xdd, 0xc6, 0xdc, 0x3e, 0x89, 0x92,
+ 0xf7, 0x9f, 0xf9, 0x3b, 0x51, 0xb6, 0xd7, 0x72, 0xff, 0x26, 0x86, 0xdb, 0x88, 0xf9, 0x4f, 0x78, 0xbe, 0x8f, 0x63, 0xd1,
+ 0x71, 0xef, 0x99, 0xff, 0xfc, 0x51, 0xcb, 0x9f, 0x29, 0x57, 0xb7, 0x3c, 0xd7, 0xa6, 0xaf, 0x3a, 0x27, 0xe5, 0xff, 0xec,
+ 0x9b, 0xfa, 0xe7, 0x16, 0xb4, 0xa2, 0xdd, 0x90, 0xff, 0x5c, 0x06, 0x62, 0x22, 0x47, 0xbb, 0xf2, 0x5f, 0xdb, 0xd6, 0xc8,
+ 0xff, 0x33, 0xda, 0xff, 0xb3, 0x6d, 0xff, 0xf7, 0x79, 0x2b, 0xff, 0xd9, 0xa3, 0x90, 0x6d, 0xff, 0x63, 0x7a, 0xfb, 0x3b,
+ 0xe7, 0x7f, 0x74, 0xdc, 0x43, 0xfe, 0xcf, 0xaf, 0xe8, 0x73, 0xbf, 0x7d, 0xb6, 0x27, 0xe4, 0x7f, 0x5d, 0xfe, 0x7f, 0xeb,
+ 0xb3, 0x9d, 0xf5, 0xf4, 0x76, 0xe4, 0xff, 0xd8, 0x9e, 0xff, 0xb3, 0xeb, 0xa8, 0xeb, 0xfb, 0x62, 0xc7, 0x08, 0xd4, 0x91,
+ 0x1c, 0xdb, 0x89, 0xc1, 0x0c, 0xdf, 0xd3, 0x0b, 0x3b, 0xcb, 0x7f, 0x66, 0x4f, 0x66, 0xf2, 0x7f, 0x76, 0x5c, 0x8e, 0x5f,
+ 0x7a, 0x30, 0xab, 0xf6, 0x7e, 0x45, 0xfe, 0x67, 0x46, 0xe4, 0x9e, 0x9d, 0xff, 0x38, 0xd9, 0x57, 0x31, 0x31, 0xbe, 0xb9,
+ 0xb3, 0xcf, 0x30, 0xd3, 0x4f, 0xeb, 0x7b, 0x1c, 0xde, 0xd3, 0xff, 0x8f, 0xd6, 0xed, 0xbf, 0xfc, 0xcf, 0x5d, 0xff, 0xbf,
+ 0x2d, 0xff, 0xb1, 0xfd, 0x58, 0xc5, 0x85, 0x33, 0x56, 0xfe, 0xe7, 0xf6, 0xf0, 0x79, 0x8f, 0x23, 0x16, 0x5d, 0xbf, 0x74,
+ 0xcd, 0x7f, 0xee, 0xd3, 0x7d, 0xb1, 0xfd, 0x8f, 0x1b, 0x8f, 0x8f, 0xfc, 0xaf, 0xd8, 0x9b, 0x23, 0x77, 0xd8, 0x66, 0xe7,
+ 0x2f, 0xc8, 0xbf, 0xfc, 0xcb, 0x7f, 0xef, 0xfe, 0x7f, 0x0c, 0x8e, 0xdc, 0xc6, 0xe3, 0xc7, 0xff, 0xe2, 0x52, 0x6f, 0x69,
+ 0x7e, 0xb6, 0xe0, 0x78, 0x9f, 0x2b, 0xf7, 0x6e, 0xf9, 0xd9, 0x75, 0x4f, 0xb9, 0xfe, 0xdf, 0x39, 0x93, 0xf2, 0x28, 0x99,
+ 0x87, 0xb2, 0x7e, 0xfe, 0xdf, 0x33, 0xe7, 0x28, 0x77, 0xcf, 0x3f, 0xb0, 0x7a, 0x95, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x65, 0x0d, 0x4d, 0x94, 0xad, 0x7b, 0x8c, 0x16, 0x95, 0xe7, 0xf7, 0xd4, 0x58,
+ 0xbf, 0xb6, 0x87, 0xaa, 0xde, 0x71, 0xec, 0x59, 0x02, 0x63, 0xeb, 0x30, 0x73, 0x2b, 0xff, 0x56, 0xaf, 0x6e, 0x9b, 0x59,
+ 0xdd, 0x58, 0xb3, 0x65, 0x15, 0xb5, 0x2d, 0xee, 0x49, 0xc7, 0xca, 0x75, 0xe2, 0x71, 0x69, 0x75, 0x70, 0x6d, 0x92, 0x56,
+ 0xaf, 0xd8, 0xce, 0xac, 0x7d, 0xdf, 0x99, 0xff, 0xb1, 0x33, 0x70, 0xfc, 0x73, 0x46, 0x62, 0x35, 0x55, 0x6d, 0x0d, 0x98,
+ 0x63, 0xe9, 0xb9, 0x19, 0x8b, 0xd6, 0x90, 0x8d, 0xef, 0x83, 0x3d, 0xe9, 0x90, 0xff, 0x2f, 0xe7, 0x3f, 0x57, 0x23, 0x7b,
+ 0xc7, 0xb3, 0x50, 0xe4, 0x5f, 0xfe, 0xe5, 0xff, 0xad, 0xf9, 0x8f, 0xe2, 0xfe, 0x77, 0xbe, 0x5a, 0x47, 0xcd, 0x95, 0x55,
+ 0x6d, 0x4a, 0xe4, 0x5f, 0xfe, 0x7f, 0xef, 0x6d, 0xc7, 0xc5, 0x56, 0x6c, 0xa4, 0xc5, 0xdb, 0x59, 0xb3, 0x64, 0x5f, 0x15,
+ 0xad, 0xd1, 0x6f, 0x93, 0x28, 0x4c, 0xf0, 0x57, 0xf2, 0x9f, 0xaf, 0x7b, 0xbe, 0x67, 0xdc, 0x2b, 0xb3, 0xe5, 0x99, 0xda,
+ 0x57, 0xf5, 0xf9, 0x3f, 0x7b, 0x1e, 0x42, 0xe6, 0xfb, 0xe9, 0x5b, 0xf9, 0x1f, 0xfd, 0x6c, 0xf2, 0x7f, 0x6c, 0x7e, 0xb6,
+ 0xcc, 0xfd, 0x35, 0x16, 0x23, 0xd9, 0xd2, 0x57, 0x6d, 0x75, 0xa4, 0x46, 0xdb, 0xaa, 0x7e, 0x9e, 0xab, 0xd2, 0xf8, 0xde,
+ 0xfc, 0x47, 0xc1, 0x7d, 0xae, 0xb9, 0x56, 0x52, 0xfe, 0xe5, 0xff, 0x98, 0xac, 0xc0, 0xdb, 0x3d, 0xff, 0x2b, 0xae, 0xbf,
+ 0x2b, 0x9f, 0xe6, 0xfa, 0xcc, 0xf6, 0xff, 0x59, 0xf7, 0xff, 0xbe, 0x92, 0xff, 0xb3, 0x63, 0x79, 0x77, 0xfe, 0x3b, 0xd5,
+ 0x4c, 0xcd, 0x8c, 0x30, 0xce, 0xfc, 0x9b, 0x8e, 0xf9, 0xdf, 0x35, 0x9f, 0x47, 0xfe, 0x77, 0xe5, 0xff, 0xe7, 0xa7, 0x8d,
+ 0xcb, 0x7f, 0xaf, 0xfc, 0xaf, 0xeb, 0xff, 0x3f, 0x3b, 0xff, 0xeb, 0x7a, 0x5f, 0xab, 0xfb, 0x73, 0xb5, 0x5b, 0x9e, 0x99,
+ 0x01, 0xf7, 0xdb, 0xfc, 0xbb, 0x48, 0x57, 0x6d, 0xaf, 0x98, 0x87, 0x37, 0x33, 0x3b, 0x68, 0xf7, 0x95, 0x41, 0xf5, 0xbf,
+ 0xa9, 0x1f, 0xb3, 0xe8, 0x9b, 0x7f, 0x78, 0x46, 0xfe, 0xbf, 0xb0, 0xaf, 0x71, 0x3c, 0xee, 0x69, 0x59, 0x57, 0xfe, 0x3e,
+ 0xce, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xd3, 0x2a, 0xac, 0xaa, 0xba, 0x8d, 0x3b,
+ 0xab, 0x65, 0xe4, 0xd6, 0xf9, 0xc5, 0xe5, 0xba, 0x2e, 0x99, 0x55, 0xe4, 0x23, 0x6b, 0xf9, 0x6a, 0xd6, 0x34, 0xe6, 0xcf,
+ 0x81, 0x48, 0xad, 0x96, 0x3b, 0x3f, 0x53, 0x32, 0x35, 0xec, 0xd7, 0xcd, 0xb6, 0xff, 0xbd, 0x7e, 0x43, 0xbe, 0x92, 0xc8,
+ 0xaa, 0xf5, 0x05, 0x75, 0xf5, 0x9f, 0x8e, 0x82, 0xd5, 0x8a, 0xd9, 0x35, 0xf4, 0xf7, 0xe6, 0x7f, 0x74, 0xf5, 0xdb, 0xf5,
+ 0x9f, 0x55, 0xd4, 0x5b, 0x89, 0xc4, 0xca, 0xbc, 0xca, 0xfc, 0x57, 0x9c, 0xe3, 0x51, 0xf6, 0xbe, 0xb1, 0xb8, 0x4e, 0xc1,
+ 0x95, 0x56, 0xe2, 0xd9, 0x6b, 0xa2, 0xe2, 0xd5, 0xf9, 0xaf, 0xad, 0x96, 0x5b, 0xff, 0x9d, 0x90, 0xaf, 0x4f, 0x70, 0x5f,
+ 0xfe, 0xff, 0x6e, 0x57, 0x75, 0xfe, 0x33, 0xef, 0x5b, 0x53, 0xd9, 0x6a, 0x2e, 0xff, 0x3d, 0x56, 0xf6, 0xc5, 0xf2, 0x9e,
+ 0x47, 0x26, 0xff, 0x63, 0xfd, 0xb6, 0x15, 0xf9, 0xcf, 0x57, 0xe6, 0x39, 0x36, 0x65, 0xfd, 0x28, 0x4e, 0xf9, 0xfa, 0xfc,
+ 0xd7, 0x9f, 0x69, 0xf1, 0x9f, 0xff, 0xbb, 0xac, 0xb6, 0x7d, 0x4b, 0xfe, 0x73, 0xd5, 0x69, 0x66, 0xf3, 0x9f, 0xbd, 0xe2,
+ 0xbd, 0xbb, 0xfd, 0x5f, 0x73, 0x4d, 0xb0, 0x3e, 0xff, 0x91, 0xaa, 0x0c, 0xde, 0x27, 0xff, 0xb1, 0x20, 0xb9, 0xf2, 0x9f,
+ 0x6d, 0x03, 0xdf, 0x90, 0xff, 0xea, 0xe7, 0x7c, 0x74, 0xc8, 0x7f, 0x6e, 0xc4, 0x2b, 0x4a, 0x73, 0x1a, 0xed, 0xdb, 0xff,
+ 0x63, 0xdb, 0xf8, 0x5f, 0xff, 0xfc, 0x47, 0x49, 0xbf, 0xf0, 0xce, 0xfc, 0xd7, 0x57, 0xcb, 0xcd, 0x56, 0x0d, 0xbc, 0x3e,
+ 0xd6, 0xd7, 0xa7, 0xfd, 0xaf, 0xbf, 0x1e, 0x5e, 0xd1, 0xfe, 0x1f, 0x0b, 0xee, 0x52, 0xac, 0xbf, 0xaa, 0xee, 0x9f, 0xff,
+ 0xaa, 0xeb, 0xc2, 0xcc, 0x73, 0x93, 0x46, 0xef, 0xff, 0xc5, 0xe9, 0x59, 0x3c, 0x7a, 0xe7, 0x68, 0x3c, 0x4f, 0x31, 0xf8,
+ 0xf4, 0xa2, 0xfe, 0xd7, 0xff, 0x95, 0xed, 0xff, 0x9a, 0x51, 0xef, 0xae, 0xa3, 0xe9, 0xd7, 0x9e, 0x2f, 0xde, 0x63, 0x8b,
+ 0xf3, 0x4f, 0xdc, 0x8a, 0xed, 0x57, 0x56, 0x7d, 0x8e, 0xf1, 0xfc, 0x67, 0x5f, 0x93, 0xff, 0x8a, 0x8a, 0xd3, 0xf5, 0xed,
+ 0xe1, 0xf7, 0xe6, 0xbc, 0xcc, 0xdc, 0x75, 0xef, 0xb1, 0xb5, 0xd5, 0xe7, 0xc5, 0x3b, 0xf2, 0x5f, 0xf7, 0xd9, 0x63, 0xc9,
+ 0xb7, 0x4a, 0xa6, 0x96, 0x77, 0x2c, 0x9f, 0x0f, 0x23, 0xff, 0xcf, 0xcd, 0x7f, 0xdc, 0x70, 0xcf, 0xf0, 0x58, 0x3c, 0x1e,
+ 0xdd, 0x61, 0x0f, 0xef, 0xcd, 0x3f, 0xfd, 0xce, 0x88, 0xee, 0xf9, 0x5f, 0x3f, 0x2f, 0xf4, 0xcb, 0xed, 0x81, 0x2a, 0xf9,
+ 0x3c, 0xf1, 0x5a, 0x56, 0xfe, 0x73, 0xfd, 0x96, 0xd9, 0xf9, 0xff, 0x20, 0xff, 0xdf, 0xdd, 0xeb, 0xd0, 0x7f, 0x76, 0x03,
+ 0xf2, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xfb, 0x67, 0xbb, 0x45, 0x6a, 0x7d, 0x5b, 0x0c, 0x56,
+ 0x32, 0x88, 0x74, 0xa5, 0xf8, 0x6c, 0x7d, 0x8c, 0x18, 0x5c, 0xf7, 0x35, 0x5f, 0x37, 0xf8, 0xfa, 0xf3, 0x15, 0x66, 0xd6,
+ 0x0f, 0xae, 0x3f, 0x8e, 0x75, 0x15, 0xd6, 0xeb, 0x8f, 0x52, 0xe6, 0xef, 0x47, 0x79, 0xed, 0xb5, 0xfe, 0x99, 0x99, 0xdf,
+ 0xcf, 0x99, 0x95, 0xbe, 0xb5, 0x67, 0xd4, 0xb5, 0x63, 0x5b, 0xb7, 0xba, 0x33, 0x26, 0x92, 0x3e, 0x3e, 0x4f, 0xfb, 0xf7,
+ 0xaa, 0x9f, 0x5d, 0x8f, 0x63, 0x2e, 0x4b, 0x51, 0xba, 0x06, 0x37, 0xf7, 0xd7, 0x9f, 0xb6, 0xaf, 0xaf, 0x57, 0x01, 0xd8,
+ 0xdd, 0x5f, 0xc8, 0x3f, 0x35, 0x28, 0x6e, 0x9f, 0x8b, 0xbf, 0xae, 0xa2, 0x4e, 0x5d, 0xad, 0xe2, 0xbb, 0x8f, 0xe3, 0x71,
+ 0xfa, 0x0c, 0x93, 0x68, 0xb8, 0xbe, 0xe5, 0xac, 0xff, 0x18, 0x2d, 0xf7, 0x75, 0x5c, 0xee, 0x23, 0xe6, 0xf3, 0x9f, 0x7f,
+ 0x3e, 0x53, 0x14, 0x57, 0xe6, 0xcd, 0x57, 0xc7, 0xac, 0xde, 0xfa, 0x7c, 0xfb, 0x9f, 0xb9, 0x52, 0x88, 0xe5, 0x9f, 0xaa,
+ 0xf6, 0x3b, 0x39, 0x4e, 0x6a, 0xb9, 0xae, 0x3e, 0x2b, 0x56, 0xbc, 0x12, 0x1b, 0xce, 0xad, 0xdc, 0xf5, 0xde, 0xb5, 0x33,
+ 0x64, 0x26, 0xff, 0x7d, 0x8f, 0xcd, 0xd1, 0xe6, 0x95, 0xdd, 0xf9, 0x7f, 0xee, 0x2b, 0xef, 0xc9, 0x7f, 0x9f, 0xb3, 0xef,
+ 0xb7, 0xcf, 0x33, 0xfb, 0xac, 0xc2, 0x0e, 0x47, 0xe0, 0xac, 0x4e, 0xec, 0x5b, 0xf3, 0x1f, 0x3f, 0x8e, 0x0c, 0xf6, 0xff,
+ 0x4e, 0xfe, 0xb9, 0x5f, 0xf0, 0xb4, 0xfc, 0x57, 0xb6, 0xcb, 0x15, 0x6d, 0xf9, 0xde, 0x6b, 0x66, 0xed, 0xbf, 0xf6, 0xff,
+ 0xdb, 0xf9, 0xbf, 0xff, 0x2a, 0x6c, 0x6f, 0x66, 0xfa, 0xed, 0xb3, 0x3e, 0xf9, 0x1f, 0x19, 0xf3, 0x92, 0xff, 0xb7, 0xe7,
+ 0xff, 0x09, 0xdf, 0x4d, 0xb3, 0xf7, 0xff, 0xde, 0x31, 0xfe, 0x57, 0xf5, 0x8a, 0xf6, 0x7f, 0x6e, 0x8c, 0xfd, 0xee, 0x6d,
+ 0xcb, 0x1f, 0xf3, 0xb7, 0x1c, 0x85, 0xd1, 0x3e, 0x80, 0xfe, 0xbf, 0xfc, 0xbf, 0x27, 0xff, 0x47, 0x7a, 0xf6, 0xc1, 0xb3,
+ 0xae, 0x33, 0x46, 0x8e, 0xc7, 0x73, 0xf2, 0x5f, 0x79, 0xc7, 0xee, 0x29, 0xe3, 0x7f, 0x4f, 0xfb, 0x66, 0x78, 0x63, 0xfe,
+ 0xef, 0xbd, 0xd7, 0xda, 0x63, 0xe6, 0xef, 0x33, 0xfb, 0x32, 0x4f, 0xce, 0xff, 0xb3, 0xfb, 0x64, 0xc7, 0x6d, 0x57, 0x85,
+ 0x51, 0xb8, 0xa7, 0x79, 0x46, 0xfe, 0x63, 0x53, 0xfe, 0x47, 0xc6, 0x06, 0xde, 0x9d, 0xff, 0xf1, 0xd6, 0x2a, 0x6e, 0x1f,
+ 0x63, 0x96, 0xff, 0xbb, 0xf3, 0xbf, 0x7f, 0xeb, 0x77, 0xf5, 0xc4, 0x62, 0x49, 0xd2, 0xc7, 0x8f, 0xc9, 0x13, 0xfb, 0xa4,
+ 0x3b, 0xb7, 0x4d, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xef, 0xcc, 0x00, 0x1e, 0x7b, 0xb5,
+ 0x43, 0x05, 0xfd, 0x23, 0x5d, 0x6d, 0xbd, 0xee, 0xf3, 0x1e, 0x89, 0xaa, 0xee, 0x99, 0x6d, 0xe8, 0x5c, 0x41, 0xdf, 0xac,
+ 0xdb, 0xb7, 0x7e, 0x03, 0xf4, 0xae, 0xa0, 0x7f, 0x5e, 0xe5, 0x63, 0xfd, 0xe7, 0xad, 0x9c, 0x3f, 0xdf, 0xbb, 0x82, 0x7e,
+ 0xbf, 0xb5, 0xab, 0xf4, 0xfb, 0x26, 0xd9, 0x59, 0x41, 0x7f, 0xbc, 0xbf, 0x71, 0x6c, 0xdc, 0xae, 0x6c, 0x35, 0x83, 0xae,
+ 0x15, 0xf4, 0xbb, 0xaf, 0x05, 0xe3, 0xfe, 0xb5, 0x59, 0x63, 0xcf, 0xb4, 0xa8, 0xaa, 0xa0, 0xf1, 0xb4, 0x0a, 0xfa, 0x67,
+ 0x19, 0x7b, 0x52, 0x9d, 0x6c, 0xf9, 0xb7, 0xfe, 0xf7, 0xbe, 0xfc, 0xf7, 0xad, 0x93, 0x91, 0xad, 0x52, 0xd3, 0xbb, 0x82,
+ 0xa6, 0xfc, 0xcb, 0xbf, 0xfc, 0xaf, 0xaa, 0x91, 0x20, 0xff, 0x3c, 0x3d, 0xff, 0x3b, 0x2b, 0xe8, 0xa8, 0xa0, 0xb9, 0xbb,
+ 0x22, 0xd0, 0x21, 0xff, 0xae, 0xff, 0x1f, 0xf1, 0x04, 0x3d, 0xf9, 0x5f, 0xf3, 0x8a, 0xfc, 0x7f, 0xfd, 0xde, 0x9f, 0x0a,
+ 0xda, 0x2b, 0xf3, 0x1f, 0x4d, 0xc7, 0xff, 0xf6, 0xdf, 0xf1, 0xe1, 0x89, 0xf9, 0xd7, 0xff, 0xcf, 0xe7, 0xe2, 0xfe, 0x0a,
+ 0x9a, 0xf9, 0x34, 0xcb, 0xbf, 0xfe, 0x7f, 0xc5, 0xfc, 0x9f, 0x9a, 0xb6, 0x47, 0x05, 0xcd, 0xb9, 0x6d, 0x93, 0x7f, 0xd0,
+ 0x2b, 0xd4, 0xff, 0x07, 0xbd, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xf9, 0xf3, 0x9f, 0xfd, 0x00, 0xf2, 0x0f, 0x7c, 0x2e, 0xff, 0xff, 0x00 };
+
+// Font glyphs rectangles data (on atlas)
+static const Rectangle terminalFontRecs[189] = {
+ { 4, 4, 4 , 16 },
+ { 16, 4, 1 , 11 },
+ { 25, 4, 3 , 3 },
+ { 36, 4, 6 , 11 },
+ { 50, 4, 5 , 11 },
+ { 63, 4, 5 , 11 },
+ { 76, 4, 5 , 11 },
+ { 89, 4, 1 , 2 },
+ { 98, 4, 2 , 13 },
+ { 108, 4, 2 , 13 },
+ { 118, 4, 3 , 3 },
+ { 129, 4, 5 , 5 },
+ { 142, 4, 1 , 3 },
+ { 151, 4, 5 , 1 },
+ { 164, 4, 1 , 1 },
+ { 173, 4, 6 , 12 },
+ { 187, 4, 5 , 11 },
+ { 200, 4, 2 , 11 },
+ { 210, 4, 5 , 11 },
+ { 223, 4, 5 , 11 },
+ { 236, 4, 5 , 11 },
+ { 249, 4, 5 , 11 },
+ { 262, 4, 5 , 11 },
+ { 275, 4, 5 , 11 },
+ { 288, 4, 5 , 11 },
+ { 301, 4, 5 , 11 },
+ { 314, 4, 1 , 8 },
+ { 323, 4, 1 , 10 },
+ { 332, 4, 4 , 5 },
+ { 344, 4, 5 , 3 },
+ { 357, 4, 4 , 5 },
+ { 369, 4, 5 , 11 },
+ { 382, 4, 11 , 11 },
+ { 401, 4, 5 , 11 },
+ { 414, 4, 5 , 11 },
+ { 427, 4, 5 , 11 },
+ { 440, 4, 5 , 11 },
+ { 453, 4, 5 , 11 },
+ { 466, 4, 5 , 11 },
+ { 479, 4, 5 , 11 },
+ { 492, 4, 5 , 11 },
+ { 4, 28, 1 , 11 },
+ { 13, 28, 5 , 11 },
+ { 26, 28, 5 , 11 },
+ { 39, 28, 5 , 11 },
+ { 52, 28, 7 , 11 },
+ { 67, 28, 5 , 11 },
+ { 80, 28, 5 , 11 },
+ { 93, 28, 5 , 11 },
+ { 106, 28, 5 , 13 },
+ { 119, 28, 5 , 11 },
+ { 132, 28, 5 , 11 },
+ { 145, 28, 5 , 11 },
+ { 158, 28, 5 , 11 },
+ { 171, 28, 5 , 11 },
+ { 184, 28, 7 , 11 },
+ { 199, 28, 5 , 11 },
+ { 212, 28, 5 , 11 },
+ { 225, 28, 5 , 11 },
+ { 238, 28, 2 , 13 },
+ { 248, 28, 6 , 12 },
+ { 262, 28, 2 , 13 },
+ { 272, 28, 5 , 4 },
+ { 285, 28, 5 , 1 },
+ { 298, 28, 2 , 2 },
+ { 308, 28, 5 , 8 },
+ { 321, 28, 5 , 11 },
+ { 334, 28, 5 , 8 },
+ { 347, 28, 5 , 11 },
+ { 360, 28, 5 , 8 },
+ { 373, 28, 4 , 11 },
+ { 385, 28, 5 , 10 },
+ { 398, 28, 5 , 11 },
+ { 411, 28, 1 , 11 },
+ { 420, 28, 1 , 13 },
+ { 429, 28, 5 , 11 },
+ { 442, 28, 1 , 11 },
+ { 451, 28, 7 , 8 },
+ { 466, 28, 5 , 8 },
+ { 479, 28, 5 , 8 },
+ { 492, 28, 5 , 10 },
+ { 4, 52, 5 , 10 },
+ { 17, 52, 4 , 8 },
+ { 29, 52, 5 , 8 },
+ { 42, 52, 3 , 11 },
+ { 53, 52, 5 , 8 },
+ { 66, 52, 5 , 8 },
+ { 79, 52, 7 , 8 },
+ { 94, 52, 5 , 8 },
+ { 107, 52, 5 , 10 },
+ { 120, 52, 5 , 8 },
+ { 133, 52, 3 , 13 },
+ { 144, 52, 1 , 15 },
+ { 153, 52, 3 , 13 },
+ { 164, 52, 5 , 3 },
+ { 177, 52, 1 , 11 },
+ { 186, 52, 5 , 11 },
+ { 199, 52, 5 , 10 },
+ { 212, 52, 5 , 10 },
+ { 225, 52, 5 , 10 },
+ { 238, 52, 0 , 0 },
+ { 246, 52, 0 , 0 },
+ { 254, 52, 0 , 0 },
+ { 262, 52, 7 , 8 },
+ { 277, 52, 0 , 0 },
+ { 285, 52, 0 , 0 },
+ { 293, 52, 5 , 3 },
+ { 306, 52, 7 , 8 },
+ { 321, 52, 5 , 1 },
+ { 334, 52, 3 , 3 },
+ { 345, 52, 5 , 7 },
+ { 358, 52, 0 , 0 },
+ { 366, 52, 0 , 0 },
+ { 374, 52, 0 , 0 },
+ { 382, 52, 5 , 10 },
+ { 395, 52, 7 , 11 },
+ { 410, 52, 1 , 1 },
+ { 419, 52, 0 , 0 },
+ { 427, 52, 0 , 0 },
+ { 435, 52, 0 , 0 },
+ { 443, 52, 0 , 0 },
+ { 451, 52, 0 , 0 },
+ { 459, 52, 0 , 0 },
+ { 467, 52, 5 , 13 },
+ { 480, 52, 5 , 11 },
+ { 493, 52, 5 , 14 },
+ { 4, 76, 5 , 14 },
+ { 17, 76, 5 , 14 },
+ { 30, 76, 5 , 14 },
+ { 43, 76, 5 , 13 },
+ { 56, 76, 5 , 13 },
+ { 69, 76, 9 , 11 },
+ { 86, 76, 5 , 13 },
+ { 99, 76, 5 , 14 },
+ { 112, 76, 5 , 14 },
+ { 125, 76, 5 , 14 },
+ { 138, 76, 5 , 13 },
+ { 151, 76, 2 , 14 },
+ { 161, 76, 2 , 14 },
+ { 171, 76, 3 , 14 },
+ { 182, 76, 3 , 13 },
+ { 193, 76, 5 , 11 },
+ { 206, 76, 5 , 14 },
+ { 219, 76, 5 , 14 },
+ { 232, 76, 5 , 14 },
+ { 245, 76, 5 , 14 },
+ { 258, 76, 5 , 14 },
+ { 271, 76, 5 , 13 },
+ { 284, 76, 5 , 5 },
+ { 297, 76, 5 , 13 },
+ { 310, 76, 5 , 14 },
+ { 323, 76, 5 , 14 },
+ { 336, 76, 5 , 14 },
+ { 349, 76, 5 , 13 },
+ { 362, 76, 5 , 14 },
+ { 375, 76, 5 , 11 },
+ { 388, 76, 5 , 11 },
+ { 401, 76, 5 , 11 },
+ { 414, 76, 5 , 11 },
+ { 427, 76, 5 , 11 },
+ { 440, 76, 5 , 11 },
+ { 453, 76, 5 , 10 },
+ { 466, 76, 5 , 10 },
+ { 479, 76, 9 , 8 },
+ { 496, 76, 5 , 10 },
+ { 4, 100, 5 , 11 },
+ { 17, 100, 5 , 11 },
+ { 30, 100, 5 , 11 },
+ { 43, 100, 5 , 10 },
+ { 56, 100, 2 , 11 },
+ { 66, 100, 2 , 11 },
+ { 76, 100, 3 , 11 },
+ { 87, 100, 3 , 10 },
+ { 98, 100, 5 , 11 },
+ { 111, 100, 5 , 11 },
+ { 124, 100, 5 , 11 },
+ { 137, 100, 5 , 11 },
+ { 150, 100, 5 , 11 },
+ { 163, 100, 5 , 11 },
+ { 176, 100, 5 , 10 },
+ { 189, 100, 5 , 5 },
+ { 202, 100, 5 , 10 },
+ { 215, 100, 5 , 11 },
+ { 228, 100, 5 , 11 },
+ { 241, 100, 5 , 11 },
+ { 254, 100, 5 , 10 },
+ { 267, 100, 5 , 13 },
+ { 280, 100, 4 , 8 },
+ { 292, 100, 5 , 12 },
+};
+
+// Font glyphs info data
+// NOTE: No glyphs.image data provided
+static const GlyphInfo terminalFontGlyphs[189] = {
+ { 32, 0, 14, 4, { 0 }},
+ { 33, 1, 3, 3, { 0 }},
+ { 34, 1, 3, 5, { 0 }},
+ { 35, 1, 3, 8, { 0 }},
+ { 36, 1, 3, 7, { 0 }},
+ { 37, 1, 3, 7, { 0 }},
+ { 38, 1, 3, 7, { 0 }},
+ { 39, 1, 3, 3, { 0 }},
+ { 40, 1, 2, 4, { 0 }},
+ { 41, 1, 2, 4, { 0 }},
+ { 42, 1, 3, 5, { 0 }},
+ { 43, 1, 7, 7, { 0 }},
+ { 44, 1, 13, 3, { 0 }},
+ { 45, 1, 9, 7, { 0 }},
+ { 46, 1, 13, 3, { 0 }},
+ { 47, 1, 2, 8, { 0 }},
+ { 48, 1, 3, 7, { 0 }},
+ { 49, 1, 3, 4, { 0 }},
+ { 50, 1, 3, 7, { 0 }},
+ { 51, 1, 3, 7, { 0 }},
+ { 52, 1, 3, 7, { 0 }},
+ { 53, 1, 3, 7, { 0 }},
+ { 54, 1, 3, 7, { 0 }},
+ { 55, 1, 3, 7, { 0 }},
+ { 56, 1, 3, 7, { 0 }},
+ { 57, 1, 3, 7, { 0 }},
+ { 58, 1, 6, 3, { 0 }},
+ { 59, 1, 6, 3, { 0 }},
+ { 60, 1, 7, 6, { 0 }},
+ { 61, 1, 8, 7, { 0 }},
+ { 62, 1, 7, 6, { 0 }},
+ { 63, 1, 3, 7, { 0 }},
+ { 64, 2, 3, 15, { 0 }},
+ { 65, 1, 3, 7, { 0 }},
+ { 66, 1, 3, 7, { 0 }},
+ { 67, 1, 3, 7, { 0 }},
+ { 68, 1, 3, 7, { 0 }},
+ { 69, 1, 3, 7, { 0 }},
+ { 70, 1, 3, 7, { 0 }},
+ { 71, 1, 3, 7, { 0 }},
+ { 72, 1, 3, 7, { 0 }},
+ { 73, 1, 3, 3, { 0 }},
+ { 74, 1, 3, 7, { 0 }},
+ { 75, 1, 3, 7, { 0 }},
+ { 76, 1, 3, 7, { 0 }},
+ { 77, 1, 3, 9, { 0 }},
+ { 78, 1, 3, 7, { 0 }},
+ { 79, 1, 3, 7, { 0 }},
+ { 80, 1, 3, 7, { 0 }},
+ { 81, 1, 3, 7, { 0 }},
+ { 82, 1, 3, 7, { 0 }},
+ { 83, 1, 3, 7, { 0 }},
+ { 84, 1, 3, 7, { 0 }},
+ { 85, 1, 3, 7, { 0 }},
+ { 86, 1, 3, 7, { 0 }},
+ { 87, 1, 3, 9, { 0 }},
+ { 88, 1, 3, 7, { 0 }},
+ { 89, 1, 3, 7, { 0 }},
+ { 90, 1, 3, 7, { 0 }},
+ { 91, 1, 2, 4, { 0 }},
+ { 92, 1, 2, 8, { 0 }},
+ { 93, 1, 2, 4, { 0 }},
+ { 94, 1, 3, 7, { 0 }},
+ { 95, 1, 15, 7, { 0 }},
+ { 96, 1, 0, 4, { 0 }},
+ { 97, 1, 6, 7, { 0 }},
+ { 98, 1, 3, 7, { 0 }},
+ { 99, 1, 6, 7, { 0 }},
+ { 100, 1, 3, 7, { 0 }},
+ { 101, 1, 6, 7, { 0 }},
+ { 102, 1, 3, 6, { 0 }},
+ { 103, 1, 6, 7, { 0 }},
+ { 104, 1, 3, 7, { 0 }},
+ { 105, 1, 3, 3, { 0 }},
+ { 106, 1, 3, 3, { 0 }},
+ { 107, 1, 3, 7, { 0 }},
+ { 108, 1, 3, 3, { 0 }},
+ { 109, 1, 6, 9, { 0 }},
+ { 110, 1, 6, 7, { 0 }},
+ { 111, 1, 6, 7, { 0 }},
+ { 112, 1, 6, 7, { 0 }},
+ { 113, 1, 6, 7, { 0 }},
+ { 114, 1, 6, 6, { 0 }},
+ { 115, 1, 6, 7, { 0 }},
+ { 116, 1, 3, 5, { 0 }},
+ { 117, 1, 6, 7, { 0 }},
+ { 118, 1, 6, 7, { 0 }},
+ { 119, 1, 6, 9, { 0 }},
+ { 120, 1, 6, 7, { 0 }},
+ { 121, 1, 6, 7, { 0 }},
+ { 122, 1, 6, 7, { 0 }},
+ { 123, 1, 2, 5, { 0 }},
+ { 124, 1, 1, 3, { 0 }},
+ { 125, 1, 2, 5, { 0 }},
+ { 126, 1, 8, 7, { 0 }},
+ { 161, 1, 3, 3, { 0 }},
+ { 162, 1, 3, 7, { 0 }},
+ { 163, 1, 3, 7, { 0 }},
+ { 8364, 1, 3, 7, { 0 }},
+ { 165, 1, 3, 7, { 0 }},
+ { 352, 0, 14, 4, { 0 }},
+ { 167, 0, 14, 4, { 0 }},
+ { 353, 0, 14, 4, { 0 }},
+ { 169, 1, 3, 9, { 0 }},
+ { 170, 0, 14, 4, { 0 }},
+ { 171, 0, 14, 4, { 0 }},
+ { 172, 1, 8, 7, { 0 }},
+ { 174, 1, 3, 9, { 0 }},
+ { 175, 1, 1, 7, { 0 }},
+ { 176, 1, 0, 5, { 0 }},
+ { 177, 1, 7, 7, { 0 }},
+ { 178, 0, 14, 4, { 0 }},
+ { 179, 0, 14, 4, { 0 }},
+ { 381, 0, 14, 4, { 0 }},
+ { 181, 1, 6, 7, { 0 }},
+ { 182, 1, 3, 9, { 0 }},
+ { 183, 1, 8, 3, { 0 }},
+ { 382, 0, 14, 4, { 0 }},
+ { 185, 0, 14, 4, { 0 }},
+ { 186, 0, 14, 4, { 0 }},
+ { 187, 0, 14, 4, { 0 }},
+ { 338, 0, 14, 4, { 0 }},
+ { 339, 0, 14, 4, { 0 }},
+ { 376, 1, 1, 7, { 0 }},
+ { 191, 1, 3, 7, { 0 }},
+ { 192, 1, 0, 7, { 0 }},
+ { 193, 1, 0, 7, { 0 }},
+ { 194, 1, 0, 7, { 0 }},
+ { 195, 1, 0, 7, { 0 }},
+ { 196, 1, 1, 7, { 0 }},
+ { 197, 1, 1, 7, { 0 }},
+ { 198, 1, 3, 11, { 0 }},
+ { 199, 1, 3, 7, { 0 }},
+ { 200, 1, 0, 7, { 0 }},
+ { 201, 1, 0, 7, { 0 }},
+ { 202, 1, 0, 7, { 0 }},
+ { 203, 1, 1, 7, { 0 }},
+ { 204, 0, 0, 3, { 0 }},
+ { 205, 1, 0, 3, { 0 }},
+ { 206, 0, 0, 3, { 0 }},
+ { 207, 0, 1, 3, { 0 }},
+ { 208, 1, 3, 7, { 0 }},
+ { 209, 1, 0, 7, { 0 }},
+ { 210, 1, 0, 7, { 0 }},
+ { 211, 1, 0, 7, { 0 }},
+ { 212, 1, 0, 7, { 0 }},
+ { 213, 1, 0, 7, { 0 }},
+ { 214, 1, 1, 7, { 0 }},
+ { 215, 1, 7, 7, { 0 }},
+ { 216, 1, 2, 7, { 0 }},
+ { 217, 1, 0, 7, { 0 }},
+ { 218, 1, 0, 7, { 0 }},
+ { 219, 1, 0, 7, { 0 }},
+ { 220, 1, 1, 7, { 0 }},
+ { 221, 1, 0, 7, { 0 }},
+ { 222, 1, 3, 7, { 0 }},
+ { 223, 1, 3, 7, { 0 }},
+ { 224, 1, 3, 7, { 0 }},
+ { 225, 1, 3, 7, { 0 }},
+ { 226, 1, 3, 7, { 0 }},
+ { 227, 1, 3, 7, { 0 }},
+ { 228, 1, 4, 7, { 0 }},
+ { 229, 1, 4, 7, { 0 }},
+ { 230, 1, 6, 11, { 0 }},
+ { 231, 1, 6, 7, { 0 }},
+ { 232, 1, 3, 7, { 0 }},
+ { 233, 1, 3, 7, { 0 }},
+ { 234, 1, 3, 7, { 0 }},
+ { 235, 1, 4, 7, { 0 }},
+ { 236, 0, 3, 3, { 0 }},
+ { 237, 1, 3, 3, { 0 }},
+ { 238, 0, 3, 3, { 0 }},
+ { 239, 0, 4, 3, { 0 }},
+ { 240, 1, 3, 7, { 0 }},
+ { 241, 1, 3, 7, { 0 }},
+ { 242, 1, 3, 7, { 0 }},
+ { 243, 1, 3, 7, { 0 }},
+ { 244, 1, 3, 7, { 0 }},
+ { 245, 1, 3, 7, { 0 }},
+ { 246, 1, 4, 7, { 0 }},
+ { 247, 1, 7, 7, { 0 }},
+ { 248, 1, 5, 7, { 0 }},
+ { 249, 1, 3, 7, { 0 }},
+ { 250, 1, 3, 7, { 0 }},
+ { 251, 1, 3, 7, { 0 }},
+ { 252, 1, 4, 7, { 0 }},
+ { 253, 1, 3, 7, { 0 }},
+ { 254, 1, 6, 6, { 0 }},
+ { 255, 1, 4, 7, { 0 }},
+};
+
+// Style loading function: Terminal
+static void GuiLoadStyleTerminal(void)
+{
+ // Load style properties provided
+ // NOTE: Default properties are propagated
+ for (int i = 0; i < TERMINAL_STYLE_PROPS_COUNT; i++)
+ {
+ GuiSetStyle(terminalStyleProps[i].controlId, terminalStyleProps[i].propertyId, terminalStyleProps[i].propertyValue);
+ }
+
+ // Custom font loading
+ // NOTE: Compressed font image data (DEFLATE), it requires DecompressData() function
+ int terminalFontDataSize = 0;
+ unsigned char *data = DecompressData(terminalFontData, TERMINAL_STYLE_FONT_ATLAS_COMP_SIZE, &terminalFontDataSize);
+ Image imFont = { data, 512, 256, 1, 2 };
+
+ Font font = { 0 };
+ font.baseSize = 16;
+ font.glyphCount = 189;
+
+ // Load texture from image
+ font.texture = LoadTextureFromImage(imFont);
+ UnloadImage(imFont); // Uncompressed image data can be unloaded from memory
+
+ // Copy char recs data from global fontRecs
+ // NOTE: Required to avoid issues if trying to free font
+ font.recs = (Rectangle *)RAYGUI_MALLOC(font.glyphCount*sizeof(Rectangle));
+ memcpy(font.recs, terminalFontRecs, font.glyphCount*sizeof(Rectangle));
+
+ // Copy font char info data from global fontChars
+ // NOTE: Required to avoid issues if trying to free font
+ font.glyphs = (GlyphInfo *)RAYGUI_MALLOC(font.glyphCount*sizeof(GlyphInfo));
+ memcpy(font.glyphs, terminalFontGlyphs, font.glyphCount*sizeof(GlyphInfo));
+
+ GuiSetFont(font);
+
+ // Setup a white rectangle on the font to be used on shapes drawing,
+ // it makes possible to draw shapes and text (full UI) in a single draw call
+ Rectangle fontWhiteRec = { 510, 254, 1, 1 };
+ SetShapesTexture(font.texture, fontWhiteRec);
+
+ //-----------------------------------------------------------------
+
+ // TODO: Custom user style setup: Set specific properties here (if required)
+ // i.e. Controls specific BORDER_WIDTH, TEXT_PADDING, TEXT_ALIGNMENT
+}
diff --git a/external/raygui-4.0/styles/terminal/style_terminal.old.rgs b/external/raygui-4.0/styles/terminal/style_terminal.old.rgs
new file mode 100644
index 0000000..939e734
Binary files /dev/null and b/external/raygui-4.0/styles/terminal/style_terminal.old.rgs differ
diff --git a/external/raygui-4.0/styles/terminal/style_terminal.png b/external/raygui-4.0/styles/terminal/style_terminal.png
new file mode 100644
index 0000000..24d889d
Binary files /dev/null and b/external/raygui-4.0/styles/terminal/style_terminal.png differ
diff --git a/external/raygui-4.0/styles/terminal/style_terminal.rgs b/external/raygui-4.0/styles/terminal/style_terminal.rgs
new file mode 100644
index 0000000..4657d04
Binary files /dev/null and b/external/raygui-4.0/styles/terminal/style_terminal.rgs differ
diff --git a/external/raygui-4.0/styles/terminal/style_terminal.txt.rgs b/external/raygui-4.0/styles/terminal/style_terminal.txt.rgs
new file mode 100644
index 0000000..fc996de
--- /dev/null
+++ b/external/raygui-4.0/styles/terminal/style_terminal.txt.rgs
@@ -0,0 +1,27 @@
+#
+# rgs style text file (v4.0) - raygui style file generated using rGuiStyler
+#
+# Provided info:
+# f fontGenSize charsetFileName fontFileName
+# p Property description
+#
+# WARNING: This style uses a custom font, must be provided with style file
+#
+f 16 charset.txt Mecha.ttf
+p 00 00 0x1c8d00ff DEFAULT_BORDER_COLOR_NORMAL
+p 00 01 0x161313ff DEFAULT_BASE_COLOR_NORMAL
+p 00 02 0x38f620ff DEFAULT_TEXT_COLOR_NORMAL
+p 00 03 0xc3fbc6ff DEFAULT_BORDER_COLOR_FOCUSED
+p 00 04 0x43bf2eff DEFAULT_BASE_COLOR_FOCUSED
+p 00 05 0xdcfadcff DEFAULT_TEXT_COLOR_FOCUSED
+p 00 06 0x1f5b19ff DEFAULT_BORDER_COLOR_PRESSED
+p 00 07 0x43ff28ff DEFAULT_BASE_COLOR_PRESSED
+p 00 08 0x1e6f15ff DEFAULT_TEXT_COLOR_PRESSED
+p 00 09 0x223b22ff DEFAULT_BORDER_COLOR_DISABLED
+p 00 10 0x182c18ff DEFAULT_BASE_COLOR_DISABLED
+p 00 11 0x244125ff DEFAULT_TEXT_COLOR_DISABLED
+p 00 16 0x00000010 TEXT_SIZE
+p 00 17 0x00000000 TEXT_SPACING
+p 00 18 0xe6fce3ff LINE_COLOR
+p 00 19 0x0c1505ff BACKGROUND_COLOR
+p 00 20 0x00000018 TEXT_LINE_SPACING
diff --git a/src/main.cpp b/src/main.cpp
index 5ecb047..30c38b0 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,26 +1,59 @@
#include "fetch.hpp"
+
#include
#include
+
+#define RAYGUI_IMPLEMENTATION
+#include
#include
-#include
int main()
{
init_curl();
- std::optional data = fetch_url("https://example.com");
- if (data.has_value()) {
- std::cout << data.value();
- }
+ std::optional page_data;
+
+ SetConfigFlags(ConfigFlags::FLAG_WINDOW_RESIZABLE | ConfigFlags::FLAG_MSAA_4X_HINT | ConfigFlags ::FLAG_VSYNC_HINT);
- SetConfigFlags(ConfigFlags::FLAG_WINDOW_RESIZABLE);
raylib::Window window(800, 600, "Browser");
+
+ raylib::Font sans_font = raylib::LoadFontEx("../data/OpenSans-Regular.ttf", 24, nullptr, 0);
+ GuiSetFont(sans_font);
+ GuiSetStyle(DEFAULT, TEXT_SIZE, 24);
+
SetTargetFPS(60);
+ bool is_editing_url = false;
+ std::string url_input;
+ url_input.reserve(1024);
+ raylib::Vector2 page_content_size;
+ float scroll_pos = 0.0f;
+
while (!window.ShouldClose()) {
BeginDrawing();
window.ClearBackground(raylib::Color::White());
- DrawText(data.value().data(), 0, 0, 24, raylib::Color::Black());
+
+ if (GuiTextBox(
+ { .x = 0, .y = 0, .width = (float)GetScreenWidth() - 50, .height = 24 },
+ url_input.data(),
+ 24,
+ is_editing_url)) {
+ is_editing_url = !is_editing_url;
+ }
+
+ if (GuiButton({ .x = (float)GetScreenWidth() - 50, .y = 0, .width = 50, .height = 24 }, "Go")) {
+ page_data = fetch_url(url_input);
+ if (page_data.has_value()) {
+ page_content_size = MeasureTextEx(sans_font, page_data.value().data(), 24, 1.0f);
+ }
+ }
+
+ scroll_pos += GetMouseWheelMove();
+
+ if (page_data.has_value()) {
+ DrawTextEx(sans_font, page_data.value(), { 0, 20 + scroll_pos * 20 }, 24, 1.0f, BLACK);
+ }
+
EndDrawing();
}