------------------------------------------------------------------------
--
-- Copyright (c) 2024 - Ognjen 'xolatile' Milan Robovic
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 3 of the License, or
-- (at your option) any later version.
--
-- This file was made by altering original Raylib 5.1 C header file. I
-- used few formatting programs of mine, tho sadly most of the editing
-- was done manually. Contact me if there are license issues, read this
-- file, since this is the documentation.
--
-- Raylib is great game programming library written by 'raysan5' and
-- many contributors, you can check out original C source code in the
-- link below, it's under zlib license. I wrote this because of the
-- lack of good Ada bindings.
--
-- There are minor name changes, and this binding was adapted to Ada
-- programming language. That means that you can't replace few keywords
-- in your C program, and expect that everything works. Aim are new Ada
-- projects. Variadic functions and function pointers were removed.
--
-- https://github.com/raysan5/raylib
--
------------------------------------------------------------------------

with System;

package Raylib is

------------------------------------------------------------------------

   type Logical is new Boolean;
   --
   for Logical'Size use 32;

   type Config_Flags is (
      Flag_None,
      Flag_Fullscreen_Mode,
      Flag_Window_Resizable,
      Flag_Window_Undecorated,
      Flag_Window_Transparent,
      Flag_MSAA_x4_Hint,
      Flag_VSync_Hint,
      Flag_Window_Hidden,
      Flag_Window_Always_Run,
      Flag_Window_Minimized,
      Flag_Window_Maximized,
      Flag_Window_Unfocused,
      Flag_Window_Topmost,
      Flag_Window_High_DPI,
      Flag_Window_Mouse_Passthrough,
      Flag_Borderless_Windowed_Mode,
      Flag_Interlaced_Hint
   ) with Convention => C;

   for Config_Flags use (
      Flag_None                     => 16#00000000#, -- 0
      Flag_Fullscreen_Mode          => 16#00000002#, -- 2
      Flag_Window_Resizable         => 16#00000004#, -- 4
      Flag_Window_Undecorated       => 16#00000008#, -- 8
      Flag_Window_Transparent       => 16#00000010#, -- 16
      Flag_MSAA_x4_Hint             => 16#00000020#, -- 32
      Flag_VSync_Hint               => 16#00000040#, -- 64
      Flag_Window_Hidden            => 16#00000080#, -- 128
      Flag_Window_Always_Run        => 16#00000100#, -- 256
      Flag_Window_Minimized         => 16#00000200#, -- 512
      Flag_Window_Maximized         => 16#00000400#, -- 1024
      Flag_Window_Unfocused         => 16#00000800#, -- 2048
      Flag_Window_Topmost           => 16#00001000#, -- 4096
      Flag_Window_High_DPI          => 16#00002000#, -- 8192
      Flag_Window_Mouse_Passthrough => 16#00004000#, -- 16384
      Flag_Borderless_Windowed_Mode => 16#00008000#, -- 32768
      Flag_Interlaced_Hint          => 16#00010000#  -- 65536
   );

   type Trace_Log_Level is (
      Log_All,
      Log_Trace,
      Log_Debug,
      Log_Info,
      Log_Warning,
      Log_Error,
      Log_Fatal,
      Log_None
   ) with Convention => C;

   type Keyboard_Key is (
      Key_Null,
      Key_Space,
      Key_Apostrophe,
      Key_Comma,
      Key_Minus,
      Key_Period,
      Key_Slash,
      Key_0,
      Key_1,
      Key_2,
      Key_3,
      Key_4,
      Key_5,
      Key_6,
      Key_7,
      Key_8,
      Key_9,
      Key_Semicolon,
      Key_Equal,
      Key_A,
      Key_B,
      Key_C,
      Key_D,
      Key_E,
      Key_F,
      Key_G,
      Key_H,
      Key_I,
      Key_J,
      Key_K,
      Key_L,
      Key_M,
      Key_N,
      Key_O,
      Key_P,
      Key_Q,
      Key_R,
      Key_S,
      Key_T,
      Key_U,
      Key_V,
      Key_W,
      Key_X,
      Key_Y,
      Key_Z,
      Key_Left_Bracket,
      Key_Backslash,
      Key_Right_Bracket,
      Key_Grave,
      Key_Escape,
      Key_Enter,
      Key_Tab,
      Key_Backspace,
      Key_Insert,
      Key_Delete,
      Key_Right,
      Key_Left,
      Key_Down,
      Key_Up,
      Key_Page_Up,
      Key_Page_Down,
      Key_Home,
      Key_End,
      Key_Caps_Lock,
      Key_Scroll_Lock,
      Key_Num_Lock,
      Key_Print_Screen,
      Key_Pause,
      Key_F1,
      Key_F2,
      Key_F3,
      Key_F4,
      Key_F5,
      Key_F6,
      Key_F7,
      Key_F8,
      Key_F9,
      Key_F10,
      Key_F11,
      Key_F12,
      Key_Pad_0,
      Key_Pad_1,
      Key_Pad_2,
      Key_Pad_3,
      Key_Pad_4,
      Key_Pad_5,
      Key_Pad_6,
      Key_Pad_7,
      Key_Pad_8,
      Key_Pad_9,
      Key_Pad_Decimal,
      Key_Pad_Divide,
      Key_Pad_Multiply,
      Key_Pad_Subtract,
      Key_Pad_Add,
      Key_Pad_Enter,
      Key_Pad_Equal,
      Key_Left_Shift,
      Key_Left_Control,
      Key_Left_Alt,
      Key_Left_Super,
      Key_Right_Shift,
      Key_Right_Control,
      Key_Right_Alt,
      Key_Right_Super,
      Key_KB_Menu
   ) with Convention => C;

   for Keyboard_Key use (
      Key_Null          => 0,
      Key_Space         => 32,
      Key_Apostrophe    => 39,
      Key_Comma         => 44,
      Key_Minus         => 45,
      Key_Period        => 46,
      Key_Slash         => 47,
      Key_0             => 48,
      Key_1             => 49,
      Key_2             => 50,
      Key_3             => 51,
      Key_4             => 52,
      Key_5             => 53,
      Key_6             => 54,
      Key_7             => 55,
      Key_8             => 56,
      Key_9             => 57,
      Key_Semicolon     => 59,
      Key_Equal         => 61,
      Key_A             => 65,
      Key_B             => 66,
      Key_C             => 67,
      Key_D             => 68,
      Key_E             => 69,
      Key_F             => 70,
      Key_G             => 71,
      Key_H             => 72,
      Key_I             => 73,
      Key_J             => 74,
      Key_K             => 75,
      Key_L             => 76,
      Key_M             => 77,
      Key_N             => 78,
      Key_O             => 79,
      Key_P             => 80,
      Key_Q             => 81,
      Key_R             => 82,
      Key_S             => 83,
      Key_T             => 84,
      Key_U             => 85,
      Key_V             => 86,
      Key_W             => 87,
      Key_X             => 88,
      Key_Y             => 89,
      Key_Z             => 90,
      Key_Left_Bracket  => 91,
      Key_Backslash     => 92,
      Key_Right_Bracket => 93,
      Key_Grave         => 96,
      Key_Escape        => 256,
      Key_Enter         => 257,
      Key_Tab           => 258,
      Key_Backspace     => 259,
      Key_Insert        => 260,
      Key_Delete        => 261,
      Key_Right         => 262,
      Key_Left          => 263,
      Key_Down          => 264,
      Key_Up            => 265,
      Key_Page_Up       => 266,
      Key_Page_Down     => 267,
      Key_Home          => 268,
      Key_End           => 269,
      Key_Caps_Lock     => 280,
      Key_Scroll_Lock   => 281,
      Key_Num_Lock      => 282,
      Key_Print_Screen  => 283,
      Key_Pause         => 284,
      Key_F1            => 290,
      Key_F2            => 291,
      Key_F3            => 292,
      Key_F4            => 293,
      Key_F5            => 294,
      Key_F6            => 295,
      Key_F7            => 296,
      Key_F8            => 297,
      Key_F9            => 298,
      Key_F10           => 299,
      Key_F11           => 300,
      Key_F12           => 301,
      Key_Pad_0         => 320,
      Key_Pad_1         => 321,
      Key_Pad_2         => 322,
      Key_Pad_3         => 323,
      Key_Pad_4         => 324,
      Key_Pad_5         => 325,
      Key_Pad_6         => 326,
      Key_Pad_7         => 327,
      Key_Pad_8         => 328,
      Key_Pad_9         => 329,
      Key_Pad_Decimal   => 330,
      Key_Pad_Divide    => 331,
      Key_Pad_Multiply  => 332,
      Key_Pad_Subtract  => 333,
      Key_Pad_Add       => 334,
      Key_Pad_Enter     => 335,
      Key_Pad_Equal     => 336,
      Key_Left_Shift    => 340,
      Key_Left_Control  => 341,
      Key_Left_Alt      => 342,
      Key_Left_Super    => 343,
      Key_Right_Shift   => 344,
      Key_Right_Control => 345,
      Key_Right_Alt     => 346,
      Key_Right_Super   => 347,
      Key_KB_Menu       => 348
   );

   type Mouse_Button is (
      Mouse_Button_Left,
      Mouse_Button_Right,
      Mouse_Button_Middle,
      Mouse_Button_Side,
      Mouse_Button_Extra,
      Mouse_Button_Forward,
      Mouse_Button_Back
   ) with Convention => C;

   type Mouse_Cursor is (
      Mouse_Cursor_Default,
      Mouse_Cursor_Arrow,
      Mouse_Cursor_Ibeam,
      Mouse_Cursor_Crosshair,
      Mouse_Cursor_Pointing_Hand,
      Mouse_Cursor_Resize_EW,
      Mouse_Cursor_Resize_NS,
      Mouse_Cursor_Resize_NWSE,
      Mouse_Cursor_Resize_NESW,
      Mouse_Cursor_Resize_All,
      Mouse_Cursor_Not_Allowed
   ) with Convention => C;

   type Gamepad_Button is (
      Gamepad_Button_Unknown,
      Gamepad_Button_Left_Face_Up,
      Gamepad_Button_Left_Face_Right,
      Gamepad_Button_Left_Face_Down,
      Gamepad_Button_Left_Face_Left,
      Gamepad_Button_Right_Face_Up,
      Gamepad_Button_Right_Face_Right,
      Gamepad_Button_Right_Face_Down,
      Gamepad_Button_Right_Face_Left,
      Gamepad_Button_Left_Trigger_1,
      Gamepad_Button_Left_Trigger_2,
      Gamepad_Button_Right_Trigger_1,
      Gamepad_Button_Right_Trigger_2,
      Gamepad_Button_Middle_Left,
      Gamepad_Button_Middle,
      Gamepad_Button_Middle_Right,
      Gamepad_Button_Left_Thumb,
      Gamepad_Button_Right_Thumb
   ) with Convention => C;

   type Gamepad_Axis is (
      Gamepad_Axis_Left_X,
      Gamepad_Axis_Left_Y,
      Gamepad_Axis_Right_X,
      Gamepad_Axis_Right_Y,
      Gamepad_Axis_Left_Trigger,
      Gamepad_Axis_Right_Trigger
   ) with Convention => C;

   type Material_Map_Index is (
      Material_Map_Diffuse,
      Material_Map_Specular,
      Material_Map_Normal,
      Material_Map_Roughness,
      Material_Map_Occlusion,
      Material_Map_Emission,
      Material_Map_Height,
      Material_Map_Cubemap,
      Material_Map_Irradiance,
      Material_Map_Prefilter,
      Material_Map_BRDF
   ) with Convention => C;

   type Shader_Location_Index is (
      Shader_Location_Vertex_Position,
      Shader_Location_Vertex_Texcoord_1,
      Shader_Location_Vertex_Texcoord_2,
      Shader_Location_Vertex_Normal,
      Shader_Location_Vertex_Tangent,
      Shader_Location_Vertex_Color,
      Shader_Location_Matrix_MVP,
      Shader_Location_Matrix_View,
      Shader_Location_Matrix_Projection,
      Shader_Location_Matrix_Model,
      Shader_Location_Matrix_Normal,
      Shader_Location_Vector_View,
      Shader_Location_Color_Diffuse,
      Shader_Location_Color_Specular,
      Shader_Location_Color_Ambient,
      Shader_Location_Map_Diffuse,
      Shader_Location_Map_Specular,
      Shader_Location_Map_Normal,
      Shader_Location_Map_Roughness,
      Shader_Location_Map_Occlusion,
      Shader_Location_Map_Emission,
      Shader_Location_Map_Height,
      Shader_Location_Map_Cubemap,
      Shader_Location_Map_Irradiance,
      Shader_Location_Map_Prefilter,
      Shader_Location_Map_BRDF
   ) with Convention => C;

   type Shader_Uniform_Data_Type is (
      Shader_Uniform_FLOAT,
      Shader_Uniform_VEC2,
      Shader_Uniform_VEC3,
      Shader_Uniform_VEC4,
      Shader_Uniform_INT,
      Shader_Uniform_IVEC2,
      Shader_Uniform_IVEC3,
      Shader_Uniform_IVEC4,
      Shader_Uniform_SAMPLER2D
   ) with Convention => C;

   type Shader_Attribute_Data_Type is (
      Shader_Attribute_FLOAT,
      Shader_Attribute_VEC2,
      Shader_Attribute_VEC3,
      Shader_Attribute_VEC4
   ) with Convention => C;

   type Pixel_Format is (
      Pixel_Format_None,
      Pixel_Format_Uncompressed_Grayscale,
      Pixel_Format_Uncompressed_Gray_Alpha,
      Pixel_Format_Uncompressed_R5G6B5,
      Pixel_Format_Uncompressed_R8G8B8,
      Pixel_Format_Uncompressed_R5G5B5A1,
      Pixel_Format_Uncompressed_R4G4B4A4,
      Pixel_Format_Uncompressed_R8G8B8A8,
      Pixel_Format_Uncompressed_R32,
      Pixel_Format_Uncompressed_R32G32B32,
      Pixel_Format_Uncompressed_R32G32B32A32,
      Pixel_Format_Uncompressed_R16,
      Pixel_Format_Uncompressed_R16G16B16,
      Pixel_Format_Uncompressed_R16G16B16A16,
      Pixel_Format_Compressed_DXT1_RGB,
      Pixel_Format_Compressed_DXT1_RGBA,
      Pixel_Format_Compressed_DXT3_RGBA,
      Pixel_Format_Compressed_DXT5_RGBA,
      Pixel_Format_Compressed_ETC1_RGB,
      Pixel_Format_Compressed_ETC2_RGB,
      Pixel_Format_Compressed_ETC2_EAC_RGBA,
      Pixel_Format_Compressed_PVRT_RGB,
      Pixel_Format_Compressed_PVRT_RGBA,
      Pixel_Format_Compressed_ASTC_4x4_RGBA,
      Pixel_Format_Compressed_ASTC_8x8_RGBA
   ) with Convention => C;

   type Texture_Filter is (
      Texture_Filter_Point,
      Texture_Filter_Bilinear,
      Texture_Filter_Trilinear,
      Texture_Filter_Anisotropic_x4,
      Texture_Filter_Anisotropic_x8,
      Texture_Filter_Anisotropic_x16
   ) with Convention => C;

   type Texture_Wrap is (
      Texture_Wrap_Repeat,
      Texture_Wrap_Clamp,
      Texture_Wrap_Mirror_Repeat,
      Texture_Wrap_Mirror_Clamp
   ) with Convention => C;

   type Cubemap_Layout is (
      Cubemap_Layout_Auto_Detect,
      Cubemap_Layout_Line_Vertical,
      Cubemap_Layout_Line_Horizontal,
      Cubemap_Layout_Cross_3_By_4,
      Cubemap_Layout_Cross_4_By_3,
      Cubemap_Layout_Panorama
   ) with Convention => C;

   type Font_Type is (
      Font_Default,
      Font_Bitmap,
      Font_SDF
   ) with Convention => C;

   type Blend_Mode is (
      Blend_Alpha,
      Blend_Additive,
      Blend_Multiplied,
      Blend_Add_Colors,
      Blend_Subtract_Colors,
      Blend_Alpha_Premultiply,
      Blend_Custom,
      Blend_Custom_Separate
   ) with Convention => C;

   type Gesture is (
      Gesture_None,
      Gesture_Tap,
      Gesture_Doubletap,
      Gesture_Hold,
      Gesture_Drag,
      Gesture_Swipe_Right,
      Gesture_Swipe_Left,
      Gesture_Swipe_Up,
      Gesture_Swipe_Down,
      Gesture_Pinch_In,
      Gesture_Pinch_Out
   ) with Convention => C;

   for Gesture use (
      Gesture_None        => 2#0000000000#, --   0
      Gesture_Tap         => 2#0000000001#, --   1
      Gesture_Doubletap   => 2#0000000010#, --   2
      Gesture_Hold        => 2#0000000100#, --   4
      Gesture_Drag        => 2#0000001000#, --   8
      Gesture_Swipe_Right => 2#0000010000#, --  16
      Gesture_Swipe_Left  => 2#0000100000#, --  32
      Gesture_Swipe_Up    => 2#0001000000#, --  64
      Gesture_Swipe_Down  => 2#0010000000#, -- 128
      Gesture_Pinch_In    => 2#0100000000#, -- 256
      Gesture_Pinch_Out   => 2#1000000000#  -- 512
   );

   type Camera_Mode is (
      Camera_Custom,
      Camera_Free,
      Camera_Orbital,
      Camera_First_Person,
      Camera_Third_Person
   ) with Convention => C;

   type Camera_Projection is (
      Camera_Perspective,
      Camera_Orthographic
   ) with Convention => C;

   type NPatch_Layout is (
      NPatch_Nine_Patch,
      NPatch_Three_Patch_Vertical,
      NPatch_Three_Patch_Horizontal
   ) with Convention => C;

