diff options
| author | realtradam <[email protected]> | 2022-04-14 08:37:05 -0400 |
|---|---|---|
| committer | realtradam <[email protected]> | 2022-04-14 08:37:05 -0400 |
| commit | 20a0d29ccc3a330691519b285121f564374b8eb5 (patch) | |
| tree | 46445dac6f1edb94ce4a3dd9a3f4e7ef290daccb | |
| download | zig-chip-8-20a0d29ccc3a330691519b285121f564374b8eb5.tar.gz zig-chip-8-20a0d29ccc3a330691519b285121f564374b8eb5.zip | |
init
| -rw-r--r-- | .gitignore | 6 | ||||
| -rw-r--r-- | build.zig | 44 | ||||
| -rw-r--r-- | include/LICENSE | 16 | ||||
| -rw-r--r-- | include/raygui.h | 4342 | ||||
| -rw-r--r-- | include/raylib.h | 1555 | ||||
| -rw-r--r-- | roms/IBM Logo.ch8 | bin | 0 -> 132 bytes | |||
| -rw-r--r-- | src/main.zig | 84 | ||||
| -rw-r--r-- | src/raylib.zig | 8789 |
8 files changed, 14836 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b5cd24 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +zig-cache +zig-cache/* +zig-out +zig-out/* +src/zig-cache +src/zig-cache/* diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..f8394ee --- /dev/null +++ b/build.zig @@ -0,0 +1,44 @@ +const std = @import("std"); + +pub fn build(b: *std.build.Builder) void { + // Standard target options allows the person running `zig build` to choose + // what target to build for. Here we do not override the defaults, which + // means any target is allowed, and the default is native. Other options + // for restricting supported target set are available. + const target = b.standardTargetOptions(.{}); + + // Standard release options allow the person running `zig build` to select + // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. + const mode = b.standardReleaseOptions(); + + const exe = b.addExecutable("testraylib", "src/main.zig"); + exe.linkSystemLibrary("c"); + exe.linkSystemLibrary("raylib"); + //exe.linkSystemLibrary("extras/raygui"); + //exe.addStaticLibrary("raygui", getSrcDir() ++ "/include/raygui.h"); + exe.setTarget(target); + exe.setBuildMode(mode); + exe.install(); + + const run_cmd = exe.run(); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); + + const exe_tests = b.addTest("src/main.zig"); + exe_tests.setTarget(target); + exe_tests.setBuildMode(mode); + + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&exe_tests.step); +} + +const srcdir = getSrcDir(); + +fn getSrcDir() []const u8 { + return std.fs.path.dirname(@src().file) orelse "."; +} diff --git a/include/LICENSE b/include/LICENSE new file mode 100644 index 0000000..2694b47 --- /dev/null +++ b/include/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) 2013-2022 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/include/raygui.h b/include/raygui.h new file mode 100644 index 0000000..dfb7792 --- /dev/null +++ b/include/raygui.h @@ -0,0 +1,4342 @@ +/******************************************************************************************* +* +* raygui v3.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. +* +* Controls provided: +* +* # Container/separators Controls +* - WindowBox +* - GroupBox +* - Line +* - Panel +* +* # Basic Controls +* - Label +* - Button +* - LabelButton --> Label +* - Toggle +* - ToggleGroup --> Toggle +* - CheckBox +* - ComboBox +* - DropdownBox +* - TextBox +* - TextBoxMulti +* - ValueBox --> TextBox +* - Spinner --> Button, ValueBox +* - Slider +* - SliderBar --> Slider +* - ProgressBar +* - StatusBar +* - ScrollBar +* - ScrollPanel +* - 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). +* +* +* GUI 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. +* +* +* GUI 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 RICON_SIZE and no more than RICON_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[RICON_MAX_ICONS*RICON_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 raygui icons. +* +* +* 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_RICONS +* Avoid including embedded ricons data (256 icons, 16x16 pixels, 1-bit per pixel, 2KB) +* +* #define RAYGUI_CUSTOM_RICONS +* Includes custom ricons.h header defining a set of custom icons, +* this file can be generated using rGuiIcons tool +* +* +* VERSIONS HISTORY: +* +* 3.0 (xx-Sep-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. +* +* +* 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-2021 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 "3.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 + +// TODO: Implement custom TraceLog() +#define TRACELOG(level, ...) (void)0 + +//---------------------------------------------------------------------------------- +// 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; + + // 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 characters + Texture2D texture; // Characters texture atlas + Rectangle *recs; // Characters rectangles in texture + GlyphInfo *chars; // Characters info data + } Font; +#endif + +// Style property +typedef struct GuiStyleProp { + unsigned short controlId; + unsigned short propertyId; + int propertyValue; +} GuiStyleProp; + +// Gui control state +typedef enum { + GUI_STATE_NORMAL = 0, + GUI_STATE_FOCUSED, + GUI_STATE_PRESSED, + GUI_STATE_DISABLED, +} GuiControlState; + +// Gui control text alignment +typedef enum { + GUI_TEXT_ALIGN_LEFT = 0, + GUI_TEXT_ALIGN_CENTER, + GUI_TEXT_ALIGN_RIGHT, +} GuiTextAlignment; + +// Gui controls +typedef enum { + DEFAULT = 0, // Generic control -> populates to all controls when set + LABEL, // Used also for: LABELBUTTON + BUTTON, + TOGGLE, // Used also for: TOGGLEGROUP + SLIDER, // Used also for: SLIDERBAR + PROGRESSBAR, + CHECKBOX, + COMBOBOX, + DROPDOWNBOX, + TEXTBOX, // Used also for: TEXTBOXMULTI + VALUEBOX, + SPINNER, + 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, + BASE_COLOR_NORMAL, + TEXT_COLOR_NORMAL, + BORDER_COLOR_FOCUSED, + BASE_COLOR_FOCUSED, + TEXT_COLOR_FOCUSED, + BORDER_COLOR_PRESSED, + BASE_COLOR_PRESSED, + TEXT_COLOR_PRESSED, + BORDER_COLOR_DISABLED, + BASE_COLOR_DISABLED, + TEXT_COLOR_DISABLED, + BORDER_WIDTH, + TEXT_PADDING, + TEXT_ALIGNMENT, + RESERVED +} GuiControlProperty; + +// Gui extended properties depend on control +// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default 8 properties) + +// DEFAULT extended properties +// NOTE: Those properties are actually common to all controls +typedef enum { + TEXT_SIZE = 16, + TEXT_SPACING, + LINE_COLOR, + BACKGROUND_COLOR, +} GuiDefaultProperty; + +// Label +//typedef enum { } GuiLabelProperty; + +// Button +//typedef enum { } GuiButtonProperty; + +// Toggle/ToggleGroup +typedef enum { + GROUP_PADDING = 16, +} GuiToggleProperty; + +// Slider/SliderBar +typedef enum { + SLIDER_WIDTH = 16, + SLIDER_PADDING +} GuiSliderProperty; + +// ProgressBar +typedef enum { + PROGRESS_PADDING = 16, +} GuiProgressBarProperty; + +// CheckBox +typedef enum { + CHECK_PADDING = 16 +} GuiCheckBoxProperty; + +// ComboBox +typedef enum { + COMBO_BUTTON_WIDTH = 16, + COMBO_BUTTON_PADDING +} GuiComboBoxProperty; + +// DropdownBox +typedef enum { + ARROW_PADDING = 16, + DROPDOWN_ITEMS_PADDING +} GuiDropdownBoxProperty; + +// TextBox/TextBoxMulti/ValueBox/Spinner +typedef enum { + TEXT_INNER_PADDING = 16, + TEXT_LINES_PADDING, + COLOR_SELECTED_FG, + COLOR_SELECTED_BG +} GuiTextBoxProperty; + +// Spinner +typedef enum { + SPIN_BUTTON_WIDTH = 16, + SPIN_BUTTON_PADDING, +} GuiSpinnerProperty; + +// ScrollBar +typedef enum { + ARROWS_SIZE = 16, + ARROWS_VISIBLE, + SCROLL_SLIDER_PADDING, + SCROLL_SLIDER_SIZE, + SCROLL_PADDING, + SCROLL_SPEED, +} GuiScrollBarProperty; + +// ScrollBar side +typedef enum { + SCROLLBAR_LEFT_SIDE = 0, + SCROLLBAR_RIGHT_SIDE +} GuiScrollBarSide; + +// ListView +typedef enum { + LIST_ITEMS_HEIGHT = 16, + LIST_ITEMS_PADDING, + SCROLLBAR_WIDTH, + SCROLLBAR_SIDE, +} GuiListViewProperty; + +// ColorPicker +typedef enum { + COLOR_SELECTOR_SIZE = 16, + HUEBAR_WIDTH, // Right hue bar width + HUEBAR_PADDING, // Right hue bar separation from panel + HUEBAR_SELECTOR_HEIGHT, // Right hue bar selector height + HUEBAR_SELECTOR_OVERFLOW // Right hue bar selector overflow +} GuiColorPickerProperty; + +//---------------------------------------------------------------------------------- +// 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 GuiFade(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 + +// Container/separator controls, useful for controls organization +RAYGUIAPI bool GuiWindowBox(Rectangle bounds, const char *title); // Window Box control, shows a window that can be closed +RAYGUIAPI void GuiGroupBox(Rectangle bounds, const char *text); // Group Box control with text name +RAYGUIAPI void GuiLine(Rectangle bounds, const char *text); // Line separator control, could contain text +RAYGUIAPI void GuiPanel(Rectangle bounds); // Panel control, useful to group controls +RAYGUIAPI Rectangle GuiScrollPanel(Rectangle bounds, Rectangle content, Vector2 *scroll); // Scroll Panel control + +// Basic controls set +RAYGUIAPI void GuiLabel(Rectangle bounds, const char *text); // Label control, shows text +RAYGUIAPI bool GuiButton(Rectangle bounds, const char *text); // Button control, returns true when clicked +RAYGUIAPI bool GuiLabelButton(Rectangle bounds, const char *text); // Label button control, show true when clicked +RAYGUIAPI bool 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 bool 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 bool GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control, returns selected item +RAYGUIAPI bool GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control, returns selected value +RAYGUIAPI bool GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers +RAYGUIAPI bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text +RAYGUIAPI bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control with multiple lines +RAYGUIAPI float GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue); // Slider control, returns selected value +RAYGUIAPI float GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue); // Slider Bar control, returns selected value +RAYGUIAPI float GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue); // Progress Bar control, shows current progress value +RAYGUIAPI void GuiStatusBar(Rectangle bounds, const char *text); // Status Bar control, shows info text +RAYGUIAPI void GuiDummyRec(Rectangle bounds, const char *text); // Dummy control for placeholders +RAYGUIAPI int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue); // Scroll Bar control +RAYGUIAPI Vector2 GuiGrid(Rectangle bounds, float spacing, int subdivs); // Grid control + + +// 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 *focus, int *scrollIndex, int active); // 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); // Text Input Box control, ask for text +RAYGUIAPI Color GuiColorPicker(Rectangle bounds, Color color); // Color Picker control (multiple color controls) +RAYGUIAPI Color GuiColorPanel(Rectangle bounds, Color color); // Color Panel control +RAYGUIAPI float GuiColorBarAlpha(Rectangle bounds, float alpha); // Color Bar Alpha control +RAYGUIAPI float GuiColorBarHue(Rectangle bounds, float value); // Color Bar Hue control + +// 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 + +/* +typedef GuiStyle (unsigned int *) +RAYGUIAPI GuiStyle LoadGuiStyle(const char *fileName); // Load style from file (.rgs) +RAYGUIAPI void UnloadGuiStyle(GuiStyle style); // Unload style +*/ + +RAYGUIAPI const char *GuiIconText(int iconId, const char *text); // Get text with icon id prepended (if supported) + +#if !defined(RAYGUI_NO_RICONS) +// Gui icons functionality +RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); + +RAYGUIAPI unsigned int *GuiGetIcons(void); // Get full icons data pointer +RAYGUIAPI unsigned int *GuiGetIconData(int iconId); // Get icon bit data +RAYGUIAPI void GuiSetIconData(int iconId, unsigned int *data); // Set icon bit data + +RAYGUIAPI void GuiSetIconPixel(int iconId, int x, int y); // Set icon pixel value +RAYGUIAPI void GuiClearIconPixel(int iconId, int x, int y); // Clear icon pixel value +RAYGUIAPI bool GuiCheckIconPixel(int iconId, int x, int y); // Check icon pixel value +#endif + +#if defined(__cplusplus) +} // Prevents name mangling of functions +#endif + +#endif // RAYGUI_H + +/*********************************************************************************** +* +* RAYGUI IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RAYGUI_IMPLEMENTATION) + +#include <stdio.h> // Required for: FILE, fopen(), fclose(), fprintf(), feof(), fscanf(), vsprintf() [GuiLoadStyle(), GuiLoadIcons()] +#include <stdlib.h> // Required for: malloc(), calloc(), free() [GuiLoadStyle(), GuiLoadIcons()] +#include <string.h> // Required for: strlen() [GuiTextBox(), GuiTextBoxMulti(), GuiValueBox()], memset(), memcpy() +#include <stdarg.h> // Required for: va_list, va_start(), vfprintf(), va_end() [TextFormat()] +#include <math.h> // Required for: roundf() [GuiColorPicker()] + +#ifdef __cplusplus + #define RAYGUI_CLITERAL(name) name +#else + #define RAYGUI_CLITERAL(name) (name) +#endif + +#if !defined(RAYGUI_NO_RICONS) + +#if defined(RAYGUI_CUSTOM_RICONS) + +#define RICONS_IMPLEMENTATION +#include "ricons.h" // External icons data provided, it can be generated with rGuiIcons tool + +#else // Embedded raygui icons, no external file provided + +#define RICON_SIZE 16 // Size of icons (squared) +#define RICON_MAX_ICONS 256 // Maximum number of icons +#define RICON_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 RICON_SIZE (by default 16x16 pixels) +#define RICON_DATA_ELEMENTS (RICON_SIZE*RICON_SIZE/32) + +//---------------------------------------------------------------------------------- +// Icons enumeration +//---------------------------------------------------------------------------------- +typedef enum { + RICON_NONE = 0, + RICON_FOLDER_FILE_OPEN = 1, + RICON_FILE_SAVE_CLASSIC = 2, + RICON_FOLDER_OPEN = 3, + RICON_FOLDER_SAVE = 4, + RICON_FILE_OPEN = 5, + RICON_FILE_SAVE = 6, + RICON_FILE_EXPORT = 7, + RICON_FILE_NEW = 8, + RICON_FILE_DELETE = 9, + RICON_FILETYPE_TEXT = 10, + RICON_FILETYPE_AUDIO = 11, + RICON_FILETYPE_IMAGE = 12, + RICON_FILETYPE_PLAY = 13, + RICON_FILETYPE_VIDEO = 14, + RICON_FILETYPE_INFO = 15, + RICON_FILE_COPY = 16, + RICON_FILE_CUT = 17, + RICON_FILE_PASTE = 18, + RICON_CURSOR_HAND = 19, + RICON_CURSOR_POINTER = 20, + RICON_CURSOR_CLASSIC = 21, + RICON_PENCIL = 22, + RICON_PENCIL_BIG = 23, + RICON_BRUSH_CLASSIC = 24, + RICON_BRUSH_PAINTER = 25, + RICON_WATER_DROP = 26, + RICON_COLOR_PICKER = 27, + RICON_RUBBER = 28, + RICON_COLOR_BUCKET = 29, + RICON_TEXT_T = 30, + RICON_TEXT_A = 31, + RICON_SCALE = 32, + RICON_RESIZE = 33, + RICON_FILTER_POINT = 34, + RICON_FILTER_BILINEAR = 35, + RICON_CROP = 36, + RICON_CROP_ALPHA = 37, + RICON_SQUARE_TOGGLE = 38, + RICON_SYMMETRY = 39, + RICON_SYMMETRY_HORIZONTAL = 40, + RICON_SYMMETRY_VERTICAL = 41, + RICON_LENS = 42, + RICON_LENS_BIG = 43, + RICON_EYE_ON = 44, + RICON_EYE_OFF = 45, + RICON_FILTER_TOP = 46, + RICON_FILTER = 47, + RICON_TARGET_POINT = 48, + RICON_TARGET_SMALL = 49, + RICON_TARGET_BIG = 50, + RICON_TARGET_MOVE = 51, + RICON_CURSOR_MOVE = 52, + RICON_CURSOR_SCALE = 53, + RICON_CURSOR_SCALE_RIGHT = 54, + RICON_CURSOR_SCALE_LEFT = 55, + RICON_UNDO = 56, + RICON_REDO = 57, + RICON_REREDO = 58, + RICON_MUTATE = 59, + RICON_ROTATE = 60, + RICON_REPEAT = 61, + RICON_SHUFFLE = 62, + RICON_EMPTYBOX = 63, + RICON_TARGET = 64, + RICON_TARGET_SMALL_FILL = 65, + RICON_TARGET_BIG_FILL = 66, + RICON_TARGET_MOVE_FILL = 67, + RICON_CURSOR_MOVE_FILL = 68, + RICON_CURSOR_SCALE_FILL = 69, + RICON_CURSOR_SCALE_RIGHT_FILL = 70, + RICON_CURSOR_SCALE_LEFT_FILL = 71, + RICON_UNDO_FILL = 72, + RICON_REDO_FILL = 73, + RICON_REREDO_FILL = 74, + RICON_MUTATE_FILL = 75, + RICON_ROTATE_FILL = 76, + RICON_REPEAT_FILL = 77, + RICON_SHUFFLE_FILL = 78, + RICON_EMPTYBOX_SMALL = 79, + RICON_BOX = 80, + RICON_BOX_TOP = 81, + RICON_BOX_TOP_RIGHT = 82, + RICON_BOX_RIGHT = 83, + RICON_BOX_BOTTOM_RIGHT = 84, + RICON_BOX_BOTTOM = 85, + RICON_BOX_BOTTOM_LEFT = 86, + RICON_BOX_LEFT = 87, + RICON_BOX_TOP_LEFT = 88, + RICON_BOX_CENTER = 89, + RICON_BOX_CIRCLE_MASK = 90, + RICON_POT = 91, + RICON_ALPHA_MULTIPLY = 92, + RICON_ALPHA_CLEAR = 93, + RICON_DITHERING = 94, + RICON_MIPMAPS = 95, + RICON_BOX_GRID = 96, + RICON_GRID = 97, + RICON_BOX_CORNERS_SMALL = 98, + RICON_BOX_CORNERS_BIG = 99, + RICON_FOUR_BOXES = 100, + RICON_GRID_FILL = 101, + RICON_BOX_MULTISIZE = 102, + RICON_ZOOM_SMALL = 103, + RICON_ZOOM_MEDIUM = 104, + RICON_ZOOM_BIG = 105, + RICON_ZOOM_ALL = 106, + RICON_ZOOM_CENTER = 107, + RICON_BOX_DOTS_SMALL = 108, + RICON_BOX_DOTS_BIG = 109, + RICON_BOX_CONCENTRIC = 110, + RICON_BOX_GRID_BIG = 111, + RICON_OK_TICK = 112, + RICON_CROSS = 113, + RICON_ARROW_LEFT = 114, + RICON_ARROW_RIGHT = 115, + RICON_ARROW_DOWN = 116, + RICON_ARROW_UP = 117, + RICON_ARROW_LEFT_FILL = 118, + RICON_ARROW_RIGHT_FILL = 119, + RICON_ARROW_DOWN_FILL = 120, + RICON_ARROW_UP_FILL = 121, + RICON_AUDIO = 122, + RICON_FX = 123, + RICON_WAVE = 124, + RICON_WAVE_SINUS = 125, + RICON_WAVE_SQUARE = 126, + RICON_WAVE_TRIANGULAR = 127, + RICON_CROSS_SMALL = 128, + RICON_PLAYER_PREVIOUS = 129, + RICON_PLAYER_PLAY_BACK = 130, + RICON_PLAYER_PLAY = 131, + RICON_PLAYER_PAUSE = 132, + RICON_PLAYER_STOP = 133, + RICON_PLAYER_NEXT = 134, + RICON_PLAYER_RECORD = 135, + RICON_MAGNET = 136, + RICON_LOCK_CLOSE = 137, + RICON_LOCK_OPEN = 138, + RICON_CLOCK = 139, + RICON_TOOLS = 140, + RICON_GEAR = 141, + RICON_GEAR_BIG = 142, + RICON_BIN = 143, + RICON_HAND_POINTER = 144, + RICON_LASER = 145, + RICON_COIN = 146, + RICON_EXPLOSION = 147, + RICON_1UP = 148, + RICON_PLAYER = 149, + RICON_PLAYER_JUMP = 150, + RICON_KEY = 151, + RICON_DEMON = 152, + RICON_TEXT_POPUP = 153, + RICON_GEAR_EX = 154, + RICON_CRACK = 155, + RICON_CRACK_POINTS = 156, + RICON_STAR = 157, + RICON_DOOR = 158, + RICON_EXIT = 159, + RICON_MODE_2D = 160, + RICON_MODE_3D = 161, + RICON_CUBE = 162, + RICON_CUBE_FACE_TOP = 163, + RICON_CUBE_FACE_LEFT = 164, + RICON_CUBE_FACE_FRONT = 165, + RICON_CUBE_FACE_BOTTOM = 166, + RICON_CUBE_FACE_RIGHT = 167, + RICON_CUBE_FACE_BACK = 168, + RICON_CAMERA = 169, + RICON_SPECIAL = 170, + RICON_LINK_NET = 171, + RICON_LINK_BOXES = 172, + RICON_LINK_MULTI = 173, + RICON_LINK = 174, + RICON_LINK_BROKE = 175, + RICON_TEXT_NOTES = 176, + RICON_NOTEBOOK = 177, + RICON_SUITCASE = 178, + RICON_SUITCASE_ZIP = 179, + RICON_MAILBOX = 180, + RICON_MONITOR = 181, + RICON_PRINTER = 182, + RICON_PHOTO_CAMERA = 183, + RICON_PHOTO_CAMERA_FLASH = 184, + RICON_HOUSE = 185, + RICON_HEART = 186, + RICON_CORNER = 187, + RICON_VERTICAL_BARS = 188, + RICON_VERTICAL_BARS_FILL = 189, + RICON_LIFE_BARS = 190, + RICON_INFO = 191, + RICON_CROSSLINE = 192, + RICON_HELP = 193, + RICON_FILETYPE_ALPHA = 194, + RICON_FILETYPE_HOME = 195, + RICON_LAYERS_VISIBLE = 196, + RICON_LAYERS = 197, + RICON_WINDOW = 198, + RICON_HIDPI = 199, + RICON_200 = 200, + RICON_201 = 201, + RICON_202 = 202, + RICON_203 = 203, + RICON_204 = 204, + RICON_205 = 205, + RICON_206 = 206, + RICON_207 = 207, + RICON_208 = 208, + RICON_209 = 209, + RICON_210 = 210, + RICON_211 = 211, + RICON_212 = 212, + RICON_213 = 213, + RICON_214 = 214, + RICON_215 = 215, + RICON_216 = 216, + RICON_217 = 217, + RICON_218 = 218, + RICON_219 = 219, + RICON_220 = 220, + RICON_221 = 221, + RICON_222 = 222, + RICON_223 = 223, + RICON_224 = 224, + RICON_225 = 225, + RICON_226 = 226, + RICON_227 = 227, + RICON_228 = 228, + RICON_229 = 229, + RICON_230 = 230, + RICON_231 = 231, + RICON_232 = 232, + RICON_233 = 233, + RICON_234 = 234, + RICON_235 = 235, + RICON_236 = 236, + RICON_237 = 237, + RICON_238 = 238, + RICON_239 = 239, + RICON_240 = 240, + RICON_241 = 241, + RICON_242 = 242, + RICON_243 = 243, + RICON_244 = 244, + RICON_245 = 245, + RICON_246 = 246, + RICON_247 = 247, + RICON_248 = 248, + RICON_249 = 249, + RICON_250 = 250, + RICON_251 = 251, + RICON_252 = 252, + RICON_253 = 253, + RICON_254 = 254, + RICON_255 = 255, +} guiIconName; + +//---------------------------------------------------------------------------------- +// 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 new icon set could be loaded over this array using GuiLoadIcons(), +// but loaded icons set must be same RICON_SIZE and no more than RICON_MAX_ICONS +// +// guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB +//---------------------------------------------------------------------------------- +static unsigned int guiIcons[RICON_MAX_ICONS*RICON_DATA_ELEMENTS] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_NONE + 0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // RICON_FOLDER_FILE_OPEN + 0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // RICON_FILE_SAVE_CLASSIC + 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // RICON_FOLDER_OPEN + 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // RICON_FOLDER_SAVE + 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // RICON_FILE_OPEN + 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // RICON_FILE_SAVE + 0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // RICON_FILE_EXPORT + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // RICON_FILE_NEW + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // RICON_FILE_DELETE + 0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // RICON_FILETYPE_TEXT + 0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // RICON_FILETYPE_AUDIO + 0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // RICON_FILETYPE_IMAGE + 0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // RICON_FILETYPE_PLAY + 0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // RICON_FILETYPE_VIDEO + 0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // RICON_FILETYPE_INFO + 0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // RICON_FILE_COPY + 0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // RICON_FILE_CUT + 0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // RICON_FILE_PASTE + 0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_CURSOR_HAND + 0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // RICON_CURSOR_POINTER + 0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // RICON_CURSOR_CLASSIC + 0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // RICON_PENCIL + 0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // RICON_PENCIL_BIG + 0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // RICON_BRUSH_CLASSIC + 0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // RICON_BRUSH_PAINTER + 0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // RICON_WATER_DROP + 0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // RICON_COLOR_PICKER + 0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // RICON_RUBBER + 0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // RICON_COLOR_BUCKET + 0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // RICON_TEXT_T + 0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // RICON_TEXT_A + 0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // RICON_SCALE + 0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // RICON_RESIZE + 0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // RICON_FILTER_POINT + 0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // RICON_FILTER_BILINEAR + 0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // RICON_CROP + 0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // RICON_CROP_ALPHA + 0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // RICON_SQUARE_TOGGLE + 0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // RICON_SIMMETRY + 0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // RICON_SIMMETRY_HORIZONTAL + 0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // RICON_SIMMETRY_VERTICAL + 0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // RICON_LENS + 0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // RICON_LENS_BIG + 0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // RICON_EYE_ON + 0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // RICON_EYE_OFF + 0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // RICON_FILTER_TOP + 0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // RICON_FILTER + 0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // RICON_TARGET_POINT + 0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // RICON_TARGET_SMALL + 0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // RICON_TARGET_BIG + 0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // RICON_TARGET_MOVE + 0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // RICON_CURSOR_MOVE + 0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // RICON_CURSOR_SCALE + 0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // RICON_CURSOR_SCALE_RIGHT + 0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // RICON_CURSOR_SCALE_LEFT + 0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // RICON_UNDO + 0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // RICON_REDO + 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // RICON_REREDO + 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // RICON_MUTATE + 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // RICON_ROTATE + 0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // RICON_REPEAT + 0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // RICON_SHUFFLE + 0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // RICON_EMPTYBOX + 0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // RICON_TARGET + 0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // RICON_TARGET_SMALL_FILL + 0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // RICON_TARGET_BIG_FILL + 0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // RICON_TARGET_MOVE_FILL + 0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // RICON_CURSOR_MOVE_FILL + 0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // RICON_CURSOR_SCALE_FILL + 0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // RICON_CURSOR_SCALE_RIGHT + 0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // RICON_CURSOR_SCALE_LEFT + 0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // RICON_UNDO_FILL + 0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // RICON_REDO_FILL + 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // RICON_REREDO_FILL + 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // RICON_MUTATE_FILL + 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // RICON_ROTATE_FILL + 0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // RICON_REPEAT_FILL + 0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // RICON_SHUFFLE_FILL + 0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // RICON_EMPTYBOX_SMALL + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX + 0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX_TOP + 0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX_TOP_RIGHT + 0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX_RIGHT + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // RICON_BOX_BOTTOM_RIGHT + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // RICON_BOX_BOTTOM + 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // RICON_BOX_BOTTOM_LEFT + 0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX_LEFT + 0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX_TOP_LEFT + 0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // RICON_BOX_CIRCLE_MASK + 0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // RICON_BOX_CENTER + 0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // RICON_POT + 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // RICON_ALPHA_MULTIPLY + 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // RICON_ALPHA_CLEAR + 0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // RICON_DITHERING + 0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // RICON_MIPMAPS + 0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // RICON_BOX_GRID + 0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // RICON_GRID + 0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // RICON_BOX_CORNERS_SMALL + 0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // RICON_BOX_CORNERS_BIG + 0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // RICON_FOUR_BOXES + 0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // RICON_GRID_FILL + 0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // RICON_BOX_MULTISIZE + 0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // RICON_ZOOM_SMALL + 0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // RICON_ZOOM_MEDIUM + 0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // RICON_ZOOM_BIG + 0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // RICON_ZOOM_ALL + 0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // RICON_ZOOM_CENTER + 0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // RICON_BOX_DOTS_SMALL + 0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // RICON_BOX_DOTS_BIG + 0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // RICON_BOX_CONCENTRIC + 0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // RICON_BOX_GRID_BIG + 0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // RICON_OK_TICK + 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // RICON_CROSS + 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // RICON_ARROW_LEFT + 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // RICON_ARROW_RIGHT + 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // RICON_ARROW_DOWN + 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // RICON_ARROW_UP + 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // RICON_ARROW_LEFT_FILL + 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // RICON_ARROW_RIGHT_FILL + 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // RICON_ARROW_DOWN_FILL + 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // RICON_ARROW_UP_FILL + 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // RICON_AUDIO + 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // RICON_FX + 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // RICON_WAVE + 0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // RICON_WAVE_SINUS + 0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // RICON_WAVE_SQUARE + 0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // RICON_WAVE_TRIANGULAR + 0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // RICON_CROSS_SMALL + 0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // RICON_PLAYER_PREVIOUS + 0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // RICON_PLAYER_PLAY_BACK + 0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // RICON_PLAYER_PLAY + 0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // RICON_PLAYER_PAUSE + 0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // RICON_PLAYER_STOP + 0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // RICON_PLAYER_NEXT + 0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // RICON_PLAYER_RECORD + 0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // RICON_MAGNET + 0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // RICON_LOCK_CLOSE + 0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // RICON_LOCK_OPEN + 0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // RICON_CLOCK + 0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // RICON_TOOLS + 0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // RICON_GEAR + 0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // RICON_GEAR_BIG + 0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // RICON_BIN + 0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // RICON_HAND_POINTER + 0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // RICON_LASER + 0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // RICON_COIN + 0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // RICON_EXPLOSION + 0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // RICON_1UP + 0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // RICON_PLAYER + 0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // RICON_PLAYER_JUMP + 0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // RICON_KEY + 0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // RICON_DEMON + 0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // RICON_TEXT_POPUP + 0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // RICON_GEAR_EX + 0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // RICON_CRACK + 0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // RICON_CRACK_POINTS + 0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // RICON_STAR + 0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // RICON_DOOR + 0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // RICON_EXIT + 0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // RICON_MODE_2D + 0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // RICON_MODE_3D + 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // RICON_CUBE + 0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // RICON_CUBE_FACE_TOP + 0x7fe00000, 0x50386030, 0x47fe483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // RICON_CUBE_FACE_LEFT + 0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // RICON_CUBE_FACE_FRONT + 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3ff27fe2, 0x0ffe1ffa, 0x000007fe, // RICON_CUBE_FACE_BOTTOM + 0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // RICON_CUBE_FACE_RIGHT + 0x7fe00000, 0x7fe87ff0, 0x7ffe7fe4, 0x7fe27fe2, 0x7fe27fe2, 0x24127fe2, 0x0c06140a, 0x000007fe, // RICON_CUBE_FACE_BACK + 0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // RICON_CAMERA + 0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // RICON_SPECIAL + 0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // RICON_LINK_NET + 0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // RICON_LINK_BOXES + 0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // RICON_LINK_MULTI + 0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // RICON_LINK + 0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // RICON_LINK_BROKE + 0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // RICON_TEXT_NOTES + 0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // RICON_NOTEBOOK + 0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // RICON_SUITCASE + 0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // RICON_SUITCASE_ZIP + 0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // RICON_MAILBOX + 0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // RICON_MONITOR + 0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // RICON_PRINTER + 0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // RICON_PHOTO_CAMERA + 0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // RICON_PHOTO_CAMERA_FLASH + 0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // RICON_HOUSE + 0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // RICON_HEART + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // RICON_CORNER + 0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // RICON_VERTICAL_BARS + 0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // RICON_VERTICAL_BARS_FILL + 0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // RICON_LIFE_BARS + 0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // RICON_INFO + 0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // RICON_CROSSLINE + 0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // RICON_HELP + 0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // RICON_FILETYPE_ALPHA + 0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // RICON_FILETYPE_HOME + 0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // RICON_LAYERS_VISIBLE + 0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // RICON_LAYERS + 0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // RICON_WINDOW + 0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // RICON_HIDPI + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_200 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_201 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_202 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_203 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_204 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_205 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_206 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_207 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_208 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_209 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_210 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_211 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_212 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_213 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_214 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_215 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_216 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_217 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_218 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_219 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_220 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_221 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_222 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_223 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_224 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_225 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_226 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_227 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_228 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_229 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_230 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_231 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_232 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_233 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_234 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_235 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_236 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_237 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_238 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_239 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_240 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_241 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_242 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_243 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_244 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_245 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_246 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_247 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_248 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_249 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_250 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_251 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_252 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_253 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_254 + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_255 +}; + +#endif // RAYGUI_CUSTOM_RICONS + +#endif // !RAYGUI_NO_RICONS + +#ifndef RICON_SIZE + #define RICON_SIZE 0 +#endif + +#define RAYGUI_MAX_CONTROLS 16 // Maximum number of standard controls +#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of standard 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 GuiControlState guiState = GUI_STATE_NORMAL; + +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 element transpacency on drawing + +//---------------------------------------------------------------------------------- +// 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(), GuiTextBoxMulti(), GuiValueBox() +//------------------------------------------------------------------------------- + +// Drawing required functions +//------------------------------------------------------------------------------- +static void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle(), GuiDrawIcon() + +static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() +//------------------------------------------------------------------------------- + +// Text required functions +//------------------------------------------------------------------------------- +static Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount); // -- GuiLoadStyle() +static Font GetFontDefault(void); // -- GuiLoadStyleDefault() +static Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle() +static void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle() +static char *LoadFileText(const char *fileName); // -- GuiLoadStyle() +static const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle() + +static Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // -- GetTextWidth(), GuiTextBoxMulti() +static void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // -- GuiDrawText() +//------------------------------------------------------------------------------- + +// 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 Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f +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 GetCodepoint(const char *text, int *bytesProcessed); // 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 int GetTextWidth(const char *text); // Gui get text width using default font +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 bounds, 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, 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 + +//---------------------------------------------------------------------------------- +// Gui Setup Functions Definition +//---------------------------------------------------------------------------------- +// Enable gui global state +void GuiEnable(void) { guiState = GUI_STATE_NORMAL; } + +// Disable gui global state +void GuiDisable(void) { guiState = GUI_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 GuiFade(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 = (GuiControlState)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; + GuiSetStyle(DEFAULT, TEXT_SIZE, font.baseSize); + } +} + +// 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 +bool GuiWindowBox(Rectangle bounds, const char *title) +{ + // NOTE: This define is also used by GuiMessageBox() and GuiTextInputBox() + #define WINDOW_STATUSBAR_HEIGHT 22 + + //GuiControlState state = guiState; + bool clicked = false; + + int statusBarHeight = WINDOW_STATUSBAR_HEIGHT + 2*GuiGetStyle(STATUSBAR, BORDER_WIDTH); + statusBarHeight += (statusBarHeight%2); + + 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 }; + 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); // 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, GUI_TEXT_ALIGN_CENTER); +#if defined(RAYGUI_NO_RICONS) + clicked = GuiButton(closeButtonRec, "x"); +#else + clicked = GuiButton(closeButtonRec, GuiIconText(RICON_CROSS_SMALL, NULL)); +#endif + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); + //-------------------------------------------------------------------- + + return clicked; +} + +// Group Box control with text name +void GuiGroupBox(Rectangle bounds, const char *text) +{ + #define GROUPBOX_LINE_THICK 1 + #define GROUPBOX_TEXT_PADDING 10 + + GuiControlState state = guiState; + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, Fade(GetColor(GuiGetStyle(DEFAULT, (state == GUI_STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)), guiAlpha)); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, GROUPBOX_LINE_THICK }, 0, BLANK, Fade(GetColor(GuiGetStyle(DEFAULT, (state == GUI_STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)), guiAlpha)); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y, GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, Fade(GetColor(GuiGetStyle(DEFAULT, (state == GUI_STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)), guiAlpha)); + + GuiLine(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, bounds.width, 1 }, text); + //-------------------------------------------------------------------- +} + +// Line control +void GuiLine(Rectangle bounds, const char *text) +{ + #define LINE_TEXT_PADDING 10 + + GuiControlState state = guiState; + + Color color = Fade(GetColor(GuiGetStyle(DEFAULT, (state == GUI_STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)), guiAlpha); + + // 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); + textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); + textBounds.x = bounds.x + LINE_TEXT_PADDING; + textBounds.y = bounds.y - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + // Draw line with embedded text label: "--- text --------------" + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, LINE_TEXT_PADDING - 2, 1 }, 0, BLANK, color); + GuiLabel(textBounds, text); + GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + LINE_TEXT_PADDING + textBounds.width + 4, bounds.y, bounds.width - textBounds.width - LINE_TEXT_PADDING - 4, 1 }, 0, BLANK, color); + } + //-------------------------------------------------------------------- +} + +// Panel control +void GuiPanel(Rectangle bounds) +{ + #define PANEL_BORDER_WIDTH 1 + + GuiControlState state = guiState; + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, PANEL_BORDER_WIDTH, Fade(GetColor(GuiGetStyle(DEFAULT, (state == GUI_STATE_DISABLED)? BORDER_COLOR_DISABLED: LINE_COLOR)), guiAlpha), + Fade(GetColor(GuiGetStyle(DEFAULT, (state == GUI_STATE_DISABLED)? BASE_COLOR_DISABLED : BACKGROUND_COLOR)), guiAlpha)); + //-------------------------------------------------------------------- +} + +// Scroll Panel control +Rectangle GuiScrollPanel(Rectangle bounds, Rectangle content, Vector2 *scroll) +{ + GuiControlState state = guiState; + + Vector2 scrollPos = { 0.0f, 0.0f }; + if (scroll != NULL) scrollPos = *scroll; + + 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; + + const int horizontalScrollBarWidth = hasHorizontalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; + const int verticalScrollBarWidth = hasVerticalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; + const 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 }; + const 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) }; + + // Calculate view area (area without the scrollbars) + Rectangle 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; + + const 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); + const 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); + const float verticalMin = hasVerticalScrollBar? (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); + const float verticalMax = hasVerticalScrollBar? content.height - bounds.height + (float)horizontalScrollBarWidth + (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + + 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); + } + + float wheelMove = GetMouseWheelMove(); + + // Horizontal scroll (Shift + Mouse wheel) + if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT))) scrollPos.x += wheelMove*20; + else scrollPos.y += wheelMove*20; // 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 + //-------------------------------------------------------------------- + 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); + } + + // 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); + } + + // 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, Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT + (state*3))), guiAlpha)); + } + + // Draw scrollbar lines depending on current state + GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), guiAlpha), BLANK); + + // Set scrollbar slider size back to the way it was before + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider); + //-------------------------------------------------------------------- + + if (scroll != NULL) *scroll = scrollPos; + + return view; +} + +// Label control +void GuiLabel(Rectangle bounds, const char *text) +{ + GuiControlState state = guiState; + + // Update control + //-------------------------------------------------------------------- + // ... + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LABEL, (state == GUI_STATE_DISABLED)? TEXT_COLOR_DISABLED : TEXT_COLOR_NORMAL)), guiAlpha)); + //-------------------------------------------------------------------- +} + +// Button control, returns true when clicked +bool GuiButton(Rectangle bounds, const char *text) +{ + GuiControlState state = guiState; + bool pressed = false; + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(BUTTON, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(BUTTON, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(BUTTON, BASE + (state*3))), guiAlpha)); + GuiDrawText(text, GetTextBounds(BUTTON, bounds), GuiGetStyle(BUTTON, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(BUTTON, TEXT + (state*3))), guiAlpha)); + //------------------------------------------------------------------ + + return pressed; +} + +// Label button control +bool GuiLabelButton(Rectangle bounds, const char *text) +{ + GuiControlState state = guiState; + bool pressed = false; + + // NOTE: We force bounds.width to be all text + float textWidth = MeasureTextEx(guiFont, text, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)).x; + if (bounds.width < textWidth) bounds.width = textWidth; + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check checkbox state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LABEL, TEXT + (state*3))), guiAlpha)); + //-------------------------------------------------------------------- + + return pressed; +} + +// Toggle Button control, returns true when active +bool GuiToggle(Rectangle bounds, const char *text, bool active) +{ + GuiControlState state = guiState; + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check toggle button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + state = GUI_STATE_NORMAL; + active = !active; + } + else state = GUI_STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == GUI_STATE_NORMAL) + { + GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TOGGLE, (active? BORDER_COLOR_PRESSED : (BORDER + state*3)))), guiAlpha), Fade(GetColor(GuiGetStyle(TOGGLE, (active? BASE_COLOR_PRESSED : (BASE + state*3)))), guiAlpha)); + GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TOGGLE, (active? TEXT_COLOR_PRESSED : (TEXT + state*3)))), guiAlpha)); + } + else + { + GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TOGGLE, BORDER + state*3)), guiAlpha), Fade(GetColor(GuiGetStyle(TOGGLE, BASE + state*3)), guiAlpha)); + GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TOGGLE, TEXT + state*3)), guiAlpha)); + } + //-------------------------------------------------------------------- + + return active; +} + +// Toggle Group control, returns toggled button index +int GuiToggleGroup(Rectangle bounds, const char *text, int active) +{ + #if !defined(TOGGLEGROUP_MAX_ELEMENTS) + #define TOGGLEGROUP_MAX_ELEMENTS 32 + #endif + + float initBoundsX = bounds.x; + + // Get substrings items from text (items pointers) + int rows[TOGGLEGROUP_MAX_ELEMENTS] = { 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) GuiToggle(bounds, items[i], true); + else if (GuiToggle(bounds, items[i], false) == true) active = i; + + bounds.x += (bounds.width + GuiGetStyle(TOGGLE, GROUP_PADDING)); + } + + return active; +} + +// Check Box control, returns true when active +bool GuiCheckBox(Rectangle bounds, const char *text, bool checked) +{ + GuiControlState state = guiState; + + Rectangle textBounds = { 0 }; + + if (text != NULL) + { + textBounds.width = (float)GetTextWidth(text); + 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) == GUI_TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(CHECKBOX, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + Rectangle totalBounds = { + (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == GUI_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 = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) checked = !checked; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(CHECKBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(CHECKBOX, BORDER + (state*3))), guiAlpha), 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, Fade(GetColor(GuiGetStyle(CHECKBOX, TEXT + state*3)), guiAlpha)); + } + + GuiDrawText(text, textBounds, (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT)? GUI_TEXT_ALIGN_LEFT : GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(LABEL, TEXT + (state*3))), guiAlpha)); + //-------------------------------------------------------------------- + + return checked; +} + +// Combo Box control, returns selected item index +int GuiComboBox(Rectangle bounds, const char *text, int active) +{ + GuiControlState state = guiState; + + bounds.width -= (GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH) + GuiGetStyle(COMBOBOX, COMBO_BUTTON_PADDING)); + + Rectangle selector = { (float)bounds.x + bounds.width + GuiGetStyle(COMBOBOX, COMBO_BUTTON_PADDING), + (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 != GUI_STATE_DISABLED) && !guiLocked && (itemCount > 1)) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds) || + CheckCollisionPointRec(mousePoint, selector)) + { + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + active += 1; + if (active >= itemCount) active = 0; + } + + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + // Draw combo box main + GuiDrawRectangle(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE + (state*3))), guiAlpha)); + GuiDrawText(items[active], GetTextBounds(COMBOBOX, bounds), GuiGetStyle(COMBOBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT + (state*3))), guiAlpha)); + + // 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, GUI_TEXT_ALIGN_CENTER); + + GuiButton(selector, TextFormat("%i/%i", active + 1, itemCount)); + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + //-------------------------------------------------------------------- + + return active; +} + +// Dropdown Box control +// NOTE: Returns mouse click +bool GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode) +{ + GuiControlState 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_PADDING)); + + Rectangle itemBounds = bounds; + + bool pressed = false; // Check mouse button pressed + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1)) + { + Vector2 mousePoint = GetMousePosition(); + + if (editMode) + { + state = GUI_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)) pressed = true; + } + + // Check if already selected item has been pressed again + if (CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) pressed = true; + + // 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_PADDING)); + + if (CheckCollisionPointRec(mousePoint, itemBounds)) + { + itemFocused = i; + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + itemSelected = i; + pressed = true; // Item selected, change to editMode = false + } + break; + } + } + + itemBounds = bounds; + } + else + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + pressed = true; + state = GUI_STATE_PRESSED; + } + else state = GUI_STATE_FOCUSED; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (editMode) GuiPanel(boundsOpen); + + GuiDrawRectangle(bounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, BORDER + state*3)), guiAlpha), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, BASE + state*3)), guiAlpha)); + GuiDrawText(items[itemSelected], GetTextBounds(DEFAULT, bounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + state*3)), guiAlpha)); + + 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_PADDING)); + + if (i == itemSelected) + { + GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_PRESSED)), guiAlpha), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_PRESSED)), guiAlpha)); + GuiDrawText(items[i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_PRESSED)), guiAlpha)); + } + else if (i == itemFocused) + { + GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_FOCUSED)), guiAlpha), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_FOCUSED)), guiAlpha)); + GuiDrawText(items[i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_FOCUSED)), guiAlpha)); + } + else GuiDrawText(items[i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL)), guiAlpha)); + } + } + + // Draw arrows (using icon if available) +#if defined(RAYGUI_NO_RICONS) + GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); +#else + GuiDrawText("#120#", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 6, 10, 10 }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); // RICON_ARROW_DOWN_FILL +#endif + //-------------------------------------------------------------------- + + *active = itemSelected; + return pressed; +} + +// Text Box control, updates input text +// NOTE 2: Returns if KEY_ENTER pressed (useful for data validation) +bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode) +{ + GuiControlState state = guiState; + bool pressed = false; + + Rectangle cursor = { + bounds.x + GuiGetStyle(TEXTBOX, TEXT_PADDING) + GetTextWidth(text) + 2, + bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE), + 4, + (float)GuiGetStyle(DEFAULT, TEXT_SIZE)*2 + }; + + if (cursor.height > bounds.height) cursor.height = bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2; + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (editMode) + { + state = GUI_STATE_PRESSED; + + int key = GetCharPressed(); // Returns codepoint as Unicode + int keyCount = (int)strlen(text); + + // Only allow keys in range [32..125] + if (keyCount < (textSize - 1)) + { + float maxWidth = (bounds.width - (GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING)*2)); + + if ((GetTextWidth(text) < (maxWidth - GuiGetStyle(DEFAULT, TEXT_SIZE))) && (key >= 32)) + { + int byteSize = 0; + const char *textUTF8 = CodepointToUTF8(key, &byteSize); + + for (int i = 0; i < byteSize; i++) + { + text[keyCount] = textUTF8[i]; + keyCount++; + } + + text[keyCount] = '\0'; + } + } + + // Delete text + if (keyCount > 0) + { + if (IsKeyPressed(KEY_BACKSPACE)) + { + keyCount--; + text[keyCount] = '\0'; + if (keyCount < 0) keyCount = 0; + } + } + + if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) pressed = true; + + // Check text alignment to position cursor properly + int textAlignment = GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT); + if (textAlignment == GUI_TEXT_ALIGN_CENTER) cursor.x = bounds.x + GetTextWidth(text)/2 + bounds.width/2 + 1; + else if (textAlignment == GUI_TEXT_ALIGN_RIGHT) cursor.x = bounds.x + bounds.width - GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING); + } + else + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = GUI_STATE_FOCUSED; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) pressed = true; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == GUI_STATE_PRESSED) + { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED)), guiAlpha)); + } + else if (state == GUI_STATE_DISABLED) + { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED)), guiAlpha)); + } + else GuiDrawRectangle(bounds, 1, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), BLANK); + + GuiDrawText(text, GetTextBounds(TEXTBOX, bounds), GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))), guiAlpha)); + + // Draw cursor + if (editMode) GuiDrawRectangle(cursor, 0, BLANK, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha)); + //-------------------------------------------------------------------- + + return pressed; +} + +// Spinner control, returns selected value +bool GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) +{ + GuiControlState state = guiState; + + bool pressed = false; + int tempValue = *value; + + Rectangle spinner = { bounds.x + GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_PADDING), bounds.y, + bounds.width - 2*(GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_PADDING)), 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); + 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) == GUI_TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SPINNER, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check spinner state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + } + } + + if (!editMode) + { + if (tempValue < minValue) tempValue = minValue; + if (tempValue > maxValue) tempValue = maxValue; + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + // TODO: Set Spinner properties for ValueBox + pressed = 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, GUI_TEXT_ALIGN_CENTER); + +#if defined(RAYGUI_NO_RICONS) + if (GuiButton(leftButtonBound, "<")) tempValue--; + if (GuiButton(rightButtonBound, ">")) tempValue++; +#else + if (GuiButton(leftButtonBound, GuiIconText(RICON_ARROW_LEFT_FILL, NULL))) tempValue--; + if (GuiButton(rightButtonBound, GuiIconText(RICON_ARROW_RIGHT_FILL, NULL))) tempValue++; +#endif + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + + // Draw text label if provided + GuiDrawText(text, textBounds, (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT)? GUI_TEXT_ALIGN_LEFT : GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(LABEL, TEXT + (state*3))), guiAlpha)); + //-------------------------------------------------------------------- + + *value = tempValue; + return pressed; +} + +// Value Box control, updates input text with numbers +// NOTE: Requires static variables: frameCounter +bool GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) +{ + #if !defined(VALUEBOX_MAX_CHARS) + #define VALUEBOX_MAX_CHARS 32 + #endif + + GuiControlState state = guiState; + bool pressed = false; + + char textValue[VALUEBOX_MAX_CHARS + 1] = "\0"; + sprintf(textValue, "%i", *value); + + Rectangle textBounds = { 0 }; + if (text != NULL) + { + textBounds.width = (float)GetTextWidth(text); + 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) == GUI_TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING); + } + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + bool valueHasChanged = false; + + if (editMode) + { + state = GUI_STATE_PRESSED; + + int keyCount = (int)strlen(textValue); + + // Only allow keys in range [48..57] + if (keyCount < 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'; + if (keyCount < 0) keyCount = 0; + valueHasChanged = true; + } + } + + if (valueHasChanged) *value = TextToInteger(textValue); + + if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) pressed = true; + } + else + { + if (*value > maxValue) *value = maxValue; + else if (*value < minValue) *value = minValue; + + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = GUI_STATE_FOCUSED; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) pressed = true; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + Color baseColor = BLANK; + if (state == GUI_STATE_PRESSED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED)); + else if (state == GUI_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), GUI_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 + 2, 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) == GUI_TEXT_ALIGN_RIGHT)? GUI_TEXT_ALIGN_LEFT : GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(LABEL, TEXT + (state*3))), guiAlpha)); + //-------------------------------------------------------------------- + + return pressed; +} + +// Text Box control with multiple lines +bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode) +{ + GuiControlState state = guiState; + bool pressed = false; + + Rectangle textAreaBounds = { + bounds.x + GuiGetStyle(TEXTBOX, BORDER_WIDTH) + GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING), + bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH) + GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING), + bounds.width - 2*(GuiGetStyle(TEXTBOX, BORDER_WIDTH) + GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING)), + bounds.height - 2*(GuiGetStyle(TEXTBOX, BORDER_WIDTH) + GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING)) + }; + + // Cursor position, [x, y] values should be updated + Rectangle cursor = { 0, -1, 4, (float)GuiGetStyle(DEFAULT, TEXT_SIZE) + 2 }; + + float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize; // Character rectangle scaling factor + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (editMode) + { + state = GUI_STATE_PRESSED; + + // We get an Unicode codepoint + int codepoint = GetCharPressed(); + int textLength = (int)strlen(text); // Length in bytes (UTF-8 string) + + // Introduce characters + if (textLength < (textSize - 1)) + { + if (IsKeyPressed(KEY_ENTER)) + { + text[textLength] = '\n'; + textLength++; + } + else if (codepoint >= 32) + { + // Supports Unicode inputs -> Encoded to UTF-8 + int charUTF8Length = 0; + const char *charEncoded = CodepointToUTF8(codepoint, &charUTF8Length); + memcpy(text + textLength, charEncoded, charUTF8Length); + textLength += charUTF8Length; + } + } + + // Delete characters + if (textLength > 0) + { + if (IsKeyPressed(KEY_BACKSPACE)) + { + if ((unsigned char)text[textLength - 1] < 127) + { + // Remove ASCII equivalent character (1 byte) + textLength--; + text[textLength] = '\0'; + } + else + { + // Remove latest UTF-8 unicode character introduced (n bytes) + int charUTF8Length = 0; + while (((unsigned char)text[textLength - 1 - charUTF8Length] & 0b01000000) == 0) charUTF8Length++; + + textLength -= (charUTF8Length + 1); + text[textLength] = '\0'; + } + } + } + + // Exit edit mode + if (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) pressed = true; + } + else + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = GUI_STATE_FOCUSED; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) pressed = true; + } + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state == GUI_STATE_PRESSED) + { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED)), guiAlpha)); + } + else if (state == GUI_STATE_DISABLED) + { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED)), guiAlpha)); + } + else GuiDrawRectangle(bounds, 1, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), BLANK); + + int wrapMode = 1; // 0-No wrap, 1-Char wrap, 2-Word wrap + Vector2 cursorPos = { textAreaBounds.x, textAreaBounds.y }; + + //int lastSpacePos = 0; + //int lastSpaceWidth = 0; + //int lastSpaceCursorPos = 0; + + for (int i = 0, codepointLength = 0; text[i] != '\0'; i += codepointLength) + { + int codepoint = GetCodepoint(text + i, &codepointLength); + int index = GetGlyphIndex(guiFont, codepoint); // If requested codepoint is not found, we get '?' (0x3f) + Rectangle atlasRec = guiFont.recs[index]; + GlyphInfo glyphInfo = guiFont.glyphs[index]; // Glyph measures + + if ((codepointLength == 1) && (codepoint == '\n')) + { + cursorPos.y += (guiFont.baseSize*scaleFactor + GuiGetStyle(TEXTBOX, TEXT_LINES_PADDING)); // Line feed + cursorPos.x = textAreaBounds.x; // Carriage return + } + else + { + if (wrapMode == 1) + { + int glyphWidth = 0; + if (glyphInfo.advanceX != 0) glyphWidth += glyphInfo.advanceX; + else glyphWidth += (atlasRec.width + glyphInfo.offsetX); + + // Jump line if the end of the text box area has been reached + if ((cursorPos.x + (glyphWidth*scaleFactor)) > (textAreaBounds.x + textAreaBounds.width)) + { + cursorPos.y += (guiFont.baseSize*scaleFactor + GuiGetStyle(TEXTBOX, TEXT_LINES_PADDING)); // Line feed + cursorPos.x = textAreaBounds.x; // Carriage return + } + } + else if (wrapMode == 2) + { + /* + if ((codepointLength == 1) && (codepoint == ' ')) + { + lastSpacePos = i; + lastSpaceWidth = 0; + lastSpaceCursorPos = cursorPos.x; + } + + // Jump line if last word reaches end of text box area + if ((lastSpaceCursorPos + lastSpaceWidth) > (textAreaBounds.x + textAreaBounds.width)) + { + cursorPos.y += 12; // Line feed + cursorPos.x = textAreaBounds.x; // Carriage return + } + */ + } + + // Draw current character glyph + DrawTextCodepoint(guiFont, codepoint, cursorPos, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), Fade(GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))), guiAlpha)); + + int glyphWidth = 0; + if (glyphInfo.advanceX != 0) glyphWidth += glyphInfo.advanceX; + else glyphWidth += (atlasRec.width + glyphInfo.offsetX); + + cursorPos.x += (glyphWidth*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + //if (i > lastSpacePos) lastSpaceWidth += (atlasRec.width + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + } + + cursor.x = cursorPos.x; + cursor.y = cursorPos.y; + + // Draw cursor position considering text glyphs + if (editMode) GuiDrawRectangle(cursor, 0, BLANK, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha)); + //-------------------------------------------------------------------- + + return pressed; +} + +// Slider control with pro parameters +// NOTE: Other GuiSlider*() controls use this one +float GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue, int sliderWidth) +{ + GuiControlState state = guiState; + + 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 != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = GUI_STATE_PRESSED; + + // Get equivalent value and slider position from mousePoint.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 = GUI_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), Fade(GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(SLIDER, (state != GUI_STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)), guiAlpha)); + + // Draw slider internal bar (depends on state) + if ((state == GUI_STATE_NORMAL) || (state == GUI_STATE_PRESSED)) GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED)), guiAlpha)); + else if (state == GUI_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, GUI_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, GUI_TEXT_ALIGN_LEFT, Fade(GetColor(GuiGetStyle(SLIDER, TEXT + (state*3))), guiAlpha)); + } + //-------------------------------------------------------------------- + + return value; +} + +// Slider control extended, returns selected value and has text +float 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 +float 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 +float GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue) +{ + GuiControlState state = guiState; + + 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 (state != GUI_STATE_DISABLED) progress.width = ((float)(value/(maxValue - minValue))*(float)(bounds.width - 2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH))); + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(PROGRESSBAR, BORDER + (state*3))), guiAlpha), BLANK); + + // Draw slider internal progress bar (depends on state) + if ((state == GUI_STATE_NORMAL) || (state == GUI_STATE_PRESSED)) GuiDrawRectangle(progress, 0, BLANK, Fade(GetColor(GuiGetStyle(PROGRESSBAR, BASE_COLOR_PRESSED)), guiAlpha)); + else if (state == GUI_STATE_FOCUSED) GuiDrawRectangle(progress, 0, BLANK, Fade(GetColor(GuiGetStyle(PROGRESSBAR, 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(PROGRESSBAR, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(textLeft, textBounds, GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(GuiGetStyle(PROGRESSBAR, 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(PROGRESSBAR, TEXT_PADDING); + textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; + + GuiDrawText(textRight, textBounds, GUI_TEXT_ALIGN_LEFT, Fade(GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3))), guiAlpha)); + } + //-------------------------------------------------------------------- + + return value; +} + +// Status Bar control +void GuiStatusBar(Rectangle bounds, const char *text) +{ + GuiControlState state = guiState; + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(STATUSBAR, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(STATUSBAR, (state != GUI_STATE_DISABLED)? BORDER_COLOR_NORMAL : BORDER_COLOR_DISABLED)), guiAlpha), + Fade(GetColor(GuiGetStyle(STATUSBAR, (state != GUI_STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)), guiAlpha)); + GuiDrawText(text, GetTextBounds(STATUSBAR, bounds), GuiGetStyle(STATUSBAR, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(STATUSBAR, (state != GUI_STATE_DISABLED)? TEXT_COLOR_NORMAL : TEXT_COLOR_DISABLED)), guiAlpha)); + //-------------------------------------------------------------------- +} + +// Dummy rectangle control, intended for placeholding +void GuiDummyRec(Rectangle bounds, const char *text) +{ + GuiControlState state = guiState; + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED; + else state = GUI_STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, 0, BLANK, Fade(GetColor(GuiGetStyle(DEFAULT, (state != GUI_STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED)), guiAlpha)); + GuiDrawText(text, GetTextBounds(DEFAULT, bounds), GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(BUTTON, (state != GUI_STATE_DISABLED)? TEXT_COLOR_NORMAL : TEXT_COLOR_DISABLED)), guiAlpha)); + //------------------------------------------------------------------ +} + +// Scroll Bar control +int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue) +{ + GuiControlState 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 range = 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) }; + sliderSize = (sliderSize >= scrollbar.height)? ((int)scrollbar.height - 2) : sliderSize; // Make sure the slider won't get outside of the scrollbar + slider = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), (float)scrollbar.y + (int)(((float)(value - minValue)/range)*(scrollbar.height - sliderSize)), (float)bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)), (float)sliderSize }; + } + else + { + 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))}; + sliderSize = (sliderSize >= scrollbar.width)? ((int)scrollbar.width - 2) : sliderSize; // Make sure the slider won't get outside of the scrollbar + slider = RAYGUI_CLITERAL(Rectangle){ (float)scrollbar.x + (int)(((float)(value - minValue)/range)*(scrollbar.width - sliderSize)), (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), (float)sliderSize, (float)bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)) }; + } + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds)) + { + state = GUI_STATE_FOCUSED; + + // Handle mouse wheel + int wheel = (int)GetMouseWheelMove(); + if (wheel != 0) value += wheel; + + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) value -= range/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + else if (CheckCollisionPointRec(mousePoint, arrowDownRight)) value += range/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + + state = GUI_STATE_PRESSED; + } + else if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + if (!isVertical) + { + Rectangle scrollArea = { arrowUpLeft.x + arrowUpLeft.width, arrowUpLeft.y, scrollbar.width, bounds.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH)}; + if (CheckCollisionPointRec(mousePoint, scrollArea)) value = (int)(((float)(mousePoint.x - scrollArea.x - slider.width/2)*range)/(scrollArea.width - slider.width) + minValue); + } + else + { + Rectangle scrollArea = { arrowUpLeft.x, arrowUpLeft.y+arrowUpLeft.height, bounds.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH), scrollbar.height}; + if (CheckCollisionPointRec(mousePoint, scrollArea)) value = (int)(((float)(mousePoint.y - scrollArea.y - slider.height/2)*range)/(scrollArea.height - slider.height) + minValue); + } + } + } + + // Normalize value + if (value > maxValue) value = maxValue; + if (value < minValue) value = minValue; + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(SCROLLBAR, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), guiAlpha), Fade(GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED)), guiAlpha)); // Draw the background + + GuiDrawRectangle(scrollbar, 0, BLANK, Fade(GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL)), guiAlpha)); // Draw the scrollbar active area background + GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, BORDER + state*3)), guiAlpha)); // Draw the slider bar + + // Draw arrows (using icon if available) + if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)) + { +#if defined(RAYGUI_NO_RICONS) + GuiDrawText(isVertical? "^" : "<", RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); + GuiDrawText(isVertical? "v" : ">", RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); +#else + GuiDrawText(isVertical? "#121#" : "#118#", RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3)), guiAlpha)); // RICON_ARROW_UP_FILL / RICON_ARROW_LEFT_FILL + GuiDrawText(isVertical? "#120#" : "#119#", RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3)), guiAlpha)); // RICON_ARROW_DOWN_FILL / RICON_ARROW_RIGHT_FILL +#endif + } + //-------------------------------------------------------------------- + + return value; +} + +// List View control +int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int active) +{ + int itemCount = 0; + const char **items = NULL; + + if (text != NULL) items = GuiTextSplit(text, &itemCount, NULL); + + return GuiListViewEx(bounds, items, itemCount, NULL, scrollIndex, active); +} + +// List View control with extended parameters +int GuiListViewEx(Rectangle bounds, const char **text, int count, int *focus, int *scrollIndex, int active) +{ + GuiControlState 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 = (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_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)) + { + 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_PADDING)); + } + + 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_PADDING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), guiAlpha), GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background + + // Draw visible items + for (int i = 0; ((i < visibleItems) && (text != NULL)); i++) + { + if (state == GUI_STATE_DISABLED) + { + if ((startIndex + i) == itemSelected) GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), guiAlpha), Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED)), guiAlpha)); + + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED)), guiAlpha)); + } + else + { + if ((startIndex + i) == itemSelected) + { + // Draw item selected + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), guiAlpha), Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED)), guiAlpha)); + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED)), guiAlpha)); + } + else if ((startIndex + i) == itemFocused) + { + // Draw item focused + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), guiAlpha), Fade(GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED)), guiAlpha)); + GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED)), guiAlpha)); + } + else + { + // Draw item normal + GuiDrawText(text[startIndex + i], 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, 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 (focus != NULL) *focus = itemFocused; + if (scrollIndex != NULL) *scrollIndex = startIndex; + + return itemSelected; +} + +// Color Panel control +Color GuiColorPanel(Rectangle bounds, Color color) +{ + const Color colWhite = { 255, 255, 255, 255 }; + const Color colBlack = { 0, 0, 0, 255 }; + + GuiControlState state = guiState; + Vector2 pickerSelector = { 0 }; + + 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 != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = GUI_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 = GUI_STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + if (state != GUI_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, Fade(colWhite, guiAlpha)); + } + 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), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), guiAlpha), BLANK); + //-------------------------------------------------------------------- + + return color; +} + +// Color Bar Alpha control +// NOTE: Returns alpha value normalized [0..1] +float GuiColorBarAlpha(Rectangle bounds, float alpha) +{ + #define COLORBARALPHA_CHECKED_SIZE 10 + + GuiControlState 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 != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds) || + CheckCollisionPointRec(mousePoint, selector)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = GUI_STATE_PRESSED; + + 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 = GUI_STATE_FOCUSED; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + + // Draw alpha bar: checked background + if (state != GUI_STATE_DISABLED) + { + int checksX = (int)bounds.width/COLORBARALPHA_CHECKED_SIZE; + int checksY = (int)bounds.height/COLORBARALPHA_CHECKED_SIZE; + + for (int x = 0; x < checksX; x++) + { + for (int y = 0; y < checksY; y++) + { + Rectangle check = { bounds.x + x*COLORBARALPHA_CHECKED_SIZE, bounds.y + y*COLORBARALPHA_CHECKED_SIZE, COLORBARALPHA_CHECKED_SIZE, COLORBARALPHA_CHECKED_SIZE }; + GuiDrawRectangle(check, 0, BLANK, ((x + y)%2)? Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.4f), guiAlpha) : Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.4f), guiAlpha)); + } + } + + 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), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), guiAlpha), BLANK); + + // Draw alpha bar: selector + GuiDrawRectangle(selector, 0, BLANK, Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), guiAlpha)); + //-------------------------------------------------------------------- + + return alpha; +} + +// 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] +float GuiColorBarHue(Rectangle bounds, float hue) +{ + GuiControlState 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 != GUI_STATE_DISABLED) && !guiLocked) + { + Vector2 mousePoint = GetMousePosition(); + + if (CheckCollisionPointRec(mousePoint, bounds) || + CheckCollisionPointRec(mousePoint, selector)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + { + state = GUI_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 state = GUI_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 != GUI_STATE_DISABLED) + { + // Draw hue bar:color bars + DrawRectangleGradientV((int)bounds.x, (int)(bounds.y), (int)bounds.width, ceil(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, ceil(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, ceil(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, ceil(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, ceil(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), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), guiAlpha), BLANK); + + // Draw hue bar: selector + GuiDrawRectangle(selector, 0, BLANK, Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), guiAlpha)); + //-------------------------------------------------------------------- + + return hue; +} + +// 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 +Color GuiColorPicker(Rectangle bounds, Color color) +{ + color = GuiColorPanel(bounds, 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 }); + hsv.x = GuiColorBarHue(boundsHue, 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 color; +} + +// Message Box control +int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons) +{ + #define MESSAGEBOX_BUTTON_HEIGHT 24 + #define MESSAGEBOX_BUTTON_PADDING 10 + + int clicked = -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 + MESSAGEBOX_BUTTON_PADDING; + buttonBounds.y = bounds.y + bounds.height - MESSAGEBOX_BUTTON_HEIGHT - MESSAGEBOX_BUTTON_PADDING; + buttonBounds.width = (bounds.width - MESSAGEBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; + buttonBounds.height = MESSAGEBOX_BUTTON_HEIGHT; + + Vector2 textSize = MeasureTextEx(guiFont, message, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), 1); + + Rectangle textBounds = { 0 }; + textBounds.x = bounds.x + bounds.width/2 - textSize.x/2; + textBounds.y = bounds.y + WINDOW_STATUSBAR_HEIGHT + (bounds.height - WINDOW_STATUSBAR_HEIGHT - MESSAGEBOX_BUTTON_HEIGHT - MESSAGEBOX_BUTTON_PADDING)/2 - textSize.y/2; + textBounds.width = textSize.x; + textBounds.height = textSize.y; + + // Draw control + //-------------------------------------------------------------------- + if (GuiWindowBox(bounds, title)) clicked = 0; + + int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + GuiLabel(textBounds, message); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); + + prevTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + + for (int i = 0; i < buttonCount; i++) + { + if (GuiButton(buttonBounds, buttonsText[i])) clicked = i + 1; + buttonBounds.x += (buttonBounds.width + MESSAGEBOX_BUTTON_PADDING); + } + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevTextAlignment); + //-------------------------------------------------------------------- + + return clicked; +} + +// Text Input Box control, ask for text +int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text) +{ + #define TEXTINPUTBOX_BUTTON_HEIGHT 24 + #define TEXTINPUTBOX_BUTTON_PADDING 10 + #define TEXTINPUTBOX_HEIGHT 30 + + #define TEXTINPUTBOX_MAX_TEXT_LENGTH 256 + + // Used to enable text edit mode + // WARNING: No more than one GuiTextInputBox() should be open at the same time + static bool textEditMode = false; + + int btnIndex = -1; + + int buttonCount = 0; + const char **buttonsText = GuiTextSplit(buttons, &buttonCount, NULL); + Rectangle buttonBounds = { 0 }; + buttonBounds.x = bounds.x + TEXTINPUTBOX_BUTTON_PADDING; + buttonBounds.y = bounds.y + bounds.height - TEXTINPUTBOX_BUTTON_HEIGHT - TEXTINPUTBOX_BUTTON_PADDING; + buttonBounds.width = (bounds.width - TEXTINPUTBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; + buttonBounds.height = TEXTINPUTBOX_BUTTON_HEIGHT; + + int messageInputHeight = (int)bounds.height - WINDOW_STATUSBAR_HEIGHT - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - TEXTINPUTBOX_BUTTON_HEIGHT - 2*TEXTINPUTBOX_BUTTON_PADDING; + + Rectangle textBounds = { 0 }; + if (message != NULL) + { + Vector2 textSize = MeasureTextEx(guiFont, message, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), 1); + + textBounds.x = bounds.x + bounds.width/2 - textSize.x/2; + textBounds.y = bounds.y + WINDOW_STATUSBAR_HEIGHT + messageInputHeight/4 - textSize.y/2; + textBounds.width = textSize.x; + textBounds.height = textSize.y; + } + + Rectangle textBoxBounds = { 0 }; + textBoxBounds.x = bounds.x + TEXTINPUTBOX_BUTTON_PADDING; + textBoxBounds.y = bounds.y + WINDOW_STATUSBAR_HEIGHT - TEXTINPUTBOX_HEIGHT/2; + if (message == NULL) textBoxBounds.y += messageInputHeight/2; + else textBoxBounds.y += (messageInputHeight/2 + messageInputHeight/4); + textBoxBounds.width = bounds.width - TEXTINPUTBOX_BUTTON_PADDING*2; + textBoxBounds.height = TEXTINPUTBOX_HEIGHT; + + // Draw control + //-------------------------------------------------------------------- + if (GuiWindowBox(bounds, title)) btnIndex = 0; + + // Draw message if available + if (message != NULL) + { + int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + GuiLabel(textBounds, message); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); + } + + if (GuiTextBox(textBoxBounds, text, TEXTINPUTBOX_MAX_TEXT_LENGTH, textEditMode)) textEditMode = !textEditMode; + + int prevBtnTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + + for (int i = 0; i < buttonCount; i++) + { + if (GuiButton(buttonBounds, buttonsText[i])) btnIndex = i + 1; + buttonBounds.x += (buttonBounds.width + MESSAGEBOX_BUTTON_PADDING); + } + + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevBtnTextAlignment); + //-------------------------------------------------------------------- + + return btnIndex; +} + +// 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 +Vector2 GuiGrid(Rectangle bounds, float spacing, int subdivs) +{ + #if !defined(GRID_COLOR_ALPHA) + #define GRID_COLOR_ALPHA 0.15f // Grid lines alpha amount + #endif + + GuiControlState state = guiState; + Vector2 mousePoint = GetMousePosition(); + Vector2 currentCell = { -1, -1 }; + + int linesV = ((int)(bounds.width/spacing))*subdivs + 1; + int linesH = ((int)(bounds.height/spacing))*subdivs + 1; + + // Update control + //-------------------------------------------------------------------- + if ((state != GUI_STATE_DISABLED) && !guiLocked) + { + if (CheckCollisionPointRec(mousePoint, bounds)) + { + currentCell.x = (mousePoint.x - bounds.x)/spacing; + currentCell.y = (mousePoint.y - bounds.y)/spacing; + } + } + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + switch (state) + { + case GUI_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) ? Fade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), GRID_COLOR_ALPHA*4) : Fade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), GRID_COLOR_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) ? Fade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), GRID_COLOR_ALPHA*4) : Fade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), GRID_COLOR_ALPHA)); + } + } + } break; + default: break; + } + + return currentCell; +} + +//---------------------------------------------------------------------------------- +// Styles loading functions +//---------------------------------------------------------------------------------- + +// Load raygui style file (.rgs) +void GuiLoadStyle(const char *fileName) +{ + bool tryBinary = false; + + // Try reading the files as text file first + FILE *rgsFile = fopen(fileName, "rt"); + + if (rgsFile != NULL) + { + char buffer[256] = { 0 }; + fgets(buffer, 256, 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 <control_id> <property_id> <property_value> <property_name> + + sscanf(buffer, "p %d %d 0x%x", &controlId, &propertyId, &propertyValue); + + GuiSetStyle(controlId, propertyId, (int)propertyValue); + + } break; + case 'f': + { + // Style font: f <gen_font_size> <charmap_file> <font_file> + + 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 }; + + if (charmapFileName[0] != '0') + { + // Load characters from charmap file, + // expected '\n' separated list of integer values + char *charValues = LoadFileText(charmapFileName); + if (charValues != NULL) + { + int glyphCount = 0; + const char **chars = TextSplit(charValues, '\n', &glyphCount); + + int *values = (int *)RAYGUI_MALLOC(glyphCount*sizeof(int)); + for (int i = 0; i < glyphCount; i++) values[i] = TextToInteger(chars[i]); + + font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, values, glyphCount); + + RAYGUI_FREE(values); + } + } + else font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, NULL, 0); + + if ((font.texture.id > 0) && (font.glyphCount > 0)) GuiSetFont(font); + + } break; + default: break; + } + + fgets(buffer, 256, rgsFile); + } + } + else tryBinary = true; + + fclose(rgsFile); + } + + if (tryBinary) + { + rgsFile = fopen(fileName, "rb"); + + if (rgsFile == NULL) return; + + char signature[5] = ""; + short version = 0; + short reserved = 0; + int propertyCount = 0; + + fread(signature, 1, 4, rgsFile); + fread(&version, 1, sizeof(short), rgsFile); + fread(&reserved, 1, sizeof(short), rgsFile); + fread(&propertyCount, 1, sizeof(int), rgsFile); + + if ((signature[0] == 'r') && + (signature[1] == 'G') && + (signature[2] == 'S') && + (signature[3] == ' ')) + { + short controlId = 0; + short propertyId = 0; + int propertyValue = 0; + + for (int i = 0; i < propertyCount; i++) + { + fread(&controlId, 1, sizeof(short), rgsFile); + fread(&propertyId, 1, sizeof(short), rgsFile); + fread(&propertyValue, 1, sizeof(int), rgsFile); + + 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; + fread(&fontDataSize, 1, sizeof(int), rgsFile); + + if (fontDataSize > 0) + { + Font font = { 0 }; + int fontType = 0; // 0-Normal, 1-SDF + Rectangle whiteRec = { 0 }; + + fread(&font.baseSize, 1, sizeof(int), rgsFile); + fread(&font.glyphCount, 1, sizeof(int), rgsFile); + fread(&fontType, 1, sizeof(int), rgsFile); + + // Load font white rectangle + fread(&whiteRec, 1, sizeof(Rectangle), rgsFile); + + // Load font image parameters + int fontImageSize = 0; + fread(&fontImageSize, 1, sizeof(int), rgsFile); + + if (fontImageSize > 0) + { + Image imFont = { 0 }; + imFont.mipmaps = 1; + fread(&imFont.width, 1, sizeof(int), rgsFile); + fread(&imFont.height, 1, sizeof(int), rgsFile); + fread(&imFont.format, 1, sizeof(int), rgsFile); + + imFont.data = (unsigned char *)RAYGUI_MALLOC(fontImageSize); + fread(imFont.data, 1, fontImageSize, rgsFile); + + font.texture = LoadTextureFromImage(imFont); + + RAYGUI_FREE(imFont.data); + } + + // Load font recs data + font.recs = (Rectangle *)RAYGUI_CALLOC(font.glyphCount, sizeof(Rectangle)); + for (int i = 0; i < font.glyphCount; i++) fread(&font.recs[i], 1, sizeof(Rectangle), rgsFile); + + // Load font chars info data + font.glyphs = (GlyphInfo *)RAYGUI_CALLOC(font.glyphCount, sizeof(GlyphInfo)); + for (int i = 0; i < font.glyphCount; i++) + { + fread(&font.glyphs[i].value, 1, sizeof(int), rgsFile); + fread(&font.glyphs[i].offsetX, 1, sizeof(int), rgsFile); + fread(&font.glyphs[i].offsetY, 1, sizeof(int), rgsFile); + fread(&font.glyphs[i].advanceX, 1, sizeof(int), rgsFile); + } + + GuiSetFont(font); + + // Set font texture source rectangle to be used as white texture to draw shapes + // NOTE: This way, all gui can be draw using a single draw call + if ((whiteRec.width != 0) && (whiteRec.height != 0)) SetShapesTexture(font.texture, whiteRec); + } +#endif + } + + 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 + 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); // WARNING: Some controls use other values + GuiSetStyle(DEFAULT, TEXT_PADDING, 0); // WARNING: Some controls use other values + GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); // WARNING: Some controls use other values + + // Initialize control-specific property values + // NOTE: Those properties are in default list but require specific values by control type + GuiSetStyle(LABEL, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(BUTTON, BORDER_WIDTH, 2); + GuiSetStyle(SLIDER, TEXT_PADDING, 5); + GuiSetStyle(CHECKBOX, TEXT_PADDING, 5); + GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_RIGHT); + GuiSetStyle(TEXTBOX, TEXT_PADDING, 5); + GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(VALUEBOX, TEXT_PADDING, 4); + GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(SPINNER, TEXT_PADDING, 4); + GuiSetStyle(SPINNER, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(STATUSBAR, TEXT_PADDING, 6); + GuiSetStyle(STATUSBAR, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + + // Initialize 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(TOGGLE, GROUP_PADDING, 2); + GuiSetStyle(SLIDER, SLIDER_WIDTH, 15); + GuiSetStyle(SLIDER, SLIDER_PADDING, 1); + GuiSetStyle(PROGRESSBAR, PROGRESS_PADDING, 1); + GuiSetStyle(CHECKBOX, CHECK_PADDING, 1); + GuiSetStyle(COMBOBOX, COMBO_BUTTON_WIDTH, 30); + GuiSetStyle(COMBOBOX, COMBO_BUTTON_PADDING, 2); + GuiSetStyle(DROPDOWNBOX, ARROW_PADDING, 16); + GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_PADDING, 2); + GuiSetStyle(TEXTBOX, TEXT_LINES_PADDING, 5); + GuiSetStyle(TEXTBOX, TEXT_INNER_PADDING, 4); + GuiSetStyle(TEXTBOX, COLOR_SELECTED_FG, 0xf0fffeff); + GuiSetStyle(TEXTBOX, COLOR_SELECTED_BG, 0x839affe0); + GuiSetStyle(SPINNER, SPIN_BUTTON_WIDTH, 20); + GuiSetStyle(SPINNER, SPIN_BUTTON_PADDING, 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, 10); + GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, 0x1e); + GuiSetStyle(LISTVIEW, LIST_ITEMS_PADDING, 2); + GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 10); + GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, SCROLLBAR_RIGHT_SIDE); + GuiSetStyle(COLORPICKER, COLOR_SELECTOR_SIZE, 6); + GuiSetStyle(COLORPICKER, HUEBAR_WIDTH, 0x14); + GuiSetStyle(COLORPICKER, HUEBAR_PADDING, 0xa); + GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT, 6); + GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW, 2); + + guiFont = GetFontDefault(); // Initialize default font +} + +// 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_RICONS) + return NULL; +#else + static char buffer[1024] = { 0 }; + memset(buffer, 0, 1024); + + sprintf(buffer, "#%03i#", iconId); + + if (text != NULL) + { + for (int i = 5; i < 1024; i++) + { + buffer[i] = text[i - 5]; + if (text[i - 5] == '\0') break; + } + } + + return buffer; +#endif +} + +#if !defined(RAYGUI_NO_RICONS) + +// Get full icons data pointer +unsigned int *GuiGetIcons(void) { return guiIcons; } + +// Load raygui icons file (.rgi) +// NOTE: In case nameIds are required, they can be requested with loadIconsName, +// they are returned as a guiIconsName[iconCount][RICON_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] = ""; + short version = 0; + short reserved = 0; + short iconCount = 0; + short iconSize = 0; + + fread(signature, 1, 4, rgiFile); + fread(&version, 1, sizeof(short), rgiFile); + fread(&reserved, 1, sizeof(short), rgiFile); + fread(&iconCount, 1, sizeof(short), rgiFile); + fread(&iconSize, 1, sizeof(short), 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(RICON_MAX_NAME_LENGTH); + fread(guiIconsName[i], RICON_MAX_NAME_LENGTH, 1, rgiFile); + } + } + else fseek(rgiFile, iconCount*RICON_MAX_NAME_LENGTH, SEEK_CUR); + + // Read icons data directly over guiIcons data array + fread(guiIcons, iconCount*(iconSize*iconSize/32), sizeof(unsigned int), 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) & (1<<(b))) + + for (int i = 0, y = 0; i < RICON_SIZE*RICON_SIZE/32; i++) + { + for (int k = 0; k < 32; k++) + { + if (BIT_CHECK(guiIcons[iconId*RICON_DATA_ELEMENTS + i], k)) + { + #if !defined(RAYGUI_STANDALONE) + DrawRectangle(posX + (k%RICON_SIZE)*pixelSize, posY + y*pixelSize, pixelSize, pixelSize, color); + #endif + } + + if ((k == 15) || (k == 31)) y++; + } + } +} + +// Get icon bit data +// NOTE: Bit data array grouped as unsigned int (ICON_SIZE*ICON_SIZE/32 elements) +unsigned int *GuiGetIconData(int iconId) +{ + static unsigned int iconData[RICON_DATA_ELEMENTS] = { 0 }; + memset(iconData, 0, RICON_DATA_ELEMENTS*sizeof(unsigned int)); + + if (iconId < RICON_MAX_ICONS) memcpy(iconData, &guiIcons[iconId*RICON_DATA_ELEMENTS], RICON_DATA_ELEMENTS*sizeof(unsigned int)); + + return iconData; +} + +// Set icon bit data +// NOTE: Data must be provided as unsigned int array (ICON_SIZE*ICON_SIZE/32 elements) +void GuiSetIconData(int iconId, unsigned int *data) +{ + if (iconId < RICON_MAX_ICONS) memcpy(&guiIcons[iconId*RICON_DATA_ELEMENTS], data, RICON_DATA_ELEMENTS*sizeof(unsigned int)); +} + +// Set icon pixel value +void GuiSetIconPixel(int iconId, int x, int y) +{ + #define BIT_SET(a,b) ((a) |= (1<<(b))) + + // This logic works for any RICON_SIZE pixels icons, + // For example, in case of 16x16 pixels, every 2 lines fit in one unsigned int data element + BIT_SET(guiIcons[iconId*RICON_DATA_ELEMENTS + y/(sizeof(unsigned int)*8/RICON_SIZE)], x + (y%(sizeof(unsigned int)*8/RICON_SIZE)*RICON_SIZE)); +} + +// Clear icon pixel value +void GuiClearIconPixel(int iconId, int x, int y) +{ + #define BIT_CLEAR(a,b) ((a) &= ~((1)<<(b))) + + // This logic works for any RICON_SIZE pixels icons, + // For example, in case of 16x16 pixels, every 2 lines fit in one unsigned int data element + BIT_CLEAR(guiIcons[iconId*RICON_DATA_ELEMENTS + y/(sizeof(unsigned int)*8/RICON_SIZE)], x + (y%(sizeof(unsigned int)*8/RICON_SIZE)*RICON_SIZE)); +} + +// Check icon pixel value +bool GuiCheckIconPixel(int iconId, int x, int y) +{ + #define BIT_CHECK(a,b) ((a) & (1<<(b))) + + return (BIT_CHECK(guiIcons[iconId*8 + y/2], x + (y%2*16))); +} +#endif // !RAYGUI_NO_RICONS + +//---------------------------------------------------------------------------------- +// Module specific Functions Definition +//---------------------------------------------------------------------------------- +// Gui get text width using default font +// NOTE: Icon is not considered here +static int GetTextWidth(const char *text) +{ + Vector2 size = { 0 }; + + if ((text != NULL) && (text[0] != '\0')) + { + size = MeasureTextEx(guiFont, text, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + + return (int)size.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); + textBounds.width = bounds.width - 2*GuiGetStyle(control, BORDER_WIDTH); + textBounds.height = bounds.height - 2*GuiGetStyle(control, BORDER_WIDTH); + + // Consider TEXT_PADDING properly, depends on control type and TEXT_ALIGNMENT + switch (control) + { + case COMBOBOX: bounds.width -= (GuiGetStyle(control, COMBO_BUTTON_WIDTH) + GuiGetStyle(control, COMBO_BUTTON_PADDING)); break; + case VALUEBOX: break; // NOTE: ValueBox text value always centered, text padding applies to label + default: + { + if (GuiGetStyle(control, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT) textBounds.x -= GuiGetStyle(control, TEXT_PADDING); + else textBounds.x += GuiGetStyle(control, TEXT_PADDING); + } break; + } + + // TODO: Special cases (no label): COMBOBOX, DROPDOWNBOX, LISTVIEW (scrollbar?) + // More special cases (label on side): CHECKBOX, SLIDER, VALUEBOX, SPINNER + + 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_RICONS) + *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; +} + +// Gui draw text using default font +static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color tint) +{ + #define TEXT_VALIGN_PIXEL_OFFSET(h) ((int)h%2) // Vertical alignment for pixel perfect + + if ((text != NULL) && (text[0] != '\0')) + { + int iconId = 0; + text = GetTextIcon(text, &iconId); // Check text for icon and move cursor + + // Get text position depending on alignment and iconId + //--------------------------------------------------------------------------------- + #define RICON_TEXT_PADDING 4 + + Vector2 position = { bounds.x, bounds.y }; + + // NOTE: We get text size after icon has been processed + int textWidth = GetTextWidth(text); + int textHeight = GuiGetStyle(DEFAULT, TEXT_SIZE); + + // If text requires an icon, add size to measure + if (iconId >= 0) + { + textWidth += RICON_SIZE; + + // WARNING: If only icon provided, text could be pointing to EOF character: '\0' + if ((text != NULL) && (text[0] != '\0')) textWidth += RICON_TEXT_PADDING; + } + + // Check guiTextAlign global variables + switch (alignment) + { + case GUI_TEXT_ALIGN_LEFT: + { + position.x = bounds.x; + position.y = bounds.y + bounds.height/2 - textHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(bounds.height); + } break; + case GUI_TEXT_ALIGN_CENTER: + { + position.x = bounds.x + bounds.width/2 - textWidth/2; + position.y = bounds.y + bounds.height/2 - textHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(bounds.height); + } break; + case GUI_TEXT_ALIGN_RIGHT: + { + position.x = bounds.x + bounds.width - textWidth; + position.y = bounds.y + bounds.height/2 - textHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(bounds.height); + } break; + default: break; + } + + // NOTE: Make sure we get pixel-perfect coordinates, + // In case of decimals we got weird text positioning + position.x = (float)((int)position.x); + position.y = (float)((int)position.y); + //--------------------------------------------------------------------------------- + + // Draw text (with icon if available) + //--------------------------------------------------------------------------------- +#if !defined(RAYGUI_NO_RICONS) + if (iconId >= 0) + { + // NOTE: We consider icon height, probably different than text size + GuiDrawIcon(iconId, (int)position.x, (int)(bounds.y + bounds.height/2 - RICON_SIZE/2 + TEXT_VALIGN_PIXEL_OFFSET(bounds.height)), 1, tint); + position.x += (RICON_SIZE + RICON_TEXT_PADDING); + } +#endif + DrawTextEx(guiFont, text, position, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING), tint); + //--------------------------------------------------------------------------------- + } +} + +// 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, color); + } + + if (borderWidth > 0) + { + // Draw rectangle border lines with color + DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, borderWidth, borderColor); + DrawRectangle((int)rec.x, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, borderColor); + DrawRectangle((int)rec.x + (int)rec.width - borderWidth, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, borderColor); + DrawRectangle((int)rec.x, (int)rec.y + (int)rec.height - borderWidth, (int)rec.width, borderWidth, borderColor); + } +} + +// Split controls text into multiple strings +// Also check for multiple columns (required by GuiToggleGroup()) +static const char **GuiTextSplit(const char *text, 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 TEXTSPLIT_MAX_TEXT_ELEMENTS + // 2. Maximum size of text to split is TEXTSPLIT_MAX_TEXT_LENGTH + // NOTE: Those definitions could be externally provided if required + + #if !defined(TEXTSPLIT_MAX_TEXT_LENGTH) + #define TEXTSPLIT_MAX_TEXT_LENGTH 1024 + #endif + + #if !defined(TEXTSPLIT_MAX_TEXT_ELEMENTS) + #define TEXTSPLIT_MAX_TEXT_ELEMENTS 128 + #endif + + static const char *result[TEXTSPLIT_MAX_TEXT_ELEMENTS] = { NULL }; + static char buffer[TEXTSPLIT_MAX_TEXT_LENGTH] = { 0 }; + memset(buffer, 0, TEXTSPLIT_MAX_TEXT_LENGTH); + + 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 < TEXTSPLIT_MAX_TEXT_LENGTH; i++) + { + buffer[i] = text[i]; + if (buffer[i] == '\0') break; + else if ((buffer[i] == ';') || (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 == TEXTSPLIT_MAX_TEXT_ELEMENTS) 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; +} + +#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; +} + +// Color fade-in or fade-out, alpha goes from 0.0f to 1.0f +static Color Fade(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)(255.0f*alpha) }; + + return result; +} + +// Formatting of text with variables to 'embed' +static const char *TextFormat(const char *text, ...) +{ + #define MAX_FORMATTEXT_LENGTH 64 + + static char buffer[MAX_FORMATTEXT_LENGTH]; + + 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); +} + +#define TEXTSPLIT_MAX_TEXT_BUFFER_LENGTH 1024 // Size of static buffer: TextSplit() +#define TEXTSPLIT_MAX_SUBSTRINGS_COUNT 128 // Size of static pointers array: TextSplit() + +// 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 TEXTSPLIT_MAX_SUBSTRINGS_COUNT + // 2. Maximum size of text to split is TEXTSPLIT_MAX_TEXT_BUFFER_LENGTH + + static const char *result[TEXTSPLIT_MAX_SUBSTRINGS_COUNT] = { NULL }; + static char buffer[TEXTSPLIT_MAX_TEXT_BUFFER_LENGTH] = { 0 }; + memset(buffer, 0, TEXTSPLIT_MAX_TEXT_BUFFER_LENGTH); + + 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 < TEXTSPLIT_MAX_TEXT_BUFFER_LENGTH; 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 == TEXTSPLIT_MAX_SUBSTRINGS_COUNT) 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 GetCodepoint(const char *text, int *bytesProcessed) +{ +/* + UTF-8 specs from https://www.ietf.org/rfc/rfc3629.txt + + Char. number range | UTF-8 octet sequence + (hexadecimal) | (binary) + --------------------+--------------------------------------------- + 0000 0000-0000 007F | 0xxxxxxx + 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx +*/ + // NOTE: on decode errors we return as soon as possible + + int code = 0x3f; // Codepoint (defaults to '?') + int octet = (unsigned char)(text[0]); // The first UTF8 octet + *bytesProcessed = 1; + + if (octet <= 0x7f) + { + // Only one octet (ASCII range x00-7F) + code = text[0]; + } + else if ((octet & 0xe0) == 0xc0) + { + // Two octets + + // [0]xC2-DF [1]UTF8-tail(x80-BF) + unsigned char octet1 = text[1]; + + if ((octet1 == '\0') || ((octet1 >> 6) != 2)) { *bytesProcessed = 2; return code; } // Unexpected sequence + + if ((octet >= 0xc2) && (octet <= 0xdf)) + { + code = ((octet & 0x1f) << 6) | (octet1 & 0x3f); + *bytesProcessed = 2; + } + } + else if ((octet & 0xf0) == 0xe0) + { + // Three octets + unsigned char octet1 = text[1]; + unsigned char octet2 = '\0'; + + if ((octet1 == '\0') || ((octet1 >> 6) != 2)) { *bytesProcessed = 2; return code; } // Unexpected sequence + + octet2 = text[2]; + + if ((octet2 == '\0') || ((octet2 >> 6) != 2)) { *bytesProcessed = 3; return code; } // Unexpected sequence + + // [0]xE0 [1]xA0-BF [2]UTF8-tail(x80-BF) + // [0]xE1-EC [1]UTF8-tail [2]UTF8-tail(x80-BF) + // [0]xED [1]x80-9F [2]UTF8-tail(x80-BF) + // [0]xEE-EF [1]UTF8-tail [2]UTF8-tail(x80-BF) + + if (((octet == 0xe0) && !((octet1 >= 0xa0) && (octet1 <= 0xbf))) || + ((octet == 0xed) && !((octet1 >= 0x80) && (octet1 <= 0x9f)))) { *bytesProcessed = 2; return code; } + + if ((octet >= 0xe0) && (0 <= 0xef)) + { + code = ((octet & 0xf) << 12) | ((octet1 & 0x3f) << 6) | (octet2 & 0x3f); + *bytesProcessed = 3; + } + } + else if ((octet & 0xf8) == 0xf0) + { + // Four octets + if (octet > 0xf4) return code; + + unsigned char octet1 = text[1]; + unsigned char octet2 = '\0'; + unsigned char octet3 = '\0'; + + if ((octet1 == '\0') || ((octet1 >> 6) != 2)) { *bytesProcessed = 2; return code; } // Unexpected sequence + + octet2 = text[2]; + + if ((octet2 == '\0') || ((octet2 >> 6) != 2)) { *bytesProcessed = 3; return code; } // Unexpected sequence + + octet3 = text[3]; + + if ((octet3 == '\0') || ((octet3 >> 6) != 2)) { *bytesProcessed = 4; return code; } // Unexpected sequence + + // [0]xF0 [1]x90-BF [2]UTF8-tail [3]UTF8-tail + // [0]xF1-F3 [1]UTF8-tail [2]UTF8-tail [3]UTF8-tail + // [0]xF4 [1]x80-8F [2]UTF8-tail [3]UTF8-tail + + if (((octet == 0xf0) && !((octet1 >= 0x90) && (octet1 <= 0xbf))) || + ((octet == 0xf4) && !((octet1 >= 0x80) && (octet1 <= 0x8f)))) { *bytesProcessed = 2; return code; } // Unexpected sequence + + if (octet >= 0xf0) + { + code = ((octet & 0x7) << 18) | ((octet1 & 0x3f) << 12) | ((octet2 & 0x3f) << 6) | (octet3 & 0x3f); + *bytesProcessed = 4; + } + } + + if (code > 0x10ffff) code = 0x3f; // Codepoints after U+10ffff are invalid + + return code; +} +#endif // RAYGUI_STANDALONE + +#endif // RAYGUI_IMPLEMENTATION diff --git a/include/raylib.h b/include/raylib.h new file mode 100644 index 0000000..b6f77d8 --- /dev/null +++ b/include/raylib.h @@ -0,0 +1,1555 @@ +/********************************************************************************************** +* +* raylib v4.1-dev - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* +* FEATURES: +* - NO external dependencies, all required libraries included with raylib +* - Multiplatform: Windows, Linux, FreeBSD, OpenBSD, NetBSD, DragonFly, +* MacOS, Haiku, Android, Raspberry Pi, DRM native, HTML5. +* - Written in plain C code (C99) in PascalCase/camelCase notation +* - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3 or ES2 - choose at compile) +* - Unique OpenGL abstraction layer (usable as standalone module): [rlgl] +* - Multiple Fonts formats supported (TTF, XNA fonts, AngelCode fonts) +* - Outstanding texture formats support, including compressed formats (DXT, ETC, ASTC) +* - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more! +* - Flexible Materials system, supporting classic maps and PBR maps +* - Animated 3D models supported (skeletal bones animation) (IQM) +* - Shaders support, including Model shaders and Postprocessing shaders +* - Powerful math module for Vector, Matrix and Quaternion operations: [raymath] +* - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, XM, MOD) +* - VR stereo rendering with configurable HMD device parameters +* - Bindings to multiple programming languages available! +* +* NOTES: +* - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text] +* - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) +* - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2) +* - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2) +* +* DEPENDENCIES (included): +* [rcore] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input (PLATFORM_DESKTOP) +* [rlgl] glad (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading (PLATFORM_DESKTOP) +* [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management +* +* OPTIONAL DEPENDENCIES (included): +* [rcore] msf_gif (Miles Fogle) for GIF recording +* [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm +* [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm +* [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...) +* [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG) +* [rtextures] stb_image_resize (Sean Barret) for image resizing algorithms +* [rtext] stb_truetype (Sean Barret) for ttf fonts loading +* [rtext] stb_rect_pack (Sean Barret) for rectangles packing +* [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation +* [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL) +* [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF) +* [raudio] dr_wav (David Reid) for WAV audio file loading +* [raudio] dr_flac (David Reid) for FLAC audio file loading +* [raudio] dr_mp3 (David Reid) for MP3 audio file loading +* [raudio] stb_vorbis (Sean Barret) for OGG audio loading +* [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading +* [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading +* +* +* LICENSE: zlib/libpng +* +* raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software: +* +* Copyright (c) 2013-2022 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 RAYLIB_H +#define RAYLIB_H + +#include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback + +#define RAYLIB_VERSION "4.1-dev" + +// 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 RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) + #endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +//---------------------------------------------------------------------------------- +// Some basic Defines +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Allow custom memory allocators +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(ptr,sz) realloc(ptr,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(ptr) free(ptr) +#endif + +// NOTE: MSVC C++ compiler does not support compound literals (C99 feature) +// Plain structures in C++ (without constructors) can be initialized with { } +#if defined(__cplusplus) + #define CLITERAL(type) type +#else + #define CLITERAL(type) (type) +#endif + +// NOTE: We set some defines with some data types declared by raylib +// Other modules (raymath, rlgl) also require some of those types, so, +// to be able to use those other modules as standalone (not depending on raylib) +// this defines are very useful for internal check and avoid type (re)definitions +#define RL_COLOR_TYPE +#define RL_RECTANGLE_TYPE +#define RL_VECTOR2_TYPE +#define RL_VECTOR3_TYPE +#define RL_VECTOR4_TYPE +#define RL_QUATERNION_TYPE +#define RL_MATRIX_TYPE + +// Some Basic Colors +// NOTE: Custom raylib color palette for amazing visuals on WHITE background +#define LIGHTGRAY CLITERAL(Color){ 200, 200, 200, 255 } // Light Gray +#define GRAY CLITERAL(Color){ 130, 130, 130, 255 } // Gray +#define DARKGRAY CLITERAL(Color){ 80, 80, 80, 255 } // Dark Gray +#define YELLOW CLITERAL(Color){ 253, 249, 0, 255 } // Yellow +#define GOLD CLITERAL(Color){ 255, 203, 0, 255 } // Gold +#define ORANGE CLITERAL(Color){ 255, 161, 0, 255 } // Orange +#define PINK CLITERAL(Color){ 255, 109, 194, 255 } // Pink +#define RED CLITERAL(Color){ 230, 41, 55, 255 } // Red +#define MAROON CLITERAL(Color){ 190, 33, 55, 255 } // Maroon +#define GREEN CLITERAL(Color){ 0, 228, 48, 255 } // Green +#define LIME CLITERAL(Color){ 0, 158, 47, 255 } // Lime +#define DARKGREEN CLITERAL(Color){ 0, 117, 44, 255 } // Dark Green +#define SKYBLUE CLITERAL(Color){ 102, 191, 255, 255 } // Sky Blue +#define BLUE CLITERAL(Color){ 0, 121, 241, 255 } // Blue +#define DARKBLUE CLITERAL(Color){ 0, 82, 172, 255 } // Dark Blue +#define PURPLE CLITERAL(Color){ 200, 122, 255, 255 } // Purple +#define VIOLET CLITERAL(Color){ 135, 60, 190, 255 } // Violet +#define DARKPURPLE CLITERAL(Color){ 112, 31, 126, 255 } // Dark Purple +#define BEIGE CLITERAL(Color){ 211, 176, 131, 255 } // Beige +#define BROWN CLITERAL(Color){ 127, 106, 79, 255 } // Brown +#define DARKBROWN CLITERAL(Color){ 76, 63, 47, 255 } // Dark Brown + +#define WHITE CLITERAL(Color){ 255, 255, 255, 255 } // White +#define BLACK CLITERAL(Color){ 0, 0, 0, 255 } // Black +#define BLANK CLITERAL(Color){ 0, 0, 0, 0 } // Blank (Transparent) +#define MAGENTA CLITERAL(Color){ 255, 0, 255, 255 } // Magenta +#define RAYWHITE CLITERAL(Color){ 245, 245, 245, 255 } // My own White (raylib logo) + +//---------------------------------------------------------------------------------- +// Structures Definition +//---------------------------------------------------------------------------------- +// Boolean type +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L + #include <stdbool.h> +#elif !defined(__cplusplus) && !defined(bool) + typedef enum bool { false, true } bool; + #define RL_BOOL_TYPE +#endif + +// Vector2, 2 components +typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component +} Vector2; + +// Vector3, 3 components +typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component +} Vector3; + +// Vector4, 4 components +typedef struct Vector4 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + float w; // Vector w component +} Vector4; + +// Quaternion, 4 components (Vector4 alias) +typedef Vector4 Quaternion; + +// Matrix, 4x4 components, column major, OpenGL style, right handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; + +// Color, 4 components, R8G8B8A8 (32bit) +typedef struct Color { + unsigned char r; // Color red value + unsigned char g; // Color green value + unsigned char b; // Color blue value + unsigned char a; // Color alpha value +} Color; + +// Rectangle, 4 components +typedef struct Rectangle { + float x; // Rectangle top-left corner position x + float y; // Rectangle top-left corner position y + float width; // Rectangle width + float height; // Rectangle height +} Rectangle; + +// 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; + +// Texture, tex data stored in GPU memory (VRAM) +typedef struct Texture { + 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) +} Texture; + +// Texture2D, same as Texture +typedef Texture Texture2D; + +// TextureCubemap, same as Texture +typedef Texture TextureCubemap; + +// RenderTexture, fbo for texture rendering +typedef struct RenderTexture { + unsigned int id; // OpenGL framebuffer object id + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture +} RenderTexture; + +// RenderTexture2D, same as RenderTexture +typedef RenderTexture RenderTexture2D; + +// NPatchInfo, n-patch layout info +typedef struct NPatchInfo { + Rectangle source; // Texture source rectangle + int left; // Left border offset + int top; // Top border offset + int right; // Right border offset + int bottom; // Bottom border offset + int layout; // Layout of the n-patch: 3x3, 1x3 or 3x1 +} NPatchInfo; + +// 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; + +// Font, font texture and GlyphInfo array data +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; + +// Camera, defines position/orientation in 3d space +typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic + int projection; // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC +} Camera3D; + +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + +// Camera2D, defines position/orientation in 2d space +typedef struct Camera2D { + Vector2 offset; // Camera offset (displacement from target) + Vector2 target; // Camera target (rotation and zoom origin) + float rotation; // Camera rotation in degrees + float zoom; // Camera zoom (scaling), should be 1.0f by default +} Camera2D; + +// Mesh, vertex data and vao/vbo +typedef struct Mesh { + int vertexCount; // Number of vertices stored in arrays + int triangleCount; // Number of triangles stored (indexed or not) + + // Vertex attributes data + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *texcoords2; // Vertex second texture coordinates (useful for lightmaps) (shader-location = 5) + float *normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + float *tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) + + // Animation vertex data + float *animVertices; // Animated vertex positions (after bones transformations) + float *animNormals; // Animated normals (after bones transformations) + unsigned char *boneIds; // Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) + + // OpenGL identifiers + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) +} Mesh; + +// Shader +typedef struct Shader { + unsigned int id; // Shader program id + int *locs; // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} Shader; + +// MaterialMap +typedef struct MaterialMap { + Texture2D texture; // Material map texture + Color color; // Material map color + float value; // Material map value +} MaterialMap; + +// Material, includes shader and maps +typedef struct Material { + Shader shader; // Material shader + MaterialMap *maps; // Material maps array (MAX_MATERIAL_MAPS) + float params[4]; // Material generic parameters (if required) +} Material; + +// Transform, vectex transformation data +typedef struct Transform { + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale +} Transform; + +// Bone, skeletal animation bone +typedef struct BoneInfo { + char name[32]; // Bone name + int parent; // Bone parent +} BoneInfo; + +// Model, meshes, materials and animation data +typedef struct Model { + Matrix transform; // Local transform matrix + + int meshCount; // Number of meshes + int materialCount; // Number of materials + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number + + // Animation data + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + Transform *bindPose; // Bones base transformation (pose) +} Model; + +// ModelAnimation +typedef struct ModelAnimation { + int boneCount; // Number of bones + int frameCount; // Number of animation frames + BoneInfo *bones; // Bones information (skeleton) + Transform **framePoses; // Poses array by frame +} ModelAnimation; + +// Ray, ray for raycasting +typedef struct Ray { + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction +} Ray; + +// RayCollision, ray hit information +typedef struct RayCollision { + bool hit; // Did the ray hit something? + float distance; // Distance to nearest hit + Vector3 point; // Point of nearest hit + Vector3 normal; // Surface normal of hit +} RayCollision; + +// BoundingBox +typedef struct BoundingBox { + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner +} BoundingBox; + +// Wave, audio wave data +typedef struct Wave { + unsigned int frameCount; // Total number of frames (considering channels) + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) + void *data; // Buffer data pointer +} Wave; + +// Opaque structs declaration +// NOTE: Actual structs are defined internally in raudio module +typedef struct rAudioBuffer rAudioBuffer; +typedef struct rAudioProcessor rAudioProcessor; + +// AudioStream, custom audio stream +typedef struct AudioStream { + rAudioBuffer *buffer; // Pointer to internal data used by the audio system + rAudioProcessor *processor; // Pointer to internal data processor, useful for audio effects + + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) +} AudioStream; + +// Sound +typedef struct Sound { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) +} Sound; + +// Music, audio stream, anything longer than ~10 seconds should be streamed +typedef struct Music { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) + bool looping; // Music looping enable + + int ctxType; // Type of music context (audio filetype) + void *ctxData; // Audio context data, depends on type +} Music; + +// VrDeviceInfo, Head-Mounted-Display device parameters +typedef struct VrDeviceInfo { + int hResolution; // Horizontal resolution in pixels + int vResolution; // Vertical resolution in pixels + float hScreenSize; // Horizontal size in meters + float vScreenSize; // Vertical size in meters + float vScreenCenter; // Screen center in meters + float eyeToScreenDistance; // Distance between eye and display in meters + float lensSeparationDistance; // Lens separation distance in meters + float interpupillaryDistance; // IPD (distance between pupils) in meters + float lensDistortionValues[4]; // Lens distortion constant parameters + float chromaAbCorrection[4]; // Chromatic aberration correction parameters +} VrDeviceInfo; + +// VrStereoConfig, VR stereo rendering configuration for simulator +typedef struct VrStereoConfig { + Matrix projection[2]; // VR projection matrices (per eye) + Matrix viewOffset[2]; // VR view offset matrices (per eye) + float leftLensCenter[2]; // VR left lens center + float rightLensCenter[2]; // VR right lens center + float leftScreenCenter[2]; // VR left screen center + float rightScreenCenter[2]; // VR right screen center + float scale[2]; // VR distortion scale + float scaleIn[2]; // VR distortion scale in +} VrStereoConfig; + +//---------------------------------------------------------------------------------- +// Enumerators Definition +//---------------------------------------------------------------------------------- +// System/Window config flags +// NOTE: Every bit registers one state (use it with bit masks) +// By default all flags are set to 0 +typedef enum { + FLAG_VSYNC_HINT = 0x00000040, // Set to try enabling V-Sync on GPU + FLAG_FULLSCREEN_MODE = 0x00000002, // Set to run program in fullscreen + FLAG_WINDOW_RESIZABLE = 0x00000004, // Set to allow resizable window + FLAG_WINDOW_UNDECORATED = 0x00000008, // Set to disable window decoration (frame and buttons) + FLAG_WINDOW_HIDDEN = 0x00000080, // Set to hide window + FLAG_WINDOW_MINIMIZED = 0x00000200, // Set to minimize window (iconify) + FLAG_WINDOW_MAXIMIZED = 0x00000400, // Set to maximize window (expanded to monitor) + FLAG_WINDOW_UNFOCUSED = 0x00000800, // Set to window non focused + FLAG_WINDOW_TOPMOST = 0x00001000, // Set to window always on top + FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized + FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer + FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI + FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X + FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) +} ConfigFlags; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + LOG_ALL = 0, // Display all logs + LOG_TRACE, // Trace logging, intended for internal use only + LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + LOG_INFO, // Info logging, used for program execution info + LOG_WARNING, // Warning logging, used on recoverable failures + LOG_ERROR, // Error logging, used on unrecoverable failures + LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + LOG_NONE // Disable logging +} TraceLogLevel; + +// Keyboard keys (US keyboard layout) +// NOTE: Use GetKeyPressed() to allow redefining +// required keys for alternative layouts +typedef enum { + KEY_NULL = 0, // Key: NULL, used for no key pressed + // Alphanumeric keys + KEY_APOSTROPHE = 39, // Key: ' + KEY_COMMA = 44, // Key: , + KEY_MINUS = 45, // Key: - + KEY_PERIOD = 46, // Key: . + KEY_SLASH = 47, // Key: / + KEY_ZERO = 48, // Key: 0 + KEY_ONE = 49, // Key: 1 + KEY_TWO = 50, // Key: 2 + KEY_THREE = 51, // Key: 3 + KEY_FOUR = 52, // Key: 4 + KEY_FIVE = 53, // Key: 5 + KEY_SIX = 54, // Key: 6 + KEY_SEVEN = 55, // Key: 7 + KEY_EIGHT = 56, // Key: 8 + KEY_NINE = 57, // Key: 9 + KEY_SEMICOLON = 59, // Key: ; + KEY_EQUAL = 61, // Key: = + KEY_A = 65, // Key: A | a + KEY_B = 66, // Key: B | b + KEY_C = 67, // Key: C | c + KEY_D = 68, // Key: D | d + KEY_E = 69, // Key: E | e + KEY_F = 70, // Key: F | f + KEY_G = 71, // Key: G | g + KEY_H = 72, // Key: H | h + KEY_I = 73, // Key: I | i + KEY_J = 74, // Key: J | j + KEY_K = 75, // Key: K | k + KEY_L = 76, // Key: L | l + KEY_M = 77, // Key: M | m + KEY_N = 78, // Key: N | n + KEY_O = 79, // Key: O | o + KEY_P = 80, // Key: P | p + KEY_Q = 81, // Key: Q | q + KEY_R = 82, // Key: R | r + KEY_S = 83, // Key: S | s + KEY_T = 84, // Key: T | t + KEY_U = 85, // Key: U | u + KEY_V = 86, // Key: V | v + KEY_W = 87, // Key: W | w + KEY_X = 88, // Key: X | x + KEY_Y = 89, // Key: Y | y + KEY_Z = 90, // Key: Z | z + KEY_LEFT_BRACKET = 91, // Key: [ + KEY_BACKSLASH = 92, // Key: '\' + KEY_RIGHT_BRACKET = 93, // Key: ] + KEY_GRAVE = 96, // Key: ` + // Function keys + KEY_SPACE = 32, // Key: Space + KEY_ESCAPE = 256, // Key: Esc + KEY_ENTER = 257, // Key: Enter + KEY_TAB = 258, // Key: Tab + KEY_BACKSPACE = 259, // Key: Backspace + KEY_INSERT = 260, // Key: Ins + KEY_DELETE = 261, // Key: Del + KEY_RIGHT = 262, // Key: Cursor right + KEY_LEFT = 263, // Key: Cursor left + KEY_DOWN = 264, // Key: Cursor down + KEY_UP = 265, // Key: Cursor up + KEY_PAGE_UP = 266, // Key: Page up + KEY_PAGE_DOWN = 267, // Key: Page down + KEY_HOME = 268, // Key: Home + KEY_END = 269, // Key: End + KEY_CAPS_LOCK = 280, // Key: Caps lock + KEY_SCROLL_LOCK = 281, // Key: Scroll down + KEY_NUM_LOCK = 282, // Key: Num lock + KEY_PRINT_SCREEN = 283, // Key: Print screen + KEY_PAUSE = 284, // Key: Pause + KEY_F1 = 290, // Key: F1 + KEY_F2 = 291, // Key: F2 + KEY_F3 = 292, // Key: F3 + KEY_F4 = 293, // Key: F4 + KEY_F5 = 294, // Key: F5 + KEY_F6 = 295, // Key: F6 + KEY_F7 = 296, // Key: F7 + KEY_F8 = 297, // Key: F8 + KEY_F9 = 298, // Key: F9 + KEY_F10 = 299, // Key: F10 + KEY_F11 = 300, // Key: F11 + KEY_F12 = 301, // Key: F12 + KEY_LEFT_SHIFT = 340, // Key: Shift left + KEY_LEFT_CONTROL = 341, // Key: Control left + KEY_LEFT_ALT = 342, // Key: Alt left + KEY_LEFT_SUPER = 343, // Key: Super left + KEY_RIGHT_SHIFT = 344, // Key: Shift right + KEY_RIGHT_CONTROL = 345, // Key: Control right + KEY_RIGHT_ALT = 346, // Key: Alt right + KEY_RIGHT_SUPER = 347, // Key: Super right + KEY_KB_MENU = 348, // Key: KB menu + // Keypad keys + KEY_KP_0 = 320, // Key: Keypad 0 + KEY_KP_1 = 321, // Key: Keypad 1 + KEY_KP_2 = 322, // Key: Keypad 2 + KEY_KP_3 = 323, // Key: Keypad 3 + KEY_KP_4 = 324, // Key: Keypad 4 + KEY_KP_5 = 325, // Key: Keypad 5 + KEY_KP_6 = 326, // Key: Keypad 6 + KEY_KP_7 = 327, // Key: Keypad 7 + KEY_KP_8 = 328, // Key: Keypad 8 + KEY_KP_9 = 329, // Key: Keypad 9 + KEY_KP_DECIMAL = 330, // Key: Keypad . + KEY_KP_DIVIDE = 331, // Key: Keypad / + KEY_KP_MULTIPLY = 332, // Key: Keypad * + KEY_KP_SUBTRACT = 333, // Key: Keypad - + KEY_KP_ADD = 334, // Key: Keypad + + KEY_KP_ENTER = 335, // Key: Keypad Enter + KEY_KP_EQUAL = 336, // Key: Keypad = + // Android key buttons + KEY_BACK = 4, // Key: Android back button + KEY_MENU = 82, // Key: Android menu button + KEY_VOLUME_UP = 24, // Key: Android volume up button + KEY_VOLUME_DOWN = 25 // Key: Android volume down button +} KeyboardKey; + +// Add backwards compatibility support for deprecated names +#define MOUSE_LEFT_BUTTON MOUSE_BUTTON_LEFT +#define MOUSE_RIGHT_BUTTON MOUSE_BUTTON_RIGHT +#define MOUSE_MIDDLE_BUTTON MOUSE_BUTTON_MIDDLE + +// Mouse buttons +typedef enum { + MOUSE_BUTTON_LEFT = 0, // Mouse button left + MOUSE_BUTTON_RIGHT = 1, // Mouse button right + MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel) + MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device) + MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device) + MOUSE_BUTTON_FORWARD = 5, // Mouse button fordward (advanced mouse device) + MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device) +} MouseButton; + +// Mouse cursor +typedef enum { + MOUSE_CURSOR_DEFAULT = 0, // Default pointer shape + MOUSE_CURSOR_ARROW = 1, // Arrow shape + MOUSE_CURSOR_IBEAM = 2, // Text writing cursor shape + MOUSE_CURSOR_CROSSHAIR = 3, // Cross shape + MOUSE_CURSOR_POINTING_HAND = 4, // Pointing hand cursor + MOUSE_CURSOR_RESIZE_EW = 5, // Horizontal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape + MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_ALL = 9, // The omni-directional resize/move cursor shape + MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape +} MouseCursor; + +// Gamepad buttons +typedef enum { + GAMEPAD_BUTTON_UNKNOWN = 0, // Unknown button, just for error checking + GAMEPAD_BUTTON_LEFT_FACE_UP, // Gamepad left DPAD up button + GAMEPAD_BUTTON_LEFT_FACE_RIGHT, // Gamepad left DPAD right button + GAMEPAD_BUTTON_LEFT_FACE_DOWN, // Gamepad left DPAD down button + GAMEPAD_BUTTON_LEFT_FACE_LEFT, // Gamepad left DPAD left button + GAMEPAD_BUTTON_RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) + GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Square, Xbox: X) + GAMEPAD_BUTTON_RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) + GAMEPAD_BUTTON_RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Circle, Xbox: B) + GAMEPAD_BUTTON_LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button + GAMEPAD_BUTTON_LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_1, // Gamepad top/back trigger right (one), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button + GAMEPAD_BUTTON_MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) + GAMEPAD_BUTTON_MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) + GAMEPAD_BUTTON_MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) + GAMEPAD_BUTTON_LEFT_THUMB, // Gamepad joystick pressed button left + GAMEPAD_BUTTON_RIGHT_THUMB // Gamepad joystick pressed button right +} GamepadButton; + +// Gamepad axis +typedef enum { + GAMEPAD_AXIS_LEFT_X = 0, // Gamepad left stick X axis + GAMEPAD_AXIS_LEFT_Y = 1, // Gamepad left stick Y axis + GAMEPAD_AXIS_RIGHT_X = 2, // Gamepad right stick X axis + GAMEPAD_AXIS_RIGHT_Y = 3, // Gamepad right stick Y axis + GAMEPAD_AXIS_LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] + GAMEPAD_AXIS_RIGHT_TRIGGER = 5 // Gamepad back trigger right, pressure level: [1..-1] +} GamepadAxis; + +// Material map index +typedef enum { + MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE) + MATERIAL_MAP_METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR) + MATERIAL_MAP_NORMAL, // Normal material + MATERIAL_MAP_ROUGHNESS, // Roughness material + MATERIAL_MAP_OCCLUSION, // Ambient occlusion material + MATERIAL_MAP_EMISSION, // Emission material + MATERIAL_MAP_HEIGHT, // Heightmap material + MATERIAL_MAP_CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_BRDF // Brdf material +} MaterialMapIndex; + +#define MATERIAL_MAP_DIFFUSE MATERIAL_MAP_ALBEDO +#define MATERIAL_MAP_SPECULAR MATERIAL_MAP_METALNESS + +// Shader location index +typedef enum { + SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) + SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) + SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf +} ShaderLocationIndex; + +#define SHADER_LOC_MAP_DIFFUSE SHADER_LOC_MAP_ALBEDO +#define SHADER_LOC_MAP_SPECULAR SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + SHADER_UNIFORM_INT, // Shader uniform type: int + SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} ShaderUniformDataType; + +// Shader attribute data types +typedef enum { + SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} ShaderAttributeDataType; + +// Pixel formats +// NOTE: Support depends on OpenGL version and platform +typedef enum { + PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} PixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + TEXTURE_FILTER_BILINEAR, // Linear filtering + TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} TextureFilter; + +// Texture parameters: wrap mode +typedef enum { + TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode + TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode + TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode + TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode +} TextureWrap; + +// Cubemap layouts +typedef enum { + CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type + CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces + CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by an horizontal line with faces + CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces + CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces + CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirectangular map) +} CubemapLayout; + +// Font type, defines generation method +typedef enum { + FONT_DEFAULT = 0, // Default font generation, anti-aliased + FONT_BITMAP, // Bitmap font generation, no anti-aliasing + FONT_SDF // SDF font generation, requires external shader +} FontType; + +// Color blending modes (pre-defined) +typedef enum { + BLEND_ALPHA = 0, // Blend textures considering alpha (default) + BLEND_ADDITIVE, // Blend textures adding colors + BLEND_MULTIPLIED, // Blend textures multiplying colors + BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + BLEND_ALPHA_PREMUL, // Blend premultiplied textures considering alpha + BLEND_CUSTOM // Blend textures using custom src/dst factors (use rlSetBlendMode()) +} BlendMode; + +// Gesture +// NOTE: It could be used as flags to enable only some gestures +typedef enum { + GESTURE_NONE = 0, // No gesture + GESTURE_TAP = 1, // Tap gesture + GESTURE_DOUBLETAP = 2, // Double tap gesture + GESTURE_HOLD = 4, // Hold gesture + GESTURE_DRAG = 8, // Drag gesture + GESTURE_SWIPE_RIGHT = 16, // Swipe right gesture + GESTURE_SWIPE_LEFT = 32, // Swipe left gesture + GESTURE_SWIPE_UP = 64, // Swipe up gesture + GESTURE_SWIPE_DOWN = 128, // Swipe down gesture + GESTURE_PINCH_IN = 256, // Pinch in gesture + GESTURE_PINCH_OUT = 512 // Pinch out gesture +} Gesture; + +// Camera system modes +typedef enum { + CAMERA_CUSTOM = 0, // Custom camera + CAMERA_FREE, // Free camera + CAMERA_ORBITAL, // Orbital camera + CAMERA_FIRST_PERSON, // First person camera + CAMERA_THIRD_PERSON // Third person camera +} CameraMode; + +// Camera projection +typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection +} CameraProjection; + +// N-patch layout +typedef enum { + NPATCH_NINE_PATCH = 0, // Npatch layout: 3x3 tiles + NPATCH_THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles + NPATCH_THREE_PATCH_HORIZONTAL // Npatch layout: 3x1 tiles +} NPatchLayout; + +// Callbacks to hook some internal functions +// WARNING: This callbacks are intended for advance users +typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages +typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, unsigned int *bytesRead); // FileIO: Load binary data +typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, unsigned int bytesToWrite); // FileIO: Save binary data +typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data +typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +// Window-related functions +RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context +RLAPI bool WindowShouldClose(void); // Check if KEY_ESCAPE pressed or Close icon pressed +RLAPI void CloseWindow(void); // Close window and unload OpenGL context +RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully +RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen +RLAPI bool IsWindowHidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP) +RLAPI bool IsWindowMinimized(void); // Check if window is currently minimized (only PLATFORM_DESKTOP) +RLAPI bool IsWindowMaximized(void); // Check if window is currently maximized (only PLATFORM_DESKTOP) +RLAPI bool IsWindowFocused(void); // Check if window is currently focused (only PLATFORM_DESKTOP) +RLAPI bool IsWindowResized(void); // Check if window has been resized last frame +RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled +RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP) +RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags +RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) +RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) +RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) +RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) +RLAPI void SetWindowIcon(Image image); // Set icon for window (only PLATFORM_DESKTOP) +RLAPI void SetWindowTitle(const char *title); // Set title for window (only PLATFORM_DESKTOP) +RLAPI void SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP) +RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode) +RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowSize(int width, int height); // Set window dimensions +RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP) +RLAPI void *GetWindowHandle(void); // Get native window handle +RLAPI int GetScreenWidth(void); // Get current screen width +RLAPI int GetScreenHeight(void); // Get current screen height +RLAPI int GetRenderWidth(void); // Get current render width (it considers HiDPI) +RLAPI int GetRenderHeight(void); // Get current render height (it considers HiDPI) +RLAPI int GetMonitorCount(void); // Get number of connected monitors +RLAPI int GetCurrentMonitor(void); // Get current connected monitor +RLAPI Vector2 GetMonitorPosition(int monitor); // Get specified monitor position +RLAPI int GetMonitorWidth(int monitor); // Get specified monitor width (max available by monitor) +RLAPI int GetMonitorHeight(int monitor); // Get specified monitor height (max available by monitor) +RLAPI int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres +RLAPI int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres +RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate +RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor +RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor +RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the primary monitor +RLAPI void SetClipboardText(const char *text); // Set clipboard text content +RLAPI const char *GetClipboardText(void); // Get clipboard text content + +// Custom frame control functions +// NOTE: Those functions are intended for advance users that want full control over the frame processing +// By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timming + PollInputEvents() +// To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL +RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing) +RLAPI void PollInputEvents(void); // Register all input events +RLAPI void WaitTime(float ms); // Wait for some milliseconds (halt program execution) + +// Cursor-related functions +RLAPI void ShowCursor(void); // Shows cursor +RLAPI void HideCursor(void); // Hides cursor +RLAPI bool IsCursorHidden(void); // Check if cursor is not visible +RLAPI void EnableCursor(void); // Enables cursor (unlock cursor) +RLAPI void DisableCursor(void); // Disables cursor (lock cursor) +RLAPI bool IsCursorOnScreen(void); // Check if cursor is on the screen + +// Drawing-related functions +RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color) +RLAPI void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing +RLAPI void EndDrawing(void); // End canvas drawing and swap buffers (double buffering) +RLAPI void BeginMode2D(Camera2D camera); // Begin 2D mode with custom camera (2D) +RLAPI void EndMode2D(void); // Ends 2D mode with custom camera +RLAPI void BeginMode3D(Camera3D camera); // Begin 3D mode with custom camera (3D) +RLAPI void EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode +RLAPI void BeginTextureMode(RenderTexture2D target); // Begin drawing to render texture +RLAPI void EndTextureMode(void); // Ends drawing to render texture +RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing +RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader) +RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) +RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending) +RLAPI void BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +RLAPI void EndScissorMode(void); // End scissor mode +RLAPI void BeginVrStereoMode(VrStereoConfig config); // Begin stereo rendering (requires VR simulator) +RLAPI void EndVrStereoMode(void); // End stereo rendering (requires VR simulator) + +// VR stereo config functions for VR simulator +RLAPI VrStereoConfig LoadVrStereoConfig(VrDeviceInfo device); // Load VR stereo config for VR simulator device parameters +RLAPI void UnloadVrStereoConfig(VrStereoConfig config); // Unload VR stereo config + +// Shader management functions +// NOTE: Shader functionality is not available on OpenGL 1.1 +RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location +RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location +RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value +RLAPI void SetShaderValueV(Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector +RLAPI void SetShaderValueMatrix(Shader shader, int locIndex, Matrix mat); // Set shader uniform value (matrix 4x4) +RLAPI void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture); // Set shader uniform value for texture (sampler2d) +RLAPI void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) + +// Screen-space-related functions +RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Get a ray trace from mouse position +RLAPI Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix) +RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix +RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position +RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position +RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position +RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position + +// Timing-related functions +RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum) +RLAPI int GetFPS(void); // Get current FPS +RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) +RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow() + +// Misc. functions +RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included) +RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator +RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) +RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) + +RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) +RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level +RLAPI void *MemAlloc(int size); // Internal memory allocator +RLAPI void *MemRealloc(void *ptr, int size); // Internal memory reallocator +RLAPI void MemFree(void *ptr); // Internal memory free + +// Set custom callbacks +// WARNING: Callbacks setup is intended for advance users +RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log +RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // Set custom file binary data loader +RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); // Set custom file binary data saver +RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom file text data loader +RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver + +// Files management functions +RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) +RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() +RLAPI bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write), returns true on success +RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string +RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText() +RLAPI bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success +RLAPI bool FileExists(const char *fileName); // Check if file exists +RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists +RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) +RLAPI int GetFileLength(const char *fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) +RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: '.png') +RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string +RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) +RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) +RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) +RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string) +RLAPI const char *GetApplicationDirectory(void); // Get the directory if the running application (uses static string) +RLAPI char **GetDirectoryFiles(const char *dirPath, int *count); // Get filenames in a directory path (memory should be freed) +RLAPI void ClearDirectoryFiles(void); // Clear directory files paths buffers (free memory) +RLAPI bool ChangeDirectory(const char *dir); // Change working directory, return true on success +RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window +RLAPI char **GetDroppedFiles(int *count); // Get dropped files names (memory should be freed) +RLAPI void ClearDroppedFiles(void); // Clear dropped files paths buffer (free memory) +RLAPI long GetFileModTime(const char *fileName); // Get file modification time (last write time) + +// Compression/Encoding functionality +RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm) +RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm) +RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string +RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data + +// Persistent storage management +RLAPI bool SaveStorageValue(unsigned int position, int value); // Save integer value to storage file (to defined position), returns true on success +RLAPI int LoadStorageValue(unsigned int position); // Load integer value from storage file (from defined position) + +RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available) + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Input-related functions: keyboard +RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once +RLAPI bool IsKeyDown(int key); // Check if a key is being pressed +RLAPI bool IsKeyReleased(int key); // Check if a key has been released once +RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed +RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC) +RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty +RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty + +// Input-related functions: gamepads +RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available +RLAPI const char *GetGamepadName(int gamepad); // Get gamepad internal name id +RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Check if a gamepad button has been pressed once +RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Check if a gamepad button is being pressed +RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Check if a gamepad button has been released once +RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Check if a gamepad button is NOT being pressed +RLAPI int GetGamepadButtonPressed(void); // Get the last gamepad button pressed +RLAPI int GetGamepadAxisCount(int gamepad); // Get gamepad axis count for a gamepad +RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Get axis movement value for a gamepad axis +RLAPI int SetGamepadMappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) + +// Input-related functions: mouse +RLAPI bool IsMouseButtonPressed(int button); // Check if a mouse button has been pressed once +RLAPI bool IsMouseButtonDown(int button); // Check if a mouse button is being pressed +RLAPI bool IsMouseButtonReleased(int button); // Check if a mouse button has been released once +RLAPI bool IsMouseButtonUp(int button); // Check if a mouse button is NOT being pressed +RLAPI int GetMouseX(void); // Get mouse position X +RLAPI int GetMouseY(void); // Get mouse position Y +RLAPI Vector2 GetMousePosition(void); // Get mouse position XY +RLAPI Vector2 GetMouseDelta(void); // Get mouse delta between frames +RLAPI void SetMousePosition(int x, int y); // Set mouse position XY +RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset +RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling +RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement Y +RLAPI void SetMouseCursor(int cursor); // Set mouse cursor + +// Input-related functions: touch +RLAPI int GetTouchX(void); // Get touch position X for touch point 0 (relative to screen size) +RLAPI int GetTouchY(void); // Get touch position Y for touch point 0 (relative to screen size) +RLAPI Vector2 GetTouchPosition(int index); // Get touch position XY for a touch point index (relative to screen size) +RLAPI int GetTouchPointId(int index); // Get touch point identifier for given index +RLAPI int GetTouchPointCount(void); // Get number of touch points + +//------------------------------------------------------------------------------------ +// Gestures and Touch Handling Functions (Module: rgestures) +//------------------------------------------------------------------------------------ +RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags +RLAPI bool IsGestureDetected(int gesture); // Check if a gesture have been detected +RLAPI int GetGestureDetected(void); // Get latest detected gesture +RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds +RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector +RLAPI float GetGestureDragAngle(void); // Get gesture drag angle +RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle + +//------------------------------------------------------------------------------------ +// Camera System Functions (Module: rcamera) +//------------------------------------------------------------------------------------ +RLAPI void SetCameraMode(Camera camera, int mode); // Set camera mode (multiple camera modes available) +RLAPI void UpdateCamera(Camera *camera); // Update camera position for selected mode + +RLAPI void SetCameraPanControl(int keyPan); // Set camera pan key to combine with mouse movement (free camera) +RLAPI void SetCameraAltControl(int keyAlt); // Set camera alt key to combine with mouse movement (free camera) +RLAPI void SetCameraSmoothZoomControl(int keySmoothZoom); // Set camera smooth zoom key to combine with mouse (free camera) +RLAPI void SetCameraMoveControls(int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown); // Set camera move controls (1st person and 3rd person cameras) + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ +// Set texture and rectangle to be used on shapes drawing +// NOTE: It can be useful when using basic shapes and one single font, +// defining a font char white rectangle would allow drawing everything in a single draw call +RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); // Set texture and rectangle to be used on shapes drawing + +// Basic shapes drawing functions +RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel +RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) +RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version) +RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line defining thickness +RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line using cubic-bezier curves in-out +RLAPI void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thick, Color color); // Draw line using quadratic bezier curves with a control point +RLAPI void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thick, Color color); // Draw line using cubic bezier curves with 2 control points +RLAPI void DrawLineStrip(Vector2 *points, int pointCount, Color color); // Draw lines sequence +RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle +RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline +RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle +RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring +RLAPI void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring outline +RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a vertical-gradient-filled rectangle +RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a horizontal-gradient-filled rectangle +RLAPI void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // Draw a gradient-filled rectangle with custom vertex colors +RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters +RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +RLAPI void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, float lineThick, Color color); // Draw rectangle with rounded edges outline +RLAPI void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +RLAPI void DrawTriangleFan(Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +RLAPI void DrawTriangleStrip(Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides +RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters + +// Basic shapes collision detection functions +RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference +RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] +RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ + +// Image loading functions +// NOTE: This functions do not require GPU access +RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) +RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' +RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data +RLAPI Image LoadImageFromScreen(void); // Load image from screen buffer and (screenshot) +RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM) +RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success +RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success + +// Image generation functions +RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color +RLAPI Image GenImageGradientV(int width, int height, Color top, Color bottom); // Generate image: vertical gradient +RLAPI Image GenImageGradientH(int width, int height, Color left, Color right); // Generate image: horizontal gradient +RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise +RLAPI Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells + +// Image manipulation functions +RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) +RLAPI Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) +RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +RLAPI void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) +RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +RLAPI void ImageAlphaCrop(Image *image, float threshold); // Crop image depending on alpha value +RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image +RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel +RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +RLAPI void ImageMipmaps(Image *image); // Compute all mipmap levels for a provided image +RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +RLAPI void ImageFlipVertical(Image *image); // Flip image vertically +RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg +RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg +RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint +RLAPI void ImageColorInvert(Image *image); // Modify image color: invert +RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale +RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +RLAPI void ImageColorReplace(Image *image, Color color, Color replace); // Modify image color: replace color +RLAPI Color *LoadImageColors(Image image); // Load color data from image as a Color array (RGBA - 32bit) +RLAPI Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorCount); // Load colors palette from image as a Color array (RGBA - 32bit) +RLAPI void UnloadImageColors(Color *colors); // Unload color data loaded with LoadImageColors() +RLAPI void UnloadImagePalette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +RLAPI Rectangle GetImageAlphaBorder(Image image, float threshold); // Get image alpha border rectangle +RLAPI Color GetImageColor(Image image, int x, int y); // Get image pixel color at (x, y) position + +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +RLAPI void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle within an image +RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw circle within an image (Vector version) +RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) + +// Texture loading functions +// NOTE: These functions require GPU access +RLAPI Texture2D LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) +RLAPI Texture2D LoadTextureFromImage(Image image); // Load texture from image data +RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported +RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) +RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM) +RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM) +RLAPI void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data +RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data + +// Texture configuration functions +RLAPI void GenTextureMipmaps(Texture2D *texture); // Generate GPU mipmaps for a texture +RLAPI void SetTextureFilter(Texture2D texture, int filter); // Set texture scaling filter mode +RLAPI void SetTextureWrap(Texture2D texture, int wrap); // Set texture wrapping mode + +// Texture drawing functions +RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 +RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +RLAPI void DrawTextureQuad(Texture2D texture, Vector2 tiling, Vector2 offset, Rectangle quad, Color tint); // Draw texture quad with tiling and offset parameters +RLAPI void DrawTextureTiled(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint); // Draw part of a texture (defined by a rectangle) with rotation and scale tiled into dest. +RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters +RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely +RLAPI void DrawTexturePoly(Texture2D texture, Vector2 center, Vector2 *points, Vector2 *texcoords, int pointCount, Color tint); // Draw a textured polygon + +// Color/pixel related functions +RLAPI Color Fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI int ColorToInt(Color color); // Get hexadecimal value for a Color +RLAPI Vector4 ColorNormalize(Color color); // Get Color normalized as float [0..1] +RLAPI Color ColorFromNormalized(Vector4 normalized); // Get Color from normalized values [0..1] +RLAPI Vector3 ColorToHSV(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1] +RLAPI Color ColorFromHSV(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1] +RLAPI Color ColorAlpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint +RLAPI Color GetColor(unsigned int hexValue); // Get Color structure from hexadecimal value +RLAPI Color GetPixelColor(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +RLAPI void SetPixelColor(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +RLAPI int GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ + +// Font loading/unloading functions +RLAPI Font GetFontDefault(void); // Get the default Font +RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) +RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount); // Load font from file with extended parameters, use NULL for fontChars and 0 for glyphCount to load the default character set +RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) +RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' +RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount, int type); // Load font data for further use +RLAPI Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **recs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +RLAPI void UnloadFontData(GlyphInfo *chars, int glyphCount); // Unload font chars info data (RAM) +RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM) +RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success + +// Text drawing functions +RLAPI void DrawFPS(int posX, int posY); // Draw current FPS +RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation) +RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) +RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int count, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint) + +// Text font info functions +RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font +RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found +RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found +RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found + +// Text codepoints management functions (unicode characters) +RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter +RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory +RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string +RLAPI int GetCodepoint(const char *text, int *bytesProcessed); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode one codepoint into UTF-8 byte array (array length returned as parameter) +RLAPI char *TextCodepointsToUTF8(const int *codepoints, int length); // Encode text as codepoints array into UTF-8 text string (WARNING: memory must be freed!) + +// Text strings management functions (no UTF-8 strings, only byte chars) +// NOTE: Some strings allocate memory internally for returned strings, just be careful! +RLAPI int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied +RLAPI bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal +RLAPI unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending +RLAPI const char *TextFormat(const char *text, ...); // Text formatting with variables (sprintf() style) +RLAPI const char *TextSubtext(const char *text, int position, int length); // Get a piece of a text string +RLAPI char *TextReplace(char *text, const char *replace, const char *by); // Replace text string (WARNING: memory must be freed!) +RLAPI char *TextInsert(const char *text, const char *insert, int position); // Insert text in a position (WARNING: memory must be freed!) +RLAPI const char *TextJoin(const char **textList, int count, const char *delimiter); // Join text strings with delimiter +RLAPI const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings +RLAPI void TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor! +RLAPI int TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string +RLAPI const char *TextToUpper(const char *text); // Get upper case version of provided string +RLAPI const char *TextToLower(const char *text); // Get lower case version of provided string +RLAPI const char *TextToPascal(const char *text); // Get Pascal case notation version of provided string +RLAPI int TextToInteger(const char *text); // Get integer value from text (negative values not supported) + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Basic geometric 3D shapes drawing functions +RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +RLAPI void DrawPoint3D(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +RLAPI void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +RLAPI void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleStrip3D(Vector3 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube +RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +RLAPI void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured +RLAPI void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color); // Draw cube with a region of a texture +RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos +RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos +RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line +RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Model management functions +RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials) +RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) +RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +RLAPI void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM) +RLAPI BoundingBox GetModelBoundingBox(Model model); // Compute model bounding box limits (considers all meshes) + +// Model drawing functions +RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters +RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) +RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float size, Color tint); // Draw a billboard texture +RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source +RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint); // Draw a billboard texture defined by source and rotation + +// Mesh management functions +RLAPI void UploadMesh(Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids +RLAPI void UpdateMeshBuffer(Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index +RLAPI void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU +RLAPI void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +RLAPI void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms +RLAPI bool ExportMesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success +RLAPI BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +RLAPI void GenMeshTangents(Mesh *mesh); // Compute mesh tangents +RLAPI void GenMeshBinormals(Mesh *mesh); // Compute mesh binormals + +// Mesh generation functions +RLAPI Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh +RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +RLAPI Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh +RLAPI Mesh GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +RLAPI Mesh GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh +RLAPI Mesh GenMeshCone(float radius, float height, int slices); // Generate cone/pyramid mesh +RLAPI Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh +RLAPI Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +RLAPI Mesh GenMeshHeightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data + +// Material loading/unloading functions +RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +RLAPI Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +RLAPI void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM) +RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) +RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh + +// Model animations loading/unloading functions +RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, unsigned int *animCount); // Load model animations from file +RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose +RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data +RLAPI void UnloadModelAnimations(ModelAnimation *animations, unsigned int count); // Unload animation array data +RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match + +// Collision detection functions +RLAPI bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Check collision between two spheres +RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Check collision between two bounding boxes +RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere +RLAPI RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere +RLAPI RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box +RLAPI RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RLAPI RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ +typedef void (*AudioCallback)(void *bufferData, unsigned int frames); + +// Audio device management functions +RLAPI void InitAudioDevice(void); // Initialize audio device and context +RLAPI void CloseAudioDevice(void); // Close the audio device and context +RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully +RLAPI void SetMasterVolume(float volume); // Set master volume (listener) + +// Wave/Sound loading/unloading functions +RLAPI Wave LoadWave(const char *fileName); // Load wave data from file +RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' +RLAPI Sound LoadSound(const char *fileName); // Load sound from file +RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data +RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data +RLAPI void UnloadWave(Wave wave); // Unload wave data +RLAPI void UnloadSound(Sound sound); // Unload sound +RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success + +// Wave/Sound management functions +RLAPI void PlaySound(Sound sound); // Play a sound +RLAPI void StopSound(Sound sound); // Stop playing a sound +RLAPI void PauseSound(Sound sound); // Pause a sound +RLAPI void ResumeSound(Sound sound); // Resume a paused sound +RLAPI void PlaySoundMulti(Sound sound); // Play a sound (using multichannel buffer pool) +RLAPI void StopSoundMulti(void); // Stop any sound playing (using multichannel buffer pool) +RLAPI int GetSoundsPlaying(void); // Get number of sounds playing in the multichannel +RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing +RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +RLAPI void SetSoundPan(Sound sound, float pan); // Set pan for a sound (0.5 is center) +RLAPI Wave WaveCopy(Wave wave); // Copy a wave to a new wave +RLAPI void WaveCrop(Wave *wave, int initSample, int finalSample); // Crop a wave to defined samples range +RLAPI void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format +RLAPI float *LoadWaveSamples(Wave wave); // Load samples data from wave as a 32bit float data array +RLAPI void UnloadWaveSamples(float *samples); // Unload samples data loaded with LoadWaveSamples() + +// Music management functions +RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file +RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data +RLAPI void UnloadMusicStream(Music music); // Unload music stream +RLAPI void PlayMusicStream(Music music); // Start music playing +RLAPI bool IsMusicStreamPlaying(Music music); // Check if music is playing +RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming +RLAPI void StopMusicStream(Music music); // Stop music playing +RLAPI void PauseMusicStream(Music music); // Pause music playing +RLAPI void ResumeMusicStream(Music music); // Resume playing paused music +RLAPI void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds) +RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) +RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +RLAPI void SetMusicPan(Music music, float pan); // Set pan for a music (0.5 is center) +RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds) +RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) + +// AudioStream management functions +RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) +RLAPI void UnloadAudioStream(AudioStream stream); // Unload audio stream and free memory +RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data +RLAPI bool IsAudioStreamProcessed(AudioStream stream); // Check if any audio stream buffers requires refill +RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream +RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream +RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream +RLAPI bool IsAudioStreamPlaying(AudioStream stream); // Check if audio stream is playing +RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream +RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level) +RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level) +RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) +RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams +RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data + +RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); +RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); + +#if defined(__cplusplus) +} +#endif + +#endif // RAYLIB_H diff --git a/roms/IBM Logo.ch8 b/roms/IBM Logo.ch8 Binary files differnew file mode 100644 index 0000000..113338e --- /dev/null +++ b/roms/IBM Logo.ch8 diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..9043f8c --- /dev/null +++ b/src/main.zig @@ -0,0 +1,84 @@ +const std = @import("std"); +const ray = @import("raylib.zig"); +//const ray = @cImport({ +// @cInclude("raylib.h"); +//}); + +const screenWidth: u32 = 64 * 10; +const screenHeight: u32 = (32 * 10) + 24; +const RndGen = std.rand.DefaultPrng; +var Rnd = RndGen.init(0); +var chip8_screen: ray.RenderTexture = undefined; + +const Chip8 = struct { + opcode: u16 = 0, + memory: [4096]u8 = [_]u8{0} ** 4096, + V: [16]u8 = [_]u8{0} ** 16, + I: u16 = 0, + pc: u16 = 0, + gfx: [64 * 32]bool = [_]bool{false} ** (64 * 32), + delay_timer: u8 = 0, + sound_timer: u8 = 0, + stack: [16]u16 = [_]u16{0} ** 16, + sp: u16 = 0, + key: u8 = 0, + + pub fn new() Chip8 { + return Chip8{}; + } + + pub fn load_game(file_name: []u8) []u8 { + // TODO: handle file reading here + //var file = try std.fs.cwd().openFile(file_name, .{}); + //defer file.close(); + return file_name; + } +}; + +var chip8 = Chip8{}; + +pub fn main() void { + setup_graphics(); + defer ray.CloseWindow(); + var exitWindow: bool = false; + + while (!ray.WindowShouldClose() and !exitWindow) { + ray.BeginDrawing(); + defer ray.EndDrawing(); + + ray.ClearBackground(ray.RAYWHITE); + exitWindow = ray.GuiWindowBox(ray.Rectangle{ .x = 0, .y = 0, .height = screenHeight, .width = screenWidth }, "CHIP-8"); + + update_screen(&chip8_screen, chip8.gfx); + ray.DrawTextureEx(chip8_screen.texture, ray.Vector2{ .x = 0, .y = 24 }, 0, 10, ray.WHITE); + } +} + +fn setup_graphics() void { + + //for (chip8_screen) |*pixel, index_usize| { + // var index: u32 = @intCast(u32, index_usize); + // pixel.* = chip8_pixel{ .location = ray.Rectangle{ .x = 10 * @intToFloat(f32, @mod(index, 64)), .y = 24 + 10 * @intToFloat(f32, (index / 64)), .width = 10, .height = 10 } }; + //} + + ray.InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window"); + chip8_screen = ray.LoadRenderTexture(64, 32); + ray.SetTargetFPS(60); +} + +fn update_screen(screen: *ray.RenderTexture, pixels: [2048]bool) void { + ray.BeginTextureMode(screen.*); + for (pixels) |_, index_usize| { + var rnd: u8 = Rnd.random().int(u8); + if (rnd < (256 / 2)) { + rnd = 255; + } else { + rnd = 0; + } + + var index: u32 = @intCast(u32, index_usize); + //var index_char: u8 = @intCast(u8, @mod(@intCast(u32, index_usize), 256)); + ray.DrawRectangleRec(ray.Rectangle{ .x = @intToFloat(f32, @mod(index, 64)), .y = @intToFloat(f32, (index / 64)), .width = 1, .height = 1 }, ray.Color{ .r = rnd, .g = rnd, .b = rnd, .a = 255 }); + } + ray.EndTextureMode(); +} diff --git a/src/raylib.zig b/src/raylib.zig new file mode 100644 index 0000000..9d801c8 --- /dev/null +++ b/src/raylib.zig @@ -0,0 +1,8789 @@ +pub const __builtin_bswap16 = @import("std").zig.c_builtins.__builtin_bswap16; +pub const __builtin_bswap32 = @import("std").zig.c_builtins.__builtin_bswap32; +pub const __builtin_bswap64 = @import("std").zig.c_builtins.__builtin_bswap64; +pub const __builtin_signbit = @import("std").zig.c_builtins.__builtin_signbit; +pub const __builtin_signbitf = @import("std").zig.c_builtins.__builtin_signbitf; +pub const __builtin_popcount = @import("std").zig.c_builtins.__builtin_popcount; +pub const __builtin_ctz = @import("std").zig.c_builtins.__builtin_ctz; +pub const __builtin_clz = @import("std").zig.c_builtins.__builtin_clz; +pub const __builtin_sqrt = @import("std").zig.c_builtins.__builtin_sqrt; +pub const __builtin_sqrtf = @import("std").zig.c_builtins.__builtin_sqrtf; +pub const __builtin_sin = @import("std").zig.c_builtins.__builtin_sin; +pub const __builtin_sinf = @import("std").zig.c_builtins.__builtin_sinf; +pub const __builtin_cos = @import("std").zig.c_builtins.__builtin_cos; +pub const __builtin_cosf = @import("std").zig.c_builtins.__builtin_cosf; +pub const __builtin_exp = @import("std").zig.c_builtins.__builtin_exp; +pub const __builtin_expf = @import("std").zig.c_builtins.__builtin_expf; +pub const __builtin_exp2 = @import("std").zig.c_builtins.__builtin_exp2; +pub const __builtin_exp2f = @import("std").zig.c_builtins.__builtin_exp2f; +pub const __builtin_log = @import("std").zig.c_builtins.__builtin_log; +pub const __builtin_logf = @import("std").zig.c_builtins.__builtin_logf; +pub const __builtin_log2 = @import("std").zig.c_builtins.__builtin_log2; +pub const __builtin_log2f = @import("std").zig.c_builtins.__builtin_log2f; +pub const __builtin_log10 = @import("std").zig.c_builtins.__builtin_log10; +pub const __builtin_log10f = @import("std").zig.c_builtins.__builtin_log10f; +pub const __builtin_abs = @import("std").zig.c_builtins.__builtin_abs; +pub const __builtin_fabs = @import("std").zig.c_builtins.__builtin_fabs; +pub const __builtin_fabsf = @import("std").zig.c_builtins.__builtin_fabsf; +pub const __builtin_floor = @import("std").zig.c_builtins.__builtin_floor; +pub const __builtin_floorf = @import("std").zig.c_builtins.__builtin_floorf; +pub const __builtin_ceil = @import("std").zig.c_builtins.__builtin_ceil; +pub const __builtin_ceilf = @import("std").zig.c_builtins.__builtin_ceilf; +pub const __builtin_trunc = @import("std").zig.c_builtins.__builtin_trunc; +pub const __builtin_truncf = @import("std").zig.c_builtins.__builtin_truncf; +pub const __builtin_round = @import("std").zig.c_builtins.__builtin_round; +pub const __builtin_roundf = @import("std").zig.c_builtins.__builtin_roundf; +pub const __builtin_strlen = @import("std").zig.c_builtins.__builtin_strlen; +pub const __builtin_strcmp = @import("std").zig.c_builtins.__builtin_strcmp; +pub const __builtin_object_size = @import("std").zig.c_builtins.__builtin_object_size; +pub const __builtin___memset_chk = @import("std").zig.c_builtins.__builtin___memset_chk; +pub const __builtin_memset = @import("std").zig.c_builtins.__builtin_memset; +pub const __builtin___memcpy_chk = @import("std").zig.c_builtins.__builtin___memcpy_chk; +pub const __builtin_memcpy = @import("std").zig.c_builtins.__builtin_memcpy; +pub const __builtin_expect = @import("std").zig.c_builtins.__builtin_expect; +pub const __builtin_nanf = @import("std").zig.c_builtins.__builtin_nanf; +pub const __builtin_huge_valf = @import("std").zig.c_builtins.__builtin_huge_valf; +pub const __builtin_inff = @import("std").zig.c_builtins.__builtin_inff; +pub const __builtin_isnan = @import("std").zig.c_builtins.__builtin_isnan; +pub const __builtin_isinf = @import("std").zig.c_builtins.__builtin_isinf; +pub const __builtin_isinf_sign = @import("std").zig.c_builtins.__builtin_isinf_sign; +pub const __has_builtin = @import("std").zig.c_builtins.__has_builtin; +pub const __builtin_assume = @import("std").zig.c_builtins.__builtin_assume; +pub const __builtin_unreachable = @import("std").zig.c_builtins.__builtin_unreachable; +pub const __builtin_constant_p = @import("std").zig.c_builtins.__builtin_constant_p; +pub const __builtin_mul_overflow = @import("std").zig.c_builtins.__builtin_mul_overflow; +pub const struct___va_list_tag = extern struct { + gp_offset: c_uint, + fp_offset: c_uint, + overflow_arg_area: ?*anyopaque, + reg_save_area: ?*anyopaque, +}; +pub const __builtin_va_list = [1]struct___va_list_tag; +pub const va_list = __builtin_va_list; +pub const __gnuc_va_list = __builtin_va_list; +pub const struct_Vector2 = extern struct { + x: f32, + y: f32, +}; +pub const Vector2 = struct_Vector2; +pub const struct_Vector3 = extern struct { + x: f32, + y: f32, + z: f32, +}; +pub const Vector3 = struct_Vector3; +pub const struct_Vector4 = extern struct { + x: f32, + y: f32, + z: f32, + w: f32, +}; +pub const Vector4 = struct_Vector4; +pub const Quaternion = Vector4; +pub const struct_Matrix = extern struct { + m0: f32, + m4: f32, + m8: f32, + m12: f32, + m1: f32, + m5: f32, + m9: f32, + m13: f32, + m2: f32, + m6: f32, + m10: f32, + m14: f32, + m3: f32, + m7: f32, + m11: f32, + m15: f32, +}; +pub const Matrix = struct_Matrix; +pub const struct_Color = extern struct { + r: u8, + g: u8, + b: u8, + a: u8, +}; +pub const Color = struct_Color; +pub const struct_Rectangle = extern struct { + x: f32, + y: f32, + width: f32, + height: f32, +}; +pub const Rectangle = struct_Rectangle; +pub const struct_Image = extern struct { + data: ?*anyopaque, + width: c_int, + height: c_int, + mipmaps: c_int, + format: c_int, +}; +pub const Image = struct_Image; +pub const struct_Texture = extern struct { + id: c_uint, + width: c_int, + height: c_int, + mipmaps: c_int, + format: c_int, +}; +pub const Texture = struct_Texture; +pub const Texture2D = Texture; +pub const TextureCubemap = Texture; +pub const struct_RenderTexture = extern struct { + id: c_uint, + texture: Texture, + depth: Texture, +}; +pub const RenderTexture = struct_RenderTexture; +pub const RenderTexture2D = RenderTexture; +pub const struct_NPatchInfo = extern struct { + source: Rectangle, + left: c_int, + top: c_int, + right: c_int, + bottom: c_int, + layout: c_int, +}; +pub const NPatchInfo = struct_NPatchInfo; +pub const struct_GlyphInfo = extern struct { + value: c_int, + offsetX: c_int, + offsetY: c_int, + advanceX: c_int, + image: Image, +}; +pub const GlyphInfo = struct_GlyphInfo; +pub const struct_Font = extern struct { + baseSize: c_int, + glyphCount: c_int, + glyphPadding: c_int, + texture: Texture2D, + recs: [*c]Rectangle, + glyphs: [*c]GlyphInfo, +}; +pub const Font = struct_Font; +pub const struct_Camera3D = extern struct { + position: Vector3, + target: Vector3, + up: Vector3, + fovy: f32, + projection: c_int, +}; +pub const Camera3D = struct_Camera3D; +pub const Camera = Camera3D; +pub const struct_Camera2D = extern struct { + offset: Vector2, + target: Vector2, + rotation: f32, + zoom: f32, +}; +pub const Camera2D = struct_Camera2D; +pub const struct_Mesh = extern struct { + vertexCount: c_int, + triangleCount: c_int, + vertices: [*c]f32, + texcoords: [*c]f32, + texcoords2: [*c]f32, + normals: [*c]f32, + tangents: [*c]f32, + colors: [*c]u8, + indices: [*c]c_ushort, + animVertices: [*c]f32, + animNormals: [*c]f32, + boneIds: [*c]u8, + boneWeights: [*c]f32, + vaoId: c_uint, + vboId: [*c]c_uint, +}; +pub const Mesh = struct_Mesh; +pub const struct_Shader = extern struct { + id: c_uint, + locs: [*c]c_int, +}; +pub const Shader = struct_Shader; +pub const struct_MaterialMap = extern struct { + texture: Texture2D, + color: Color, + value: f32, +}; +pub const MaterialMap = struct_MaterialMap; +pub const struct_Material = extern struct { + shader: Shader, + maps: [*c]MaterialMap, + params: [4]f32, +}; +pub const Material = struct_Material; +pub const struct_Transform = extern struct { + translation: Vector3, + rotation: Quaternion, + scale: Vector3, +}; +pub const Transform = struct_Transform; +pub const struct_BoneInfo = extern struct { + name: [32]u8, + parent: c_int, +}; +pub const BoneInfo = struct_BoneInfo; +pub const struct_Model = extern struct { + transform: Matrix, + meshCount: c_int, + materialCount: c_int, + meshes: [*c]Mesh, + materials: [*c]Material, + meshMaterial: [*c]c_int, + boneCount: c_int, + bones: [*c]BoneInfo, + bindPose: [*c]Transform, +}; +pub const Model = struct_Model; +pub const struct_ModelAnimation = extern struct { + boneCount: c_int, + frameCount: c_int, + bones: [*c]BoneInfo, + framePoses: [*c][*c]Transform, +}; +pub const ModelAnimation = struct_ModelAnimation; +pub const struct_Ray = extern struct { + position: Vector3, + direction: Vector3, +}; +pub const Ray = struct_Ray; +pub const struct_RayCollision = extern struct { + hit: bool, + distance: f32, + point: Vector3, + normal: Vector3, +}; +pub const RayCollision = struct_RayCollision; +pub const struct_BoundingBox = extern struct { + min: Vector3, + max: Vector3, +}; +pub const BoundingBox = struct_BoundingBox; +pub const struct_Wave = extern struct { + frameCount: c_uint, + sampleRate: c_uint, + sampleSize: c_uint, + channels: c_uint, + data: ?*anyopaque, +}; +pub const Wave = struct_Wave; +pub const struct_rAudioBuffer = opaque {}; +pub const rAudioBuffer = struct_rAudioBuffer; +pub const struct_rAudioProcessor = opaque {}; +pub const rAudioProcessor = struct_rAudioProcessor; +pub const struct_AudioStream = extern struct { + buffer: ?*rAudioBuffer, + processor: ?*rAudioProcessor, + sampleRate: c_uint, + sampleSize: c_uint, + channels: c_uint, +}; +pub const AudioStream = struct_AudioStream; +pub const struct_Sound = extern struct { + stream: AudioStream, + frameCount: c_uint, +}; +pub const Sound = struct_Sound; +pub const struct_Music = extern struct { + stream: AudioStream, + frameCount: c_uint, + looping: bool, + ctxType: c_int, + ctxData: ?*anyopaque, +}; +pub const Music = struct_Music; +pub const struct_VrDeviceInfo = extern struct { + hResolution: c_int, + vResolution: c_int, + hScreenSize: f32, + vScreenSize: f32, + vScreenCenter: f32, + eyeToScreenDistance: f32, + lensSeparationDistance: f32, + interpupillaryDistance: f32, + lensDistortionValues: [4]f32, + chromaAbCorrection: [4]f32, +}; +pub const VrDeviceInfo = struct_VrDeviceInfo; +pub const struct_VrStereoConfig = extern struct { + projection: [2]Matrix, + viewOffset: [2]Matrix, + leftLensCenter: [2]f32, + rightLensCenter: [2]f32, + leftScreenCenter: [2]f32, + rightScreenCenter: [2]f32, + scale: [2]f32, + scaleIn: [2]f32, +}; +pub const VrStereoConfig = struct_VrStereoConfig; +pub const FLAG_VSYNC_HINT: c_int = 64; +pub const FLAG_FULLSCREEN_MODE: c_int = 2; +pub const FLAG_WINDOW_RESIZABLE: c_int = 4; +pub const FLAG_WINDOW_UNDECORATED: c_int = 8; +pub const FLAG_WINDOW_HIDDEN: c_int = 128; +pub const FLAG_WINDOW_MINIMIZED: c_int = 512; +pub const FLAG_WINDOW_MAXIMIZED: c_int = 1024; +pub const FLAG_WINDOW_UNFOCUSED: c_int = 2048; +pub const FLAG_WINDOW_TOPMOST: c_int = 4096; +pub const FLAG_WINDOW_ALWAYS_RUN: c_int = 256; +pub const FLAG_WINDOW_TRANSPARENT: c_int = 16; +pub const FLAG_WINDOW_HIGHDPI: c_int = 8192; +pub const FLAG_MSAA_4X_HINT: c_int = 32; +pub const FLAG_INTERLACED_HINT: c_int = 65536; +pub const ConfigFlags = c_uint; +pub const LOG_ALL: c_int = 0; +pub const LOG_TRACE: c_int = 1; +pub const LOG_DEBUG: c_int = 2; +pub const LOG_INFO: c_int = 3; +pub const LOG_WARNING: c_int = 4; +pub const LOG_ERROR: c_int = 5; +pub const LOG_FATAL: c_int = 6; +pub const LOG_NONE: c_int = 7; +pub const TraceLogLevel = c_uint; +pub const KEY_NULL: c_int = 0; +pub const KEY_APOSTROPHE: c_int = 39; +pub const KEY_COMMA: c_int = 44; +pub const KEY_MINUS: c_int = 45; +pub const KEY_PERIOD: c_int = 46; +pub const KEY_SLASH: c_int = 47; +pub const KEY_ZERO: c_int = 48; +pub const KEY_ONE: c_int = 49; +pub const KEY_TWO: c_int = 50; +pub const KEY_THREE: c_int = 51; +pub const KEY_FOUR: c_int = 52; +pub const KEY_FIVE: c_int = 53; +pub const KEY_SIX: c_int = 54; +pub const KEY_SEVEN: c_int = 55; +pub const KEY_EIGHT: c_int = 56; +pub const KEY_NINE: c_int = 57; +pub const KEY_SEMICOLON: c_int = 59; +pub const KEY_EQUAL: c_int = 61; +pub const KEY_A: c_int = 65; +pub const KEY_B: c_int = 66; +pub const KEY_C: c_int = 67; +pub const KEY_D: c_int = 68; +pub const KEY_E: c_int = 69; +pub const KEY_F: c_int = 70; +pub const KEY_G: c_int = 71; +pub const KEY_H: c_int = 72; +pub const KEY_I: c_int = 73; +pub const KEY_J: c_int = 74; +pub const KEY_K: c_int = 75; +pub const KEY_L: c_int = 76; +pub const KEY_M: c_int = 77; +pub const KEY_N: c_int = 78; +pub const KEY_O: c_int = 79; +pub const KEY_P: c_int = 80; +pub const KEY_Q: c_int = 81; +pub const KEY_R: c_int = 82; +pub const KEY_S: c_int = 83; +pub const KEY_T: c_int = 84; +pub const KEY_U: c_int = 85; +pub const KEY_V: c_int = 86; +pub const KEY_W: c_int = 87; +pub const KEY_X: c_int = 88; +pub const KEY_Y: c_int = 89; +pub const KEY_Z: c_int = 90; +pub const KEY_LEFT_BRACKET: c_int = 91; +pub const KEY_BACKSLASH: c_int = 92; +pub const KEY_RIGHT_BRACKET: c_int = 93; +pub const KEY_GRAVE: c_int = 96; +pub const KEY_SPACE: c_int = 32; +pub const KEY_ESCAPE: c_int = 256; +pub const KEY_ENTER: c_int = 257; +pub const KEY_TAB: c_int = 258; +pub const KEY_BACKSPACE: c_int = 259; +pub const KEY_INSERT: c_int = 260; +pub const KEY_DELETE: c_int = 261; +pub const KEY_RIGHT: c_int = 262; +pub const KEY_LEFT: c_int = 263; +pub const KEY_DOWN: c_int = 264; +pub const KEY_UP: c_int = 265; +pub const KEY_PAGE_UP: c_int = 266; +pub const KEY_PAGE_DOWN: c_int = 267; +pub const KEY_HOME: c_int = 268; +pub const KEY_END: c_int = 269; +pub const KEY_CAPS_LOCK: c_int = 280; +pub const KEY_SCROLL_LOCK: c_int = 281; +pub const KEY_NUM_LOCK: c_int = 282; +pub const KEY_PRINT_SCREEN: c_int = 283; +pub const KEY_PAUSE: c_int = 284; +pub const KEY_F1: c_int = 290; +pub const KEY_F2: c_int = 291; +pub const KEY_F3: c_int = 292; +pub const KEY_F4: c_int = 293; +pub const KEY_F5: c_int = 294; +pub const KEY_F6: c_int = 295; +pub const KEY_F7: c_int = 296; +pub const KEY_F8: c_int = 297; +pub const KEY_F9: c_int = 298; +pub const KEY_F10: c_int = 299; +pub const KEY_F11: c_int = 300; +pub const KEY_F12: c_int = 301; +pub const KEY_LEFT_SHIFT: c_int = 340; +pub const KEY_LEFT_CONTROL: c_int = 341; +pub const KEY_LEFT_ALT: c_int = 342; +pub const KEY_LEFT_SUPER: c_int = 343; +pub const KEY_RIGHT_SHIFT: c_int = 344; +pub const KEY_RIGHT_CONTROL: c_int = 345; +pub const KEY_RIGHT_ALT: c_int = 346; +pub const KEY_RIGHT_SUPER: c_int = 347; +pub const KEY_KB_MENU: c_int = 348; +pub const KEY_KP_0: c_int = 320; +pub const KEY_KP_1: c_int = 321; +pub const KEY_KP_2: c_int = 322; +pub const KEY_KP_3: c_int = 323; +pub const KEY_KP_4: c_int = 324; +pub const KEY_KP_5: c_int = 325; +pub const KEY_KP_6: c_int = 326; +pub const KEY_KP_7: c_int = 327; +pub const KEY_KP_8: c_int = 328; +pub const KEY_KP_9: c_int = 329; +pub const KEY_KP_DECIMAL: c_int = 330; +pub const KEY_KP_DIVIDE: c_int = 331; +pub const KEY_KP_MULTIPLY: c_int = 332; +pub const KEY_KP_SUBTRACT: c_int = 333; +pub const KEY_KP_ADD: c_int = 334; +pub const KEY_KP_ENTER: c_int = 335; +pub const KEY_KP_EQUAL: c_int = 336; +pub const KEY_BACK: c_int = 4; +pub const KEY_MENU: c_int = 82; +pub const KEY_VOLUME_UP: c_int = 24; +pub const KEY_VOLUME_DOWN: c_int = 25; +pub const KeyboardKey = c_uint; +pub const MOUSE_BUTTON_LEFT: c_int = 0; +pub const MOUSE_BUTTON_RIGHT: c_int = 1; +pub const MOUSE_BUTTON_MIDDLE: c_int = 2; +pub const MOUSE_BUTTON_SIDE: c_int = 3; +pub const MOUSE_BUTTON_EXTRA: c_int = 4; +pub const MOUSE_BUTTON_FORWARD: c_int = 5; +pub const MOUSE_BUTTON_BACK: c_int = 6; +pub const MouseButton = c_uint; +pub const MOUSE_CURSOR_DEFAULT: c_int = 0; +pub const MOUSE_CURSOR_ARROW: c_int = 1; +pub const MOUSE_CURSOR_IBEAM: c_int = 2; +pub const MOUSE_CURSOR_CROSSHAIR: c_int = 3; +pub const MOUSE_CURSOR_POINTING_HAND: c_int = 4; +pub const MOUSE_CURSOR_RESIZE_EW: c_int = 5; +pub const MOUSE_CURSOR_RESIZE_NS: c_int = 6; +pub const MOUSE_CURSOR_RESIZE_NWSE: c_int = 7; +pub const MOUSE_CURSOR_RESIZE_NESW: c_int = 8; +pub const MOUSE_CURSOR_RESIZE_ALL: c_int = 9; +pub const MOUSE_CURSOR_NOT_ALLOWED: c_int = 10; +pub const MouseCursor = c_uint; +pub const GAMEPAD_BUTTON_UNKNOWN: c_int = 0; +pub const GAMEPAD_BUTTON_LEFT_FACE_UP: c_int = 1; +pub const GAMEPAD_BUTTON_LEFT_FACE_RIGHT: c_int = 2; +pub const GAMEPAD_BUTTON_LEFT_FACE_DOWN: c_int = 3; +pub const GAMEPAD_BUTTON_LEFT_FACE_LEFT: c_int = 4; +pub const GAMEPAD_BUTTON_RIGHT_FACE_UP: c_int = 5; +pub const GAMEPAD_BUTTON_RIGHT_FACE_RIGHT: c_int = 6; +pub const GAMEPAD_BUTTON_RIGHT_FACE_DOWN: c_int = 7; +pub const GAMEPAD_BUTTON_RIGHT_FACE_LEFT: c_int = 8; +pub const GAMEPAD_BUTTON_LEFT_TRIGGER_1: c_int = 9; +pub const GAMEPAD_BUTTON_LEFT_TRIGGER_2: c_int = 10; +pub const GAMEPAD_BUTTON_RIGHT_TRIGGER_1: c_int = 11; +pub const GAMEPAD_BUTTON_RIGHT_TRIGGER_2: c_int = 12; +pub const GAMEPAD_BUTTON_MIDDLE_LEFT: c_int = 13; +pub const GAMEPAD_BUTTON_MIDDLE: c_int = 14; +pub const GAMEPAD_BUTTON_MIDDLE_RIGHT: c_int = 15; +pub const GAMEPAD_BUTTON_LEFT_THUMB: c_int = 16; +pub const GAMEPAD_BUTTON_RIGHT_THUMB: c_int = 17; +pub const GamepadButton = c_uint; +pub const GAMEPAD_AXIS_LEFT_X: c_int = 0; +pub const GAMEPAD_AXIS_LEFT_Y: c_int = 1; +pub const GAMEPAD_AXIS_RIGHT_X: c_int = 2; +pub const GAMEPAD_AXIS_RIGHT_Y: c_int = 3; +pub const GAMEPAD_AXIS_LEFT_TRIGGER: c_int = 4; +pub const GAMEPAD_AXIS_RIGHT_TRIGGER: c_int = 5; +pub const GamepadAxis = c_uint; +pub const MATERIAL_MAP_ALBEDO: c_int = 0; +pub const MATERIAL_MAP_METALNESS: c_int = 1; +pub const MATERIAL_MAP_NORMAL: c_int = 2; +pub const MATERIAL_MAP_ROUGHNESS: c_int = 3; +pub const MATERIAL_MAP_OCCLUSION: c_int = 4; +pub const MATERIAL_MAP_EMISSION: c_int = 5; +pub const MATERIAL_MAP_HEIGHT: c_int = 6; +pub const MATERIAL_MAP_CUBEMAP: c_int = 7; +pub const MATERIAL_MAP_IRRADIANCE: c_int = 8; +pub const MATERIAL_MAP_PREFILTER: c_int = 9; +pub const MATERIAL_MAP_BRDF: c_int = 10; +pub const MaterialMapIndex = c_uint; +pub const SHADER_LOC_VERTEX_POSITION: c_int = 0; +pub const SHADER_LOC_VERTEX_TEXCOORD01: c_int = 1; +pub const SHADER_LOC_VERTEX_TEXCOORD02: c_int = 2; +pub const SHADER_LOC_VERTEX_NORMAL: c_int = 3; +pub const SHADER_LOC_VERTEX_TANGENT: c_int = 4; +pub const SHADER_LOC_VERTEX_COLOR: c_int = 5; +pub const SHADER_LOC_MATRIX_MVP: c_int = 6; +pub const SHADER_LOC_MATRIX_VIEW: c_int = 7; +pub const SHADER_LOC_MATRIX_PROJECTION: c_int = 8; +pub const SHADER_LOC_MATRIX_MODEL: c_int = 9; +pub const SHADER_LOC_MATRIX_NORMAL: c_int = 10; +pub const SHADER_LOC_VECTOR_VIEW: c_int = 11; +pub const SHADER_LOC_COLOR_DIFFUSE: c_int = 12; +pub const SHADER_LOC_COLOR_SPECULAR: c_int = 13; +pub const SHADER_LOC_COLOR_AMBIENT: c_int = 14; +pub const SHADER_LOC_MAP_ALBEDO: c_int = 15; +pub const SHADER_LOC_MAP_METALNESS: c_int = 16; +pub const SHADER_LOC_MAP_NORMAL: c_int = 17; +pub const SHADER_LOC_MAP_ROUGHNESS: c_int = 18; +pub const SHADER_LOC_MAP_OCCLUSION: c_int = 19; +pub const SHADER_LOC_MAP_EMISSION: c_int = 20; +pub const SHADER_LOC_MAP_HEIGHT: c_int = 21; +pub const SHADER_LOC_MAP_CUBEMAP: c_int = 22; +pub const SHADER_LOC_MAP_IRRADIANCE: c_int = 23; +pub const SHADER_LOC_MAP_PREFILTER: c_int = 24; +pub const SHADER_LOC_MAP_BRDF: c_int = 25; +pub const ShaderLocationIndex = c_uint; +pub const SHADER_UNIFORM_FLOAT: c_int = 0; +pub const SHADER_UNIFORM_VEC2: c_int = 1; +pub const SHADER_UNIFORM_VEC3: c_int = 2; +pub const SHADER_UNIFORM_VEC4: c_int = 3; +pub const SHADER_UNIFORM_INT: c_int = 4; +pub const SHADER_UNIFORM_IVEC2: c_int = 5; +pub const SHADER_UNIFORM_IVEC3: c_int = 6; +pub const SHADER_UNIFORM_IVEC4: c_int = 7; +pub const SHADER_UNIFORM_SAMPLER2D: c_int = 8; +pub const ShaderUniformDataType = c_uint; +pub const SHADER_ATTRIB_FLOAT: c_int = 0; +pub const SHADER_ATTRIB_VEC2: c_int = 1; +pub const SHADER_ATTRIB_VEC3: c_int = 2; +pub const SHADER_ATTRIB_VEC4: c_int = 3; +pub const ShaderAttributeDataType = c_uint; +pub const PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: c_int = 1; +pub const PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: c_int = 2; +pub const PIXELFORMAT_UNCOMPRESSED_R5G6B5: c_int = 3; +pub const PIXELFORMAT_UNCOMPRESSED_R8G8B8: c_int = 4; +pub const PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: c_int = 5; +pub const PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: c_int = 6; +pub const PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: c_int = 7; +pub const PIXELFORMAT_UNCOMPRESSED_R32: c_int = 8; +pub const PIXELFORMAT_UNCOMPRESSED_R32G32B32: c_int = 9; +pub const PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: c_int = 10; +pub const PIXELFORMAT_COMPRESSED_DXT1_RGB: c_int = 11; +pub const PIXELFORMAT_COMPRESSED_DXT1_RGBA: c_int = 12; +pub const PIXELFORMAT_COMPRESSED_DXT3_RGBA: c_int = 13; +pub const PIXELFORMAT_COMPRESSED_DXT5_RGBA: c_int = 14; +pub const PIXELFORMAT_COMPRESSED_ETC1_RGB: c_int = 15; +pub const PIXELFORMAT_COMPRESSED_ETC2_RGB: c_int = 16; +pub const PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: c_int = 17; +pub const PIXELFORMAT_COMPRESSED_PVRT_RGB: c_int = 18; +pub const PIXELFORMAT_COMPRESSED_PVRT_RGBA: c_int = 19; +pub const PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: c_int = 20; +pub const PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: c_int = 21; +pub const PixelFormat = c_uint; +pub const TEXTURE_FILTER_POINT: c_int = 0; +pub const TEXTURE_FILTER_BILINEAR: c_int = 1; +pub const TEXTURE_FILTER_TRILINEAR: c_int = 2; +pub const TEXTURE_FILTER_ANISOTROPIC_4X: c_int = 3; +pub const TEXTURE_FILTER_ANISOTROPIC_8X: c_int = 4; +pub const TEXTURE_FILTER_ANISOTROPIC_16X: c_int = 5; +pub const TextureFilter = c_uint; +pub const TEXTURE_WRAP_REPEAT: c_int = 0; +pub const TEXTURE_WRAP_CLAMP: c_int = 1; +pub const TEXTURE_WRAP_MIRROR_REPEAT: c_int = 2; +pub const TEXTURE_WRAP_MIRROR_CLAMP: c_int = 3; +pub const TextureWrap = c_uint; +pub const CUBEMAP_LAYOUT_AUTO_DETECT: c_int = 0; +pub const CUBEMAP_LAYOUT_LINE_VERTICAL: c_int = 1; +pub const CUBEMAP_LAYOUT_LINE_HORIZONTAL: c_int = 2; +pub const CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR: c_int = 3; +pub const CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE: c_int = 4; +pub const CUBEMAP_LAYOUT_PANORAMA: c_int = 5; +pub const CubemapLayout = c_uint; +pub const FONT_DEFAULT: c_int = 0; +pub const FONT_BITMAP: c_int = 1; +pub const FONT_SDF: c_int = 2; +pub const FontType = c_uint; +pub const BLEND_ALPHA: c_int = 0; +pub const BLEND_ADDITIVE: c_int = 1; +pub const BLEND_MULTIPLIED: c_int = 2; +pub const BLEND_ADD_COLORS: c_int = 3; +pub const BLEND_SUBTRACT_COLORS: c_int = 4; +pub const BLEND_ALPHA_PREMUL: c_int = 5; +pub const BLEND_CUSTOM: c_int = 6; +pub const BlendMode = c_uint; +pub const GESTURE_NONE: c_int = 0; +pub const GESTURE_TAP: c_int = 1; +pub const GESTURE_DOUBLETAP: c_int = 2; +pub const GESTURE_HOLD: c_int = 4; +pub const GESTURE_DRAG: c_int = 8; +pub const GESTURE_SWIPE_RIGHT: c_int = 16; +pub const GESTURE_SWIPE_LEFT: c_int = 32; +pub const GESTURE_SWIPE_UP: c_int = 64; +pub const GESTURE_SWIPE_DOWN: c_int = 128; +pub const GESTURE_PINCH_IN: c_int = 256; +pub const GESTURE_PINCH_OUT: c_int = 512; +pub const Gesture = c_uint; +pub const CAMERA_CUSTOM: c_int = 0; +pub const CAMERA_FREE: c_int = 1; +pub const CAMERA_ORBITAL: c_int = 2; +pub const CAMERA_FIRST_PERSON: c_int = 3; +pub const CAMERA_THIRD_PERSON: c_int = 4; +pub const CameraMode = c_uint; +pub const CAMERA_PERSPECTIVE: c_int = 0; +pub const CAMERA_ORTHOGRAPHIC: c_int = 1; +pub const CameraProjection = c_uint; +pub const NPATCH_NINE_PATCH: c_int = 0; +pub const NPATCH_THREE_PATCH_VERTICAL: c_int = 1; +pub const NPATCH_THREE_PATCH_HORIZONTAL: c_int = 2; +pub const NPatchLayout = c_uint; +pub const TraceLogCallback = ?fn (c_int, [*c]const u8, [*c]struct___va_list_tag) callconv(.C) void; +pub const LoadFileDataCallback = ?fn ([*c]const u8, [*c]c_uint) callconv(.C) [*c]u8; +pub const SaveFileDataCallback = ?fn ([*c]const u8, ?*anyopaque, c_uint) callconv(.C) bool; +pub const LoadFileTextCallback = ?fn ([*c]const u8) callconv(.C) [*c]u8; +pub const SaveFileTextCallback = ?fn ([*c]const u8, [*c]u8) callconv(.C) bool; +pub extern fn InitWindow(width: c_int, height: c_int, title: [*c]const u8) void; +pub extern fn WindowShouldClose() bool; +pub extern fn CloseWindow() void; +pub extern fn IsWindowReady() bool; +pub extern fn IsWindowFullscreen() bool; +pub extern fn IsWindowHidden() bool; +pub extern fn IsWindowMinimized() bool; +pub extern fn IsWindowMaximized() bool; +pub extern fn IsWindowFocused() bool; +pub extern fn IsWindowResized() bool; +pub extern fn IsWindowState(flag: c_uint) bool; +pub extern fn SetWindowState(flags: c_uint) void; +pub extern fn ClearWindowState(flags: c_uint) void; +pub extern fn ToggleFullscreen() void; +pub extern fn MaximizeWindow() void; +pub extern fn MinimizeWindow() void; +pub extern fn RestoreWindow() void; +pub extern fn SetWindowIcon(image: Image) void; +pub extern fn SetWindowTitle(title: [*c]const u8) void; +pub extern fn SetWindowPosition(x: c_int, y: c_int) void; +pub extern fn SetWindowMonitor(monitor: c_int) void; +pub extern fn SetWindowMinSize(width: c_int, height: c_int) void; +pub extern fn SetWindowSize(width: c_int, height: c_int) void; +pub extern fn SetWindowOpacity(opacity: f32) void; +pub extern fn GetWindowHandle() ?*anyopaque; +pub extern fn GetScreenWidth() c_int; +pub extern fn GetScreenHeight() c_int; +pub extern fn GetRenderWidth() c_int; +pub extern fn GetRenderHeight() c_int; +pub extern fn GetMonitorCount() c_int; +pub extern fn GetCurrentMonitor() c_int; +pub extern fn GetMonitorPosition(monitor: c_int) Vector2; +pub extern fn GetMonitorWidth(monitor: c_int) c_int; +pub extern fn GetMonitorHeight(monitor: c_int) c_int; +pub extern fn GetMonitorPhysicalWidth(monitor: c_int) c_int; +pub extern fn GetMonitorPhysicalHeight(monitor: c_int) c_int; +pub extern fn GetMonitorRefreshRate(monitor: c_int) c_int; +pub extern fn GetWindowPosition() Vector2; +pub extern fn GetWindowScaleDPI() Vector2; +pub extern fn GetMonitorName(monitor: c_int) [*c]const u8; +pub extern fn SetClipboardText(text: [*c]const u8) void; +pub extern fn GetClipboardText() [*c]const u8; +pub extern fn SwapScreenBuffer() void; +pub extern fn PollInputEvents() void; +pub extern fn WaitTime(ms: f32) void; +pub extern fn ShowCursor() void; +pub extern fn HideCursor() void; +pub extern fn IsCursorHidden() bool; +pub extern fn EnableCursor() void; +pub extern fn DisableCursor() void; +pub extern fn IsCursorOnScreen() bool; +pub extern fn ClearBackground(color: Color) void; +pub extern fn BeginDrawing() void; +pub extern fn EndDrawing() void; +pub extern fn BeginMode2D(camera: Camera2D) void; +pub extern fn EndMode2D() void; +pub extern fn BeginMode3D(camera: Camera3D) void; +pub extern fn EndMode3D() void; +pub extern fn BeginTextureMode(target: RenderTexture2D) void; +pub extern fn EndTextureMode() void; +pub extern fn BeginShaderMode(shader: Shader) void; +pub extern fn EndShaderMode() void; +pub extern fn BeginBlendMode(mode: c_int) void; +pub extern fn EndBlendMode() void; +pub extern fn BeginScissorMode(x: c_int, y: c_int, width: c_int, height: c_int) void; +pub extern fn EndScissorMode() void; +pub extern fn BeginVrStereoMode(config: VrStereoConfig) void; +pub extern fn EndVrStereoMode() void; +pub extern fn LoadVrStereoConfig(device: VrDeviceInfo) VrStereoConfig; +pub extern fn UnloadVrStereoConfig(config: VrStereoConfig) void; +pub extern fn LoadShader(vsFileName: [*c]const u8, fsFileName: [*c]const u8) Shader; +pub extern fn LoadShaderFromMemory(vsCode: [*c]const u8, fsCode: [*c]const u8) Shader; +pub extern fn GetShaderLocation(shader: Shader, uniformName: [*c]const u8) c_int; +pub extern fn GetShaderLocationAttrib(shader: Shader, attribName: [*c]const u8) c_int; +pub extern fn SetShaderValue(shader: Shader, locIndex: c_int, value: ?*const anyopaque, uniformType: c_int) void; +pub extern fn SetShaderValueV(shader: Shader, locIndex: c_int, value: ?*const anyopaque, uniformType: c_int, count: c_int) void; +pub extern fn SetShaderValueMatrix(shader: Shader, locIndex: c_int, mat: Matrix) void; +pub extern fn SetShaderValueTexture(shader: Shader, locIndex: c_int, texture: Texture2D) void; +pub extern fn UnloadShader(shader: Shader) void; +pub extern fn GetMouseRay(mousePosition: Vector2, camera: Camera) Ray; +pub extern fn GetCameraMatrix(camera: Camera) Matrix; +pub extern fn GetCameraMatrix2D(camera: Camera2D) Matrix; +pub extern fn GetWorldToScreen(position: Vector3, camera: Camera) Vector2; +pub extern fn GetWorldToScreenEx(position: Vector3, camera: Camera, width: c_int, height: c_int) Vector2; +pub extern fn GetWorldToScreen2D(position: Vector2, camera: Camera2D) Vector2; +pub extern fn GetScreenToWorld2D(position: Vector2, camera: Camera2D) Vector2; +pub extern fn SetTargetFPS(fps: c_int) void; +pub extern fn GetFPS() c_int; +pub extern fn GetFrameTime() f32; +pub extern fn GetTime() f64; +pub extern fn GetRandomValue(min: c_int, max: c_int) c_int; +pub extern fn SetRandomSeed(seed: c_uint) void; +pub extern fn TakeScreenshot(fileName: [*c]const u8) void; +pub extern fn SetConfigFlags(flags: c_uint) void; +pub extern fn TraceLog(logLevel: c_int, text: [*c]const u8, ...) void; +pub extern fn SetTraceLogLevel(logLevel: c_int) void; +pub extern fn MemAlloc(size: c_int) ?*anyopaque; +pub extern fn MemRealloc(ptr: ?*anyopaque, size: c_int) ?*anyopaque; +pub extern fn MemFree(ptr: ?*anyopaque) void; +pub extern fn SetTraceLogCallback(callback: TraceLogCallback) void; +pub extern fn SetLoadFileDataCallback(callback: LoadFileDataCallback) void; +pub extern fn SetSaveFileDataCallback(callback: SaveFileDataCallback) void; +pub extern fn SetLoadFileTextCallback(callback: LoadFileTextCallback) void; +pub extern fn SetSaveFileTextCallback(callback: SaveFileTextCallback) void; +pub extern fn LoadFileData(fileName: [*c]const u8, bytesRead: [*c]c_uint) [*c]u8; +pub extern fn UnloadFileData(data: [*c]u8) void; +pub extern fn SaveFileData(fileName: [*c]const u8, data: ?*anyopaque, bytesToWrite: c_uint) bool; +pub extern fn LoadFileText(fileName: [*c]const u8) [*c]u8; +pub extern fn UnloadFileText(text: [*c]u8) void; +pub extern fn SaveFileText(fileName: [*c]const u8, text: [*c]u8) bool; +pub extern fn FileExists(fileName: [*c]const u8) bool; +pub extern fn DirectoryExists(dirPath: [*c]const u8) bool; +pub extern fn IsFileExtension(fileName: [*c]const u8, ext: [*c]const u8) bool; +pub extern fn GetFileLength(fileName: [*c]const u8) c_int; +pub extern fn GetFileExtension(fileName: [*c]const u8) [*c]const u8; +pub extern fn GetFileName(filePath: [*c]const u8) [*c]const u8; +pub extern fn GetFileNameWithoutExt(filePath: [*c]const u8) [*c]const u8; +pub extern fn GetDirectoryPath(filePath: [*c]const u8) [*c]const u8; +pub extern fn GetPrevDirectoryPath(dirPath: [*c]const u8) [*c]const u8; +pub extern fn GetWorkingDirectory() [*c]const u8; +pub extern fn GetApplicationDirectory() [*c]const u8; +pub extern fn GetDirectoryFiles(dirPath: [*c]const u8, count: [*c]c_int) [*c][*c]u8; +pub extern fn ClearDirectoryFiles() void; +pub extern fn ChangeDirectory(dir: [*c]const u8) bool; +pub extern fn IsFileDropped() bool; +pub extern fn GetDroppedFiles(count: [*c]c_int) [*c][*c]u8; +pub extern fn ClearDroppedFiles() void; +pub extern fn GetFileModTime(fileName: [*c]const u8) c_long; +pub extern fn CompressData(data: [*c]const u8, dataSize: c_int, compDataSize: [*c]c_int) [*c]u8; +pub extern fn DecompressData(compData: [*c]const u8, compDataSize: c_int, dataSize: [*c]c_int) [*c]u8; +pub extern fn EncodeDataBase64(data: [*c]const u8, dataSize: c_int, outputSize: [*c]c_int) [*c]u8; +pub extern fn DecodeDataBase64(data: [*c]const u8, outputSize: [*c]c_int) [*c]u8; +pub extern fn SaveStorageValue(position: c_uint, value: c_int) bool; +pub extern fn LoadStorageValue(position: c_uint) c_int; +pub extern fn OpenURL(url: [*c]const u8) void; +pub extern fn IsKeyPressed(key: c_int) bool; +pub extern fn IsKeyDown(key: c_int) bool; +pub extern fn IsKeyReleased(key: c_int) bool; +pub extern fn IsKeyUp(key: c_int) bool; +pub extern fn SetExitKey(key: c_int) void; +pub extern fn GetKeyPressed() c_int; +pub extern fn GetCharPressed() c_int; +pub extern fn IsGamepadAvailable(gamepad: c_int) bool; +pub extern fn GetGamepadName(gamepad: c_int) [*c]const u8; +pub extern fn IsGamepadButtonPressed(gamepad: c_int, button: c_int) bool; +pub extern fn IsGamepadButtonDown(gamepad: c_int, button: c_int) bool; +pub extern fn IsGamepadButtonReleased(gamepad: c_int, button: c_int) bool; +pub extern fn IsGamepadButtonUp(gamepad: c_int, button: c_int) bool; +pub extern fn GetGamepadButtonPressed() c_int; +pub extern fn GetGamepadAxisCount(gamepad: c_int) c_int; +pub extern fn GetGamepadAxisMovement(gamepad: c_int, axis: c_int) f32; +pub extern fn SetGamepadMappings(mappings: [*c]const u8) c_int; +pub extern fn IsMouseButtonPressed(button: c_int) bool; +pub extern fn IsMouseButtonDown(button: c_int) bool; +pub extern fn IsMouseButtonReleased(button: c_int) bool; +pub extern fn IsMouseButtonUp(button: c_int) bool; +pub extern fn GetMouseX() c_int; +pub extern fn GetMouseY() c_int; +pub extern fn GetMousePosition() Vector2; +pub extern fn GetMouseDelta() Vector2; +pub extern fn SetMousePosition(x: c_int, y: c_int) void; +pub extern fn SetMouseOffset(offsetX: c_int, offsetY: c_int) void; +pub extern fn SetMouseScale(scaleX: f32, scaleY: f32) void; +pub extern fn GetMouseWheelMove() f32; +pub extern fn SetMouseCursor(cursor: c_int) void; +pub extern fn GetTouchX() c_int; +pub extern fn GetTouchY() c_int; +pub extern fn GetTouchPosition(index: c_int) Vector2; +pub extern fn GetTouchPointId(index: c_int) c_int; +pub extern fn GetTouchPointCount() c_int; +pub extern fn SetGesturesEnabled(flags: c_uint) void; +pub extern fn IsGestureDetected(gesture: c_int) bool; +pub extern fn GetGestureDetected() c_int; +pub extern fn GetGestureHoldDuration() f32; +pub extern fn GetGestureDragVector() Vector2; +pub extern fn GetGestureDragAngle() f32; +pub extern fn GetGesturePinchVector() Vector2; +pub extern fn GetGesturePinchAngle() f32; +pub extern fn SetCameraMode(camera: Camera, mode: c_int) void; +pub extern fn UpdateCamera(camera: [*c]Camera) void; +pub extern fn SetCameraPanControl(keyPan: c_int) void; +pub extern fn SetCameraAltControl(keyAlt: c_int) void; +pub extern fn SetCameraSmoothZoomControl(keySmoothZoom: c_int) void; +pub extern fn SetCameraMoveControls(keyFront: c_int, keyBack: c_int, keyRight: c_int, keyLeft: c_int, keyUp: c_int, keyDown: c_int) void; +pub extern fn SetShapesTexture(texture: Texture2D, source: Rectangle) void; +pub extern fn DrawPixel(posX: c_int, posY: c_int, color: Color) void; +pub extern fn DrawPixelV(position: Vector2, color: Color) void; +pub extern fn DrawLine(startPosX: c_int, startPosY: c_int, endPosX: c_int, endPosY: c_int, color: Color) void; +pub extern fn DrawLineV(startPos: Vector2, endPos: Vector2, color: Color) void; +pub extern fn DrawLineEx(startPos: Vector2, endPos: Vector2, thick: f32, color: Color) void; +pub extern fn DrawLineBezier(startPos: Vector2, endPos: Vector2, thick: f32, color: Color) void; +pub extern fn DrawLineBezierQuad(startPos: Vector2, endPos: Vector2, controlPos: Vector2, thick: f32, color: Color) void; +pub extern fn DrawLineBezierCubic(startPos: Vector2, endPos: Vector2, startControlPos: Vector2, endControlPos: Vector2, thick: f32, color: Color) void; +pub extern fn DrawLineStrip(points: [*c]Vector2, pointCount: c_int, color: Color) void; +pub extern fn DrawCircle(centerX: c_int, centerY: c_int, radius: f32, color: Color) void; +pub extern fn DrawCircleSector(center: Vector2, radius: f32, startAngle: f32, endAngle: f32, segments: c_int, color: Color) void; +pub extern fn DrawCircleSectorLines(center: Vector2, radius: f32, startAngle: f32, endAngle: f32, segments: c_int, color: Color) void; +pub extern fn DrawCircleGradient(centerX: c_int, centerY: c_int, radius: f32, color1: Color, color2: Color) void; +pub extern fn DrawCircleV(center: Vector2, radius: f32, color: Color) void; +pub extern fn DrawCircleLines(centerX: c_int, centerY: c_int, radius: f32, color: Color) void; +pub extern fn DrawEllipse(centerX: c_int, centerY: c_int, radiusH: f32, radiusV: f32, color: Color) void; +pub extern fn DrawEllipseLines(centerX: c_int, centerY: c_int, radiusH: f32, radiusV: f32, color: Color) void; +pub extern fn DrawRing(center: Vector2, innerRadius: f32, outerRadius: f32, startAngle: f32, endAngle: f32, segments: c_int, color: Color) void; +pub extern fn DrawRingLines(center: Vector2, innerRadius: f32, outerRadius: f32, startAngle: f32, endAngle: f32, segments: c_int, color: Color) void; +pub extern fn DrawRectangle(posX: c_int, posY: c_int, width: c_int, height: c_int, color: Color) void; +pub extern fn DrawRectangleV(position: Vector2, size: Vector2, color: Color) void; +pub extern fn DrawRectangleRec(rec: Rectangle, color: Color) void; +pub extern fn DrawRectanglePro(rec: Rectangle, origin: Vector2, rotation: f32, color: Color) void; +pub extern fn DrawRectangleGradientV(posX: c_int, posY: c_int, width: c_int, height: c_int, color1: Color, color2: Color) void; +pub extern fn DrawRectangleGradientH(posX: c_int, posY: c_int, width: c_int, height: c_int, color1: Color, color2: Color) void; +pub extern fn DrawRectangleGradientEx(rec: Rectangle, col1: Color, col2: Color, col3: Color, col4: Color) void; +pub extern fn DrawRectangleLines(posX: c_int, posY: c_int, width: c_int, height: c_int, color: Color) void; +pub extern fn DrawRectangleLinesEx(rec: Rectangle, lineThick: f32, color: Color) void; +pub extern fn DrawRectangleRounded(rec: Rectangle, roundness: f32, segments: c_int, color: Color) void; +pub extern fn DrawRectangleRoundedLines(rec: Rectangle, roundness: f32, segments: c_int, lineThick: f32, color: Color) void; +pub extern fn DrawTriangle(v1: Vector2, v2: Vector2, v3: Vector2, color: Color) void; +pub extern fn DrawTriangleLines(v1: Vector2, v2: Vector2, v3: Vector2, color: Color) void; +pub extern fn DrawTriangleFan(points: [*c]Vector2, pointCount: c_int, color: Color) void; +pub extern fn DrawTriangleStrip(points: [*c]Vector2, pointCount: c_int, color: Color) void; +pub extern fn DrawPoly(center: Vector2, sides: c_int, radius: f32, rotation: f32, color: Color) void; +pub extern fn DrawPolyLines(center: Vector2, sides: c_int, radius: f32, rotation: f32, color: Color) void; +pub extern fn DrawPolyLinesEx(center: Vector2, sides: c_int, radius: f32, rotation: f32, lineThick: f32, color: Color) void; +pub extern fn CheckCollisionRecs(rec1: Rectangle, rec2: Rectangle) bool; +pub extern fn CheckCollisionCircles(center1: Vector2, radius1: f32, center2: Vector2, radius2: f32) bool; +pub extern fn CheckCollisionCircleRec(center: Vector2, radius: f32, rec: Rectangle) bool; +pub extern fn CheckCollisionPointRec(point: Vector2, rec: Rectangle) bool; +pub extern fn CheckCollisionPointCircle(point: Vector2, center: Vector2, radius: f32) bool; +pub extern fn CheckCollisionPointTriangle(point: Vector2, p1: Vector2, p2: Vector2, p3: Vector2) bool; +pub extern fn CheckCollisionLines(startPos1: Vector2, endPos1: Vector2, startPos2: Vector2, endPos2: Vector2, collisionPoint: [*c]Vector2) bool; +pub extern fn CheckCollisionPointLine(point: Vector2, p1: Vector2, p2: Vector2, threshold: c_int) bool; +pub extern fn GetCollisionRec(rec1: Rectangle, rec2: Rectangle) Rectangle; +pub extern fn LoadImage(fileName: [*c]const u8) Image; +pub extern fn LoadImageRaw(fileName: [*c]const u8, width: c_int, height: c_int, format: c_int, headerSize: c_int) Image; +pub extern fn LoadImageAnim(fileName: [*c]const u8, frames: [*c]c_int) Image; +pub extern fn LoadImageFromMemory(fileType: [*c]const u8, fileData: [*c]const u8, dataSize: c_int) Image; +pub extern fn LoadImageFromTexture(texture: Texture2D) Image; +pub extern fn LoadImageFromScreen() Image; +pub extern fn UnloadImage(image: Image) void; +pub extern fn ExportImage(image: Image, fileName: [*c]const u8) bool; +pub extern fn ExportImageAsCode(image: Image, fileName: [*c]const u8) bool; +pub extern fn GenImageColor(width: c_int, height: c_int, color: Color) Image; +pub extern fn GenImageGradientV(width: c_int, height: c_int, top: Color, bottom: Color) Image; +pub extern fn GenImageGradientH(width: c_int, height: c_int, left: Color, right: Color) Image; +pub extern fn GenImageGradientRadial(width: c_int, height: c_int, density: f32, inner: Color, outer: Color) Image; +pub extern fn GenImageChecked(width: c_int, height: c_int, checksX: c_int, checksY: c_int, col1: Color, col2: Color) Image; +pub extern fn GenImageWhiteNoise(width: c_int, height: c_int, factor: f32) Image; +pub extern fn GenImageCellular(width: c_int, height: c_int, tileSize: c_int) Image; +pub extern fn ImageCopy(image: Image) Image; +pub extern fn ImageFromImage(image: Image, rec: Rectangle) Image; +pub extern fn ImageText(text: [*c]const u8, fontSize: c_int, color: Color) Image; +pub extern fn ImageTextEx(font: Font, text: [*c]const u8, fontSize: f32, spacing: f32, tint: Color) Image; +pub extern fn ImageFormat(image: [*c]Image, newFormat: c_int) void; +pub extern fn ImageToPOT(image: [*c]Image, fill: Color) void; +pub extern fn ImageCrop(image: [*c]Image, crop: Rectangle) void; +pub extern fn ImageAlphaCrop(image: [*c]Image, threshold: f32) void; +pub extern fn ImageAlphaClear(image: [*c]Image, color: Color, threshold: f32) void; +pub extern fn ImageAlphaMask(image: [*c]Image, alphaMask: Image) void; +pub extern fn ImageAlphaPremultiply(image: [*c]Image) void; +pub extern fn ImageResize(image: [*c]Image, newWidth: c_int, newHeight: c_int) void; +pub extern fn ImageResizeNN(image: [*c]Image, newWidth: c_int, newHeight: c_int) void; +pub extern fn ImageResizeCanvas(image: [*c]Image, newWidth: c_int, newHeight: c_int, offsetX: c_int, offsetY: c_int, fill: Color) void; +pub extern fn ImageMipmaps(image: [*c]Image) void; +pub extern fn ImageDither(image: [*c]Image, rBpp: c_int, gBpp: c_int, bBpp: c_int, aBpp: c_int) void; +pub extern fn ImageFlipVertical(image: [*c]Image) void; +pub extern fn ImageFlipHorizontal(image: [*c]Image) void; +pub extern fn ImageRotateCW(image: [*c]Image) void; +pub extern fn ImageRotateCCW(image: [*c]Image) void; +pub extern fn ImageColorTint(image: [*c]Image, color: Color) void; +pub extern fn ImageColorInvert(image: [*c]Image) void; +pub extern fn ImageColorGrayscale(image: [*c]Image) void; +pub extern fn ImageColorContrast(image: [*c]Image, contrast: f32) void; +pub extern fn ImageColorBrightness(image: [*c]Image, brightness: c_int) void; +pub extern fn ImageColorReplace(image: [*c]Image, color: Color, replace: Color) void; +pub extern fn LoadImageColors(image: Image) [*c]Color; +pub extern fn LoadImagePalette(image: Image, maxPaletteSize: c_int, colorCount: [*c]c_int) [*c]Color; +pub extern fn UnloadImageColors(colors: [*c]Color) void; +pub extern fn UnloadImagePalette(colors: [*c]Color) void; +pub extern fn GetImageAlphaBorder(image: Image, threshold: f32) Rectangle; +pub extern fn GetImageColor(image: Image, x: c_int, y: c_int) Color; +pub extern fn ImageClearBackground(dst: [*c]Image, color: Color) void; +pub extern fn ImageDrawPixel(dst: [*c]Image, posX: c_int, posY: c_int, color: Color) void; +pub extern fn ImageDrawPixelV(dst: [*c]Image, position: Vector2, color: Color) void; +pub extern fn ImageDrawLine(dst: [*c]Image, startPosX: c_int, startPosY: c_int, endPosX: c_int, endPosY: c_int, color: Color) void; +pub extern fn ImageDrawLineV(dst: [*c]Image, start: Vector2, end: Vector2, color: Color) void; +pub extern fn ImageDrawCircle(dst: [*c]Image, centerX: c_int, centerY: c_int, radius: c_int, color: Color) void; +pub extern fn ImageDrawCircleV(dst: [*c]Image, center: Vector2, radius: c_int, color: Color) void; +pub extern fn ImageDrawRectangle(dst: [*c]Image, posX: c_int, posY: c_int, width: c_int, height: c_int, color: Color) void; +pub extern fn ImageDrawRectangleV(dst: [*c]Image, position: Vector2, size: Vector2, color: Color) void; +pub extern fn ImageDrawRectangleRec(dst: [*c]Image, rec: Rectangle, color: Color) void; +pub extern fn ImageDrawRectangleLines(dst: [*c]Image, rec: Rectangle, thick: c_int, color: Color) void; +pub extern fn ImageDraw(dst: [*c]Image, src: Image, srcRec: Rectangle, dstRec: Rectangle, tint: Color) void; +pub extern fn ImageDrawText(dst: [*c]Image, text: [*c]const u8, posX: c_int, posY: c_int, fontSize: c_int, color: Color) void; +pub extern fn ImageDrawTextEx(dst: [*c]Image, font: Font, text: [*c]const u8, position: Vector2, fontSize: f32, spacing: f32, tint: Color) void; +pub extern fn LoadTexture(fileName: [*c]const u8) Texture2D; +pub extern fn LoadTextureFromImage(image: Image) Texture2D; +pub extern fn LoadTextureCubemap(image: Image, layout: c_int) TextureCubemap; +pub extern fn LoadRenderTexture(width: c_int, height: c_int) RenderTexture2D; +pub extern fn UnloadTexture(texture: Texture2D) void; +pub extern fn UnloadRenderTexture(target: RenderTexture2D) void; +pub extern fn UpdateTexture(texture: Texture2D, pixels: ?*const anyopaque) void; +pub extern fn UpdateTextureRec(texture: Texture2D, rec: Rectangle, pixels: ?*const anyopaque) void; +pub extern fn GenTextureMipmaps(texture: [*c]Texture2D) void; +pub extern fn SetTextureFilter(texture: Texture2D, filter: c_int) void; +pub extern fn SetTextureWrap(texture: Texture2D, wrap: c_int) void; +pub extern fn DrawTexture(texture: Texture2D, posX: c_int, posY: c_int, tint: Color) void; +pub extern fn DrawTextureV(texture: Texture2D, position: Vector2, tint: Color) void; +pub extern fn DrawTextureEx(texture: Texture2D, position: Vector2, rotation: f32, scale: f32, tint: Color) void; +pub extern fn DrawTextureRec(texture: Texture2D, source: Rectangle, position: Vector2, tint: Color) void; +pub extern fn DrawTextureQuad(texture: Texture2D, tiling: Vector2, offset: Vector2, quad: Rectangle, tint: Color) void; +pub extern fn DrawTextureTiled(texture: Texture2D, source: Rectangle, dest: Rectangle, origin: Vector2, rotation: f32, scale: f32, tint: Color) void; +pub extern fn DrawTexturePro(texture: Texture2D, source: Rectangle, dest: Rectangle, origin: Vector2, rotation: f32, tint: Color) void; +pub extern fn DrawTextureNPatch(texture: Texture2D, nPatchInfo: NPatchInfo, dest: Rectangle, origin: Vector2, rotation: f32, tint: Color) void; +pub extern fn DrawTexturePoly(texture: Texture2D, center: Vector2, points: [*c]Vector2, texcoords: [*c]Vector2, pointCount: c_int, tint: Color) void; +pub extern fn Fade(color: Color, alpha: f32) Color; +pub extern fn ColorToInt(color: Color) c_int; +pub extern fn ColorNormalize(color: Color) Vector4; +pub extern fn ColorFromNormalized(normalized: Vector4) Color; +pub extern fn ColorToHSV(color: Color) Vector3; +pub extern fn ColorFromHSV(hue: f32, saturation: f32, value: f32) Color; +pub extern fn ColorAlpha(color: Color, alpha: f32) Color; +pub extern fn ColorAlphaBlend(dst: Color, src: Color, tint: Color) Color; +pub extern fn GetColor(hexValue: c_uint) Color; +pub extern fn GetPixelColor(srcPtr: ?*anyopaque, format: c_int) Color; +pub extern fn SetPixelColor(dstPtr: ?*anyopaque, color: Color, format: c_int) void; +pub extern fn GetPixelDataSize(width: c_int, height: c_int, format: c_int) c_int; +pub extern fn GetFontDefault() Font; +pub extern fn LoadFont(fileName: [*c]const u8) Font; +pub extern fn LoadFontEx(fileName: [*c]const u8, fontSize: c_int, fontChars: [*c]c_int, glyphCount: c_int) Font; +pub extern fn LoadFontFromImage(image: Image, key: Color, firstChar: c_int) Font; +pub extern fn LoadFontFromMemory(fileType: [*c]const u8, fileData: [*c]const u8, dataSize: c_int, fontSize: c_int, fontChars: [*c]c_int, glyphCount: c_int) Font; +pub extern fn LoadFontData(fileData: [*c]const u8, dataSize: c_int, fontSize: c_int, fontChars: [*c]c_int, glyphCount: c_int, @"type": c_int) [*c]GlyphInfo; +pub extern fn GenImageFontAtlas(chars: [*c]const GlyphInfo, recs: [*c][*c]Rectangle, glyphCount: c_int, fontSize: c_int, padding: c_int, packMethod: c_int) Image; +pub extern fn UnloadFontData(chars: [*c]GlyphInfo, glyphCount: c_int) void; +pub extern fn UnloadFont(font: Font) void; +pub extern fn ExportFontAsCode(font: Font, fileName: [*c]const u8) bool; +pub extern fn DrawFPS(posX: c_int, posY: c_int) void; +pub extern fn DrawText(text: [*c]const u8, posX: c_int, posY: c_int, fontSize: c_int, color: Color) void; +pub extern fn DrawTextEx(font: Font, text: [*c]const u8, position: Vector2, fontSize: f32, spacing: f32, tint: Color) void; +pub extern fn DrawTextPro(font: Font, text: [*c]const u8, position: Vector2, origin: Vector2, rotation: f32, fontSize: f32, spacing: f32, tint: Color) void; +pub extern fn DrawTextCodepoint(font: Font, codepoint: c_int, position: Vector2, fontSize: f32, tint: Color) void; +pub extern fn DrawTextCodepoints(font: Font, codepoints: [*c]const c_int, count: c_int, position: Vector2, fontSize: f32, spacing: f32, tint: Color) void; +pub extern fn MeasureText(text: [*c]const u8, fontSize: c_int) c_int; +pub extern fn MeasureTextEx(font: Font, text: [*c]const u8, fontSize: f32, spacing: f32) Vector2; +pub extern fn GetGlyphIndex(font: Font, codepoint: c_int) c_int; +pub extern fn GetGlyphInfo(font: Font, codepoint: c_int) GlyphInfo; +pub extern fn GetGlyphAtlasRec(font: Font, codepoint: c_int) Rectangle; +pub extern fn LoadCodepoints(text: [*c]const u8, count: [*c]c_int) [*c]c_int; +pub extern fn UnloadCodepoints(codepoints: [*c]c_int) void; +pub extern fn GetCodepointCount(text: [*c]const u8) c_int; +pub extern fn GetCodepoint(text: [*c]const u8, bytesProcessed: [*c]c_int) c_int; +pub extern fn CodepointToUTF8(codepoint: c_int, byteSize: [*c]c_int) [*c]const u8; +pub extern fn TextCodepointsToUTF8(codepoints: [*c]const c_int, length: c_int) [*c]u8; +pub extern fn TextCopy(dst: [*c]u8, src: [*c]const u8) c_int; +pub extern fn TextIsEqual(text1: [*c]const u8, text2: [*c]const u8) bool; +pub extern fn TextLength(text: [*c]const u8) c_uint; +pub extern fn TextFormat(text: [*c]const u8, ...) [*c]const u8; +pub extern fn TextSubtext(text: [*c]const u8, position: c_int, length: c_int) [*c]const u8; +pub extern fn TextReplace(text: [*c]u8, replace: [*c]const u8, by: [*c]const u8) [*c]u8; +pub extern fn TextInsert(text: [*c]const u8, insert: [*c]const u8, position: c_int) [*c]u8; +pub extern fn TextJoin(textList: [*c][*c]const u8, count: c_int, delimiter: [*c]const u8) [*c]const u8; +pub extern fn TextSplit(text: [*c]const u8, delimiter: u8, count: [*c]c_int) [*c][*c]const u8; +pub extern fn TextAppend(text: [*c]u8, append: [*c]const u8, position: [*c]c_int) void; +pub extern fn TextFindIndex(text: [*c]const u8, find: [*c]const u8) c_int; +pub extern fn TextToUpper(text: [*c]const u8) [*c]const u8; +pub extern fn TextToLower(text: [*c]const u8) [*c]const u8; +pub extern fn TextToPascal(text: [*c]const u8) [*c]const u8; +pub extern fn TextToInteger(text: [*c]const u8) c_int; +pub extern fn DrawLine3D(startPos: Vector3, endPos: Vector3, color: Color) void; +pub extern fn DrawPoint3D(position: Vector3, color: Color) void; +pub extern fn DrawCircle3D(center: Vector3, radius: f32, rotationAxis: Vector3, rotationAngle: f32, color: Color) void; +pub extern fn DrawTriangle3D(v1: Vector3, v2: Vector3, v3: Vector3, color: Color) void; +pub extern fn DrawTriangleStrip3D(points: [*c]Vector3, pointCount: c_int, color: Color) void; +pub extern fn DrawCube(position: Vector3, width: f32, height: f32, length: f32, color: Color) void; +pub extern fn DrawCubeV(position: Vector3, size: Vector3, color: Color) void; +pub extern fn DrawCubeWires(position: Vector3, width: f32, height: f32, length: f32, color: Color) void; +pub extern fn DrawCubeWiresV(position: Vector3, size: Vector3, color: Color) void; +pub extern fn DrawCubeTexture(texture: Texture2D, position: Vector3, width: f32, height: f32, length: f32, color: Color) void; +pub extern fn DrawCubeTextureRec(texture: Texture2D, source: Rectangle, position: Vector3, width: f32, height: f32, length: f32, color: Color) void; +pub extern fn DrawSphere(centerPos: Vector3, radius: f32, color: Color) void; +pub extern fn DrawSphereEx(centerPos: Vector3, radius: f32, rings: c_int, slices: c_int, color: Color) void; +pub extern fn DrawSphereWires(centerPos: Vector3, radius: f32, rings: c_int, slices: c_int, color: Color) void; +pub extern fn DrawCylinder(position: Vector3, radiusTop: f32, radiusBottom: f32, height: f32, slices: c_int, color: Color) void; +pub extern fn DrawCylinderEx(startPos: Vector3, endPos: Vector3, startRadius: f32, endRadius: f32, sides: c_int, color: Color) void; +pub extern fn DrawCylinderWires(position: Vector3, radiusTop: f32, radiusBottom: f32, height: f32, slices: c_int, color: Color) void; +pub extern fn DrawCylinderWiresEx(startPos: Vector3, endPos: Vector3, startRadius: f32, endRadius: f32, sides: c_int, color: Color) void; +pub extern fn DrawPlane(centerPos: Vector3, size: Vector2, color: Color) void; +pub extern fn DrawRay(ray: Ray, color: Color) void; +pub extern fn DrawGrid(slices: c_int, spacing: f32) void; +pub extern fn LoadModel(fileName: [*c]const u8) Model; +pub extern fn LoadModelFromMesh(mesh: Mesh) Model; +pub extern fn UnloadModel(model: Model) void; +pub extern fn UnloadModelKeepMeshes(model: Model) void; +pub extern fn GetModelBoundingBox(model: Model) BoundingBox; +pub extern fn DrawModel(model: Model, position: Vector3, scale: f32, tint: Color) void; +pub extern fn DrawModelEx(model: Model, position: Vector3, rotationAxis: Vector3, rotationAngle: f32, scale: Vector3, tint: Color) void; +pub extern fn DrawModelWires(model: Model, position: Vector3, scale: f32, tint: Color) void; +pub extern fn DrawModelWiresEx(model: Model, position: Vector3, rotationAxis: Vector3, rotationAngle: f32, scale: Vector3, tint: Color) void; +pub extern fn DrawBoundingBox(box: BoundingBox, color: Color) void; +pub extern fn DrawBillboard(camera: Camera, texture: Texture2D, position: Vector3, size: f32, tint: Color) void; +pub extern fn DrawBillboardRec(camera: Camera, texture: Texture2D, source: Rectangle, position: Vector3, size: Vector2, tint: Color) void; +pub extern fn DrawBillboardPro(camera: Camera, texture: Texture2D, source: Rectangle, position: Vector3, up: Vector3, size: Vector2, origin: Vector2, rotation: f32, tint: Color) void; +pub extern fn UploadMesh(mesh: [*c]Mesh, dynamic: bool) void; +pub extern fn UpdateMeshBuffer(mesh: Mesh, index: c_int, data: ?*const anyopaque, dataSize: c_int, offset: c_int) void; +pub extern fn UnloadMesh(mesh: Mesh) void; +pub extern fn DrawMesh(mesh: Mesh, material: Material, transform: Matrix) void; +pub extern fn DrawMeshInstanced(mesh: Mesh, material: Material, transforms: [*c]const Matrix, instances: c_int) void; +pub extern fn ExportMesh(mesh: Mesh, fileName: [*c]const u8) bool; +pub extern fn GetMeshBoundingBox(mesh: Mesh) BoundingBox; +pub extern fn GenMeshTangents(mesh: [*c]Mesh) void; +pub extern fn GenMeshBinormals(mesh: [*c]Mesh) void; +pub extern fn GenMeshPoly(sides: c_int, radius: f32) Mesh; +pub extern fn GenMeshPlane(width: f32, length: f32, resX: c_int, resZ: c_int) Mesh; +pub extern fn GenMeshCube(width: f32, height: f32, length: f32) Mesh; +pub extern fn GenMeshSphere(radius: f32, rings: c_int, slices: c_int) Mesh; +pub extern fn GenMeshHemiSphere(radius: f32, rings: c_int, slices: c_int) Mesh; +pub extern fn GenMeshCylinder(radius: f32, height: f32, slices: c_int) Mesh; +pub extern fn GenMeshCone(radius: f32, height: f32, slices: c_int) Mesh; +pub extern fn GenMeshTorus(radius: f32, size: f32, radSeg: c_int, sides: c_int) Mesh; +pub extern fn GenMeshKnot(radius: f32, size: f32, radSeg: c_int, sides: c_int) Mesh; +pub extern fn GenMeshHeightmap(heightmap: Image, size: Vector3) Mesh; +pub extern fn GenMeshCubicmap(cubicmap: Image, cubeSize: Vector3) Mesh; +pub extern fn LoadMaterials(fileName: [*c]const u8, materialCount: [*c]c_int) [*c]Material; +pub extern fn LoadMaterialDefault() Material; +pub extern fn UnloadMaterial(material: Material) void; +pub extern fn SetMaterialTexture(material: [*c]Material, mapType: c_int, texture: Texture2D) void; +pub extern fn SetModelMeshMaterial(model: [*c]Model, meshId: c_int, materialId: c_int) void; +pub extern fn LoadModelAnimations(fileName: [*c]const u8, animCount: [*c]c_uint) [*c]ModelAnimation; +pub extern fn UpdateModelAnimation(model: Model, anim: ModelAnimation, frame: c_int) void; +pub extern fn UnloadModelAnimation(anim: ModelAnimation) void; +pub extern fn UnloadModelAnimations(animations: [*c]ModelAnimation, count: c_uint) void; +pub extern fn IsModelAnimationValid(model: Model, anim: ModelAnimation) bool; +pub extern fn CheckCollisionSpheres(center1: Vector3, radius1: f32, center2: Vector3, radius2: f32) bool; +pub extern fn CheckCollisionBoxes(box1: BoundingBox, box2: BoundingBox) bool; +pub extern fn CheckCollisionBoxSphere(box: BoundingBox, center: Vector3, radius: f32) bool; +pub extern fn GetRayCollisionSphere(ray: Ray, center: Vector3, radius: f32) RayCollision; +pub extern fn GetRayCollisionBox(ray: Ray, box: BoundingBox) RayCollision; +pub extern fn GetRayCollisionMesh(ray: Ray, mesh: Mesh, transform: Matrix) RayCollision; +pub extern fn GetRayCollisionTriangle(ray: Ray, p1: Vector3, p2: Vector3, p3: Vector3) RayCollision; +pub extern fn GetRayCollisionQuad(ray: Ray, p1: Vector3, p2: Vector3, p3: Vector3, p4: Vector3) RayCollision; +pub const AudioCallback = ?fn (?*anyopaque, c_uint) callconv(.C) void; +pub extern fn InitAudioDevice() void; +pub extern fn CloseAudioDevice() void; +pub extern fn IsAudioDeviceReady() bool; +pub extern fn SetMasterVolume(volume: f32) void; +pub extern fn LoadWave(fileName: [*c]const u8) Wave; +pub extern fn LoadWaveFromMemory(fileType: [*c]const u8, fileData: [*c]const u8, dataSize: c_int) Wave; +pub extern fn LoadSound(fileName: [*c]const u8) Sound; +pub extern fn LoadSoundFromWave(wave: Wave) Sound; +pub extern fn UpdateSound(sound: Sound, data: ?*const anyopaque, sampleCount: c_int) void; +pub extern fn UnloadWave(wave: Wave) void; +pub extern fn UnloadSound(sound: Sound) void; +pub extern fn ExportWave(wave: Wave, fileName: [*c]const u8) bool; +pub extern fn ExportWaveAsCode(wave: Wave, fileName: [*c]const u8) bool; +pub extern fn PlaySound(sound: Sound) void; +pub extern fn StopSound(sound: Sound) void; +pub extern fn PauseSound(sound: Sound) void; +pub extern fn ResumeSound(sound: Sound) void; +pub extern fn PlaySoundMulti(sound: Sound) void; +pub extern fn StopSoundMulti() void; +pub extern fn GetSoundsPlaying() c_int; +pub extern fn IsSoundPlaying(sound: Sound) bool; +pub extern fn SetSoundVolume(sound: Sound, volume: f32) void; +pub extern fn SetSoundPitch(sound: Sound, pitch: f32) void; +pub extern fn SetSoundPan(sound: Sound, pan: f32) void; +pub extern fn WaveCopy(wave: Wave) Wave; +pub extern fn WaveCrop(wave: [*c]Wave, initSample: c_int, finalSample: c_int) void; +pub extern fn WaveFormat(wave: [*c]Wave, sampleRate: c_int, sampleSize: c_int, channels: c_int) void; +pub extern fn LoadWaveSamples(wave: Wave) [*c]f32; +pub extern fn UnloadWaveSamples(samples: [*c]f32) void; +pub extern fn LoadMusicStream(fileName: [*c]const u8) Music; +pub extern fn LoadMusicStreamFromMemory(fileType: [*c]const u8, data: [*c]const u8, dataSize: c_int) Music; +pub extern fn UnloadMusicStream(music: Music) void; +pub extern fn PlayMusicStream(music: Music) void; +pub extern fn IsMusicStreamPlaying(music: Music) bool; +pub extern fn UpdateMusicStream(music: Music) void; +pub extern fn StopMusicStream(music: Music) void; +pub extern fn PauseMusicStream(music: Music) void; +pub extern fn ResumeMusicStream(music: Music) void; +pub extern fn SeekMusicStream(music: Music, position: f32) void; +pub extern fn SetMusicVolume(music: Music, volume: f32) void; +pub extern fn SetMusicPitch(music: Music, pitch: f32) void; +pub extern fn SetMusicPan(music: Music, pan: f32) void; +pub extern fn GetMusicTimeLength(music: Music) f32; +pub extern fn GetMusicTimePlayed(music: Music) f32; +pub extern fn LoadAudioStream(sampleRate: c_uint, sampleSize: c_uint, channels: c_uint) AudioStream; +pub extern fn UnloadAudioStream(stream: AudioStream) void; +pub extern fn UpdateAudioStream(stream: AudioStream, data: ?*const anyopaque, frameCount: c_int) void; +pub extern fn IsAudioStreamProcessed(stream: AudioStream) bool; +pub extern fn PlayAudioStream(stream: AudioStream) void; +pub extern fn PauseAudioStream(stream: AudioStream) void; +pub extern fn ResumeAudioStream(stream: AudioStream) void; +pub extern fn IsAudioStreamPlaying(stream: AudioStream) bool; +pub extern fn StopAudioStream(stream: AudioStream) void; +pub extern fn SetAudioStreamVolume(stream: AudioStream, volume: f32) void; +pub extern fn SetAudioStreamPitch(stream: AudioStream, pitch: f32) void; +pub extern fn SetAudioStreamPan(stream: AudioStream, pan: f32) void; +pub extern fn SetAudioStreamBufferSizeDefault(size: c_int) void; +pub extern fn SetAudioStreamCallback(stream: AudioStream, callback: AudioCallback) void; +pub extern fn AttachAudioStreamProcessor(stream: AudioStream, processor: AudioCallback) void; +pub extern fn DetachAudioStreamProcessor(stream: AudioStream, processor: AudioCallback) void; +pub const struct_GuiStyleProp = extern struct { + controlId: c_ushort, + propertyId: c_ushort, + propertyValue: c_int, +}; +pub const GuiStyleProp = struct_GuiStyleProp; +pub const GUI_STATE_NORMAL: c_int = 0; +pub const GUI_STATE_FOCUSED: c_int = 1; +pub const GUI_STATE_PRESSED: c_int = 2; +pub const GUI_STATE_DISABLED: c_int = 3; +pub const GuiControlState = c_uint; +pub const GUI_TEXT_ALIGN_LEFT: c_int = 0; +pub const GUI_TEXT_ALIGN_CENTER: c_int = 1; +pub const GUI_TEXT_ALIGN_RIGHT: c_int = 2; +pub const GuiTextAlignment = c_uint; +pub const DEFAULT: c_int = 0; +pub const LABEL: c_int = 1; +pub const BUTTON: c_int = 2; +pub const TOGGLE: c_int = 3; +pub const SLIDER: c_int = 4; +pub const PROGRESSBAR: c_int = 5; +pub const CHECKBOX: c_int = 6; +pub const COMBOBOX: c_int = 7; +pub const DROPDOWNBOX: c_int = 8; +pub const TEXTBOX: c_int = 9; +pub const VALUEBOX: c_int = 10; +pub const SPINNER: c_int = 11; +pub const LISTVIEW: c_int = 12; +pub const COLORPICKER: c_int = 13; +pub const SCROLLBAR: c_int = 14; +pub const STATUSBAR: c_int = 15; +pub const GuiControl = c_uint; +pub const BORDER_COLOR_NORMAL: c_int = 0; +pub const BASE_COLOR_NORMAL: c_int = 1; +pub const TEXT_COLOR_NORMAL: c_int = 2; +pub const BORDER_COLOR_FOCUSED: c_int = 3; +pub const BASE_COLOR_FOCUSED: c_int = 4; +pub const TEXT_COLOR_FOCUSED: c_int = 5; +pub const BORDER_COLOR_PRESSED: c_int = 6; +pub const BASE_COLOR_PRESSED: c_int = 7; +pub const TEXT_COLOR_PRESSED: c_int = 8; +pub const BORDER_COLOR_DISABLED: c_int = 9; +pub const BASE_COLOR_DISABLED: c_int = 10; +pub const TEXT_COLOR_DISABLED: c_int = 11; +pub const BORDER_WIDTH: c_int = 12; +pub const TEXT_PADDING: c_int = 13; +pub const TEXT_ALIGNMENT: c_int = 14; +pub const RESERVED: c_int = 15; +pub const GuiControlProperty = c_uint; +pub const TEXT_SIZE: c_int = 16; +pub const TEXT_SPACING: c_int = 17; +pub const LINE_COLOR: c_int = 18; +pub const BACKGROUND_COLOR: c_int = 19; +pub const GuiDefaultProperty = c_uint; +pub const GROUP_PADDING: c_int = 16; +pub const GuiToggleProperty = c_uint; +pub const SLIDER_WIDTH: c_int = 16; +pub const SLIDER_PADDING: c_int = 17; +pub const GuiSliderProperty = c_uint; +pub const PROGRESS_PADDING: c_int = 16; +pub const GuiProgressBarProperty = c_uint; +pub const CHECK_PADDING: c_int = 16; +pub const GuiCheckBoxProperty = c_uint; +pub const COMBO_BUTTON_WIDTH: c_int = 16; +pub const COMBO_BUTTON_PADDING: c_int = 17; +pub const GuiComboBoxProperty = c_uint; +pub const ARROW_PADDING: c_int = 16; +pub const DROPDOWN_ITEMS_PADDING: c_int = 17; +pub const GuiDropdownBoxProperty = c_uint; +pub const TEXT_INNER_PADDING: c_int = 16; +pub const TEXT_LINES_PADDING: c_int = 17; +pub const COLOR_SELECTED_FG: c_int = 18; +pub const COLOR_SELECTED_BG: c_int = 19; +pub const GuiTextBoxProperty = c_uint; +pub const SPIN_BUTTON_WIDTH: c_int = 16; +pub const SPIN_BUTTON_PADDING: c_int = 17; +pub const GuiSpinnerProperty = c_uint; +pub const ARROWS_SIZE: c_int = 16; +pub const ARROWS_VISIBLE: c_int = 17; +pub const SCROLL_SLIDER_PADDING: c_int = 18; +pub const SCROLL_SLIDER_SIZE: c_int = 19; +pub const SCROLL_PADDING: c_int = 20; +pub const SCROLL_SPEED: c_int = 21; +pub const GuiScrollBarProperty = c_uint; +pub const SCROLLBAR_LEFT_SIDE: c_int = 0; +pub const SCROLLBAR_RIGHT_SIDE: c_int = 1; +pub const GuiScrollBarSide = c_uint; +pub const LIST_ITEMS_HEIGHT: c_int = 16; +pub const LIST_ITEMS_PADDING: c_int = 17; +pub const SCROLLBAR_WIDTH: c_int = 18; +pub const SCROLLBAR_SIDE: c_int = 19; +pub const GuiListViewProperty = c_uint; +pub const COLOR_SELECTOR_SIZE: c_int = 16; +pub const HUEBAR_WIDTH: c_int = 17; +pub const HUEBAR_PADDING: c_int = 18; +pub const HUEBAR_SELECTOR_HEIGHT: c_int = 19; +pub const HUEBAR_SELECTOR_OVERFLOW: c_int = 20; +pub const GuiColorPickerProperty = c_uint; +pub export fn GuiEnable() void { + guiState = @bitCast(c_uint, GUI_STATE_NORMAL); +} +pub export fn GuiDisable() void { + guiState = @bitCast(c_uint, GUI_STATE_DISABLED); +} +pub export fn GuiLock() void { + guiLocked = @as(c_int, 1) != 0; +} +pub export fn GuiUnlock() void { + guiLocked = @as(c_int, 0) != 0; +} +pub export fn GuiIsLocked() bool { + return guiLocked; +} +pub export fn GuiFade(arg_alpha: f32) void { + var alpha = arg_alpha; + if (alpha < 0.0) { + alpha = 0.0; + } else if (alpha > 1.0) { + alpha = 1.0; + } + guiAlpha = alpha; +} +pub export fn GuiSetState(arg_state: c_int) void { + var state = arg_state; + guiState = @bitCast(c_uint, state); +} +pub export fn GuiGetState() c_int { + return @bitCast(c_int, guiState); +} +pub export fn GuiSetFont(arg_font: Font) void { + var font = arg_font; + if (font.texture.id > @bitCast(c_uint, @as(c_int, 0))) { + if (!guiStyleLoaded) { + GuiLoadStyleDefault(); + } + guiFont = font; + GuiSetStyle(DEFAULT, TEXT_SIZE, font.baseSize); + } +} +pub export fn GuiGetFont() Font { + return guiFont; +} +pub export fn GuiSetStyle(arg_control: c_int, arg_property: c_int, arg_value: c_int) void { + var control = arg_control; + var property = arg_property; + var value = arg_value; + if (!guiStyleLoaded) { + GuiLoadStyleDefault(); + } + guiStyle[@intCast(c_uint, (control * (@as(c_int, 16) + @as(c_int, 8))) + property)] = @bitCast(c_uint, value); + if ((control == @as(c_int, 0)) and (property < @as(c_int, 16))) { + { + var i: c_int = 1; + while (i < @as(c_int, 16)) : (i += 1) { + guiStyle[@intCast(c_uint, (i * (@as(c_int, 16) + @as(c_int, 8))) + property)] = @bitCast(c_uint, value); + } + } + } +} +pub export fn GuiGetStyle(arg_control: c_int, arg_property: c_int) c_int { + var control = arg_control; + var property = arg_property; + if (!guiStyleLoaded) { + GuiLoadStyleDefault(); + } + return @bitCast(c_int, guiStyle[@intCast(c_uint, (control * (@as(c_int, 16) + @as(c_int, 8))) + property)]); +} +pub export fn GuiWindowBox(arg_bounds: Rectangle, arg_title: [*c]const u8) bool { + var bounds = arg_bounds; + var title = arg_title; + var clicked: bool = @as(c_int, 0) != 0; + var statusBarHeight: c_int = @as(c_int, 22) + (@as(c_int, 2) * GuiGetStyle(STATUSBAR, BORDER_WIDTH)); + statusBarHeight += @import("std").zig.c_translation.signedRemainder(statusBarHeight, @as(c_int, 2)); + var statusBar: Rectangle = Rectangle{ + .x = bounds.x, + .y = bounds.y, + .width = bounds.width, + .height = @intToFloat(f32, statusBarHeight), + }; + if (bounds.height < (@intToFloat(f32, statusBarHeight) * 2.0)) { + bounds.height = @intToFloat(f32, statusBarHeight) * 2.0; + } + var windowPanel: Rectangle = Rectangle{ + .x = bounds.x, + .y = (bounds.y + @intToFloat(f32, statusBarHeight)) - @intToFloat(f32, @as(c_int, 1)), + .width = bounds.width, + .height = bounds.height - @intToFloat(f32, statusBarHeight), + }; + var closeButtonRec: Rectangle = Rectangle{ + .x = ((statusBar.x + statusBar.width) - @intToFloat(f32, GuiGetStyle(STATUSBAR, BORDER_WIDTH))) - @intToFloat(f32, @as(c_int, 20)), + .y = (statusBar.y + (@intToFloat(f32, statusBarHeight) / 2.0)) - (18.0 / 2.0), + .width = @intToFloat(f32, @as(c_int, 18)), + .height = @intToFloat(f32, @as(c_int, 18)), + }; + GuiStatusBar(statusBar, title); + GuiPanel(windowPanel); + var tempBorderWidth: c_int = GuiGetStyle(BUTTON, BORDER_WIDTH); + var tempTextAlignment: c_int = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, @as(c_int, 1)); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + clicked = GuiButton(closeButtonRec, GuiIconText(RICON_CROSS_SMALL, null)); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); + return clicked; +} +pub export fn GuiGroupBox(arg_bounds: Rectangle, arg_text: [*c]const u8) void { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + GuiDrawRectangle(Rectangle{ + .x = bounds.x, + .y = bounds.y, + .width = @intToFloat(f32, @as(c_int, 1)), + .height = bounds.height, + }, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) BORDER_COLOR_DISABLED else LINE_COLOR))), guiAlpha)); + GuiDrawRectangle(Rectangle{ + .x = bounds.x, + .y = (bounds.y + bounds.height) - @intToFloat(f32, @as(c_int, 1)), + .width = bounds.width, + .height = @intToFloat(f32, @as(c_int, 1)), + }, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) BORDER_COLOR_DISABLED else LINE_COLOR))), guiAlpha)); + GuiDrawRectangle(Rectangle{ + .x = (bounds.x + bounds.width) - @intToFloat(f32, @as(c_int, 1)), + .y = bounds.y, + .width = @intToFloat(f32, @as(c_int, 1)), + .height = bounds.height, + }, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) BORDER_COLOR_DISABLED else LINE_COLOR))), guiAlpha)); + GuiLine(Rectangle{ + .x = bounds.x, + .y = bounds.y, + .width = bounds.width, + .height = @intToFloat(f32, @as(c_int, 1)), + }, text); +} +pub export fn GuiLine(arg_bounds: Rectangle, arg_text: [*c]const u8) void { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + var color: Color = Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) BORDER_COLOR_DISABLED else LINE_COLOR))), guiAlpha); + if (text == @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + GuiDrawRectangle(Rectangle{ + .x = bounds.x, + .y = bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2))), + .width = bounds.width, + .height = @intToFloat(f32, @as(c_int, 1)), + }, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, color); + } else { + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBounds.width = @intToFloat(f32, GetTextWidth(text)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = bounds.x + @intToFloat(f32, @as(c_int, 10)); + textBounds.y = bounds.y - (@intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)) / @intToFloat(f32, @as(c_int, 2))); + GuiDrawRectangle(Rectangle{ + .x = bounds.x, + .y = bounds.y, + .width = @intToFloat(f32, @as(c_int, 10) - @as(c_int, 2)), + .height = @intToFloat(f32, @as(c_int, 1)), + }, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, color); + GuiLabel(textBounds, text); + GuiDrawRectangle(Rectangle{ + .x = ((bounds.x + @intToFloat(f32, @as(c_int, 10))) + textBounds.width) + @intToFloat(f32, @as(c_int, 4)), + .y = bounds.y, + .width = ((bounds.width - textBounds.width) - @intToFloat(f32, @as(c_int, 10))) - @intToFloat(f32, @as(c_int, 4)), + .height = @intToFloat(f32, @as(c_int, 1)), + }, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, color); + } +} +pub export fn GuiPanel(arg_bounds: Rectangle) void { + var bounds = arg_bounds; + var state: GuiControlState = guiState; + GuiDrawRectangle(bounds, @as(c_int, 1), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) BORDER_COLOR_DISABLED else LINE_COLOR))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) BASE_COLOR_DISABLED else BACKGROUND_COLOR))), guiAlpha)); +} +pub export fn GuiScrollPanel(arg_bounds: Rectangle, arg_content: Rectangle, arg_scroll: [*c]Vector2) Rectangle { + var bounds = arg_bounds; + var content = arg_content; + var scroll = arg_scroll; + var state: GuiControlState = guiState; + var scrollPos: Vector2 = Vector2{ + .x = 0.0, + .y = 0.0, + }; + if (scroll != @ptrCast([*c]Vector2, @alignCast(@import("std").meta.alignment(Vector2), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + scrollPos = scroll.*; + } + var hasHorizontalScrollBar: bool = (if (content.width > (bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH)))) @as(c_int, 1) else @as(c_int, 0)) != 0; + var hasVerticalScrollBar: bool = (if (content.height > (bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH)))) @as(c_int, 1) else @as(c_int, 0)) != 0; + if (!hasHorizontalScrollBar) { + hasHorizontalScrollBar = (if ((@as(c_int, @boolToInt(hasVerticalScrollBar)) != 0) and (content.width > ((bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))) @as(c_int, 1) else @as(c_int, 0)) != 0; + } + if (!hasVerticalScrollBar) { + hasVerticalScrollBar = (if ((@as(c_int, @boolToInt(hasHorizontalScrollBar)) != 0) and (content.height > ((bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))) @as(c_int, 1) else @as(c_int, 0)) != 0; + } + const horizontalScrollBarWidth: c_int = if (@as(c_int, @boolToInt(hasHorizontalScrollBar)) != 0) GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) else @as(c_int, 0); + const verticalScrollBarWidth: c_int = if (@as(c_int, @boolToInt(hasVerticalScrollBar)) != 0) GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) else @as(c_int, 0); + const horizontalScrollBar: Rectangle = Rectangle{ + .x = (if (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE) bounds.x + @intToFloat(f32, verticalScrollBarWidth) else bounds.x) + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .y = ((bounds.y + bounds.height) - @intToFloat(f32, horizontalScrollBarWidth)) - @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .width = (bounds.width - @intToFloat(f32, verticalScrollBarWidth)) - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .height = @intToFloat(f32, horizontalScrollBarWidth), + }; + const verticalScrollBar: Rectangle = Rectangle{ + .x = if (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE) bounds.x + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)) else ((bounds.x + bounds.width) - @intToFloat(f32, verticalScrollBarWidth)) - @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .y = bounds.y + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .width = @intToFloat(f32, verticalScrollBarWidth), + .height = (bounds.height - @intToFloat(f32, horizontalScrollBarWidth)) - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH)), + }; + var view: Rectangle = if (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE) Rectangle{ + .x = (bounds.x + @intToFloat(f32, verticalScrollBarWidth)) + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .y = bounds.y + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .width = (bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, verticalScrollBarWidth), + .height = (bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, horizontalScrollBarWidth), + } else Rectangle{ + .x = bounds.x + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .y = bounds.y + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)), + .width = (bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, verticalScrollBarWidth), + .height = (bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, horizontalScrollBarWidth), + }; + if (view.width > content.width) { + view.width = content.width; + } + if (view.height > content.height) { + view.height = content.height; + } + const horizontalMin: f32 = if (@as(c_int, @boolToInt(hasHorizontalScrollBar)) != 0) (if (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE) @intToFloat(f32, -verticalScrollBarWidth) else @intToFloat(f32, @as(c_int, 0))) - @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)) else (if (@intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE)) == @intToFloat(f32, SCROLLBAR_LEFT_SIDE)) @intToFloat(f32, -verticalScrollBarWidth) else @intToFloat(f32, @as(c_int, 0))) - @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)); + const horizontalMax: f32 = if (@as(c_int, @boolToInt(hasHorizontalScrollBar)) != 0) (((content.width - bounds.width) + @intToFloat(f32, verticalScrollBarWidth)) + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH))) - (if (@intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE)) == @intToFloat(f32, SCROLLBAR_LEFT_SIDE)) @intToFloat(f32, verticalScrollBarWidth) else @intToFloat(f32, @as(c_int, 0))) else @intToFloat(f32, -GuiGetStyle(DEFAULT, BORDER_WIDTH)); + const verticalMin: f32 = if (@as(c_int, @boolToInt(hasVerticalScrollBar)) != 0) @intToFloat(f32, -GuiGetStyle(DEFAULT, BORDER_WIDTH)) else @intToFloat(f32, -GuiGetStyle(DEFAULT, BORDER_WIDTH)); + const verticalMax: f32 = if (@as(c_int, @boolToInt(hasVerticalScrollBar)) != 0) ((content.height - bounds.height) + @intToFloat(f32, horizontalScrollBarWidth)) + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)) else @intToFloat(f32, -GuiGetStyle(DEFAULT, BORDER_WIDTH)); + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + if (hasHorizontalScrollBar) { + if (IsKeyDown(KEY_RIGHT)) { + scrollPos.x -= @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_SPEED)); + } + if (IsKeyDown(KEY_LEFT)) { + scrollPos.x += @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_SPEED)); + } + } + if (hasVerticalScrollBar) { + if (IsKeyDown(KEY_DOWN)) { + scrollPos.y -= @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_SPEED)); + } + if (IsKeyDown(KEY_UP)) { + scrollPos.y += @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_SPEED)); + } + } + var wheelMove: f32 = GetMouseWheelMove(); + if ((@as(c_int, @boolToInt(hasHorizontalScrollBar)) != 0) and ((@as(c_int, @boolToInt(IsKeyDown(KEY_LEFT_SHIFT))) != 0) or (@as(c_int, @boolToInt(IsKeyDown(KEY_RIGHT_SHIFT))) != 0))) { + scrollPos.x += wheelMove * @intToFloat(f32, @as(c_int, 20)); + } else { + scrollPos.y += wheelMove * @intToFloat(f32, @as(c_int, 20)); + } + } + } + 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; + } + GuiDrawRectangle(bounds, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, BACKGROUND_COLOR)))); + const slider: c_int = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); + if (hasHorizontalScrollBar) { + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, @floatToInt(c_int, (((bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, verticalScrollBarWidth)) / @intToFloat(f32, @floatToInt(c_int, content.width))) * @intToFloat(f32, (@floatToInt(c_int, bounds.width) - (@as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - verticalScrollBarWidth))); + scrollPos.x = @intToFloat(f32, -GuiScrollBar(horizontalScrollBar, @floatToInt(c_int, -scrollPos.x), @floatToInt(c_int, horizontalMin), @floatToInt(c_int, horizontalMax))); + } + if (hasVerticalScrollBar) { + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, @floatToInt(c_int, (((bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - @intToFloat(f32, horizontalScrollBarWidth)) / @intToFloat(f32, @floatToInt(c_int, content.height))) * @intToFloat(f32, (@floatToInt(c_int, bounds.height) - (@as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH))) - horizontalScrollBarWidth))); + scrollPos.y = @intToFloat(f32, -GuiScrollBar(verticalScrollBar, @floatToInt(c_int, -scrollPos.y), @floatToInt(c_int, verticalMin), @floatToInt(c_int, verticalMax))); + } + if ((@as(c_int, @boolToInt(hasHorizontalScrollBar)) != 0) and (@as(c_int, @boolToInt(hasVerticalScrollBar)) != 0)) { + var corner: Rectangle = Rectangle{ + .x = if (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE) (bounds.x + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH))) + @intToFloat(f32, @as(c_int, 2)) else (horizontalScrollBar.x + horizontalScrollBar.width) + @intToFloat(f32, @as(c_int, 2)), + .y = (verticalScrollBar.y + verticalScrollBar.height) + @intToFloat(f32, @as(c_int, 2)), + .width = @intToFloat(f32, horizontalScrollBarWidth) - @intToFloat(f32, @as(c_int, 4)), + .height = @intToFloat(f32, verticalScrollBarWidth) - @intToFloat(f32, @as(c_int, 4)), + }; + GuiDrawRectangle(corner, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider); + if (scroll != @ptrCast([*c]Vector2, @alignCast(@import("std").meta.alignment(Vector2), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + scroll.* = scrollPos; + } + return view; +} +pub export fn GuiLabel(arg_bounds: Rectangle, arg_text: [*c]const u8) void { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LABEL, if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) TEXT_COLOR_DISABLED else TEXT_COLOR_NORMAL))), guiAlpha)); +} +pub export fn GuiButton(arg_bounds: Rectangle, arg_text: [*c]const u8) bool { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + var pressed: bool = @as(c_int, 0) != 0; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { + pressed = @as(c_int, 1) != 0; + } + } + } + GuiDrawRectangle(bounds, GuiGetStyle(BUTTON, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(BUTTON, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(BUTTON, @bitCast(c_int, @bitCast(c_uint, BASE) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + GuiDrawText(text, GetTextBounds(BUTTON, bounds), GuiGetStyle(BUTTON, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(BUTTON, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + return pressed; +} +pub export fn GuiLabelButton(arg_bounds: Rectangle, arg_text: [*c]const u8) bool { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + var pressed: bool = @as(c_int, 0) != 0; + var textWidth: f32 = MeasureTextEx(guiFont, text, @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SPACING))).x; + if (bounds.width < textWidth) { + bounds.width = textWidth; + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { + pressed = @as(c_int, 1) != 0; + } + } + } + GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LABEL, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + return pressed; +} +pub export fn GuiToggle(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_active: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var active = arg_active; + var state: GuiControlState = guiState; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_NORMAL); + active = !active; + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + if (state == @bitCast(c_uint, GUI_STATE_NORMAL)) { + GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TOGGLE, @bitCast(c_int, if (@as(c_int, @boolToInt(active)) != 0) @bitCast(c_uint, BORDER_COLOR_PRESSED) else @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TOGGLE, @bitCast(c_int, if (@as(c_int, @boolToInt(active)) != 0) @bitCast(c_uint, BASE_COLOR_PRESSED) else @bitCast(c_uint, BASE) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TOGGLE, @bitCast(c_int, if (@as(c_int, @boolToInt(active)) != 0) @bitCast(c_uint, TEXT_COLOR_PRESSED) else @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } else { + GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TOGGLE, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TOGGLE, @bitCast(c_int, @bitCast(c_uint, BASE) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TOGGLE, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + return active; +} +pub export fn GuiToggleGroup(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_active: c_int) c_int { + var bounds = arg_bounds; + var text = arg_text; + var active = arg_active; + var initBoundsX: f32 = bounds.x; + var rows: [32]c_int = [1]c_int{ + 0, + } ++ [1]c_int{0} ** 31; + var itemCount: c_int = 0; + var items: [*c][*c]const u8 = GuiTextSplit(text, &itemCount, @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), &rows))); + var prevRow: c_int = rows[@intCast(c_uint, @as(c_int, 0))]; + { + var i: c_int = 0; + while (i < itemCount) : (i += 1) { + if (prevRow != rows[@intCast(c_uint, i)]) { + bounds.x = initBoundsX; + bounds.y += bounds.height + @intToFloat(f32, GuiGetStyle(TOGGLE, GROUP_PADDING)); + prevRow = rows[@intCast(c_uint, i)]; + } + if (i == active) { + _ = GuiToggle(bounds, (blk: { + const tmp = i; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, @as(c_int, 1) != 0); + } else if (@as(c_int, @boolToInt(GuiToggle(bounds, (blk: { + const tmp = i; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, @as(c_int, 0) != 0))) == @as(c_int, 1)) { + active = i; + } + bounds.x += bounds.width + @intToFloat(f32, GuiGetStyle(TOGGLE, GROUP_PADDING)); + } + } + return active; +} +pub export fn GuiCheckBox(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_checked: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var checked = arg_checked; + var state: GuiControlState = guiState; + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + if (text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + textBounds.width = @intToFloat(f32, GetTextWidth(text)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(CHECKBOX, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_LEFT) { + textBounds.x = (bounds.x - textBounds.width) - @intToFloat(f32, GuiGetStyle(CHECKBOX, TEXT_PADDING)); + } + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + var totalBounds: Rectangle = Rectangle{ + .x = if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_LEFT) textBounds.x else bounds.x, + .y = bounds.y, + .width = (bounds.width + textBounds.width) + @intToFloat(f32, GuiGetStyle(CHECKBOX, TEXT_PADDING)), + .height = bounds.height, + }; + if (CheckCollisionPointRec(mousePoint, totalBounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { + checked = !checked; + } + } + } + GuiDrawRectangle(bounds, GuiGetStyle(CHECKBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(CHECKBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + if (checked) { + var check: Rectangle = Rectangle{ + .x = (bounds.x + @intToFloat(f32, GuiGetStyle(CHECKBOX, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(CHECKBOX, CHECK_PADDING)), + .y = (bounds.y + @intToFloat(f32, GuiGetStyle(CHECKBOX, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(CHECKBOX, CHECK_PADDING)), + .width = bounds.width - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING))), + .height = bounds.height - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING))), + }; + GuiDrawRectangle(check, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(CHECKBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + GuiDrawText(text, textBounds, if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT) GUI_TEXT_ALIGN_LEFT else GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LABEL, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + return checked; +} +pub export fn GuiComboBox(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_active: c_int) c_int { + var bounds = arg_bounds; + var text = arg_text; + var active = arg_active; + var state: GuiControlState = guiState; + bounds.width -= @intToFloat(f32, GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH) + GuiGetStyle(COMBOBOX, COMBO_BUTTON_PADDING)); + var selector: Rectangle = Rectangle{ + .x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(COMBOBOX, COMBO_BUTTON_PADDING)), + .y = bounds.y, + .width = @intToFloat(f32, GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH)), + .height = bounds.height, + }; + var itemCount: c_int = 0; + var items: [*c][*c]const u8 = GuiTextSplit(text, &itemCount, null); + if (active < @as(c_int, 0)) { + active = 0; + } else if (active > (itemCount - @as(c_int, 1))) { + active = itemCount - @as(c_int, 1); + } + if (((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) and (itemCount > @as(c_int, 1))) { + var mousePoint: Vector2 = GetMousePosition(); + if ((@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, bounds))) != 0) or (@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, selector))) != 0)) { + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + active += @as(c_int, 1); + if (active >= itemCount) { + active = 0; + } + } + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + GuiDrawRectangle(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COMBOBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COMBOBOX, @bitCast(c_int, @bitCast(c_uint, BASE) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + GuiDrawText((blk: { + const tmp = active; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(COMBOBOX, bounds), GuiGetStyle(COMBOBOX, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COMBOBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + var tempBorderWidth: c_int = GuiGetStyle(BUTTON, BORDER_WIDTH); + var tempTextAlign: c_int = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, @as(c_int, 1)); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + _ = GuiButton(selector, TextFormat("%i/%i", active + @as(c_int, 1), itemCount)); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + return active; +} +pub export fn GuiDropdownBox(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_active: [*c]c_int, arg_editMode: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var active = arg_active; + var editMode = arg_editMode; + var state: GuiControlState = guiState; + var itemSelected: c_int = active.*; + var itemFocused: c_int = -@as(c_int, 1); + var itemCount: c_int = 0; + var items: [*c][*c]const u8 = GuiTextSplit(text, &itemCount, null); + var boundsOpen: Rectangle = bounds; + boundsOpen.height = @intToFloat(f32, itemCount + @as(c_int, 1)) * (bounds.height + @intToFloat(f32, GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_PADDING))); + var itemBounds: Rectangle = bounds; + var pressed: bool = @as(c_int, 0) != 0; + if (((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and ((@as(c_int, @boolToInt(editMode)) != 0) or !guiLocked)) and (itemCount > @as(c_int, 1))) { + var mousePoint: Vector2 = GetMousePosition(); + if (editMode) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + if (!CheckCollisionPointRec(mousePoint, boundsOpen)) { + if ((@as(c_int, @boolToInt(IsMouseButtonPressed(MOUSE_BUTTON_LEFT))) != 0) or (@as(c_int, @boolToInt(IsMouseButtonReleased(MOUSE_BUTTON_LEFT))) != 0)) { + pressed = @as(c_int, 1) != 0; + } + } + if ((@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, bounds))) != 0) and (@as(c_int, @boolToInt(IsMouseButtonPressed(MOUSE_BUTTON_LEFT))) != 0)) { + pressed = @as(c_int, 1) != 0; + } + { + var i: c_int = 0; + while (i < itemCount) : (i += 1) { + itemBounds.y += bounds.height + @intToFloat(f32, GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_PADDING)); + if (CheckCollisionPointRec(mousePoint, itemBounds)) { + itemFocused = i; + if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { + itemSelected = i; + pressed = @as(c_int, 1) != 0; + } + break; + } + } + } + itemBounds = bounds; + } else { + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + pressed = @as(c_int, 1) != 0; + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + } + if (editMode) { + GuiPanel(boundsOpen); + } + GuiDrawRectangle(bounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, @bitCast(c_int, @bitCast(c_uint, BASE) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + GuiDrawText((blk: { + const tmp = itemSelected; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, bounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + if (editMode) { + { + var i: c_int = 0; + while (i < itemCount) : (i += 1) { + itemBounds.y += bounds.height + @intToFloat(f32, GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_PADDING)); + if (i == itemSelected) { + GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_PRESSED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, BASE_COLOR_PRESSED))), guiAlpha)); + GuiDrawText((blk: { + const tmp = i; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_PRESSED))), guiAlpha)); + } else if (i == itemFocused) { + GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_FOCUSED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, BASE_COLOR_FOCUSED))), guiAlpha)); + GuiDrawText((blk: { + const tmp = i; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_FOCUSED))), guiAlpha)); + } else { + GuiDrawText((blk: { + const tmp = i; + if (tmp >= 0) break :blk items + @intCast(usize, tmp) else break :blk items - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL))), guiAlpha)); + } + } + } + } + GuiDrawText("#120#", Rectangle{ + .x = (bounds.x + bounds.width) - @intToFloat(f32, GuiGetStyle(DROPDOWNBOX, ARROW_PADDING)), + .y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @as(c_int, 6)), + .width = @intToFloat(f32, @as(c_int, 10)), + .height = @intToFloat(f32, @as(c_int, 10)), + }, GUI_TEXT_ALIGN_CENTER, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DROPDOWNBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + active.* = itemSelected; + return pressed; +} +pub export fn GuiSpinner(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_value: [*c]c_int, arg_minValue: c_int, arg_maxValue: c_int, arg_editMode: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + var editMode = arg_editMode; + var state: GuiControlState = guiState; + var pressed: bool = @as(c_int, 0) != 0; + var tempValue: c_int = value.*; + var spinner: Rectangle = Rectangle{ + .x = (bounds.x + @intToFloat(f32, GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH))) + @intToFloat(f32, GuiGetStyle(SPINNER, SPIN_BUTTON_PADDING)), + .y = bounds.y, + .width = bounds.width - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_PADDING))), + .height = bounds.height, + }; + var leftButtonBound: Rectangle = Rectangle{ + .x = bounds.x, + .y = bounds.y, + .width = @intToFloat(f32, GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH)), + .height = bounds.height, + }; + var rightButtonBound: Rectangle = Rectangle{ + .x = (bounds.x + bounds.width) - @intToFloat(f32, GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH)), + .y = bounds.y, + .width = @intToFloat(f32, GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH)), + .height = bounds.height, + }; + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + if (text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + textBounds.width = @intToFloat(f32, GetTextWidth(text)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(SPINNER, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + if (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_LEFT) { + textBounds.x = (bounds.x - textBounds.width) - @intToFloat(f32, GuiGetStyle(SPINNER, TEXT_PADDING)); + } + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + if (!editMode) { + if (tempValue < minValue) { + tempValue = minValue; + } + if (tempValue > maxValue) { + tempValue = maxValue; + } + } + pressed = GuiValueBox(spinner, null, &tempValue, minValue, maxValue, editMode); + var tempBorderWidth: c_int = GuiGetStyle(BUTTON, BORDER_WIDTH); + var tempTextAlign: c_int = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(SPINNER, BORDER_WIDTH)); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + if (GuiButton(leftButtonBound, GuiIconText(RICON_ARROW_LEFT_FILL, null))) { + tempValue -= 1; + } + if (GuiButton(rightButtonBound, GuiIconText(RICON_ARROW_RIGHT_FILL, null))) { + tempValue += 1; + } + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); + GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); + GuiDrawText(text, textBounds, if (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT) GUI_TEXT_ALIGN_LEFT else GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LABEL, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + value.* = tempValue; + return pressed; +} +pub export fn GuiValueBox(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_value: [*c]c_int, arg_minValue: c_int, arg_maxValue: c_int, arg_editMode: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + var editMode = arg_editMode; + var state: GuiControlState = guiState; + var pressed: bool = @as(c_int, 0) != 0; + var textValue: [33]u8 = "\x00"[0..1].* ++ [1]u8{0} ** 32; + _ = sprintf(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &textValue)), "%i", value.*); + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + if (text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + textBounds.width = @intToFloat(f32, GetTextWidth(text)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(VALUEBOX, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_LEFT) { + textBounds.x = (bounds.x - textBounds.width) - @intToFloat(f32, GuiGetStyle(VALUEBOX, TEXT_PADDING)); + } + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + var valueHasChanged: bool = @as(c_int, 0) != 0; + if (editMode) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + var keyCount: c_int = @bitCast(c_int, @truncate(c_uint, strlen(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &textValue))))); + if (keyCount < @as(c_int, 32)) { + if (@intToFloat(f32, GetTextWidth(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &textValue)))) < bounds.width) { + var key: c_int = GetCharPressed(); + if ((key >= @as(c_int, 48)) and (key <= @as(c_int, 57))) { + textValue[@intCast(c_uint, keyCount)] = @bitCast(u8, @truncate(i8, key)); + keyCount += 1; + valueHasChanged = @as(c_int, 1) != 0; + } + } + } + if (keyCount > @as(c_int, 0)) { + if (IsKeyPressed(KEY_BACKSPACE)) { + keyCount -= 1; + textValue[@intCast(c_uint, keyCount)] = '\x00'; + if (keyCount < @as(c_int, 0)) { + keyCount = 0; + } + valueHasChanged = @as(c_int, 1) != 0; + } + } + if (valueHasChanged) { + value.* = TextToInteger(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &textValue))); + } + if ((@as(c_int, @boolToInt(IsKeyPressed(KEY_ENTER))) != 0) or (!CheckCollisionPointRec(mousePoint, bounds) and (@as(c_int, @boolToInt(IsMouseButtonPressed(MOUSE_BUTTON_LEFT))) != 0))) { + pressed = @as(c_int, 1) != 0; + } + } else { + if (value.* > maxValue) { + value.* = maxValue; + } else if (value.* < minValue) { + value.* = minValue; + } + if (CheckCollisionPointRec(mousePoint, bounds)) { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + pressed = @as(c_int, 1) != 0; + } + } + } + } + var baseColor: Color = Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }; + if (state == @bitCast(c_uint, GUI_STATE_PRESSED)) { + baseColor = GetColor(@bitCast(c_uint, GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED))); + } else if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) { + baseColor = GetColor(@bitCast(c_uint, GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED))); + } + GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(VALUEBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), baseColor); + GuiDrawText(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &textValue)), GetTextBounds(VALUEBOX, bounds), GUI_TEXT_ALIGN_CENTER, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(VALUEBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + if (editMode) { + var cursor: Rectangle = Rectangle{ + .x = ((bounds.x + @intToFloat(f32, @divTrunc(GetTextWidth(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &textValue))), @as(c_int, 2)))) + (bounds.width / @intToFloat(f32, @as(c_int, 2)))) + @intToFloat(f32, @as(c_int, 2)), + .y = bounds.y + @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(VALUEBOX, BORDER_WIDTH)), + .width = @intToFloat(f32, @as(c_int, 4)), + .height = bounds.height - @intToFloat(f32, @as(c_int, 4) * GuiGetStyle(VALUEBOX, BORDER_WIDTH)), + }; + GuiDrawRectangle(cursor, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED))), guiAlpha)); + } + GuiDrawText(text, textBounds, if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT) GUI_TEXT_ALIGN_LEFT else GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LABEL, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + return pressed; +} +pub export fn GuiTextBox(arg_bounds: Rectangle, arg_text: [*c]u8, arg_textSize: c_int, arg_editMode: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var textSize = arg_textSize; + var editMode = arg_editMode; + var state: GuiControlState = guiState; + var pressed: bool = @as(c_int, 0) != 0; + var cursor: Rectangle = Rectangle{ + .x = ((bounds.x + @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_PADDING))) + @intToFloat(f32, GetTextWidth(text))) + @intToFloat(f32, @as(c_int, 2)), + .y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), + .width = @intToFloat(f32, @as(c_int, 4)), + .height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)) * @intToFloat(f32, @as(c_int, 2)), + }; + if (cursor.height > bounds.height) { + cursor.height = bounds.height - @intToFloat(f32, GuiGetStyle(TEXTBOX, BORDER_WIDTH) * @as(c_int, 2)); + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (editMode) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + var key: c_int = GetCharPressed(); + var keyCount: c_int = @bitCast(c_int, @truncate(c_uint, strlen(text))); + if (keyCount < (textSize - @as(c_int, 1))) { + var maxWidth: f32 = bounds.width - @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING) * @as(c_int, 2)); + if ((@intToFloat(f32, GetTextWidth(text)) < (maxWidth - @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)))) and (key >= @as(c_int, 32))) { + var byteSize: c_int = 0; + var textUTF8: [*c]const u8 = CodepointToUTF8(key, &byteSize); + { + var i: c_int = 0; + while (i < byteSize) : (i += 1) { + (blk: { + const tmp = keyCount; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = (blk: { + const tmp = i; + if (tmp >= 0) break :blk textUTF8 + @intCast(usize, tmp) else break :blk textUTF8 - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + keyCount += 1; + } + } + (blk: { + const tmp = keyCount; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = '\x00'; + } + } + if (keyCount > @as(c_int, 0)) { + if (IsKeyPressed(KEY_BACKSPACE)) { + keyCount -= 1; + (blk: { + const tmp = keyCount; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = '\x00'; + if (keyCount < @as(c_int, 0)) { + keyCount = 0; + } + } + } + if ((@as(c_int, @boolToInt(IsKeyPressed(KEY_ENTER))) != 0) or (!CheckCollisionPointRec(mousePoint, bounds) and (@as(c_int, @boolToInt(IsMouseButtonPressed(MOUSE_BUTTON_LEFT))) != 0))) { + pressed = @as(c_int, 1) != 0; + } + var textAlignment: c_int = GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT); + if (textAlignment == GUI_TEXT_ALIGN_CENTER) { + cursor.x = ((bounds.x + @intToFloat(f32, @divTrunc(GetTextWidth(text), @as(c_int, 2)))) + (bounds.width / @intToFloat(f32, @as(c_int, 2)))) + @intToFloat(f32, @as(c_int, 1)); + } else if (textAlignment == GUI_TEXT_ALIGN_RIGHT) { + cursor.x = (bounds.x + bounds.width) - @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING)); + } + } else { + if (CheckCollisionPointRec(mousePoint, bounds)) { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + pressed = @as(c_int, 1) != 0; + } + } + } + } + if (state == @bitCast(c_uint, GUI_STATE_PRESSED)) { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED))), guiAlpha)); + } else if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED))), guiAlpha)); + } else { + GuiDrawRectangle(bounds, @as(c_int, 1), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + } + GuiDrawText(text, GetTextBounds(TEXTBOX, bounds), GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + if (editMode) { + GuiDrawRectangle(cursor, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))), guiAlpha)); + } + return pressed; +} +pub export fn GuiTextBoxMulti(arg_bounds: Rectangle, arg_text: [*c]u8, arg_textSize: c_int, arg_editMode: bool) bool { + var bounds = arg_bounds; + var text = arg_text; + var textSize = arg_textSize; + var editMode = arg_editMode; + var state: GuiControlState = guiState; + var pressed: bool = @as(c_int, 0) != 0; + var textAreaBounds: Rectangle = Rectangle{ + .x = (bounds.x + @intToFloat(f32, GuiGetStyle(TEXTBOX, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING)), + .y = (bounds.y + @intToFloat(f32, GuiGetStyle(TEXTBOX, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING)), + .width = bounds.width - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(TEXTBOX, BORDER_WIDTH) + GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING))), + .height = bounds.height - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(TEXTBOX, BORDER_WIDTH) + GuiGetStyle(TEXTBOX, TEXT_INNER_PADDING))), + }; + var cursor: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = @intToFloat(f32, -@as(c_int, 1)), + .width = @intToFloat(f32, @as(c_int, 4)), + .height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)) + @intToFloat(f32, @as(c_int, 2)), + }; + var scaleFactor: f32 = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)) / @intToFloat(f32, guiFont.baseSize); + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (editMode) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + var codepoint: c_int = GetCharPressed(); + var textLength: c_int = @bitCast(c_int, @truncate(c_uint, strlen(text))); + if (textLength < (textSize - @as(c_int, 1))) { + if (IsKeyPressed(KEY_ENTER)) { + (blk: { + const tmp = textLength; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = '\n'; + textLength += 1; + } else if (codepoint >= @as(c_int, 32)) { + var charUTF8Length: c_int = 0; + var charEncoded: [*c]const u8 = CodepointToUTF8(codepoint, &charUTF8Length); + _ = memcpy(@ptrCast(?*anyopaque, text + @bitCast(usize, @intCast(isize, textLength))), @ptrCast(?*const anyopaque, charEncoded), @bitCast(c_ulong, @as(c_long, charUTF8Length))); + textLength += charUTF8Length; + } + } + if (textLength > @as(c_int, 0)) { + if (IsKeyPressed(KEY_BACKSPACE)) { + if (@bitCast(c_int, @as(c_uint, @bitCast(u8, (blk: { + const tmp = textLength - @as(c_int, 1); + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*))) < @as(c_int, 127)) { + textLength -= 1; + (blk: { + const tmp = textLength; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = '\x00'; + } else { + var charUTF8Length: c_int = 0; + while ((@bitCast(c_int, @as(c_uint, @bitCast(u8, (blk: { + const tmp = (textLength - @as(c_int, 1)) - charUTF8Length; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*))) & @as(c_int, 64)) == @as(c_int, 0)) { + charUTF8Length += 1; + } + textLength -= charUTF8Length + @as(c_int, 1); + (blk: { + const tmp = textLength; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = '\x00'; + } + } + } + if (!CheckCollisionPointRec(mousePoint, bounds) and (@as(c_int, @boolToInt(IsMouseButtonPressed(MOUSE_BUTTON_LEFT))) != 0)) { + pressed = @as(c_int, 1) != 0; + } + } else { + if (CheckCollisionPointRec(mousePoint, bounds)) { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + pressed = @as(c_int, 1) != 0; + } + } + } + } + if (state == @bitCast(c_uint, GUI_STATE_PRESSED)) { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED))), guiAlpha)); + } else if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) { + GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED))), guiAlpha)); + } else { + GuiDrawRectangle(bounds, @as(c_int, 1), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + } + var wrapMode: c_int = 1; + var cursorPos: Vector2 = Vector2{ + .x = textAreaBounds.x, + .y = textAreaBounds.y, + }; + { + var i: c_int = 0; + var codepointLength: c_int = 0; + while (@bitCast(c_int, @as(c_uint, (blk: { + const tmp = i; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) != @as(c_int, '\x00')) : (i += codepointLength) { + var codepoint: c_int = GetCodepoint(text + @bitCast(usize, @intCast(isize, i)), &codepointLength); + var index_1: c_int = GetGlyphIndex(guiFont, codepoint); + var atlasRec: Rectangle = (blk: { + const tmp = index_1; + if (tmp >= 0) break :blk guiFont.recs + @intCast(usize, tmp) else break :blk guiFont.recs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + var glyphInfo: GlyphInfo = (blk: { + const tmp = index_1; + if (tmp >= 0) break :blk guiFont.glyphs + @intCast(usize, tmp) else break :blk guiFont.glyphs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + if ((codepointLength == @as(c_int, 1)) and (codepoint == @as(c_int, '\n'))) { + cursorPos.y += (@intToFloat(f32, guiFont.baseSize) * scaleFactor) + @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_LINES_PADDING)); + cursorPos.x = textAreaBounds.x; + } else { + if (wrapMode == @as(c_int, 1)) { + var glyphWidth: c_int = 0; + if (glyphInfo.advanceX != @as(c_int, 0)) { + glyphWidth += glyphInfo.advanceX; + } else { + glyphWidth += @floatToInt(i32, atlasRec.width + @intToFloat(f32, glyphInfo.offsetX)); + } + if ((cursorPos.x + (@intToFloat(f32, glyphWidth) * scaleFactor)) > (textAreaBounds.x + textAreaBounds.width)) { + cursorPos.y += (@intToFloat(f32, guiFont.baseSize) * scaleFactor) + @intToFloat(f32, GuiGetStyle(TEXTBOX, TEXT_LINES_PADDING)); + cursorPos.x = textAreaBounds.x; + } + } else if (wrapMode == @as(c_int, 2)) {} + DrawTextCodepoint(guiFont, codepoint, cursorPos, @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + var glyphWidth: c_int = 0; + if (glyphInfo.advanceX != @as(c_int, 0)) { + glyphWidth += glyphInfo.advanceX; + } else { + glyphWidth += @floatToInt(i32, atlasRec.width + @intToFloat(f32, glyphInfo.offsetX)); + } + cursorPos.x += (@intToFloat(f32, glyphWidth) * scaleFactor) + @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SPACING)); + } + } + } + cursor.x = cursorPos.x; + cursor.y = cursorPos.y; + if (editMode) { + GuiDrawRectangle(cursor, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))), guiAlpha)); + } + return pressed; +} +pub export fn GuiSlider(arg_bounds: Rectangle, arg_textLeft: [*c]const u8, arg_textRight: [*c]const u8, arg_value: f32, arg_minValue: f32, arg_maxValue: f32) f32 { + var bounds = arg_bounds; + var textLeft = arg_textLeft; + var textRight = arg_textRight; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH)); +} +pub export fn GuiSliderBar(arg_bounds: Rectangle, arg_textLeft: [*c]const u8, arg_textRight: [*c]const u8, arg_value: f32, arg_minValue: f32, arg_maxValue: f32) f32 { + var bounds = arg_bounds; + var textLeft = arg_textLeft; + var textRight = arg_textRight; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, @as(c_int, 0)); +} +pub export fn GuiProgressBar(arg_bounds: Rectangle, arg_textLeft: [*c]const u8, arg_textRight: [*c]const u8, arg_value: f32, arg_minValue: f32, arg_maxValue: f32) f32 { + var bounds = arg_bounds; + var textLeft = arg_textLeft; + var textRight = arg_textRight; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + var state: GuiControlState = guiState; + var progress: Rectangle = Rectangle{ + .x = bounds.x + @intToFloat(f32, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)), + .y = (bounds.y + @intToFloat(f32, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING)), + .width = @intToFloat(f32, @as(c_int, 0)), + .height = (bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(PROGRESSBAR, BORDER_WIDTH))) - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING)), + }; + if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) { + progress.width = (value / (maxValue - minValue)) * (bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(PROGRESSBAR, BORDER_WIDTH))); + } + GuiDrawRectangle(bounds, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(PROGRESSBAR, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + if ((state == @bitCast(c_uint, GUI_STATE_NORMAL)) or (state == @bitCast(c_uint, GUI_STATE_PRESSED))) { + GuiDrawRectangle(progress, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(PROGRESSBAR, BASE_COLOR_PRESSED))), guiAlpha)); + } else if (state == @bitCast(c_uint, GUI_STATE_FOCUSED)) { + GuiDrawRectangle(progress, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(PROGRESSBAR, TEXT_COLOR_FOCUSED))), guiAlpha)); + } + if (textLeft != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBounds.width = @intToFloat(f32, GetTextWidth(textLeft)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x - textBounds.width) - @intToFloat(f32, GuiGetStyle(PROGRESSBAR, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + GuiDrawText(textLeft, textBounds, GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(PROGRESSBAR, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + if (textRight != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBounds.width = @intToFloat(f32, GetTextWidth(textRight)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(PROGRESSBAR, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + GuiDrawText(textRight, textBounds, GUI_TEXT_ALIGN_LEFT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(PROGRESSBAR, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + return value; +} +pub export fn GuiStatusBar(arg_bounds: Rectangle, arg_text: [*c]const u8) void { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + GuiDrawRectangle(bounds, GuiGetStyle(STATUSBAR, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(STATUSBAR, if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) BORDER_COLOR_NORMAL else BORDER_COLOR_DISABLED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(STATUSBAR, if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) BASE_COLOR_NORMAL else BASE_COLOR_DISABLED))), guiAlpha)); + GuiDrawText(text, GetTextBounds(STATUSBAR, bounds), GuiGetStyle(STATUSBAR, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(STATUSBAR, if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) TEXT_COLOR_NORMAL else TEXT_COLOR_DISABLED))), guiAlpha)); +} +pub export fn GuiDummyRec(arg_bounds: Rectangle, arg_text: [*c]const u8) void { + var bounds = arg_bounds; + var text = arg_text; + var state: GuiControlState = guiState; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + GuiDrawRectangle(bounds, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) BASE_COLOR_NORMAL else BASE_COLOR_DISABLED))), guiAlpha)); + GuiDrawText(text, GetTextBounds(DEFAULT, bounds), GUI_TEXT_ALIGN_CENTER, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(BUTTON, if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) TEXT_COLOR_NORMAL else TEXT_COLOR_DISABLED))), guiAlpha)); +} +pub export fn GuiScrollBar(arg_bounds: Rectangle, arg_value: c_int, arg_minValue: c_int, arg_maxValue: c_int) c_int { + var bounds = arg_bounds; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + var state: GuiControlState = guiState; + var isVertical: bool = (if (bounds.width > bounds.height) @as(c_int, 0) else @as(c_int, 1)) != 0; + const spinnerSize: c_int = if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE) != 0) if (@as(c_int, @boolToInt(isVertical)) != 0) @floatToInt(c_int, bounds.width) - (@as(c_int, 2) * GuiGetStyle(SCROLLBAR, BORDER_WIDTH)) else @floatToInt(c_int, bounds.height) - (@as(c_int, 2) * GuiGetStyle(SCROLLBAR, BORDER_WIDTH)) else @as(c_int, 0); + var arrowUpLeft: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + var arrowDownRight: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + var scrollbar: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + var slider: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + if (value > maxValue) { + value = maxValue; + } + if (value < minValue) { + value = minValue; + } + const range: c_int = maxValue - minValue; + var sliderSize: c_int = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); + arrowUpLeft = Rectangle{ + .x = bounds.x + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .y = bounds.y + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .width = @intToFloat(f32, spinnerSize), + .height = @intToFloat(f32, spinnerSize), + }; + if (isVertical) { + arrowDownRight = Rectangle{ + .x = bounds.x + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .y = ((bounds.y + bounds.height) - @intToFloat(f32, spinnerSize)) - @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .width = @intToFloat(f32, spinnerSize), + .height = @intToFloat(f32, spinnerSize), + }; + scrollbar = Rectangle{ + .x = (bounds.x + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_PADDING)), + .y = arrowUpLeft.y + arrowUpLeft.height, + .width = bounds.width - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING))), + .height = ((bounds.height - arrowUpLeft.height) - arrowDownRight.height) - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + }; + sliderSize = if (@intToFloat(f32, sliderSize) >= scrollbar.height) @floatToInt(c_int, scrollbar.height) - @as(c_int, 2) else sliderSize; + slider = Rectangle{ + .x = (bounds.x + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)), + .y = scrollbar.y + @intToFloat(f32, @floatToInt(c_int, (@intToFloat(f32, value - minValue) / @intToFloat(f32, range)) * (scrollbar.height - @intToFloat(f32, sliderSize)))), + .width = bounds.width - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING))), + .height = @intToFloat(f32, sliderSize), + }; + } else { + arrowDownRight = Rectangle{ + .x = ((bounds.x + bounds.width) - @intToFloat(f32, spinnerSize)) - @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .y = bounds.y + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .width = @intToFloat(f32, spinnerSize), + .height = @intToFloat(f32, spinnerSize), + }; + scrollbar = Rectangle{ + .x = arrowUpLeft.x + arrowUpLeft.width, + .y = (bounds.y + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_PADDING)), + .width = ((bounds.width - arrowUpLeft.width) - arrowDownRight.width) - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .height = bounds.height - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING))), + }; + sliderSize = if (@intToFloat(f32, sliderSize) >= scrollbar.width) @floatToInt(c_int, scrollbar.width) - @as(c_int, 2) else sliderSize; + slider = Rectangle{ + .x = scrollbar.x + @intToFloat(f32, @floatToInt(c_int, (@intToFloat(f32, value - minValue) / @intToFloat(f32, range)) * (scrollbar.width - @intToFloat(f32, sliderSize)))), + .y = (bounds.y + @intToFloat(f32, GuiGetStyle(SCROLLBAR, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)), + .width = @intToFloat(f32, sliderSize), + .height = bounds.height - @intToFloat(f32, @as(c_int, 2) * (GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING))), + }; + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + var wheel: c_int = @floatToInt(c_int, GetMouseWheelMove()); + if (wheel != @as(c_int, 0)) { + value += wheel; + } + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) { + value -= @divTrunc(range, GuiGetStyle(SCROLLBAR, SCROLL_SPEED)); + } else if (CheckCollisionPointRec(mousePoint, arrowDownRight)) { + value += @divTrunc(range, GuiGetStyle(SCROLLBAR, SCROLL_SPEED)); + } + state = @bitCast(c_uint, GUI_STATE_PRESSED); + } else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + if (!isVertical) { + var scrollArea: Rectangle = Rectangle{ + .x = arrowUpLeft.x + arrowUpLeft.width, + .y = arrowUpLeft.y, + .width = scrollbar.width, + .height = bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + }; + if (CheckCollisionPointRec(mousePoint, scrollArea)) { + value = @floatToInt(c_int, ((((mousePoint.x - scrollArea.x) - (slider.width / @intToFloat(f32, @as(c_int, 2)))) * @intToFloat(f32, range)) / (scrollArea.width - slider.width)) + @intToFloat(f32, minValue)); + } + } else { + var scrollArea: Rectangle = Rectangle{ + .x = arrowUpLeft.x, + .y = arrowUpLeft.y + arrowUpLeft.height, + .width = bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SCROLLBAR, BORDER_WIDTH)), + .height = scrollbar.height, + }; + if (CheckCollisionPointRec(mousePoint, scrollArea)) { + value = @floatToInt(c_int, ((((mousePoint.y - scrollArea.y) - (slider.height / @intToFloat(f32, @as(c_int, 2)))) * @intToFloat(f32, range)) / (scrollArea.height - slider.height)) + @intToFloat(f32, minValue)); + } + } + } + } + if (value > maxValue) { + value = maxValue; + } + if (value < minValue) { + value = minValue; + } + } + GuiDrawRectangle(bounds, GuiGetStyle(SCROLLBAR, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED))), guiAlpha)); + GuiDrawRectangle(scrollbar, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(BUTTON, BASE_COLOR_NORMAL))), guiAlpha)); + GuiDrawRectangle(slider, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE) != 0) { + GuiDrawText(if (@as(c_int, @boolToInt(isVertical)) != 0) "#121#" else "#118#", Rectangle{ + .x = arrowUpLeft.x, + .y = arrowUpLeft.y, + .width = if (@as(c_int, @boolToInt(isVertical)) != 0) bounds.width else bounds.height, + .height = if (@as(c_int, @boolToInt(isVertical)) != 0) bounds.width else bounds.height, + }, GUI_TEXT_ALIGN_CENTER, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SCROLLBAR, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + GuiDrawText(if (@as(c_int, @boolToInt(isVertical)) != 0) "#120#" else "#119#", Rectangle{ + .x = arrowDownRight.x, + .y = arrowDownRight.y, + .width = if (@as(c_int, @boolToInt(isVertical)) != 0) bounds.width else bounds.height, + .height = if (@as(c_int, @boolToInt(isVertical)) != 0) bounds.width else bounds.height, + }, GUI_TEXT_ALIGN_CENTER, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SCROLLBAR, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + return value; +} +pub export fn GuiGrid(arg_bounds: Rectangle, arg_spacing: f32, arg_subdivs: c_int) Vector2 { + var bounds = arg_bounds; + var spacing = arg_spacing; + var subdivs = arg_subdivs; + var state: GuiControlState = guiState; + var mousePoint: Vector2 = GetMousePosition(); + var currentCell: Vector2 = Vector2{ + .x = @intToFloat(f32, -@as(c_int, 1)), + .y = @intToFloat(f32, -@as(c_int, 1)), + }; + var linesV: c_int = (@floatToInt(c_int, bounds.width / spacing) * subdivs) + @as(c_int, 1); + var linesH: c_int = (@floatToInt(c_int, bounds.height / spacing) * subdivs) + @as(c_int, 1); + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + if (CheckCollisionPointRec(mousePoint, bounds)) { + currentCell.x = (mousePoint.x - bounds.x) / spacing; + currentCell.y = (mousePoint.y - bounds.y) / spacing; + } + } + while (true) { + switch (state) { + @bitCast(c_uint, @as(c_int, 0)) => { + { + if (subdivs > @as(c_int, 0)) { + { + var i: c_int = 0; + while (i < linesV) : (i += 1) { + var lineV: Rectangle = Rectangle{ + .x = bounds.x + ((spacing * @intToFloat(f32, i)) / @intToFloat(f32, subdivs)), + .y = bounds.y, + .width = @intToFloat(f32, @as(c_int, 1)), + .height = bounds.height, + }; + GuiDrawRectangle(lineV, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, if (@import("std").zig.c_translation.signedRemainder(i, subdivs) == @as(c_int, 0)) Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, LINE_COLOR))), 0.15000000596046448 * @intToFloat(f32, @as(c_int, 4))) else Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, LINE_COLOR))), 0.15000000596046448)); + } + } + { + var i: c_int = 0; + while (i < linesH) : (i += 1) { + var lineH: Rectangle = Rectangle{ + .x = bounds.x, + .y = bounds.y + ((spacing * @intToFloat(f32, i)) / @intToFloat(f32, subdivs)), + .width = bounds.width, + .height = @intToFloat(f32, @as(c_int, 1)), + }; + GuiDrawRectangle(lineH, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, if (@import("std").zig.c_translation.signedRemainder(i, subdivs) == @as(c_int, 0)) Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, LINE_COLOR))), 0.15000000596046448 * @intToFloat(f32, @as(c_int, 4))) else Fade(GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, LINE_COLOR))), 0.15000000596046448)); + } + } + } + } + break; + }, + else => break, + } + break; + } + return currentCell; +} +pub export fn GuiListView(arg_bounds: Rectangle, arg_text: [*c]const u8, arg_scrollIndex: [*c]c_int, arg_active: c_int) c_int { + var bounds = arg_bounds; + var text = arg_text; + var scrollIndex = arg_scrollIndex; + var active = arg_active; + var itemCount: c_int = 0; + var items: [*c][*c]const u8 = null; + if (text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + items = GuiTextSplit(text, &itemCount, null); + } + return GuiListViewEx(bounds, items, itemCount, null, scrollIndex, active); +} +pub export fn GuiListViewEx(arg_bounds: Rectangle, arg_text: [*c][*c]const u8, arg_count: c_int, arg_focus: [*c]c_int, arg_scrollIndex: [*c]c_int, arg_active: c_int) c_int { + var bounds = arg_bounds; + var text = arg_text; + var count = arg_count; + var focus = arg_focus; + var scrollIndex = arg_scrollIndex; + var active = arg_active; + var state: GuiControlState = guiState; + var itemFocused: c_int = if (focus == @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), @intToPtr(?*anyopaque, @as(c_int, 0))))) -@as(c_int, 1) else focus.*; + var itemSelected: c_int = active; + var useScrollBar: bool = @as(c_int, 0) != 0; + if (@intToFloat(f32, (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING)) * count) > bounds.height) { + useScrollBar = @as(c_int, 1) != 0; + } + var itemBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + itemBounds.x = bounds.x + @intToFloat(f32, GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING)); + itemBounds.y = (bounds.y + @intToFloat(f32, GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING))) + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)); + itemBounds.width = (bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING))) - @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)); + itemBounds.height = @intToFloat(f32, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT)); + if (useScrollBar) { + itemBounds.width -= @intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH)); + } + var visibleItems: c_int = @divTrunc(@floatToInt(c_int, bounds.height), GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING)); + if (visibleItems > count) { + visibleItems = count; + } + var startIndex: c_int = if (scrollIndex == @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), @intToPtr(?*anyopaque, @as(c_int, 0))))) @as(c_int, 0) else scrollIndex.*; + if ((startIndex < @as(c_int, 0)) or (startIndex > (count - visibleItems))) { + startIndex = 0; + } + var endIndex: c_int = startIndex + visibleItems; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + { + var i: c_int = 0; + while (i < visibleItems) : (i += 1) { + if (CheckCollisionPointRec(mousePoint, itemBounds)) { + itemFocused = startIndex + i; + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + if (itemSelected == (startIndex + i)) { + itemSelected = -@as(c_int, 1); + } else { + itemSelected = startIndex + i; + } + } + break; + } + itemBounds.y += @intToFloat(f32, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING)); + } + } + if (useScrollBar) { + var wheelMove: c_int = @floatToInt(c_int, GetMouseWheelMove()); + startIndex -= wheelMove; + if (startIndex < @as(c_int, 0)) { + startIndex = 0; + } else if (startIndex > (count - visibleItems)) { + startIndex = count - visibleItems; + } + endIndex = startIndex + visibleItems; + if (endIndex > count) { + endIndex = count; + } + } + } else { + itemFocused = -@as(c_int, 1); + } + itemBounds.y = (bounds.y + @intToFloat(f32, GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING))) + @intToFloat(f32, GuiGetStyle(DEFAULT, BORDER_WIDTH)); + } + GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), GetColor(@bitCast(c_uint, GuiGetStyle(DEFAULT, BACKGROUND_COLOR)))); + { + var i: c_int = 0; + while ((i < visibleItems) and (text != @ptrCast([*c][*c]const u8, @alignCast(@import("std").meta.alignment([*c]const u8), @intToPtr(?*anyopaque, @as(c_int, 0)))))) : (i += 1) { + if (state == @bitCast(c_uint, GUI_STATE_DISABLED)) { + if ((startIndex + i) == itemSelected) { + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED))), guiAlpha)); + } + GuiDrawText((blk: { + const tmp = startIndex + i; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED))), guiAlpha)); + } else { + if ((startIndex + i) == itemSelected) { + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED))), guiAlpha)); + GuiDrawText((blk: { + const tmp = startIndex + i; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED))), guiAlpha)); + } else if ((startIndex + i) == itemFocused) { + GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED))), guiAlpha)); + GuiDrawText((blk: { + const tmp = startIndex + i; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED))), guiAlpha)); + } else { + GuiDrawText((blk: { + const tmp = startIndex + i; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*, GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL))), guiAlpha)); + } + } + itemBounds.y += @intToFloat(f32, GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_PADDING)); + } + } + if (useScrollBar) { + var scrollBarBounds: Rectangle = Rectangle{ + .x = ((bounds.x + bounds.width) - @intToFloat(f32, GuiGetStyle(LISTVIEW, BORDER_WIDTH))) - @intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH)), + .y = bounds.y + @intToFloat(f32, GuiGetStyle(LISTVIEW, BORDER_WIDTH)), + .width = @intToFloat(f32, GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH)), + .height = bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(DEFAULT, BORDER_WIDTH)), + }; + var percentVisible: f32 = @intToFloat(f32, endIndex - startIndex) / @intToFloat(f32, count); + var sliderSize: f32 = bounds.height * percentVisible; + var prevSliderSize: c_int = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); + var prevScrollSpeed: c_int = GuiGetStyle(SCROLLBAR, SCROLL_SPEED); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, @floatToInt(c_int, sliderSize)); + GuiSetStyle(SCROLLBAR, SCROLL_SPEED, count - visibleItems); + startIndex = GuiScrollBar(scrollBarBounds, startIndex, @as(c_int, 0), count - visibleItems); + GuiSetStyle(SCROLLBAR, SCROLL_SPEED, prevScrollSpeed); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, prevSliderSize); + } + if (focus != @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + focus.* = itemFocused; + } + if (scrollIndex != @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + scrollIndex.* = startIndex; + } + return itemSelected; +} +pub export fn GuiMessageBox(arg_bounds: Rectangle, arg_title: [*c]const u8, arg_message: [*c]const u8, arg_buttons: [*c]const u8) c_int { + var bounds = arg_bounds; + var title = arg_title; + var message = arg_message; + var buttons = arg_buttons; + var clicked: c_int = -@as(c_int, 1); + var buttonCount: c_int = 0; + var buttonsText: [*c][*c]const u8 = GuiTextSplit(buttons, &buttonCount, null); + var buttonBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + buttonBounds.x = bounds.x + @intToFloat(f32, @as(c_int, 10)); + buttonBounds.y = ((bounds.y + bounds.height) - @intToFloat(f32, @as(c_int, 24))) - @intToFloat(f32, @as(c_int, 10)); + buttonBounds.width = (bounds.width - @intToFloat(f32, @as(c_int, 10) * (buttonCount + @as(c_int, 1)))) / @intToFloat(f32, buttonCount); + buttonBounds.height = 24; + var textSize: Vector2 = MeasureTextEx(guiFont, message, @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), @intToFloat(f32, @as(c_int, 1))); + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBounds.x = (bounds.x + (bounds.width / @intToFloat(f32, @as(c_int, 2)))) - (textSize.x / @intToFloat(f32, @as(c_int, 2))); + textBounds.y = ((bounds.y + @intToFloat(f32, @as(c_int, 22))) + ((((bounds.height - @intToFloat(f32, @as(c_int, 22))) - @intToFloat(f32, @as(c_int, 24))) - @intToFloat(f32, @as(c_int, 10))) / @intToFloat(f32, @as(c_int, 2)))) - (textSize.y / @intToFloat(f32, @as(c_int, 2))); + textBounds.width = textSize.x; + textBounds.height = textSize.y; + if (GuiWindowBox(bounds, title)) { + clicked = 0; + } + var prevTextAlignment: c_int = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + GuiLabel(textBounds, message); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); + prevTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + { + var i: c_int = 0; + while (i < buttonCount) : (i += 1) { + if (GuiButton(buttonBounds, (blk: { + const tmp = i; + if (tmp >= 0) break :blk buttonsText + @intCast(usize, tmp) else break :blk buttonsText - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) { + clicked = i + @as(c_int, 1); + } + buttonBounds.x += buttonBounds.width + @intToFloat(f32, @as(c_int, 10)); + } + } + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevTextAlignment); + return clicked; +} +pub export fn GuiTextInputBox(arg_bounds: Rectangle, arg_title: [*c]const u8, arg_message: [*c]const u8, arg_buttons: [*c]const u8, arg_text: [*c]u8) c_int { + var bounds = arg_bounds; + var title = arg_title; + var message = arg_message; + var buttons = arg_buttons; + var text = arg_text; + const textEditMode = struct { + var static: bool = @as(c_int, 0) != 0; + }; + var btnIndex: c_int = -@as(c_int, 1); + var buttonCount: c_int = 0; + var buttonsText: [*c][*c]const u8 = GuiTextSplit(buttons, &buttonCount, null); + var buttonBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + buttonBounds.x = bounds.x + @intToFloat(f32, @as(c_int, 10)); + buttonBounds.y = ((bounds.y + bounds.height) - @intToFloat(f32, @as(c_int, 24))) - @intToFloat(f32, @as(c_int, 10)); + buttonBounds.width = (bounds.width - @intToFloat(f32, @as(c_int, 10) * (buttonCount + @as(c_int, 1)))) / @intToFloat(f32, buttonCount); + buttonBounds.height = 24; + var messageInputHeight: c_int = (((@floatToInt(c_int, bounds.height) - @as(c_int, 22)) - GuiGetStyle(STATUSBAR, BORDER_WIDTH)) - @as(c_int, 24)) - (@as(c_int, 2) * @as(c_int, 10)); + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + if (message != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var textSize: Vector2 = MeasureTextEx(guiFont, message, @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), @intToFloat(f32, @as(c_int, 1))); + textBounds.x = (bounds.x + (bounds.width / @intToFloat(f32, @as(c_int, 2)))) - (textSize.x / @intToFloat(f32, @as(c_int, 2))); + textBounds.y = ((bounds.y + @intToFloat(f32, @as(c_int, 22))) + @intToFloat(f32, @divTrunc(messageInputHeight, @as(c_int, 4)))) - (textSize.y / @intToFloat(f32, @as(c_int, 2))); + textBounds.width = textSize.x; + textBounds.height = textSize.y; + } + var textBoxBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBoxBounds.x = bounds.x + @intToFloat(f32, @as(c_int, 10)); + textBoxBounds.y = (bounds.y + @intToFloat(f32, @as(c_int, 22))) - @intToFloat(f32, @divTrunc(@as(c_int, 30), @as(c_int, 2))); + if (message == @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + textBoxBounds.y += @intToFloat(f32, @divTrunc(messageInputHeight, @as(c_int, 2))); + } else { + textBoxBounds.y += @intToFloat(f32, @divTrunc(messageInputHeight, @as(c_int, 2)) + @divTrunc(messageInputHeight, @as(c_int, 4))); + } + textBoxBounds.width = bounds.width - @intToFloat(f32, @as(c_int, 10) * @as(c_int, 2)); + textBoxBounds.height = 30; + if (GuiWindowBox(bounds, title)) { + btnIndex = 0; + } + if (message != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var prevTextAlignment: c_int = GuiGetStyle(LABEL, TEXT_ALIGNMENT); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + GuiLabel(textBounds, message); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); + } + if (GuiTextBox(textBoxBounds, text, @as(c_int, 256), textEditMode.static)) { + textEditMode.static = !textEditMode.static; + } + var prevBtnTextAlignment: c_int = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + { + var i: c_int = 0; + while (i < buttonCount) : (i += 1) { + if (GuiButton(buttonBounds, (blk: { + const tmp = i; + if (tmp >= 0) break :blk buttonsText + @intCast(usize, tmp) else break :blk buttonsText - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) { + btnIndex = i + @as(c_int, 1); + } + buttonBounds.x += buttonBounds.width + @intToFloat(f32, @as(c_int, 10)); + } + } + GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevBtnTextAlignment); + return btnIndex; +} +pub export fn GuiColorPicker(arg_bounds: Rectangle, arg_color: Color) Color { + var bounds = arg_bounds; + var color = arg_color; + color = GuiColorPanel(bounds, color); + var boundsHue: Rectangle = Rectangle{ + .x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_PADDING)), + .y = bounds.y, + .width = @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_WIDTH)), + .height = bounds.height, + }; + var hsv: Vector3 = ConvertRGBtoHSV(Vector3{ + .x = @intToFloat(f32, @bitCast(c_int, @as(c_uint, color.r))) / 255.0, + .y = @intToFloat(f32, @bitCast(c_int, @as(c_uint, color.g))) / 255.0, + .z = @intToFloat(f32, @bitCast(c_int, @as(c_uint, color.b))) / 255.0, + }); + hsv.x = GuiColorBarHue(boundsHue, hsv.x); + var rgb: Vector3 = ConvertHSVtoRGB(hsv); + color = Color{ + .r = @floatToInt(u8, roundf(rgb.x * 255.0)), + .g = @floatToInt(u8, roundf(rgb.y * 255.0)), + .b = @floatToInt(u8, roundf(rgb.z * 255.0)), + .a = color.a, + }; + return color; +} +pub export fn GuiColorPanel(arg_bounds: Rectangle, arg_color: Color) Color { + var bounds = arg_bounds; + var color = arg_color; + const colWhite: Color = Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }; + const colBlack: Color = Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }; + var state: GuiControlState = guiState; + var pickerSelector: Vector2 = Vector2{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + }; + var vcolor: Vector3 = Vector3{ + .x = @intToFloat(f32, color.r) / 255.0, + .y = @intToFloat(f32, color.g) / 255.0, + .z = @intToFloat(f32, color.b) / 255.0, + }; + var hsv: Vector3 = ConvertRGBtoHSV(vcolor); + pickerSelector.x = bounds.x + (hsv.y * bounds.width); + pickerSelector.y = bounds.y + ((1.0 - hsv.z) * bounds.height); + var hue: f32 = -1.0; + var maxHue: Vector3 = Vector3{ + .x = if (hue >= 0.0) hue else hsv.x, + .y = 1.0, + .z = 1.0, + }; + var rgbHue: Vector3 = ConvertHSVtoRGB(maxHue); + var maxHueCol: Color = Color{ + .r = @floatToInt(u8, 255.0 * rgbHue.x), + .g = @floatToInt(u8, 255.0 * rgbHue.y), + .b = @floatToInt(u8, 255.0 * rgbHue.z), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + pickerSelector = mousePoint; + var colorPick: Vector2 = Vector2{ + .x = pickerSelector.x - bounds.x, + .y = pickerSelector.y - bounds.y, + }; + colorPick.x /= bounds.width; + colorPick.y /= bounds.height; + hsv.y = colorPick.x; + hsv.z = 1.0 - colorPick.y; + var rgb: Vector3 = ConvertHSVtoRGB(hsv); + color = Color{ + .r = @floatToInt(u8, 255.0 * rgb.x), + .g = @floatToInt(u8, 255.0 * rgb.y), + .b = @floatToInt(u8, 255.0 * rgb.z), + .a = @floatToInt(u8, (255.0 * @intToFloat(f32, color.a)) / 255.0), + }; + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) { + DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha)); + DrawRectangleGradientEx(bounds, Fade(colBlack, @intToFloat(f32, @as(c_int, 0))), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, @intToFloat(f32, @as(c_int, 0)))); + var selector: Rectangle = Rectangle{ + .x = pickerSelector.x - @intToFloat(f32, @divTrunc(GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), @as(c_int, 2))), + .y = pickerSelector.y - @intToFloat(f32, @divTrunc(GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), @as(c_int, 2))), + .width = @intToFloat(f32, GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)), + .height = @intToFloat(f32, GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)), + }; + GuiDrawRectangle(selector, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(colWhite, guiAlpha)); + } else { + DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED))), 0.10000000149011612), guiAlpha), Fade(Fade(colBlack, 0.6000000238418579), guiAlpha), Fade(Fade(colBlack, 0.6000000238418579), guiAlpha), Fade(Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED))), 0.6000000238418579), guiAlpha)); + } + GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + return color; +} +pub export fn GuiColorBarAlpha(arg_bounds: Rectangle, arg_alpha: f32) f32 { + var bounds = arg_bounds; + var alpha = arg_alpha; + var state: GuiControlState = guiState; + var selector: Rectangle = Rectangle{ + .x = (bounds.x + (alpha * bounds.width)) - @intToFloat(f32, @divTrunc(GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT), @as(c_int, 2))), + .y = bounds.y - @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)), + .width = @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)), + .height = bounds.height + @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW) * @as(c_int, 2)), + }; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if ((@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, bounds))) != 0) or (@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, selector))) != 0)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + alpha = (mousePoint.x - bounds.x) / bounds.width; + if (alpha <= 0.0) { + alpha = 0.0; + } + if (alpha >= 1.0) { + alpha = 1.0; + } + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) { + var checksX: c_int = @divTrunc(@floatToInt(c_int, bounds.width), @as(c_int, 10)); + var checksY: c_int = @divTrunc(@floatToInt(c_int, bounds.height), @as(c_int, 10)); + { + var x: c_int = 0; + while (x < checksX) : (x += 1) { + { + var y: c_int = 0; + while (y < checksY) : (y += 1) { + var check: Rectangle = Rectangle{ + .x = bounds.x + @intToFloat(f32, x * @as(c_int, 10)), + .y = bounds.y + @intToFloat(f32, y * @as(c_int, 10)), + .width = @intToFloat(f32, @as(c_int, 10)), + .height = @intToFloat(f32, @as(c_int, 10)), + }; + GuiDrawRectangle(check, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, if (@import("std").zig.c_translation.signedRemainder(x + y, @as(c_int, 2)) != 0) Fade(Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED))), 0.4000000059604645), guiAlpha) else Fade(Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED))), 0.4000000059604645), guiAlpha)); + } + } + } + } + DrawRectangleGradientEx(bounds, Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + } else { + DrawRectangleGradientEx(bounds, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED))), 0.10000000149011612), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED))), 0.10000000149011612), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED))), guiAlpha)); + } + GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + GuiDrawRectangle(selector, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + return alpha; +} +pub export fn GuiColorBarHue(arg_bounds: Rectangle, arg_hue: f32) f32 { + var bounds = arg_bounds; + var hue = arg_hue; + var state: GuiControlState = guiState; + var selector: Rectangle = Rectangle{ + .x = bounds.x - @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)), + .y = (bounds.y + ((hue / 360.0) * bounds.height)) - @intToFloat(f32, @divTrunc(GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT), @as(c_int, 2))), + .width = bounds.width + @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW) * @as(c_int, 2)), + .height = @intToFloat(f32, GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)), + }; + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if ((@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, bounds))) != 0) or (@as(c_int, @boolToInt(CheckCollisionPointRec(mousePoint, selector))) != 0)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + hue = ((mousePoint.y - bounds.y) * @intToFloat(f32, @as(c_int, 360))) / bounds.height; + if (hue <= 0.0) { + hue = 0.0; + } + if (hue >= 359.0) { + hue = 359.0; + } + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + } + if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) { + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y), @floatToInt(c_int, bounds.width), @floatToInt(c_int, ceil(@floatCast(f64, bounds.height / @intToFloat(f32, @as(c_int, 6))))), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 6)))), @floatToInt(c_int, bounds.width), @floatToInt(c_int, ceil(@floatCast(f64, bounds.height / @intToFloat(f32, @as(c_int, 6))))), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y + (@intToFloat(f32, @as(c_int, 2)) * (bounds.height / @intToFloat(f32, @as(c_int, 6))))), @floatToInt(c_int, bounds.width), @floatToInt(c_int, ceil(@floatCast(f64, bounds.height / @intToFloat(f32, @as(c_int, 6))))), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y + (@intToFloat(f32, @as(c_int, 3)) * (bounds.height / @intToFloat(f32, @as(c_int, 6))))), @floatToInt(c_int, bounds.width), @floatToInt(c_int, ceil(@floatCast(f64, bounds.height / @intToFloat(f32, @as(c_int, 6))))), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y + (@intToFloat(f32, @as(c_int, 4)) * (bounds.height / @intToFloat(f32, @as(c_int, 6))))), @floatToInt(c_int, bounds.width), @floatToInt(c_int, ceil(@floatCast(f64, bounds.height / @intToFloat(f32, @as(c_int, 6))))), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y + (@intToFloat(f32, @as(c_int, 5)) * (bounds.height / @intToFloat(f32, @as(c_int, 6))))), @floatToInt(c_int, bounds.width), @floatToInt(c_int, bounds.height / @intToFloat(f32, @as(c_int, 6))), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha), Fade(Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 255))), + }, guiAlpha)); + } else { + DrawRectangleGradientV(@floatToInt(c_int, bounds.x), @floatToInt(c_int, bounds.y), @floatToInt(c_int, bounds.width), @floatToInt(c_int, bounds.height), Fade(Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED))), 0.10000000149011612), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED))), guiAlpha)); + } + GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }); + GuiDrawRectangle(selector, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(COLORPICKER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + return hue; +} +pub const struct__IO_marker = opaque {}; +pub const __off_t = c_long; +pub const _IO_lock_t = anyopaque; +pub const __off64_t = c_long; +pub const struct__IO_codecvt = opaque {}; +pub const struct__IO_wide_data = opaque {}; +pub const struct__IO_FILE = extern struct { + _flags: c_int, + _IO_read_ptr: [*c]u8, + _IO_read_end: [*c]u8, + _IO_read_base: [*c]u8, + _IO_write_base: [*c]u8, + _IO_write_ptr: [*c]u8, + _IO_write_end: [*c]u8, + _IO_buf_base: [*c]u8, + _IO_buf_end: [*c]u8, + _IO_save_base: [*c]u8, + _IO_backup_base: [*c]u8, + _IO_save_end: [*c]u8, + _markers: ?*struct__IO_marker, + _chain: [*c]struct__IO_FILE, + _fileno: c_int, + _flags2: c_int, + _old_offset: __off_t, + _cur_column: c_ushort, + _vtable_offset: i8, + _shortbuf: [1]u8, + _lock: ?*_IO_lock_t, + _offset: __off64_t, + _codecvt: ?*struct__IO_codecvt, + _wide_data: ?*struct__IO_wide_data, + _freeres_list: [*c]struct__IO_FILE, + _freeres_buf: ?*anyopaque, + __pad5: usize, + _mode: c_int, + _unused2: [20]u8, +}; +pub const FILE = struct__IO_FILE; +pub export fn GuiLoadStyle(arg_fileName: [*c]const u8) void { + var fileName = arg_fileName; + var tryBinary: bool = @as(c_int, 0) != 0; + var rgsFile: [*c]FILE = fopen(fileName, "rt"); + if (rgsFile != @ptrCast([*c]FILE, @alignCast(@import("std").meta.alignment(FILE), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var buffer: [256]u8 = [1]u8{ + 0, + } ++ [1]u8{0} ** 255; + _ = fgets(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer)), @as(c_int, 256), rgsFile); + if (@bitCast(c_int, @as(c_uint, buffer[@intCast(c_uint, @as(c_int, 0))])) == @as(c_int, '#')) { + var controlId: c_int = 0; + var propertyId: c_int = 0; + var propertyValue: c_uint = 0; + while (!(feof(rgsFile) != 0)) { + while (true) { + switch (@bitCast(c_int, @as(c_uint, buffer[@intCast(c_uint, @as(c_int, 0))]))) { + @as(c_int, 112) => { + { + _ = sscanf(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer)), "p %d %d 0x%x", &controlId, &propertyId, &propertyValue); + GuiSetStyle(controlId, propertyId, @bitCast(c_int, propertyValue)); + } + break; + }, + @as(c_int, 102) => { + { + var fontSize: c_int = 0; + var charmapFileName: [256]u8 = [1]u8{ + 0, + } ++ [1]u8{0} ** 255; + var fontFileName: [256]u8 = [1]u8{ + 0, + } ++ [1]u8{0} ** 255; + _ = sscanf(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer)), "f %d %s %[^\r\n]s", &fontSize, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &charmapFileName)), @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &fontFileName))); + var font: Font = Font{ + .baseSize = @as(c_int, 0), + .glyphCount = 0, + .glyphPadding = 0, + .texture = @import("std").mem.zeroes(struct_Texture), + .recs = null, + .glyphs = null, + }; + if (@bitCast(c_int, @as(c_uint, charmapFileName[@intCast(c_uint, @as(c_int, 0))])) != @as(c_int, '0')) { + var charValues: [*c]u8 = LoadFileText(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &charmapFileName))); + if (charValues != @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var glyphCount: c_int = 0; + var chars: [*c][*c]const u8 = TextSplit(charValues, @bitCast(u8, @truncate(i8, @as(c_int, '\n'))), &glyphCount); + var values: [*c]c_int = @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), malloc(@bitCast(c_ulong, @as(c_long, glyphCount)) *% @sizeOf(c_int)))); + { + var i: c_int = 0; + while (i < glyphCount) : (i += 1) { + (blk: { + const tmp = i; + if (tmp >= 0) break :blk values + @intCast(usize, tmp) else break :blk values - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = TextToInteger((blk: { + const tmp = i; + if (tmp >= 0) break :blk chars + @intCast(usize, tmp) else break :blk chars - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*); + } + } + font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &fontFileName))), fontSize, values, glyphCount); + free(@ptrCast(?*anyopaque, values)); + } + } else { + font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &fontFileName))), fontSize, null, @as(c_int, 0)); + } + if ((font.texture.id > @bitCast(c_uint, @as(c_int, 0))) and (font.glyphCount > @as(c_int, 0))) { + GuiSetFont(font); + } + } + break; + }, + else => break, + } + break; + } + _ = fgets(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer)), @as(c_int, 256), rgsFile); + } + } else { + tryBinary = @as(c_int, 1) != 0; + } + _ = fclose(rgsFile); + } + if (tryBinary) { + rgsFile = fopen(fileName, "rb"); + if (rgsFile == @ptrCast([*c]FILE, @alignCast(@import("std").meta.alignment(FILE), @intToPtr(?*anyopaque, @as(c_int, 0))))) return; + var signature: [5]u8 = [1]u8{0} ** 5; + var version: c_short = 0; + var reserved: c_short = 0; + var propertyCount: c_int = 0; + _ = fread(@ptrCast(?*anyopaque, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &signature))), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @bitCast(c_ulong, @as(c_long, @as(c_int, 4))), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &version), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &reserved), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &propertyCount), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + if ((((@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 0))])) == @as(c_int, 'r')) and (@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 1))])) == @as(c_int, 'G'))) and (@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 2))])) == @as(c_int, 'S'))) and (@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 3))])) == @as(c_int, ' '))) { + var controlId: c_short = 0; + var propertyId: c_short = 0; + var propertyValue: c_int = 0; + { + var i: c_int = 0; + while (i < propertyCount) : (i += 1) { + _ = fread(@ptrCast(?*anyopaque, &controlId), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &propertyId), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &propertyValue), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + if (@bitCast(c_int, @as(c_int, controlId)) == @as(c_int, 0)) { + GuiSetStyle(@as(c_int, 0), @bitCast(c_int, @as(c_int, propertyId)), propertyValue); + if (@bitCast(c_int, @as(c_int, propertyId)) < @as(c_int, 16)) { + var i_1: c_int = 1; + while (i_1 < @as(c_int, 16)) : (i_1 += 1) { + GuiSetStyle(i_1, @bitCast(c_int, @as(c_int, propertyId)), propertyValue); + } + } + } else { + GuiSetStyle(@bitCast(c_int, @as(c_int, controlId)), @bitCast(c_int, @as(c_int, propertyId)), propertyValue); + } + } + } + var fontDataSize: c_int = 0; + _ = fread(@ptrCast(?*anyopaque, &fontDataSize), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + if (fontDataSize > @as(c_int, 0)) { + var font: Font = Font{ + .baseSize = @as(c_int, 0), + .glyphCount = 0, + .glyphPadding = 0, + .texture = @import("std").mem.zeroes(struct_Texture), + .recs = null, + .glyphs = null, + }; + var fontType: c_int = 0; + var whiteRec: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + _ = fread(@ptrCast(?*anyopaque, &font.baseSize), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &font.glyphCount), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &fontType), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &whiteRec), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(Rectangle), rgsFile); + var fontImageSize: c_int = 0; + _ = fread(@ptrCast(?*anyopaque, &fontImageSize), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + if (fontImageSize > @as(c_int, 0)) { + var imFont: Image = Image{ + .data = null, + .width = 0, + .height = 0, + .mipmaps = 0, + .format = 0, + }; + imFont.mipmaps = 1; + _ = fread(@ptrCast(?*anyopaque, &imFont.width), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &imFont.height), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &imFont.format), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + imFont.data = @ptrCast(?*anyopaque, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), malloc(@bitCast(c_ulong, @as(c_long, fontImageSize)))))); + _ = fread(imFont.data, @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @bitCast(c_ulong, @as(c_long, fontImageSize)), rgsFile); + font.texture = LoadTextureFromImage(imFont); + free(imFont.data); + } + font.recs = @ptrCast([*c]Rectangle, @alignCast(@import("std").meta.alignment(Rectangle), calloc(@bitCast(c_ulong, @as(c_long, font.glyphCount)), @sizeOf(Rectangle)))); + { + var i: c_int = 0; + while (i < font.glyphCount) : (i += 1) { + _ = fread(@ptrCast(?*anyopaque, &(blk: { + const tmp = i; + if (tmp >= 0) break :blk font.recs + @intCast(usize, tmp) else break :blk font.recs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(Rectangle), rgsFile); + } + } + font.glyphs = @ptrCast([*c]GlyphInfo, @alignCast(@import("std").meta.alignment(GlyphInfo), calloc(@bitCast(c_ulong, @as(c_long, font.glyphCount)), @sizeOf(GlyphInfo)))); + { + var i: c_int = 0; + while (i < font.glyphCount) : (i += 1) { + _ = fread(@ptrCast(?*anyopaque, &(blk: { + const tmp = i; + if (tmp >= 0) break :blk font.glyphs + @intCast(usize, tmp) else break :blk font.glyphs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*.value), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &(blk: { + const tmp = i; + if (tmp >= 0) break :blk font.glyphs + @intCast(usize, tmp) else break :blk font.glyphs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*.offsetX), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &(blk: { + const tmp = i; + if (tmp >= 0) break :blk font.glyphs + @intCast(usize, tmp) else break :blk font.glyphs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*.offsetY), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + _ = fread(@ptrCast(?*anyopaque, &(blk: { + const tmp = i; + if (tmp >= 0) break :blk font.glyphs + @intCast(usize, tmp) else break :blk font.glyphs - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*.advanceX), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_int), rgsFile); + } + } + GuiSetFont(font); + if ((whiteRec.width != @intToFloat(f32, @as(c_int, 0))) and (whiteRec.height != @intToFloat(f32, @as(c_int, 0)))) { + SetShapesTexture(font.texture, whiteRec); + } + } + } + _ = fclose(rgsFile); + } +} +pub export fn GuiLoadStyleDefault() void { + guiStyleLoaded = @as(c_int, 1) != 0; + GuiSetStyle(DEFAULT, BORDER_COLOR_NORMAL, @bitCast(c_int, @as(c_uint, 2206434303))); + GuiSetStyle(DEFAULT, BASE_COLOR_NORMAL, @bitCast(c_int, @as(c_uint, 3385444863))); + GuiSetStyle(DEFAULT, TEXT_COLOR_NORMAL, @as(c_int, 1751673087)); + GuiSetStyle(DEFAULT, BORDER_COLOR_FOCUSED, @as(c_int, 1538447871)); + GuiSetStyle(DEFAULT, BASE_COLOR_FOCUSED, @bitCast(c_int, @as(c_uint, 3387948799))); + GuiSetStyle(DEFAULT, TEXT_COLOR_FOCUSED, @as(c_int, 1822145791)); + GuiSetStyle(DEFAULT, BORDER_COLOR_PRESSED, @as(c_int, 76728319)); + GuiSetStyle(DEFAULT, BASE_COLOR_PRESSED, @bitCast(c_int, @as(c_uint, 2548629503))); + GuiSetStyle(DEFAULT, TEXT_COLOR_PRESSED, @as(c_int, 915124223)); + GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, @bitCast(c_int, @as(c_uint, 3049374463))); + GuiSetStyle(DEFAULT, BASE_COLOR_DISABLED, @bitCast(c_int, @as(c_uint, 3874089471))); + GuiSetStyle(DEFAULT, TEXT_COLOR_DISABLED, @bitCast(c_int, @as(c_uint, 2931276031))); + GuiSetStyle(DEFAULT, BORDER_WIDTH, @as(c_int, 1)); + GuiSetStyle(DEFAULT, TEXT_PADDING, @as(c_int, 0)); + GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(BUTTON, BORDER_WIDTH, @as(c_int, 2)); + GuiSetStyle(SLIDER, TEXT_PADDING, @as(c_int, 5)); + GuiSetStyle(CHECKBOX, TEXT_PADDING, @as(c_int, 5)); + GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_RIGHT); + GuiSetStyle(TEXTBOX, TEXT_PADDING, @as(c_int, 5)); + GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(VALUEBOX, TEXT_PADDING, @as(c_int, 4)); + GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(SPINNER, TEXT_PADDING, @as(c_int, 4)); + GuiSetStyle(SPINNER, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(STATUSBAR, TEXT_PADDING, @as(c_int, 6)); + GuiSetStyle(STATUSBAR, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_LEFT); + GuiSetStyle(DEFAULT, TEXT_SIZE, @as(c_int, 10)); + GuiSetStyle(DEFAULT, TEXT_SPACING, @as(c_int, 1)); + GuiSetStyle(DEFAULT, LINE_COLOR, @bitCast(c_int, @as(c_uint, 2427172351))); + GuiSetStyle(DEFAULT, BACKGROUND_COLOR, @bitCast(c_int, @as(c_uint, 4126537215))); + GuiSetStyle(TOGGLE, GROUP_PADDING, @as(c_int, 2)); + GuiSetStyle(SLIDER, SLIDER_WIDTH, @as(c_int, 15)); + GuiSetStyle(SLIDER, SLIDER_PADDING, @as(c_int, 1)); + GuiSetStyle(PROGRESSBAR, PROGRESS_PADDING, @as(c_int, 1)); + GuiSetStyle(CHECKBOX, CHECK_PADDING, @as(c_int, 1)); + GuiSetStyle(COMBOBOX, COMBO_BUTTON_WIDTH, @as(c_int, 30)); + GuiSetStyle(COMBOBOX, COMBO_BUTTON_PADDING, @as(c_int, 2)); + GuiSetStyle(DROPDOWNBOX, ARROW_PADDING, @as(c_int, 16)); + GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_PADDING, @as(c_int, 2)); + GuiSetStyle(TEXTBOX, TEXT_LINES_PADDING, @as(c_int, 5)); + GuiSetStyle(TEXTBOX, TEXT_INNER_PADDING, @as(c_int, 4)); + GuiSetStyle(TEXTBOX, COLOR_SELECTED_FG, @bitCast(c_int, @as(c_uint, 4043308799))); + GuiSetStyle(TEXTBOX, COLOR_SELECTED_BG, @bitCast(c_int, @as(c_uint, 2207973344))); + GuiSetStyle(SPINNER, SPIN_BUTTON_WIDTH, @as(c_int, 20)); + GuiSetStyle(SPINNER, SPIN_BUTTON_PADDING, @as(c_int, 2)); + GuiSetStyle(SCROLLBAR, BORDER_WIDTH, @as(c_int, 0)); + GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, @as(c_int, 0)); + GuiSetStyle(SCROLLBAR, ARROWS_SIZE, @as(c_int, 6)); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, @as(c_int, 0)); + GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, @as(c_int, 16)); + GuiSetStyle(SCROLLBAR, SCROLL_PADDING, @as(c_int, 0)); + GuiSetStyle(SCROLLBAR, SCROLL_SPEED, @as(c_int, 10)); + GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, @as(c_int, 30)); + GuiSetStyle(LISTVIEW, LIST_ITEMS_PADDING, @as(c_int, 2)); + GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, @as(c_int, 10)); + GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, SCROLLBAR_RIGHT_SIDE); + GuiSetStyle(COLORPICKER, COLOR_SELECTOR_SIZE, @as(c_int, 6)); + GuiSetStyle(COLORPICKER, HUEBAR_WIDTH, @as(c_int, 20)); + GuiSetStyle(COLORPICKER, HUEBAR_PADDING, @as(c_int, 10)); + GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT, @as(c_int, 6)); + GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW, @as(c_int, 2)); + guiFont = GetFontDefault(); +} +pub export fn GuiIconText(arg_iconId: c_int, arg_text: [*c]const u8) [*c]const u8 { + var iconId = arg_iconId; + var text = arg_text; + const buffer = struct { + var static: [1024]u8 = [1]u8{ + 0, + } ++ [1]u8{0} ** 1023; + }; + _ = memset(@ptrCast(?*anyopaque, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer.static))), @as(c_int, 0), @bitCast(c_ulong, @as(c_long, @as(c_int, 1024)))); + _ = sprintf(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer.static)), "#%03i#", iconId); + if (text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + { + var i: c_int = 5; + while (i < @as(c_int, 1024)) : (i += 1) { + buffer.static[@intCast(c_uint, i)] = (blk: { + const tmp = i - @as(c_int, 5); + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + if (@bitCast(c_int, @as(c_uint, (blk: { + const tmp = i - @as(c_int, 5); + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) == @as(c_int, '\x00')) break; + } + } + } + return @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer.static)); +} +pub export fn GuiDrawIcon(arg_iconId: c_int, arg_posX: c_int, arg_posY: c_int, arg_pixelSize: c_int, arg_color: Color) void { + var iconId = arg_iconId; + var posX = arg_posX; + var posY = arg_posY; + var pixelSize = arg_pixelSize; + var color = arg_color; + { + var i: c_int = 0; + var y: c_int = 0; + while (i < @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32))) : (i += 1) { + { + var k: c_int = 0; + while (k < @as(c_int, 32)) : (k += 1) { + if ((guiIcons[@intCast(c_uint, (iconId * @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32))) + i)] & @bitCast(c_uint, @as(c_int, 1) << @intCast(@import("std").math.Log2Int(c_int), k))) != 0) { + DrawRectangle(posX + (@import("std").zig.c_translation.signedRemainder(k, @as(c_int, 16)) * pixelSize), posY + (y * pixelSize), pixelSize, pixelSize, color); + } + if ((k == @as(c_int, 15)) or (k == @as(c_int, 31))) { + y += 1; + } + } + } + } + } +} +pub export fn GuiGetIcons() [*c]c_uint { + return @ptrCast([*c]c_uint, @alignCast(@import("std").meta.alignment(c_uint), &guiIcons)); +} +pub export fn GuiGetIconData(arg_iconId: c_int) [*c]c_uint { + var iconId = arg_iconId; + const iconData = struct { + var static: [8]c_uint = [1]c_uint{ + 0, + } ++ [1]c_uint{0} ** 7; + }; + _ = memset(@ptrCast(?*anyopaque, @ptrCast([*c]c_uint, @alignCast(@import("std").meta.alignment(c_uint), &iconData.static))), @as(c_int, 0), @bitCast(c_ulong, @as(c_long, @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))) *% @sizeOf(c_uint)); + if (iconId < @as(c_int, 256)) { + _ = memcpy(@ptrCast(?*anyopaque, @ptrCast([*c]c_uint, @alignCast(@import("std").meta.alignment(c_uint), &iconData.static))), @ptrCast(?*const anyopaque, &guiIcons[@intCast(c_uint, iconId * @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))]), @bitCast(c_ulong, @as(c_long, @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))) *% @sizeOf(c_uint)); + } + return @ptrCast([*c]c_uint, @alignCast(@import("std").meta.alignment(c_uint), &iconData.static)); +} +pub export fn GuiSetIconData(arg_iconId: c_int, arg_data: [*c]c_uint) void { + var iconId = arg_iconId; + var data = arg_data; + if (iconId < @as(c_int, 256)) { + _ = memcpy(@ptrCast(?*anyopaque, &guiIcons[@intCast(c_uint, iconId * @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))]), @ptrCast(?*const anyopaque, data), @bitCast(c_ulong, @as(c_long, @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))) *% @sizeOf(c_uint)); + } +} +pub export fn GuiSetIconPixel(arg_iconId: c_int, arg_x: c_int, arg_y: c_int) void { + var iconId = arg_iconId; + var x = arg_x; + var y = arg_y; + _ = blk: { + const ref = &guiIcons[@bitCast(c_ulong, @as(c_long, iconId * @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))) +% (@bitCast(c_ulong, @as(c_long, y)) / ((@sizeOf(c_uint) *% @bitCast(c_ulong, @as(c_long, @as(c_int, 8)))) / @bitCast(c_ulong, @as(c_long, @as(c_int, 16)))))]; + ref.* |= @bitCast(c_uint, @as(c_int, 1) << @intCast(@import("std").math.Log2Int(c_int), @bitCast(c_ulong, @as(c_long, x)) +% ((@bitCast(c_ulong, @as(c_long, y)) % ((@sizeOf(c_uint) *% @bitCast(c_ulong, @as(c_long, @as(c_int, 8)))) / @bitCast(c_ulong, @as(c_long, @as(c_int, 16))))) *% @bitCast(c_ulong, @as(c_long, @as(c_int, 16)))))); + break :blk ref.*; + }; +} +pub export fn GuiClearIconPixel(arg_iconId: c_int, arg_x: c_int, arg_y: c_int) void { + var iconId = arg_iconId; + var x = arg_x; + var y = arg_y; + _ = blk: { + const ref = &guiIcons[@bitCast(c_ulong, @as(c_long, iconId * @divTrunc(@as(c_int, 16) * @as(c_int, 16), @as(c_int, 32)))) +% (@bitCast(c_ulong, @as(c_long, y)) / ((@sizeOf(c_uint) *% @bitCast(c_ulong, @as(c_long, @as(c_int, 8)))) / @bitCast(c_ulong, @as(c_long, @as(c_int, 16)))))]; + ref.* &= @bitCast(c_uint, ~(@as(c_int, 1) << @intCast(@import("std").math.Log2Int(c_int), @bitCast(c_ulong, @as(c_long, x)) +% ((@bitCast(c_ulong, @as(c_long, y)) % ((@sizeOf(c_uint) *% @bitCast(c_ulong, @as(c_long, @as(c_int, 8)))) / @bitCast(c_ulong, @as(c_long, @as(c_int, 16))))) *% @bitCast(c_ulong, @as(c_long, @as(c_int, 16))))))); + break :blk ref.*; + }; +} +pub export fn GuiCheckIconPixel(arg_iconId: c_int, arg_x: c_int, arg_y: c_int) bool { + var iconId = arg_iconId; + var x = arg_x; + var y = arg_y; + return (guiIcons[@intCast(c_uint, (iconId * @as(c_int, 8)) + @divTrunc(y, @as(c_int, 2)))] & @bitCast(c_uint, @as(c_int, 1) << @intCast(@import("std").math.Log2Int(c_int), x + (@import("std").zig.c_translation.signedRemainder(y, @as(c_int, 2)) * @as(c_int, 16))))) != 0; +} +pub const __u_char = u8; +pub const __u_short = c_ushort; +pub const __u_int = c_uint; +pub const __u_long = c_ulong; +pub const __int8_t = i8; +pub const __uint8_t = u8; +pub const __int16_t = c_short; +pub const __uint16_t = c_ushort; +pub const __int32_t = c_int; +pub const __uint32_t = c_uint; +pub const __int64_t = c_long; +pub const __uint64_t = c_ulong; +pub const __int_least8_t = __int8_t; +pub const __uint_least8_t = __uint8_t; +pub const __int_least16_t = __int16_t; +pub const __uint_least16_t = __uint16_t; +pub const __int_least32_t = __int32_t; +pub const __uint_least32_t = __uint32_t; +pub const __int_least64_t = __int64_t; +pub const __uint_least64_t = __uint64_t; +pub const __quad_t = c_long; +pub const __u_quad_t = c_ulong; +pub const __intmax_t = c_long; +pub const __uintmax_t = c_ulong; +pub const __dev_t = c_ulong; +pub const __uid_t = c_uint; +pub const __gid_t = c_uint; +pub const __ino_t = c_ulong; +pub const __ino64_t = c_ulong; +pub const __mode_t = c_uint; +pub const __nlink_t = c_ulong; +pub const __pid_t = c_int; +pub const __fsid_t = extern struct { + __val: [2]c_int, +}; +pub const __clock_t = c_long; +pub const __rlim_t = c_ulong; +pub const __rlim64_t = c_ulong; +pub const __id_t = c_uint; +pub const __time_t = c_long; +pub const __useconds_t = c_uint; +pub const __suseconds_t = c_long; +pub const __suseconds64_t = c_long; +pub const __daddr_t = c_int; +pub const __key_t = c_int; +pub const __clockid_t = c_int; +pub const __timer_t = ?*anyopaque; +pub const __blksize_t = c_long; +pub const __blkcnt_t = c_long; +pub const __blkcnt64_t = c_long; +pub const __fsblkcnt_t = c_ulong; +pub const __fsblkcnt64_t = c_ulong; +pub const __fsfilcnt_t = c_ulong; +pub const __fsfilcnt64_t = c_ulong; +pub const __fsword_t = c_long; +pub const __ssize_t = c_long; +pub const __syscall_slong_t = c_long; +pub const __syscall_ulong_t = c_ulong; +pub const __loff_t = __off64_t; +pub const __caddr_t = [*c]u8; +pub const __intptr_t = c_long; +pub const __socklen_t = c_uint; +pub const __sig_atomic_t = c_int; +const union_unnamed_1 = extern union { + __wch: c_uint, + __wchb: [4]u8, +}; +pub const __mbstate_t = extern struct { + __count: c_int, + __value: union_unnamed_1, +}; +pub const struct__G_fpos_t = extern struct { + __pos: __off_t, + __state: __mbstate_t, +}; +pub const __fpos_t = struct__G_fpos_t; +pub const struct__G_fpos64_t = extern struct { + __pos: __off64_t, + __state: __mbstate_t, +}; +pub const __fpos64_t = struct__G_fpos64_t; +pub const __FILE = struct__IO_FILE; +pub const off_t = __off_t; +pub const fpos_t = __fpos_t; +pub extern var stdin: [*c]FILE; +pub extern var stdout: [*c]FILE; +pub extern var stderr: [*c]FILE; +pub extern fn remove(__filename: [*c]const u8) c_int; +pub extern fn rename(__old: [*c]const u8, __new: [*c]const u8) c_int; +pub extern fn renameat(__oldfd: c_int, __old: [*c]const u8, __newfd: c_int, __new: [*c]const u8) c_int; +pub extern fn fclose(__stream: [*c]FILE) c_int; +pub extern fn tmpfile() [*c]FILE; +pub extern fn tmpnam([*c]u8) [*c]u8; +pub extern fn tmpnam_r(__s: [*c]u8) [*c]u8; +pub extern fn tempnam(__dir: [*c]const u8, __pfx: [*c]const u8) [*c]u8; +pub extern fn fflush(__stream: [*c]FILE) c_int; +pub extern fn fflush_unlocked(__stream: [*c]FILE) c_int; +pub extern fn fopen(__filename: [*c]const u8, __modes: [*c]const u8) [*c]FILE; +pub extern fn freopen(noalias __filename: [*c]const u8, noalias __modes: [*c]const u8, noalias __stream: [*c]FILE) [*c]FILE; +pub extern fn fdopen(__fd: c_int, __modes: [*c]const u8) [*c]FILE; +pub extern fn fmemopen(__s: ?*anyopaque, __len: usize, __modes: [*c]const u8) [*c]FILE; +pub extern fn open_memstream(__bufloc: [*c][*c]u8, __sizeloc: [*c]usize) [*c]FILE; +pub extern fn setbuf(noalias __stream: [*c]FILE, noalias __buf: [*c]u8) void; +pub extern fn setvbuf(noalias __stream: [*c]FILE, noalias __buf: [*c]u8, __modes: c_int, __n: usize) c_int; +pub extern fn setbuffer(noalias __stream: [*c]FILE, noalias __buf: [*c]u8, __size: usize) void; +pub extern fn setlinebuf(__stream: [*c]FILE) void; +pub extern fn fprintf(__stream: [*c]FILE, __format: [*c]const u8, ...) c_int; +pub extern fn printf(__format: [*c]const u8, ...) c_int; +pub extern fn sprintf(__s: [*c]u8, __format: [*c]const u8, ...) c_int; +pub extern fn vfprintf(__s: [*c]FILE, __format: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub fn vprintf(arg___fmt: [*c]const u8, arg___arg: [*c]struct___va_list_tag) callconv(.C) c_int { + var __fmt = arg___fmt; + var __arg = arg___arg; + return vfprintf(stdout, __fmt, __arg); +} +pub extern fn vsprintf(__s: [*c]u8, __format: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub extern fn snprintf(__s: [*c]u8, __maxlen: c_ulong, __format: [*c]const u8, ...) c_int; +pub extern fn vsnprintf(__s: [*c]u8, __maxlen: c_ulong, __format: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub extern fn vdprintf(__fd: c_int, noalias __fmt: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub extern fn dprintf(__fd: c_int, noalias __fmt: [*c]const u8, ...) c_int; +pub extern fn fscanf(noalias __stream: [*c]FILE, noalias __format: [*c]const u8, ...) c_int; +pub extern fn scanf(noalias __format: [*c]const u8, ...) c_int; +pub extern fn sscanf(noalias __s: [*c]const u8, noalias __format: [*c]const u8, ...) c_int; +pub const _Float32 = f32; +pub const _Float64 = f64; +pub const _Float32x = f64; +pub const _Float64x = c_longdouble; +pub extern fn vfscanf(noalias __s: [*c]FILE, noalias __format: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub extern fn vscanf(noalias __format: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub extern fn vsscanf(noalias __s: [*c]const u8, noalias __format: [*c]const u8, __arg: [*c]struct___va_list_tag) c_int; +pub extern fn fgetc(__stream: [*c]FILE) c_int; +pub extern fn getc(__stream: [*c]FILE) c_int; +pub fn getchar() callconv(.C) c_int { + return getc(stdin); +} +pub fn getc_unlocked(arg___fp: [*c]FILE) callconv(.C) c_int { + var __fp = arg___fp; + return if (__builtin_expect(@bitCast(c_long, @as(c_long, @boolToInt(__fp.*._IO_read_ptr >= __fp.*._IO_read_end))), @bitCast(c_long, @as(c_long, @as(c_int, 0)))) != 0) __uflow(__fp) else @bitCast(c_int, @as(c_uint, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), blk: { + const ref = &__fp.*._IO_read_ptr; + const tmp = ref.*; + ref.* += 1; + break :blk tmp; + })).*)); +} +pub fn getchar_unlocked() callconv(.C) c_int { + return if (__builtin_expect(@bitCast(c_long, @as(c_long, @boolToInt(stdin.*._IO_read_ptr >= stdin.*._IO_read_end))), @bitCast(c_long, @as(c_long, @as(c_int, 0)))) != 0) __uflow(stdin) else @bitCast(c_int, @as(c_uint, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), blk: { + const ref = &stdin.*._IO_read_ptr; + const tmp = ref.*; + ref.* += 1; + break :blk tmp; + })).*)); +} +pub fn fgetc_unlocked(arg___fp: [*c]FILE) callconv(.C) c_int { + var __fp = arg___fp; + return if (__builtin_expect(@bitCast(c_long, @as(c_long, @boolToInt(__fp.*._IO_read_ptr >= __fp.*._IO_read_end))), @bitCast(c_long, @as(c_long, @as(c_int, 0)))) != 0) __uflow(__fp) else @bitCast(c_int, @as(c_uint, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), blk: { + const ref = &__fp.*._IO_read_ptr; + const tmp = ref.*; + ref.* += 1; + break :blk tmp; + })).*)); +} +pub extern fn fputc(__c: c_int, __stream: [*c]FILE) c_int; +pub extern fn putc(__c: c_int, __stream: [*c]FILE) c_int; +pub fn putchar(arg___c: c_int) callconv(.C) c_int { + var __c = arg___c; + return putc(__c, stdout); +} +pub fn fputc_unlocked(arg___c: c_int, arg___stream: [*c]FILE) callconv(.C) c_int { + var __c = arg___c; + var __stream = arg___stream; + return if (__builtin_expect(@bitCast(c_long, @as(c_long, @boolToInt(__stream.*._IO_write_ptr >= __stream.*._IO_write_end))), @bitCast(c_long, @as(c_long, @as(c_int, 0)))) != 0) __overflow(__stream, @bitCast(c_int, @as(c_uint, @bitCast(u8, @truncate(i8, __c))))) else @bitCast(c_int, @as(c_uint, @bitCast(u8, blk: { + const tmp = @bitCast(u8, @truncate(i8, __c)); + (blk_1: { + const ref = &__stream.*._IO_write_ptr; + const tmp_2 = ref.*; + ref.* += 1; + break :blk_1 tmp_2; + }).* = tmp; + break :blk tmp; + }))); +} +pub fn putc_unlocked(arg___c: c_int, arg___stream: [*c]FILE) callconv(.C) c_int { + var __c = arg___c; + var __stream = arg___stream; + return if (__builtin_expect(@bitCast(c_long, @as(c_long, @boolToInt(__stream.*._IO_write_ptr >= __stream.*._IO_write_end))), @bitCast(c_long, @as(c_long, @as(c_int, 0)))) != 0) __overflow(__stream, @bitCast(c_int, @as(c_uint, @bitCast(u8, @truncate(i8, __c))))) else @bitCast(c_int, @as(c_uint, @bitCast(u8, blk: { + const tmp = @bitCast(u8, @truncate(i8, __c)); + (blk_1: { + const ref = &__stream.*._IO_write_ptr; + const tmp_2 = ref.*; + ref.* += 1; + break :blk_1 tmp_2; + }).* = tmp; + break :blk tmp; + }))); +} +pub fn putchar_unlocked(arg___c: c_int) callconv(.C) c_int { + var __c = arg___c; + return if (__builtin_expect(@bitCast(c_long, @as(c_long, @boolToInt(stdout.*._IO_write_ptr >= stdout.*._IO_write_end))), @bitCast(c_long, @as(c_long, @as(c_int, 0)))) != 0) __overflow(stdout, @bitCast(c_int, @as(c_uint, @bitCast(u8, @truncate(i8, __c))))) else @bitCast(c_int, @as(c_uint, @bitCast(u8, blk: { + const tmp = @bitCast(u8, @truncate(i8, __c)); + (blk_1: { + const ref = &stdout.*._IO_write_ptr; + const tmp_2 = ref.*; + ref.* += 1; + break :blk_1 tmp_2; + }).* = tmp; + break :blk tmp; + }))); +} +pub extern fn getw(__stream: [*c]FILE) c_int; +pub extern fn putw(__w: c_int, __stream: [*c]FILE) c_int; +pub extern fn fgets(noalias __s: [*c]u8, __n: c_int, noalias __stream: [*c]FILE) [*c]u8; +pub extern fn __getdelim(noalias __lineptr: [*c][*c]u8, noalias __n: [*c]usize, __delimiter: c_int, noalias __stream: [*c]FILE) __ssize_t; +pub extern fn getdelim(noalias __lineptr: [*c][*c]u8, noalias __n: [*c]usize, __delimiter: c_int, noalias __stream: [*c]FILE) __ssize_t; +pub extern fn getline(noalias __lineptr: [*c][*c]u8, noalias __n: [*c]usize, noalias __stream: [*c]FILE) __ssize_t; +pub extern fn fputs(noalias __s: [*c]const u8, noalias __stream: [*c]FILE) c_int; +pub extern fn puts(__s: [*c]const u8) c_int; +pub extern fn ungetc(__c: c_int, __stream: [*c]FILE) c_int; +pub extern fn fread(__ptr: ?*anyopaque, __size: c_ulong, __n: c_ulong, __stream: [*c]FILE) c_ulong; +pub extern fn fwrite(__ptr: ?*const anyopaque, __size: c_ulong, __n: c_ulong, __s: [*c]FILE) c_ulong; +pub extern fn fread_unlocked(noalias __ptr: ?*anyopaque, __size: usize, __n: usize, noalias __stream: [*c]FILE) usize; +pub extern fn fwrite_unlocked(noalias __ptr: ?*const anyopaque, __size: usize, __n: usize, noalias __stream: [*c]FILE) usize; +pub extern fn fseek(__stream: [*c]FILE, __off: c_long, __whence: c_int) c_int; +pub extern fn ftell(__stream: [*c]FILE) c_long; +pub extern fn rewind(__stream: [*c]FILE) void; +pub extern fn fseeko(__stream: [*c]FILE, __off: __off_t, __whence: c_int) c_int; +pub extern fn ftello(__stream: [*c]FILE) __off_t; +pub extern fn fgetpos(noalias __stream: [*c]FILE, noalias __pos: [*c]fpos_t) c_int; +pub extern fn fsetpos(__stream: [*c]FILE, __pos: [*c]const fpos_t) c_int; +pub extern fn clearerr(__stream: [*c]FILE) void; +pub extern fn feof(__stream: [*c]FILE) c_int; +pub extern fn ferror(__stream: [*c]FILE) c_int; +pub extern fn clearerr_unlocked(__stream: [*c]FILE) void; +pub fn feof_unlocked(arg___stream: [*c]FILE) callconv(.C) c_int { + var __stream = arg___stream; + return @boolToInt((__stream.*._flags & @as(c_int, 16)) != @as(c_int, 0)); +} +pub fn ferror_unlocked(arg___stream: [*c]FILE) callconv(.C) c_int { + var __stream = arg___stream; + return @boolToInt((__stream.*._flags & @as(c_int, 32)) != @as(c_int, 0)); +} +pub extern fn perror(__s: [*c]const u8) void; +pub extern fn fileno(__stream: [*c]FILE) c_int; +pub extern fn fileno_unlocked(__stream: [*c]FILE) c_int; +pub extern fn pclose(__stream: [*c]FILE) c_int; +pub extern fn popen(__command: [*c]const u8, __modes: [*c]const u8) [*c]FILE; +pub extern fn ctermid(__s: [*c]u8) [*c]u8; +pub extern fn flockfile(__stream: [*c]FILE) void; +pub extern fn ftrylockfile(__stream: [*c]FILE) c_int; +pub extern fn funlockfile(__stream: [*c]FILE) void; +pub extern fn __uflow([*c]FILE) c_int; +pub extern fn __overflow([*c]FILE, c_int) c_int; +pub const wchar_t = c_int; +pub const div_t = extern struct { + quot: c_int, + rem: c_int, +}; +pub const ldiv_t = extern struct { + quot: c_long, + rem: c_long, +}; +pub const lldiv_t = extern struct { + quot: c_longlong, + rem: c_longlong, +}; +pub extern fn __ctype_get_mb_cur_max() usize; +pub fn atof(arg___nptr: [*c]const u8) callconv(.C) f64 { + var __nptr = arg___nptr; + return strtod(__nptr, @ptrCast([*c][*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), @intToPtr(?*anyopaque, @as(c_int, 0))))); +} +pub fn atoi(arg___nptr: [*c]const u8) callconv(.C) c_int { + var __nptr = arg___nptr; + return @bitCast(c_int, @truncate(c_int, strtol(__nptr, @ptrCast([*c][*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), @intToPtr(?*anyopaque, @as(c_int, 0)))), @as(c_int, 10)))); +} +pub fn atol(arg___nptr: [*c]const u8) callconv(.C) c_long { + var __nptr = arg___nptr; + return strtol(__nptr, @ptrCast([*c][*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), @intToPtr(?*anyopaque, @as(c_int, 0)))), @as(c_int, 10)); +} +pub fn atoll(arg___nptr: [*c]const u8) callconv(.C) c_longlong { + var __nptr = arg___nptr; + return strtoll(__nptr, @ptrCast([*c][*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), @intToPtr(?*anyopaque, @as(c_int, 0)))), @as(c_int, 10)); +} +pub extern fn strtod(__nptr: [*c]const u8, __endptr: [*c][*c]u8) f64; +pub extern fn strtof(__nptr: [*c]const u8, __endptr: [*c][*c]u8) f32; +pub extern fn strtold(__nptr: [*c]const u8, __endptr: [*c][*c]u8) c_longdouble; +pub extern fn strtol(__nptr: [*c]const u8, __endptr: [*c][*c]u8, __base: c_int) c_long; +pub extern fn strtoul(__nptr: [*c]const u8, __endptr: [*c][*c]u8, __base: c_int) c_ulong; +pub extern fn strtoq(noalias __nptr: [*c]const u8, noalias __endptr: [*c][*c]u8, __base: c_int) c_longlong; +pub extern fn strtouq(noalias __nptr: [*c]const u8, noalias __endptr: [*c][*c]u8, __base: c_int) c_ulonglong; +pub extern fn strtoll(__nptr: [*c]const u8, __endptr: [*c][*c]u8, __base: c_int) c_longlong; +pub extern fn strtoull(__nptr: [*c]const u8, __endptr: [*c][*c]u8, __base: c_int) c_ulonglong; +pub extern fn l64a(__n: c_long) [*c]u8; +pub extern fn a64l(__s: [*c]const u8) c_long; +pub const u_char = __u_char; +pub const u_short = __u_short; +pub const u_int = __u_int; +pub const u_long = __u_long; +pub const quad_t = __quad_t; +pub const u_quad_t = __u_quad_t; +pub const fsid_t = __fsid_t; +pub const loff_t = __loff_t; +pub const ino_t = __ino_t; +pub const dev_t = __dev_t; +pub const gid_t = __gid_t; +pub const mode_t = __mode_t; +pub const nlink_t = __nlink_t; +pub const uid_t = __uid_t; +pub const pid_t = __pid_t; +pub const id_t = __id_t; +pub const daddr_t = __daddr_t; +pub const caddr_t = __caddr_t; +pub const key_t = __key_t; +pub const clock_t = __clock_t; +pub const clockid_t = __clockid_t; +pub const time_t = __time_t; +pub const timer_t = __timer_t; +pub const ulong = c_ulong; +pub const ushort = c_ushort; +pub const uint = c_uint; +pub const u_int8_t = __uint8_t; +pub const u_int16_t = __uint16_t; +pub const u_int32_t = __uint32_t; +pub const u_int64_t = __uint64_t; +pub const register_t = c_long; +pub fn __bswap_16(arg___bsx: __uint16_t) callconv(.C) __uint16_t { + var __bsx = arg___bsx; + return @bitCast(__uint16_t, @truncate(c_short, ((@bitCast(c_int, @as(c_uint, __bsx)) >> @intCast(@import("std").math.Log2Int(c_int), 8)) & @as(c_int, 255)) | ((@bitCast(c_int, @as(c_uint, __bsx)) & @as(c_int, 255)) << @intCast(@import("std").math.Log2Int(c_int), 8)))); +} +pub fn __bswap_32(arg___bsx: __uint32_t) callconv(.C) __uint32_t { + var __bsx = arg___bsx; + return ((((__bsx & @as(c_uint, 4278190080)) >> @intCast(@import("std").math.Log2Int(c_uint), 24)) | ((__bsx & @as(c_uint, 16711680)) >> @intCast(@import("std").math.Log2Int(c_uint), 8))) | ((__bsx & @as(c_uint, 65280)) << @intCast(@import("std").math.Log2Int(c_uint), 8))) | ((__bsx & @as(c_uint, 255)) << @intCast(@import("std").math.Log2Int(c_uint), 24)); +} +pub fn __bswap_64(arg___bsx: __uint64_t) callconv(.C) __uint64_t { + var __bsx = arg___bsx; + return @bitCast(__uint64_t, @truncate(c_ulong, ((((((((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 18374686479671623680)) >> @intCast(@import("std").math.Log2Int(c_ulonglong), 56)) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 71776119061217280)) >> @intCast(@import("std").math.Log2Int(c_ulonglong), 40))) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 280375465082880)) >> @intCast(@import("std").math.Log2Int(c_ulonglong), 24))) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 1095216660480)) >> @intCast(@import("std").math.Log2Int(c_ulonglong), 8))) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 4278190080)) << @intCast(@import("std").math.Log2Int(c_ulonglong), 8))) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 16711680)) << @intCast(@import("std").math.Log2Int(c_ulonglong), 24))) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 65280)) << @intCast(@import("std").math.Log2Int(c_ulonglong), 40))) | ((@bitCast(c_ulonglong, @as(c_ulonglong, __bsx)) & @as(c_ulonglong, 255)) << @intCast(@import("std").math.Log2Int(c_ulonglong), 56)))); +} +pub fn __uint16_identity(arg___x: __uint16_t) callconv(.C) __uint16_t { + var __x = arg___x; + return __x; +} +pub fn __uint32_identity(arg___x: __uint32_t) callconv(.C) __uint32_t { + var __x = arg___x; + return __x; +} +pub fn __uint64_identity(arg___x: __uint64_t) callconv(.C) __uint64_t { + var __x = arg___x; + return __x; +} +pub const __sigset_t = extern struct { + __val: [16]c_ulong, +}; +pub const sigset_t = __sigset_t; +pub const struct_timeval = extern struct { + tv_sec: __time_t, + tv_usec: __suseconds_t, +}; +pub const struct_timespec = extern struct { + tv_sec: __time_t, + tv_nsec: __syscall_slong_t, +}; +pub const suseconds_t = __suseconds_t; +pub const __fd_mask = c_long; +pub const fd_set = extern struct { + __fds_bits: [16]__fd_mask, +}; +pub const fd_mask = __fd_mask; +pub extern fn select(__nfds: c_int, noalias __readfds: [*c]fd_set, noalias __writefds: [*c]fd_set, noalias __exceptfds: [*c]fd_set, noalias __timeout: [*c]struct_timeval) c_int; +pub extern fn pselect(__nfds: c_int, noalias __readfds: [*c]fd_set, noalias __writefds: [*c]fd_set, noalias __exceptfds: [*c]fd_set, noalias __timeout: [*c]const struct_timespec, noalias __sigmask: [*c]const __sigset_t) c_int; +pub const blksize_t = __blksize_t; +pub const blkcnt_t = __blkcnt_t; +pub const fsblkcnt_t = __fsblkcnt_t; +pub const fsfilcnt_t = __fsfilcnt_t; +pub const struct___pthread_internal_list = extern struct { + __prev: [*c]struct___pthread_internal_list, + __next: [*c]struct___pthread_internal_list, +}; +pub const __pthread_list_t = struct___pthread_internal_list; +pub const struct___pthread_internal_slist = extern struct { + __next: [*c]struct___pthread_internal_slist, +}; +pub const __pthread_slist_t = struct___pthread_internal_slist; +pub const struct___pthread_mutex_s = extern struct { + __lock: c_int, + __count: c_uint, + __owner: c_int, + __nusers: c_uint, + __kind: c_int, + __spins: c_short, + __elision: c_short, + __list: __pthread_list_t, +}; +pub const struct___pthread_rwlock_arch_t = extern struct { + __readers: c_uint, + __writers: c_uint, + __wrphase_futex: c_uint, + __writers_futex: c_uint, + __pad3: c_uint, + __pad4: c_uint, + __cur_writer: c_int, + __shared: c_int, + __rwelision: i8, + __pad1: [7]u8, + __pad2: c_ulong, + __flags: c_uint, +}; +const struct_unnamed_3 = extern struct { + __low: c_uint, + __high: c_uint, +}; +const union_unnamed_2 = extern union { + __wseq: c_ulonglong, + __wseq32: struct_unnamed_3, +}; +const struct_unnamed_5 = extern struct { + __low: c_uint, + __high: c_uint, +}; +const union_unnamed_4 = extern union { + __g1_start: c_ulonglong, + __g1_start32: struct_unnamed_5, +}; +pub const struct___pthread_cond_s = extern struct { + unnamed_0: union_unnamed_2, + unnamed_1: union_unnamed_4, + __g_refs: [2]c_uint, + __g_size: [2]c_uint, + __g1_orig_size: c_uint, + __wrefs: c_uint, + __g_signals: [2]c_uint, +}; +pub const __tss_t = c_uint; +pub const __thrd_t = c_ulong; +pub const __once_flag = extern struct { + __data: c_int, +}; +pub const pthread_t = c_ulong; +pub const pthread_mutexattr_t = extern union { + __size: [4]u8, + __align: c_int, +}; +pub const pthread_condattr_t = extern union { + __size: [4]u8, + __align: c_int, +}; +pub const pthread_key_t = c_uint; +pub const pthread_once_t = c_int; +pub const union_pthread_attr_t = extern union { + __size: [56]u8, + __align: c_long, +}; +pub const pthread_attr_t = union_pthread_attr_t; +pub const pthread_mutex_t = extern union { + __data: struct___pthread_mutex_s, + __size: [40]u8, + __align: c_long, +}; +pub const pthread_cond_t = extern union { + __data: struct___pthread_cond_s, + __size: [48]u8, + __align: c_longlong, +}; +pub const pthread_rwlock_t = extern union { + __data: struct___pthread_rwlock_arch_t, + __size: [56]u8, + __align: c_long, +}; +pub const pthread_rwlockattr_t = extern union { + __size: [8]u8, + __align: c_long, +}; +pub const pthread_spinlock_t = c_int; +pub const pthread_barrier_t = extern union { + __size: [32]u8, + __align: c_long, +}; +pub const pthread_barrierattr_t = extern union { + __size: [4]u8, + __align: c_int, +}; +pub extern fn random() c_long; +pub extern fn srandom(__seed: c_uint) void; +pub extern fn initstate(__seed: c_uint, __statebuf: [*c]u8, __statelen: usize) [*c]u8; +pub extern fn setstate(__statebuf: [*c]u8) [*c]u8; +pub const struct_random_data = extern struct { + fptr: [*c]i32, + rptr: [*c]i32, + state: [*c]i32, + rand_type: c_int, + rand_deg: c_int, + rand_sep: c_int, + end_ptr: [*c]i32, +}; +pub extern fn random_r(noalias __buf: [*c]struct_random_data, noalias __result: [*c]i32) c_int; +pub extern fn srandom_r(__seed: c_uint, __buf: [*c]struct_random_data) c_int; +pub extern fn initstate_r(__seed: c_uint, noalias __statebuf: [*c]u8, __statelen: usize, noalias __buf: [*c]struct_random_data) c_int; +pub extern fn setstate_r(noalias __statebuf: [*c]u8, noalias __buf: [*c]struct_random_data) c_int; +pub extern fn rand() c_int; +pub extern fn srand(__seed: c_uint) void; +pub extern fn rand_r(__seed: [*c]c_uint) c_int; +pub extern fn drand48() f64; +pub extern fn erand48(__xsubi: [*c]c_ushort) f64; +pub extern fn lrand48() c_long; +pub extern fn nrand48(__xsubi: [*c]c_ushort) c_long; +pub extern fn mrand48() c_long; +pub extern fn jrand48(__xsubi: [*c]c_ushort) c_long; +pub extern fn srand48(__seedval: c_long) void; +pub extern fn seed48(__seed16v: [*c]c_ushort) [*c]c_ushort; +pub extern fn lcong48(__param: [*c]c_ushort) void; +pub const struct_drand48_data = extern struct { + __x: [3]c_ushort, + __old_x: [3]c_ushort, + __c: c_ushort, + __init: c_ushort, + __a: c_ulonglong, +}; +pub extern fn drand48_r(noalias __buffer: [*c]struct_drand48_data, noalias __result: [*c]f64) c_int; +pub extern fn erand48_r(__xsubi: [*c]c_ushort, noalias __buffer: [*c]struct_drand48_data, noalias __result: [*c]f64) c_int; +pub extern fn lrand48_r(noalias __buffer: [*c]struct_drand48_data, noalias __result: [*c]c_long) c_int; +pub extern fn nrand48_r(__xsubi: [*c]c_ushort, noalias __buffer: [*c]struct_drand48_data, noalias __result: [*c]c_long) c_int; +pub extern fn mrand48_r(noalias __buffer: [*c]struct_drand48_data, noalias __result: [*c]c_long) c_int; +pub extern fn jrand48_r(__xsubi: [*c]c_ushort, noalias __buffer: [*c]struct_drand48_data, noalias __result: [*c]c_long) c_int; +pub extern fn srand48_r(__seedval: c_long, __buffer: [*c]struct_drand48_data) c_int; +pub extern fn seed48_r(__seed16v: [*c]c_ushort, __buffer: [*c]struct_drand48_data) c_int; +pub extern fn lcong48_r(__param: [*c]c_ushort, __buffer: [*c]struct_drand48_data) c_int; +pub extern fn malloc(__size: c_ulong) ?*anyopaque; +pub extern fn calloc(__nmemb: c_ulong, __size: c_ulong) ?*anyopaque; +pub extern fn realloc(__ptr: ?*anyopaque, __size: c_ulong) ?*anyopaque; +pub extern fn free(__ptr: ?*anyopaque) void; +pub extern fn reallocarray(__ptr: ?*anyopaque, __nmemb: usize, __size: usize) ?*anyopaque; +pub extern fn alloca(__size: c_ulong) ?*anyopaque; +pub extern fn valloc(__size: usize) ?*anyopaque; +pub extern fn posix_memalign(__memptr: [*c]?*anyopaque, __alignment: usize, __size: usize) c_int; +pub extern fn aligned_alloc(__alignment: c_ulong, __size: c_ulong) ?*anyopaque; +pub extern fn abort() noreturn; +pub extern fn atexit(__func: ?fn () callconv(.C) void) c_int; +pub extern fn at_quick_exit(__func: ?fn () callconv(.C) void) c_int; +pub extern fn on_exit(__func: ?fn (c_int, ?*anyopaque) callconv(.C) void, __arg: ?*anyopaque) c_int; +pub extern fn exit(__status: c_int) noreturn; +pub extern fn quick_exit(__status: c_int) noreturn; +pub extern fn _Exit(__status: c_int) noreturn; +pub extern fn getenv(__name: [*c]const u8) [*c]u8; +pub extern fn putenv(__string: [*c]u8) c_int; +pub extern fn setenv(__name: [*c]const u8, __value: [*c]const u8, __replace: c_int) c_int; +pub extern fn unsetenv(__name: [*c]const u8) c_int; +pub extern fn clearenv() c_int; +pub extern fn mktemp(__template: [*c]u8) [*c]u8; +pub extern fn mkstemp(__template: [*c]u8) c_int; +pub extern fn mkstemps(__template: [*c]u8, __suffixlen: c_int) c_int; +pub extern fn mkdtemp(__template: [*c]u8) [*c]u8; +pub extern fn system(__command: [*c]const u8) c_int; +pub extern fn realpath(noalias __name: [*c]const u8, noalias __resolved: [*c]u8) [*c]u8; +pub const __compar_fn_t = ?fn (?*const anyopaque, ?*const anyopaque) callconv(.C) c_int; +pub fn bsearch(arg___key: ?*const anyopaque, arg___base: ?*const anyopaque, arg___nmemb: usize, arg___size: usize, arg___compar: __compar_fn_t) callconv(.C) ?*anyopaque { + var __key = arg___key; + var __base = arg___base; + var __nmemb = arg___nmemb; + var __size = arg___size; + var __compar = arg___compar; + var __l: usize = undefined; + var __u: usize = undefined; + var __idx: usize = undefined; + var __p: ?*const anyopaque = undefined; + var __comparison: c_int = undefined; + __l = 0; + __u = __nmemb; + while (__l < __u) { + __idx = (__l +% __u) / @bitCast(c_ulong, @as(c_long, @as(c_int, 2))); + __p = @intToPtr(?*anyopaque, @ptrToInt(@ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), __base)) + (__idx *% __size))); + __comparison = __compar.?(__key, __p); + if (__comparison < @as(c_int, 0)) { + __u = __idx; + } else if (__comparison > @as(c_int, 0)) { + __l = __idx +% @bitCast(c_ulong, @as(c_long, @as(c_int, 1))); + } else return @intToPtr(?*anyopaque, @ptrToInt(__p)); + } + return @intToPtr(?*anyopaque, @as(c_int, 0)); +} +pub extern fn qsort(__base: ?*anyopaque, __nmemb: usize, __size: usize, __compar: __compar_fn_t) void; +pub extern fn abs(__x: c_int) c_int; +pub extern fn labs(__x: c_long) c_long; +pub extern fn llabs(__x: c_longlong) c_longlong; +pub extern fn div(__numer: c_int, __denom: c_int) div_t; +pub extern fn ldiv(__numer: c_long, __denom: c_long) ldiv_t; +pub extern fn lldiv(__numer: c_longlong, __denom: c_longlong) lldiv_t; +pub extern fn ecvt(__value: f64, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int) [*c]u8; +pub extern fn fcvt(__value: f64, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int) [*c]u8; +pub extern fn gcvt(__value: f64, __ndigit: c_int, __buf: [*c]u8) [*c]u8; +pub extern fn qecvt(__value: c_longdouble, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int) [*c]u8; +pub extern fn qfcvt(__value: c_longdouble, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int) [*c]u8; +pub extern fn qgcvt(__value: c_longdouble, __ndigit: c_int, __buf: [*c]u8) [*c]u8; +pub extern fn ecvt_r(__value: f64, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int, noalias __buf: [*c]u8, __len: usize) c_int; +pub extern fn fcvt_r(__value: f64, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int, noalias __buf: [*c]u8, __len: usize) c_int; +pub extern fn qecvt_r(__value: c_longdouble, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int, noalias __buf: [*c]u8, __len: usize) c_int; +pub extern fn qfcvt_r(__value: c_longdouble, __ndigit: c_int, noalias __decpt: [*c]c_int, noalias __sign: [*c]c_int, noalias __buf: [*c]u8, __len: usize) c_int; +pub extern fn mblen(__s: [*c]const u8, __n: usize) c_int; +pub extern fn mbtowc(noalias __pwc: [*c]wchar_t, noalias __s: [*c]const u8, __n: usize) c_int; +pub extern fn wctomb(__s: [*c]u8, __wchar: wchar_t) c_int; +pub extern fn mbstowcs(noalias __pwcs: [*c]wchar_t, noalias __s: [*c]const u8, __n: usize) usize; +pub extern fn wcstombs(noalias __s: [*c]u8, noalias __pwcs: [*c]const wchar_t, __n: usize) usize; +pub extern fn rpmatch(__response: [*c]const u8) c_int; +pub extern fn getsubopt(noalias __optionp: [*c][*c]u8, noalias __tokens: [*c]const [*c]u8, noalias __valuep: [*c][*c]u8) c_int; +pub extern fn getloadavg(__loadavg: [*c]f64, __nelem: c_int) c_int; +pub extern fn memcpy(__dest: ?*anyopaque, __src: ?*const anyopaque, __n: c_ulong) ?*anyopaque; +pub extern fn memmove(__dest: ?*anyopaque, __src: ?*const anyopaque, __n: c_ulong) ?*anyopaque; +pub extern fn memccpy(__dest: ?*anyopaque, __src: ?*const anyopaque, __c: c_int, __n: c_ulong) ?*anyopaque; +pub extern fn memset(__s: ?*anyopaque, __c: c_int, __n: c_ulong) ?*anyopaque; +pub extern fn memcmp(__s1: ?*const anyopaque, __s2: ?*const anyopaque, __n: c_ulong) c_int; +pub extern fn memchr(__s: ?*const anyopaque, __c: c_int, __n: c_ulong) ?*anyopaque; +pub extern fn strcpy(__dest: [*c]u8, __src: [*c]const u8) [*c]u8; +pub extern fn strncpy(__dest: [*c]u8, __src: [*c]const u8, __n: c_ulong) [*c]u8; +pub extern fn strcat(__dest: [*c]u8, __src: [*c]const u8) [*c]u8; +pub extern fn strncat(__dest: [*c]u8, __src: [*c]const u8, __n: c_ulong) [*c]u8; +pub extern fn strcmp(__s1: [*c]const u8, __s2: [*c]const u8) c_int; +pub extern fn strncmp(__s1: [*c]const u8, __s2: [*c]const u8, __n: c_ulong) c_int; +pub extern fn strcoll(__s1: [*c]const u8, __s2: [*c]const u8) c_int; +pub extern fn strxfrm(__dest: [*c]u8, __src: [*c]const u8, __n: c_ulong) c_ulong; +pub const struct___locale_data = opaque {}; +pub const struct___locale_struct = extern struct { + __locales: [13]?*struct___locale_data, + __ctype_b: [*c]const c_ushort, + __ctype_tolower: [*c]const c_int, + __ctype_toupper: [*c]const c_int, + __names: [13][*c]const u8, +}; +pub const __locale_t = [*c]struct___locale_struct; +pub const locale_t = __locale_t; +pub extern fn strcoll_l(__s1: [*c]const u8, __s2: [*c]const u8, __l: locale_t) c_int; +pub extern fn strxfrm_l(__dest: [*c]u8, __src: [*c]const u8, __n: usize, __l: locale_t) usize; +pub extern fn strdup(__s: [*c]const u8) [*c]u8; +pub extern fn strndup(__string: [*c]const u8, __n: c_ulong) [*c]u8; +pub extern fn strchr(__s: [*c]const u8, __c: c_int) [*c]u8; +pub extern fn strrchr(__s: [*c]const u8, __c: c_int) [*c]u8; +pub extern fn strcspn(__s: [*c]const u8, __reject: [*c]const u8) c_ulong; +pub extern fn strspn(__s: [*c]const u8, __accept: [*c]const u8) c_ulong; +pub extern fn strpbrk(__s: [*c]const u8, __accept: [*c]const u8) [*c]u8; +pub extern fn strstr(__haystack: [*c]const u8, __needle: [*c]const u8) [*c]u8; +pub extern fn strtok(__s: [*c]u8, __delim: [*c]const u8) [*c]u8; +pub extern fn __strtok_r(noalias __s: [*c]u8, noalias __delim: [*c]const u8, noalias __save_ptr: [*c][*c]u8) [*c]u8; +pub extern fn strtok_r(noalias __s: [*c]u8, noalias __delim: [*c]const u8, noalias __save_ptr: [*c][*c]u8) [*c]u8; +pub extern fn strlen(__s: [*c]const u8) c_ulong; +pub extern fn strnlen(__string: [*c]const u8, __maxlen: usize) usize; +pub extern fn strerror(__errnum: c_int) [*c]u8; +pub extern fn strerror_r(__errnum: c_int, __buf: [*c]u8, __buflen: usize) c_int; +pub extern fn strerror_l(__errnum: c_int, __l: locale_t) [*c]u8; +pub extern fn bcmp(__s1: ?*const anyopaque, __s2: ?*const anyopaque, __n: c_ulong) c_int; +pub extern fn bcopy(__src: ?*const anyopaque, __dest: ?*anyopaque, __n: usize) void; +pub extern fn bzero(__s: ?*anyopaque, __n: c_ulong) void; +pub extern fn index(__s: [*c]const u8, __c: c_int) [*c]u8; +pub extern fn rindex(__s: [*c]const u8, __c: c_int) [*c]u8; +pub extern fn ffs(__i: c_int) c_int; +pub extern fn ffsl(__l: c_long) c_int; +pub extern fn ffsll(__ll: c_longlong) c_int; +pub extern fn strcasecmp(__s1: [*c]const u8, __s2: [*c]const u8) c_int; +pub extern fn strncasecmp(__s1: [*c]const u8, __s2: [*c]const u8, __n: c_ulong) c_int; +pub extern fn strcasecmp_l(__s1: [*c]const u8, __s2: [*c]const u8, __loc: locale_t) c_int; +pub extern fn strncasecmp_l(__s1: [*c]const u8, __s2: [*c]const u8, __n: usize, __loc: locale_t) c_int; +pub extern fn explicit_bzero(__s: ?*anyopaque, __n: usize) void; +pub extern fn strsep(noalias __stringp: [*c][*c]u8, noalias __delim: [*c]const u8) [*c]u8; +pub extern fn strsignal(__sig: c_int) [*c]u8; +pub extern fn __stpcpy(noalias __dest: [*c]u8, noalias __src: [*c]const u8) [*c]u8; +pub extern fn stpcpy(__dest: [*c]u8, __src: [*c]const u8) [*c]u8; +pub extern fn __stpncpy(noalias __dest: [*c]u8, noalias __src: [*c]const u8, __n: usize) [*c]u8; +pub extern fn stpncpy(__dest: [*c]u8, __src: [*c]const u8, __n: c_ulong) [*c]u8; +pub const float_t = f32; +pub const double_t = f64; +pub extern fn __fpclassify(__value: f64) c_int; +pub extern fn __signbit(__value: f64) c_int; +pub extern fn __isinf(__value: f64) c_int; +pub extern fn __finite(__value: f64) c_int; +pub extern fn __isnan(__value: f64) c_int; +pub extern fn __iseqsig(__x: f64, __y: f64) c_int; +pub extern fn __issignaling(__value: f64) c_int; +pub extern fn acos(__x: f64) f64; +pub extern fn __acos(__x: f64) f64; +pub extern fn asin(__x: f64) f64; +pub extern fn __asin(__x: f64) f64; +pub extern fn atan(__x: f64) f64; +pub extern fn __atan(__x: f64) f64; +pub extern fn atan2(__y: f64, __x: f64) f64; +pub extern fn __atan2(__y: f64, __x: f64) f64; +pub extern fn cos(__x: f64) f64; +pub extern fn __cos(__x: f64) f64; +pub extern fn sin(__x: f64) f64; +pub extern fn __sin(__x: f64) f64; +pub extern fn tan(__x: f64) f64; +pub extern fn __tan(__x: f64) f64; +pub extern fn cosh(__x: f64) f64; +pub extern fn __cosh(__x: f64) f64; +pub extern fn sinh(__x: f64) f64; +pub extern fn __sinh(__x: f64) f64; +pub extern fn tanh(__x: f64) f64; +pub extern fn __tanh(__x: f64) f64; +pub extern fn acosh(__x: f64) f64; +pub extern fn __acosh(__x: f64) f64; +pub extern fn asinh(__x: f64) f64; +pub extern fn __asinh(__x: f64) f64; +pub extern fn atanh(__x: f64) f64; +pub extern fn __atanh(__x: f64) f64; +pub extern fn exp(__x: f64) f64; +pub extern fn __exp(__x: f64) f64; +pub extern fn frexp(__x: f64, __exponent: [*c]c_int) f64; +pub extern fn __frexp(__x: f64, __exponent: [*c]c_int) f64; +pub extern fn ldexp(__x: f64, __exponent: c_int) f64; +pub extern fn __ldexp(__x: f64, __exponent: c_int) f64; +pub extern fn log(__x: f64) f64; +pub extern fn __log(__x: f64) f64; +pub extern fn log10(__x: f64) f64; +pub extern fn __log10(__x: f64) f64; +pub extern fn modf(__x: f64, __iptr: [*c]f64) f64; +pub extern fn __modf(__x: f64, __iptr: [*c]f64) f64; +pub extern fn expm1(__x: f64) f64; +pub extern fn __expm1(__x: f64) f64; +pub extern fn log1p(__x: f64) f64; +pub extern fn __log1p(__x: f64) f64; +pub extern fn logb(__x: f64) f64; +pub extern fn __logb(__x: f64) f64; +pub extern fn exp2(__x: f64) f64; +pub extern fn __exp2(__x: f64) f64; +pub extern fn log2(__x: f64) f64; +pub extern fn __log2(__x: f64) f64; +pub extern fn pow(__x: f64, __y: f64) f64; +pub extern fn __pow(__x: f64, __y: f64) f64; +pub extern fn sqrt(__x: f64) f64; +pub extern fn __sqrt(__x: f64) f64; +pub extern fn hypot(__x: f64, __y: f64) f64; +pub extern fn __hypot(__x: f64, __y: f64) f64; +pub extern fn cbrt(__x: f64) f64; +pub extern fn __cbrt(__x: f64) f64; +pub extern fn ceil(__x: f64) f64; +pub extern fn __ceil(__x: f64) f64; +pub extern fn fabs(__x: f64) f64; +pub extern fn __fabs(__x: f64) f64; +pub extern fn floor(__x: f64) f64; +pub extern fn __floor(__x: f64) f64; +pub extern fn fmod(__x: f64, __y: f64) f64; +pub extern fn __fmod(__x: f64, __y: f64) f64; +pub extern fn isinf(__value: f64) c_int; +pub extern fn finite(__value: f64) c_int; +pub extern fn drem(__x: f64, __y: f64) f64; +pub extern fn __drem(__x: f64, __y: f64) f64; +pub extern fn significand(__x: f64) f64; +pub extern fn __significand(__x: f64) f64; +pub extern fn copysign(__x: f64, __y: f64) f64; +pub extern fn __copysign(__x: f64, __y: f64) f64; +pub extern fn nan(__tagb: [*c]const u8) f64; +pub extern fn __nan(__tagb: [*c]const u8) f64; +pub extern fn isnan(__value: f64) c_int; +pub extern fn j0(f64) f64; +pub extern fn __j0(f64) f64; +pub extern fn j1(f64) f64; +pub extern fn __j1(f64) f64; +pub extern fn jn(c_int, f64) f64; +pub extern fn __jn(c_int, f64) f64; +pub extern fn y0(f64) f64; +pub extern fn __y0(f64) f64; +pub extern fn y1(f64) f64; +pub extern fn __y1(f64) f64; +pub extern fn yn(c_int, f64) f64; +pub extern fn __yn(c_int, f64) f64; +pub extern fn erf(f64) f64; +pub extern fn __erf(f64) f64; +pub extern fn erfc(f64) f64; +pub extern fn __erfc(f64) f64; +pub extern fn lgamma(f64) f64; +pub extern fn __lgamma(f64) f64; +pub extern fn tgamma(f64) f64; +pub extern fn __tgamma(f64) f64; +pub extern fn gamma(f64) f64; +pub extern fn __gamma(f64) f64; +pub extern fn lgamma_r(f64, __signgamp: [*c]c_int) f64; +pub extern fn __lgamma_r(f64, __signgamp: [*c]c_int) f64; +pub extern fn rint(__x: f64) f64; +pub extern fn __rint(__x: f64) f64; +pub extern fn nextafter(__x: f64, __y: f64) f64; +pub extern fn __nextafter(__x: f64, __y: f64) f64; +pub extern fn nexttoward(__x: f64, __y: c_longdouble) f64; +pub extern fn __nexttoward(__x: f64, __y: c_longdouble) f64; +pub extern fn remainder(__x: f64, __y: f64) f64; +pub extern fn __remainder(__x: f64, __y: f64) f64; +pub extern fn scalbn(__x: f64, __n: c_int) f64; +pub extern fn __scalbn(__x: f64, __n: c_int) f64; +pub extern fn ilogb(__x: f64) c_int; +pub extern fn __ilogb(__x: f64) c_int; +pub extern fn scalbln(__x: f64, __n: c_long) f64; +pub extern fn __scalbln(__x: f64, __n: c_long) f64; +pub extern fn nearbyint(__x: f64) f64; +pub extern fn __nearbyint(__x: f64) f64; +pub extern fn round(__x: f64) f64; +pub extern fn __round(__x: f64) f64; +pub extern fn trunc(__x: f64) f64; +pub extern fn __trunc(__x: f64) f64; +pub extern fn remquo(__x: f64, __y: f64, __quo: [*c]c_int) f64; +pub extern fn __remquo(__x: f64, __y: f64, __quo: [*c]c_int) f64; +pub extern fn lrint(__x: f64) c_long; +pub extern fn __lrint(__x: f64) c_long; +pub extern fn llrint(__x: f64) c_longlong; +pub extern fn __llrint(__x: f64) c_longlong; +pub extern fn lround(__x: f64) c_long; +pub extern fn __lround(__x: f64) c_long; +pub extern fn llround(__x: f64) c_longlong; +pub extern fn __llround(__x: f64) c_longlong; +pub extern fn fdim(__x: f64, __y: f64) f64; +pub extern fn __fdim(__x: f64, __y: f64) f64; +pub extern fn fmax(__x: f64, __y: f64) f64; +pub extern fn __fmax(__x: f64, __y: f64) f64; +pub extern fn fmin(__x: f64, __y: f64) f64; +pub extern fn __fmin(__x: f64, __y: f64) f64; +pub extern fn fma(__x: f64, __y: f64, __z: f64) f64; +pub extern fn __fma(__x: f64, __y: f64, __z: f64) f64; +pub extern fn scalb(__x: f64, __n: f64) f64; +pub extern fn __scalb(__x: f64, __n: f64) f64; +pub extern fn __fpclassifyf(__value: f32) c_int; +pub extern fn __signbitf(__value: f32) c_int; +pub extern fn __isinff(__value: f32) c_int; +pub extern fn __finitef(__value: f32) c_int; +pub extern fn __isnanf(__value: f32) c_int; +pub extern fn __iseqsigf(__x: f32, __y: f32) c_int; +pub extern fn __issignalingf(__value: f32) c_int; +pub extern fn acosf(__x: f32) f32; +pub extern fn __acosf(__x: f32) f32; +pub extern fn asinf(__x: f32) f32; +pub extern fn __asinf(__x: f32) f32; +pub extern fn atanf(__x: f32) f32; +pub extern fn __atanf(__x: f32) f32; +pub extern fn atan2f(__y: f32, __x: f32) f32; +pub extern fn __atan2f(__y: f32, __x: f32) f32; +pub extern fn cosf(__x: f32) f32; +pub extern fn __cosf(__x: f32) f32; +pub extern fn sinf(__x: f32) f32; +pub extern fn __sinf(__x: f32) f32; +pub extern fn tanf(__x: f32) f32; +pub extern fn __tanf(__x: f32) f32; +pub extern fn coshf(__x: f32) f32; +pub extern fn __coshf(__x: f32) f32; +pub extern fn sinhf(__x: f32) f32; +pub extern fn __sinhf(__x: f32) f32; +pub extern fn tanhf(__x: f32) f32; +pub extern fn __tanhf(__x: f32) f32; +pub extern fn acoshf(__x: f32) f32; +pub extern fn __acoshf(__x: f32) f32; +pub extern fn asinhf(__x: f32) f32; +pub extern fn __asinhf(__x: f32) f32; +pub extern fn atanhf(__x: f32) f32; +pub extern fn __atanhf(__x: f32) f32; +pub extern fn expf(__x: f32) f32; +pub extern fn __expf(__x: f32) f32; +pub extern fn frexpf(__x: f32, __exponent: [*c]c_int) f32; +pub extern fn __frexpf(__x: f32, __exponent: [*c]c_int) f32; +pub extern fn ldexpf(__x: f32, __exponent: c_int) f32; +pub extern fn __ldexpf(__x: f32, __exponent: c_int) f32; +pub extern fn logf(__x: f32) f32; +pub extern fn __logf(__x: f32) f32; +pub extern fn log10f(__x: f32) f32; +pub extern fn __log10f(__x: f32) f32; +pub extern fn modff(__x: f32, __iptr: [*c]f32) f32; +pub extern fn __modff(__x: f32, __iptr: [*c]f32) f32; +pub extern fn expm1f(__x: f32) f32; +pub extern fn __expm1f(__x: f32) f32; +pub extern fn log1pf(__x: f32) f32; +pub extern fn __log1pf(__x: f32) f32; +pub extern fn logbf(__x: f32) f32; +pub extern fn __logbf(__x: f32) f32; +pub extern fn exp2f(__x: f32) f32; +pub extern fn __exp2f(__x: f32) f32; +pub extern fn log2f(__x: f32) f32; +pub extern fn __log2f(__x: f32) f32; +pub extern fn powf(__x: f32, __y: f32) f32; +pub extern fn __powf(__x: f32, __y: f32) f32; +pub extern fn sqrtf(__x: f32) f32; +pub extern fn __sqrtf(__x: f32) f32; +pub extern fn hypotf(__x: f32, __y: f32) f32; +pub extern fn __hypotf(__x: f32, __y: f32) f32; +pub extern fn cbrtf(__x: f32) f32; +pub extern fn __cbrtf(__x: f32) f32; +pub extern fn ceilf(__x: f32) f32; +pub extern fn __ceilf(__x: f32) f32; +pub extern fn fabsf(__x: f32) f32; +pub extern fn __fabsf(__x: f32) f32; +pub extern fn floorf(__x: f32) f32; +pub extern fn __floorf(__x: f32) f32; +pub extern fn fmodf(__x: f32, __y: f32) f32; +pub extern fn __fmodf(__x: f32, __y: f32) f32; +pub extern fn isinff(__value: f32) c_int; +pub extern fn finitef(__value: f32) c_int; +pub extern fn dremf(__x: f32, __y: f32) f32; +pub extern fn __dremf(__x: f32, __y: f32) f32; +pub extern fn significandf(__x: f32) f32; +pub extern fn __significandf(__x: f32) f32; +pub extern fn copysignf(__x: f32, __y: f32) f32; +pub extern fn __copysignf(__x: f32, __y: f32) f32; +pub extern fn nanf(__tagb: [*c]const u8) f32; +pub extern fn __nanf(__tagb: [*c]const u8) f32; +pub extern fn isnanf(__value: f32) c_int; +pub extern fn j0f(f32) f32; +pub extern fn __j0f(f32) f32; +pub extern fn j1f(f32) f32; +pub extern fn __j1f(f32) f32; +pub extern fn jnf(c_int, f32) f32; +pub extern fn __jnf(c_int, f32) f32; +pub extern fn y0f(f32) f32; +pub extern fn __y0f(f32) f32; +pub extern fn y1f(f32) f32; +pub extern fn __y1f(f32) f32; +pub extern fn ynf(c_int, f32) f32; +pub extern fn __ynf(c_int, f32) f32; +pub extern fn erff(f32) f32; +pub extern fn __erff(f32) f32; +pub extern fn erfcf(f32) f32; +pub extern fn __erfcf(f32) f32; +pub extern fn lgammaf(f32) f32; +pub extern fn __lgammaf(f32) f32; +pub extern fn tgammaf(f32) f32; +pub extern fn __tgammaf(f32) f32; +pub extern fn gammaf(f32) f32; +pub extern fn __gammaf(f32) f32; +pub extern fn lgammaf_r(f32, __signgamp: [*c]c_int) f32; +pub extern fn __lgammaf_r(f32, __signgamp: [*c]c_int) f32; +pub extern fn rintf(__x: f32) f32; +pub extern fn __rintf(__x: f32) f32; +pub extern fn nextafterf(__x: f32, __y: f32) f32; +pub extern fn __nextafterf(__x: f32, __y: f32) f32; +pub extern fn nexttowardf(__x: f32, __y: c_longdouble) f32; +pub extern fn __nexttowardf(__x: f32, __y: c_longdouble) f32; +pub extern fn remainderf(__x: f32, __y: f32) f32; +pub extern fn __remainderf(__x: f32, __y: f32) f32; +pub extern fn scalbnf(__x: f32, __n: c_int) f32; +pub extern fn __scalbnf(__x: f32, __n: c_int) f32; +pub extern fn ilogbf(__x: f32) c_int; +pub extern fn __ilogbf(__x: f32) c_int; +pub extern fn scalblnf(__x: f32, __n: c_long) f32; +pub extern fn __scalblnf(__x: f32, __n: c_long) f32; +pub extern fn nearbyintf(__x: f32) f32; +pub extern fn __nearbyintf(__x: f32) f32; +pub extern fn roundf(__x: f32) f32; +pub extern fn __roundf(__x: f32) f32; +pub extern fn truncf(__x: f32) f32; +pub extern fn __truncf(__x: f32) f32; +pub extern fn remquof(__x: f32, __y: f32, __quo: [*c]c_int) f32; +pub extern fn __remquof(__x: f32, __y: f32, __quo: [*c]c_int) f32; +pub extern fn lrintf(__x: f32) c_long; +pub extern fn __lrintf(__x: f32) c_long; +pub extern fn llrintf(__x: f32) c_longlong; +pub extern fn __llrintf(__x: f32) c_longlong; +pub extern fn lroundf(__x: f32) c_long; +pub extern fn __lroundf(__x: f32) c_long; +pub extern fn llroundf(__x: f32) c_longlong; +pub extern fn __llroundf(__x: f32) c_longlong; +pub extern fn fdimf(__x: f32, __y: f32) f32; +pub extern fn __fdimf(__x: f32, __y: f32) f32; +pub extern fn fmaxf(__x: f32, __y: f32) f32; +pub extern fn __fmaxf(__x: f32, __y: f32) f32; +pub extern fn fminf(__x: f32, __y: f32) f32; +pub extern fn __fminf(__x: f32, __y: f32) f32; +pub extern fn fmaf(__x: f32, __y: f32, __z: f32) f32; +pub extern fn __fmaf(__x: f32, __y: f32, __z: f32) f32; +pub extern fn scalbf(__x: f32, __n: f32) f32; +pub extern fn __scalbf(__x: f32, __n: f32) f32; +pub extern fn __fpclassifyl(__value: c_longdouble) c_int; +pub extern fn __signbitl(__value: c_longdouble) c_int; +pub extern fn __isinfl(__value: c_longdouble) c_int; +pub extern fn __finitel(__value: c_longdouble) c_int; +pub extern fn __isnanl(__value: c_longdouble) c_int; +pub extern fn __iseqsigl(__x: c_longdouble, __y: c_longdouble) c_int; +pub extern fn __issignalingl(__value: c_longdouble) c_int; +pub extern fn acosl(__x: c_longdouble) c_longdouble; +pub extern fn __acosl(__x: c_longdouble) c_longdouble; +pub extern fn asinl(__x: c_longdouble) c_longdouble; +pub extern fn __asinl(__x: c_longdouble) c_longdouble; +pub extern fn atanl(__x: c_longdouble) c_longdouble; +pub extern fn __atanl(__x: c_longdouble) c_longdouble; +pub extern fn atan2l(__y: c_longdouble, __x: c_longdouble) c_longdouble; +pub extern fn __atan2l(__y: c_longdouble, __x: c_longdouble) c_longdouble; +pub extern fn cosl(__x: c_longdouble) c_longdouble; +pub extern fn __cosl(__x: c_longdouble) c_longdouble; +pub extern fn sinl(__x: c_longdouble) c_longdouble; +pub extern fn __sinl(__x: c_longdouble) c_longdouble; +pub extern fn tanl(__x: c_longdouble) c_longdouble; +pub extern fn __tanl(__x: c_longdouble) c_longdouble; +pub extern fn coshl(__x: c_longdouble) c_longdouble; +pub extern fn __coshl(__x: c_longdouble) c_longdouble; +pub extern fn sinhl(__x: c_longdouble) c_longdouble; +pub extern fn __sinhl(__x: c_longdouble) c_longdouble; +pub extern fn tanhl(__x: c_longdouble) c_longdouble; +pub extern fn __tanhl(__x: c_longdouble) c_longdouble; +pub extern fn acoshl(__x: c_longdouble) c_longdouble; +pub extern fn __acoshl(__x: c_longdouble) c_longdouble; +pub extern fn asinhl(__x: c_longdouble) c_longdouble; +pub extern fn __asinhl(__x: c_longdouble) c_longdouble; +pub extern fn atanhl(__x: c_longdouble) c_longdouble; +pub extern fn __atanhl(__x: c_longdouble) c_longdouble; +pub extern fn expl(__x: c_longdouble) c_longdouble; +pub extern fn __expl(__x: c_longdouble) c_longdouble; +pub extern fn frexpl(__x: c_longdouble, __exponent: [*c]c_int) c_longdouble; +pub extern fn __frexpl(__x: c_longdouble, __exponent: [*c]c_int) c_longdouble; +pub extern fn ldexpl(__x: c_longdouble, __exponent: c_int) c_longdouble; +pub extern fn __ldexpl(__x: c_longdouble, __exponent: c_int) c_longdouble; +pub extern fn logl(__x: c_longdouble) c_longdouble; +pub extern fn __logl(__x: c_longdouble) c_longdouble; +pub extern fn log10l(__x: c_longdouble) c_longdouble; +pub extern fn __log10l(__x: c_longdouble) c_longdouble; +pub extern fn modfl(__x: c_longdouble, __iptr: [*c]c_longdouble) c_longdouble; +pub extern fn __modfl(__x: c_longdouble, __iptr: [*c]c_longdouble) c_longdouble; +pub extern fn expm1l(__x: c_longdouble) c_longdouble; +pub extern fn __expm1l(__x: c_longdouble) c_longdouble; +pub extern fn log1pl(__x: c_longdouble) c_longdouble; +pub extern fn __log1pl(__x: c_longdouble) c_longdouble; +pub extern fn logbl(__x: c_longdouble) c_longdouble; +pub extern fn __logbl(__x: c_longdouble) c_longdouble; +pub extern fn exp2l(__x: c_longdouble) c_longdouble; +pub extern fn __exp2l(__x: c_longdouble) c_longdouble; +pub extern fn log2l(__x: c_longdouble) c_longdouble; +pub extern fn __log2l(__x: c_longdouble) c_longdouble; +pub extern fn powl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __powl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn sqrtl(__x: c_longdouble) c_longdouble; +pub extern fn __sqrtl(__x: c_longdouble) c_longdouble; +pub extern fn hypotl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __hypotl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn cbrtl(__x: c_longdouble) c_longdouble; +pub extern fn __cbrtl(__x: c_longdouble) c_longdouble; +pub extern fn ceill(__x: c_longdouble) c_longdouble; +pub extern fn __ceill(__x: c_longdouble) c_longdouble; +pub extern fn fabsl(__x: c_longdouble) c_longdouble; +pub extern fn __fabsl(__x: c_longdouble) c_longdouble; +pub extern fn floorl(__x: c_longdouble) c_longdouble; +pub extern fn __floorl(__x: c_longdouble) c_longdouble; +pub extern fn fmodl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __fmodl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn isinfl(__value: c_longdouble) c_int; +pub extern fn finitel(__value: c_longdouble) c_int; +pub extern fn dreml(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __dreml(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn significandl(__x: c_longdouble) c_longdouble; +pub extern fn __significandl(__x: c_longdouble) c_longdouble; +pub extern fn copysignl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __copysignl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn nanl(__tagb: [*c]const u8) c_longdouble; +pub extern fn __nanl(__tagb: [*c]const u8) c_longdouble; +pub extern fn isnanl(__value: c_longdouble) c_int; +pub extern fn j0l(c_longdouble) c_longdouble; +pub extern fn __j0l(c_longdouble) c_longdouble; +pub extern fn j1l(c_longdouble) c_longdouble; +pub extern fn __j1l(c_longdouble) c_longdouble; +pub extern fn jnl(c_int, c_longdouble) c_longdouble; +pub extern fn __jnl(c_int, c_longdouble) c_longdouble; +pub extern fn y0l(c_longdouble) c_longdouble; +pub extern fn __y0l(c_longdouble) c_longdouble; +pub extern fn y1l(c_longdouble) c_longdouble; +pub extern fn __y1l(c_longdouble) c_longdouble; +pub extern fn ynl(c_int, c_longdouble) c_longdouble; +pub extern fn __ynl(c_int, c_longdouble) c_longdouble; +pub extern fn erfl(c_longdouble) c_longdouble; +pub extern fn __erfl(c_longdouble) c_longdouble; +pub extern fn erfcl(c_longdouble) c_longdouble; +pub extern fn __erfcl(c_longdouble) c_longdouble; +pub extern fn lgammal(c_longdouble) c_longdouble; +pub extern fn __lgammal(c_longdouble) c_longdouble; +pub extern fn tgammal(c_longdouble) c_longdouble; +pub extern fn __tgammal(c_longdouble) c_longdouble; +pub extern fn gammal(c_longdouble) c_longdouble; +pub extern fn __gammal(c_longdouble) c_longdouble; +pub extern fn lgammal_r(c_longdouble, __signgamp: [*c]c_int) c_longdouble; +pub extern fn __lgammal_r(c_longdouble, __signgamp: [*c]c_int) c_longdouble; +pub extern fn rintl(__x: c_longdouble) c_longdouble; +pub extern fn __rintl(__x: c_longdouble) c_longdouble; +pub extern fn nextafterl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __nextafterl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn nexttowardl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __nexttowardl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn remainderl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __remainderl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn scalbnl(__x: c_longdouble, __n: c_int) c_longdouble; +pub extern fn __scalbnl(__x: c_longdouble, __n: c_int) c_longdouble; +pub extern fn ilogbl(__x: c_longdouble) c_int; +pub extern fn __ilogbl(__x: c_longdouble) c_int; +pub extern fn scalblnl(__x: c_longdouble, __n: c_long) c_longdouble; +pub extern fn __scalblnl(__x: c_longdouble, __n: c_long) c_longdouble; +pub extern fn nearbyintl(__x: c_longdouble) c_longdouble; +pub extern fn __nearbyintl(__x: c_longdouble) c_longdouble; +pub extern fn roundl(__x: c_longdouble) c_longdouble; +pub extern fn __roundl(__x: c_longdouble) c_longdouble; +pub extern fn truncl(__x: c_longdouble) c_longdouble; +pub extern fn __truncl(__x: c_longdouble) c_longdouble; +pub extern fn remquol(__x: c_longdouble, __y: c_longdouble, __quo: [*c]c_int) c_longdouble; +pub extern fn __remquol(__x: c_longdouble, __y: c_longdouble, __quo: [*c]c_int) c_longdouble; +pub extern fn lrintl(__x: c_longdouble) c_long; +pub extern fn __lrintl(__x: c_longdouble) c_long; +pub extern fn llrintl(__x: c_longdouble) c_longlong; +pub extern fn __llrintl(__x: c_longdouble) c_longlong; +pub extern fn lroundl(__x: c_longdouble) c_long; +pub extern fn __lroundl(__x: c_longdouble) c_long; +pub extern fn llroundl(__x: c_longdouble) c_longlong; +pub extern fn __llroundl(__x: c_longdouble) c_longlong; +pub extern fn fdiml(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __fdiml(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn fmaxl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __fmaxl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn fminl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn __fminl(__x: c_longdouble, __y: c_longdouble) c_longdouble; +pub extern fn fmal(__x: c_longdouble, __y: c_longdouble, __z: c_longdouble) c_longdouble; +pub extern fn __fmal(__x: c_longdouble, __y: c_longdouble, __z: c_longdouble) c_longdouble; +pub extern fn scalbl(__x: c_longdouble, __n: c_longdouble) c_longdouble; +pub extern fn __scalbl(__x: c_longdouble, __n: c_longdouble) c_longdouble; +pub extern var signgam: c_int; +pub const FP_NAN: c_int = 0; +pub const FP_INFINITE: c_int = 1; +pub const FP_ZERO: c_int = 2; +pub const FP_SUBNORMAL: c_int = 3; +pub const FP_NORMAL: c_int = 4; +const enum_unnamed_6 = c_uint; +pub const RICON_NONE: c_int = 0; +pub const RICON_FOLDER_FILE_OPEN: c_int = 1; +pub const RICON_FILE_SAVE_CLASSIC: c_int = 2; +pub const RICON_FOLDER_OPEN: c_int = 3; +pub const RICON_FOLDER_SAVE: c_int = 4; +pub const RICON_FILE_OPEN: c_int = 5; +pub const RICON_FILE_SAVE: c_int = 6; +pub const RICON_FILE_EXPORT: c_int = 7; +pub const RICON_FILE_NEW: c_int = 8; +pub const RICON_FILE_DELETE: c_int = 9; +pub const RICON_FILETYPE_TEXT: c_int = 10; +pub const RICON_FILETYPE_AUDIO: c_int = 11; +pub const RICON_FILETYPE_IMAGE: c_int = 12; +pub const RICON_FILETYPE_PLAY: c_int = 13; +pub const RICON_FILETYPE_VIDEO: c_int = 14; +pub const RICON_FILETYPE_INFO: c_int = 15; +pub const RICON_FILE_COPY: c_int = 16; +pub const RICON_FILE_CUT: c_int = 17; +pub const RICON_FILE_PASTE: c_int = 18; +pub const RICON_CURSOR_HAND: c_int = 19; +pub const RICON_CURSOR_POINTER: c_int = 20; +pub const RICON_CURSOR_CLASSIC: c_int = 21; +pub const RICON_PENCIL: c_int = 22; +pub const RICON_PENCIL_BIG: c_int = 23; +pub const RICON_BRUSH_CLASSIC: c_int = 24; +pub const RICON_BRUSH_PAINTER: c_int = 25; +pub const RICON_WATER_DROP: c_int = 26; +pub const RICON_COLOR_PICKER: c_int = 27; +pub const RICON_RUBBER: c_int = 28; +pub const RICON_COLOR_BUCKET: c_int = 29; +pub const RICON_TEXT_T: c_int = 30; +pub const RICON_TEXT_A: c_int = 31; +pub const RICON_SCALE: c_int = 32; +pub const RICON_RESIZE: c_int = 33; +pub const RICON_FILTER_POINT: c_int = 34; +pub const RICON_FILTER_BILINEAR: c_int = 35; +pub const RICON_CROP: c_int = 36; +pub const RICON_CROP_ALPHA: c_int = 37; +pub const RICON_SQUARE_TOGGLE: c_int = 38; +pub const RICON_SYMMETRY: c_int = 39; +pub const RICON_SYMMETRY_HORIZONTAL: c_int = 40; +pub const RICON_SYMMETRY_VERTICAL: c_int = 41; +pub const RICON_LENS: c_int = 42; +pub const RICON_LENS_BIG: c_int = 43; +pub const RICON_EYE_ON: c_int = 44; +pub const RICON_EYE_OFF: c_int = 45; +pub const RICON_FILTER_TOP: c_int = 46; +pub const RICON_FILTER: c_int = 47; +pub const RICON_TARGET_POINT: c_int = 48; +pub const RICON_TARGET_SMALL: c_int = 49; +pub const RICON_TARGET_BIG: c_int = 50; +pub const RICON_TARGET_MOVE: c_int = 51; +pub const RICON_CURSOR_MOVE: c_int = 52; +pub const RICON_CURSOR_SCALE: c_int = 53; +pub const RICON_CURSOR_SCALE_RIGHT: c_int = 54; +pub const RICON_CURSOR_SCALE_LEFT: c_int = 55; +pub const RICON_UNDO: c_int = 56; +pub const RICON_REDO: c_int = 57; +pub const RICON_REREDO: c_int = 58; +pub const RICON_MUTATE: c_int = 59; +pub const RICON_ROTATE: c_int = 60; +pub const RICON_REPEAT: c_int = 61; +pub const RICON_SHUFFLE: c_int = 62; +pub const RICON_EMPTYBOX: c_int = 63; +pub const RICON_TARGET: c_int = 64; +pub const RICON_TARGET_SMALL_FILL: c_int = 65; +pub const RICON_TARGET_BIG_FILL: c_int = 66; +pub const RICON_TARGET_MOVE_FILL: c_int = 67; +pub const RICON_CURSOR_MOVE_FILL: c_int = 68; +pub const RICON_CURSOR_SCALE_FILL: c_int = 69; +pub const RICON_CURSOR_SCALE_RIGHT_FILL: c_int = 70; +pub const RICON_CURSOR_SCALE_LEFT_FILL: c_int = 71; +pub const RICON_UNDO_FILL: c_int = 72; +pub const RICON_REDO_FILL: c_int = 73; +pub const RICON_REREDO_FILL: c_int = 74; +pub const RICON_MUTATE_FILL: c_int = 75; +pub const RICON_ROTATE_FILL: c_int = 76; +pub const RICON_REPEAT_FILL: c_int = 77; +pub const RICON_SHUFFLE_FILL: c_int = 78; +pub const RICON_EMPTYBOX_SMALL: c_int = 79; +pub const RICON_BOX: c_int = 80; +pub const RICON_BOX_TOP: c_int = 81; +pub const RICON_BOX_TOP_RIGHT: c_int = 82; +pub const RICON_BOX_RIGHT: c_int = 83; +pub const RICON_BOX_BOTTOM_RIGHT: c_int = 84; +pub const RICON_BOX_BOTTOM: c_int = 85; +pub const RICON_BOX_BOTTOM_LEFT: c_int = 86; +pub const RICON_BOX_LEFT: c_int = 87; +pub const RICON_BOX_TOP_LEFT: c_int = 88; +pub const RICON_BOX_CENTER: c_int = 89; +pub const RICON_BOX_CIRCLE_MASK: c_int = 90; +pub const RICON_POT: c_int = 91; +pub const RICON_ALPHA_MULTIPLY: c_int = 92; +pub const RICON_ALPHA_CLEAR: c_int = 93; +pub const RICON_DITHERING: c_int = 94; +pub const RICON_MIPMAPS: c_int = 95; +pub const RICON_BOX_GRID: c_int = 96; +pub const RICON_GRID: c_int = 97; +pub const RICON_BOX_CORNERS_SMALL: c_int = 98; +pub const RICON_BOX_CORNERS_BIG: c_int = 99; +pub const RICON_FOUR_BOXES: c_int = 100; +pub const RICON_GRID_FILL: c_int = 101; +pub const RICON_BOX_MULTISIZE: c_int = 102; +pub const RICON_ZOOM_SMALL: c_int = 103; +pub const RICON_ZOOM_MEDIUM: c_int = 104; +pub const RICON_ZOOM_BIG: c_int = 105; +pub const RICON_ZOOM_ALL: c_int = 106; +pub const RICON_ZOOM_CENTER: c_int = 107; +pub const RICON_BOX_DOTS_SMALL: c_int = 108; +pub const RICON_BOX_DOTS_BIG: c_int = 109; +pub const RICON_BOX_CONCENTRIC: c_int = 110; +pub const RICON_BOX_GRID_BIG: c_int = 111; +pub const RICON_OK_TICK: c_int = 112; +pub const RICON_CROSS: c_int = 113; +pub const RICON_ARROW_LEFT: c_int = 114; +pub const RICON_ARROW_RIGHT: c_int = 115; +pub const RICON_ARROW_DOWN: c_int = 116; +pub const RICON_ARROW_UP: c_int = 117; +pub const RICON_ARROW_LEFT_FILL: c_int = 118; +pub const RICON_ARROW_RIGHT_FILL: c_int = 119; +pub const RICON_ARROW_DOWN_FILL: c_int = 120; +pub const RICON_ARROW_UP_FILL: c_int = 121; +pub const RICON_AUDIO: c_int = 122; +pub const RICON_FX: c_int = 123; +pub const RICON_WAVE: c_int = 124; +pub const RICON_WAVE_SINUS: c_int = 125; +pub const RICON_WAVE_SQUARE: c_int = 126; +pub const RICON_WAVE_TRIANGULAR: c_int = 127; +pub const RICON_CROSS_SMALL: c_int = 128; +pub const RICON_PLAYER_PREVIOUS: c_int = 129; +pub const RICON_PLAYER_PLAY_BACK: c_int = 130; +pub const RICON_PLAYER_PLAY: c_int = 131; +pub const RICON_PLAYER_PAUSE: c_int = 132; +pub const RICON_PLAYER_STOP: c_int = 133; +pub const RICON_PLAYER_NEXT: c_int = 134; +pub const RICON_PLAYER_RECORD: c_int = 135; +pub const RICON_MAGNET: c_int = 136; +pub const RICON_LOCK_CLOSE: c_int = 137; +pub const RICON_LOCK_OPEN: c_int = 138; +pub const RICON_CLOCK: c_int = 139; +pub const RICON_TOOLS: c_int = 140; +pub const RICON_GEAR: c_int = 141; +pub const RICON_GEAR_BIG: c_int = 142; +pub const RICON_BIN: c_int = 143; +pub const RICON_HAND_POINTER: c_int = 144; +pub const RICON_LASER: c_int = 145; +pub const RICON_COIN: c_int = 146; +pub const RICON_EXPLOSION: c_int = 147; +pub const RICON_1UP: c_int = 148; +pub const RICON_PLAYER: c_int = 149; +pub const RICON_PLAYER_JUMP: c_int = 150; +pub const RICON_KEY: c_int = 151; +pub const RICON_DEMON: c_int = 152; +pub const RICON_TEXT_POPUP: c_int = 153; +pub const RICON_GEAR_EX: c_int = 154; +pub const RICON_CRACK: c_int = 155; +pub const RICON_CRACK_POINTS: c_int = 156; +pub const RICON_STAR: c_int = 157; +pub const RICON_DOOR: c_int = 158; +pub const RICON_EXIT: c_int = 159; +pub const RICON_MODE_2D: c_int = 160; +pub const RICON_MODE_3D: c_int = 161; +pub const RICON_CUBE: c_int = 162; +pub const RICON_CUBE_FACE_TOP: c_int = 163; +pub const RICON_CUBE_FACE_LEFT: c_int = 164; +pub const RICON_CUBE_FACE_FRONT: c_int = 165; +pub const RICON_CUBE_FACE_BOTTOM: c_int = 166; +pub const RICON_CUBE_FACE_RIGHT: c_int = 167; +pub const RICON_CUBE_FACE_BACK: c_int = 168; +pub const RICON_CAMERA: c_int = 169; +pub const RICON_SPECIAL: c_int = 170; +pub const RICON_LINK_NET: c_int = 171; +pub const RICON_LINK_BOXES: c_int = 172; +pub const RICON_LINK_MULTI: c_int = 173; +pub const RICON_LINK: c_int = 174; +pub const RICON_LINK_BROKE: c_int = 175; +pub const RICON_TEXT_NOTES: c_int = 176; +pub const RICON_NOTEBOOK: c_int = 177; +pub const RICON_SUITCASE: c_int = 178; +pub const RICON_SUITCASE_ZIP: c_int = 179; +pub const RICON_MAILBOX: c_int = 180; +pub const RICON_MONITOR: c_int = 181; +pub const RICON_PRINTER: c_int = 182; +pub const RICON_PHOTO_CAMERA: c_int = 183; +pub const RICON_PHOTO_CAMERA_FLASH: c_int = 184; +pub const RICON_HOUSE: c_int = 185; +pub const RICON_HEART: c_int = 186; +pub const RICON_CORNER: c_int = 187; +pub const RICON_VERTICAL_BARS: c_int = 188; +pub const RICON_VERTICAL_BARS_FILL: c_int = 189; +pub const RICON_LIFE_BARS: c_int = 190; +pub const RICON_INFO: c_int = 191; +pub const RICON_CROSSLINE: c_int = 192; +pub const RICON_HELP: c_int = 193; +pub const RICON_FILETYPE_ALPHA: c_int = 194; +pub const RICON_FILETYPE_HOME: c_int = 195; +pub const RICON_LAYERS_VISIBLE: c_int = 196; +pub const RICON_LAYERS: c_int = 197; +pub const RICON_WINDOW: c_int = 198; +pub const RICON_HIDPI: c_int = 199; +pub const RICON_200: c_int = 200; +pub const RICON_201: c_int = 201; +pub const RICON_202: c_int = 202; +pub const RICON_203: c_int = 203; +pub const RICON_204: c_int = 204; +pub const RICON_205: c_int = 205; +pub const RICON_206: c_int = 206; +pub const RICON_207: c_int = 207; +pub const RICON_208: c_int = 208; +pub const RICON_209: c_int = 209; +pub const RICON_210: c_int = 210; +pub const RICON_211: c_int = 211; +pub const RICON_212: c_int = 212; +pub const RICON_213: c_int = 213; +pub const RICON_214: c_int = 214; +pub const RICON_215: c_int = 215; +pub const RICON_216: c_int = 216; +pub const RICON_217: c_int = 217; +pub const RICON_218: c_int = 218; +pub const RICON_219: c_int = 219; +pub const RICON_220: c_int = 220; +pub const RICON_221: c_int = 221; +pub const RICON_222: c_int = 222; +pub const RICON_223: c_int = 223; +pub const RICON_224: c_int = 224; +pub const RICON_225: c_int = 225; +pub const RICON_226: c_int = 226; +pub const RICON_227: c_int = 227; +pub const RICON_228: c_int = 228; +pub const RICON_229: c_int = 229; +pub const RICON_230: c_int = 230; +pub const RICON_231: c_int = 231; +pub const RICON_232: c_int = 232; +pub const RICON_233: c_int = 233; +pub const RICON_234: c_int = 234; +pub const RICON_235: c_int = 235; +pub const RICON_236: c_int = 236; +pub const RICON_237: c_int = 237; +pub const RICON_238: c_int = 238; +pub const RICON_239: c_int = 239; +pub const RICON_240: c_int = 240; +pub const RICON_241: c_int = 241; +pub const RICON_242: c_int = 242; +pub const RICON_243: c_int = 243; +pub const RICON_244: c_int = 244; +pub const RICON_245: c_int = 245; +pub const RICON_246: c_int = 246; +pub const RICON_247: c_int = 247; +pub const RICON_248: c_int = 248; +pub const RICON_249: c_int = 249; +pub const RICON_250: c_int = 250; +pub const RICON_251: c_int = 251; +pub const RICON_252: c_int = 252; +pub const RICON_253: c_int = 253; +pub const RICON_254: c_int = 254; +pub const RICON_255: c_int = 255; +pub const guiIconName = c_uint; +pub var guiIcons: [2048]c_uint = [2048]c_uint{ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 1073217536)), + @bitCast(c_uint, @as(c_int, 789061640)), + @bitCast(c_uint, @as(c_int, 541204606)), + @bitCast(c_uint, @as(c_int, 1073905602)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 1073610752)), + @bitCast(c_uint, @as(c_int, 1143104546)), + @bitCast(c_uint, @as(c_int, 1073891298)), + @bitCast(c_uint, @as(c_int, 1610235906)), + @bitCast(c_uint, @as(c_int, 1474973706)), + @bitCast(c_uint, @as(c_int, 1342853130)), + @bitCast(c_uint, @as(c_int, 1073897466)), + @bitCast(c_uint, @as(c_int, 32766)), + 0, + @bitCast(c_uint, @as(c_int, 4325502)), + @bitCast(c_uint, @as(c_int, 1073905602)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1090666498)), + @bitCast(c_uint, @as(c_int, 1145193090)), + @bitCast(c_uint, @as(c_int, 2034123010)), + @bitCast(c_uint, @as(c_int, 256)), + 0, + @bitCast(c_uint, @as(c_int, 4325502)), + @bitCast(c_uint, @as(c_int, 1073905602)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1090666754)), + @bitCast(c_uint, @as(c_int, 1145192706)), + @bitCast(c_uint, @as(c_int, 2034123394)), + 0, + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 553918468)), + @bitCast(c_uint, @as(c_int, 608445060)), + @bitCast(c_uint, @as(c_int, 553918724)), + @bitCast(c_uint, @as(c_int, 537141508)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 553918468)), + @bitCast(c_uint, @as(c_int, 553918724)), + @bitCast(c_uint, @as(c_int, 579085380)), + @bitCast(c_uint, @as(c_int, 537141508)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 270340)), + @bitCast(c_uint, @as(c_int, 537137156)), + @bitCast(c_uint, @as(c_int, 545539972)), + @bitCast(c_uint, @as(c_int, 8655748)), + @bitCast(c_uint, @as(c_int, 537143172)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 570696196)), + @bitCast(c_uint, @as(c_int, 570699652)), + @bitCast(c_uint, @as(c_int, 537141764)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 621029508)), + @bitCast(c_uint, @as(c_int, 621027844)), + @bitCast(c_uint, @as(c_int, 537143428)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537145332)), + @bitCast(c_uint, @as(c_int, 537145332)), + @bitCast(c_uint, @as(c_int, 537145332)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 654581764)), + @bitCast(c_uint, @as(c_int, 608445636)), + @bitCast(c_uint, @as(c_int, 641999940)), + @bitCast(c_uint, @as(c_int, 543434340)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 637806084)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 893659268)), + @bitCast(c_uint, @as(c_int, 605299244)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 549724164)), + @bitCast(c_uint, @as(c_int, 574890308)), + @bitCast(c_uint, @as(c_int, 574891076)), + @bitCast(c_uint, @as(c_int, 549724484)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 1073491952)), + @bitCast(c_uint, @as(c_int, 1060909044)), + @bitCast(c_uint, @as(c_int, 1035742900)), + @bitCast(c_uint, @as(c_int, 1035742132)), + @bitCast(c_uint, @as(c_int, 1060908724)), + @bitCast(c_uint, @as(c_int, 1073491956)), + @bitCast(c_uint, @as(c_int, 12276)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 562307460)), + @bitCast(c_uint, @as(c_int, 562307076)), + @bitCast(c_uint, @as(c_int, 562307460)), + @bitCast(c_uint, @as(c_int, 562307460)), + @bitCast(c_uint, @as(c_int, 537141636)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 941361168)), + @bitCast(c_uint, @as(c_int, 671361028)), + @bitCast(c_uint, @as(c_int, 671361028)), + @bitCast(c_uint, @as(c_int, 671361028)), + @bitCast(c_uint, @as(c_int, 671361028)), + @bitCast(c_uint, @as(c_int, 537931772)), + @bitCast(c_uint, @as(c_int, 16368)), + 0, + @bitCast(c_uint, @as(c_int, 1880883200)), + @bitCast(c_uint, @as(c_int, 127671828)), + @bitCast(c_uint, @as(c_int, 1436549360)), + @bitCast(c_uint, @as(c_int, 127664368)), + @bitCast(c_uint, @as(c_int, 1880890900)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 29360128)), + @bitCast(c_uint, @as(c_int, 333716460)), + @bitCast(c_uint, @as(c_int, 1065619460)), + @bitCast(c_uint, @as(c_int, 541335748)), + @bitCast(c_uint, @as(c_int, 541335620)), + @bitCast(c_uint, @as(c_int, 541335620)), + @bitCast(c_uint, @as(c_int, 545005636)), + @bitCast(c_uint, @as(c_int, 16320)), + 0, + @bitCast(c_uint, @as(c_int, 983568352)), + @bitCast(c_uint, @as(c_int, 716974752)), + @bitCast(c_uint, @as(c_int, 715401892)), + @bitCast(c_uint, @as(c_int, 537143972)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 3932172)), + @bitCast(c_uint, @as(c_int, 50856136)), + @bitCast(c_uint, @as(c_int, 806358032)), + @bitCast(c_uint, @as(c_int, 270540832)), + @bitCast(c_uint, @as(c_int, 71305280)), + @bitCast(c_uint, @as(c_int, 25166464)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1572864)), + @bitCast(c_uint, @as(c_int, 32505976)), + @bitCast(c_uint, @as(c_int, 65013744)), + @bitCast(c_uint, @as(c_int, 130024416)), + @bitCast(c_uint, @as(c_int, 67112512)), + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 67108864)), + @bitCast(c_uint, @as(c_int, 285215232)), + @bitCast(c_uint, @as(c_int, 71305856)), + @bitCast(c_uint, @as(c_int, 17826336)), + @bitCast(c_uint, @as(c_int, 5767304)), + 56, + 0, + @bitCast(c_uint, @as(c_int, 67108864)), + @bitCast(c_uint, @as(c_int, 352324096)), + @bitCast(c_uint, @as(c_int, 1346381952)), + @bitCast(c_uint, @as(c_int, 336603168)), + @bitCast(c_uint, @as(c_int, 84150792)), + @bitCast(c_uint, @as(c_int, 22807180)), + @bitCast(c_uint, @as(c_int, 8126652)), + 0, + @bitCast(c_uint, @as(c_int, 29360128)), + @bitCast(c_uint, @as(c_int, 20971840)), + @bitCast(c_uint, @as(c_int, 20971840)), + @bitCast(c_uint, @as(c_int, 267911488)), + @bitCast(c_uint, @as(c_int, 267913224)), + @bitCast(c_uint, @as(c_int, 178784264)), + @bitCast(c_uint, @as(c_int, 178784936)), + @bitCast(c_uint, @as(c_int, 4088)), + @bitCast(c_uint, @as(c_int, 536608768)), + @bitCast(c_uint, @as(c_int, 1610383358)), + @bitCast(c_uint, @as(c_int, 1073758208)), + @bitCast(c_uint, @as(c_int, 8421248)), + @bitCast(c_uint, @as(c_int, 29360576)), + @bitCast(c_uint, @as(c_int, 29360576)), + @bitCast(c_uint, @as(c_int, 29360576)), + 128, + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 29360256)), + @bitCast(c_uint, @as(c_int, 65012160)), + @bitCast(c_uint, @as(c_int, 133170144)), + @bitCast(c_uint, @as(c_int, 56624880)), + @bitCast(c_uint, @as(c_int, 448)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1040201728)), + @bitCast(c_uint, @as(c_int, 528498560)), + @bitCast(c_uint, @as(c_int, 203431488)), + @bitCast(c_uint, @as(c_int, 34081808)), + @bitCast(c_uint, @as(c_int, 8651012)), + @bitCast(c_uint, @as(c_int, 3670084)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 125829888)), + @bitCast(c_uint, @as(c_int, 534777792)), + @bitCast(c_uint, @as(c_int, 1065893840)), + @bitCast(c_uint, @as(c_int, 235020036)), + @bitCast(c_uint, @as(c_int, 33817602)), + @bitCast(c_uint, @as(c_int, 15728904)), + 0, + @bitCast(c_uint, @as(c_int, 12582912)), + @bitCast(c_uint, @as(c_int, 41943360)), + @bitCast(c_uint, @as(c_int, 136315968)), + @bitCast(c_uint, @as(c_int, 537399312)), + @bitCast(c_uint, @as(c_int, 805187588)), + @bitCast(c_uint, @as(c_int, 66586620)), + @bitCast(c_uint, @as(c_int, 14680560)), + 64, + 0, + @bitCast(c_uint, @as(c_int, 562315260)), + @bitCast(c_uint, @as(c_int, 25166208)), + @bitCast(c_uint, @as(c_int, 25166208)), + @bitCast(c_uint, @as(c_int, 25166208)), + @bitCast(c_uint, @as(c_int, 25166208)), + @bitCast(c_uint, @as(c_int, 62914944)), + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 20971904)), + @bitCast(c_uint, @as(c_int, 102761280)), + @bitCast(c_uint, @as(c_int, 202376736)), + @bitCast(c_uint, @as(c_int, 536349712)), + @bitCast(c_uint, @as(c_int, 940316680)), + @bitCast(c_uint, @as(c_int, 1879470084)), + @bitCast(c_uint, @as(c_int, 63503)), + @bitCast(c_uint, @as(c_int, 2013265920)), + @bitCast(c_uint, @as(c_int, 1342193664)), + @bitCast(c_uint, @as(c_int, 18432)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 1048576)), + @bitCast(c_uint, @as(c_int, 131082)), + 14, + @bitCast(c_uint, @as(c_int, 1968570368)), + @bitCast(c_uint, @as(c_int, 1577074690)), + @bitCast(c_uint, @as(c_int, 1409290242)), + @bitCast(c_uint, @as(c_int, 1090523650)), + @bitCast(c_uint, @as(c_int, 1082261758)), + @bitCast(c_uint, @as(c_int, 1082261634)), + @bitCast(c_uint, @as(c_int, 1082261634)), + @bitCast(c_uint, @as(c_int, 27390)), + 0, + @bitCast(c_uint, @as(c_int, 1056980736)), + @bitCast(c_uint, @as(c_int, 1056980736)), + @bitCast(c_uint, @as(c_int, 1056980736)), + @bitCast(c_uint, @as(c_int, 4194432)), + @bitCast(c_uint, @as(c_int, 1835040)), + @bitCast(c_uint, @as(c_int, 1835036)), + 0, + @bitCast(c_uint, @as(c_int, 1837105152)), + @bitCast(c_uint, @as(c_int, 16512)), + @bitCast(c_uint, @as(c_int, 1082146944)), + @bitCast(c_uint, @as(c_int, 1082130432)), + @bitCast(c_uint, @as(c_int, 4222336)), + @bitCast(c_uint, @as(c_int, 1835040)), + @bitCast(c_uint, @as(c_int, 1835036)), + 0, + @bitCast(c_uint, @as(c_int, 1074266112)), + @bitCast(c_uint, @as(c_int, 536748040)), + @bitCast(c_uint, @as(c_int, 336072712)), + @bitCast(c_uint, @as(c_int, 285741576)), + @bitCast(c_uint, @as(c_int, 273158280)), + @bitCast(c_uint, @as(c_int, 268963880)), + @bitCast(c_uint, @as(c_int, 268730360)), + @bitCast(c_uint, @as(c_int, 4098)), + @bitCast(c_uint, @as(c_int, 1048576)), + @bitCast(c_uint, @as(c_int, 1073479696)), + @bitCast(c_uint, @as(c_int, 716191056)), + @bitCast(c_uint, @as(c_int, 581969232)), + @bitCast(c_uint, @as(c_int, 548413776)), + @bitCast(c_uint, @as(c_int, 540024912)), + @bitCast(c_uint, @as(c_int, 536936432)), + @bitCast(c_uint, @as(c_int, 8192)), + @bitCast(c_uint, @as(c_int, 1073741824)), + @bitCast(c_uint, @as(c_int, 536354816)), + @bitCast(c_uint, @as(c_int, 67643400)), + @bitCast(c_uint, @as(c_int, 17310216)), + @bitCast(c_uint, @as(c_int, 4726920)), + @bitCast(c_uint, @as(c_int, 1581096)), + @bitCast(c_uint, @as(c_int, 894705672)), + 2, + 0, + @bitCast(c_uint, @as(c_int, 41943680)), + @bitCast(c_uint, @as(c_int, 113247936)), + @bitCast(c_uint, @as(c_int, 245370592)), + @bitCast(c_uint, @as(c_int, 512761520)), + @bitCast(c_uint, @as(c_int, 1049116312)), + @bitCast(c_uint, @as(c_int, 2130476684)), + 0, + @bitCast(c_uint, @as(c_int, 16777216)), + @bitCast(c_uint, @as(c_int, 90177792)), + @bitCast(c_uint, @as(c_int, 491261264)), + @bitCast(c_uint, @as(c_int, 2101493060)), + @bitCast(c_uint, @as(c_int, 1027898690)), + @bitCast(c_uint, @as(c_int, 223354184)), + @bitCast(c_uint, @as(c_int, 16778592)), + @bitCast(c_uint, @as(c_int, 256)), + @bitCast(c_uint, @as(c_int, 25165824)), + @bitCast(c_uint, @as(c_int, 69206592)), + @bitCast(c_uint, @as(c_int, 268961808)), + @bitCast(c_uint, @as(c_int, 8184)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 267395064)), + @bitCast(c_uint, @as(c_int, 62916576)), + @bitCast(c_uint, @as(c_int, 384)), + 0, + @bitCast(c_uint, @as(c_int, 17301744)), + @bitCast(c_uint, @as(c_int, 33817092)), + @bitCast(c_uint, @as(c_int, 33817092)), + @bitCast(c_uint, @as(c_int, 133169928)), + @bitCast(c_uint, @as(c_int, 469765632)), + @bitCast(c_uint, @as(c_int, 805320704)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 102237168)), + @bitCast(c_uint, @as(c_int, 136580108)), + @bitCast(c_uint, @as(c_int, 134481940)), + @bitCast(c_uint, @as(c_int, 202115076)), + @bitCast(c_uint, @as(c_int, 602936856)), + @bitCast(c_uint, @as(c_int, 402662400)), + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 477104064)), + @bitCast(c_uint, @as(c_int, 1670263704)), + @bitCast(c_uint, @as(c_int, 477115288)), + @bitCast(c_uint, @as(c_int, 1984)), + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 268443648)), + @bitCast(c_uint, @as(c_int, 74452928)), + @bitCast(c_uint, @as(c_int, 1628320280)), + @bitCast(c_uint, @as(c_int, 477114520)), + @bitCast(c_uint, @as(c_int, 1050528)), + 8, + 0, + 0, + @bitCast(c_uint, @as(c_int, 32764)), + @bitCast(c_uint, @as(c_int, 1074036732)), + @bitCast(c_uint, @as(c_int, 269492232)), + @bitCast(c_uint, @as(c_int, 71305248)), + @bitCast(c_uint, @as(c_int, 41943680)), + @bitCast(c_uint, @as(c_int, 41943680)), + @bitCast(c_uint, @as(c_int, 256)), + 0, + @bitCast(c_uint, @as(c_int, 1073905662)), + @bitCast(c_uint, @as(c_int, 268967940)), + @bitCast(c_uint, @as(c_int, 69208080)), + @bitCast(c_uint, @as(c_int, 37749312)), + @bitCast(c_uint, @as(c_int, 37749312)), + @bitCast(c_uint, @as(c_int, 20972096)), + 192, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 8388736)), + 128, + @bitCast(c_uint, @as(c_int, 1016987648)), + 0, + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 1065222592)), + @bitCast(c_uint, @as(c_int, 8389056)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 65011840)), + @bitCast(c_uint, @as(c_int, 1044251168)), + @bitCast(c_uint, @as(c_int, 65012256)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + 0, + @bitCast(c_uint, @as(c_int, 16777216)), + @bitCast(c_uint, @as(c_int, 71303808)), + @bitCast(c_uint, @as(c_int, 16777472)), + @bitCast(c_uint, @as(c_int, 1132732424)), + @bitCast(c_uint, @as(c_int, 1132763826)), + @bitCast(c_uint, @as(c_int, 16785416)), + @bitCast(c_uint, @as(c_int, 71303424)), + @bitCast(c_uint, @as(c_int, 16777856)), + @bitCast(c_uint, @as(c_int, 16777216)), + @bitCast(c_uint, @as(c_int, 71303808)), + @bitCast(c_uint, @as(c_int, 16777472)), + @bitCast(c_uint, @as(c_int, 1090789640)), + @bitCast(c_uint, @as(c_int, 1090822130)), + @bitCast(c_uint, @as(c_int, 16785672)), + @bitCast(c_uint, @as(c_int, 71303424)), + @bitCast(c_uint, @as(c_int, 16777856)), + @bitCast(c_uint, @as(c_int, 2015232000)), + @bitCast(c_uint, @as(c_int, 1342849026)), + @bitCast(c_uint, @as(c_int, 69224466)), + @bitCast(c_uint, @as(c_int, 576)), + @bitCast(c_uint, @as(c_int, 37748736)), + @bitCast(c_uint, @as(c_int, 1209140256)), + @bitCast(c_uint, @as(c_int, 1073893386)), + @bitCast(c_uint, @as(c_int, 30750)), + 0, + @bitCast(c_uint, @as(c_int, 536886272)), + @bitCast(c_uint, @as(c_int, 603990016)), + @bitCast(c_uint, @as(c_int, 16777728)), + @bitCast(c_uint, @as(c_int, 4194432)), + @bitCast(c_uint, @as(c_int, 1310756)), + @bitCast(c_uint, @as(c_int, 3932164)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 262204)), + @bitCast(c_uint, @as(c_int, 2359316)), + @bitCast(c_uint, @as(c_int, 8388672)), + @bitCast(c_uint, @as(c_int, 33554688)), + @bitCast(c_uint, @as(c_int, 671097856)), + @bitCast(c_uint, @as(c_int, 1006641152)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1048608)), + @bitCast(c_uint, @as(c_int, 269492168)), + @bitCast(c_uint, @as(c_int, 268439584)), + @bitCast(c_uint, @as(c_int, 268439552)), + @bitCast(c_uint, @as(c_int, 268439552)), + @bitCast(c_uint, @as(c_int, 8128)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 134218752)), + @bitCast(c_uint, @as(c_int, 134747128)), + @bitCast(c_uint, @as(c_int, 525320)), + @bitCast(c_uint, @as(c_int, 524296)), + @bitCast(c_uint, @as(c_int, 524296)), + @bitCast(c_uint, @as(c_int, 1016)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1073479680)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 536879104)), + @bitCast(c_uint, @as(c_int, 541073408)), + @bitCast(c_uint, @as(c_int, 1066410016)), + @bitCast(c_uint, @as(c_int, 4194336)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1073479680)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 670834692)), + @bitCast(c_uint, @as(c_int, 538976256)), + @bitCast(c_uint, @as(c_int, 1070080016)), + @bitCast(c_uint, @as(c_int, 2097168)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 268965912)), + @bitCast(c_uint, @as(c_int, 293605384)), + @bitCast(c_uint, @as(c_int, 268439936)), + @bitCast(c_uint, @as(c_int, 403705888)), + @bitCast(c_uint, @as(c_int, 1052616)), + 32, + 0, + @bitCast(c_uint, @as(c_int, 67109376)), + @bitCast(c_uint, @as(c_int, 604252668)), + @bitCast(c_uint, @as(c_int, 537141764)), + @bitCast(c_uint, @as(c_int, 541335556)), + @bitCast(c_uint, @as(c_int, 1066672164)), + @bitCast(c_uint, @as(c_int, 4194336)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 536875008)), + @bitCast(c_uint, @as(c_int, 571493390)), + @bitCast(c_uint, @as(c_int, 8392992)), + @bitCast(c_uint, @as(c_int, 287309888)), + @bitCast(c_uint, @as(c_int, 1275994640)), + @bitCast(c_uint, @as(c_int, 268443648)), + 0, + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1342324738)), + @bitCast(c_uint, @as(c_int, 1141000194)), + @bitCast(c_uint, @as(c_int, 1090667010)), + @bitCast(c_uint, @as(c_int, 1078083714)), + @bitCast(c_uint, @as(c_int, 1074937890)), + @bitCast(c_uint, @as(c_int, 1073889290)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 65011840)), + @bitCast(c_uint, @as(c_int, 134743184)), + @bitCast(c_uint, @as(c_int, 1016989704)), + @bitCast(c_uint, @as(c_int, 134744072)), + @bitCast(c_uint, @as(c_int, 65012880)), + @bitCast(c_uint, @as(c_int, 8388736)), + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 1073611200)), + @bitCast(c_uint, @as(c_int, 8389056)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 65011840)), + @bitCast(c_uint, @as(c_int, 1073611744)), + @bitCast(c_uint, @as(c_int, 65012704)), + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 8388736)), + 0, + @bitCast(c_uint, @as(c_int, 16777216)), + @bitCast(c_uint, @as(c_int, 130024320)), + @bitCast(c_uint, @as(c_int, 16777472)), + @bitCast(c_uint, @as(c_int, 1670127624)), + @bitCast(c_uint, @as(c_int, 1670183870)), + @bitCast(c_uint, @as(c_int, 16785416)), + @bitCast(c_uint, @as(c_int, 130023680)), + @bitCast(c_uint, @as(c_int, 16778112)), + @bitCast(c_uint, @as(c_int, 16777216)), + @bitCast(c_uint, @as(c_int, 130024320)), + @bitCast(c_uint, @as(c_int, 16777472)), + @bitCast(c_uint, @as(c_int, 1628184840)), + @bitCast(c_uint, @as(c_int, 1628241918)), + @bitCast(c_uint, @as(c_int, 16785672)), + @bitCast(c_uint, @as(c_int, 130023680)), + @bitCast(c_uint, @as(c_int, 16778112)), + @bitCast(c_uint, @as(c_int, 2015232000)), + @bitCast(c_uint, @as(c_int, 1611034638)), + @bitCast(c_uint, @as(c_int, 69224466)), + @bitCast(c_uint, @as(c_int, 576)), + @bitCast(c_uint, @as(c_int, 37748736)), + @bitCast(c_uint, @as(c_int, 1209140256)), + @bitCast(c_uint, @as(c_int, 1879990278)), + @bitCast(c_uint, @as(c_int, 30750)), + 0, + @bitCast(c_uint, @as(c_int, 939539456)), + @bitCast(c_uint, @as(c_int, 603992064)), + @bitCast(c_uint, @as(c_int, 16777728)), + @bitCast(c_uint, @as(c_int, 4194432)), + @bitCast(c_uint, @as(c_int, 786468)), + @bitCast(c_uint, @as(c_int, 3932188)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1835068)), + @bitCast(c_uint, @as(c_int, 2359308)), + @bitCast(c_uint, @as(c_int, 8388672)), + @bitCast(c_uint, @as(c_int, 33554688)), + @bitCast(c_uint, @as(c_int, 805315584)), + @bitCast(c_uint, @as(c_int, 1006647296)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 3145760)), + @bitCast(c_uint, @as(c_int, 271589368)), + @bitCast(c_uint, @as(c_int, 268439584)), + @bitCast(c_uint, @as(c_int, 268439552)), + @bitCast(c_uint, @as(c_int, 268439552)), + @bitCast(c_uint, @as(c_int, 8128)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 201327616)), + @bitCast(c_uint, @as(c_int, 201859064)), + @bitCast(c_uint, @as(c_int, 525320)), + @bitCast(c_uint, @as(c_int, 524296)), + @bitCast(c_uint, @as(c_int, 524296)), + @bitCast(c_uint, @as(c_int, 1016)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1073479680)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 536879104)), + @bitCast(c_uint, @as(c_int, 541073408)), + @bitCast(c_uint, @as(c_int, 1072701536)), + @bitCast(c_uint, @as(c_int, 4194400)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1073479680)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 670834692)), + @bitCast(c_uint, @as(c_int, 538976256)), + @bitCast(c_uint, @as(c_int, 1073225776)), + @bitCast(c_uint, @as(c_int, 2097200)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 268965912)), + @bitCast(c_uint, @as(c_int, 293605384)), + @bitCast(c_uint, @as(c_int, 268439936)), + @bitCast(c_uint, @as(c_int, 405803040)), + @bitCast(c_uint, @as(c_int, 3149816)), + 32, + 0, + @bitCast(c_uint, @as(c_int, 100663808)), + @bitCast(c_uint, @as(c_int, 637808636)), + @bitCast(c_uint, @as(c_int, 537141764)), + @bitCast(c_uint, @as(c_int, 541335556)), + @bitCast(c_uint, @as(c_int, 1072963684)), + @bitCast(c_uint, @as(c_int, 4194400)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 805310464)), + @bitCast(c_uint, @as(c_int, 839941134)), + @bitCast(c_uint, @as(c_int, 8392992)), + @bitCast(c_uint, @as(c_int, 287309888)), + @bitCast(c_uint, @as(c_int, 2081305104)), + @bitCast(c_uint, @as(c_int, 268447744)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 805584892)), + @bitCast(c_uint, @as(c_int, 604252164)), + @bitCast(c_uint, @as(c_int, 553918980)), + @bitCast(c_uint, @as(c_int, 541335684)), + @bitCast(c_uint, @as(c_int, 538189860)), + @bitCast(c_uint, @as(c_int, 1073487884)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 600063996)), + @bitCast(c_uint, @as(c_int, 600056772)), + @bitCast(c_uint, @as(c_int, 537142212)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1040465916)), + @bitCast(c_uint, @as(c_int, 1040465412)), + @bitCast(c_uint, @as(c_int, 537148932)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1040465412)), + @bitCast(c_uint, @as(c_int, 1040465412)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1040457732)), + @bitCast(c_uint, @as(c_int, 1040465412)), + @bitCast(c_uint, @as(c_int, 1073495556)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 600055812)), + @bitCast(c_uint, @as(c_int, 600056772)), + @bitCast(c_uint, @as(c_int, 1073488836)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 545005572)), + @bitCast(c_uint, @as(c_int, 545005692)), + @bitCast(c_uint, @as(c_int, 1073487996)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 545005692)), + @bitCast(c_uint, @as(c_int, 545005692)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 545013756)), + @bitCast(c_uint, @as(c_int, 545005692)), + @bitCast(c_uint, @as(c_int, 537141372)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 600056772)), + @bitCast(c_uint, @as(c_int, 600056772)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1073487876)), + 0, + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1206010242)), + @bitCast(c_uint, @as(c_int, 1341278178)), + @bitCast(c_uint, @as(c_int, 1206013938)), + @bitCast(c_uint, @as(c_int, 1099057122)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 2147418112)), + @bitCast(c_uint, @as(c_int, 1073823745)), + @bitCast(c_uint, @as(c_int, 1073823745)), + @bitCast(c_uint, @as(c_int, 1230331357)), + @bitCast(c_uint, @as(c_int, 1229277533)), + @bitCast(c_uint, @as(c_int, 1073826245)), + @bitCast(c_uint, @as(c_int, 1073823745)), + @bitCast(c_uint, @as(c_int, 32767)), + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1395815218)), + @bitCast(c_uint, @as(c_int, 1154370766)), + @bitCast(c_uint, @as(c_int, 1093813042)), + @bitCast(c_uint, @as(c_int, 1078870222)), + @bitCast(c_uint, @as(c_int, 1209160754)), + @bitCast(c_uint, @as(c_int, 1074156558)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1395815218)), + @bitCast(c_uint, @as(c_int, 1154370766)), + @bitCast(c_uint, @as(c_int, 1093813042)), + @bitCast(c_uint, @as(c_int, 1548632270)), + @bitCast(c_uint, @as(c_int, 1142047794)), + @bitCast(c_uint, @as(c_int, 1074158606)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1123959166)), + @bitCast(c_uint, @as(c_int, 1123959166)), + @bitCast(c_uint, @as(c_int, 1123959166)), + @bitCast(c_uint, @as(c_int, 1123959166)), + @bitCast(c_uint, @as(c_int, 1123959166)), + @bitCast(c_uint, @as(c_int, 1123959166)), + @bitCast(c_uint, @as(c_int, 32766)), + @bitCast(c_uint, @as(c_int, 134086656)), + @bitCast(c_uint, @as(c_int, 536477698)), + @bitCast(c_uint, @as(c_int, 2146041866)), + @bitCast(c_uint, @as(c_int, 1076510762)), + @bitCast(c_uint, @as(c_int, 1529499946)), + @bitCast(c_uint, @as(c_int, 1361597738)), + @bitCast(c_uint, @as(c_int, 1075859752)), + @bitCast(c_uint, @as(c_int, 32736)), + 0, + @bitCast(c_uint, @as(c_int, 536346624)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 306716664)), + @bitCast(c_uint, @as(c_int, 536351304)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 8184)), + 0, + @bitCast(c_uint, @as(c_int, 306708480)), + @bitCast(c_uint, @as(c_int, 2147357256)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 306741246)), + @bitCast(c_uint, @as(c_int, 2147357256)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 306741246)), + @bitCast(c_uint, @as(c_int, 4680)), + 0, + @bitCast(c_uint, @as(c_int, 473432064)), + @bitCast(c_uint, @as(c_int, 473438184)), + @bitCast(c_uint, @as(c_int, 135268368)), + @bitCast(c_uint, @as(c_int, 135268368)), + @bitCast(c_uint, @as(c_int, 401087544)), + @bitCast(c_uint, @as(c_int, 7224)), + 0, + @bitCast(c_uint, @as(c_int, 1879965696)), + @bitCast(c_uint, @as(c_int, 1879990266)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 1610248206)), + @bitCast(c_uint, @as(c_int, 28686)), + @bitCast(c_uint, @as(c_int, 1065222144)), + @bitCast(c_uint, @as(c_int, 557982018)), + @bitCast(c_uint, @as(c_int, 557982018)), + @bitCast(c_uint, @as(c_int, 16254)), + @bitCast(c_uint, @as(c_int, 557989758)), + @bitCast(c_uint, @as(c_int, 557982018)), + @bitCast(c_uint, @as(c_int, 1065230658)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1001914368)), + @bitCast(c_uint, @as(c_int, 1001929656)), + @bitCast(c_uint, @as(c_int, 1001914368)), + @bitCast(c_uint, @as(c_int, 1001929656)), + @bitCast(c_uint, @as(c_int, 1001914368)), + @bitCast(c_uint, @as(c_int, 1001929656)), + 0, + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 2147385342)), + @bitCast(c_uint, @as(c_int, 2013163520)), + @bitCast(c_uint, @as(c_int, 2013165566)), + @bitCast(c_uint, @as(c_int, 2004776704)), + @bitCast(c_uint, @as(c_int, 2004776830)), + @bitCast(c_uint, @as(c_int, 2004776830)), + @bitCast(c_uint, @as(c_int, 30590)), + @bitCast(c_uint, @as(c_int, 2015232000)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 16386)), + @bitCast(c_uint, @as(c_int, 25165824)), + @bitCast(c_uint, @as(c_int, 384)), + @bitCast(c_uint, @as(c_int, 1073872896)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 30750)), + @bitCast(c_uint, @as(c_int, 2015232000)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 16386)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 1073872896)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 30750)), + @bitCast(c_uint, @as(c_int, 2015232000)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 132136962)), + @bitCast(c_uint, @as(c_int, 132122592)), + @bitCast(c_uint, @as(c_int, 132122592)), + @bitCast(c_uint, @as(c_int, 1073874912)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 30750)), + @bitCast(c_uint, @as(c_int, 2015232000)), + @bitCast(c_uint, @as(c_int, 1610235906)), + @bitCast(c_uint, @as(c_int, 536371194)), + @bitCast(c_uint, @as(c_int, 536354808)), + @bitCast(c_uint, @as(c_int, 536354808)), + @bitCast(c_uint, @as(c_int, 1610227704)), + @bitCast(c_uint, @as(c_int, 1073897466)), + @bitCast(c_uint, @as(c_int, 30750)), + 0, + @bitCast(c_uint, @as(c_int, 537147420)), + @bitCast(c_uint, @as(c_int, 8196)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537133056)), + @bitCast(c_uint, @as(c_int, 941367300)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 498597888)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 268959744)), + @bitCast(c_uint, @as(c_int, 4104)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 7608)), + 0, + @bitCast(c_uint, @as(c_int, 894828544)), + @bitCast(c_uint, @as(c_int, 8194)), + @bitCast(c_uint, @as(c_int, 8194)), + @bitCast(c_uint, @as(c_int, 8194)), + @bitCast(c_uint, @as(c_int, 8194)), + @bitCast(c_uint, @as(c_int, 8194)), + @bitCast(c_uint, @as(c_int, 894836738)), + 0, + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1209159666)), + @bitCast(c_uint, @as(c_int, 1234323474)), + @bitCast(c_uint, @as(c_int, 1209158034)), + @bitCast(c_uint, @as(c_int, 1341278226)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 32766)), + 0, + @bitCast(c_uint, @as(c_int, 277094396)), + @bitCast(c_uint, @as(c_int, 277090436)), + @bitCast(c_uint, @as(c_int, 536612996)), + @bitCast(c_uint, @as(c_int, 277090436)), + @bitCast(c_uint, @as(c_int, 277090436)), + @bitCast(c_uint, @as(c_int, 8188)), + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 268435456)), + @bitCast(c_uint, @as(c_int, 67110912)), + @bitCast(c_uint, @as(c_int, 17039872)), + @bitCast(c_uint, @as(c_int, 5243016)), + 32, + 0, + 0, + @bitCast(c_uint, @as(c_int, 268959744)), + @bitCast(c_uint, @as(c_int, 69208080)), + @bitCast(c_uint, @as(c_int, 25166400)), + @bitCast(c_uint, @as(c_int, 37749120)), + @bitCast(c_uint, @as(c_int, 135267360)), + @bitCast(c_uint, @as(c_int, 4104)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 33554432)), + @bitCast(c_uint, @as(c_int, 8388864)), + @bitCast(c_uint, @as(c_int, 2097216)), + @bitCast(c_uint, @as(c_int, 2097168)), + @bitCast(c_uint, @as(c_int, 8388672)), + @bitCast(c_uint, @as(c_int, 33554688)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 4194304)), + @bitCast(c_uint, @as(c_int, 16777344)), + @bitCast(c_uint, @as(c_int, 67109376)), + @bitCast(c_uint, @as(c_int, 67110912)), + @bitCast(c_uint, @as(c_int, 16777728)), + @bitCast(c_uint, @as(c_int, 4194432)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 134746116)), + @bitCast(c_uint, @as(c_int, 35652624)), + @bitCast(c_uint, @as(c_int, 8388928)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 20971648)), + @bitCast(c_uint, @as(c_int, 68157984)), + @bitCast(c_uint, @as(c_int, 268699656)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 33554432)), + @bitCast(c_uint, @as(c_int, 58721024)), + @bitCast(c_uint, @as(c_int, 65012672)), + @bitCast(c_uint, @as(c_int, 65012720)), + @bitCast(c_uint, @as(c_int, 58721216)), + @bitCast(c_uint, @as(c_int, 33555200)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 4194304)), + @bitCast(c_uint, @as(c_int, 29360320)), + @bitCast(c_uint, @as(c_int, 130024384)), + @bitCast(c_uint, @as(c_int, 130027456)), + @bitCast(c_uint, @as(c_int, 29361088)), + @bitCast(c_uint, @as(c_int, 4194496)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 267919356)), + @bitCast(c_uint, @as(c_int, 65013744)), + @bitCast(c_uint, @as(c_int, 8389056)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 29360256)), + @bitCast(c_uint, @as(c_int, 133170144)), + @bitCast(c_uint, @as(c_int, 536612856)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 413141184)), + @bitCast(c_uint, @as(c_int, 847778448)), + @bitCast(c_uint, @as(c_int, 612509318)), + @bitCast(c_uint, @as(c_int, 646325378)), + @bitCast(c_uint, @as(c_int, 311440008)), + @bitCast(c_uint, @as(c_int, 146806944)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 75499392)), + @bitCast(c_uint, @as(c_int, 4194496)), + @bitCast(c_uint, @as(c_int, 1713373424)), + @bitCast(c_uint, @as(c_int, 135281712)), + @bitCast(c_uint, @as(c_int, 319426072)), + @bitCast(c_uint, @as(c_int, 12686)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 8388608)), + @bitCast(c_uint, @as(c_int, 143132808)), + @bitCast(c_uint, @as(c_int, 715786890)), + @bitCast(c_uint, @as(c_int, 176827050)), + @bitCast(c_uint, @as(c_int, 143132808)), + 128, + 0, + 0, + @bitCast(c_uint, @as(c_int, 6291456)), + @bitCast(c_uint, @as(c_int, 17301648)), + @bitCast(c_uint, @as(c_int, 33816840)), + @bitCast(c_uint, @as(c_int, 1107575300)), + @bitCast(c_uint, @as(c_int, 604120066)), + @bitCast(c_uint, @as(c_int, 6144)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 133693440)), + @bitCast(c_uint, @as(c_int, 67634184)), + @bitCast(c_uint, @as(c_int, 67634184)), + @bitCast(c_uint, @as(c_int, 67634184)), + @bitCast(c_uint, @as(c_int, 2081293320)), + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 10485824)), + @bitCast(c_uint, @as(c_int, 570966288)), + @bitCast(c_uint, @as(c_int, 134353924)), + 0, + 0, + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 69206016)), + @bitCast(c_uint, @as(c_int, 25166400)), + @bitCast(c_uint, @as(c_int, 37749120)), + @bitCast(c_uint, @as(c_int, 1056)), + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 406323200)), + @bitCast(c_uint, @as(c_int, 304616488)), + @bitCast(c_uint, @as(c_int, 279449896)), + @bitCast(c_uint, @as(c_int, 287838376)), + @bitCast(c_uint, @as(c_int, 338170408)), + @bitCast(c_uint, @as(c_int, 6200)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 402653184)), + @bitCast(c_uint, @as(c_int, 293606912)), + @bitCast(c_uint, @as(c_int, 270012512)), + @bitCast(c_uint, @as(c_int, 274731032)), + @bitCast(c_uint, @as(c_int, 369103232)), + @bitCast(c_uint, @as(c_int, 6144)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1572864)), + @bitCast(c_uint, @as(c_int, 25690216)), + @bitCast(c_uint, @as(c_int, 403179016)), + @bitCast(c_uint, @as(c_int, 101193736)), + @bitCast(c_uint, @as(c_int, 6816136)), + 24, + 0, + 0, + @bitCast(c_uint, @as(c_int, 511180800)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 306713160)), + @bitCast(c_uint, @as(c_int, 7800)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 536346624)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 8184)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 471334912)), + @bitCast(c_uint, @as(c_int, 340268072)), + @bitCast(c_uint, @as(c_int, 352851080)), + @bitCast(c_uint, @as(c_int, 344462600)), + @bitCast(c_uint, @as(c_int, 338170952)), + @bitCast(c_uint, @as(c_int, 7192)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 62914560)), + @bitCast(c_uint, @as(c_int, 135267360)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 69208080)), + @bitCast(c_uint, @as(c_int, 960)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 204474336)), + @bitCast(c_uint, @as(c_int, 331880472)), + @bitCast(c_uint, @as(c_int, 338171496)), + @bitCast(c_uint, @as(c_int, 338170920)), + @bitCast(c_uint, @as(c_int, 473439288)), + @bitCast(c_uint, @as(c_int, 135275076)), + 0, + @bitCast(c_uint, @as(c_int, 130023424)), + @bitCast(c_uint, @as(c_int, 136316960)), + @bitCast(c_uint, @as(c_int, 1073219616)), + @bitCast(c_uint, @as(c_int, 596123656)), + @bitCast(c_uint, @as(c_int, 554181512)), + @bitCast(c_uint, @as(c_int, 537403656)), + @bitCast(c_uint, @as(c_int, 535830536)), + 0, + @bitCast(c_uint, @as(c_int, 130023424)), + @bitCast(c_uint, @as(c_int, 134219776)), + @bitCast(c_uint, @as(c_int, 1073219584)), + @bitCast(c_uint, @as(c_int, 596123656)), + @bitCast(c_uint, @as(c_int, 554181512)), + @bitCast(c_uint, @as(c_int, 537403656)), + @bitCast(c_uint, @as(c_int, 535830536)), + 0, + @bitCast(c_uint, @as(c_int, 29360128)), + @bitCast(c_uint, @as(c_int, 202901360)), + @bitCast(c_uint, @as(c_int, 814094476)), + @bitCast(c_uint, @as(c_int, 1619206274)), + @bitCast(c_uint, @as(c_int, 1610827649)), + @bitCast(c_uint, @as(c_int, 805707778)), + @bitCast(c_uint, @as(c_int, 202905612)), + @bitCast(c_uint, @as(c_int, 29362032)), + @bitCast(c_uint, @as(c_int, 169869312)), + @bitCast(c_uint, @as(c_int, 455088928)), + @bitCast(c_uint, @as(c_int, 69209632)), + @bitCast(c_uint, @as(c_int, 69207072)), + @bitCast(c_uint, @as(c_int, 74449952)), + @bitCast(c_uint, @as(c_int, 242224752)), + @bitCast(c_uint, @as(c_int, 242224752)), + @bitCast(c_uint, @as(c_int, 69209712)), + @bitCast(c_uint, @as(c_int, 25165824)), + @bitCast(c_uint, @as(c_int, 1004286348)), + @bitCast(c_uint, @as(c_int, 267395064)), + @bitCast(c_uint, @as(c_int, 2084445816)), + @bitCast(c_uint, @as(c_int, 511212606)), + @bitCast(c_uint, @as(c_int, 536350704)), + @bitCast(c_uint, @as(c_int, 831273948)), + @bitCast(c_uint, @as(c_int, 384)), + @bitCast(c_uint, @as(c_int, 25165824)), + @bitCast(c_uint, @as(c_int, 1073492364)), + @bitCast(c_uint, @as(c_int, 473440248)), + @bitCast(c_uint, @as(c_int, 2015238168)), + @bitCast(c_uint, @as(c_int, 404256798)), + @bitCast(c_uint, @as(c_int, 536353848)), + @bitCast(c_uint, @as(c_int, 831275004)), + @bitCast(c_uint, @as(c_int, 384)), + 0, + @bitCast(c_uint, @as(c_int, 134746104)), + @bitCast(c_uint, @as(c_int, 134750204)), + @bitCast(c_uint, @as(c_int, 178784936)), + @bitCast(c_uint, @as(c_int, 178784936)), + @bitCast(c_uint, @as(c_int, 178784936)), + @bitCast(c_uint, @as(c_int, 134744744)), + @bitCast(c_uint, @as(c_int, 4088)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 134496132)), + @bitCast(c_uint, @as(c_int, 67374980)), + @bitCast(c_uint, @as(c_int, 67372932)), + @bitCast(c_uint, @as(c_int, 2044)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 608175104)), + @bitCast(c_uint, @as(c_int, 5248)), + @bitCast(c_uint, @as(c_int, 1862143488)), + @bitCast(c_uint, @as(c_int, 3584)), + @bitCast(c_uint, @as(c_int, 608179328)), + @bitCast(c_uint, @as(c_int, 1024)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 62914560)), + @bitCast(c_uint, @as(c_int, 137364576)), + @bitCast(c_uint, @as(c_int, 286789912)), + @bitCast(c_uint, @as(c_int, 286789912)), + @bitCast(c_uint, @as(c_int, 73402416)), + @bitCast(c_uint, @as(c_int, 960)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 277348480)), + @bitCast(c_uint, @as(c_int, 113248272)), + @bitCast(c_uint, @as(c_int, 913049568)), + @bitCast(c_uint, @as(c_int, 132121152)), + @bitCast(c_uint, @as(c_int, 5992)), + @bitCast(c_uint, @as(c_int, 69206592)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1026031616)), + @bitCast(c_uint, @as(c_int, 623387948)), + @bitCast(c_uint, @as(c_int, 1026041128)), + @bitCast(c_uint, @as(c_int, 86508840)), + @bitCast(c_uint, @as(c_int, 99091752)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 25165824)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 25166784)), + @bitCast(c_uint, @as(c_int, 267388896)), + @bitCast(c_uint, @as(c_int, 198183888)), + @bitCast(c_uint, @as(c_int, 173018064)), + @bitCast(c_uint, @as(c_int, 37749312)), + @bitCast(c_uint, @as(c_int, 37749312)), + @bitCast(c_uint, @as(c_int, 25165824)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 293606336)), + @bitCast(c_uint, @as(c_int, 63447032)), + @bitCast(c_uint, @as(c_int, 130024392)), + @bitCast(c_uint, @as(c_int, 71304256)), + @bitCast(c_uint, @as(c_int, 201852024)), + 0, + @bitCast(c_uint, @as(c_int, 1073217536)), + @bitCast(c_uint, @as(c_int, 806895608)), + @bitCast(c_uint, @as(c_int, 806891544)), + @bitCast(c_uint, @as(c_int, 1073233912)), + @bitCast(c_uint, @as(c_int, 50332416)), + @bitCast(c_uint, @as(c_int, 62915520)), + @bitCast(c_uint, @as(c_int, 65012480)), + @bitCast(c_uint, @as(c_int, 992)), + @bitCast(c_uint, @as(c_int, 1073217536)), + @bitCast(c_uint, @as(c_int, 1073233912)), + @bitCast(c_uint, @as(c_int, 865615864)), + @bitCast(c_uint, @as(c_int, 1073230744)), + @bitCast(c_uint, @as(c_int, 1073233912)), + @bitCast(c_uint, @as(c_int, 1344)), + @bitCast(c_uint, @as(c_int, 266341024)), + @bitCast(c_uint, @as(c_int, 4064)), + 0, + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 537137160)), + @bitCast(c_uint, @as(c_int, 625221636)), + @bitCast(c_uint, @as(c_int, 268967940)), + @bitCast(c_uint, @as(c_int, 100666352)), + @bitCast(c_uint, @as(c_int, 768)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 289669120)), + @bitCast(c_uint, @as(c_int, 133172200)), + @bitCast(c_uint, @as(c_int, 471600696)), + @bitCast(c_uint, @as(c_int, 471600152)), + @bitCast(c_uint, @as(c_int, 133172792)), + @bitCast(c_uint, @as(c_int, 289672168)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537395200)), + @bitCast(c_uint, @as(c_int, 207622160)), + @bitCast(c_uint, @as(c_int, 130027488)), + @bitCast(c_uint, @as(c_int, 130025408)), + @bitCast(c_uint, @as(c_int, 207622112)), + @bitCast(c_uint, @as(c_int, 537399312)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537395200)), + @bitCast(c_uint, @as(c_int, 207622160)), + @bitCast(c_uint, @as(c_int, 71307232)), + @bitCast(c_uint, @as(c_int, 71325012)), + @bitCast(c_uint, @as(c_int, 207622112)), + @bitCast(c_uint, @as(c_int, 537399312)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 8388736)), + @bitCast(c_uint, @as(c_int, 29360576)), + @bitCast(c_uint, @as(c_int, 536625150)), + @bitCast(c_uint, @as(c_int, 65013744)), + @bitCast(c_uint, @as(c_int, 133170144)), + @bitCast(c_uint, @as(c_int, 202901360)), + @bitCast(c_uint, @as(c_int, 2056)), + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 135792656)), + @bitCast(c_uint, @as(c_int, 135268376)), + @bitCast(c_uint, @as(c_int, 168822800)), + @bitCast(c_uint, @as(c_int, 135792656)), + @bitCast(c_uint, @as(c_int, 135268376)), + @bitCast(c_uint, @as(c_int, 135268368)), + @bitCast(c_uint, @as(c_int, 8184)), + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 135268368)), + @bitCast(c_uint, @as(c_int, 135268368)), + @bitCast(c_uint, @as(c_int, 269484048)), + @bitCast(c_uint, @as(c_int, 1334845456)), + @bitCast(c_uint, @as(c_int, 269492240)), + @bitCast(c_uint, @as(c_int, 135266320)), + @bitCast(c_uint, @as(c_int, 4080)), + @bitCast(c_uint, @as(c_int, 262144)), + @bitCast(c_uint, @as(c_int, 2031630)), + @bitCast(c_uint, @as(c_int, 250871812)), + @bitCast(c_uint, @as(c_int, 317985412)), + @bitCast(c_uint, @as(c_int, 250876436)), + @bitCast(c_uint, @as(c_int, 268697604)), + @bitCast(c_uint, @as(c_int, 2147233796)), + @bitCast(c_uint, @as(c_int, 268447744)), + @bitCast(c_uint, @as(c_int, 2013528064)), + @bitCast(c_uint, @as(c_int, 1344233486)), + @bitCast(c_uint, @as(c_int, 250888196)), + @bitCast(c_uint, @as(c_int, 317985412)), + @bitCast(c_uint, @as(c_int, 250876548)), + @bitCast(c_uint, @as(c_int, 269746180)), + @bitCast(c_uint, @as(c_int, 2147233804)), + @bitCast(c_uint, @as(c_int, 268447744)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 1344823344)), + @bitCast(c_uint, @as(c_int, 1207846916)), + @bitCast(c_uint, @as(c_int, 1143096322)), + @bitCast(c_uint, @as(c_int, 1143096354)), + @bitCast(c_uint, @as(c_int, 605189602)), + @bitCast(c_uint, @as(c_int, 201724938)), + @bitCast(c_uint, @as(c_int, 2046)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 1610121200)), + @bitCast(c_uint, @as(c_int, 1207848956)), + @bitCast(c_uint, @as(c_int, 1143096322)), + @bitCast(c_uint, @as(c_int, 1143096354)), + @bitCast(c_uint, @as(c_int, 605189602)), + @bitCast(c_uint, @as(c_int, 201724938)), + @bitCast(c_uint, @as(c_int, 2046)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 1345871920)), + @bitCast(c_uint, @as(c_int, 1207846972)), + @bitCast(c_uint, @as(c_int, 1144931390)), + @bitCast(c_uint, @as(c_int, 1144931390)), + @bitCast(c_uint, @as(c_int, 605976062)), + @bitCast(c_uint, @as(c_int, 201724942)), + @bitCast(c_uint, @as(c_int, 2046)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 1344823344)), + @bitCast(c_uint, @as(c_int, 1207846916)), + @bitCast(c_uint, @as(c_int, 1207846910)), + @bitCast(c_uint, @as(c_int, 1207846910)), + @bitCast(c_uint, @as(c_int, 670988286)), + @bitCast(c_uint, @as(c_int, 268310526)), + @bitCast(c_uint, @as(c_int, 2046)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 1344823344)), + @bitCast(c_uint, @as(c_int, 1207846916)), + @bitCast(c_uint, @as(c_int, 1143096322)), + @bitCast(c_uint, @as(c_int, 1143096354)), + @bitCast(c_uint, @as(c_int, 1072857058)), + @bitCast(c_uint, @as(c_int, 268312570)), + @bitCast(c_uint, @as(c_int, 2046)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 1881694256)), + @bitCast(c_uint, @as(c_int, 2147383300)), + @bitCast(c_uint, @as(c_int, 2082634754)), + @bitCast(c_uint, @as(c_int, 2082634786)), + @bitCast(c_uint, @as(c_int, 1007844834)), + @bitCast(c_uint, @as(c_int, 201726986)), + @bitCast(c_uint, @as(c_int, 2046)), + @bitCast(c_uint, @as(c_int, 2145386496)), + @bitCast(c_uint, @as(c_int, 2145943536)), + @bitCast(c_uint, @as(c_int, 2147385316)), + @bitCast(c_uint, @as(c_int, 2145550306)), + @bitCast(c_uint, @as(c_int, 2145550306)), + @bitCast(c_uint, @as(c_int, 605192162)), + @bitCast(c_uint, @as(c_int, 201724938)), + @bitCast(c_uint, @as(c_int, 2046)), + 0, + @bitCast(c_uint, @as(c_int, 704787454)), + @bitCast(c_uint, @as(c_int, 570566146)), + @bitCast(c_uint, @as(c_int, 570565122)), + @bitCast(c_uint, @as(c_int, 704783874)), + @bitCast(c_uint, @as(c_int, 10499070)), + @bitCast(c_uint, @as(c_int, 34078992)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537673724)), + @bitCast(c_uint, @as(c_int, 786444)), + @bitCast(c_uint, @as(c_int, 1073479692)), + @bitCast(c_uint, @as(c_int, 805318656)), + @bitCast(c_uint, @as(c_int, 805318656)), + @bitCast(c_uint, @as(c_int, 1073491972)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 2228286)), + @bitCast(c_uint, @as(c_int, 19005922)), + @bitCast(c_uint, @as(c_int, 16777534)), + @bitCast(c_uint, @as(c_int, 16777472)), + @bitCast(c_uint, @as(c_int, 2030043392)), + @bitCast(c_uint, @as(c_int, 1325418752)), + @bitCast(c_uint, @as(c_int, 30720)), + 0, + @bitCast(c_uint, @as(c_int, 1140882432)), + @bitCast(c_uint, @as(c_int, 1157645824)), + @bitCast(c_uint, @as(c_int, 6454462)), + @bitCast(c_uint, @as(c_int, 6422562)), + @bitCast(c_uint, @as(c_int, 1157659838)), + @bitCast(c_uint, @as(c_int, 1140868608)), + @bitCast(c_uint, @as(c_int, 31744)), + 0, + @bitCast(c_uint, @as(c_int, 4456572)), + @bitCast(c_uint, @as(c_int, 1048700)), + @bitCast(c_uint, @as(c_int, 1058013200)), + @bitCast(c_uint, @as(c_int, 1058021872)), + @bitCast(c_uint, @as(c_int, 1058013200)), + @bitCast(c_uint, @as(c_int, 1056973296)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 4456572)), + @bitCast(c_uint, @as(c_int, 4456516)), + @bitCast(c_uint, @as(c_int, 1048700)), + @bitCast(c_uint, @as(c_int, 1048592)), + @bitCast(c_uint, @as(c_int, 1141931024)), + @bitCast(c_uint, @as(c_int, 1140869104)), + @bitCast(c_uint, @as(c_int, 31744)), + 0, + @bitCast(c_uint, @as(c_int, 4456572)), + @bitCast(c_uint, @as(c_int, 4456516)), + 124, + 16, + @bitCast(c_uint, @as(c_int, 1140882448)), + @bitCast(c_uint, @as(c_int, 1140868432)), + @bitCast(c_uint, @as(c_int, 31744)), + @bitCast(c_uint, @as(c_int, 44040192)), + @bitCast(c_uint, @as(c_int, 581189628)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 537145332)), + @bitCast(c_uint, @as(c_int, 537145332)), + @bitCast(c_uint, @as(c_int, 537145332)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1073479680)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 610150340)), + @bitCast(c_uint, @as(c_int, 667165764)), + @bitCast(c_uint, @as(c_int, 537141278)), + @bitCast(c_uint, @as(c_int, 538845188)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + 0, + @bitCast(c_uint, @as(c_int, 132120576)), + @bitCast(c_uint, @as(c_int, 69207072)), + @bitCast(c_uint, @as(c_int, 606355452)), + @bitCast(c_uint, @as(c_int, 606348324)), + @bitCast(c_uint, @as(c_int, 606348324)), + @bitCast(c_uint, @as(c_int, 1073488932)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 266338304)), + @bitCast(c_uint, @as(c_int, 136316960)), + @bitCast(c_uint, @as(c_int, 1074036732)), + @bitCast(c_uint, @as(c_int, 2147243348)), + @bitCast(c_uint, @as(c_int, 1074025812)), + @bitCast(c_uint, @as(c_int, 2147237892)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 537149436)), + @bitCast(c_uint, @as(c_int, 1073487876)), + @bitCast(c_uint, @as(c_int, 331878408)), + @bitCast(c_uint, @as(c_int, 268964808)), + @bitCast(c_uint, @as(c_int, 268963848)), + @bitCast(c_uint, @as(c_int, 536350728)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 1073905662)), + @bitCast(c_uint, @as(c_int, 1610244090)), + @bitCast(c_uint, @as(c_int, 1610244090)), + @bitCast(c_uint, @as(c_int, 1073897466)), + @bitCast(c_uint, @as(c_int, 62947326)), + @bitCast(c_uint, @as(c_int, 536354808)), + 0, + @bitCast(c_uint, @as(c_int, 267386880)), + @bitCast(c_uint, @as(c_int, 1811841022)), + @bitCast(c_uint, @as(c_int, 2147385342)), + @bitCast(c_uint, @as(c_int, 1746305022)), + @bitCast(c_uint, @as(c_int, 135292950)), + @bitCast(c_uint, @as(c_int, 135268368)), + @bitCast(c_uint, @as(c_int, 267388944)), + 0, + @bitCast(c_uint, @as(c_int, 1073217536)), + 4294844424, + 2265612290, + 2420803722, + 2420805706, + 2265614474, + 4294868994, + 0, + @bitCast(c_uint, @as(c_int, 264241152)), + 4244507864, + 2147680254, + 2218951554, + 2218951746, + 2147648386, + 4294868994, + 0, + 0, + @bitCast(c_uint, @as(c_int, 37749120)), + @bitCast(c_uint, @as(c_int, 135267360)), + @bitCast(c_uint, @as(c_int, 537137160)), + @bitCast(c_uint, @as(c_int, 600055812)), + @bitCast(c_uint, @as(c_int, 574890564)), + @bitCast(c_uint, @as(c_int, 1073488452)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 477102080)), + @bitCast(c_uint, @as(c_int, 1073233656)), + @bitCast(c_uint, @as(c_int, 1073233912)), + @bitCast(c_uint, @as(c_int, 266346480)), + @bitCast(c_uint, @as(c_int, 58722240)), + @bitCast(c_uint, @as(c_int, 256)), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2147483648, + 3758145536, + 0, + @bitCast(c_uint, @as(c_int, 335551488)), + @bitCast(c_uint, @as(c_int, 364909568)), + @bitCast(c_uint, @as(c_int, 356521280)), + @bitCast(c_uint, @as(c_int, 358356288)), + @bitCast(c_uint, @as(c_int, 357832020)), + @bitCast(c_uint, @as(c_int, 500962644)), + 0, + 0, + @bitCast(c_uint, @as(c_int, 50332416)), + @bitCast(c_uint, @as(c_int, 452991744)), + @bitCast(c_uint, @as(c_int, 459283296)), + @bitCast(c_uint, @as(c_int, 460069728)), + @bitCast(c_uint, @as(c_int, 460069740)), + @bitCast(c_uint, @as(c_int, 460069740)), + 0, + 0, + 0, + @bitCast(c_uint, @as(c_int, 1077837822)), + @bitCast(c_uint, @as(c_int, 2147369022)), + @bitCast(c_uint, @as(c_int, 2147352576)), + @bitCast(c_uint, @as(c_int, 1140737022)), + @bitCast(c_uint, @as(c_int, 32766)), + 0, + @bitCast(c_uint, @as(c_int, 2147221504)), + @bitCast(c_uint, @as(c_int, 1132740612)), + @bitCast(c_uint, @as(c_int, 1132741252)), + @bitCast(c_uint, @as(c_int, 1132740612)), + @bitCast(c_uint, @as(c_int, 1115964036)), + @bitCast(c_uint, @as(c_int, 1115964036)), + @bitCast(c_uint, @as(c_int, 1074021252)), + @bitCast(c_uint, @as(c_int, 32764)), + @bitCast(c_uint, @as(c_int, 1073774592)), + @bitCast(c_uint, @as(c_int, 268443648)), + @bitCast(c_uint, @as(c_int, 67110912)), + @bitCast(c_uint, @as(c_int, 16777728)), + @bitCast(c_uint, @as(c_int, 4194432)), + @bitCast(c_uint, @as(c_int, 1048608)), + @bitCast(c_uint, @as(c_int, 262152)), + @bitCast(c_uint, @as(c_int, 65538)), + 0, + @bitCast(c_uint, @as(c_int, 535830512)), + @bitCast(c_uint, @as(c_int, 405805104)), + @bitCast(c_uint, @as(c_int, 520099888)), + @bitCast(c_uint, @as(c_int, 50339584)), + @bitCast(c_uint, @as(c_int, 768)), + @bitCast(c_uint, @as(c_int, 50332416)), + 0, + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 716977488)), + @bitCast(c_uint, @as(c_int, 715928916)), + @bitCast(c_uint, @as(c_int, 715928916)), + @bitCast(c_uint, @as(c_int, 715928916)), + @bitCast(c_uint, @as(c_int, 715928916)), + @bitCast(c_uint, @as(c_int, 715928916)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 1072693248)), + @bitCast(c_uint, @as(c_int, 538714128)), + @bitCast(c_uint, @as(c_int, 574890372)), + @bitCast(c_uint, @as(c_int, 672408612)), + @bitCast(c_uint, @as(c_int, 697575444)), + @bitCast(c_uint, @as(c_int, 804530580)), + @bitCast(c_uint, @as(c_int, 537141252)), + @bitCast(c_uint, @as(c_int, 16380)), + @bitCast(c_uint, @as(c_int, 134086656)), + @bitCast(c_uint, @as(c_int, 67240962)), + @bitCast(c_uint, @as(c_int, 2145518594)), + @bitCast(c_uint, @as(c_int, 1143096354)), + @bitCast(c_uint, @as(c_int, 1143096354)), + @bitCast(c_uint, @as(c_int, 1075857406)), + @bitCast(c_uint, @as(c_int, 1075855392)), + @bitCast(c_uint, @as(c_int, 32736)), + @bitCast(c_uint, @as(c_int, 134086656)), + @bitCast(c_uint, @as(c_int, 67240962)), + @bitCast(c_uint, @as(c_int, 2080506882)), + @bitCast(c_uint, @as(c_int, 1140999170)), + @bitCast(c_uint, @as(c_int, 1140999170)), + @bitCast(c_uint, @as(c_int, 1075857406)), + @bitCast(c_uint, @as(c_int, 1075855392)), + @bitCast(c_uint, @as(c_int, 32736)), + 0, + @bitCast(c_uint, @as(c_int, 1073905662)), + @bitCast(c_uint, @as(c_int, 2147368962)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 1073889282)), + @bitCast(c_uint, @as(c_int, 2147368962)), + 0, + @bitCast(c_uint, @as(c_int, 152043520)), + @bitCast(c_uint, @as(c_int, 166725904)), + @bitCast(c_uint, @as(c_int, 152045840)), + @bitCast(c_uint, @as(c_int, 2320)), + @bitCast(c_uint, @as(c_int, 614627230)), + @bitCast(c_uint, @as(c_int, 664937634)), + @bitCast(c_uint, @as(c_int, 1889411234)), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; +pub const BORDER: c_int = 0; +pub const BASE: c_int = 1; +pub const TEXT: c_int = 2; +pub const OTHER: c_int = 3; +pub const GuiPropertyElement = c_uint; +pub var guiState: GuiControlState = @bitCast(c_uint, GUI_STATE_NORMAL); +pub var guiFont: Font = Font{ + .baseSize = @as(c_int, 0), + .glyphCount = 0, + .glyphPadding = 0, + .texture = @import("std").mem.zeroes(struct_Texture), + .recs = null, + .glyphs = null, +}; +pub var guiLocked: bool = @as(c_int, 0) != 0; +pub var guiAlpha: f32 = 1.0; +pub var guiStyle: [384]c_uint = [1]c_uint{ + 0, +} ++ [1]c_uint{0} ** 383; +pub var guiStyleLoaded: bool = @as(c_int, 0) != 0; +pub fn GetTextWidth(arg_text: [*c]const u8) callconv(.C) c_int { + var text = arg_text; + var size: Vector2 = Vector2{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + }; + if ((text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) and (@bitCast(c_int, @as(c_uint, text[@intCast(c_uint, @as(c_int, 0))])) != @as(c_int, '\x00'))) { + size = MeasureTextEx(guiFont, text, @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SPACING))); + } + return @floatToInt(c_int, size.x); +} +pub fn GetTextBounds(arg_control: c_int, arg_bounds: Rectangle) callconv(.C) Rectangle { + var control = arg_control; + var bounds = arg_bounds; + var textBounds: Rectangle = bounds; + textBounds.x = bounds.x + @intToFloat(f32, GuiGetStyle(control, BORDER_WIDTH)); + textBounds.y = bounds.y + @intToFloat(f32, GuiGetStyle(control, BORDER_WIDTH)); + textBounds.width = bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(control, BORDER_WIDTH)); + textBounds.height = bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(control, BORDER_WIDTH)); + while (true) { + switch (control) { + @as(c_int, 7) => { + bounds.width -= @intToFloat(f32, GuiGetStyle(control, COMBO_BUTTON_WIDTH) + GuiGetStyle(control, COMBO_BUTTON_PADDING)); + break; + }, + @as(c_int, 10) => break, + else => { + { + if (GuiGetStyle(control, TEXT_ALIGNMENT) == GUI_TEXT_ALIGN_RIGHT) { + textBounds.x -= @intToFloat(f32, GuiGetStyle(control, TEXT_PADDING)); + } else { + textBounds.x += @intToFloat(f32, GuiGetStyle(control, TEXT_PADDING)); + } + } + break; + }, + } + break; + } + return textBounds; +} +pub fn GetTextIcon(arg_text: [*c]const u8, arg_iconId: [*c]c_int) callconv(.C) [*c]const u8 { + var text = arg_text; + var iconId = arg_iconId; + iconId.* = -@as(c_int, 1); + if (@bitCast(c_int, @as(c_uint, text[@intCast(c_uint, @as(c_int, 0))])) == @as(c_int, '#')) { + var iconValue: [4]u8 = [1]u8{ + 0, + } ++ [1]u8{0} ** 3; + var pos: c_int = 1; + while (((pos < @as(c_int, 4)) and (@bitCast(c_int, @as(c_uint, (blk: { + const tmp = pos; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) >= @as(c_int, '0'))) and (@bitCast(c_int, @as(c_uint, (blk: { + const tmp = pos; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) <= @as(c_int, '9'))) { + iconValue[@intCast(c_uint, pos - @as(c_int, 1))] = (blk: { + const tmp = pos; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + pos += 1; + } + if (@bitCast(c_int, @as(c_uint, (blk: { + const tmp = pos; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*)) == @as(c_int, '#')) { + iconId.* = TextToInteger(@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &iconValue))); + if (iconId.* >= @as(c_int, 0)) { + text += @bitCast(usize, @intCast(isize, pos + @as(c_int, 1))); + } + } + } + return text; +} +pub fn GuiDrawText(arg_text: [*c]const u8, arg_bounds: Rectangle, arg_alignment: c_int, arg_tint: Color) callconv(.C) void { + var text = arg_text; + var bounds = arg_bounds; + var alignment = arg_alignment; + var tint = arg_tint; + if ((text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) and (@bitCast(c_int, @as(c_uint, text[@intCast(c_uint, @as(c_int, 0))])) != @as(c_int, '\x00'))) { + var iconId: c_int = 0; + text = GetTextIcon(text, &iconId); + var position: Vector2 = Vector2{ + .x = bounds.x, + .y = bounds.y, + }; + var textWidth: c_int = GetTextWidth(text); + var textHeight: c_int = GuiGetStyle(DEFAULT, TEXT_SIZE); + if (iconId >= @as(c_int, 0)) { + textWidth += @as(c_int, 16); + if ((text != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) and (@bitCast(c_int, @as(c_uint, text[@intCast(c_uint, @as(c_int, 0))])) != @as(c_int, '\x00'))) { + textWidth += @as(c_int, 4); + } + } + while (true) { + switch (alignment) { + @as(c_int, 0) => { + { + position.x = bounds.x; + position.y = ((bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(textHeight, @as(c_int, 2)))) + @intToFloat(f32, @import("std").zig.c_translation.signedRemainder(@floatToInt(c_int, bounds.height), @as(c_int, 2))); + } + break; + }, + @as(c_int, 1) => { + { + position.x = (bounds.x + (bounds.width / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(textWidth, @as(c_int, 2))); + position.y = ((bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(textHeight, @as(c_int, 2)))) + @intToFloat(f32, @import("std").zig.c_translation.signedRemainder(@floatToInt(c_int, bounds.height), @as(c_int, 2))); + } + break; + }, + @as(c_int, 2) => { + { + position.x = (bounds.x + bounds.width) - @intToFloat(f32, textWidth); + position.y = ((bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(textHeight, @as(c_int, 2)))) + @intToFloat(f32, @import("std").zig.c_translation.signedRemainder(@floatToInt(c_int, bounds.height), @as(c_int, 2))); + } + break; + }, + else => break, + } + break; + } + position.x = @intToFloat(f32, @floatToInt(c_int, position.x)); + position.y = @intToFloat(f32, @floatToInt(c_int, position.y)); + if (iconId >= @as(c_int, 0)) { + GuiDrawIcon(iconId, @floatToInt(c_int, position.x), @floatToInt(c_int, ((bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(@as(c_int, 16), @as(c_int, 2)))) + @intToFloat(f32, @import("std").zig.c_translation.signedRemainder(@floatToInt(c_int, bounds.height), @as(c_int, 2)))), @as(c_int, 1), tint); + position.x += @intToFloat(f32, @as(c_int, 16) + @as(c_int, 4)); + } + DrawTextEx(guiFont, text, position, @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)), @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SPACING)), tint); + } +} +pub fn GuiDrawRectangle(arg_rec: Rectangle, arg_borderWidth: c_int, arg_borderColor: Color, arg_color: Color) callconv(.C) void { + var rec = arg_rec; + var borderWidth = arg_borderWidth; + var borderColor = arg_borderColor; + var color = arg_color; + if (@bitCast(c_int, @as(c_uint, color.a)) > @as(c_int, 0)) { + DrawRectangle(@floatToInt(c_int, rec.x), @floatToInt(c_int, rec.y), @floatToInt(c_int, rec.width), @floatToInt(c_int, rec.height), color); + } + if (borderWidth > @as(c_int, 0)) { + DrawRectangle(@floatToInt(c_int, rec.x), @floatToInt(c_int, rec.y), @floatToInt(c_int, rec.width), borderWidth, borderColor); + DrawRectangle(@floatToInt(c_int, rec.x), @floatToInt(c_int, rec.y) + borderWidth, borderWidth, @floatToInt(c_int, rec.height) - (@as(c_int, 2) * borderWidth), borderColor); + DrawRectangle((@floatToInt(c_int, rec.x) + @floatToInt(c_int, rec.width)) - borderWidth, @floatToInt(c_int, rec.y) + borderWidth, borderWidth, @floatToInt(c_int, rec.height) - (@as(c_int, 2) * borderWidth), borderColor); + DrawRectangle(@floatToInt(c_int, rec.x), (@floatToInt(c_int, rec.y) + @floatToInt(c_int, rec.height)) - borderWidth, @floatToInt(c_int, rec.width), borderWidth, borderColor); + } +} +pub fn GuiTextSplit(arg_text: [*c]const u8, arg_count: [*c]c_int, arg_textRow: [*c]c_int) callconv(.C) [*c][*c]const u8 { + var text = arg_text; + var count = arg_count; + var textRow = arg_textRow; + const result = struct { + var static: [128][*c]const u8 = [1][*c]const u8{ + null, + } ++ [1][*c]const u8{null} ** 127; + }; + const buffer = struct { + var static: [1024]u8 = [1]u8{ + 0, + } ++ [1]u8{0} ** 1023; + }; + _ = memset(@ptrCast(?*anyopaque, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer.static))), @as(c_int, 0), @bitCast(c_ulong, @as(c_long, @as(c_int, 1024)))); + result.static[@intCast(c_uint, @as(c_int, 0))] = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer.static)); + var counter: c_int = 1; + if (textRow != @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + textRow[@intCast(c_uint, @as(c_int, 0))] = 0; + } + { + var i: c_int = 0; + while (i < @as(c_int, 1024)) : (i += 1) { + buffer.static[@intCast(c_uint, i)] = (blk: { + const tmp = i; + if (tmp >= 0) break :blk text + @intCast(usize, tmp) else break :blk text - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + if (@bitCast(c_int, @as(c_uint, buffer.static[@intCast(c_uint, i)])) == @as(c_int, '\x00')) break else if ((@bitCast(c_int, @as(c_uint, buffer.static[@intCast(c_uint, i)])) == @as(c_int, ';')) or (@bitCast(c_int, @as(c_uint, buffer.static[@intCast(c_uint, i)])) == @as(c_int, '\n'))) { + result.static[@intCast(c_uint, counter)] = (@ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &buffer.static)) + @bitCast(usize, @intCast(isize, i))) + @bitCast(usize, @intCast(isize, @as(c_int, 1))); + if (textRow != @ptrCast([*c]c_int, @alignCast(@import("std").meta.alignment(c_int), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + if (@bitCast(c_int, @as(c_uint, buffer.static[@intCast(c_uint, i)])) == @as(c_int, '\n')) { + (blk: { + const tmp = counter; + if (tmp >= 0) break :blk textRow + @intCast(usize, tmp) else break :blk textRow - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = (blk: { + const tmp = counter - @as(c_int, 1); + if (tmp >= 0) break :blk textRow + @intCast(usize, tmp) else break :blk textRow - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* + @as(c_int, 1); + } else { + (blk: { + const tmp = counter; + if (tmp >= 0) break :blk textRow + @intCast(usize, tmp) else break :blk textRow - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = (blk: { + const tmp = counter - @as(c_int, 1); + if (tmp >= 0) break :blk textRow + @intCast(usize, tmp) else break :blk textRow - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*; + } + } + buffer.static[@intCast(c_uint, i)] = '\x00'; + counter += 1; + if (counter == @as(c_int, 128)) break; + } + } + } + count.* = counter; + return @ptrCast([*c][*c]const u8, @alignCast(@import("std").meta.alignment([*c]const u8), &result.static)); +} +pub fn ConvertHSVtoRGB(arg_hsv: Vector3) callconv(.C) Vector3 { + var hsv = arg_hsv; + var rgb: Vector3 = Vector3{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .z = 0, + }; + var hh: f32 = 0.0; + var p: f32 = 0.0; + var q: f32 = 0.0; + var t: f32 = 0.0; + var ff: f32 = 0.0; + var i: c_long = 0; + if (hsv.y <= 0.0) { + rgb.x = hsv.z; + rgb.y = hsv.z; + rgb.z = hsv.z; + return rgb; + } + hh = hsv.x; + if (hh >= 360.0) { + hh = 0.0; + } + hh /= 60.0; + i = @floatToInt(c_long, hh); + ff = hh - @intToFloat(f32, i); + p = hsv.z * (1.0 - hsv.y); + q = hsv.z * (1.0 - (hsv.y * ff)); + t = hsv.z * (1.0 - (hsv.y * (1.0 - ff))); + while (true) { + switch (i) { + @bitCast(c_long, @as(c_long, @as(c_int, 0))) => { + { + rgb.x = hsv.z; + rgb.y = t; + rgb.z = p; + } + break; + }, + @bitCast(c_long, @as(c_long, @as(c_int, 1))) => { + { + rgb.x = q; + rgb.y = hsv.z; + rgb.z = p; + } + break; + }, + @bitCast(c_long, @as(c_long, @as(c_int, 2))) => { + { + rgb.x = p; + rgb.y = hsv.z; + rgb.z = t; + } + break; + }, + @bitCast(c_long, @as(c_long, @as(c_int, 3))) => { + { + rgb.x = p; + rgb.y = q; + rgb.z = hsv.z; + } + break; + }, + @bitCast(c_long, @as(c_long, @as(c_int, 4))) => { + { + rgb.x = t; + rgb.y = p; + rgb.z = hsv.z; + } + break; + }, + else => { + { + rgb.x = hsv.z; + rgb.y = p; + rgb.z = q; + } + break; + }, + } + break; + } + return rgb; +} +pub fn ConvertRGBtoHSV(arg_rgb: Vector3) callconv(.C) Vector3 { + var rgb = arg_rgb; + var hsv: Vector3 = Vector3{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .z = 0, + }; + var min: f32 = 0.0; + var max: f32 = 0.0; + var delta: f32 = 0.0; + min = if (rgb.x < rgb.y) rgb.x else rgb.y; + min = if (min < rgb.z) min else rgb.z; + max = if (rgb.x > rgb.y) rgb.x else rgb.y; + max = if (max > rgb.z) max else rgb.z; + hsv.z = max; + delta = max - min; + if (delta < 0.000009999999747378752) { + hsv.y = 0.0; + hsv.x = 0.0; + return hsv; + } + if (max > 0.0) { + hsv.y = delta / max; + } else { + hsv.y = 0.0; + hsv.x = 0.0; + return hsv; + } + if (rgb.x >= max) { + hsv.x = (rgb.y - rgb.z) / delta; + } else { + if (rgb.y >= max) { + hsv.x = 2.0 + ((rgb.z - rgb.x) / delta); + } else { + hsv.x = 4.0 + ((rgb.x - rgb.y) / delta); + } + } + hsv.x *= 60.0; + if (hsv.x < 0.0) { + hsv.x += 360.0; + } + return hsv; +} +pub export fn GuiSliderPro(arg_bounds: Rectangle, arg_textLeft: [*c]const u8, arg_textRight: [*c]const u8, arg_value: f32, arg_minValue: f32, arg_maxValue: f32, arg_sliderWidth: c_int) f32 { + var bounds = arg_bounds; + var textLeft = arg_textLeft; + var textRight = arg_textRight; + var value = arg_value; + var minValue = arg_minValue; + var maxValue = arg_maxValue; + var sliderWidth = arg_sliderWidth; + var state: GuiControlState = guiState; + var sliderValue: c_int = @floatToInt(c_int, ((value - minValue) / (maxValue - minValue)) * (bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SLIDER, BORDER_WIDTH)))); + var slider: Rectangle = Rectangle{ + .x = bounds.x, + .y = (bounds.y + @intToFloat(f32, GuiGetStyle(SLIDER, BORDER_WIDTH))) + @intToFloat(f32, GuiGetStyle(SLIDER, SLIDER_PADDING)), + .width = @intToFloat(f32, @as(c_int, 0)), + .height = (bounds.height - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SLIDER, BORDER_WIDTH))) - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SLIDER, SLIDER_PADDING)), + }; + if (sliderWidth > @as(c_int, 0)) { + slider.x += @intToFloat(f32, sliderValue - @divTrunc(sliderWidth, @as(c_int, 2))); + slider.width = @intToFloat(f32, sliderWidth); + } else if (sliderWidth == @as(c_int, 0)) { + slider.x += @intToFloat(f32, GuiGetStyle(SLIDER, BORDER_WIDTH)); + slider.width = @intToFloat(f32, sliderValue); + } + if ((state != @bitCast(c_uint, GUI_STATE_DISABLED)) and !guiLocked) { + var mousePoint: Vector2 = GetMousePosition(); + if (CheckCollisionPointRec(mousePoint, bounds)) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + state = @bitCast(c_uint, GUI_STATE_PRESSED); + value = (((maxValue - minValue) * (mousePoint.x - (bounds.x + @intToFloat(f32, @divTrunc(sliderWidth, @as(c_int, 2)))))) / (bounds.width - @intToFloat(f32, sliderWidth))) + minValue; + if (sliderWidth > @as(c_int, 0)) { + slider.x = mousePoint.x - (slider.width / @intToFloat(f32, @as(c_int, 2))); + } else if (sliderWidth == @as(c_int, 0)) { + slider.width = @intToFloat(f32, sliderValue); + } + } else { + state = @bitCast(c_uint, GUI_STATE_FOCUSED); + } + } + if (value > maxValue) { + value = maxValue; + } else if (value < minValue) { + value = minValue; + } + } + if (sliderWidth > @as(c_int, 0)) { + if (slider.x <= (bounds.x + @intToFloat(f32, GuiGetStyle(SLIDER, BORDER_WIDTH)))) { + slider.x = bounds.x + @intToFloat(f32, GuiGetStyle(SLIDER, BORDER_WIDTH)); + } else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) { + slider.x = ((bounds.x + bounds.width) - slider.width) - @intToFloat(f32, GuiGetStyle(SLIDER, BORDER_WIDTH)); + } + } else if (sliderWidth == @as(c_int, 0)) { + if (slider.width > bounds.width) { + slider.width = bounds.width - @intToFloat(f32, @as(c_int, 2) * GuiGetStyle(SLIDER, BORDER_WIDTH)); + } + } + GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, @bitCast(c_int, @bitCast(c_uint, BORDER) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha), Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, if (state != @bitCast(c_uint, GUI_STATE_DISABLED)) BASE_COLOR_NORMAL else BASE_COLOR_DISABLED))), guiAlpha)); + if ((state == @bitCast(c_uint, GUI_STATE_NORMAL)) or (state == @bitCast(c_uint, GUI_STATE_PRESSED))) { + GuiDrawRectangle(slider, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))), guiAlpha)); + } else if (state == @bitCast(c_uint, GUI_STATE_FOCUSED)) { + GuiDrawRectangle(slider, @as(c_int, 0), Color{ + .r = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .g = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .b = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + .a = @bitCast(u8, @truncate(i8, @as(c_int, 0))), + }, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED))), guiAlpha)); + } + if (textLeft != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBounds.width = @intToFloat(f32, GetTextWidth(textLeft)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x - textBounds.width) - @intToFloat(f32, GuiGetStyle(SLIDER, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + GuiDrawText(textLeft, textBounds, GUI_TEXT_ALIGN_RIGHT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + if (textRight != @ptrCast([*c]const u8, @alignCast(@import("std").meta.alignment(u8), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var textBounds: Rectangle = Rectangle{ + .x = @intToFloat(f32, @as(c_int, 0)), + .y = 0, + .width = 0, + .height = 0, + }; + textBounds.width = @intToFloat(f32, GetTextWidth(textRight)); + textBounds.height = @intToFloat(f32, GuiGetStyle(DEFAULT, TEXT_SIZE)); + textBounds.x = (bounds.x + bounds.width) + @intToFloat(f32, GuiGetStyle(SLIDER, TEXT_PADDING)); + textBounds.y = (bounds.y + (bounds.height / @intToFloat(f32, @as(c_int, 2)))) - @intToFloat(f32, @divTrunc(GuiGetStyle(DEFAULT, TEXT_SIZE), @as(c_int, 2))); + GuiDrawText(textRight, textBounds, GUI_TEXT_ALIGN_LEFT, Fade(GetColor(@bitCast(c_uint, GuiGetStyle(SLIDER, @bitCast(c_int, @bitCast(c_uint, TEXT) +% (state *% @bitCast(c_uint, @as(c_int, 3))))))), guiAlpha)); + } + return value; +} +pub export fn GuiLoadIcons(arg_fileName: [*c]const u8, arg_loadIconsName: bool) [*c][*c]u8 { + var fileName = arg_fileName; + var loadIconsName = arg_loadIconsName; + var rgiFile: [*c]FILE = fopen(fileName, "rb"); + var guiIconsName: [*c][*c]u8 = null; + if (rgiFile != @ptrCast([*c]FILE, @alignCast(@import("std").meta.alignment(FILE), @intToPtr(?*anyopaque, @as(c_int, 0))))) { + var signature: [5]u8 = [1]u8{0} ** 5; + var version: c_short = 0; + var reserved: c_short = 0; + var iconCount: c_short = 0; + var iconSize: c_short = 0; + _ = fread(@ptrCast(?*anyopaque, @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), &signature))), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @bitCast(c_ulong, @as(c_long, @as(c_int, 4))), rgiFile); + _ = fread(@ptrCast(?*anyopaque, &version), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgiFile); + _ = fread(@ptrCast(?*anyopaque, &reserved), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgiFile); + _ = fread(@ptrCast(?*anyopaque, &iconCount), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgiFile); + _ = fread(@ptrCast(?*anyopaque, &iconSize), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), @sizeOf(c_short), rgiFile); + if ((((@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 0))])) == @as(c_int, 'r')) and (@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 1))])) == @as(c_int, 'G'))) and (@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 2))])) == @as(c_int, 'I'))) and (@bitCast(c_int, @as(c_uint, signature[@intCast(c_uint, @as(c_int, 3))])) == @as(c_int, ' '))) { + if (loadIconsName) { + //guiIconsName = @ptrCast([*c][*c]u8, @alignCast(@import("std").meta.alignment([*c]u8), malloc(@bitCast(c_ulong, @as(c_long, iconCount)) *% @sizeOf([*c][*c]u8)))); + { + var i: c_int = 0; + while (i < @bitCast(c_int, @as(c_int, iconCount))) : (i += 1) { + (blk: { + const tmp = i; + if (tmp >= 0) break :blk guiIconsName + @intCast(usize, tmp) else break :blk guiIconsName - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).* = @ptrCast([*c]u8, @alignCast(@import("std").meta.alignment(u8), malloc(@bitCast(c_ulong, @as(c_long, @as(c_int, 32)))))); + _ = fread(@ptrCast(?*anyopaque, (blk: { + const tmp = i; + if (tmp >= 0) break :blk guiIconsName + @intCast(usize, tmp) else break :blk guiIconsName - ~@bitCast(usize, @intCast(isize, tmp) +% -1); + }).*), @bitCast(c_ulong, @as(c_long, @as(c_int, 32))), @bitCast(c_ulong, @as(c_long, @as(c_int, 1))), rgiFile); + } + } + } else { + _ = fseek(rgiFile, @bitCast(c_long, @as(c_long, @bitCast(c_int, @as(c_int, iconCount)) * @as(c_int, 32))), @as(c_int, 1)); + } + _ = fread(@ptrCast(?*anyopaque, @ptrCast([*c]c_uint, @alignCast(@import("std").meta.alignment(c_uint), &guiIcons))), @bitCast(c_ulong, @as(c_long, @bitCast(c_int, @as(c_int, iconCount)) * @divTrunc(@bitCast(c_int, @as(c_int, iconSize)) * @bitCast(c_int, @as(c_int, iconSize)), @as(c_int, 32)))), @sizeOf(c_uint), rgiFile); + } + _ = fclose(rgiFile); + } + return guiIconsName; +} +pub const __INTMAX_C_SUFFIX__ = @compileError("unable to translate macro: undefined identifier `L`"); // (no file):67:9 +pub const __UINTMAX_C_SUFFIX__ = @compileError("unable to translate macro: undefined identifier `UL`"); // (no file):73:9 +pub const __INT64_C_SUFFIX__ = @compileError("unable to translate macro: undefined identifier `L`"); // (no file):164:9 +pub const __UINT32_C_SUFFIX__ = @compileError("unable to translate macro: undefined identifier `U`"); // (no file):186:9 +pub const __UINT64_C_SUFFIX__ = @compileError("unable to translate macro: undefined identifier `UL`"); // (no file):194:9 +pub const __seg_gs = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // (no file):315:9 +pub const __seg_fs = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // (no file):316:9 +pub const va_start = @compileError("unable to translate macro: undefined identifier `__builtin_va_start`"); // /home/tradam/.asdf/installs/zig/master/lib/include/stdarg.h:17:9 +pub const va_end = @compileError("unable to translate macro: undefined identifier `__builtin_va_end`"); // /home/tradam/.asdf/installs/zig/master/lib/include/stdarg.h:18:9 +pub const va_arg = @compileError("unable to translate macro: undefined identifier `__builtin_va_arg`"); // /home/tradam/.asdf/installs/zig/master/lib/include/stdarg.h:19:9 +pub const __va_copy = @compileError("unable to translate macro: undefined identifier `__builtin_va_copy`"); // /home/tradam/.asdf/installs/zig/master/lib/include/stdarg.h:24:9 +pub const va_copy = @compileError("unable to translate macro: undefined identifier `__builtin_va_copy`"); // /home/tradam/.asdf/installs/zig/master/lib/include/stdarg.h:27:9 +pub const TRACELOG = @compileError("unable to translate C expr: expected ')' instead got '...'"); // raygui.h:222:9 +pub const __GLIBC_USE = @compileError("unable to translate macro: undefined identifier `__GLIBC_USE_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/features.h:186:9 +pub const __glibc_has_attribute = @compileError("unable to translate macro: undefined identifier `__has_attribute`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:44:10 +pub const __glibc_has_extension = @compileError("unable to translate macro: undefined identifier `__has_extension`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:54:10 +pub const __THROW = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:78:11 +pub const __THROWNL = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:79:11 +pub const __NTH = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:80:11 +pub const __NTHNL = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:81:11 +pub const __CONCAT = @compileError("unable to translate C expr: unexpected token '##'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:123:9 +pub const __STRING = @compileError("unable to translate C expr: unexpected token '#'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:124:9 +pub const __warnattr = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:158:10 +pub const __errordecl = @compileError("unable to translate C expr: unexpected token 'extern'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:159:10 +pub const __flexarr = @compileError("unable to translate C expr: unexpected token '['"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:167:10 +pub const __REDIRECT = @compileError("unable to translate macro: undefined identifier `__asm__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:198:10 +pub const __REDIRECT_NTH = @compileError("unable to translate macro: undefined identifier `__asm__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:205:11 +pub const __REDIRECT_NTHNL = @compileError("unable to translate macro: undefined identifier `__asm__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:207:11 +pub const __ASMNAME2 = @compileError("unable to translate C expr: unexpected token 'Identifier'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:211:10 +pub const __attribute_malloc__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:232:10 +pub const __attribute_alloc_size__ = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:243:10 +pub const __attribute_pure__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:250:10 +pub const __attribute_const__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:257:10 +pub const __attribute_maybe_unused__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:263:10 +pub const __attribute_used__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:272:10 +pub const __attribute_noinline__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:273:10 +pub const __attribute_deprecated__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:281:10 +pub const __attribute_deprecated_msg__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:291:10 +pub const __attribute_format_arg__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:304:10 +pub const __attribute_format_strfmon__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:314:10 +pub const __nonnull = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:324:11 +pub const __returns_nonnull = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:337:10 +pub const __attribute_warn_unused_result__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:346:10 +pub const __always_inline = @compileError("unable to translate macro: undefined identifier `__inline`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:364:10 +pub const __attribute_artificial__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:373:10 +pub const __extern_inline = @compileError("unable to translate macro: undefined identifier `__inline`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:391:11 +pub const __extern_always_inline = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:392:11 +pub const __restrict_arr = @compileError("unable to translate macro: undefined identifier `__restrict`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:435:10 +pub const __attribute_copy__ = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:484:10 +pub const __LDBL_REDIR2_DECL = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:560:10 +pub const __LDBL_REDIR_DECL = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:561:10 +pub const __glibc_macro_warning1 = @compileError("unable to translate macro: undefined identifier `_Pragma`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:575:10 +pub const __glibc_macro_warning = @compileError("unable to translate macro: undefined identifier `GCC`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:576:10 +pub const __attr_access = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:612:11 +pub const __attr_access_none = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:613:11 +pub const __attr_dealloc = @compileError("unable to translate C expr: unexpected token 'Eof'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:623:10 +pub const __attribute_returns_twice__ = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/sys/cdefs.h:630:10 +pub const __STD_TYPE = @compileError("unable to translate C expr: unexpected token 'typedef'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/types.h:137:10 +pub const __FSID_T_TYPE = @compileError("unable to translate macro: undefined identifier `__val`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/x86_64-linux-gnu/bits/typesizes.h:73:9 +pub const __getc_unlocked_body = @compileError("TODO postfix inc/dec expr"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/types/struct_FILE.h:102:9 +pub const __putc_unlocked_body = @compileError("TODO postfix inc/dec expr"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/types/struct_FILE.h:106:9 +pub const __f32 = @compileError("unable to translate macro: undefined identifier `f`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:91:12 +pub const __f64x = @compileError("unable to translate macro: undefined identifier `l`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:120:13 +pub const __CFLOAT32 = @compileError("unable to translate: TODO _Complex"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:149:12 +pub const __CFLOAT64 = @compileError("unable to translate: TODO _Complex"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:160:13 +pub const __CFLOAT32X = @compileError("unable to translate: TODO _Complex"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:169:12 +pub const __CFLOAT64X = @compileError("unable to translate: TODO _Complex"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:178:13 +pub const __builtin_nansf32 = @compileError("unable to translate macro: undefined identifier `__builtin_nansf`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:221:12 +pub const __builtin_huge_valf64 = @compileError("unable to translate macro: undefined identifier `__builtin_huge_val`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:255:13 +pub const __builtin_inff64 = @compileError("unable to translate macro: undefined identifier `__builtin_inf`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:256:13 +pub const __builtin_nanf64 = @compileError("unable to translate macro: undefined identifier `__builtin_nan`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:257:13 +pub const __builtin_nansf64 = @compileError("unable to translate macro: undefined identifier `__builtin_nans`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:258:13 +pub const __builtin_huge_valf32x = @compileError("unable to translate macro: undefined identifier `__builtin_huge_val`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:272:12 +pub const __builtin_inff32x = @compileError("unable to translate macro: undefined identifier `__builtin_inf`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:273:12 +pub const __builtin_nanf32x = @compileError("unable to translate macro: undefined identifier `__builtin_nan`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:274:12 +pub const __builtin_nansf32x = @compileError("unable to translate macro: undefined identifier `__builtin_nans`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:275:12 +pub const __builtin_huge_valf64x = @compileError("unable to translate macro: undefined identifier `__builtin_huge_vall`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:289:13 +pub const __builtin_inff64x = @compileError("unable to translate macro: undefined identifier `__builtin_infl`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:290:13 +pub const __builtin_nanf64x = @compileError("unable to translate macro: undefined identifier `__builtin_nanl`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:291:13 +pub const __builtin_nansf64x = @compileError("unable to translate macro: undefined identifier `__builtin_nansl`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/floatn-common.h:292:13 +pub const __FD_ZERO = @compileError("unable to translate macro: undefined identifier `__i`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/select.h:25:9 +pub const __FD_SET = @compileError("unable to translate C expr: expected ')' instead got '|='"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/select.h:32:9 +pub const __FD_CLR = @compileError("unable to translate C expr: expected ')' instead got '&='"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/select.h:34:9 +pub const __PTHREAD_MUTEX_INITIALIZER = @compileError("unable to translate C expr: unexpected token '{'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/x86_64-linux-gnu/bits/struct_mutex.h:56:10 +pub const __PTHREAD_RWLOCK_ELISION_EXTRA = @compileError("unable to translate C expr: unexpected token '{'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/x86_64-linux-gnu/bits/struct_rwlock.h:40:11 +pub const __ONCE_FLAG_INIT = @compileError("unable to translate C expr: unexpected token '{'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/bits/thread-shared-types.h:127:9 +pub const HUGE_VAL = @compileError("unable to translate macro: undefined identifier `__builtin_huge_val`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:48:10 +pub const HUGE_VALL = @compileError("unable to translate macro: undefined identifier `__builtin_huge_vall`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:60:11 +pub const __SIMD_DECL = @compileError("unable to translate macro: undefined identifier `__DECL_SIMD_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:276:9 +pub const __MATHCALL_VEC = @compileError("unable to translate C expr: unexpected token 'Identifier'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:278:9 +pub const __MATHDECL_VEC = @compileError("unable to translate C expr: unexpected token 'Identifier'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:282:9 +pub const __MATHDECL = @compileError("unable to translate macro: undefined identifier `__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:288:9 +pub const __MATHDECLX = @compileError("unable to translate macro: undefined identifier `__attribute__`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:293:9 +pub const __MATHDECL_1_IMPL = @compileError("unable to translate C expr: unexpected token 'extern'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:296:9 +pub const __MATHREDIR = @compileError("unable to translate C expr: unexpected token 'extern'"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:305:9 +pub const __MATHCALL_NARROW_ARGS_1 = @compileError("unable to translate macro: undefined identifier `_Marg_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:550:9 +pub const __MATHCALL_NARROW_ARGS_2 = @compileError("unable to translate macro: undefined identifier `_Marg_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:551:9 +pub const __MATHCALL_NARROW_ARGS_3 = @compileError("unable to translate macro: undefined identifier `_Marg_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:552:9 +pub const __MATHCALL_NARROW_NORMAL = @compileError("unable to translate macro: undefined identifier `_Mret_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:553:9 +pub const __MATHCALL_NARROW_REDIR = @compileError("unable to translate macro: undefined identifier `_Mret_`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:555:9 +pub const __MATH_TG = @compileError("unable to translate macro: undefined identifier `f`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:916:10 +pub const fpclassify = @compileError("unable to translate macro: undefined identifier `__builtin_fpclassify`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:961:11 +pub const isfinite = @compileError("unable to translate macro: undefined identifier `__builtin_isfinite`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:988:11 +pub const isnormal = @compileError("unable to translate macro: undefined identifier `__builtin_isnormal`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:996:11 +pub const isgreater = @compileError("unable to translate macro: undefined identifier `__builtin_isgreater`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:1282:11 +pub const isgreaterequal = @compileError("unable to translate macro: undefined identifier `__builtin_isgreaterequal`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:1283:11 +pub const isless = @compileError("unable to translate macro: undefined identifier `__builtin_isless`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:1284:11 +pub const islessequal = @compileError("unable to translate macro: undefined identifier `__builtin_islessequal`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:1285:11 +pub const islessgreater = @compileError("unable to translate macro: undefined identifier `__builtin_islessgreater`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:1286:11 +pub const isunordered = @compileError("unable to translate macro: undefined identifier `__builtin_isunordered`"); // /home/tradam/.asdf/installs/zig/master/lib/libc/include/generic-glibc/math.h:1287:11 +pub const BIT_SET = @compileError("unable to translate C expr: expected ')' instead got '|='"); // raygui.h:3698:13 +pub const BIT_CLEAR = @compileError("unable to translate C expr: expected ')' instead got '&='"); // raygui.h:3708:13 +pub const __llvm__ = @as(c_int, 1); +pub const __clang__ = @as(c_int, 1); +pub const __clang_major__ = @as(c_int, 13); +pub const __clang_minor__ = @as(c_int, 0); +pub const __clang_patchlevel__ = @as(c_int, 1); +pub const __clang_version__ = "13.0.1 ([email protected]:ziglang/zig-bootstrap.git 81f0e6c5b902ead84753490db4f0007d08df964a)"; +pub const __GNUC__ = @as(c_int, 4); +pub const __GNUC_MINOR__ = @as(c_int, 2); +pub const __GNUC_PATCHLEVEL__ = @as(c_int, 1); +pub const __GXX_ABI_VERSION = @as(c_int, 1002); +pub const __ATOMIC_RELAXED = @as(c_int, 0); +pub const __ATOMIC_CONSUME = @as(c_int, 1); +pub const __ATOMIC_ACQUIRE = @as(c_int, 2); +pub const __ATOMIC_RELEASE = @as(c_int, 3); +pub const __ATOMIC_ACQ_REL = @as(c_int, 4); +pub const __ATOMIC_SEQ_CST = @as(c_int, 5); +pub const __OPENCL_MEMORY_SCOPE_WORK_ITEM = @as(c_int, 0); +pub const __OPENCL_MEMORY_SCOPE_WORK_GROUP = @as(c_int, 1); +pub const __OPENCL_MEMORY_SCOPE_DEVICE = @as(c_int, 2); +pub const __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES = @as(c_int, 3); +pub const __OPENCL_MEMORY_SCOPE_SUB_GROUP = @as(c_int, 4); +pub const __PRAGMA_REDEFINE_EXTNAME = @as(c_int, 1); +pub const __VERSION__ = "Clang 13.0.1 ([email protected]:ziglang/zig-bootstrap.git 81f0e6c5b902ead84753490db4f0007d08df964a)"; +pub const __OBJC_BOOL_IS_BOOL = @as(c_int, 0); +pub const __CONSTANT_CFSTRINGS__ = @as(c_int, 1); +pub const __clang_literal_encoding__ = "UTF-8"; +pub const __clang_wide_literal_encoding__ = "UTF-32"; +pub const __OPTIMIZE__ = @as(c_int, 1); +pub const __ORDER_LITTLE_ENDIAN__ = @as(c_int, 1234); +pub const __ORDER_BIG_ENDIAN__ = @as(c_int, 4321); +pub const __ORDER_PDP_ENDIAN__ = @as(c_int, 3412); +pub const __BYTE_ORDER__ = __ORDER_LITTLE_ENDIAN__; +pub const __LITTLE_ENDIAN__ = @as(c_int, 1); +pub const _LP64 = @as(c_int, 1); +pub const __LP64__ = @as(c_int, 1); +pub const __CHAR_BIT__ = @as(c_int, 8); +pub const __SCHAR_MAX__ = @as(c_int, 127); +pub const __SHRT_MAX__ = @as(c_int, 32767); +pub const __INT_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const __LONG_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __LONG_LONG_MAX__ = @as(c_longlong, 9223372036854775807); +pub const __WCHAR_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const __WINT_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_uint, 4294967295, .decimal); +pub const __INTMAX_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __SIZE_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_ulong, 18446744073709551615, .decimal); +pub const __UINTMAX_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_ulong, 18446744073709551615, .decimal); +pub const __PTRDIFF_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __INTPTR_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __UINTPTR_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_ulong, 18446744073709551615, .decimal); +pub const __SIZEOF_DOUBLE__ = @as(c_int, 8); +pub const __SIZEOF_FLOAT__ = @as(c_int, 4); +pub const __SIZEOF_INT__ = @as(c_int, 4); +pub const __SIZEOF_LONG__ = @as(c_int, 8); +pub const __SIZEOF_LONG_DOUBLE__ = @as(c_int, 16); +pub const __SIZEOF_LONG_LONG__ = @as(c_int, 8); +pub const __SIZEOF_POINTER__ = @as(c_int, 8); +pub const __SIZEOF_SHORT__ = @as(c_int, 2); +pub const __SIZEOF_PTRDIFF_T__ = @as(c_int, 8); +pub const __SIZEOF_SIZE_T__ = @as(c_int, 8); +pub const __SIZEOF_WCHAR_T__ = @as(c_int, 4); +pub const __SIZEOF_WINT_T__ = @as(c_int, 4); +pub const __SIZEOF_INT128__ = @as(c_int, 16); +pub const __INTMAX_TYPE__ = c_long; +pub const __INTMAX_FMTd__ = "ld"; +pub const __INTMAX_FMTi__ = "li"; +pub const __UINTMAX_TYPE__ = c_ulong; +pub const __UINTMAX_FMTo__ = "lo"; +pub const __UINTMAX_FMTu__ = "lu"; +pub const __UINTMAX_FMTx__ = "lx"; +pub const __UINTMAX_FMTX__ = "lX"; +pub const __INTMAX_WIDTH__ = @as(c_int, 64); +pub const __PTRDIFF_TYPE__ = c_long; +pub const __PTRDIFF_FMTd__ = "ld"; +pub const __PTRDIFF_FMTi__ = "li"; +pub const __PTRDIFF_WIDTH__ = @as(c_int, 64); +pub const __INTPTR_TYPE__ = c_long; +pub const __INTPTR_FMTd__ = "ld"; +pub const __INTPTR_FMTi__ = "li"; +pub const __INTPTR_WIDTH__ = @as(c_int, 64); +pub const __SIZE_TYPE__ = c_ulong; +pub const __SIZE_FMTo__ = "lo"; +pub const __SIZE_FMTu__ = "lu"; +pub const __SIZE_FMTx__ = "lx"; +pub const __SIZE_FMTX__ = "lX"; +pub const __SIZE_WIDTH__ = @as(c_int, 64); +pub const __WCHAR_TYPE__ = c_int; +pub const __WCHAR_WIDTH__ = @as(c_int, 32); +pub const __WINT_TYPE__ = c_uint; +pub const __WINT_WIDTH__ = @as(c_int, 32); +pub const __SIG_ATOMIC_WIDTH__ = @as(c_int, 32); +pub const __SIG_ATOMIC_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const __CHAR16_TYPE__ = c_ushort; +pub const __CHAR32_TYPE__ = c_uint; +pub const __UINTMAX_WIDTH__ = @as(c_int, 64); +pub const __UINTPTR_TYPE__ = c_ulong; +pub const __UINTPTR_FMTo__ = "lo"; +pub const __UINTPTR_FMTu__ = "lu"; +pub const __UINTPTR_FMTx__ = "lx"; +pub const __UINTPTR_FMTX__ = "lX"; +pub const __UINTPTR_WIDTH__ = @as(c_int, 64); +pub const __FLT_DENORM_MIN__ = @as(f32, 1.40129846e-45); +pub const __FLT_HAS_DENORM__ = @as(c_int, 1); +pub const __FLT_DIG__ = @as(c_int, 6); +pub const __FLT_DECIMAL_DIG__ = @as(c_int, 9); +pub const __FLT_EPSILON__ = @as(f32, 1.19209290e-7); +pub const __FLT_HAS_INFINITY__ = @as(c_int, 1); +pub const __FLT_HAS_QUIET_NAN__ = @as(c_int, 1); +pub const __FLT_MANT_DIG__ = @as(c_int, 24); +pub const __FLT_MAX_10_EXP__ = @as(c_int, 38); +pub const __FLT_MAX_EXP__ = @as(c_int, 128); +pub const __FLT_MAX__ = @as(f32, 3.40282347e+38); +pub const __FLT_MIN_10_EXP__ = -@as(c_int, 37); +pub const __FLT_MIN_EXP__ = -@as(c_int, 125); +pub const __FLT_MIN__ = @as(f32, 1.17549435e-38); +pub const __DBL_DENORM_MIN__ = 4.9406564584124654e-324; +pub const __DBL_HAS_DENORM__ = @as(c_int, 1); +pub const __DBL_DIG__ = @as(c_int, 15); +pub const __DBL_DECIMAL_DIG__ = @as(c_int, 17); +pub const __DBL_EPSILON__ = 2.2204460492503131e-16; +pub const __DBL_HAS_INFINITY__ = @as(c_int, 1); +pub const __DBL_HAS_QUIET_NAN__ = @as(c_int, 1); +pub const __DBL_MANT_DIG__ = @as(c_int, 53); +pub const __DBL_MAX_10_EXP__ = @as(c_int, 308); +pub const __DBL_MAX_EXP__ = @as(c_int, 1024); +pub const __DBL_MAX__ = 1.7976931348623157e+308; +pub const __DBL_MIN_10_EXP__ = -@as(c_int, 307); +pub const __DBL_MIN_EXP__ = -@as(c_int, 1021); +pub const __DBL_MIN__ = 2.2250738585072014e-308; +pub const __LDBL_DENORM_MIN__ = @as(c_longdouble, 3.64519953188247460253e-4951); +pub const __LDBL_HAS_DENORM__ = @as(c_int, 1); +pub const __LDBL_DIG__ = @as(c_int, 18); +pub const __LDBL_DECIMAL_DIG__ = @as(c_int, 21); +pub const __LDBL_EPSILON__ = @as(c_longdouble, 1.08420217248550443401e-19); +pub const __LDBL_HAS_INFINITY__ = @as(c_int, 1); +pub const __LDBL_HAS_QUIET_NAN__ = @as(c_int, 1); +pub const __LDBL_MANT_DIG__ = @as(c_int, 64); +pub const __LDBL_MAX_10_EXP__ = @as(c_int, 4932); +pub const __LDBL_MAX_EXP__ = @as(c_int, 16384); +pub const __LDBL_MAX__ = @as(c_longdouble, 1.18973149535723176502e+4932); +pub const __LDBL_MIN_10_EXP__ = -@as(c_int, 4931); +pub const __LDBL_MIN_EXP__ = -@as(c_int, 16381); +pub const __LDBL_MIN__ = @as(c_longdouble, 3.36210314311209350626e-4932); +pub const __POINTER_WIDTH__ = @as(c_int, 64); +pub const __BIGGEST_ALIGNMENT__ = @as(c_int, 16); +pub const __WINT_UNSIGNED__ = @as(c_int, 1); +pub const __INT8_TYPE__ = i8; +pub const __INT8_FMTd__ = "hhd"; +pub const __INT8_FMTi__ = "hhi"; +pub const __INT8_C_SUFFIX__ = ""; +pub const __INT16_TYPE__ = c_short; +pub const __INT16_FMTd__ = "hd"; +pub const __INT16_FMTi__ = "hi"; +pub const __INT16_C_SUFFIX__ = ""; +pub const __INT32_TYPE__ = c_int; +pub const __INT32_FMTd__ = "d"; +pub const __INT32_FMTi__ = "i"; +pub const __INT32_C_SUFFIX__ = ""; +pub const __INT64_TYPE__ = c_long; +pub const __INT64_FMTd__ = "ld"; +pub const __INT64_FMTi__ = "li"; +pub const __UINT8_TYPE__ = u8; +pub const __UINT8_FMTo__ = "hho"; +pub const __UINT8_FMTu__ = "hhu"; +pub const __UINT8_FMTx__ = "hhx"; +pub const __UINT8_FMTX__ = "hhX"; +pub const __UINT8_C_SUFFIX__ = ""; +pub const __UINT8_MAX__ = @as(c_int, 255); +pub const __INT8_MAX__ = @as(c_int, 127); +pub const __UINT16_TYPE__ = c_ushort; +pub const __UINT16_FMTo__ = "ho"; +pub const __UINT16_FMTu__ = "hu"; +pub const __UINT16_FMTx__ = "hx"; +pub const __UINT16_FMTX__ = "hX"; +pub const __UINT16_C_SUFFIX__ = ""; +pub const __UINT16_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 65535, .decimal); +pub const __INT16_MAX__ = @as(c_int, 32767); +pub const __UINT32_TYPE__ = c_uint; +pub const __UINT32_FMTo__ = "o"; +pub const __UINT32_FMTu__ = "u"; +pub const __UINT32_FMTx__ = "x"; +pub const __UINT32_FMTX__ = "X"; +pub const __UINT32_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_uint, 4294967295, .decimal); +pub const __INT32_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const __UINT64_TYPE__ = c_ulong; +pub const __UINT64_FMTo__ = "lo"; +pub const __UINT64_FMTu__ = "lu"; +pub const __UINT64_FMTx__ = "lx"; +pub const __UINT64_FMTX__ = "lX"; +pub const __UINT64_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_ulong, 18446744073709551615, .decimal); +pub const __INT64_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __INT_LEAST8_TYPE__ = i8; +pub const __INT_LEAST8_MAX__ = @as(c_int, 127); +pub const __INT_LEAST8_FMTd__ = "hhd"; +pub const __INT_LEAST8_FMTi__ = "hhi"; +pub const __UINT_LEAST8_TYPE__ = u8; +pub const __UINT_LEAST8_MAX__ = @as(c_int, 255); +pub const __UINT_LEAST8_FMTo__ = "hho"; +pub const __UINT_LEAST8_FMTu__ = "hhu"; +pub const __UINT_LEAST8_FMTx__ = "hhx"; +pub const __UINT_LEAST8_FMTX__ = "hhX"; +pub const __INT_LEAST16_TYPE__ = c_short; +pub const __INT_LEAST16_MAX__ = @as(c_int, 32767); +pub const __INT_LEAST16_FMTd__ = "hd"; +pub const __INT_LEAST16_FMTi__ = "hi"; +pub const __UINT_LEAST16_TYPE__ = c_ushort; +pub const __UINT_LEAST16_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 65535, .decimal); +pub const __UINT_LEAST16_FMTo__ = "ho"; +pub const __UINT_LEAST16_FMTu__ = "hu"; +pub const __UINT_LEAST16_FMTx__ = "hx"; +pub const __UINT_LEAST16_FMTX__ = "hX"; +pub const __INT_LEAST32_TYPE__ = c_int; +pub const __INT_LEAST32_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const __INT_LEAST32_FMTd__ = "d"; +pub const __INT_LEAST32_FMTi__ = "i"; +pub const __UINT_LEAST32_TYPE__ = c_uint; +pub const __UINT_LEAST32_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_uint, 4294967295, .decimal); +pub const __UINT_LEAST32_FMTo__ = "o"; +pub const __UINT_LEAST32_FMTu__ = "u"; +pub const __UINT_LEAST32_FMTx__ = "x"; +pub const __UINT_LEAST32_FMTX__ = "X"; +pub const __INT_LEAST64_TYPE__ = c_long; +pub const __INT_LEAST64_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __INT_LEAST64_FMTd__ = "ld"; +pub const __INT_LEAST64_FMTi__ = "li"; +pub const __UINT_LEAST64_TYPE__ = c_ulong; +pub const __UINT_LEAST64_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_ulong, 18446744073709551615, .decimal); +pub const __UINT_LEAST64_FMTo__ = "lo"; +pub const __UINT_LEAST64_FMTu__ = "lu"; +pub const __UINT_LEAST64_FMTx__ = "lx"; +pub const __UINT_LEAST64_FMTX__ = "lX"; +pub const __INT_FAST8_TYPE__ = i8; +pub const __INT_FAST8_MAX__ = @as(c_int, 127); +pub const __INT_FAST8_FMTd__ = "hhd"; +pub const __INT_FAST8_FMTi__ = "hhi"; +pub const __UINT_FAST8_TYPE__ = u8; +pub const __UINT_FAST8_MAX__ = @as(c_int, 255); +pub const __UINT_FAST8_FMTo__ = "hho"; +pub const __UINT_FAST8_FMTu__ = "hhu"; +pub const __UINT_FAST8_FMTx__ = "hhx"; +pub const __UINT_FAST8_FMTX__ = "hhX"; +pub const __INT_FAST16_TYPE__ = c_short; +pub const __INT_FAST16_MAX__ = @as(c_int, 32767); +pub const __INT_FAST16_FMTd__ = "hd"; +pub const __INT_FAST16_FMTi__ = "hi"; +pub const __UINT_FAST16_TYPE__ = c_ushort; +pub const __UINT_FAST16_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 65535, .decimal); +pub const __UINT_FAST16_FMTo__ = "ho"; +pub const __UINT_FAST16_FMTu__ = "hu"; +pub const __UINT_FAST16_FMTx__ = "hx"; +pub const __UINT_FAST16_FMTX__ = "hX"; +pub const __INT_FAST32_TYPE__ = c_int; +pub const __INT_FAST32_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const __INT_FAST32_FMTd__ = "d"; +pub const __INT_FAST32_FMTi__ = "i"; +pub const __UINT_FAST32_TYPE__ = c_uint; +pub const __UINT_FAST32_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_uint, 4294967295, .decimal); +pub const __UINT_FAST32_FMTo__ = "o"; +pub const __UINT_FAST32_FMTu__ = "u"; +pub const __UINT_FAST32_FMTx__ = "x"; +pub const __UINT_FAST32_FMTX__ = "X"; +pub const __INT_FAST64_TYPE__ = c_long; +pub const __INT_FAST64_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_long, 9223372036854775807, .decimal); +pub const __INT_FAST64_FMTd__ = "ld"; +pub const __INT_FAST64_FMTi__ = "li"; +pub const __UINT_FAST64_TYPE__ = c_ulong; +pub const __UINT_FAST64_MAX__ = @import("std").zig.c_translation.promoteIntLiteral(c_ulong, 18446744073709551615, .decimal); +pub const __UINT_FAST64_FMTo__ = "lo"; +pub const __UINT_FAST64_FMTu__ = "lu"; +pub const __UINT_FAST64_FMTx__ = "lx"; +pub const __UINT_FAST64_FMTX__ = "lX"; +pub const __USER_LABEL_PREFIX__ = ""; +pub const __FINITE_MATH_ONLY__ = @as(c_int, 0); +pub const __GNUC_STDC_INLINE__ = @as(c_int, 1); +pub const __GCC_ATOMIC_TEST_AND_SET_TRUEVAL = @as(c_int, 1); +pub const __CLANG_ATOMIC_BOOL_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_CHAR_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_CHAR16_T_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_CHAR32_T_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_WCHAR_T_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_SHORT_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_INT_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_LONG_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_LLONG_LOCK_FREE = @as(c_int, 2); +pub const __CLANG_ATOMIC_POINTER_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_BOOL_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_CHAR_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_CHAR16_T_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_CHAR32_T_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_WCHAR_T_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_SHORT_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_INT_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_LONG_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_LLONG_LOCK_FREE = @as(c_int, 2); +pub const __GCC_ATOMIC_POINTER_LOCK_FREE = @as(c_int, 2); +pub const __PIC__ = @as(c_int, 2); +pub const __pic__ = @as(c_int, 2); +pub const __FLT_EVAL_METHOD__ = @as(c_int, 0); +pub const __FLT_RADIX__ = @as(c_int, 2); +pub const __DECIMAL_DIG__ = __LDBL_DECIMAL_DIG__; +pub const __SSP_STRONG__ = @as(c_int, 2); +pub const __GCC_ASM_FLAG_OUTPUTS__ = @as(c_int, 1); +pub const __code_model_small__ = @as(c_int, 1); +pub const __amd64__ = @as(c_int, 1); +pub const __amd64 = @as(c_int, 1); +pub const __x86_64 = @as(c_int, 1); +pub const __x86_64__ = @as(c_int, 1); +pub const __SEG_GS = @as(c_int, 1); +pub const __SEG_FS = @as(c_int, 1); +pub const __corei7 = @as(c_int, 1); +pub const __corei7__ = @as(c_int, 1); +pub const __tune_corei7__ = @as(c_int, 1); +pub const __REGISTER_PREFIX__ = ""; +pub const __NO_MATH_INLINES = @as(c_int, 1); +pub const __AES__ = @as(c_int, 1); +pub const __PCLMUL__ = @as(c_int, 1); +pub const __LAHF_SAHF__ = @as(c_int, 1); +pub const __RDRND__ = @as(c_int, 1); +pub const __FSGSBASE__ = @as(c_int, 1); +pub const __POPCNT__ = @as(c_int, 1); +pub const __F16C__ = @as(c_int, 1); +pub const __FXSR__ = @as(c_int, 1); +pub const __XSAVE__ = @as(c_int, 1); +pub const __XSAVEOPT__ = @as(c_int, 1); +pub const __AVX__ = @as(c_int, 1); +pub const __SSE4_2__ = @as(c_int, 1); +pub const __SSE4_1__ = @as(c_int, 1); +pub const __SSSE3__ = @as(c_int, 1); +pub const __SSE3__ = @as(c_int, 1); +pub const __SSE2__ = @as(c_int, 1); +pub const __SSE2_MATH__ = @as(c_int, 1); +pub const __SSE__ = @as(c_int, 1); +pub const __SSE_MATH__ = @as(c_int, 1); +pub const __MMX__ = @as(c_int, 1); +pub const __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 = @as(c_int, 1); +pub const __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 = @as(c_int, 1); +pub const __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 = @as(c_int, 1); +pub const __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 = @as(c_int, 1); +pub const __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 = @as(c_int, 1); +pub const __SIZEOF_FLOAT128__ = @as(c_int, 16); +pub const unix = @as(c_int, 1); +pub const __unix = @as(c_int, 1); +pub const __unix__ = @as(c_int, 1); +pub const linux = @as(c_int, 1); +pub const __linux = @as(c_int, 1); +pub const __linux__ = @as(c_int, 1); +pub const __ELF__ = @as(c_int, 1); +pub const __gnu_linux__ = @as(c_int, 1); +pub const __FLOAT128__ = @as(c_int, 1); +pub const __STDC__ = @as(c_int, 1); +pub const __STDC_HOSTED__ = @as(c_int, 1); +pub const __STDC_VERSION__ = @as(c_long, 201710); +pub const __STDC_UTF_16__ = @as(c_int, 1); +pub const __STDC_UTF_32__ = @as(c_int, 1); +pub const __GLIBC_MINOR__ = @as(c_int, 19); +pub const _DEBUG = @as(c_int, 1); +pub const RAYGUI_IMPLEMENTATION = @as(c_int, 1); +pub const __GCC_HAVE_DWARF2_CFI_ASM = @as(c_int, 1); +pub const RAYGUI_H = ""; +pub const RAYGUI_VERSION = "3.0"; +pub const RAYLIB_H = ""; +pub const __STDARG_H = ""; +pub const _VA_LIST = ""; +pub const __GNUC_VA_LIST = @as(c_int, 1); +pub const RAYLIB_VERSION = "4.1-dev"; +pub const RLAPI = ""; +pub const PI = @as(f32, 3.14159265358979323846); +pub const DEG2RAD = PI / @as(f32, 180.0); +pub const RAD2DEG = @as(f32, 180.0) / PI; +pub inline fn RL_MALLOC(sz: anytype) @TypeOf(malloc(sz)) { + return malloc(sz); +} +pub inline fn RL_CALLOC(n: anytype, sz: anytype) @TypeOf(calloc(n, sz)) { + return calloc(n, sz); +} +pub inline fn RL_REALLOC(ptr: anytype, sz: anytype) @TypeOf(realloc(ptr, sz)) { + return realloc(ptr, sz); +} +pub inline fn RL_FREE(ptr: anytype) @TypeOf(free(ptr)) { + return free(ptr); +} +pub inline fn CLITERAL(@"type": anytype) @TypeOf(@"type") { + return @"type"; +} +pub const RL_COLOR_TYPE = ""; +pub const RL_RECTANGLE_TYPE = ""; +pub const RL_VECTOR2_TYPE = ""; +pub const RL_VECTOR3_TYPE = ""; +pub const RL_VECTOR4_TYPE = ""; +pub const RL_QUATERNION_TYPE = ""; +pub const RL_MATRIX_TYPE = ""; +pub const LIGHTGRAY = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 200), @as(c_int, 200), @as(c_int, 200), @as(c_int, 255) }); +pub const GRAY = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 130), @as(c_int, 130), @as(c_int, 130), @as(c_int, 255) }); +pub const DARKGRAY = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 80), @as(c_int, 80), @as(c_int, 80), @as(c_int, 255) }); +pub const YELLOW = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 253), @as(c_int, 249), @as(c_int, 0), @as(c_int, 255) }); +pub const GOLD = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 255), @as(c_int, 203), @as(c_int, 0), @as(c_int, 255) }); +pub const ORANGE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 255), @as(c_int, 161), @as(c_int, 0), @as(c_int, 255) }); +pub const PINK = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 255), @as(c_int, 109), @as(c_int, 194), @as(c_int, 255) }); +pub const RED = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 230), @as(c_int, 41), @as(c_int, 55), @as(c_int, 255) }); +pub const MAROON = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 190), @as(c_int, 33), @as(c_int, 55), @as(c_int, 255) }); +pub const GREEN = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 228), @as(c_int, 48), @as(c_int, 255) }); +pub const LIME = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 158), @as(c_int, 47), @as(c_int, 255) }); +pub const DARKGREEN = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 117), @as(c_int, 44), @as(c_int, 255) }); +pub const SKYBLUE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 102), @as(c_int, 191), @as(c_int, 255), @as(c_int, 255) }); +pub const BLUE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 121), @as(c_int, 241), @as(c_int, 255) }); +pub const DARKBLUE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 82), @as(c_int, 172), @as(c_int, 255) }); +pub const PURPLE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 200), @as(c_int, 122), @as(c_int, 255), @as(c_int, 255) }); +pub const VIOLET = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 135), @as(c_int, 60), @as(c_int, 190), @as(c_int, 255) }); +pub const DARKPURPLE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 112), @as(c_int, 31), @as(c_int, 126), @as(c_int, 255) }); +pub const BEIGE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 211), @as(c_int, 176), @as(c_int, 131), @as(c_int, 255) }); +pub const BROWN = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 127), @as(c_int, 106), @as(c_int, 79), @as(c_int, 255) }); +pub const DARKBROWN = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 76), @as(c_int, 63), @as(c_int, 47), @as(c_int, 255) }); +pub const WHITE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 255), @as(c_int, 255), @as(c_int, 255), @as(c_int, 255) }); +pub const BLACK = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 0), @as(c_int, 0), @as(c_int, 255) }); +pub const BLANK = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 0), @as(c_int, 0), @as(c_int, 0), @as(c_int, 0) }); +pub const MAGENTA = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 255), @as(c_int, 0), @as(c_int, 255), @as(c_int, 255) }); +pub const RAYWHITE = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 245), @as(c_int, 245), @as(c_int, 245), @as(c_int, 255) }); +pub const __STDBOOL_H = ""; +pub const @"bool" = bool; +pub const @"true" = @as(c_int, 1); +pub const @"false" = @as(c_int, 0); +pub const __bool_true_false_are_defined = @as(c_int, 1); +pub const MOUSE_LEFT_BUTTON = MOUSE_BUTTON_LEFT; +pub const MOUSE_RIGHT_BUTTON = MOUSE_BUTTON_RIGHT; +pub const MOUSE_MIDDLE_BUTTON = MOUSE_BUTTON_MIDDLE; +pub const MATERIAL_MAP_DIFFUSE = MATERIAL_MAP_ALBEDO; +pub const MATERIAL_MAP_SPECULAR = MATERIAL_MAP_METALNESS; +pub const SHADER_LOC_MAP_DIFFUSE = SHADER_LOC_MAP_ALBEDO; +pub const SHADER_LOC_MAP_SPECULAR = SHADER_LOC_MAP_METALNESS; +pub const RAYGUIAPI = ""; +pub inline fn RAYGUI_MALLOC(sz: anytype) @TypeOf(malloc(sz)) { + return malloc(sz); +} +pub inline fn RAYGUI_CALLOC(n: anytype, sz: anytype) @TypeOf(calloc(n, sz)) { + return calloc(n, sz); +} +pub inline fn RAYGUI_FREE(p: anytype) @TypeOf(free(p)) { + return free(p); +} +pub const _STDIO_H = @as(c_int, 1); +pub const __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION = ""; +pub const _FEATURES_H = @as(c_int, 1); +pub const __KERNEL_STRICT_NAMES = ""; +pub inline fn __GNUC_PREREQ(maj: anytype, min: anytype) @TypeOf(((__GNUC__ << @as(c_int, 16)) + __GNUC_MINOR__) >= ((maj << @as(c_int, 16)) + min)) { + return ((__GNUC__ << @as(c_int, 16)) + __GNUC_MINOR__) >= ((maj << @as(c_int, 16)) + min); +} +pub inline fn __glibc_clang_prereq(maj: anytype, min: anytype) @TypeOf(((__clang_major__ << @as(c_int, 16)) + __clang_minor__) >= ((maj << @as(c_int, 16)) + min)) { + return ((__clang_major__ << @as(c_int, 16)) + __clang_minor__) >= ((maj << @as(c_int, 16)) + min); +} +pub const _DEFAULT_SOURCE = @as(c_int, 1); +pub const __GLIBC_USE_ISOC2X = @as(c_int, 0); +pub const __USE_ISOC11 = @as(c_int, 1); +pub const __USE_ISOC99 = @as(c_int, 1); +pub const __USE_ISOC95 = @as(c_int, 1); +pub const __USE_POSIX_IMPLICITLY = @as(c_int, 1); +pub const _POSIX_SOURCE = @as(c_int, 1); +pub const _POSIX_C_SOURCE = @as(c_long, 200809); +pub const __USE_POSIX = @as(c_int, 1); +pub const __USE_POSIX2 = @as(c_int, 1); +pub const __USE_POSIX199309 = @as(c_int, 1); +pub const __USE_POSIX199506 = @as(c_int, 1); +pub const __USE_XOPEN2K = @as(c_int, 1); +pub const __USE_XOPEN2K8 = @as(c_int, 1); +pub const _ATFILE_SOURCE = @as(c_int, 1); +pub const __WORDSIZE = @as(c_int, 64); +pub const __WORDSIZE_TIME64_COMPAT32 = @as(c_int, 1); +pub const __SYSCALL_WORDSIZE = @as(c_int, 64); +pub const __TIMESIZE = __WORDSIZE; +pub const __USE_MISC = @as(c_int, 1); +pub const __USE_ATFILE = @as(c_int, 1); +pub const __USE_FORTIFY_LEVEL = @as(c_int, 0); +pub const __GLIBC_USE_DEPRECATED_GETS = @as(c_int, 0); +pub const __GLIBC_USE_DEPRECATED_SCANF = @as(c_int, 0); +pub const _STDC_PREDEF_H = @as(c_int, 1); +pub const __STDC_IEC_559__ = @as(c_int, 1); +pub const __STDC_IEC_559_COMPLEX__ = @as(c_int, 1); +pub const __STDC_ISO_10646__ = @as(c_long, 201706); +pub const __GNU_LIBRARY__ = @as(c_int, 6); +pub const __GLIBC__ = @as(c_int, 2); +pub inline fn __GLIBC_PREREQ(maj: anytype, min: anytype) @TypeOf(((__GLIBC__ << @as(c_int, 16)) + __GLIBC_MINOR__) >= ((maj << @as(c_int, 16)) + min)) { + return ((__GLIBC__ << @as(c_int, 16)) + __GLIBC_MINOR__) >= ((maj << @as(c_int, 16)) + min); +} +pub const _SYS_CDEFS_H = @as(c_int, 1); +pub inline fn __glibc_has_builtin(name: anytype) @TypeOf(__has_builtin(name)) { + return __has_builtin(name); +} +pub const __LEAF = ""; +pub const __LEAF_ATTR = ""; +pub inline fn __P(args: anytype) @TypeOf(args) { + return args; +} +pub inline fn __PMT(args: anytype) @TypeOf(args) { + return args; +} +pub const __ptr_t = ?*anyopaque; +pub const __BEGIN_DECLS = ""; +pub const __END_DECLS = ""; +pub inline fn __bos(ptr: anytype) @TypeOf(__builtin_object_size(ptr, __USE_FORTIFY_LEVEL > @as(c_int, 1))) { + return __builtin_object_size(ptr, __USE_FORTIFY_LEVEL > @as(c_int, 1)); +} +pub inline fn __bos0(ptr: anytype) @TypeOf(__builtin_object_size(ptr, @as(c_int, 0))) { + return __builtin_object_size(ptr, @as(c_int, 0)); +} +pub inline fn __glibc_objsize0(__o: anytype) @TypeOf(__bos0(__o)) { + return __bos0(__o); +} +pub inline fn __glibc_objsize(__o: anytype) @TypeOf(__bos(__o)) { + return __bos(__o); +} +pub const __glibc_c99_flexarr_available = @as(c_int, 1); +pub inline fn __ASMNAME(cname: anytype) @TypeOf(__ASMNAME2(__USER_LABEL_PREFIX__, cname)) { + return __ASMNAME2(__USER_LABEL_PREFIX__, cname); +} +pub const __wur = ""; +pub const __fortify_function = __extern_always_inline ++ __attribute_artificial__; +pub inline fn __glibc_unlikely(cond: anytype) @TypeOf(__builtin_expect(cond, @as(c_int, 0))) { + return __builtin_expect(cond, @as(c_int, 0)); +} +pub inline fn __glibc_likely(cond: anytype) @TypeOf(__builtin_expect(cond, @as(c_int, 1))) { + return __builtin_expect(cond, @as(c_int, 1)); +} +pub const __attribute_nonstring__ = ""; +pub const __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI = @as(c_int, 0); +pub inline fn __LDBL_REDIR1(name: anytype, proto: anytype, alias: anytype) @TypeOf(name ++ proto) { + _ = alias; + return name ++ proto; +} +pub inline fn __LDBL_REDIR(name: anytype, proto: anytype) @TypeOf(name ++ proto) { + return name ++ proto; +} +pub inline fn __LDBL_REDIR1_NTH(name: anytype, proto: anytype, alias: anytype) @TypeOf(name ++ proto ++ __THROW) { + _ = alias; + return name ++ proto ++ __THROW; +} +pub inline fn __LDBL_REDIR_NTH(name: anytype, proto: anytype) @TypeOf(name ++ proto ++ __THROW) { + return name ++ proto ++ __THROW; +} +pub inline fn __REDIRECT_LDBL(name: anytype, proto: anytype, alias: anytype) @TypeOf(__REDIRECT(name, proto, alias)) { + return __REDIRECT(name, proto, alias); +} +pub inline fn __REDIRECT_NTH_LDBL(name: anytype, proto: anytype, alias: anytype) @TypeOf(__REDIRECT_NTH(name, proto, alias)) { + return __REDIRECT_NTH(name, proto, alias); +} +pub const __HAVE_GENERIC_SELECTION = @as(c_int, 1); +pub const __attr_dealloc_free = ""; +pub const __USE_EXTERN_INLINES = @as(c_int, 1); +pub const __stub___compat_bdflush = ""; +pub const __stub_chflags = ""; +pub const __stub_fchflags = ""; +pub const __stub_gtty = ""; +pub const __stub_revoke = ""; +pub const __stub_setlogin = ""; +pub const __stub_sigreturn = ""; +pub const __stub_stty = ""; +pub const __GLIBC_USE_LIB_EXT2 = @as(c_int, 0); +pub const __GLIBC_USE_IEC_60559_BFP_EXT = @as(c_int, 0); +pub const __GLIBC_USE_IEC_60559_BFP_EXT_C2X = @as(c_int, 0); +pub const __GLIBC_USE_IEC_60559_EXT = @as(c_int, 0); +pub const __GLIBC_USE_IEC_60559_FUNCS_EXT = @as(c_int, 0); +pub const __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X = @as(c_int, 0); +pub const __GLIBC_USE_IEC_60559_TYPES_EXT = @as(c_int, 0); +pub const __need_size_t = ""; +pub const __need_NULL = ""; +pub const _SIZE_T = ""; +pub const NULL = @import("std").zig.c_translation.cast(?*anyopaque, @as(c_int, 0)); +pub const __need___va_list = ""; +pub const _BITS_TYPES_H = @as(c_int, 1); +pub const __S16_TYPE = c_short; +pub const __U16_TYPE = c_ushort; +pub const __S32_TYPE = c_int; +pub const __U32_TYPE = c_uint; +pub const __SLONGWORD_TYPE = c_long; +pub const __ULONGWORD_TYPE = c_ulong; +pub const __SQUAD_TYPE = c_long; +pub const __UQUAD_TYPE = c_ulong; +pub const __SWORD_TYPE = c_long; +pub const __UWORD_TYPE = c_ulong; +pub const __SLONG32_TYPE = c_int; +pub const __ULONG32_TYPE = c_uint; +pub const __S64_TYPE = c_long; +pub const __U64_TYPE = c_ulong; +pub const _BITS_TYPESIZES_H = @as(c_int, 1); +pub const __SYSCALL_SLONG_TYPE = __SLONGWORD_TYPE; +pub const __SYSCALL_ULONG_TYPE = __ULONGWORD_TYPE; +pub const __DEV_T_TYPE = __UQUAD_TYPE; +pub const __UID_T_TYPE = __U32_TYPE; +pub const __GID_T_TYPE = __U32_TYPE; +pub const __INO_T_TYPE = __SYSCALL_ULONG_TYPE; +pub const __INO64_T_TYPE = __UQUAD_TYPE; +pub const __MODE_T_TYPE = __U32_TYPE; +pub const __NLINK_T_TYPE = __SYSCALL_ULONG_TYPE; +pub const __FSWORD_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __OFF_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __OFF64_T_TYPE = __SQUAD_TYPE; +pub const __PID_T_TYPE = __S32_TYPE; +pub const __RLIM_T_TYPE = __SYSCALL_ULONG_TYPE; +pub const __RLIM64_T_TYPE = __UQUAD_TYPE; +pub const __BLKCNT_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __BLKCNT64_T_TYPE = __SQUAD_TYPE; +pub const __FSBLKCNT_T_TYPE = __SYSCALL_ULONG_TYPE; +pub const __FSBLKCNT64_T_TYPE = __UQUAD_TYPE; +pub const __FSFILCNT_T_TYPE = __SYSCALL_ULONG_TYPE; +pub const __FSFILCNT64_T_TYPE = __UQUAD_TYPE; +pub const __ID_T_TYPE = __U32_TYPE; +pub const __CLOCK_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __TIME_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __USECONDS_T_TYPE = __U32_TYPE; +pub const __SUSECONDS_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __SUSECONDS64_T_TYPE = __SQUAD_TYPE; +pub const __DADDR_T_TYPE = __S32_TYPE; +pub const __KEY_T_TYPE = __S32_TYPE; +pub const __CLOCKID_T_TYPE = __S32_TYPE; +pub const __TIMER_T_TYPE = ?*anyopaque; +pub const __BLKSIZE_T_TYPE = __SYSCALL_SLONG_TYPE; +pub const __SSIZE_T_TYPE = __SWORD_TYPE; +pub const __CPU_MASK_TYPE = __SYSCALL_ULONG_TYPE; +pub const __OFF_T_MATCHES_OFF64_T = @as(c_int, 1); +pub const __INO_T_MATCHES_INO64_T = @as(c_int, 1); +pub const __RLIM_T_MATCHES_RLIM64_T = @as(c_int, 1); +pub const __STATFS_MATCHES_STATFS64 = @as(c_int, 1); +pub const __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 = @as(c_int, 1); +pub const __FD_SETSIZE = @as(c_int, 1024); +pub const _BITS_TIME64_H = @as(c_int, 1); +pub const __TIME64_T_TYPE = __TIME_T_TYPE; +pub const _____fpos_t_defined = @as(c_int, 1); +pub const ____mbstate_t_defined = @as(c_int, 1); +pub const _____fpos64_t_defined = @as(c_int, 1); +pub const ____FILE_defined = @as(c_int, 1); +pub const __FILE_defined = @as(c_int, 1); +pub const __struct_FILE_defined = @as(c_int, 1); +pub const _IO_EOF_SEEN = @as(c_int, 0x0010); +pub inline fn __feof_unlocked_body(_fp: anytype) @TypeOf((_fp.*._flags & _IO_EOF_SEEN) != @as(c_int, 0)) { + return (_fp.*._flags & _IO_EOF_SEEN) != @as(c_int, 0); +} +pub const _IO_ERR_SEEN = @as(c_int, 0x0020); +pub inline fn __ferror_unlocked_body(_fp: anytype) @TypeOf((_fp.*._flags & _IO_ERR_SEEN) != @as(c_int, 0)) { + return (_fp.*._flags & _IO_ERR_SEEN) != @as(c_int, 0); +} +pub const _IO_USER_LOCK = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0x8000, .hexadecimal); +pub const _VA_LIST_DEFINED = ""; +pub const __off_t_defined = ""; +pub const __ssize_t_defined = ""; +pub const _IOFBF = @as(c_int, 0); +pub const _IOLBF = @as(c_int, 1); +pub const _IONBF = @as(c_int, 2); +pub const BUFSIZ = @as(c_int, 8192); +pub const EOF = -@as(c_int, 1); +pub const SEEK_SET = @as(c_int, 0); +pub const SEEK_CUR = @as(c_int, 1); +pub const SEEK_END = @as(c_int, 2); +pub const P_tmpdir = "/tmp"; +pub const _BITS_STDIO_LIM_H = @as(c_int, 1); +pub const L_tmpnam = @as(c_int, 20); +pub const TMP_MAX = @import("std").zig.c_translation.promoteIntLiteral(c_int, 238328, .decimal); +pub const FILENAME_MAX = @as(c_int, 4096); +pub const L_ctermid = @as(c_int, 9); +pub const FOPEN_MAX = @as(c_int, 16); +pub const __attr_dealloc_fclose = __attr_dealloc(fclose, @as(c_int, 1)); +pub const _BITS_FLOATN_H = ""; +pub const __HAVE_FLOAT128 = @as(c_int, 0); +pub const __HAVE_DISTINCT_FLOAT128 = @as(c_int, 0); +pub const __HAVE_FLOAT64X = @as(c_int, 1); +pub const __HAVE_FLOAT64X_LONG_DOUBLE = @as(c_int, 1); +pub const _BITS_FLOATN_COMMON_H = ""; +pub const __HAVE_FLOAT16 = @as(c_int, 0); +pub const __HAVE_FLOAT32 = @as(c_int, 1); +pub const __HAVE_FLOAT64 = @as(c_int, 1); +pub const __HAVE_FLOAT32X = @as(c_int, 1); +pub const __HAVE_FLOAT128X = @as(c_int, 0); +pub const __HAVE_DISTINCT_FLOAT16 = __HAVE_FLOAT16; +pub const __HAVE_DISTINCT_FLOAT32 = @as(c_int, 0); +pub const __HAVE_DISTINCT_FLOAT64 = @as(c_int, 0); +pub const __HAVE_DISTINCT_FLOAT32X = @as(c_int, 0); +pub const __HAVE_DISTINCT_FLOAT64X = @as(c_int, 0); +pub const __HAVE_DISTINCT_FLOAT128X = __HAVE_FLOAT128X; +pub const __HAVE_FLOAT128_UNLIKE_LDBL = (__HAVE_DISTINCT_FLOAT128 != 0) and (__LDBL_MANT_DIG__ != @as(c_int, 113)); +pub const __HAVE_FLOATN_NOT_TYPEDEF = @as(c_int, 0); +pub inline fn __f64(x: anytype) @TypeOf(x) { + return x; +} +pub inline fn __f32x(x: anytype) @TypeOf(x) { + return x; +} +pub inline fn __builtin_huge_valf32() @TypeOf(__builtin_huge_valf()) { + return __builtin_huge_valf(); +} +pub inline fn __builtin_inff32() @TypeOf(__builtin_inff()) { + return __builtin_inff(); +} +pub inline fn __builtin_nanf32(x: anytype) @TypeOf(__builtin_nanf(x)) { + return __builtin_nanf(x); +} +pub const _BITS_STDIO_H = @as(c_int, 1); +pub const __STDIO_INLINE = __extern_inline; +pub const __need_wchar_t = ""; +pub const _WCHAR_T = ""; +pub const _STDLIB_H = @as(c_int, 1); +pub const WNOHANG = @as(c_int, 1); +pub const WUNTRACED = @as(c_int, 2); +pub const WSTOPPED = @as(c_int, 2); +pub const WEXITED = @as(c_int, 4); +pub const WCONTINUED = @as(c_int, 8); +pub const WNOWAIT = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0x01000000, .hexadecimal); +pub const __WNOTHREAD = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0x20000000, .hexadecimal); +pub const __WALL = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0x40000000, .hexadecimal); +pub const __WCLONE = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0x80000000, .hexadecimal); +pub inline fn __WEXITSTATUS(status: anytype) @TypeOf((status & @import("std").zig.c_translation.promoteIntLiteral(c_int, 0xff00, .hexadecimal)) >> @as(c_int, 8)) { + return (status & @import("std").zig.c_translation.promoteIntLiteral(c_int, 0xff00, .hexadecimal)) >> @as(c_int, 8); +} +pub inline fn __WTERMSIG(status: anytype) @TypeOf(status & @as(c_int, 0x7f)) { + return status & @as(c_int, 0x7f); +} +pub inline fn __WSTOPSIG(status: anytype) @TypeOf(__WEXITSTATUS(status)) { + return __WEXITSTATUS(status); +} +pub inline fn __WIFEXITED(status: anytype) @TypeOf(__WTERMSIG(status) == @as(c_int, 0)) { + return __WTERMSIG(status) == @as(c_int, 0); +} +pub inline fn __WIFSIGNALED(status: anytype) @TypeOf((@import("std").zig.c_translation.cast(i8, (status & @as(c_int, 0x7f)) + @as(c_int, 1)) >> @as(c_int, 1)) > @as(c_int, 0)) { + return (@import("std").zig.c_translation.cast(i8, (status & @as(c_int, 0x7f)) + @as(c_int, 1)) >> @as(c_int, 1)) > @as(c_int, 0); +} +pub inline fn __WIFSTOPPED(status: anytype) @TypeOf((status & @as(c_int, 0xff)) == @as(c_int, 0x7f)) { + return (status & @as(c_int, 0xff)) == @as(c_int, 0x7f); +} +pub inline fn __WIFCONTINUED(status: anytype) @TypeOf(status == __W_CONTINUED) { + return status == __W_CONTINUED; +} +pub inline fn __WCOREDUMP(status: anytype) @TypeOf(status & __WCOREFLAG) { + return status & __WCOREFLAG; +} +pub inline fn __W_EXITCODE(ret: anytype, sig: anytype) @TypeOf((ret << @as(c_int, 8)) | sig) { + return (ret << @as(c_int, 8)) | sig; +} +pub inline fn __W_STOPCODE(sig: anytype) @TypeOf((sig << @as(c_int, 8)) | @as(c_int, 0x7f)) { + return (sig << @as(c_int, 8)) | @as(c_int, 0x7f); +} +pub const __W_CONTINUED = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0xffff, .hexadecimal); +pub const __WCOREFLAG = @as(c_int, 0x80); +pub inline fn WEXITSTATUS(status: anytype) @TypeOf(__WEXITSTATUS(status)) { + return __WEXITSTATUS(status); +} +pub inline fn WTERMSIG(status: anytype) @TypeOf(__WTERMSIG(status)) { + return __WTERMSIG(status); +} +pub inline fn WSTOPSIG(status: anytype) @TypeOf(__WSTOPSIG(status)) { + return __WSTOPSIG(status); +} +pub inline fn WIFEXITED(status: anytype) @TypeOf(__WIFEXITED(status)) { + return __WIFEXITED(status); +} +pub inline fn WIFSIGNALED(status: anytype) @TypeOf(__WIFSIGNALED(status)) { + return __WIFSIGNALED(status); +} +pub inline fn WIFSTOPPED(status: anytype) @TypeOf(__WIFSTOPPED(status)) { + return __WIFSTOPPED(status); +} +pub inline fn WIFCONTINUED(status: anytype) @TypeOf(__WIFCONTINUED(status)) { + return __WIFCONTINUED(status); +} +pub const __ldiv_t_defined = @as(c_int, 1); +pub const __lldiv_t_defined = @as(c_int, 1); +pub const RAND_MAX = @import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal); +pub const EXIT_FAILURE = @as(c_int, 1); +pub const EXIT_SUCCESS = @as(c_int, 0); +pub const MB_CUR_MAX = __ctype_get_mb_cur_max(); +pub const _SYS_TYPES_H = @as(c_int, 1); +pub const __u_char_defined = ""; +pub const __ino_t_defined = ""; +pub const __dev_t_defined = ""; +pub const __gid_t_defined = ""; +pub const __mode_t_defined = ""; +pub const __nlink_t_defined = ""; +pub const __uid_t_defined = ""; +pub const __pid_t_defined = ""; +pub const __id_t_defined = ""; +pub const __daddr_t_defined = ""; +pub const __key_t_defined = ""; +pub const __clock_t_defined = @as(c_int, 1); +pub const __clockid_t_defined = @as(c_int, 1); +pub const __time_t_defined = @as(c_int, 1); +pub const __timer_t_defined = @as(c_int, 1); +pub const _BITS_STDINT_INTN_H = @as(c_int, 1); +pub const __BIT_TYPES_DEFINED__ = @as(c_int, 1); +pub const _ENDIAN_H = @as(c_int, 1); +pub const _BITS_ENDIAN_H = @as(c_int, 1); +pub const __LITTLE_ENDIAN = @as(c_int, 1234); +pub const __BIG_ENDIAN = @as(c_int, 4321); +pub const __PDP_ENDIAN = @as(c_int, 3412); +pub const _BITS_ENDIANNESS_H = @as(c_int, 1); +pub const __BYTE_ORDER = __LITTLE_ENDIAN; +pub const __FLOAT_WORD_ORDER = __BYTE_ORDER; +pub inline fn __LONG_LONG_PAIR(HI: anytype, LO: anytype) @TypeOf(HI) { + return blk: { + _ = LO; + break :blk HI; + }; +} +pub const LITTLE_ENDIAN = __LITTLE_ENDIAN; +pub const BIG_ENDIAN = __BIG_ENDIAN; +pub const PDP_ENDIAN = __PDP_ENDIAN; +pub const BYTE_ORDER = __BYTE_ORDER; +pub const _BITS_BYTESWAP_H = @as(c_int, 1); +pub inline fn __bswap_constant_16(x: anytype) __uint16_t { + return @import("std").zig.c_translation.cast(__uint16_t, ((x >> @as(c_int, 8)) & @as(c_int, 0xff)) | ((x & @as(c_int, 0xff)) << @as(c_int, 8))); +} +pub inline fn __bswap_constant_32(x: anytype) @TypeOf(((((x & @import("std").zig.c_translation.promoteIntLiteral(c_uint, 0xff000000, .hexadecimal)) >> @as(c_int, 24)) | ((x & @import("std").zig.c_translation.promoteIntLiteral(c_uint, 0x00ff0000, .hexadecimal)) >> @as(c_int, 8))) | ((x & @as(c_uint, 0x0000ff00)) << @as(c_int, 8))) | ((x & @as(c_uint, 0x000000ff)) << @as(c_int, 24))) { + return ((((x & @import("std").zig.c_translation.promoteIntLiteral(c_uint, 0xff000000, .hexadecimal)) >> @as(c_int, 24)) | ((x & @import("std").zig.c_translation.promoteIntLiteral(c_uint, 0x00ff0000, .hexadecimal)) >> @as(c_int, 8))) | ((x & @as(c_uint, 0x0000ff00)) << @as(c_int, 8))) | ((x & @as(c_uint, 0x000000ff)) << @as(c_int, 24)); +} +pub inline fn __bswap_constant_64(x: anytype) @TypeOf(((((((((x & @as(c_ulonglong, 0xff00000000000000)) >> @as(c_int, 56)) | ((x & @as(c_ulonglong, 0x00ff000000000000)) >> @as(c_int, 40))) | ((x & @as(c_ulonglong, 0x0000ff0000000000)) >> @as(c_int, 24))) | ((x & @as(c_ulonglong, 0x000000ff00000000)) >> @as(c_int, 8))) | ((x & @as(c_ulonglong, 0x00000000ff000000)) << @as(c_int, 8))) | ((x & @as(c_ulonglong, 0x0000000000ff0000)) << @as(c_int, 24))) | ((x & @as(c_ulonglong, 0x000000000000ff00)) << @as(c_int, 40))) | ((x & @as(c_ulonglong, 0x00000000000000ff)) << @as(c_int, 56))) { + return ((((((((x & @as(c_ulonglong, 0xff00000000000000)) >> @as(c_int, 56)) | ((x & @as(c_ulonglong, 0x00ff000000000000)) >> @as(c_int, 40))) | ((x & @as(c_ulonglong, 0x0000ff0000000000)) >> @as(c_int, 24))) | ((x & @as(c_ulonglong, 0x000000ff00000000)) >> @as(c_int, 8))) | ((x & @as(c_ulonglong, 0x00000000ff000000)) << @as(c_int, 8))) | ((x & @as(c_ulonglong, 0x0000000000ff0000)) << @as(c_int, 24))) | ((x & @as(c_ulonglong, 0x000000000000ff00)) << @as(c_int, 40))) | ((x & @as(c_ulonglong, 0x00000000000000ff)) << @as(c_int, 56)); +} +pub const _BITS_UINTN_IDENTITY_H = @as(c_int, 1); +pub inline fn htobe16(x: anytype) @TypeOf(__bswap_16(x)) { + return __bswap_16(x); +} +pub inline fn htole16(x: anytype) @TypeOf(__uint16_identity(x)) { + return __uint16_identity(x); +} +pub inline fn be16toh(x: anytype) @TypeOf(__bswap_16(x)) { + return __bswap_16(x); +} +pub inline fn le16toh(x: anytype) @TypeOf(__uint16_identity(x)) { + return __uint16_identity(x); +} +pub inline fn htobe32(x: anytype) @TypeOf(__bswap_32(x)) { + return __bswap_32(x); +} +pub inline fn htole32(x: anytype) @TypeOf(__uint32_identity(x)) { + return __uint32_identity(x); +} +pub inline fn be32toh(x: anytype) @TypeOf(__bswap_32(x)) { + return __bswap_32(x); +} +pub inline fn le32toh(x: anytype) @TypeOf(__uint32_identity(x)) { + return __uint32_identity(x); +} +pub inline fn htobe64(x: anytype) @TypeOf(__bswap_64(x)) { + return __bswap_64(x); +} +pub inline fn htole64(x: anytype) @TypeOf(__uint64_identity(x)) { + return __uint64_identity(x); +} +pub inline fn be64toh(x: anytype) @TypeOf(__bswap_64(x)) { + return __bswap_64(x); +} +pub inline fn le64toh(x: anytype) @TypeOf(__uint64_identity(x)) { + return __uint64_identity(x); +} +pub const _SYS_SELECT_H = @as(c_int, 1); +pub inline fn __FD_ISSET(d: anytype, s: anytype) @TypeOf((__FDS_BITS(s)[__FD_ELT(d)] & __FD_MASK(d)) != @as(c_int, 0)) { + return (__FDS_BITS(s)[__FD_ELT(d)] & __FD_MASK(d)) != @as(c_int, 0); +} +pub const __sigset_t_defined = @as(c_int, 1); +pub const ____sigset_t_defined = ""; +pub const _SIGSET_NWORDS = @as(c_int, 1024) / (@as(c_int, 8) * @import("std").zig.c_translation.sizeof(c_ulong)); +pub const __timeval_defined = @as(c_int, 1); +pub const _STRUCT_TIMESPEC = @as(c_int, 1); +pub const __suseconds_t_defined = ""; +pub const __NFDBITS = @as(c_int, 8) * @import("std").zig.c_translation.cast(c_int, @import("std").zig.c_translation.sizeof(__fd_mask)); +pub inline fn __FD_ELT(d: anytype) @TypeOf(d / __NFDBITS) { + return d / __NFDBITS; +} +pub inline fn __FD_MASK(d: anytype) __fd_mask { + return @import("std").zig.c_translation.cast(__fd_mask, @as(c_ulong, 1) << (d % __NFDBITS)); +} +pub inline fn __FDS_BITS(set: anytype) @TypeOf(set.*.__fds_bits) { + return set.*.__fds_bits; +} +pub const FD_SETSIZE = __FD_SETSIZE; +pub const NFDBITS = __NFDBITS; +pub inline fn FD_SET(fd: anytype, fdsetp: anytype) @TypeOf(__FD_SET(fd, fdsetp)) { + return __FD_SET(fd, fdsetp); +} +pub inline fn FD_CLR(fd: anytype, fdsetp: anytype) @TypeOf(__FD_CLR(fd, fdsetp)) { + return __FD_CLR(fd, fdsetp); +} +pub inline fn FD_ISSET(fd: anytype, fdsetp: anytype) @TypeOf(__FD_ISSET(fd, fdsetp)) { + return __FD_ISSET(fd, fdsetp); +} +pub inline fn FD_ZERO(fdsetp: anytype) @TypeOf(__FD_ZERO(fdsetp)) { + return __FD_ZERO(fdsetp); +} +pub const __blksize_t_defined = ""; +pub const __blkcnt_t_defined = ""; +pub const __fsblkcnt_t_defined = ""; +pub const __fsfilcnt_t_defined = ""; +pub const _BITS_PTHREADTYPES_COMMON_H = @as(c_int, 1); +pub const _THREAD_SHARED_TYPES_H = @as(c_int, 1); +pub const _BITS_PTHREADTYPES_ARCH_H = @as(c_int, 1); +pub const __SIZEOF_PTHREAD_MUTEX_T = @as(c_int, 40); +pub const __SIZEOF_PTHREAD_ATTR_T = @as(c_int, 56); +pub const __SIZEOF_PTHREAD_RWLOCK_T = @as(c_int, 56); +pub const __SIZEOF_PTHREAD_BARRIER_T = @as(c_int, 32); +pub const __SIZEOF_PTHREAD_MUTEXATTR_T = @as(c_int, 4); +pub const __SIZEOF_PTHREAD_COND_T = @as(c_int, 48); +pub const __SIZEOF_PTHREAD_CONDATTR_T = @as(c_int, 4); +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T = @as(c_int, 8); +pub const __SIZEOF_PTHREAD_BARRIERATTR_T = @as(c_int, 4); +pub const __LOCK_ALIGNMENT = ""; +pub const __ONCE_ALIGNMENT = ""; +pub const _THREAD_MUTEX_INTERNAL_H = @as(c_int, 1); +pub const __PTHREAD_MUTEX_HAVE_PREV = @as(c_int, 1); +pub const _RWLOCK_INTERNAL_H = ""; +pub inline fn __PTHREAD_RWLOCK_INITIALIZER(__flags: anytype) @TypeOf(__flags) { + return blk: { + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = @as(c_int, 0); + _ = __PTHREAD_RWLOCK_ELISION_EXTRA; + _ = @as(c_int, 0); + break :blk __flags; + }; +} +pub const __have_pthread_attr_t = @as(c_int, 1); +pub const _ALLOCA_H = @as(c_int, 1); +pub const __COMPAR_FN_T = ""; +pub const _STRING_H = @as(c_int, 1); +pub const _BITS_TYPES_LOCALE_T_H = @as(c_int, 1); +pub const _BITS_TYPES___LOCALE_T_H = @as(c_int, 1); +pub const _STRINGS_H = @as(c_int, 1); +pub const _MATH_H = @as(c_int, 1); +pub const _BITS_LIBM_SIMD_DECL_STUBS_H = @as(c_int, 1); +pub const __DECL_SIMD_cos = ""; +pub const __DECL_SIMD_cosf = ""; +pub const __DECL_SIMD_cosl = ""; +pub const __DECL_SIMD_cosf16 = ""; +pub const __DECL_SIMD_cosf32 = ""; +pub const __DECL_SIMD_cosf64 = ""; +pub const __DECL_SIMD_cosf128 = ""; +pub const __DECL_SIMD_cosf32x = ""; +pub const __DECL_SIMD_cosf64x = ""; +pub const __DECL_SIMD_cosf128x = ""; +pub const __DECL_SIMD_sin = ""; +pub const __DECL_SIMD_sinf = ""; +pub const __DECL_SIMD_sinl = ""; +pub const __DECL_SIMD_sinf16 = ""; +pub const __DECL_SIMD_sinf32 = ""; +pub const __DECL_SIMD_sinf64 = ""; +pub const __DECL_SIMD_sinf128 = ""; +pub const __DECL_SIMD_sinf32x = ""; +pub const __DECL_SIMD_sinf64x = ""; +pub const __DECL_SIMD_sinf128x = ""; +pub const __DECL_SIMD_sincos = ""; +pub const __DECL_SIMD_sincosf = ""; +pub const __DECL_SIMD_sincosl = ""; +pub const __DECL_SIMD_sincosf16 = ""; +pub const __DECL_SIMD_sincosf32 = ""; +pub const __DECL_SIMD_sincosf64 = ""; +pub const __DECL_SIMD_sincosf128 = ""; +pub const __DECL_SIMD_sincosf32x = ""; +pub const __DECL_SIMD_sincosf64x = ""; +pub const __DECL_SIMD_sincosf128x = ""; +pub const __DECL_SIMD_log = ""; +pub const __DECL_SIMD_logf = ""; +pub const __DECL_SIMD_logl = ""; +pub const __DECL_SIMD_logf16 = ""; +pub const __DECL_SIMD_logf32 = ""; +pub const __DECL_SIMD_logf64 = ""; +pub const __DECL_SIMD_logf128 = ""; +pub const __DECL_SIMD_logf32x = ""; +pub const __DECL_SIMD_logf64x = ""; +pub const __DECL_SIMD_logf128x = ""; +pub const __DECL_SIMD_exp = ""; +pub const __DECL_SIMD_expf = ""; +pub const __DECL_SIMD_expl = ""; +pub const __DECL_SIMD_expf16 = ""; +pub const __DECL_SIMD_expf32 = ""; +pub const __DECL_SIMD_expf64 = ""; +pub const __DECL_SIMD_expf128 = ""; +pub const __DECL_SIMD_expf32x = ""; +pub const __DECL_SIMD_expf64x = ""; +pub const __DECL_SIMD_expf128x = ""; +pub const __DECL_SIMD_pow = ""; +pub const __DECL_SIMD_powf = ""; +pub const __DECL_SIMD_powl = ""; +pub const __DECL_SIMD_powf16 = ""; +pub const __DECL_SIMD_powf32 = ""; +pub const __DECL_SIMD_powf64 = ""; +pub const __DECL_SIMD_powf128 = ""; +pub const __DECL_SIMD_powf32x = ""; +pub const __DECL_SIMD_powf64x = ""; +pub const __DECL_SIMD_powf128x = ""; +pub const HUGE_VALF = __builtin_huge_valf(); +pub const INFINITY = __builtin_inff(); +pub const NAN = __builtin_nanf(""); +pub const __GLIBC_FLT_EVAL_METHOD = __FLT_EVAL_METHOD__; +pub const __FP_LOGB0_IS_MIN = @as(c_int, 1); +pub const __FP_LOGBNAN_IS_MIN = @as(c_int, 1); +pub const FP_ILOGB0 = -@import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal) - @as(c_int, 1); +pub const FP_ILOGBNAN = -@import("std").zig.c_translation.promoteIntLiteral(c_int, 2147483647, .decimal) - @as(c_int, 1); +pub inline fn __MATHCALL(function: anytype, suffix: anytype, args: anytype) @TypeOf(__MATHDECL(_Mdouble_, function, suffix, args)) { + return __MATHDECL(_Mdouble_, function, suffix, args); +} +pub inline fn __MATHCALLX(function: anytype, suffix: anytype, args: anytype, attrib: anytype) @TypeOf(__MATHDECLX(_Mdouble_, function, suffix, args, attrib)) { + return __MATHDECLX(_Mdouble_, function, suffix, args, attrib); +} +pub inline fn __MATHDECL_1(@"type": anytype, function: anytype, suffix: anytype, args: anytype) @TypeOf(__MATHDECL_1_IMPL(@"type", function, suffix, args)) { + return __MATHDECL_1_IMPL(@"type", function, suffix, args); +} +pub inline fn __MATHDECL_ALIAS(@"type": anytype, function: anytype, suffix: anytype, args: anytype, alias: anytype) @TypeOf(__MATHDECL_1(@"type", function, suffix, args)) { + _ = alias; + return __MATHDECL_1(@"type", function, suffix, args); +} +pub const _Mdouble_ = f64; +pub inline fn __MATH_PRECNAME(name: anytype, r: anytype) @TypeOf(__CONCAT(name, r)) { + return __CONCAT(name, r); +} +pub const __MATH_DECLARING_DOUBLE = @as(c_int, 1); +pub const __MATH_DECLARING_FLOATN = @as(c_int, 0); +pub const __MATH_DECLARE_LDOUBLE = @as(c_int, 1); +pub inline fn __MATHCALL_NARROW(func: anytype, redir: anytype, nargs: anytype) @TypeOf(__MATHCALL_NARROW_NORMAL(func, nargs)) { + _ = redir; + return __MATHCALL_NARROW_NORMAL(func, nargs); +} +pub inline fn signbit(x: anytype) @TypeOf(__builtin_signbit(x)) { + return __builtin_signbit(x); +} +pub const MATH_ERRNO = @as(c_int, 1); +pub const MATH_ERREXCEPT = @as(c_int, 2); +pub const math_errhandling = MATH_ERRNO | MATH_ERREXCEPT; +pub const M_E = 2.7182818284590452354; +pub const M_LOG2E = 1.4426950408889634074; +pub const M_LOG10E = 0.43429448190325182765; +pub const M_LN2 = 0.69314718055994530942; +pub const M_LN10 = 2.30258509299404568402; +pub const M_PI = 3.14159265358979323846; +pub const M_PI_2 = 1.57079632679489661923; +pub const M_PI_4 = 0.78539816339744830962; +pub const M_1_PI = 0.31830988618379067154; +pub const M_2_PI = 0.63661977236758134308; +pub const M_2_SQRTPI = 1.12837916709551257390; +pub const M_SQRT2 = 1.41421356237309504880; +pub const M_SQRT1_2 = 0.70710678118654752440; +pub inline fn RAYGUI_CLITERAL(name: anytype) @TypeOf(name) { + return name; +} +pub const RICON_SIZE = @as(c_int, 16); +pub const RICON_MAX_ICONS = @as(c_int, 256); +pub const RICON_MAX_NAME_LENGTH = @as(c_int, 32); +pub const RICON_DATA_ELEMENTS = (RICON_SIZE * RICON_SIZE) / @as(c_int, 32); +pub const RAYGUI_MAX_CONTROLS = @as(c_int, 16); +pub const RAYGUI_MAX_PROPS_BASE = @as(c_int, 16); +pub const RAYGUI_MAX_PROPS_EXTENDED = @as(c_int, 8); +pub const WINDOW_STATUSBAR_HEIGHT = @as(c_int, 22); +pub const GROUPBOX_LINE_THICK = @as(c_int, 1); +pub const GROUPBOX_TEXT_PADDING = @as(c_int, 10); +pub const LINE_TEXT_PADDING = @as(c_int, 10); +pub const PANEL_BORDER_WIDTH = @as(c_int, 1); +pub const TOGGLEGROUP_MAX_ELEMENTS = @as(c_int, 32); +pub const VALUEBOX_MAX_CHARS = @as(c_int, 32); +pub const COLORBARALPHA_CHECKED_SIZE = @as(c_int, 10); +pub const MESSAGEBOX_BUTTON_HEIGHT = @as(c_int, 24); +pub const MESSAGEBOX_BUTTON_PADDING = @as(c_int, 10); +pub const TEXTINPUTBOX_BUTTON_HEIGHT = @as(c_int, 24); +pub const TEXTINPUTBOX_BUTTON_PADDING = @as(c_int, 10); +pub const TEXTINPUTBOX_HEIGHT = @as(c_int, 30); +pub const TEXTINPUTBOX_MAX_TEXT_LENGTH = @as(c_int, 256); +pub const GRID_COLOR_ALPHA = @as(f32, 0.15); +pub inline fn BIT_CHECK(a: anytype, b: anytype) @TypeOf(a & (@as(c_int, 1) << b)) { + return a & (@as(c_int, 1) << b); +} +pub inline fn TEXT_VALIGN_PIXEL_OFFSET(h: anytype) @TypeOf(@import("std").zig.c_translation.cast(c_int, h) % @as(c_int, 2)) { + return @import("std").zig.c_translation.cast(c_int, h) % @as(c_int, 2); +} +pub const RICON_TEXT_PADDING = @as(c_int, 4); +pub const TEXTSPLIT_MAX_TEXT_LENGTH = @as(c_int, 1024); +pub const TEXTSPLIT_MAX_TEXT_ELEMENTS = @as(c_int, 128); +pub const __va_list_tag = struct___va_list_tag; +pub const _IO_marker = struct__IO_marker; +pub const _IO_codecvt = struct__IO_codecvt; +pub const _IO_wide_data = struct__IO_wide_data; +pub const _IO_FILE = struct__IO_FILE; +pub const _G_fpos_t = struct__G_fpos_t; +pub const _G_fpos64_t = struct__G_fpos64_t; +pub const timeval = struct_timeval; +pub const timespec = struct_timespec; +pub const __pthread_internal_list = struct___pthread_internal_list; +pub const __pthread_internal_slist = struct___pthread_internal_slist; +pub const __pthread_mutex_s = struct___pthread_mutex_s; +pub const __pthread_rwlock_arch_t = struct___pthread_rwlock_arch_t; +pub const __pthread_cond_s = struct___pthread_cond_s; +pub const random_data = struct_random_data; +pub const drand48_data = struct_drand48_data; +pub const __locale_data = struct___locale_data; +pub const __locale_struct = struct___locale_struct; |