------------------------------------------------------------------------

   type Color_Range is range 0 .. 2**8  - 1;
   type Index_Range is range 0 .. 2**16 - 1;

   for Color_Range'Size use 8;
   for Index_Range'Size use 16;

   type Pointer is access all System.Address;
   type Strings is access all Character;

   type Vector_2D is record
      X : Float := 0.0;
      Y : Float := 0.0;
   end record with Convention => C_Pass_By_Copy;

   type Vector_3D is record
      X : Float := 0.0;
      Y : Float := 0.0;
      Z : Float := 0.0;
   end record with Convention => C_Pass_By_Copy;

   type Vector_4D is record
      X : Float := 0.0;
      Y : Float := 0.0;
      Z : Float := 0.0;
      W : Float := 0.0;
   end record with Convention => C_Pass_By_Copy;

   type Quaternion is new Vector_4D;

   type Matrix_4D is record
      M00 : Float := 1.0;
      M10 : Float := 0.0;
      M20 : Float := 0.0;
      M30 : Float := 0.0;
      M01 : Float := 0.0;
      M11 : Float := 1.0;
      M21 : Float := 0.0;
      M31 : Float := 0.0;
      M02 : Float := 0.0;
      M12 : Float := 0.0;
      M22 : Float := 1.0;
      M32 : Float := 0.0;
      M03 : Float := 0.0;
      M13 : Float := 0.0;
      M23 : Float := 0.0;
      M33 : Float := 1.0;
   end record with Convention => C_Pass_By_Copy;

   Id_Matrix : Matrix_4D;

   type Color is record
      R : Color_Range := 255;
      G : Color_Range := 255;
      B : Color_Range := 255;
      A : Color_Range := 255;
   end record with Convention => C_Pass_By_Copy;

   No_Color : Color;

   type Rectangle is record
      X      : Float := 0.0;
      Y      : Float := 0.0;
      Width  : Float := 0.0;
      Height : Float := 0.0;
   end record with Convention => C_Pass_By_Copy;

   No_Rectangle : Rectangle;

   type Image is record
      Data    : Pointer      := null;
      Width   : Integer      := 0;
      Height  : Integer      := 0;
      Mipmaps : Integer      := 1;
      Format  : Pixel_Format := Pixel_Format_None;
   end record with Convention => C_Pass_By_Copy;

   No_Image : Image;

   type Texture is record
      Id      : Natural      := 0;
      Width   : Integer      := 0;
      Height  : Integer      := 0;
      Mipmaps : Integer      := 1;
      Format  : Pixel_Format := Pixel_Format_None;
   end record with Convention => C_Pass_By_Copy;

   No_Texture : Texture;

   type Render_Texture is record
      Id    : Natural := 0;
      Data  : Texture := No_Texture;
      Depth : Texture := No_Texture;
   end record with Convention => C_Pass_By_Copy;

   No_Render_Texture : Render_Texture;

   type NPatch_Info is record
      Source : Rectangle     := No_Rectangle;
      Left   : Integer       := 0;
      Top    : Integer       := 0;
      Right  : Integer       := 0;
      Bottom : Integer       := 0;
      Layout : NPatch_Layout := NPatch_Nine_Patch;
   end record with Convention => C_Pass_By_Copy;

   No_NPatch_Info : NPatch_Info;

   type Glyph_Info is record
      Value     : Integer := 0;
      Offset_X  : Integer := 0;
      Offset_Y  : Integer := 0;
      Advance_X : Integer := 0;
      Data      : Image   := No_Image;
   end record with Convention => C_Pass_By_Copy;

   No_Glyph_Info : Glyph_Info;

   type Font is record
      Base_Size     :        Integer    := 0;
      Glyph_Count   :        Integer    := 0;
      Glyph_Padding :        Integer    := 0;
      Data          :        Texture    := No_Texture;
      Rectangles    : access Rectangle  := null;
      Glyphs        : access Glyph_Info := null;
   end record with Convention => C_Pass_By_Copy;

   No_Font : Font;

   type Camera_3D is record
      Position      : Vector_3D         := (others => 0.0);
      Target        : Vector_3D         := (others => 0.0);
      Up            : Vector_3D         := (others => 0.0);
      Field_Of_View : Float             := 0.0;
      Projection    : Camera_Projection := Camera_Perspective;
   end record with Convention => C_Pass_By_Copy;

   No_Camera_3D : Camera_3D;

   type Camera_2D is record
      Offset   : Vector_2D := (others => 0.0);
      Target   : Vector_2D := (others => 0.0);
      Rotation : Float     := 0.0;
      Zoom     : Float     := 0.0;
   end record with Convention => C_Pass_By_Copy;

   No_Camera_2D : Camera_2D;

   type Mesh is record
      Vertex_Count          :        Integer     := 0;
      Triangle_Count        :        Integer     := 0;
      Vertices              : access Float       := null;
      Texture_Coordinates   : access Float       := null;
      Texture_Coordinates_2 : access Float       := null;
      Normals               : access Float       := null;
      Tangents              : access Float       := null;
      Colors                : access Color_Range := null;
      Indices               : access Index_Range := null;
      Animation_Vertices    : access Float       := null;
      Animation_Normals     : access Float       := null;
      Bone_Ids              : access Color_Range := null;
      Bone_Weights          : access Float       := null;
      VAO_Id                :        Natural     := 0;
      VBO_Id                : access Natural     := null;
   end record with Convention => C_Pass_By_Copy;

   No_Mesh : Mesh;

   type Shader is record
      Id        :        Natural := 0;
      Locations : access Integer := null;
   end record with Convention => C_Pass_By_Copy;

   No_Shader : Shader;

   type Material_Map is record
      Data  : Texture := No_Texture;
      Tint  : Color   := No_Color;
      Value : Float   := 0.0;
   end record with Convention => C_Pass_By_Copy;

   No_Material_Map : Material_Map;

   type Float_Array_4        is array (0 .. 3) of Float;
   type Material_Map_Array_4 is array (0 .. 3) of Material_Map;

   type Material_Map_Array is array (Natural range <>) of Material_Map;

   type Material is record
      Data      :        Shader             := No_Shader;
      Maps      : access Material_Map_Array := null;
      Parameter :        Float_Array_4      := (0.0, 0.0, 0.0, 1.0);
   end record with Convention => C_Pass_By_Copy;

   No_Material : Material;

   type Transform is record
      Translation : Vector_3D := (others => 0.0);
      Rotation    : Vector_4D := (others => 0.0);
      Scale       : Vector_3D := (others => 0.0);
   end record with Convention => C_Pass_By_Copy;

   No_Transform : Transform;

   type Character_Array_32 is array (0 .. 31) of Character;

   Empty : Character_Array_32 := (others => Character'Val (0));

   type Bone_Info is record
      Name   : Character_Array_32 := Empty;
      Parent : Integer            := 0;
   end record with Convention => C_Pass_By_Copy;

   No_Bone_Info : Bone_Info;

   type Material_Array_4 is array (0 .. 3) of Material;
   type Material_Array is array (Natural range <>) of Material;

   type Model is record
      Transform      :        Matrix_4D      := Id_Matrix;
      Mesh_Count     :        Integer        := 0;
      Material_Count :        Integer        := 0;
      Meshes         : access Mesh           := null;
      Materials      : access Material_Array := null;
      Mesh_Materials : access Integer        := null;
      Bone_Count     :        Integer        := 0;
      Bones          : access Bone_Info      := null;
      -- ERROR Bind_Post      : access Transform      := null;
   end record with Convention => C_Pass_By_Copy;

   No_Model : Model;

   type Model_Animation is record
      Bone_Count  :        Integer            := 0;
      Frame_Count :        Integer            := 0;
      Bones       : access Bone_Info          := null;
      Frame_Poses : access Transform          := null;
      Name        :        Character_Array_32 := Empty;
   end record with Convention => C_Pass_By_Copy;

   No_Model_Animation : Model_Animation;

   type Ray is record
      Position  : Vector_3D := (others => 0.0);
      Direction : Vector_3D := (others => 0.0);
   end record with Convention => C_Pass_By_Copy;

   No_Ray : Ray;

   type Ray_Collision is record
      Hit      : Logical   := False;
      Distance : Float     := 0.0;
      Point    : Vector_3D := (others => 0.0);
      Normal   : Vector_3D := (others => 0.0);
   end record with Convention => C_Pass_By_Copy;

   No_Ray_Collision : Ray_Collision;

   type Bounding_Box is record
      Min : Vector_3D := (others => 0.0);
      Max : Vector_3D := (others => 0.0);
   end record with Convention => C_Pass_By_Copy;

   No_Bounding_Box : Bounding_Box;

   type Wave is record
      Frame_Count : Natural := 0;
      Sample_Rate : Natural := 0;
      Sample_Size : Natural := 0;
      Channels    : Natural := 0;
      Data        : Pointer := null;
   end record with Convention => C_Pass_By_Copy;

   No_Wave : Wave;

   type Audio_Stream is record
      Buffer      : Pointer := null;
      Processor   : Pointer := null;
      Sample_Rate : Natural := 0;
      Sample_Size : Natural := 0;
      Channels    : Natural := 0;
   end record with Convention => C_Pass_By_Copy;

   No_Audio_Stream : Audio_Stream;

   type Sound is record
      Stream      : Audio_Stream := No_Audio_Stream;
      Frame_Count : Natural      := 0;
   end record with Convention => C_Pass_By_Copy;

   No_Sound : Sound;

   type Music is record
      Stream       : Audio_Stream := No_Audio_Stream;
      Frame_Count  : Natural      := 0;
      Looping      : Logical      := False;
      Context_Type : Integer      := 0;
      Context_Data : Pointer      := null;
   end record with Convention => C_Pass_By_Copy;

   No_Music : Music;

   type VR_Device_Info is record
      Horizontal_Resoultion        : Integer       := 0;
      Vertical_Resoultion          : Integer       := 0;
      Horizontal_Screen_Size       : Float         := 0.0;
      Vertical_Screen_Size         : Float         := 0.0;
      Vertical_Screen_Center       : Float         := 0.0;
      Eye_To_Screen_Distance       : Float         := 0.0;
      Lens_Separate_Distance       : Float         := 0.0;
      Interpupillary_Distance      : Float         := 0.0;
      Lens_Distortion_Values       : Float_Array_4 := (others => 0.0);
      Chroma_Abberation_Correction : Float_Array_4 := (others => 0.0);
   end record with Convention => C_Pass_By_Copy;

   No_VR_Device_Info : VR_Device_Info;

   type Matrix_4D_Array_2 is array (0 .. 1) of Matrix_4D;
   type Float_Array_2     is array (0 .. 1) of Float;

   type VR_Stereo_Config is record
      Projection          : Matrix_4D_Array_2 := (Id_Matrix, Id_Matrix);
      View_Offset         : Matrix_4D_Array_2 := (Id_Matrix, Id_Matrix);
      Left_Lens_Center    : Float_Array_2     := (others => 0.0);
      Right_Lens_Center   : Float_Array_2     := (others => 0.0);
      Left_Screen_Center  : Float_Array_2     := (others => 0.0);
      Right_Screen_Center : Float_Array_2     := (others => 0.0);
      Scale               : Float_Array_2     := (others => 0.0);
      Scale_In            : Float_Array_2     := (others => 0.0);
   end record with Convention => C_Pass_By_Copy;

   No_VR_Stereo_Config : VR_Stereo_Config;

   type File_Path_List is record
      Capacity : Natural := 0;
      Count    : Natural := 0;
      Paths    : Pointer := null;
   end record with Convention => C_Pass_By_Copy;

   No_File_Path_List : File_Path_List;

   type Integer_Array_4 is array (0 .. 3) of Integer;

   type Automation_Event is record
      Frame      : Natural         := 0;
      Kind       : Natural         := 0;
      Parameters : Integer_Array_4 := (others => 0);
   end record with Convention => C_Pass_By_Copy;

   No_Automation_Event : Automation_Event;

   type Automation_Event_List is record
      Capacity :        Natural          := 0;
      Count    :        Natural          := 0;
      Events   : access Automation_Event := null;
   end record with Convention => C_Pass_By_Copy;

   No_Automation_Event_List : Automation_Event_List;

------------------------------------------------------------------------

   Version_Major :         constant Integer := 5;
   Version_Minor :         constant Integer := 1;
   Version_Patch :         constant Integer := 0;
   Version       : aliased constant String  := "5.1-dev";

   Pi               : constant Float := 3.14159265358979323846;
   Tau              : constant Float := 2.0 * Pi;
   Degree_To_Radius : constant Float := Pi / 180.0;
   Radius_To_Degree : constant Float := 180.0 / Pi;

   Light_Gray  : constant Color := (200, 200, 200, 255);
   Gray        : constant Color := (130, 130, 130, 255);
   Dark_Gray   : constant Color := (80,  80,  80,  255);
   Yellow      : constant Color := (253, 249, 0,   255);
   Gold        : constant Color := (255, 203, 0,   255);
   Orange      : constant Color := (255, 161, 0,   255);
   Pink        : constant Color := (255, 109, 194, 255);
   Red         : constant Color := (230, 41,  55,  255);
   Maroon      : constant Color := (190, 33,  55,  255);
   Green       : constant Color := (0,   228, 48,  255);
   Lime        : constant Color := (0,   158, 47,  255);
   Dark_Green  : constant Color := (0,   117, 44,  255);
   Sky_Blue    : constant Color := (102, 191, 255, 255);
   Blue        : constant Color := (0,   121, 241, 255);
   Dark_Blue   : constant Color := (0,   82,  172, 255);
   Purple      : constant Color := (200, 122, 255, 255);
   Violet      : constant Color := (135, 60,  190, 255);
   Dark_Purple : constant Color := (112, 31,  126, 255);
   Beige       : constant Color := (211, 176, 131, 255);
   Brown       : constant Color := (127, 106, 79,  255);
   Dark_Brown  : constant Color := (76,  63,  47,  255);
   White       : constant Color := (255, 255, 255, 255);
   Black       : constant Color := (0,   0,   0,   255);
   Blank       : constant Color := (0,   0,   0,   0  );
   Magenta     : constant Color := (255, 0,   255, 255);
   Ray_White   : constant Color := (245, 245, 245, 255);

------------------------------------------------------------------------

   procedure Open_Window (
      Width  : Integer := 640;
      Height : Integer := 480;
      Title  : String  := "Raylib-Ada" & Character'Val (0)
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "InitWindow";

   procedure Close_Window with
      Import        => True,
      Convention    => C,
      External_Name => "CloseWindow";

   function Window_Should_Close return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "WindowShouldClose";

   function Is_Window_Ready return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowReady";

   function Is_Window_Fullscreen return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowFullscreen";

   function Is_Window_Hidden return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowHidden";

   function Is_Window_Minimized return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowMinimized";

   function Is_Window_Maximized return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowMaximized";

   function Is_Window_Focused return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowFocused";

   function Is_Window_Resized return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowResized";

   function Is_Window_State (
      Flags : Natural := 0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWindowState";

   procedure Set_Window_State (
      Flags : Natural := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowState";

   procedure Clear_Window_State (
      Flags : Natural := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ClearWindowState";

   procedure Toggle_Fullscreen with
      Import        => True,
      Convention    => C,
      External_Name => "ToggleFullscreen";

   procedure Toggle_Borderless_Windowed with
      Import        => True,
      Convention    => C,
      External_Name => "ToggleBorderlessWindowed";

   procedure Maximize_Window with
      Import        => True,
      Convention    => C,
      External_Name => "MaximizeWindow";

   procedure Minimize_Window with
      Import        => True,
      Convention    => C,
      External_Name => "MinimizeWindow";

   procedure Restore_Window with
      Import        => True,
      Convention    => C,
      External_Name => "RestoreWindow";

   procedure Set_Window_Icon (
      Icon : Image := No_Image
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowIcon";

   procedure Set_Window_Icons (
      Icons : access Image   := null;
      Count :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowIcons";

   procedure Set_Window_Title (
      Title : String := ""
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowTitle";

   procedure Set_Window_Position (
      X : Integer := 0;
      Y : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowPosition";

   procedure Set_Window_Monitor (
      Monitor : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowMonitor";

   procedure Set_Window_Min_Size (
      Width  : Integer := 0;
      Height : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowMinSize";

   procedure Set_Window_Max_Size (
      Width  : Integer := 0;
      Height : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowMaxSize";

   procedure Set_Window_Size (
      Width  : Integer := 0;
      Height : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowSize";

   procedure Set_WindowZ_Opacity (
      Opacity : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowOpacity";

   procedure Set_Window_Focused with
      Import        => True,
      Convention    => C,
      External_Name => "SetWindowFocused";

   function Get_Window_Handle return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "GetWindowHandle";

   function Get_Screen_Width return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetScreenWidth";

   function Get_Screen_Height return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetScreenHeight";

   function Get_Render_Width return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetRenderWidth";

   function Get_Render_Height return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetRenderHeight";

   function Get_Monitor_Count return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorCount";

   function Get_Current_Monitor return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetCurrentMonitor";

   function Get_Monitor_Position (
      Monitor : Integer := 0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorPosition";

   function Get_Monitor_Width (
      Monitor : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorWidth";

   function Get_Monitor_Height (
      Monitor : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorHeight";

   function Get_Monitor_Physical_Width (
      Monitor : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorPhysicalWidth";

   function Get_Monitor_Physical_Height (
      Monitor : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorPhysicalHeight";

   function Get_Monitor_Refresh_Rate (
      Monitor : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorRefreshRate";

   function Get_Window_Position return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetWindowPosition";

   function Get_Window_Scale_DPI return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetWindowScaleDPI";

   function Get_Monitor_Name (
      Monitor : Integer := 0
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetMonitorName";

   procedure Set_Clipboard_Text (
      Text : String := ""
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetClipboardText";

   function Get_Clipboard_Text return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetClipboardText";

   procedure Enable_Event_Waiting with
      Import        => True,
      Convention    => C,
      External_Name => "EnableEventWaiting";

   procedure Disable_Event_Waiting with
      Import        => True,
      Convention    => C,
      External_Name => "DisableEventWaiting";

   procedure Show_Cursor with
      Import        => True,
      Convention    => C,
      External_Name => "ShowCursor";

   procedure Hide_Cursor with
      Import        => True,
      Convention    => C,
      External_Name => "HideCursor";

   function Is_Cursor_Hidden return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsCursorHidden";

   procedure Enable_Cursor with
      Import        => True,
      Convention    => C,
      External_Name => "EnableCursor";

   procedure Disable_Cursor with
      Import        => True,
      Convention    => C,
      External_Name => "DisableCursor";

   function Is_Cursor_On_Screen return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsCursorOnScreen";

   procedure Clear_Background (
      Tint : Color := Ray_White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ClearBackground";

   procedure Begin_Drawing with
      Import        => True,
      Convention    => C,
      External_Name => "BeginDrawing";

   procedure End_Drawing with
      Import        => True,
      Convention    => C,
      External_Name => "EndDrawing";

   procedure Begin_Mode_2D (
      Camera : Camera_2D
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginMode2D";

   procedure End_Mode_2D with
      Import        => True,
      Convention    => C,
      External_Name => "EndMode2D";

   procedure Begin_Mode_3D (
      Camera : Camera_3D
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginMode3D";

   procedure End_Mode_3D with
      Import        => True,
      Convention    => C,
      External_Name => "EndMode3D";

   procedure Begin_Texture_Mode (
      Data : Render_Texture := No_Render_Texture
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginTextureMode";

   procedure End_Texture_Mode with
      Import        => True,
      Convention    => C,
      External_Name => "EndTextureMode";

   procedure Begin_Shader_Mode (
      Data : Shader := No_Shader
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginShaderMode";

   procedure End_Shader_Mode with
      Import        => True,
      Convention    => C,
      External_Name => "EndShaderMode";

   procedure Begin_Blend_Mode (
      Mode : Blend_Mode := Blend_Alpha
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginBlendMode";

   procedure End_Blend_Mode with
      Import        => True,
      Convention    => C,
      External_Name => "EndBlendMode";

   procedure Begin_Scissor_Mode (
      X      : Integer := 0;
      Y      : Integer := 0;
      Width  : Integer := 0;
      Height : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginScissorMode";

   procedure End_Scissor_Mode with
      Import        => True,
      Convention    => C,
      External_Name => "EndScissorMode";

   procedure Begin_VR_Stereo_Mode (
      Config : VR_Stereo_Config := No_VR_Stereo_Config
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "BeginVrStereoMode";

   procedure End_VR_Stereo_Mode with
      Import        => True,
      Convention    => C,
      External_Name => "EndVrStereoMode";

   function Load_VR_Stereo_Config (
      Device : VR_Device_Info := No_VR_Device_Info
   ) return VR_Stereo_Config with
      Import        => True,
      Convention    => C,
      External_Name => "LoadVrStereoConfig";

   procedure Unload_VR_Stereo_Config (
      Config : VR_Stereo_Config := No_VR_Stereo_Config
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadVrStereoConfig";

   function Load_Shader (
      Vertex_Shader_File_Path   : String := "";
      Fragment_Shader_File_Path : String := ""
   ) return Shader with
      Import        => True,
      Convention    => C,
      External_Name => "LoadShader";

   function Load_Shader_From_Memory (
      Vertex_Shader_Code_Path   : String := "";
      Fragment_Shader_Code_Path : String := ""
   ) return Shader with
      Import        => True,
      Convention    => C,
      External_Name => "LoadShaderFromMemory";

   function Is_Shader_Ready (
      Data : Shader := No_Shader
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsShaderReady";

   function Get_Shader_Location (
      Data : Shader := No_Shader;
      Name : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetShaderLocation";

   function Get_Shader_Location_Attribute (
      Data : Shader := No_Shader;
      Name : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetShaderLocationAttrib";

   procedure Set_Shader_Value (
      Data           : Shader  := No_Shader;
      Location_Index : Integer := 0;
      Value          : Pointer := null;
      Uniform_Type   : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetShaderValue";

   procedure Set_Shader_Value_Vector (
      Data           : Shader  := No_Shader;
      Location_Index : Integer := 0;
      Value          : Pointer := null;
      Uniform_Type   : Integer := 0;
      Count          : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetShaderValueV";

   procedure Set_Shader_Value_Matrix (
      Data           : Shader    := No_Shader;
      Location_Index : Integer   := 0;
      Value          : Matrix_4D := Id_Matrix
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetShaderValueMatrix";

   procedure Set_Shader_Value_Texture (
      Data           : Shader  := No_Shader;
      Location_Index : Integer := 0;
      Value          : Texture := No_Texture
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetShaderValueTexture";

   procedure Unload_Shader (
      Data : Shader := No_Shader
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadShader";

   function Get_Mouse_Ray (
      Mouse_Position : Vector_2D := (others => 0.0);
      Camera         : Camera_3D := No_Camera_3D
   ) return Ray with
      Import        => True,
      Convention    => C,
      External_Name => "GetMouseRay";

   function Get_Camera_Matrix_3D (
      Camera : Camera_3D := No_Camera_3D
   ) return Matrix_4D with
      Import        => True,
      Convention    => C,
      External_Name => "GetCameraMatrix";

   function Get_Camera_Matrix_2D (
      Camera : Camera_2D := No_Camera_2D
   ) return Matrix_4D with
      Import        => True,
      Convention    => C,
      External_Name => "GetCameraMatrix2D";

   function Get_World_To_Screen_3D (
      Position : Vector_3D := (others => 0.0);
      Camera   : Camera_3D := No_Camera_3D
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetWorldToScreen";

   function Get_Screen_To_World_2D (
      Position : Vector_2D := (others => 0.0);
      Camera   : Camera_2D := No_Camera_2D
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetScreenToWorld2D";

   function Get_World_To_Screen_Ex (
      Position : Vector_3D := (others => 0.0);
      Camera   : Camera_3D := No_Camera_3D;
      Width    : Integer   := 0;
      Height   : Integer   := 0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetWorldToScreenEx";

   function Get_World_To_Screen_2D (
      Position : Vector_2D := (others => 0.0);
      Camera   : Camera_2D := No_Camera_2D
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetWorldToScreen2D";

   procedure Set_Target_FPS (
      FPS : Integer := 60
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetTargetFPS";

   function Get_Frame_Time return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetFrameTime";

   function Get_Time return Long_Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetTime";

   function Get_FPS return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetFPS";

   procedure Swap_Screen_Buffer with
      Import        => True,
      Convention    => C,
      External_Name => "SwapScreenBuffer";

   procedure Poll_Input_Events with
      Import        => True,
      Convention    => C,
      External_Name => "PollInputEvents";

   procedure Wait_Time (
      Seconds : Long_Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "WaitTime";

   procedure Set_Random_Seed (
      Seed : Natural := 16#0EADBEEF#
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetRandomSeed";

   function Get_Random_Value (
      Min : Integer := 0;
      Max : Integer := 255
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetRandomValue";

   function Load_Random_Sequence (
      Count : Natural := 0;
      Min   : Integer := 0;
      Max   : Integer := 0
   ) return access Integer with
      Import        => True,
      Convention    => C,
      External_Name => "LoadRandomSequence";

   procedure Unload_Random_Sequence (
      Sequence : access Integer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadRandomSequence";

   procedure Take_Screenshot (
      File_Name : String := "Screenshot.png"
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "TakeScreenshot";

   procedure Set_Config_Flags (
      Flags : Config_Flags := Flag_None
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetConfigFlags";

   procedure Open_URL (
      URL : String := ""
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "OpenURL";

   procedure Set_Trace_Log_Level (
      Level : Trace_Log_Level := Log_All
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetTraceLogLevel";

   function Allocate (
      Size : Natural := 0
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "MemAlloc";

   function Reallocate (
      Data : Pointer := null;
      Size : Natural := 0
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "MemRealloc";

   procedure Deallocate (
      Data : Pointer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "MemFree";

   function Load_File_Data (
      File_Name :        String  := "";
      Data_Size : access Integer := null
   ) return access Character with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFileData";

   procedure Unload_File_Data (
      Data : Pointer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadFileData";

   function Save_File_Data (
      File_Name : String  := "";
      Data      : Pointer := null;
      Data_Size : Natural := 0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "SaveFileData";

   function Export_Data_As_Code (
      Data      : Pointer := null;
      Data_Size : Natural := 0;
      File_Name : String  := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportDataAsCode";

   function Load_File_Text (
      File_Name : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFileText";

   procedure Unload_File_Text (
      Text : String := ""
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadFileText";

   function Save_File_Text (
      File_Name : String := "";
      Text      : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "SaveFileText";

   function File_Exists (
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "FileExists";

   function Directory_Exists (
      Directory_Path : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "DirectoryExists";

   function Is_File_Extension (
      File_Name : String := "";
      Extension : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsFileExtension";

   function Get_File_Length (
      File_Name : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetFileLength";

   function Get_File_Extension (
      File_Name : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetFileExtension";

   function Get_File_Name (
      File_Path : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetFileName";

   function Get_File_Name_Without_Ext (
      File_Path : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetFileNameWithoutExt";

   function Get_Directory_Path (
      File_Path : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetDirectoryPath";

   function Get_Prev_Directory_Path (
      Directory_Path : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetPrevDirectoryPath";

   function Get_Working_Directory return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetWorkingDirectory";

   function Get_Application_Directory return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetApplicationDirectory";

   function Change_Directory (
      Directory_Path : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ChangeDirectory";

   function Is_Path_File (
      Path : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsPathFile";

   function Load_Directory_Files (
      Directory_Path : String := ""
   ) return File_Path_List with
      Import        => True,
      Convention    => C,
      External_Name => "LoadDirectoryFiles";

   function Load_Directory_Files_Ex (
      Base_Path           : String  := "";
      Filter              : String  := "";
      Scan_Subdirectories : Logical := False
   ) return File_Path_List with
      Import        => True,
      Convention    => C,
      External_Name => "LoadDirectoryFilesEx";

   procedure Unload_Directory_Files (
      Files : File_Path_List := No_File_Path_List
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadDirectoryFiles";

   function Is_File_Dropped return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsFileDropped";

   function Load_Dropped_Files return File_Path_List with
      Import        => True,
      Convention    => C,
      External_Name => "LoadDroppedFiles";

   procedure Unload_Dropped_Files (
      Files : File_Path_List := No_File_Path_List
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadDroppedFiles";

   function Get_File_Mod_Time (
      File_Name : String := ""
   ) return Natural with
      Import        => True,
      Convention    => C,
      External_Name => "GetFileModTime";

   function Compress_Data (
      Data                 :        Pointer := null;
      Data_Size            :        Natural := 0;
      Compressed_Data_Size : access Integer := null
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "CompressData";

   function Decompress_Data (
      Compressed_Data      : Pointer := null;
      Compressed_Data_Size : Natural := 0;
      Data_Size            : Natural := 0
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "DecompressData";

   function Encode_Data_Base_64 (
      Data        :        Pointer := null;
      Data_Size   :        Natural := 0;
      Output_Size : access Integer := null
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "EncodeDataBase64";

   function Decode_Data_Base_64 (
      Data        :        Pointer := null;
      Output_Size : access Integer := null
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "DecodeDataBase64";

   function Load_Automation_Event_List (
      File_Name : String := ""
   ) return Automation_Event_List with
      Import        => True,
      Convention    => C,
      External_Name => "LoadAutomationEventList";

   procedure Unload_Automation_Event_List (
      Data : access Automation_Event_List := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadAutomationEventList";

   function Export_Automation_Event_List (
      Data      : Automation_Event_List := No_Automation_Event_List;
      File_Name : String                := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportAutomationEventList";

   procedure Set_Automation_Event_List (
      Data : access Automation_Event_List := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetAutomationEventList";

   procedure Set_Automation_Event_Base_Frame (
      Frame : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetAutomationEventBaseFrame";

   procedure Start_Automation_Event_Recording with
      Import        => True,
      Convention    => C,
      External_Name => "StartAutomationEventRecording";

   procedure Stop_Automation_Event_Recording with
      Import        => True,
      Convention    => C,
      External_Name => "StopAutomationEventRecording";

   procedure Play_Automation_Event (
      Event : Automation_Event := No_Automation_Event
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PlayAutomationEvent";

   function Is_Key_Pressed (
      Key : Keyboard_Key := Key_Null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsKeyPressed";

   function Is_Key_Pressed_Repeat (
      Key : Keyboard_Key := Key_Null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsKeyPressedRepeat";

   function Is_Key_Down (
      Key : Keyboard_Key := Key_Null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsKeyDown";

   function Is_Key_Released (
      Key : Keyboard_Key := Key_Null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsKeyReleased";

   function Is_Key_Up (
      Key : Keyboard_Key := Key_Null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsKeyUp";

   function Get_Key_Pressed return Keyboard_Key with
      Import        => True,
      Convention    => C,
      External_Name => "GetKeyPressed";

   function Get_Character_Pressed return Character with
      Import        => True,
      Convention    => C,
      External_Name => "GetCharPressed";

   procedure Set_Exit_Key (
      Key : Keyboard_Key := Key_Escape
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetExitKey";

   function Is_Gamepad_Available (
      Gamepad : Integer := 0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsGamepadAvailable";

   function Get_Gamepad_Name (
      Gamepad : Integer := 0
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "GetGamepadName";

   function Is_Gamepad_Button_Pressed (
      Gamepad : Integer        := 0;
      Button  : Gamepad_Button := Gamepad_Button_Left_Thumb
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsGamepadButtonPressed";

   function Is_Gamepad_Button_Down (
      Gamepad : Integer        := 0;
      Button  : Gamepad_Button := Gamepad_Button_Left_Thumb
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsGamepadButtonDown";

   function Is_Gamepad_Button_Released (
      Gamepad : Integer        := 0;
      Button  : Gamepad_Button := Gamepad_Button_Left_Thumb
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsGamepadButtonReleased";

   function Is_Gamepad_Button_Up (
      Gamepad : Integer        := 0;
      Button  : Gamepad_Button := Gamepad_Button_Left_Thumb
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsGamepadButtonUp";

   function Get_Gamepad_Button_Pressed return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetGamepadButtonPressed";

   function Get_Gamepad_Axis_Count (
      Gamepad : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetGamepadAxisCount";

   function Get_Gamepad_Axis_Movement (
      Gamepad : Integer      := 0;
      Axis    : Gamepad_Axis := Gamepad_Axis_Left_Trigger
   ) return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetGamepadAxisMovement";

   function Set_Gamepad_Mappings (
      Mappings : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "SetGamepadMappings";

   function Is_Mouse_Button_Pressed (
      Button : Mouse_Button := Mouse_Button_Left
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMouseButtonPressed";

   function Is_Mouse_Button_Down (
      Button : Mouse_Button := Mouse_Button_Left
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMouseButtonDown";

   function Is_Mouse_Button_Released (
      Button : Mouse_Button := Mouse_Button_Left
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMouseButtonReleased";

   function Is_Mouse_Button_Up (
      Button : Mouse_Button := Mouse_Button_Left
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMouseButtonUp";

   function Get_Mouse_X return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMouseX";

   function Get_Mouse_Y return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetMouseY";

   function Get_Mouse_Position return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetMousePosition";

   function Get_Mouse_Delta return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetMouseDelta";

   procedure Set_Mouse_Position (
      X : Integer := 0;
      Y : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMousePosition";

   procedure Set_Mouse_Offset (
      X : Integer := 0;
      Y : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMouseOffset";

   procedure Set_Mouse_Scale (
      X : Float := 0.0;
      Y : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMouseScale";

   function Get_Mouse_Wheel_Move return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetMouseWheelMove";

   function Get_Mouse_Wheel_Move_V return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetMouseWheelMoveV";

   procedure Set_Mouse_Cursor (
      Cursor : Mouse_Cursor := Mouse_Cursor_Default
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMouseCursor";

   function Get_Touch_X return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetTouchX";

   function Get_Touch_Y return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetTouchY";

   function Get_Touch_Position (
      Index : Integer := 0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetTouchPosition";

   function Get_Touch_Point_Id (
      Index : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetTouchPointId";

   function Get_Touch_Point_Count return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetTouchPointCount";

   procedure Set_Gestures_Enabled (
      Data : Gesture := Gesture_None
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetGesturesEnabled";

   function Is_Gesture_Detected (
      Data : Gesture := Gesture_None
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsGestureDetected";

   function Get_Gesture_Detected return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetGestureDetected";

   function Get_Gesture_Hold_Duration return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetGestureHoldDuration";

   function Get_Gesture_Drag_Vector return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetGestureDragVector";

   function Get_Gesture_Drag_Angle return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetGestureDragAngle";

   function Get_Gesture_Pinch_Vector return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetGesturePinchVector";

   function Get_Gesture_Pinch_Angle return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetGesturePinchAngle";

   procedure Update_Camera (
      Data : access Camera_3D   := null;
      Mode :        Camera_Mode := Camera_First_Person
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateCamera";

   procedure Update_Camera_Pro (
      Data     : access Camera_3D := null;
      Movement :        Vector_3D := (others => 0.0);
      Rotation :        Vector_3D := (others => 0.0);
      Zoom     :        Float     := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateCameraPro";

   procedure Set_Shapes_Texture (
      Data   : Texture   := No_Texture;
      Source : Rectangle := No_Rectangle
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetShapesTexture";

   procedure Draw_Pixel (
      X    : Integer := 0;
      Y    : Integer := 0;
      Tint : Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPixel";

   procedure Draw_Pixel_V (
      Position : Vector_2D := (others => 0.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPixelV";

   procedure Draw_Line (
      X0   : Integer := 0;
      Y0   : Integer := 0;
      X1   : Integer := 0;
      Y1   : Integer := 0;
      Tint : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawLine";

   procedure Draw_Line_V (
      From : Vector_2D := (others => 0.0);
      To   : Vector_2D := (others => 0.0);
      Tint : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawLineV";

   procedure Draw_Line_Ex (
      From  : Vector_2D := (others => 0.0);
      To    : Vector_2D := (others => 0.0);
      Thick : Float     := 0.0;
      Tint  : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawLineEx";

   procedure Draw_Line_Strip (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Tint        :        Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawLineStrip";

   procedure Draw_Line_Bezier (
      From  : Vector_2D := (others => 0.0);
      To    : Vector_2D := (others => 0.0);
      Thick : Float     := 0.0;
      Tint : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawLineBezier";

   procedure Draw_Circle (
      X      : Integer := 0;
      Y      : Integer := 0;
      Radius : Float   := 0.0;
      Tint   : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircle";

   procedure Draw_Circle_Sector (
      Center   : Vector_2D := (others => 0.0);
      Radius   : Float     := 0.0;
      From     : Float     := 0.0;
      To       : Float     := 0.0;
      Segments : Integer   := 0;
      Tint     : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircleSector";

   procedure Draw_Circle_Sector_Lines (
      Center   : Vector_2D := (others => 0.0);
      Radius   : Float     := 0.0;
      From     : Float     := 0.0;
      To       : Float     := 0.0;
      Segments : Integer   := 0;
      Tint     : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircleSectorLines";

   procedure Draw_Circle_Gradient (
      X      : Integer := 0;
      Y      : Integer := 0;
      Radius : Float   := 0.0;
      Tint_1 : Color   := Black;
      Tint_2 : Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircleGradient";

   procedure Draw_Circle_V (
      Center : Vector_2D := (others => 0.0);
      Radius : Float     := 0.0;
      Tint   : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircleV";

   procedure Draw_Circle_Lines (
      X      : Integer := 0;
      Y      : Integer := 0;
      Radius : Float   := 0.0;
      Tint   : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircleLines";

   procedure Draw_Circle_Lines_V (
      Center : Vector_2D := (others => 0.0);
      Radius : Float     := 0.0;
      Tint   : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircleLinesV";

   procedure Draw_Ellipse (
      X          : Integer := 0;
      Y          : Integer := 0;
      Horizontal : Float   := 0.0;
      Vertical   : Float   := 0.0;
      Tint       : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawEllipse";

   procedure Draw_Ellipse_Lines (
      X          : Integer := 0;
      Y          : Integer := 0;
      Horizontal : Float   := 0.0;
      Vertical   : Float   := 0.0;
      Tint       : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawEllipseLines";

   procedure Draw_Ring (
      Center       : Vector_2D := (others => 0.0);
      Inner_Radius : Float     := 0.0;
      Outer_Radius : Float     := 0.0;
      From         : Float     := 0.0;
      To           : Float     := 0.0;
      Segments     : Integer   := 0;
      Tint         : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRing";

   procedure Draw_Ring_Lines (
      Center       : Vector_2D := (others => 0.0);
      Inner_Radius : Float     := 0.0;
      Outer_Radius : Float     := 0.0;
      From         : Float     := 0.0;
      To           : Float     := 0.0;
      Segments     : Integer   := 0;
      Tint         : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRingLines";

   procedure Draw_Rectangle (
      X      : Integer := 0;
      Y      : Integer := 0;
      Width  : Integer := 0;
      Height : Integer := 0;
      Tint   : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangle";

   procedure Draw_Rectangle_V (
      Position : Vector_2D := (others => 0.0);
      Size     : Vector_2D := (others => 0.0);
      Tint     : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleV";

   procedure Draw_Rectangle_Rec (
      Data : Rectangle := No_Rectangle;
      Tint : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleRec";

   procedure Draw_Rectangle_Pro (
      Data     : Rectangle := No_Rectangle;
      Origin   : Vector_2D := (others => 0.0);
      Rotation : Float     := 0.0;
      Tint     : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectanglePro";

   procedure Draw_Rectangle_Gradient_V (
      X       : Integer := 0;
      Y       : Integer := 0;
      Width   : Integer := 0;
      Height  : Integer := 0;
      Color_1 : Color   := Black;
      Color_2 : Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleGradientV";

   procedure Draw_Rectangle_Gradient_H (
      X       : Integer := 0;
      Y       : Integer := 0;
      Width   : Integer := 0;
      Height  : Integer := 0;
      Color_1 : Color   := Black;
      Color_2 : Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleGradientH";

   procedure Draw_Rectangle_Gradient_Ex (
      Data    : Rectangle := No_Rectangle;
      Color_1 : Color     := Red;
      Color_2 : Color     := Green;
      Color_3 : Color     := Blue;
      Color_4 : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleGradientEx";

   procedure Draw_Rectangle_Lines (
      X      : Integer := 0;
      Y      : Integer := 0;
      Width  : Integer := 0;
      Height : Integer := 0;
      Tint   : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleLines";

   procedure Draw_Rectangle_Lines_Ex (
      Data      : Rectangle := No_Rectangle;
      Thickness : Float     := 1.0;
      Tint      : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleLinesEx";

   procedure Draw_Rectangle_Rounded (
      Data      : Rectangle := No_Rectangle;
      Roundness : Float     := 1.0;
      Segments  : Integer   := 1;
      Tint      : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleRounded";

   procedure Draw_Rectangle_Rounded_Lines (
      Data      : Rectangle := No_Rectangle;
      Roundness : Float     := 1.0;
      Segments  : Integer   := 1;
      Thickness : Float     := 1.0;
      Tint      : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRectangleRoundedLines";

   procedure Draw_Triangle (
      Point_1 : Vector_2D := (others => 0.0);
      Point_2 : Vector_2D := (others => 0.0);
      Point_3 : Vector_2D := (others => 0.0);
      Tint    : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTriangle";

   procedure Draw_Triangle_Lines (
      Point_1 : Vector_2D := (others => 0.0);
      Point_2 : Vector_2D := (others => 0.0);
      Point_3 : Vector_2D := (others => 0.0);
      Tint    : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTriangleLines";

   procedure Draw_Triangle_Fan (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTriangleFan";

   procedure Draw_Triangle_Strip (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTriangleStrip";

   procedure Draw_Poly (
      Center   : Vector_2D := (others => 0.0);
      Sides    : Natural   := 0;
      Radius   : Float     := 0.0;
      Rotation : Float     := 0.0;
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPoly";

   procedure Draw_Poly_Lines (
      Center   : Vector_2D := (others => 0.0);
      Sides    : Natural   := 0;
      Radius   : Float     := 0.0;
      Rotation : Float     := 0.0;
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPolyLines";

   procedure Draw_Poly_Lines_Ex (
      Center    : Vector_2D := (others => 0.0);
      Sides     : Natural   := 0;
      Radius    : Float     := 0.0;
      Rotation  : Float     := 0.0;
      Thickness : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPolyLinesEx";

   procedure Draw_Spline_Linear (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Thickness   :        Float     := 0.0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineLinear";

   procedure Draw_Spline_Basis (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Thickness   :        Float     := 0.0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineBasis";

   procedure Draw_Spline_Catmull_Rom (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Thickness   :        Float     := 0.0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineCatmullRom";

   procedure Draw_Spline_Bezier_Quadratic (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Thickness   :        Float     := 0.0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineBezierQuadratic";

   procedure Draw_Spline_Bezier_Cubic (
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0;
      Thickness   :        Float     := 0.0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineBezierCubic";

   procedure Draw_Spline_Segment_Linear (
      From      : Vector_2D := (others => 0.0);
      To        : Vector_2D := (others => 0.0);
      Thickness : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineSegmentLinear";

   procedure Draw_Spline_Segment_Basis (
      Point_1   : Vector_2D := (others => 0.0);
      Point_2   : Vector_2D := (others => 0.0);
      Point_3   : Vector_2D := (others => 0.0);
      Point_4   : Vector_2D := (others => 0.0);
      Thickness : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineSegmentBasis";

   procedure Draw_Spline_Segment_Catmull_Rom (
      Point_1   : Vector_2D := (others => 0.0);
      Point_2   : Vector_2D := (others => 0.0);
      Point_3   : Vector_2D := (others => 0.0);
      Point_4   : Vector_2D := (others => 0.0);
      Thickness : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineSegmentCatmullRom";

   procedure Draw_Spline_Segment_Bezier_Quadratic (
      Point_1   : Vector_2D := (others => 0.0);
      Point_2   : Vector_2D := (others => 0.0);
      Point_3   : Vector_2D := (others => 0.0);
      Thickness : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineSegmentBezierQuadratic";

   procedure Draw_Spline_Segment_Bezier_Cubic (
      Point_1   : Vector_2D := (others => 0.0);
      Point_2   : Vector_2D := (others => 0.0);
      Point_3   : Vector_2D := (others => 0.0);
      Point_4   : Vector_2D := (others => 0.0);
      Thickness : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSplineSegmentBezierCubic";

   function Get_Spline_Point_Linear (
      From : Vector_2D := (others => 0.0);
      To   : Vector_2D := (others => 0.0);
      Off  : Float     := 0.0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetSplinePointLinear";

   function Get_Spline_Point_Basis (
      Point_1 : Vector_2D := (others => 0.0);
      Point_2 : Vector_2D := (others => 0.0);
      Point_3 : Vector_2D := (others => 0.0);
      Point_4 : Vector_2D := (others => 0.0);
      Off     : Float     := 0.0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetSplinePointBasis";

   function Get_Spline_Point_Catmull_Rom (
      Point_1 : Vector_2D := (others => 0.0);
      Point_2 : Vector_2D := (others => 0.0);
      Point_3 : Vector_2D := (others => 0.0);
      Point_4 : Vector_2D := (others => 0.0);
      Off     : Float     := 0.0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetSplinePointCatmullRom";

   function Get_Spline_Point_Bezier_Quad (
      Point_1 : Vector_2D := (others => 0.0);
      Point_2 : Vector_2D := (others => 0.0);
      Point_3 : Vector_2D := (others => 0.0);
      Off     : Float     := 0.0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetSplinePointBezierQuad";

   function Get_Spline_Point_Bezier_Cubic (
      Point_1 : Vector_2D := (others => 0.0);
      Point_2 : Vector_2D := (others => 0.0);
      Point_3 : Vector_2D := (others => 0.0);
      Point_4 : Vector_2D := (others => 0.0);
      Off     : Float     := 0.0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "GetSplinePointBezierCubic";

   function Check_Collision_Recs (
      Bound_1 : Rectangle := No_Rectangle;
      Bound_2 : Rectangle := No_Rectangle
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionRecs";

   function Check_Collision_Circles (
      Center_1 : Vector_2D := (others => 0.0);
      Radius_1 : Float     := 0.0;
      Center_2 : Vector_2D := (others => 0.0);
      Radius_2 : Float     := 0.0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionCircles";

   function Check_Collision_Circle_Rec (
      Center : Vector_2D := (others => 0.0);
      Radius : Float     := 0.0;
      Bound  : Rectangle := No_Rectangle
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionCircleRec";

   function Check_Collision_Point_Rec (
      Point : Vector_2D := (others => 0.0);
      Bound : Rectangle := No_Rectangle
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionPointRec";

   function Check_Collision_Point_Circle (
      Point  : Vector_2D := (others => 0.0);
      Center : Vector_2D := (others => 0.0);
      Radius : Float     := 0.0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionPointCircle";

   function Check_Collision_Point_Triangle (
      Point      : Vector_2D := (others => 0.0);
      Triangle_A : Vector_2D := (others => 0.0);
      Triangle_B : Vector_2D := (others => 0.0);
      Triangle_C : Vector_2D := (others => 0.0)
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionPointTriangle";

   function Check_Collision_Point_Poly (
      Point       :        Vector_2D := (others => 0.0);
      Points      : access Vector_2D := null;
      Point_Count :        Natural   := 0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionPointPoly";

   function Check_Collision_Lines (
      From_1        :        Vector_2D := (others => 0.0);
      To_1          :        Vector_2D := (others => 0.0);
      From_2        :        Vector_2D := (others => 0.0);
      To_2          :        Vector_2D := (others => 0.0);
      Intersections : access Vector_2D := null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionLines";

   function Check_Collision_Point_Line (
      Point     : Vector_2D := (others => 0.0);
      From      : Vector_2D := (others => 0.0);
      To        : Vector_2D := (others => 0.0);
      Threshold : Natural   := 0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionPointLine";

   function Get_Collision_Rec (
      Bound_1 : Rectangle := No_Rectangle;
      Bound_2 : Rectangle := No_Rectangle
   ) return Rectangle with
      Import        => True,
      Convention    => C,
      External_Name => "GetCollisionRec";

   function Load_Image (
      File_Name : String := ""
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImage";

   function Load_Image_Raw (
      File_Name   : String  := "";
      Width       : Natural := 0;
      Height      : Natural := 0;
      Format      : Integer := 0;
      Header_Size : Integer := 0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageRaw";

   function Load_Image_Svg (
      File_Name : String := "";
      Width     : Natural := 0;
      Height    : Natural := 0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageSvg";

   function Load_Image_Anim (
      File_Name :        String  := "";
      Frames    : access Integer := null
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageAnim";

   function Load_Image_From_Memory (
      File_Type : String  := "";
      File_Data : Pointer := null;
      Data_Size : Natural := 0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageFromMemory";

   function Load_Image_From_Texture (
      Data : Texture := No_Texture
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageFromTexture";

   function Load_Image_From_Screen return Image with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageFromScreen";

   function Is_Image_Ready (
      Data : Image := No_Image
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsImageReady";

   procedure Unload_Image (
      Data : Image := No_Image
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadImage";

   function Export_Image (
      Data      : Image  := No_Image;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportImage";

   function Export_Image_To_Memory (
      Data      :        Image   := No_Image;
      File_Type :        String  := "";
      File_Size : access Integer := null
   ) return Pointer with
      Import        => True,
      Convention    => C,
      External_Name => "ExportImageToMemory";

   function Export_Image_As_Code (
      Data      : Image  := No_Image;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportImageAsCode";

   function Gen_Image_Color (
      Width  : Natural := 0;
      Height : Natural := 0;
      Tint   : Color   := White
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageColor";

   function Gen_Image_Gradient_Linear (
      Width     : Natural := 0;
      Height    : Natural := 0;
      Direction : Integer := 0;
      From      : Color   := White;
      To        : Color   := Black
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageGradientLinear";

   function Gen_Image_Gradient_Radial (
      Width   : Natural := 0;
      Height  : Natural := 0;
      Density : Float   := 0.0;
      Inner   : Color   := White;
      Outer   : Color   := Black
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageGradientRadial";

   function Gen_Image_Gradient_Square (
      Width   : Natural := 0;
      Height  : Natural := 0;
      Density : Float   := 0.0;
      Inner   : Color   := White;
      Outer   : Color   := Black
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageGradientSquare";

   function Gen_Image_Checked (
      Width   : Natural := 0;
      Height  : Natural := 0;
      X       : Natural := 0;
      Y       : Natural := 0;
      Color_1 : Color   := White;
      Color_2 : Color   := Black
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageChecked";

   function Gen_Image_White_Noise (
      Width  : Natural := 0;
      Height : Natural := 0;
      Factor : Float   := 0.0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageWhiteNoise";

   function Gen_Image_Perlin_Noise (
      Width  : Natural := 0;
      Height : Natural := 0;
      X      : Natural := 0;
      Y      : Natural := 0;
      Scale  : Float   := 0.0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImagePerlinNoise";

   function Gen_Image_Cellular (
      Width  : Natural := 0;
      Height : Natural := 0;
      Size   : Natural := 0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageCellular";

   function Gen_Image_Text (
      Width  : Natural := 0;
      Height : Natural := 0;
      Text   : String  := ""
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageText";

   function Image_Copy (
      Data : Image := No_Image
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "ImageCopy";

   function Image_From_Image (
      Data : Image     := No_Image;
      Crop : Rectangle := No_Rectangle
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "ImageFromImage";

   function Image_Text (
      Text      : String  := "";
      Font_Size : Natural := 0;
      Tint      : Color   := Black
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "ImageText";

   function Image_Text_Ex (
      Data      : Font    := No_Font;
      Text      : String  := "";
      Font_Size : Natural := 0;
      Spacing   : Float   := 0.0;
      Tint      : Color   := Black
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "ImageTextEx";

   procedure Image_Format (
      Data   : access Image   := null;
      Format :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageFormat";

   procedure Image_To_POT (
      Data : access Image := null;
      Fill :        Color := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageToPOT";

   procedure Image_Crop (
      Data : access Image     := null;
      Crop :        Rectangle := No_Rectangle
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageCrop";

   procedure Image_Alpha_Crop (
      Data      : access Image := null;
      Threshold :        Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageAlphaCrop";

   procedure Image_Alpha_Clear (
      Data      : access Image := null;
      Tint      :        Color := White;
      Threshold :        Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageAlphaClear";

   procedure Image_Alpha_Mask (
      Data : access Image := null;
      Mask :        Image := No_Image
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageAlphaMask";

   procedure Image_Alpha_Premultiply (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageAlphaPremultiply";

   procedure Image_Blur_Gaussian (
      Data : access Image   := null;
      Blur :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageBlurGaussian";

   procedure Image_Kernel_Convolution (
      Data        : access Image   := null;
      Kernel      : access Float   := null;
      Kernel_Size :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageKernelConvolution";

   procedure Image_Resize (
      Data   : access Image   := null;
      Width  :        Natural := 0;
      Height :        Natural := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageResize";

   procedure Image_Resize_NN (
      Data   : access Image   := null;
      Width  :        Natural := 0;
      Height :        Natural := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageResizeNN";

   procedure Image_Resize_Canvas (
      Data   : access Image   := null;
      Width  :        Natural := 0;
      Height :        Natural := 0;
      X      :        Integer := 0;
      Y      :        Integer := 0;
      Fill   :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageResizeCanvas";

   procedure Image_Mipmaps (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageMipmaps";

   procedure Image_Dither (
      Data : access Image   := null;
      R    :        Integer := 0;
      G    :        Integer := 0;
      B    :        Integer := 0;
      A    :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDither";

   procedure Image_Flip_Vertical (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageFlipVertical";

   procedure Image_Flip_Horizontal (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageFlipHorizontal";

   procedure Image_Rotate (
      Data    : access Image   := null;
      Degrees :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageRotate";

   procedure Image_Rotate_CW (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageRotateCW";

   procedure Image_Rotate_CCW (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageRotateCCW";

   procedure Image_Color_Tint (
      Data : access Image := null;
      Tint :        Color := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageColorTint";

   procedure Image_Color_Invert (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageColorInvert";

   procedure Image_Color_Grayscale (
      Data : access Image := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageColorGrayscale";

   procedure Image_Color_Contrast (
      Data     : access Image := null;
      Contrast :        Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageColorContrast";

   procedure Image_Color_Brightness (
      Data       : access Image   := null;
      Brightness :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageColorBrightness";

   procedure Image_Color_Replace (
      Data    : access Image := null;
      Color_1 :        Color := White;
      Color_2 :        Color := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageColorReplace";

   function Load_Image_Colors (
      Data : Image := No_Image
   ) return access Color with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImageColors";

   function Load_Image_Palette (
      Data         :        Image   := No_Image;
      Palette_Size :        Natural := 0;
      Color_Count  : access Integer := null
   ) return access Color with
      Import        => True,
      Convention    => C,
      External_Name => "LoadImagePalette";

   procedure Unload_Image_Colors (
      Colors : access Color := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadImageColors";

   procedure Unload_Image_Palette (
      Colors : access Color := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadImagePalette";

   function Get_Image_Alpha_Border (
      Data      : Image := No_Image;
      Threshold : Float := 0.0
   ) return Rectangle with
      Import        => True,
      Convention    => C,
      External_Name => "GetImageAlphaBorder";

   function Get_Image_Color (
      Data : Image   := No_Image;
      X    : Integer := 0;
      Y    : Integer := 0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "GetImageColor";

   procedure Image_Clear_Background (
      Destination : access Image := null;
      Tint        :        Color := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageClearBackground";

   procedure Image_Draw_Pixel (
      Destination : access Image   := null;
      X           :        Integer := 0;
      Y           :        Integer := 0;
      Tint        :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawPixel";

   procedure Image_Draw_Pixel_V (
      Destination : access Image     := null;
      Position    :        Vector_2D := (others => 0.0);
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawPixelV";

   procedure Image_Draw_Line (
      Destination : access Image   := null;
      From_X      :        Integer := 0;
      From_Y      :        Integer := 0;
      To_X        :        Integer := 0;
      To_Y        :        Integer := 0;
      Tint        :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawLine";

   procedure Image_Draw_Line_V (
      Destination : access Image     := null;
      From        :        Vector_2D := (others => 0.0);
      To          :        Vector_2D := (others => 0.0);
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawLineV";

   procedure Image_Draw_Circle (
      Destination : access Image   := null;
      Center_X    :        Integer := 0;
      Center_Y    :        Integer := 0;
      Radius      :        Integer := 0;
      Tint        :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawCircle";

   procedure Image_Draw_Circle_V (
      Destination : access Image     := null;
      Center      :        Vector_2D := (others => 0.0);
      Radius      :        Integer   := 0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawCircleV";

   procedure Image_Draw_Circle_Lines (
      Destination : access Image   := null;
      Center_X    :        Integer := 0;
      Center_Y    :        Integer := 0;
      Radius      :        Integer := 0;
      Tint        :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawCircleLines";

   procedure Image_Draw_Circle_Lines_V (
      Destination : access Image     := null;
      Center      :        Vector_2D := (others => 0.0);
      Radius      :        Integer   := 0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawCircleLinesV";

   procedure Image_Draw_Rectangle (
      Destination : access Image   := null;
      X           :        Integer := 0;
      Y           :        Integer := 0;
      Width       :        Integer := 0;
      Height      :        Integer := 0;
      Tint        :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawRectangle";

   procedure Image_Draw_Rectangle_V (
      Destination : access Image     := null;
      Position    :        Vector_2D := (others => 0.0);
      Size        :        Vector_2D := (others => 0.0);
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawRectangleV";

   procedure Image_Draw_Rectangle_Rec (
      Destination : access Image     := null;
      Data        :        Rectangle := No_Rectangle;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawRectangleRec";

   procedure Image_Draw_Rectangle_Lines (
      Destination : access Image     := null;
      Data        :        Rectangle := No_Rectangle;
      Thick       :        Integer   := 0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawRectangleLines";

   procedure Image_Draw (
      Destination : access Image     := null;
      Source      :        Image     := No_Image;
      From        :        Rectangle := No_Rectangle;
      To          :        Rectangle := No_Rectangle;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDraw";

   procedure Image_Draw_Text (
      Destination : access Image   := null;
      Text        :        String  := "";
      X           :        Integer := 0;
      Y           :        Integer := 0;
      Font_Size   :        Integer := 0;
      Tint        :        Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawText";

   procedure Image_Draw_Text_Ex (
      Destination : access Image     := null;
      Data        :        Font      := No_Font;
      Text        :        String    := "";
      Position    :        Vector_2D := (others => 0.0);
      Font_Size   :        Float     := 0.0;
      Spacing     :        Float     := 0.0;
      Tint        :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ImageDrawTextEx";

   function Load_Texture (
      File_Path : String := ""
   ) return Texture with
      Import        => True,
      Convention    => C,
      External_Name => "LoadTexture";

   function Load_Texture_From_Image (
      Data : Image := No_Image
   ) return Texture with
      Import        => True,
      Convention    => C,
      External_Name => "LoadTextureFromImage";

   function Load_Texture_Cubemap (
      Data   : Image   := No_Image;
      Layout : Integer := 0
   ) return Texture with
      Import        => True,
      Convention    => C,
      External_Name => "LoadTextureCubemap";

   function Load_Render_Texture (
      Width  : Natural := 0;
      Height : Natural := 0
   ) return Render_Texture with
      Import        => True,
      Convention    => C,
      External_Name => "LoadRenderTexture";

   function Is_Texture_Ready (
      Data : Texture := No_Texture
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsTextureReady";

   procedure Unload_Texture (
      Data : Texture := No_Texture
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadTexture";

   function Is_Render_Texture_Ready (
      Target : Render_Texture := No_Render_Texture
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsRenderTextureReady";

   procedure Unload_Render_Texture (
      Target : Render_Texture := No_Render_Texture
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadRenderTexture";

   procedure Update_Texture (
      Data   : Texture := No_Texture;
      Pixels : Pointer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateTexture";

   procedure Update_Texture_Rec (
      Data   : Texture   := No_Texture;
      Source : Rectangle := No_Rectangle;
      Pixels : Pointer   := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateTextureRec";

   procedure Gen_Texture_Mipmaps (
      Data : Texture := No_Texture
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "GenTextureMipmaps";

   procedure Set_Texture_Filter (
      Data   : Texture        := No_Texture;
      Filter : Texture_Filter := Texture_Filter_Point
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetTextureFilter";

   procedure Set_Texture_Wrap (
      Data : Texture      := No_Texture;
      Wrap : Texture_Wrap := Texture_Wrap_Repeat
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetTextureWrap";

   procedure Draw_Texture (
      Data : Texture := No_Texture;
      X    : Integer := 0;
      Y    : Integer := 0;
      Tint : Color   := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTexture";

   procedure Draw_Texture_V (
      Data     : Texture   := No_Texture;
      Position : Vector_2D := (others => 0.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextureV";

   procedure Draw_Texture_Ex (
      Data     : Texture   := No_Texture;
      Position : Vector_2D := (others => 0.0);
      Rotation : Float     := 0.0;
      Scale    : Float     := 0.0;
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextureEx";

   procedure Draw_Texture_Rec (
      Data     : Texture   := No_Texture;
      Source   : Rectangle := No_Rectangle;
      Position : Vector_2D := (others => 0.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextureRec";

   procedure Draw_Texture_Pro (
      Data        : Texture   := No_Texture;
      Source      : Rectangle := No_Rectangle;
      Destination : Rectangle := No_Rectangle;
      Origin      : Vector_2D := (others => 0.0);
      Rotation    : Float     := 0.0;
      Tint        : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTexturePro";

   procedure Draw_Texture_NPatch (
      Data        : Texture     := No_Texture;
      -- ERROR NPatch_Info : NPatch_Info := No_NPatch_Info;
      Destination : Rectangle   := No_Rectangle;
      Origin      : Vector_2D   := (others => 0.0);
      Rotation    : Float       := 0.0;
      Tint        : Color       := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextureNPatch";

   function Fade (
      Data  : Color := White;
      Alpha : Float := 0.0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "Fade";

   function Color_To_Integer (
      Data : Color := White
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "ColorToInt";

   function Color_Normalize (
      Data : Color := White
   ) return Vector_4D with
      Import        => True,
      Convention    => C,
      External_Name => "ColorNormalize";

   function Color_From_Normalized (
      Normalized : Vector_4D := (others => 0.0)
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorFromNormalized";

   function Color_To_HSV (
      Data : Color := White
   ) return Vector_3D with
      Import        => True,
      Convention    => C,
      External_Name => "ColorToHSV";

   function Color_From_HSV (
      Hue        : Float := 0.0;
      Saturation : Float := 0.0;
      Value      : Float := 0.0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorFromHSV";

   function Color_Tint (
      Data : Color := White;
      Tint : Color := Black
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorTint";

   function Color_Brightness (
      Data   : Color := White;
      Factor : Float := 0.0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorBrightness";

   function Color_Contrast (
      Data     : Color := White;
      Contrast : Float := 0.0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorContrast";

   function Color_Alpha (
      Data  : Color := White;
      Alpha : Float := 0.0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorAlpha";

   function Color_Alpha_Blend (
      Destination : Color := White;
      Source      : Color := Black;
      Tint        : Color := Ray_White
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "ColorAlphaBlend";

   function Get_Color (
      Value : Natural := 0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "GetColor";

   function Get_Pixel_Color (
      Source : Pointer := null;
      Format : Integer := 0
   ) return Color with
      Import        => True,
      Convention    => C,
      External_Name => "GetPixelColor";

   procedure Set_Pixel_Color (
      Destination : Pointer := null;
      Data        : Color   := White;
      Format      : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetPixelColor";

   function Get_Pixel_Data_Size (
      Width  : Natural := 0;
      Height : Natural := 0;
      Format : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetPixelDataSize";

   function Get_Font_Default return Font with
      Import        => True,
      Convention    => C,
      External_Name => "GetFontDefault";

   function Load_Font (
      File_Name : String := ""
   ) return Font with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFont";

   function Load_Font_Ex (
      File_Name        :        String  := "";
      Font_Size        :        Integer := 32;
      Code_Points      : access Integer := null;
      Code_Point_Count :        Natural := 0
   ) return Font with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFontEx";

   function Load_Font_From_Image (
      Data            : Image := No_Image;
      Key             : Color := White;
      First_Character : Integer := 0
   ) return Font with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFontFromImage";

   function Load_Font_From_Memory (
      File_Type        :        String  := "";
      File_Data        :        Pointer := null;
      Data_Size        :        Natural := 0;
      Font_Size        :        Integer := 32;
      Code_Points      : access Integer := null;
      Code_Point_Count :        Natural := 0
   ) return Font with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFontFromMemory";

   function Is_Font_Ready (
      Data : Font := No_Font
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsFontReady";

   function Load_Font_Data (
      File_Data        :        Pointer := null;
      Data_Size        :        Natural := 0;
      Font_Size        :        Integer := 32;
      Code_Points      : access Integer := null;
      Code_Point_Count :        Natural := 0;
      Kind             :        Integer := 0
   ) return access Glyph_Info with
      Import        => True,
      Convention    => C,
      External_Name => "LoadFontData";

   function Gen_Image_Font_Atlas (
      Glyphs           : access Glyph_Info := null;
      Glyph_Rectangles : access Rectangle  := null;
      Glyph_Count      :        Integer    := 0;
      Font_Size        :        Integer    := 32;
      Padding          :        Integer    := 0;
      Pack_Method      :        Integer    := 0
   ) return Image with
      Import        => True,
      Convention    => C,
      External_Name => "GenImageFontAtlas";

   procedure Unload_Font_Data (
      Glyphs      : access Glyph_Info := null;
      Glyph_Count :        Integer    := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadFontData";

   procedure Unload_Font (
      Data : Font := No_Font
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadFont";

   function Export_Font_As_Code (
      Data      : Font   := No_Font;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportFontAsCode";

   procedure Draw_FPS (
      X : Integer := 0;
      Y : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawFPS";

   procedure Draw_Text (
      Text : String  := "";
      X    : Integer := 0;
      Y    : Integer := 0;
      Size : Integer := 32;
      Tint : Color   := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawText";

   procedure Draw_Text_Ex (
      Data      : Font      := Get_Font_Default;
      Text      : String    := "";
      Position  : Vector_2D := (others => 0.0);
      Font_Size : Float     := 0.0;
      Spacing   : Float     := 0.0;
      Tint      : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextEx";

   procedure Draw_Text_Pro (
      Data      : Font      := Get_Font_Default;
      Text      : String    := "";
      Position  : Vector_2D := (others => 0.0);
      Origin    : Vector_2D := (others => 0.0);
      Rotation  : Float     := 0.0;
      Font_Size : Float     := 0.0;
      Spacing   : Float     := 0.0;
      Tint      : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextPro";

   procedure Draw_Text_Codepoint (
      Data       : Font      := Get_Font_Default;
      Code_Point : Integer   := 0;
      Position   : Vector_2D := (others => 0.0);
      Font_Size  : Float     := 0.0;
      Tint       : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextCodepoint";

   procedure Draw_Text_Codepoints (
      Data             :        Font      := Get_Font_Default;
      Code_Points      : access Integer   := null;
      Code_Point_Count :        Integer   := 0;
      Position         :        Vector_2D := (others => 0.0);
      Font_Size        :        Float     := 0.0;
      Spacing          :        Float     := 0.0;
      Tint             :        Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTextCodepoints";

   procedure Set_Text_Line_Spacing (
      Spacing : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetTextLineSpacing";

   function Measure_Text (
      Text      : String  := "";
      Font_Size : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "MeasureText";

   function Measure_Text_Ex (
      Data      : Font   := Get_Font_Default;
      Text      : String := "";
      Font_Size : Float  := 0.0;
      Spacing   : Float  := 0.0
   ) return Vector_2D with
      Import        => True,
      Convention    => C,
      External_Name => "MeasureTextEx";

   function Get_Glyph_Index (
      Data       : Font    := Get_Font_Default;
      Code_Point : Integer := 0
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetGlyphIndex";

   function Get_Glyph_Info (
      Data       : Font    := Get_Font_Default;
      Code_Point : Integer := 0
   ) return Glyph_Info with
      Import        => True,
      Convention    => C,
      External_Name => "GetGlyphInfo";

   function Get_Glyph_Atlas_Rec (
      Data       : Font    := Get_Font_Default;
      Code_Point : Integer := 0
   ) return Rectangle with
      Import        => True,
      Convention    => C,
      External_Name => "GetGlyphAtlasRec";

   function Load_UTF8 (
      Code_Points : access Integer := null;
      Length      :        Integer := 0
   ) return access Character with
      Import        => True,
      Convention    => C,
      External_Name => "LoadUTF8";

   procedure Unload_UTF8 (
      Text : access Character := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadUTF8";

   function Load_Code_Points (
      Text  :        String  := "";
      Count : access Integer := null
   ) return access Integer with
      Import        => True,
      Convention    => C,
      External_Name => "LoadCodepoints";

   procedure Unload_Code_Points (
      Code_Points : access Integer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadCodepoints";

   function Get_Code_Point_Count (
      Text : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetCodepointCount";

   function Get_Code_Point (
      Text            :        String  := "";
      Code_Point_Size : access Integer := null
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetCodepoint";

   function Get_Code_Point_Next (
      Text            :        String  := "";
      Code_Point_Size : access Integer := null
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetCodepointNext";

   function Get_Code_Point_Previous (
      Text            :        String  := "";
      Code_Point_Size : access Integer := null
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "GetCodepointPrevious";

   function Code_Point_To_UTF8 (
      Code_Point :        Integer := 0;
      UTF8_Size  : access Integer := null
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "CodepointToUTF8";

   function Text_Copy (
      Destination : Strings := null;
      Source      : Strings := null
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "TextCopy";

   function Text_Is_Equal (
      Text_1 : Strings := null;
      Text_2 : Strings := null
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "TextIsEqual";

   function Text_Length (
      Text : String := ""
   ) return Natural with
      Import        => True,
      Convention    => C,
      External_Name => "TextLength";

   function Text_Subtext (
      Text     : String  := "";
      Position : Integer := 0;
      Length   : Integer := 0
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextSubtext";

   function Text_Replace (
      Text    : Strings := null;
      Replace : String  := "";
      By      : String  := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextReplace";

   function Text_Insert (
      Text     : String  := "";
      Insert   : String  := "";
      Position : Integer := 0
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextInsert";

   function Text_Join (
      Text      : Strings := null;
      Count     : Integer := 0;
      Delimiter : String  := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextJoin";

   function Text_Split (
      Text      :        String    := "";
      Delimiter :        Character := ' ';
      Count     : access Integer   := null
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextSplit";

   procedure Text_Append (
      Text     :        Strings := null;
      Append   :        String  := "";
      Position : access Integer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "TextAppend";

   function Text_Find_Index (
      Text : String := "";
      Find : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "TextFindIndex";

   function Text_To_Upper (
      Text : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextToUpper";

   function Text_To_Lower (
      Text : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextToLower";

   function Text_To_Pascal (
      Text : String := ""
   ) return Strings with
      Import        => True,
      Convention    => C,
      External_Name => "TextToPascal";

   function Text_To_Integer (
      Text : String := ""
   ) return Integer with
      Import        => True,
      Convention    => C,
      External_Name => "TextToInteger";

   procedure Draw_Line_3D (
      From : Vector_3D := (others => 0.0);
      To   : Vector_3D := (others => 0.0);
      Tint : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawLine3D";

   procedure Draw_Point_3D (
      Position : Vector_3D := (others => 0.0);
      Tint     : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPoint3D";

   procedure Draw_Circle_3D (
      Center         : Vector_3D := (others => 0.0);
      Radius         : Float     := 0.0;
      Rotation_Axis  : Vector_3D := (others => 0.0);
      Rotation_Angle : Float     := 0.0;
      Tint           : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCircle3D";

   procedure Draw_Triangle_3D (
      Point_1 : Vector_3D := (others => 0.0);
      Point_2 : Vector_3D := (others => 0.0);
      Point_3 : Vector_3D := (others => 0.0);
      Tint    : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTriangle3D";

   procedure Draw_Triangle_Strip_3D (
      Points      : access Vector_3D := null;
      Point_Count :        Integer   := 0;
      Tint        :        Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawTriangleStrip3D";

   procedure Draw_Cube (
      Position : Vector_3D := (others => 0.0);
      Width    : Float     := 0.0;
      Height   : Float     := 0.0;
      Length   : Float     := 0.0;
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCube";

   procedure Draw_Cube_V (
      Position : Vector_3D := (others => 0.0);
      Size     : Vector_3D := (others => 0.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCubeV";

   procedure Draw_Cube_Wires (
      Position : Vector_3D := (others => 0.0);
      Width    : Float     := 0.0;
      Height   : Float     := 0.0;
      Length   : Float     := 0.0;
      Tint     : Color     := Black
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCubeWires";

   procedure Draw_Cube_Wires_V (
      Position : Vector_3D := (others => 0.0);
      Size     : Vector_3D := (others => 0.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCubeWiresV";

   procedure Draw_Sphere (
      Center : Vector_3D := (others => 0.0);
      Radius : Float     := 0.0;
      Tint   : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSphere";

   procedure Draw_Sphere_Ex (
      Center : Vector_3D := (others => 0.0);
      Radius : Float     := 0.0;
      Rings  : Integer   := 0;
      Slices : Integer   := 0;
      Tint   : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSphereEx";

   procedure Draw_Sphere_Wires (
      Center : Vector_3D := (others => 0.0);
      Radius : Float     := 0.0;
      Rings  : Integer   := 0;
      Slices : Integer   := 0;
      Tint   : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawSphereWires";

   procedure Draw_Cylinder (
      Position      : Vector_3D := (others => 0.0);
      Radius_Top    : Float     := 0.0;
      Radius_Bottom : Float     := 0.0;
      Height        : Float     := 0.0;
      Slices        : Natural   := 0;
      Tint          : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCylinder";

   procedure Draw_Cylinder_Ex (
      From        : Vector_3D := (others => 0.0);
      To          : Vector_3D := (others => 0.0);
      From_Radius : Float     := 0.0;
      To_Radius   : Float     := 0.0;
      Sides       : Natural   := 0;
      Tint        : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCylinderEx";

   procedure Draw_Cylinder_Wires (
      Position      : Vector_3D := (others => 0.0);
      Radius_Top    : Float     := 0.0;
      Radius_Bottom : Float     := 0.0;
      Height        : Float     := 0.0;
      Slices        : Natural   := 0;
      Tint          : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCylinderWires";

   procedure Draw_Cylinder_Wires_Ex (
      From        : Vector_3D := (others => 0.0);
      To          : Vector_3D := (others => 0.0);
      From_Radius : Float     := 0.0;
      To_Radius   : Float     := 0.0;
      Sides       : Natural   := 0;
      Tint        : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCylinderWiresEx";

   procedure Draw_Capsule (
      From   : Vector_3D := (others => 0.0);
      To     : Vector_3D := (others => 0.0);
      Radius : Float     := 0.0;
      Slices : Natural   := 0;
      Rings  : Natural   := 0;
      Tint   : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCapsule";

   procedure Draw_Capsule_Wires (
      From   : Vector_3D := (others => 0.0);
      To     : Vector_3D := (others => 0.0);
      Radius : Float     := 0.0;
      Slices : Natural   := 0;
      Rings  : Natural   := 0;
      Tint   : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawCapsuleWires";

   procedure Draw_Plane (
      Center : Vector_3D := (others => 0.0);
      Size   : Vector_2D := (others => 0.0);
      Tint   : Color := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawPlane";

   procedure Draw_Ray (
      Data : Ray   := No_Ray;
      Tint : Color := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawRay";

   procedure Draw_Grid (
      Slices  : Integer := 0;
      Spacing : Float   := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawGrid";

   function Load_Model (
      File_Name : String := ""
   ) return Model with
      Import        => True,
      Convention    => C,
      External_Name => "LoadModel";

   function Load_Model_From_Mesh (
      Data : Mesh := No_Mesh
   ) return Model with
      Import        => True,
      Convention    => C,
      External_Name => "LoadModelFromMesh";

   function Is_Model_Ready (
      Data : Model := No_Model
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsModelReady";

   procedure Unload_Model (
      Data : Model := No_Model
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadModel";

   function GetModelBoundingBox (
      Data : Model := No_Model
   ) return Bounding_Box with
      Import        => True,
      Convention    => C,
      External_Name => "GetModelBoundingBox";

   procedure Draw_Model (
      Data     : Model     := No_Model;
      Position : Vector_3D := (others => 0.0);
      Scale    : Float     := 1.0;
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawModel";

   procedure Draw_Model_Ex (
      Data     : Model     := No_Model;
      Position : Vector_3D := (others => 0.0);
      Axis     : Vector_3D := (others => 0.0);
      Angle    : Float     := 0.0;
      Scale    : Vector_3D := (1.0, 1.0, 1.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawModelEx";

   procedure Draw_Model_Wires (
      Data     : Model     := No_Model;
      Position : Vector_3D := (others => 0.0);
      Scale    : Float     := 0.0;
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawModelWires";

   procedure Draw_Model_Wires_Ex (
      Data     : Model     := No_Model;
      Position : Vector_3D := (others => 0.0);
      Axis     : Vector_3D := (others => 0.0);
      Angle    : Float     := 0.0;
      Scale    : Vector_3D := (1.0, 1.0, 1.0);
      Tint     : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawModelWiresEx";

   procedure Draw_Bounding_Box (
      Box  : Bounding_Box := No_Bounding_Box;
      Tint : Color        := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawBoundingBox";

   procedure Draw_Billboard (
      Camera    : Camera_3D := No_Camera_3D;
      Billboard : Texture   := No_Texture;
      Position  : Vector_3D := (others => 0.0);
      Size      : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawBillboard";

   procedure Draw_Billboard_Rec (
      Camera    : Camera_3D := No_Camera_3D;
      Billboard : Texture   := No_Texture;
      Source    : Rectangle := No_Rectangle;
      Position  : Vector_3D := (others => 0.0);
      Size      : Vector_2D := (others => 0.0);
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawBillboardRec";

   procedure Draw_Billboard_Pro (
      Camera    : Camera_3D := No_Camera_3D;
      Billboard : Texture   := No_Texture;
      Source    : Rectangle := No_Rectangle;
      Position  : Vector_3D := (others => 0.0);
      Up        : Vector_3D := (others => 0.0);
      Size      : Vector_2D := (others => 0.0);
      Origin    : Vector_2D := (others => 0.0);
      Rotation  : Float     := 0.0;
      Tint      : Color     := White
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawBillboardPro";

   procedure Upload_Mesh (
      Data    : access Mesh    := null;
      Dynamic :        Logical := False
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UploadMesh";

   procedure Update_Mesh_Buffer (
      Data      : Mesh    := No_Mesh;
      Index     : Integer := 0;
      This      : Pointer := null;
      Data_Size : Natural := 0;
      Offset    : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateMeshBuffer";

   procedure Unload_Mesh (
      Data : Mesh := No_Mesh
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadMesh";

   procedure Draw_Mesh (
      Data      : Mesh      := No_Mesh;
      Pixels    : Material  := No_Material;
      Transform : Matrix_4D := (others => 0.0)
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawMesh";

   procedure Draw_Mesh_Instanced (
      Data         :        Mesh      := No_Mesh;
      Use_Material :        Material  := No_Material;
      Transforms   : access Matrix_4D := null;
      Instances    :        Integer   := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DrawMeshInstanced";

   function Get_Mesh_Bounding_Box (
      Data : Mesh := No_Mesh
   ) return Bounding_Box with
      Import        => True,
      Convention    => C,
      External_Name => "GetMeshBoundingBox";

   procedure Gen_Mesh_Tangents (
      Data : access Mesh := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshTangents";

   function Export_Mesh (
      Data      : Mesh   := No_Mesh;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportMesh";

   function Export_Mesh_As_Code (
      Data      : Mesh   := No_Mesh;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportMeshAsCode";

   function Gen_Mesh_Poly (
      Sides  : Integer := 0;
      Radius : Float   := 0.0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshPoly";

   function Gen_Mesh_Plane (
      Width  : Float   := 1.0;
      Height : Float   := 1.0;
      X      : Integer := 1;
      Z      : Integer := 1
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshPlane";

   function Gen_Mesh_Cube (
      Width  : Float := 0.0;
      Height : Float := 0.0;
      Length : Float := 0.0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshCube";

   function Gen_Mesh_Sphere (
      Radius : Float   := 0.0;
      Rings  : Integer := 0;
      Slices : Integer := 0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshSphere";

   function Gen_Mesh_Hemisphere (
      Radius : Float   := 0.0;
      Rings  : Integer := 0;
      Slices : Integer := 0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshHemiSphere";

   function Gen_Mesh_Cylinder (
      Radius : Float   := 0.0;
      Height : Float   := 0.0;
      Slices : Integer := 0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshCylinder";

   function Gen_Mesh_Cone (
      Radius : Float   := 0.0;
      Height : Float   := 0.0;
      Slices : Integer := 0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshCone";

   function Gen_Mesh_Torus (
      Radius   : Float   := 0.0;
      Size     : Float   := 0.0;
      Segments : Integer := 0;
      Sides    : Integer := 0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshTorus";

   function Gen_Mesh_Knot (
      Radius   : Float   := 0.0;
      Size     : Float   := 0.0;
      Segments : Integer := 0;
      Sides    : Integer := 0
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshKnot";

   function Gen_Mesh_Height_Map (
      Height_Map : Image     := No_Image;
      Size       : Vector_3D := (others => 0.0)
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshHeightmap";

   function Gen_Mesh_Cubic_Map (
      Cubic_Map : Image     := No_Image;
      Size      : Vector_3D := (others => 0.0)
   ) return Mesh with
      Import        => True,
      Convention    => C,
      External_Name => "GenMeshCubicmap";

   function Load_Materials (
      File_Name :        String  := "";
      Counts    : access Integer := null
   ) return access Material with
      Import        => True,
      Convention    => C,
      External_Name => "LoadMaterials";

   function Load_Material_Default return Material with
      Import        => True,
      Convention    => C,
      External_Name => "LoadMaterialDefault";

   function Is_Material_Ready (
      Data : Material := No_Material
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMaterialReady";

   procedure Unload_Material (
      Data : Material := No_Material
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadMaterial";

   procedure Set_Material_Texture (
      Data : access Material           := null;
      Kind :        Material_Map_Index := Material_Map_Height;
      This :        Texture            := No_Texture
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMaterialTexture";

   procedure Set_Model_Mesh_Material (
      Data        : access Model   := null;
      Mesh_Id     :        Integer := 0;
      Material_Id :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetModelMeshMaterial";

   function Load_Model_Animations (
      File_Name :        String  := "";
      Counts    : access Integer := null
   ) return access Model_Animation with
      Import        => True,
      Convention    => C,
      External_Name => "LoadModelAnimations";

   procedure Update_Model_Animation (
      Data      : Model           := No_Model;
      Animation : Model_Animation := No_Model_Animation;
      Frame     : Integer         := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateModelAnimation";

   procedure Unload_Model_Animation (
      Animation : Model_Animation := No_Model_Animation
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadModelAnimation";

   procedure Unload_Model_Animations (
      Animations      : access Model_Animation := null;
      Animation_Count :        Natural         := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadModelAnimations";

   function Is_Model_Animation_Valid (
      Data      : Model           := No_Model;
      Animation : Model_Animation := No_Model_Animation
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsModelAnimationValid";

   function Check_Collision_Spheres (
      Center_1 : Vector_3D := (others => 0.0);
      Radius_1 : Float     := 0.0;
      Center_2 : Vector_3D := (others => 0.0);
      Radius_2 : Float     := 0.0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionSpheres";

   function Check_Collision_Boxes (
      Box_1 : Bounding_Box := No_Bounding_Box;
      Box_2 : Bounding_Box := No_Bounding_Box
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionBoxes";

   function Check_Collision_Box_Sphere (
      Box    : Bounding_Box := No_Bounding_Box;
      Center : Vector_3D    := (others => 0.0);
      Radius : Float        := 0.0
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "CheckCollisionBoxSphere";

   function Get_Ray_Collision_Sphere (
      Hit    : Ray       := No_Ray;
      Center : Vector_3D := (others => 0.0);
      Radius : Float     := 0.0
   ) return Ray_Collision with
      Import        => True,
      Convention    => C,
      External_Name => "GetRayCollisionSphere";

   function Get_Ray_Collision_Box (
      Hit : Ray          := No_Ray;
      Box : Bounding_Box := No_Bounding_Box
   ) return Ray_Collision with
      Import        => True,
      Convention    => C,
      External_Name => "GetRayCollisionBox";

   function Get_Ray_Collision_Mesh (
      Hit       : Ray       := No_Ray;
      Data      : Mesh      := No_Mesh;
      Transform : Matrix_4D := Id_Matrix
   ) return Ray_Collision with
      Import        => True,
      Convention    => C,
      External_Name => "GetRayCollisionMesh";

   function Get_Ray_Collision_Triangle (
      Hit     : Ray       := No_Ray;
      Point_1 : Vector_3D := (others => 0.0);
      Point_2 : Vector_3D := (others => 0.0);
      Point_3 : Vector_3D := (others => 0.0)
   ) return Ray_Collision with
      Import        => True,
      Convention    => C,
      External_Name => "GetRayCollisionTriangle";

   function Get_Ray_Collision_Quad (
      Hit     : Ray       := No_Ray;
      Point_1 : Vector_3D := (others => 0.0);
      Point_2 : Vector_3D := (others => 0.0);
      Point_3 : Vector_3D := (others => 0.0);
      Point_4 : Vector_3D := (others => 0.0)
   ) return Ray_Collision with
      Import        => True,
      Convention    => C,
      External_Name => "GetRayCollisionQuad";

   procedure Open_Audio_Device with
      Import        => True,
      Convention    => C,
      External_Name => "InitAudioDevice";

   procedure Close_Audio_Device with
      Import        => True,
      Convention    => C,
      External_Name => "CloseAudioDevice";

   function Is_Audio_Device_Ready return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsAudioDeviceReady";

   procedure Set_Master_Volume (
      Volume : Float := 1.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMasterVolume";

   function Get_Master_Volume return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetMasterVolume";

   function Load_Wave (
      File_Name : String  := ""
   ) return Wave with
      Import        => True,
      Convention    => C,
      External_Name => "LoadWave";

   function Load_Wave_From_Memory (
      File_Type : String  := "";
      File_Data : Pointer := null;
      Data_Size : Natural := 0
   ) return Wave with
      Import        => True,
      Convention    => C,
      External_Name => "LoadWaveFromMemory";

   function Is_Wave_Ready (
      Data : Wave := No_Wave
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsWaveReady";

   function Load_Sound (
      File_Name : String := ""
   ) return Sound with
      Import        => True,
      Convention    => C,
      External_Name => "LoadSound";

   function Load_Sound_From_Wave (
      Data : Wave := No_Wave
   ) return Sound with
      Import        => True,
      Convention    => C,
      External_Name => "LoadSoundFromWave";

   function Load_Sound_Alias (
      Source : Sound := No_Sound
   ) return Sound with
      Import        => True,
      Convention    => C,
      External_Name => "LoadSoundAlias";

   function Is_Sound_Ready (
      Source : Sound := No_Sound
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsSoundReady";

   procedure Update_Sound (
      Source       : Sound   := No_Sound;
      Data         : Pointer := null;
      Sample_Count : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateSound";

   procedure Unload_Wave (
      Data : Wave := No_Wave
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadWave";

   procedure Unload_Sound (
      Data : Sound := No_Sound
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadSound";

   procedure Unload_Sound_Alias (
      Alias : Sound := No_Sound
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadSoundAlias";

   function Export_Wave (
      Data      : Wave   := No_Wave;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportWave";

   function Export_Wave_As_Code (
      Data      : Wave   := No_Wave;
      File_Name : String := ""
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "ExportWaveAsCode";

   procedure Play_Sound (
      Data : Sound := No_Sound
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PlaySound";

   procedure Stop_Sound (
      Data : Sound := No_Sound
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "StopSound";

   procedure Pause_Sound (
      Data : Sound := No_Sound
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PauseSound";

   procedure Resume_Sound (
      Data : Sound := No_Sound
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ResumeSound";

   function Is_Sound_Playing (
      Data : Sound := No_Sound
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsSoundPlaying";

   procedure Set_Sound_Volume (
      Data   : Sound := No_Sound;
      Volume : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetSoundVolume";

   procedure Set_Sound_Pitch (
      Data  : Sound := No_Sound;
      Pitch : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetSoundPitch";

   procedure Set_Sound_Pan (
      Data : Sound := No_Sound;
      Pan  : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetSoundPan";

   function Wave_Copy (
      Data : Wave := No_Wave
   ) return Wave with
      Import        => True,
      Convention    => C,
      External_Name => "WaveCopy";

   procedure Wave_Crop (
      Data         : access Wave    := null;
      First_Sample :        Integer := 0;
      Final_Sample :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "WaveCrop";

   procedure Wave_Format (
      Data        : access Wave    := null;
      Sample_Rate :        Integer := 0;
      Sample_Size :        Integer := 0;
      Channels    :        Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "WaveFormat";

   function Load_Wave_Samples (
      Data : Wave := No_Wave
   ) return access Float with
      Import        => True,
      Convention    => C,
      External_Name => "LoadWaveSamples";

   procedure Unload_Wave_Samples (
      Samples : access Float := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadWaveSamples";

   function Load_Music_Stream (
      File_Name : String := ""
   ) return Music with
      Import        => True,
      Convention    => C,
      External_Name => "LoadMusicStream";

   function Load_Music_Stream_From_Memory (
      File_Type : String  := "";
      Data      : Pointer := null;
      Data_Size : Integer := 0
   ) return Music with
      Import        => True,
      Convention    => C,
      External_Name => "LoadMusicStreamFromMemory";

   function Is_Music_Ready (
      Data : Music := No_Music
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMusicReady";

   procedure Unload_Music_Stream (
      Data : Music := No_Music
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadMusicStream";

   procedure Play_Music_Stream (
      Data : Music := No_Music
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PlayMusicStream";

   function Is_Music_Stream_Playing (
      Data : Music := No_Music
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsMusicStreamPlaying";

   procedure Update_Music_Stream (
      Data : Music := No_Music
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateMusicStream";

   procedure Stop_Music_Stream (
      Data : Music := No_Music
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "StopMusicStream";

   procedure Pause_Music_Stream (
      Data : Music := No_Music
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PauseMusicStream";

   procedure Resume_Music_Stream (
      Data : Music := No_Music
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ResumeMusicStream";

   procedure Seek_Music_Stream (
      Data     : Music := No_Music;
      Position : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SeekMusicStream";

   procedure Set_Music_Volume (
      Data   : Music := No_Music;
      Volume : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMusicVolume";

   procedure Set_Music_Pitch (
      Data  : Music := No_Music;
      Pitch : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMusicPitch";

   procedure Set_Music_Pan (
      Data : Music := No_Music;
      Pan  : Float := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetMusicPan";

   function Get_Music_Time_Length (
      Data : Music := No_Music
   ) return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetMusicTimeLength";

   function Get_Music_Time_Played (
      Data : Music := No_Music
   ) return Float with
      Import        => True,
      Convention    => C,
      External_Name => "GetMusicTimePlayed";

   function Load_Audio_Stream (
      Sample_Rate : Natural := 0;
      Sample_Size : Natural := 0;
      Channels    : Natural := 0
   ) return Audio_Stream with
      Import        => True,
      Convention    => C,
      External_Name => "LoadAudioStream";

   function Is_Audio_Stream_Ready (
      Data : Audio_Stream := No_Audio_Stream
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsAudioStreamReady";

   procedure Unload_Audio_Stream (
      Data : Audio_Stream := No_Audio_Stream
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UnloadAudioStream";

   procedure Update_Audio_Stream (
      Data        : Audio_Stream := No_Audio_Stream;
      Raw_Data    : Pointer      := null;
      Frame_Count : Integer      := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "UpdateAudioStream";

   function Is_Audio_Stream_Processed (
      Data : Audio_Stream := No_Audio_Stream
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsAudioStreamProcessed";

   procedure Play_Audio_Stream (
      Data : Audio_Stream := No_Audio_Stream
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PlayAudioStream";

   procedure Pause_Audio_Stream (
      Data : Audio_Stream := No_Audio_Stream
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "PauseAudioStream";

   procedure Resume_Audio_Stream (
      Data : Audio_Stream := No_Audio_Stream
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "ResumeAudioStream";

   function Is_Audio_Stream_Playing (
      Data : Audio_Stream := No_Audio_Stream
   ) return Logical with
      Import        => True,
      Convention    => C,
      External_Name => "IsAudioStreamPlaying";

   procedure Stop_Audio_Stream (
      Data : Audio_Stream := No_Audio_Stream
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "StopAudioStream";

   procedure Set_Audio_Stream_Volume (
      Data   : Audio_Stream := No_Audio_Stream;
      Volume : Float        := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetAudioStreamVolume";

   procedure Set_Audio_Stream_Pitch (
      Data  : Audio_Stream := No_Audio_Stream;
      Pitch : Float        := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetAudioStreamPitch";

   procedure Set_Audio_Stream_Pan (
      Data : Audio_Stream := No_Audio_Stream;
      Pan  : Float        := 0.0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetAudioStreamPan";

   procedure Set_Audio_Stream_Buffer_Size_Default (
      Size : Integer := 0
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "SetAudioStreamBufferSizeDefault";

   procedure Attach_Audio_Stream_Processor (
      Stream    : Audio_Stream := No_Audio_Stream;
      Processor : Pointer      := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "AttachAudioStreamProcessor";

   procedure Detach_Audio_Stream_Processor (
      Stream    : Audio_Stream := No_Audio_Stream;
      Processor : Pointer      := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DetachAudioStreamProcessor";

   procedure Attach_Audio_Mixed_Processor (
      Processor : Pointer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "AttachAudioMixedProcessor";

   procedure Detach_Audio_Mixed_Processor (
      Processor : Pointer := null
   ) with
      Import        => True,
      Convention    => C,
      External_Name => "DetachAudioMixedProcessor";

------------------------------------------------------------------------

end Raylib;
