diff options
Diffstat (limited to 'sdl2')
| -rw-r--r-- | sdl2/audio.ha | 31 | ||||
| -rw-r--r-- | sdl2/blendmode.ha | 11 | ||||
| -rw-r--r-- | sdl2/errors.ha | 31 | ||||
| -rw-r--r-- | sdl2/events.ha | 471 | ||||
| -rw-r--r-- | sdl2/gamecontroller.ha | 99 | ||||
| -rw-r--r-- | sdl2/gl.ha | 49 | ||||
| -rw-r--r-- | sdl2/image/image.ha | 46 | ||||
| -rw-r--r-- | sdl2/joystick.ha | 12 | ||||
| -rw-r--r-- | sdl2/keyboard.ha | 657 | ||||
| -rw-r--r-- | sdl2/mixer/channels.ha | 20 | ||||
| -rw-r--r-- | sdl2/mixer/general.ha | 54 | ||||
| -rw-r--r-- | sdl2/mixer/samples.ha | 38 | ||||
| -rw-r--r-- | sdl2/mouse.ha | 49 | ||||
| -rw-r--r-- | sdl2/pixels.ha | 55 | ||||
| -rw-r--r-- | sdl2/rect.ha | 29 | ||||
| -rw-r--r-- | sdl2/render.ha | 371 | ||||
| -rw-r--r-- | sdl2/rwops.ha | 134 | ||||
| -rw-r--r-- | sdl2/sdl2.ha | 23 | ||||
| -rw-r--r-- | sdl2/surface.ha | 53 | ||||
| -rw-r--r-- | sdl2/timer.ha | 32 | ||||
| -rw-r--r-- | sdl2/video.ha | 117 |
21 files changed, 0 insertions, 2382 deletions
diff --git a/sdl2/audio.ha b/sdl2/audio.ha deleted file mode 100644 index 1b78880..0000000 --- a/sdl2/audio.ha +++ /dev/null @@ -1,31 +0,0 @@ -// Audio format flags. -// -// Current representation (unspecified bits are always zero): -// -// ++-----------------------sample is signed if set -// || -// || ++-----------sample is bigendian if set -// || || -// || || ++---sample is float if set -// || || || -// || || || +---sample bit size---+ -// || || || | | -// 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 -export type SDL_AudioFormat = u16; - -// Unsigned 8-bit samples -export def AUDIO_U8: SDL_AudioFormat = 0x0008; -// Signed 8-bit samples -export def AUDIO_S8: SDL_AudioFormat = 0x8008; -// Unsigned 16-bit samples, little-endian -export def AUDIO_U16LSB: SDL_AudioFormat = 0x0010; -// Signed 16-bit samples, little-endian -export def AUDIO_S16LSB: SDL_AudioFormat = 0x8010; -// Unsigned 16-bit samples, big-endian -export def AUDIO_U16MSB: SDL_AudioFormat = 0x1010; -// Signed 16-bit samples, big-endian -export def AUDIO_S16MSB: SDL_AudioFormat = 0x9010; -// Unsigned 16-bit samples -export def AUDIO_U16: SDL_AudioFormat = AUDIO_U16LSB; -// Signed 16-bit samples -export def AUDIO_S16: SDL_AudioFormat = AUDIO_S16LSB; diff --git a/sdl2/blendmode.ha b/sdl2/blendmode.ha deleted file mode 100644 index 25acab6..0000000 --- a/sdl2/blendmode.ha +++ /dev/null @@ -1,11 +0,0 @@ -// TODO: Flesh me out - -// The blend mode used in SDL_RenderCopy() and drawing operations. -export type SDL_BlendMode = enum { - NONE = 0x00000000, - BLEND = 0x00000001, - ADD = 0x00000002, - MOD = 0x00000004, - MUL = 0x00000008, - INVALID = 0x7FFFFFFF -}; diff --git a/sdl2/errors.ha b/sdl2/errors.ha deleted file mode 100644 index a848667..0000000 --- a/sdl2/errors.ha +++ /dev/null @@ -1,31 +0,0 @@ -use types::c; - -// Returned when an error occurs in an SDL function. -export type error = !str; - -// Converts an SDL error into a human-friendly string. -export fn strerror(err: error) str = { - return err: str; -}; - -@symbol("SDL_GetError") fn SDL_GetError() const *c::char; - -export fn wrapvoid(ret: int) (void | error) = { - wrapint(ret)?; -}; - -export fn wrapint(ret: int) (int | error) = { - if (ret < 0) { - return c::tostr(SDL_GetError()): error; - }; - return ret; -}; - -export fn wrapptr(ret: nullable *opaque) (*opaque | error) = { - match (ret) { - case let v: *opaque => - return v; - case null => - return c::tostr(SDL_GetError()): error; - }; -}; diff --git a/sdl2/events.ha b/sdl2/events.ha deleted file mode 100644 index 55a0a63..0000000 --- a/sdl2/events.ha +++ /dev/null @@ -1,471 +0,0 @@ -use types::c; - -export type SDL_EventType = enum u32 { - FIRSTEVENT = 0, - - QUIT = 0x100, - - APP_TERMINATING, - APP_LOWMEMORY, - APP_WILLENTERBACKGROUND, - APP_DIDENTERBACKGROUND, - APP_WILLENTERFOREGROUND, - APP_DIDENTERFOREGROUND, - - DISPLAYEVENT = 0x150, - - WINDOWEVENT = 0x200, - SYSWMEVENT, - - KEYDOWN = 0x300, - KEYUP, - TEXTEDITING, - TEXTINPUT, - KEYMAPCHANGED, - - MOUSEMOTION = 0x400, - MOUSEBUTTONDOWN, - MOUSEBUTTONUP, - MOUSEWHEEL, - - JOYAXISMOTION = 0x600, - JOYBALLMOTION, - JOYHATMOTION, - JOYBUTTONDOWN, - JOYBUTTONUP, - JOYDEVICEADDED, - JOYDEVICEREMOVED, - - CONTROLLERAXISMOTION = 0x650, - CONTROLLERBUTTONDOWN, - CONTROLLERBUTTONUP, - CONTROLLERDEVICEADDED, - CONTROLLERDEVICEREMOVED, - CONTROLLERDEVICEREMAPPED, - - FINGERDOWN = 0x700, - FINGERUP, - FINGERMOTION, - - DOLLARGESTURE = 0x800, - DOLLARRECORD, - MULTIGESTURE, - - CLIPBOARDUPDATE = 0x900, - - DROPFILE = 0x1000, - DROPTEXT, - DROPBEGIN, - DROPCOMPLETE, - - AUDIODEVICEADDED = 0x1100, - AUDIODEVICEREMOVED, - - SENSORUPDATE = 0x1200, - - RENDER_TARGETS_RESET = 0x2000, - RENDER_DEVICE_RESET, - - USEREVENT = 0x8000, - - LASTEVENT = 0xFFFF -}; - -// Fields shared by every event -export type SDL_CommonEvent = struct { - event_type: SDL_EventType, - timestamp: u32, -}; - -// Display state change event data (event.display.*) -export type SDL_DisplayEvent = struct { - SDL_CommonEvent, - display: u32, - event: u8, - padding1: u8, - padding2: u8, - padding3: u8, - data1: i32, -}; - -// Window state change event data (event.window.*) -export type SDL_WindowEvent = struct { - SDL_CommonEvent, - window_id: u32, - event: u8, - padding1: u8, - padding2: u8, - padding3: u8, - data1: i32, - data2: i32, -}; - -// Keyboard button event structure (event.key.*) -export type SDL_KeyboardEvent = struct { - SDL_CommonEvent, - window_id: u32, - state: u8, - repeat: u8, - padding2: u8, - padding3: u8, - keysym: SDL_Keysym, -}; - -// Size of the [[SDL_TextEditingEvent]] 'text' field. -export def TEXTEDITINGEVENT_TEXT_SIZE: size = 32; - -// Keyboard text editing event structure (event.edit.*) -export type SDL_TextEditingEvent = struct { - SDL_CommonEvent, - window_id: u32, - text: [TEXTEDITINGEVENT_TEXT_SIZE]c::char, - start: i32, - length: i32, -}; - -// Size of the [[SDL_TextInputEvent]] 'text' field. -export def TEXTINPUTEVENT_TEXT_SIZE: size = 32; - -// Keyboard text input event structure (event.text.*) -export type SDL_TextInputEvent = struct { - SDL_CommonEvent, - window_id: u32, - text: [TEXTINPUTEVENT_TEXT_SIZE]c::char, -}; - -// Mouse motion event structure (event.motion.*) -export type SDL_MouseMotionEvent = struct { - SDL_CommonEvent, - window_id: u32, - which: u32, - state: u32, - x: i32, - y: i32, - xrel: i32, - yrel: i32, -}; - -// Mouse button event structure (event.button.*) -export type SDL_MouseButtonEvent = struct { - SDL_CommonEvent, - window_id: u32, - which: u32, - button: u8, - state: u8, - clicks: u8, - padding1: u8, - x: i32, - y: i32, -}; - -// Mouse wheel event structure (event.wheel.*) -export type SDL_MouseWheelEvent = struct { - SDL_CommonEvent, - window_id: u32, - which: u32, - x: i32, - y: i32, - direction: u32, -}; - -// Joystick axis motion event structure (event.jaxis.*) -export type SDL_JoyAxisEvent = struct { - SDL_CommonEvent, - which: i32, // TODO: Rig me up with the JoystickID type - axis: u8, - padding1: u8, - padding2: u8, - padding3: u8, - value: i16, - padding4: u16, -}; - -// Joystick trackball motion event structure (event.jball.*) -export type SDL_JoyBallEvent = struct { - SDL_CommonEvent, - which: i32, // TODO: Rig me up with the JoystickID type - ball: u8, - padding1: u8, - padding2: u8, - padding3: u8, - xrel: i16, - yrel: i16, -}; - -// Joystick hat position change event structure (event.jhat.*) -export type SDL_JoyHatEvent = struct { - SDL_CommonEvent, - which: i32, // TODO: Rig me up with the JoystickID type - hat: u8, - value: u8, // TODO: Rig me up with HAT_UP et al - padding1: u8, - padding2: u8, -}; - -// Joystick button event structure (event.jbutton.*) -export type SDL_JoyButtonEvent = struct { - SDL_CommonEvent, - which: i32, // TODO: Rig me up with the JoystickID type - button: u8, - state: u8, - padding1: u8, - padding2: u8, -}; - -// Joystick device event structure (event.jdevice.*) -export type SDL_JoyDeviceEvent = struct { - SDL_CommonEvent, - which: i32, -}; - -// Game controller axis motion event structure (event.caxis.*) -export type SDL_ControllerAxisEvent = struct { - SDL_CommonEvent, - which: i32, // TODO - axis: SDL_GameControllerAxis, - padding1: u8, - padding2: u8, - padding3: u8, - value: i16, - padding4: u16, -}; - -// Game controller button event structure (event.cbutton.*) -export type SDL_ControllerButtonEvent = struct { - SDL_CommonEvent, - which: i32, - button: u8, - state: u8, - padding1: u8, - padding2: u8, -}; - -// Controller device event structure (event.cdevice.*) -export type SDL_ControllerDeviceEvent = struct { - SDL_CommonEvent, - which: i32, -}; - -// Audio device event structure (event.adevice.*) -export type SDL_AudioDeviceEvent = struct { - SDL_CommonEvent, - which: u32, - iscapture: u8, - padding1: u8, - padding2: u8, - padding3: u8, -}; - -// Touch finger event structure (event.tfinger.*) -export type SDL_TouchFingerEvent = struct { - SDL_CommonEvent, - touch_id: i64, // TODO - finger_id: i64, // TODO - x: f32, - y: f32, - dx: f32, - dy: f32, - pressure: f32, -}; - -// Multiple Finger Gesture Event (event.mgesture.*) -export type SDL_MultiGestureEvent = struct { - SDL_CommonEvent, - touch_id: i64, // TODO - dtheta: f32, - ddist: f32, - x: f32, - y: f32, - num_fingers: u16, - padding: u16, -}; - -// Dollar Gesture Event (event.dgesture.*) -export type SDL_DollarGestureEvent = struct { - SDL_CommonEvent, - touch_id: i64, // TODO - gesture_id: i64, // TODO - num_fingers: u32, - error: f32, - x: f32, - y: f32, -}; - -// An event used to request a file open by the system (event.drop.*) -// This event is enabled by default, you can disable it with [[eventstate]]. -// If this event is enabled, you must free the filename in the event. -export type SDL_DropEvent = struct { - SDL_CommonEvent, - file: *c::char, - window_id: u32, -}; - -// Sensor event structure (event.sensor.*) -export type SDL_SensorEvent = struct { - SDL_CommonEvent, - which: i32, - data: [6]f32, -}; - -// The "quit requested" event -export type SDL_QuitEvent = struct { - SDL_CommonEvent, -}; - -// OS Specific event -export type SDL_OSEvent = struct { - SDL_CommonEvent, -}; - -// A user-defined event type (event.user.*) -export type SDL_UserEvent = struct { - SDL_CommonEvent, - window_id: u32, - code: i32, - data1: *opaque, - data2: *opaque, -}; - -// A video driver dependent system event (event.syswm.*) -// This event is disabled by default, you can enable it with [[eventstate]]. -export type SDL_SysWMEvent = struct { - SDL_CommonEvent, - msg: *opaque, // TODO -}; - -// General event structure -export type event = union { - event_type: SDL_EventType, - common: SDL_CommonEvent, - display: SDL_DisplayEvent, - window: SDL_WindowEvent, - key: SDL_KeyboardEvent, - edit: SDL_TextEditingEvent, - text: SDL_TextInputEvent, - motion: SDL_MouseMotionEvent, - button: SDL_MouseButtonEvent, - wheel: SDL_MouseWheelEvent, - jaxis: SDL_JoyAxisEvent, - jball: SDL_JoyBallEvent, - jhat: SDL_JoyHatEvent, - jbutton: SDL_JoyButtonEvent, - jdevice: SDL_JoyDeviceEvent, - caxis: SDL_ControllerAxisEvent, - cbutton: SDL_ControllerButtonEvent, - cdevice: SDL_ControllerDeviceEvent, - adevice: SDL_AudioDeviceEvent, - sensor: SDL_SensorEvent, - quit: SDL_QuitEvent, - user: SDL_UserEvent, - syswm: SDL_SysWMEvent, - tfinger: SDL_TouchFingerEvent, - mgesture: SDL_MultiGestureEvent, - dgestures: SDL_DollarGestureEvent, - drop: SDL_DropEvent, - - padding: [56]u8, -}; - -// Pumps the event loop, gathering events from the input devices. -// -// This function updates the event queue and internal input device state. -// -// This should only be run in the thread that sets the video mode. -export @symbol("SDL_PumpEvents") fn SDL_PumpEvents() void; - -export type eventaction = enum { - ADDEVENT, - PEEKEVENT, - GETEVENT, -}; - -@symbol("SDL_PeepEvents") fn _peep_events(events: *event, numevents: int, - action: eventaction, mintype: SDL_EventType, maxtype: SDL_EventType) int; - -// Checks the event queue for messages and optionally returns them. -// -// If 'action' is ADDEVENT, up to 'numevents' events will be added to the back -// of the event queue. -// -// If 'action' is PEEKEVENT, up to 'numevents' events at the front of the event -// queue, within the specified minimum and maximum type, will be returned and -// will not be removed from the queue. -// -// If 'action' is GETEVENT, up to 'numevents' events at the front of the event -// queue, within the specified minimum and maximum type, will be returned and -// will be removed from the queue. -// -// This function is thread-safe. -export fn SDL_PeepEvents( - events: *event, - numevents: int, - action: eventaction, - mintype: SDL_EventType, - maxtype: SDL_EventType, -) (int | error) = { - return wrapint(_peep_events(events, numevents, action, mintype, maxtype)); -}; - -// Checks to see if certain event types are in the event queue. -export @symbol("SDL_HasEvent") fn SDL_HasEvent(SDL_EventType: SDL_EventType) bool; - -// Checks to see if certain event types are in the event queue. -export @symbol("SDL_HasEvents") fn SDL_HasEvents(mintype: SDL_EventType, maxtype: SDL_EventType) bool; - -// This function clears events from the event queue -// This function only affects currently queued events. If you want to make -// sure that all pending OS events are flushed, you can call SDL_PumpEvents() -// on the main thread immediately before the flush call. -export @symbol("SDL_FlushEvent") fn flush_event(SDL_EventType: SDL_EventType) void; - -// This function clears events from the event queue -// This function only affects currently queued events. If you want to make -// sure that all pending OS events are flushed, you can call SDL_PumpEvents() -// on the main thread immediately before the flush call. -export @symbol("SDL_FlushEvents") fn SDL_FlushEvents(mintype: SDL_EventType, maxtype: SDL_EventType) void; - -@symbol("SDL_PollEvent") fn _poll_event(event: nullable *event) int; - -// Polls for currently pending events. -// -// Returns 1 if there are any pending events, or 0 if there are none available. -// -// If 'event' is not null, the next event is removed from the queue and stored -// in that area. -export fn SDL_PollEvent(event: nullable *event) (int | error) = { - return wrapint(_poll_event(event)); -}; - -@symbol("SDL_WaitEvent") fn _wait_event(event: nullable *event) int; - -// Waits indefinitely for the next available event. -// -// If 'event' is not null, the next event is removed from the queue and stored -// in that area. -export fn SDL_WaitEvent(event: nullable *event) (void | error) = { - return wrapvoid(_wait_event(event)); -}; - -@symbol("SDL_WaitEventTimeout") fn _wait_event_timeout( - event: nullable *event, timeout: int) int; - -// Waits until the specified timeout (in milliseconds) for the next available event. -// -// If 'event' is not null, the next event is removed from the queue and stored -// in that area. The 'timeout' is the time (in milliseconds) to wait for next -// event. -export fn SDL_WaitEventTimeout( - event: nullable *event, - timeout: int, -) (void | error) = { - return wrapvoid(_wait_event_timeout(event, timeout)); -}; - -@symbol("SDL_PushEvent") fn _push_event(event: *event) int; - -// Add an event to the event queue. -export fn SDL_PushEvent(event: *event) (void | error) = { - return wrapvoid(_push_event(event)); -}; - -// TODO: Finish rigging up other SDL_events.h bits diff --git a/sdl2/gamecontroller.ha b/sdl2/gamecontroller.ha deleted file mode 100644 index 4cab9ce..0000000 --- a/sdl2/gamecontroller.ha +++ /dev/null @@ -1,99 +0,0 @@ -// TODO: Flesh me out - -// The SDL_GameController structure used to identify an SDL game controller. -// (Opaque) -export type SDL_GameController = opaque; - -// The list of axes available from a controller -// -// Thumbstick axis values range from [[SDL_JOYSTICK_AXIS_MIN]] to -// [[SDL_JOYSTICK_AXIS_MAX]], and are centered within ~8000 of zero, though advanced -// UI will allow users to set or autodetect the dead zone, which varies between -// controllers. -// -// Trigger axis values range from 0 to [[SDL_JOYSTICK_AXIS_MAX]]. -export type SDL_GameControllerAxis = enum u8 { - LEFTX, - LEFTY, - RIGHTX, - RIGHTY, - TRIGGERLEFT, - TRIGGERRIGHT, - INVALID = 255, -}; - -// The list of buttons available from a controller -export type SDL_GameControllerButton = enum u8 { - INVALID = 255, - A = 0, - B, - X, - Y, - BACK, - GUIDE, - START, - LEFTSTICK, - RIGHTSTICK, - LEFTSHOULDER, - RIGHTSHOULDER, - DPAD_UP, - DPAD_DOWN, - DPAD_LEFT, - DPAD_RIGHT, - MISC1, - PADDLE1, - PADDLE2, - PADDLE3, - PADDLE4, - TOUCHPAD, -}; - -// Check if the given joystick is supported by the game controller interface. -// -// 'joystick_index' is the same as the 'device_index' passed to -// [[joystick_open]]. -// -// Returns true if the given joystick is supported by the game controller -// interface, false if it isn't or it's an invalid index. -export @symbol("SDL_IsGameController") fn SDL_IsGameController( - joystick_index: int) bool; - -@symbol("SDL_GameControllerOpen") fn _game_controller_open( - joystick_index: int) nullable *SDL_GameController; - -// Get the SDL_GameController associated with an instance id. -export fn SDL_GameControllerOpen( - joystick_index: int, -) (*SDL_GameController | error) = { - return wrapptr(_game_controller_open(joystick_index))?: *SDL_GameController; -}; - -// Close a game controller previously opened with [[game_controller_open]]. -export @symbol("SDL_GameControllerClose") fn SDL_GameControllerClose( - gamecontroller: *SDL_GameController) void; - -@symbol("SDL_GameControllerRumble") fn _SDL_GameControllerRumble( - gamecontroller: *SDL_GameController, - low_frequency_rumble: u16, - high_frequency_rumble: u16, - duration_ms: u32) int; - -// Start a rumble effect on a game controller. -// -// Each call to this function cancels any previous rumble effect, and calling -// it with 0 intensity stops any rumbling. -// -// The low-frequency motor is generally on the left, and the high-frequency -// motor is generally on the right. -export fn SDL_GameControllerRumble( - gamecontroller: *SDL_GameController, - low_frequency_rumble: u16, - high_frequency_rumble: u16, - duration_ms: u32, -) (void | error) = { - return wrapvoid(_SDL_GameControllerRumble( - gamecontroller, - low_frequency_rumble, - high_frequency_rumble, - duration_ms)); -}; diff --git a/sdl2/gl.ha b/sdl2/gl.ha deleted file mode 100644 index b2295f6..0000000 --- a/sdl2/gl.ha +++ /dev/null @@ -1,49 +0,0 @@ -use types::c; - -export type SDL_GLContext = opaque; - -export type SDL_GLprofile = enum int { - GL_CONTEXT_PROFILE_CORE = 0x0001, - GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002, - GL_CONTEXT_PROFILE_ES = 0x0004, -}; - -export type SDL_GLattr = enum { - GL_RED_SIZE, - GL_GREEN_SIZE, - GL_BLUE_SIZE, - GL_ALPHA_SIZE, - GL_BUFFER_SIZE, - GL_DOUBLEBUFFER, - GL_DEPTH_SIZE, - GL_STENCIL_SIZE, - GL_ACCUM_RED_SIZE, - GL_ACCUM_GREEN_SIZE, - GL_ACCUM_BLUE_SIZE, - GL_ACCUM_ALPHA_SIZE, - GL_STEREO, - GL_MULTISAMPLEBUFFERS, - GL_MULTISAMPLESAMPLES, - GL_ACCELERATED_VISUAL, - GL_RETAINED_BACKING, - GL_CONTEXT_MAJOR_VERSION, - GL_CONTEXT_MINOR_VERSION, - GL_CONTEXT_EGL, - GL_CONTEXT_FLAGS, - GL_CONTEXT_PROFILE_MASK, - GL_SHARE_WITH_CURRENT_CONTEXT, - GL_FRAMEBUFFER_SRGB_CAPABLE, - GL_CONTEXT_RELEASE_BEHAVIOR, - GL_CONTEXT_RESET_NOTIFICATION, - GL_CONTEXT_NO_ERROR, -}; - -export @symbol("SDL_GL_CreateContext") fn SDL_GL_CreateContext( - window: *SDL_Window) *SDL_GLContext; -export @symbol("SDL_GL_GetProcAddress") fn SDL_GL_GetProcAddress( - proc: *const c::char) *opaque; -export @symbol("SDL_GL_SetAttribute") fn SDL_GL_SetAttribute( - attr: SDL_GLattr, value: int) *opaque; -export @symbol("SDL_GL_SwapWindow") fn SDL_GL_SwapWindow(window: *SDL_Window) void; -export @symbol("SDL_GL_SetSwapInterval") fn SDL_GL_SetSwapInterval(interval: int) bool; -export @symbol("SDL_GL_GetDrawableSize") fn SDL_GL_GetDrawableSize(window: *SDL_Window, w: *int, h: *int) void; diff --git a/sdl2/image/image.ha b/sdl2/image/image.ha deleted file mode 100644 index b4af99e..0000000 --- a/sdl2/image/image.ha +++ /dev/null @@ -1,46 +0,0 @@ -// TODO: Flesh me out -// TODO: SDL_RWops -use sdl2; -use types::c; - -// Flags for [[IMG_Init]]. -export type IMG_InitFlags = enum int { - NONE = 0, - JPG = 0x00000001, - PNG = 0x00000002, - TIF = 0x00000004, - WEBP = 0x00000008, -}; - -@symbol("IMG_Init") fn _IMG_Init(flags: IMG_InitFlags) int; - -// Loads dynamic libraries and prepares them for use. Flags should be one or -// more flags from [[IMG_InitFlags]] OR'd together. -export fn IMG_Init(flags: IMG_InitFlags) (void | sdl2::error) = { - return sdl2::wrapvoid(_IMG_Init(flags)); -}; - -// Unloads libraries loaded with [[IMG_Init]] -export @symbol("IMG_Quit") fn IMG_Quit() void; - -@symbol("IMG_Load") fn _IMG_Load(file: const *c::char) nullable *sdl2::SDL_Surface; - -// Load an image from a file path. -export fn IMG_Load(file: str) (*sdl2::SDL_Surface | sdl2::error) = { - const file = c::fromstr(file)!; - defer free(file); - return sdl2::wrapptr(_IMG_Load(file))?: *sdl2::SDL_Surface; -}; - -@symbol("IMG_LoadTexture") fn _IMG_LoadTexture(SDL_Renderer: *sdl2::SDL_Renderer, - file: const *c::char) nullable *sdl2::SDL_Texture; - -// Load an image directly into a render texture. -export fn IMG_LoadTexture( - SDL_Renderer: *sdl2::SDL_Renderer, - file: str, -) (*sdl2::SDL_Texture | sdl2::error) = { - const file = c::fromstr(file)!; - defer free(file); - return sdl2::wrapptr(_IMG_LoadTexture(SDL_Renderer, file))?: *sdl2::SDL_Texture; -}; diff --git a/sdl2/joystick.ha b/sdl2/joystick.ha deleted file mode 100644 index 2234aff..0000000 --- a/sdl2/joystick.ha +++ /dev/null @@ -1,12 +0,0 @@ -// TODO: Flesh me out - -// Minimum value for a joystick axis. -export def SDL_JOYSTICK_AXIS_MIN: i16 = -32768; - -// Minimum value for a joystick axis. -export def SDL_JOYSTICK_AXIS_MAX: i16 = 32767; - -@symbol("SDL_NumJoysticks") fn _SDL_NumJoysticks() int; - -// Returns the number of joysticks attached to the system. -export fn SDL_NumJoysticks() (int | error) = wrapint(_SDL_NumJoysticks()); diff --git a/sdl2/keyboard.ha b/sdl2/keyboard.ha deleted file mode 100644 index 02cedae..0000000 --- a/sdl2/keyboard.ha +++ /dev/null @@ -1,657 +0,0 @@ -use types::c; - -export type SDL_Scancode = enum uint { - UNKNOWN = 0, - - // Usage page 0x07 - // These values are from usage page 0x07 (USB keyboard page). - - A = 4, - B = 5, - C = 6, - D = 7, - E = 8, - F = 9, - G = 10, - H = 11, - I = 12, - J = 13, - K = 14, - L = 15, - M = 16, - N = 17, - O = 18, - P = 19, - Q = 20, - R = 21, - S = 22, - T = 23, - U = 24, - V = 25, - W = 26, - X = 27, - Y = 28, - Z = 29, - - ONE = 30, - TWO = 31, - THREE = 32, - FOUR = 33, - FIVE = 34, - SIX = 35, - SEVEN = 36, - EIGHT = 37, - NINE = 38, - ZERO = 39, - - RETURN = 40, - ESCAPE = 41, - BACKSPACE = 42, - TAB = 43, - SPACE = 44, - - MINUS = 45, - EQUALS = 46, - LEFTBRACKET = 47, - RIGHTBRACKET = 48, - // Located at the lower left of the return - // key on ISO keyboards and at the right end - // of the QWERTY row on ANSI keyboards. - // Produces REVERSE SOLIDUS (backslash) and - // VERTICAL LINE in a US layout, REVERSE - // SOLIDUS and VERTICAL LINE in a UK Mac - // layout, NUMBER SIGN and TILDE in a UK - // Windows layout, DOLLAR SIGN and POUND SIGN - // in a Swiss German layout, NUMBER SIGN and - // APOSTROPHE in a German layout, GRAVE - // ACCENT and POUND SIGN in a French Mac - // layout, and ASTERISK and MICRO SIGN in a - // French Windows layout. - BACKSLASH = 49, - NONUSHASH = 50, - // ISO USB keyboards actually use this code - // instead of 49 for the same key, but all - // OSes I've seen treat the two codes - // identically. So, as an implementor, unless - // your keyboard generates both of those - // codes and your OS treats them differently, - // you should generate BACKSLASH - // instead of this code. As a user, you - // should not rely on this code because SDL - // will never generate it with most (all?) - // keyboards. - SEMICOLON = 51, - APOSTROPHE = 52, - // Located in the top left corner (on both ANSI - // and ISO keyboards). Produces GRAVE ACCENT and - // TILDE in a US Windows layout and in US and UK - // Mac layouts on ANSI keyboards, GRAVE ACCENT - // and NOT SIGN in a UK Windows layout, SECTION - // SIGN and PLUS-MINUS SIGN in US and UK Mac - // layouts on ISO keyboards, SECTION SIGN and - // DEGREE SIGN in a Swiss German layout (Mac: - // only on ISO keyboards), CIRCUMFLEX ACCENT and - // DEGREE SIGN in a German layout (Mac: only on - // ISO keyboards), SUPERSCRIPT TWO and TILDE in a - // French Windows layout, COMMERCIAL AT and - // NUMBER SIGN in a French Mac layout on ISO - // keyboards, and LESS-THAN SIGN and GREATER-THAN - // SIGN in a Swiss German, German, or French Mac - // layout on ANSI keyboards. - GRAVE = 53, - COMMA = 54, - PERIOD = 55, - SLASH = 56, - - CAPSLOCK = 57, - - F1 = 58, - F2 = 59, - F3 = 60, - F4 = 61, - F5 = 62, - F6 = 63, - F7 = 64, - F8 = 65, - F9 = 66, - F10 = 67, - F11 = 68, - F12 = 69, - - PRINTSCREEN = 70, - SCROLLLOCK = 71, - PAUSE = 72, - // insert on PC, help on some Mac keyboards (but does send code 73, - // not 117) - INSERT = 73, - HOME = 74, - PAGEUP = 75, - DELETE = 76, - END = 77, - PAGEDOWN = 78, - RIGHT = 79, - LEFT = 80, - DOWN = 81, - UP = 82, - - NUMLOCKCLEAR = 83, // num lock on PC, clear on Mac keyboards - KP_DIVIDE = 84, - KP_MULTIPLY = 85, - KP_MINUS = 86, - KP_PLUS = 87, - KP_ENTER = 88, - KP_1 = 89, - KP_2 = 90, - KP_3 = 91, - KP_4 = 92, - KP_5 = 93, - KP_6 = 94, - KP_7 = 95, - KP_8 = 96, - KP_9 = 97, - KP_0 = 98, - KP_PERIOD = 99, - - // This is the additional key that ISO - // keyboards have over ANSI ones, - // located between left shift and Y. - // Produces GRAVE ACCENT and TILDE in a - // US or UK Mac layout, REVERSE SOLIDUS - // (backslash) and VERTICAL LINE in a - // US or UK Windows layout, and - // LESS-THAN SIGN and GREATER-THAN SIGN - // in a Swiss German, German, or French - // layout. */ - NONUSBACKSLASH = 100, - APPLICATION = 101, // windows contextual menu, compose - // The USB document says this is a status flag, not a physical key - but - // some Mac keyboards do have a power key. - POWER = 102, - KP_EQUALS = 103, - F13 = 104, - F14 = 105, - F15 = 106, - F16 = 107, - F17 = 108, - F18 = 109, - F19 = 110, - F20 = 111, - F21 = 112, - F22 = 113, - F23 = 114, - F24 = 115, - EXECUTE = 116, - HELP = 117, - MENU = 118, - SELECT = 119, - STOP = 120, - AGAIN = 121, // redo - UNDO = 122, - CUT = 123, - COPY = 124, - PASTE = 125, - FIND = 126, - MUTE = 127, - VOLUMEUP = 128, - VOLUMEDOWN = 129, -// not sure whether there's a reason to enable these -// LOCKINGCAPSLOCK = 130, -// LOCKINGNUMLOCK = 131, -// LOCKINGSCROLLLOCK = 132, - KP_COMMA = 133, - KP_EQUALSAS400 = 134, - - // used on Asian keyboards, see footnotes in USB doc - INTERNATIONAL1 = 135, - INTERNATIONAL2 = 136, - INTERNATIONAL3 = 137, // Yen - INTERNATIONAL4 = 138, - INTERNATIONAL5 = 139, - INTERNATIONAL6 = 140, - INTERNATIONAL7 = 141, - INTERNATIONAL8 = 142, - INTERNATIONAL9 = 143, - LANG1 = 144, // Hangul/English toggle - LANG2 = 145, // Hanja conversion - LANG3 = 146, // Katakana - LANG4 = 147, // Hiragana - LANG5 = 148, // Zenkaku/Hankaku - LANG6 = 149, // reserved - LANG7 = 150, // reserved - LANG8 = 151, // reserved - LANG9 = 152, // reserved - - ALTERASE = 153, // Erase-Eaze - SYSREQ = 154, - CANCEL = 155, - CLEAR = 156, - PRIOR = 157, - RETURN2 = 158, - SEPARATOR = 159, - OUT = 160, - OPER = 161, - CLEARAGAIN = 162, - CRSEL = 163, - EXSEL = 164, - - KP_00 = 176, - KP_000 = 177, - THOUSANDSSEPARATOR = 178, - DECIMALSEPARATOR = 179, - CURRENCYUNIT = 180, - CURRENCYSUBUNIT = 181, - KP_LEFTPAREN = 182, - KP_RIGHTPAREN = 183, - KP_LEFTBRACE = 184, - KP_RIGHTBRACE = 185, - KP_TAB = 186, - KP_BACKSPACE = 187, - KP_A = 188, - KP_B = 189, - KP_C = 190, - KP_D = 191, - KP_E = 192, - KP_F = 193, - KP_XOR = 194, - KP_POWER = 195, - KP_PERCENT = 196, - KP_LESS = 197, - KP_GREATER = 198, - KP_AMPERSAND = 199, - KP_DBLAMPERSAND = 200, - KP_VERTICALBAR = 201, - KP_DBLVERTICALBAR = 202, - KP_COLON = 203, - KP_HASH = 204, - KP_SPACE = 205, - KP_AT = 206, - KP_EXCLAM = 207, - KP_MEMSTORE = 208, - KP_MEMRECALL = 209, - KP_MEMCLEAR = 210, - KP_MEMADD = 211, - KP_MEMSUBTRACT = 212, - KP_MEMMULTIPLY = 213, - KP_MEMDIVIDE = 214, - KP_PLUSMINUS = 215, - KP_CLEAR = 216, - KP_CLEARENTRY = 217, - KP_BINARY = 218, - KP_OCTAL = 219, - KP_DECIMAL = 220, - KP_HEXADECIMAL = 221, - - LCTRL = 224, - LSHIFT = 225, - LALT = 226, // alt, option - LGUI = 227, // windows, command (apple), meta - RCTRL = 228, - RSHIFT = 229, - RALT = 230, // alt gr, option - RGUI = 231, // windows, command (apple), meta - - // I'm not sure if this is really not covered by any of the above, but - // since there's a special KMOD_MODE for it I'm adding it here - MODE = 257, - - // Usage page 0x0C - // These values are mapped from usage page 0x0C (USB consumer page). - - AUDIONEXT = 258, - AUDIOPREV = 259, - AUDIOSTOP = 260, - AUDIOPLAY = 261, - AUDIOMUTE = 262, - MEDIASELECT = 263, - WWW = 264, - MAIL = 265, - CALCULATOR = 266, - COMPUTER = 267, - AC_SEARCH = 268, - AC_HOME = 269, - AC_BACK = 270, - AC_FORWARD = 271, - AC_STOP = 272, - AC_REFRESH = 273, - AC_BOOKMARKS = 274, - - // Walther keys - // These are values that Christian Walther added (for mac keyboard?). - - BRIGHTNESSDOWN = 275, - BRIGHTNESSUP = 276, - // display mirroring/dual display switch, video mode switch - DISPLAYSWITCH = 277, - KBDILLUMTOGGLE = 278, - KBDILLUMDOWN = 279, - KBDILLUMUP = 280, - EJECT = 281, - SLEEP = 282, - - APP1 = 283, - APP2 = 284, - - // Usage page 0x0C (additional media keys) - // These values are mapped from usage page 0x0C (USB consumer page). - - AUDIOREWIND = 285, - AUDIOFASTFORWARD = 286, - - // Add any other keys here. - - // not a key, just marks the number of scancodes for array bounds - NUM_SCANCODES = 512, -}; - -export type SDL_Keycode = enum uint { - UNKNOWN = 0, - - RETURN = '\r', - ESCAPE = '\x1B', - BACKSPACE = '\b', - TAB = '\t', - SPACE = ' ', - EXCLAIM = '!', - QUOTEDBL = '"', - HASH = '#', - PERCENT = '%', - DOLLAR = '$', - AMPERSAND = '&', - QUOTE = '\'', - LEFTPAREN = '(', - RIGHTPAREN = ')', - ASTERISK = '*', - PLUS = '+', - COMMA = ',', - MINUS = '-', - PERIOD = '.', - SLASH = '/', - ZERO = '0', - ONE = '1', - TWO = '2', - THREE = '3', - FOUR = '4', - FIVE = '5', - SIX = '6', - SEVEN = '7', - EIGHT = '8', - NINE = '9', - COLON = ':', - SEMICOLON = ';', - LESS = '<', - EQUALS = '=', - GREATER = '>', - QUESTION = '?', - AT = '@', - - // Skip uppercase letters - - LEFTBRACKET = '[', - BACKSLASH = '\\', - RIGHTBRACKET = ']', - CARET = '^', - UNDERSCORE = '_', - BACKQUOTE = '`', - a = 'a', - b = 'b', - c = 'c', - d = 'd', - e = 'e', - f = 'f', - g = 'g', - h = 'h', - i = 'i', - j = 'j', - k = 'k', - l = 'l', - m = 'm', - n = 'n', - o = 'o', - p = 'p', - q = 'q', - r = 'r', - s = 's', - t = 't', - u = 'u', - v = 'v', - w = 'w', - x = 'x', - y = 'y', - z = 'z', - - CAPSLOCK = SDL_Scancode::CAPSLOCK | 1: SDL_Scancode << 30: SDL_Scancode, - - F1 = SDL_Scancode::F1 | 1: SDL_Scancode << 30, - F2 = SDL_Scancode::F2 | 1: SDL_Scancode << 30, - F3 = SDL_Scancode::F3 | 1: SDL_Scancode << 30, - F4 = SDL_Scancode::F4 | 1: SDL_Scancode << 30, - F5 = SDL_Scancode::F5 | 1: SDL_Scancode << 30, - F6 = SDL_Scancode::F6 | 1: SDL_Scancode << 30, - F7 = SDL_Scancode::F7 | 1: SDL_Scancode << 30, - F8 = SDL_Scancode::F8 | 1: SDL_Scancode << 30, - F9 = SDL_Scancode::F9 | 1: SDL_Scancode << 30, - F10 = SDL_Scancode::F10 | 1: SDL_Scancode << 30, - F11 = SDL_Scancode::F11 | 1: SDL_Scancode << 30, - F12 = SDL_Scancode::F12 | 1: SDL_Scancode << 30, - - PRINTSCREEN = SDL_Scancode::PRINTSCREEN | 1: SDL_Scancode << 30, - SCROLLLOCK = SDL_Scancode::SCROLLLOCK | 1: SDL_Scancode << 30, - PAUSE = SDL_Scancode::PAUSE | 1: SDL_Scancode << 30, - INSERT = SDL_Scancode::INSERT | 1: SDL_Scancode << 30, - HOME = SDL_Scancode::HOME | 1: SDL_Scancode << 30, - PAGEUP = SDL_Scancode::PAGEUP | 1: SDL_Scancode << 30, - DELETE = '\x7F', - END = SDL_Scancode::END | 1: SDL_Scancode << 30, - PAGEDOWN = SDL_Scancode::PAGEDOWN | 1: SDL_Scancode << 30, - RIGHT = SDL_Scancode::RIGHT | 1: SDL_Scancode << 30, - LEFT = SDL_Scancode::LEFT | 1: SDL_Scancode << 30, - DOWN = SDL_Scancode::DOWN | 1: SDL_Scancode << 30, - UP = SDL_Scancode::UP | 1: SDL_Scancode << 30, - - NUMLOCKCLEAR = SDL_Scancode::NUMLOCKCLEAR | 1: SDL_Scancode << 30, - KP_DIVIDE = SDL_Scancode::KP_DIVIDE | 1: SDL_Scancode << 30, - KP_MULTIPLY = SDL_Scancode::KP_MULTIPLY | 1: SDL_Scancode << 30, - KP_MINUS = SDL_Scancode::KP_MINUS | 1: SDL_Scancode << 30, - KP_PLUS = SDL_Scancode::KP_PLUS | 1: SDL_Scancode << 30, - KP_ENTER = SDL_Scancode::KP_ENTER | 1: SDL_Scancode << 30, - KP_1 = SDL_Scancode::KP_1 | 1: SDL_Scancode << 30, - KP_2 = SDL_Scancode::KP_2 | 1: SDL_Scancode << 30, - KP_3 = SDL_Scancode::KP_3 | 1: SDL_Scancode << 30, - KP_4 = SDL_Scancode::KP_4 | 1: SDL_Scancode << 30, - KP_5 = SDL_Scancode::KP_5 | 1: SDL_Scancode << 30, - KP_6 = SDL_Scancode::KP_6 | 1: SDL_Scancode << 30, - KP_7 = SDL_Scancode::KP_7 | 1: SDL_Scancode << 30, - KP_8 = SDL_Scancode::KP_8 | 1: SDL_Scancode << 30, - KP_9 = SDL_Scancode::KP_9 | 1: SDL_Scancode << 30, - KP_0 = SDL_Scancode::KP_0 | 1: SDL_Scancode << 30, - KP_PERIOD = SDL_Scancode::KP_PERIOD | 1: SDL_Scancode << 30, - - APPLICATION = SDL_Scancode::APPLICATION | 1: SDL_Scancode << 30, - POWER = SDL_Scancode::POWER | 1: SDL_Scancode << 30, - KP_EQUALS = SDL_Scancode::KP_EQUALS | 1: SDL_Scancode << 30, - F13 = SDL_Scancode::F13 | 1: SDL_Scancode << 30, - F14 = SDL_Scancode::F14 | 1: SDL_Scancode << 30, - F15 = SDL_Scancode::F15 | 1: SDL_Scancode << 30, - F16 = SDL_Scancode::F16 | 1: SDL_Scancode << 30, - F17 = SDL_Scancode::F17 | 1: SDL_Scancode << 30, - F18 = SDL_Scancode::F18 | 1: SDL_Scancode << 30, - F19 = SDL_Scancode::F19 | 1: SDL_Scancode << 30, - F20 = SDL_Scancode::F20 | 1: SDL_Scancode << 30, - F21 = SDL_Scancode::F21 | 1: SDL_Scancode << 30, - F22 = SDL_Scancode::F22 | 1: SDL_Scancode << 30, - F23 = SDL_Scancode::F23 | 1: SDL_Scancode << 30, - F24 = SDL_Scancode::F24 | 1: SDL_Scancode << 30, - EXECUTE = SDL_Scancode::EXECUTE | 1: SDL_Scancode << 30, - HELP = SDL_Scancode::HELP | 1: SDL_Scancode << 30, - MENU = SDL_Scancode::MENU | 1: SDL_Scancode << 30, - SELECT = SDL_Scancode::SELECT | 1: SDL_Scancode << 30, - STOP = SDL_Scancode::STOP | 1: SDL_Scancode << 30, - AGAIN = SDL_Scancode::AGAIN | 1: SDL_Scancode << 30, - UNDO = SDL_Scancode::UNDO | 1: SDL_Scancode << 30, - CUT = SDL_Scancode::CUT | 1: SDL_Scancode << 30, - COPY = SDL_Scancode::COPY | 1: SDL_Scancode << 30, - PASTE = SDL_Scancode::PASTE | 1: SDL_Scancode << 30, - FIND = SDL_Scancode::FIND | 1: SDL_Scancode << 30, - MUTE = SDL_Scancode::MUTE | 1: SDL_Scancode << 30, - VOLUMEUP = SDL_Scancode::VOLUMEUP | 1: SDL_Scancode << 30, - VOLUMEDOWN = SDL_Scancode::VOLUMEDOWN | 1: SDL_Scancode << 30, - KP_COMMA = SDL_Scancode::KP_COMMA | 1: SDL_Scancode << 30, - KP_EQUALSAS400 = SDL_Scancode::KP_EQUALSAS400 | 1: SDL_Scancode << 30, - - ALTERASE = SDL_Scancode::ALTERASE | 1: SDL_Scancode << 30, - SYSREQ = SDL_Scancode::SYSREQ | 1: SDL_Scancode << 30, - CANCEL = SDL_Scancode::CANCEL | 1: SDL_Scancode << 30, - CLEAR = SDL_Scancode::CLEAR | 1: SDL_Scancode << 30, - PRIOR = SDL_Scancode::PRIOR | 1: SDL_Scancode << 30, - RETURN2 = SDL_Scancode::RETURN2 | 1: SDL_Scancode << 30, - SEPARATOR = SDL_Scancode::SEPARATOR | 1: SDL_Scancode << 30, - OUT = SDL_Scancode::OUT | 1: SDL_Scancode << 30, - OPER = SDL_Scancode::OPER | 1: SDL_Scancode << 30, - CLEARAGAIN = SDL_Scancode::CLEARAGAIN | 1: SDL_Scancode << 30, - CRSEL = SDL_Scancode::CRSEL | 1: SDL_Scancode << 30, - EXSEL = SDL_Scancode::EXSEL | 1: SDL_Scancode << 30, - - KP_00 = SDL_Scancode::KP_00 | 1: SDL_Scancode << 30, - KP_000 = SDL_Scancode::KP_000 | 1: SDL_Scancode << 30, - THOUSANDSSEPARATOR = SDL_Scancode::THOUSANDSSEPARATOR | 1: SDL_Scancode << 30, - DECIMALSEPARATOR = SDL_Scancode::DECIMALSEPARATOR | 1: SDL_Scancode << 30, - CURRENCYUNIT = SDL_Scancode::CURRENCYUNIT | 1: SDL_Scancode << 30, - CURRENCYSUBUNIT = SDL_Scancode::CURRENCYSUBUNIT | 1: SDL_Scancode << 30, - KP_LEFTPAREN = SDL_Scancode::KP_LEFTPAREN | 1: SDL_Scancode << 30, - KP_RIGHTPAREN = SDL_Scancode::KP_RIGHTPAREN | 1: SDL_Scancode << 30, - KP_LEFTBRACE = SDL_Scancode::KP_LEFTBRACE | 1: SDL_Scancode << 30, - KP_RIGHTBRACE = SDL_Scancode::KP_RIGHTBRACE | 1: SDL_Scancode << 30, - KP_TAB = SDL_Scancode::KP_TAB | 1: SDL_Scancode << 30, - KP_BACKSPACE = SDL_Scancode::KP_BACKSPACE | 1: SDL_Scancode << 30, - KP_A = SDL_Scancode::KP_A | 1: SDL_Scancode << 30, - KP_B = SDL_Scancode::KP_B | 1: SDL_Scancode << 30, - KP_C = SDL_Scancode::KP_C | 1: SDL_Scancode << 30, - KP_D = SDL_Scancode::KP_D | 1: SDL_Scancode << 30, - KP_E = SDL_Scancode::KP_E | 1: SDL_Scancode << 30, - KP_F = SDL_Scancode::KP_F | 1: SDL_Scancode << 30, - KP_XOR = SDL_Scancode::KP_XOR | 1: SDL_Scancode << 30, - KP_POWER = SDL_Scancode::KP_POWER | 1: SDL_Scancode << 30, - KP_PERCENT = SDL_Scancode::KP_PERCENT | 1: SDL_Scancode << 30, - KP_LESS = SDL_Scancode::KP_LESS | 1: SDL_Scancode << 30, - KP_GREATER = SDL_Scancode::KP_GREATER | 1: SDL_Scancode << 30, - KP_AMPERSAND = SDL_Scancode::KP_AMPERSAND | 1: SDL_Scancode << 30, - KP_DBLAMPERSAND = SDL_Scancode::KP_DBLAMPERSAND | 1: SDL_Scancode << 30, - KP_VERTICALBAR = SDL_Scancode::KP_VERTICALBAR | 1: SDL_Scancode << 30, - KP_DBLVERTICALBAR = SDL_Scancode::KP_DBLVERTICALBAR | 1: SDL_Scancode << 30, - KP_COLON = SDL_Scancode::KP_COLON | 1: SDL_Scancode << 30, - KP_HASH = SDL_Scancode::KP_HASH | 1: SDL_Scancode << 30, - KP_SPACE = SDL_Scancode::KP_SPACE | 1: SDL_Scancode << 30, - KP_AT = SDL_Scancode::KP_AT | 1: SDL_Scancode << 30, - KP_EXCLAM = SDL_Scancode::KP_EXCLAM | 1: SDL_Scancode << 30, - KP_MEMSTORE = SDL_Scancode::KP_MEMSTORE | 1: SDL_Scancode << 30, - KP_MEMRECALL = SDL_Scancode::KP_MEMRECALL | 1: SDL_Scancode << 30, - KP_MEMCLEAR = SDL_Scancode::KP_MEMCLEAR | 1: SDL_Scancode << 30, - KP_MEMADD = SDL_Scancode::KP_MEMADD | 1: SDL_Scancode << 30, - KP_MEMSUBTRACT = SDL_Scancode::KP_MEMSUBTRACT | 1: SDL_Scancode << 30, - KP_MEMMULTIPLY = SDL_Scancode::KP_MEMMULTIPLY | 1: SDL_Scancode << 30, - KP_MEMDIVIDE = SDL_Scancode::KP_MEMDIVIDE | 1: SDL_Scancode << 30, - KP_PLUSMINUS = SDL_Scancode::KP_PLUSMINUS | 1: SDL_Scancode << 30, - KP_CLEAR = SDL_Scancode::KP_CLEAR | 1: SDL_Scancode << 30, - KP_CLEARENTRY = SDL_Scancode::KP_CLEARENTRY | 1: SDL_Scancode << 30, - KP_BINARY = SDL_Scancode::KP_BINARY | 1: SDL_Scancode << 30, - KP_OCTAL = SDL_Scancode::KP_OCTAL | 1: SDL_Scancode << 30, - KP_DECIMAL = SDL_Scancode::KP_DECIMAL | 1: SDL_Scancode << 30, - KP_HEXADECIMAL = SDL_Scancode::KP_HEXADECIMAL | 1: SDL_Scancode << 30, - - LCTRL = SDL_Scancode::LCTRL | 1: SDL_Scancode << 30, - LSHIFT = SDL_Scancode::LSHIFT | 1: SDL_Scancode << 30, - LALT = SDL_Scancode::LALT | 1: SDL_Scancode << 30, - LGUI = SDL_Scancode::LGUI | 1: SDL_Scancode << 30, - RCTRL = SDL_Scancode::RCTRL | 1: SDL_Scancode << 30, - RSHIFT = SDL_Scancode::RSHIFT | 1: SDL_Scancode << 30, - RALT = SDL_Scancode::RALT | 1: SDL_Scancode << 30, - RGUI = SDL_Scancode::RGUI | 1: SDL_Scancode << 30, - - MODE = SDL_Scancode::MODE | 1: SDL_Scancode << 30, - - AUDIONEXT = SDL_Scancode::AUDIONEXT | 1: SDL_Scancode << 30, - AUDIOPREV = SDL_Scancode::AUDIOPREV | 1: SDL_Scancode << 30, - AUDIOSTOP = SDL_Scancode::AUDIOSTOP | 1: SDL_Scancode << 30, - AUDIOPLAY = SDL_Scancode::AUDIOPLAY | 1: SDL_Scancode << 30, - AUDIOMUTE = SDL_Scancode::AUDIOMUTE | 1: SDL_Scancode << 30, - MEDIASELECT = SDL_Scancode::MEDIASELECT | 1: SDL_Scancode << 30, - WWW = SDL_Scancode::WWW | 1: SDL_Scancode << 30, - MAIL = SDL_Scancode::MAIL | 1: SDL_Scancode << 30, - CALCULATOR = SDL_Scancode::CALCULATOR | 1: SDL_Scancode << 30, - COMPUTER = SDL_Scancode::COMPUTER | 1: SDL_Scancode << 30, - AC_SEARCH = SDL_Scancode::AC_SEARCH | 1: SDL_Scancode << 30, - AC_HOME = SDL_Scancode::AC_HOME | 1: SDL_Scancode << 30, - AC_BACK = SDL_Scancode::AC_BACK | 1: SDL_Scancode << 30, - AC_FORWARD = SDL_Scancode::AC_FORWARD | 1: SDL_Scancode << 30, - AC_STOP = SDL_Scancode::AC_STOP | 1: SDL_Scancode << 30, - AC_REFRESH = SDL_Scancode::AC_REFRESH | 1: SDL_Scancode << 30, - AC_BOOKMARKS = SDL_Scancode::AC_BOOKMARKS | 1: SDL_Scancode << 30, - - BRIGHTNESSDOWN = SDL_Scancode::BRIGHTNESSDOWN | 1: SDL_Scancode << 30, - BRIGHTNESSUP = SDL_Scancode::BRIGHTNESSUP | 1: SDL_Scancode << 30, - DISPLAYSWITCH = SDL_Scancode::DISPLAYSWITCH | 1: SDL_Scancode << 30, - KBDILLUMTOGGLE = SDL_Scancode::KBDILLUMTOGGLE | 1: SDL_Scancode << 30, - KBDILLUMDOWN = SDL_Scancode::KBDILLUMDOWN | 1: SDL_Scancode << 30, - KBDILLUMUP = SDL_Scancode::KBDILLUMUP | 1: SDL_Scancode << 30, - EJECT = SDL_Scancode::EJECT | 1: SDL_Scancode << 30, - SLEEP = SDL_Scancode::SLEEP | 1: SDL_Scancode << 30, - APP1 = SDL_Scancode::APP1 | 1: SDL_Scancode << 30, - APP2 = SDL_Scancode::APP2 | 1: SDL_Scancode << 30, - - AUDIOREWIND = SDL_Scancode::AUDIOREWIND | 1: SDL_Scancode << 30, - AUDIOFASTFORWARD = SDL_Scancode::AUDIOFASTFORWARD | 1: SDL_Scancode << 30 -}; - -export type SDL_Keymod = enum u16 { - NONE = 0x0000, - LSHIFT = 0x0001, - RSHIFT = 0x0002, - LCTRL = 0x0040, - RCTRL = 0x0080, - LALT = 0x0100, - RALT = 0x0200, - LGUI = 0x0400, - RGUI = 0x0800, - NUM = 0x1000, - CAPS = 0x2000, - MODE = 0x4000, - SCROLL = 0x8000, - - CTRL = LCTRL | RCTRL, - SHIFT = LSHIFT | RSHIFT, - ALT = LALT | RALT, - GUI = LGUI | RGUI, - - RESERVED = SCROLL, -}; - -export type SDL_Keysym = struct { - scancode: SDL_Scancode, - sym: SDL_Keycode, - mod: SDL_Keymod, - unused: u32, -}; - -@symbol("SDL_GetKeyFromName") fn _SDL_GetKeyFromName(name: *const c::char) SDL_Keycode; - -export fn SDL_GetKeyFromName(name: str) (SDL_Keycode | error) = { - const name = c::fromstr(name)!; - defer free(name); - const sym = _SDL_GetKeyFromName(name); - if (sym == SDL_Keycode::UNKNOWN) { - return c::tostr(SDL_GetError()): error; - }; - return sym; -}; - -@symbol("SDL_GetKeyboardState") fn _SDL_GetKeyboardState(numkeys: *int) *[*]bool; - -export fn SDL_GetKeyboardState() []bool = { - let numkeys: int = 0; - let arr = _SDL_GetKeyboardState(&numkeys); - let arr = arr[..numkeys]; - return arr; -}; - -export @symbol("SDL_StartTextInput") fn SDL_StartTextInput(win: *SDL_Window) bool; -export @symbol("SDL_StopTextInput") fn SDL_StopTextInput(win: *SDL_Window) bool; diff --git a/sdl2/mixer/channels.ha b/sdl2/mixer/channels.ha deleted file mode 100644 index fffccd0..0000000 --- a/sdl2/mixer/channels.ha +++ /dev/null @@ -1,20 +0,0 @@ -use sdl2; - -@symbol("Mix_PlayChannelTimed") fn _Mix_PlayChannelTimed( - channel: int, - sample: *Mix_Chunk, - loops: int, - ticks: int, -) int; - -// Play chunk on channel, or if channel is -1, pick the first free unreserved -// channel. The sample will play for loops+1 number of times, unless stopped by -// halt, or fade out, or setting a new expiration time of less time than it -// would have originally taken to play the loops, or closing the mixer. -export fn Mix_PlayChannelTimed( - channel: int, - sample: *Mix_Chunk, - loops: int, -) (void | sdl2::error) = { - return sdl2::wrapvoid(_Mix_PlayChannelTimed(channel, sample, loops, -1)); -}; diff --git a/sdl2/mixer/general.ha b/sdl2/mixer/general.ha deleted file mode 100644 index 87a729f..0000000 --- a/sdl2/mixer/general.ha +++ /dev/null @@ -1,54 +0,0 @@ -use sdl2; - -// Flags for [[init]]. -export type MIX_InitFlags = enum { - FLAC = 0x00000001, - MOD = 0x00000002, - MP3 = 0x00000008, - OGG = 0x00000010, - MID = 0x00000020, - OPUS = 0x00000040 -}; - -// The default mixer has 8 simultaneous mixing channels -export def MIX_CHANNELS: int = 8; - -// Good default frequency for a PC soundcard -export def MIX_DEFAULT_FREQUENCY: int = 22050; - -// Good default channels for a PC soundcard -export def MIX_DEFAULT_CHANNELS: int = 2; - -// XXX: This should choose MSB on a big-endian system: - -// Good default format for a PC soundcard -export def MIX_DEFAULT_FORMAT: sdl2::SDL_AudioFormat = sdl2::AUDIO_S16LSB; - -@symbol("Mix_Init") fn _Mix_Init(flags: int) int; - -// Loads dynamic libraries and prepares them for use. Flags should be -// one or more flags from [[MIX_InitFlags]] OR'd together. -export fn Mix_Init(flags: MIX_InitFlags) (void | sdl2::error) = { - if (flags & _Mix_Init(flags) != flags) { - return "Mixer flags not initialized": sdl2::error; - }; -}; - -// Unloads libraries loaded with [[Mix_Init]]. -export @symbol("Mix_Quit") fn Mix_Quit() void; - -@symbol("Mix_OpenAudio") fn _Mix_OpenAudio(frequency: int, - format: u16, channels: int, chunksize: int) int; - -// Open the mixer with a certain audio format -export fn Mix_OpenAudio( - frequency: int, - format: sdl2::SDL_AudioFormat, - channels: int, - chunksize: int, -) (void | sdl2::error) = { - return sdl2::wrapvoid(_Mix_OpenAudio(frequency, format, channels, chunksize)); -}; - -// Close the mixer, halting all playing audio -export @symbol("Mix_CloseAudio") fn Mix_CloseAudio() void; diff --git a/sdl2/mixer/samples.ha b/sdl2/mixer/samples.ha deleted file mode 100644 index ad1ecc1..0000000 --- a/sdl2/mixer/samples.ha +++ /dev/null @@ -1,38 +0,0 @@ -use fs; -use io; -use os; -use sdl2; - -// The internal format for an audio Mix_Chunk -export type Mix_Chunk = struct { - allocated: int, - abuf: *u8, - alen: u32, - volume: u8, -}; - -@symbol("Mix_LoadWAV_RW") fn _Mix_LoadWAV_RW(src: *sdl2::SDL_RWops, freesrc: int) nullable *Mix_Chunk; - -// Loads a sample from an [[io::handle]]. -export fn Mix_LoadWAV_RW(src: io::handle) (*Mix_Chunk | sdl2::error) = { - const rw = sdl2::rw_from_handle(src); - return sdl2::wrapptr(_Mix_LoadWAV_RW(rw, 0))?: *Mix_Chunk; -}; - -// Loads a sample from a file path. -export fn load_file(src: str) (*Mix_Chunk | fs::error | sdl2::error) = { - const file = os::open(src)?; - defer io::close(file)!; - return Mix_LoadWAV_RW(file); -}; - -// Free the memory used in Mix_Chunk, and free Mix_Chunk itself as well. Do not use -// Mix_Chunk after this without loading a new sample to it. Note: It's a bad idea to -// free a Mix_Chunk that is still being played... -export @symbol("Mix_FreeChunk") fn Mix_FreeChunk(Mix_Chunk: *Mix_Chunk) void; - -// Maximum volume for a Mix_Chunk. -export def MIX_MAX_VOLUME: int = 128; // XXX: SDL_mixer derives this from SDL_MIX_MAXVOLUME - -// Sets the Mix_Chunk volume as specified, returning the previous value. -export @symbol("Mix_VolumeChunk") fn Mix_VolumeChunk(Mix_Chunk: *Mix_Chunk, volume: int) int; diff --git a/sdl2/mouse.ha b/sdl2/mouse.ha deleted file mode 100644 index 53167ff..0000000 --- a/sdl2/mouse.ha +++ /dev/null @@ -1,49 +0,0 @@ -export type SDL_Cursor = opaque; - -// Cursor types for [[SDL_CreateSystemCursor]] -export type SDL_SystemCursor = enum uint { - ARROW, // Arrow - IBEAM, // I-beam - WAIT, // Wait - CROSSHAIR, // Crosshair - WAITARROW, // Small wait cursor (or Wait if not available) - SIZENWSE, // Double arrow pointing northwest and southeast - SIZENESW, // Double arrow pointing northeast and southwest - SIZEWE, // Double arrow pointing west and east - SIZENS, // Double arrow pointing north and south - SIZEALL, // Four pointed arrow pointing north, south, east, and west - NO, // Slashed circle or crossbones - HAND, // Hand -}; - -// Scroll direction types for the Scroll event -export type SDL_MouseWheelDirection = enum uint { - NORMAL, // The scroll direction is normal - FLIPPED // The scroll direction is flipped / natural -}; - -// Get the window which currently has mouse focus. -export @symbol("SDL_GetMouseFocus") fn SDL_GetMouseFocus() nullable *SDL_Window; - -// Retrieve the current state of the mouse. -export @symbol("SDL_GetMouseState") fn SDL_GetMouseState(x: *int, y: *int) u32; - -// Set relative mouse mode. -export @symbol("SDL_SetRelativeMouseMode") fn SDL_SetRelativeMouseMode(enabled: bool) int; - -// Capture the mouse and to track input outside an SDL window. -export @symbol("SDL_CaptureMouse") fn SDL_CaptureMouse(enabled: bool) int; - -// Toggle whether or not the cursor is shown. -export @symbol("SDL_ShowCursor") fn SDL_ShowCursor(toggle: int) int; - -export def SDL_BUTTON_LEFT = 1; -export def SDL_BUTTON_MIDDLE = 2; -export def SDL_BUTTON_RIGHT = 3; -export def SDL_BUTTON_X1 = 4; -export def SDL_BUTTON_X2 = 5; -export def SDL_BUTTON_LMASK = 1 << 0; -export def SDL_BUTTON_MMASK = 1 << 1; -export def SDL_BUTTON_RMASK = 1 << 2; -export def SDL_BUTTON_X1MASK = 1 << 3; -export def SDL_BUTTON_X2MASK = 1 << 4; diff --git a/sdl2/pixels.ha b/sdl2/pixels.ha deleted file mode 100644 index 7aa8733..0000000 --- a/sdl2/pixels.ha +++ /dev/null @@ -1,55 +0,0 @@ -// TODO: Flesh me out -use types::c; - -export type SDL_Color = struct { - r: u8, - g: u8, - b: u8, - a: u8, -}; - -export type SDL_Palette = struct { - ncolors: int, - colors: *SDL_Color, - version: u32, - refcount: int, -}; - -// Note: Everything in the pixel format structure is read-only. -export type SDL_PixelFormat = struct { - format: u32, // TODO - palette: *SDL_Palette, - bitsperpixel: u8, - bytesperpixel: u8, - padding: [2]u8, - rmask: u32, - gmask: u32, - bmask: u32, - amask: u32, - rloss: u8, - gloss: u8, - bloss: u8, - aloss: u8, - rshift: u8, - gshift: u8, - bshift: u8, - ashift: u8, - refcount: int, - next: nullable *SDL_PixelFormat, -}; - -export def SDL_PIXELFORMAT_ARGB8888: u32 = 0x16362004; - -@symbol("SDL_GetPixelFormatName") fn _SDL_GetPixelFormatName(format: u32) - const *c::char; - -// Get the human readable name of a pixel format. -export fn SDL_GetPixelFormatName(format: u32) str = { - return c::tostr(_SDL_GetPixelFormatName(format))!; -}; - -// Map an RGB triple to an opaque pixel value for a given pixel format. -export @symbol("SDL_MapRGB") fn SDL_MapRGB(format: *SDL_PixelFormat, r: u8, g: u8, b: u8) u32; - -// Map an RGBA quadruple to a pixel value for a given pixel format. -export @symbol("SDL_MapRGBA") fn SDL_MapRGBA(format: *SDL_PixelFormat, r: u8, g: u8, b: u8, a: u8) u32; diff --git a/sdl2/rect.ha b/sdl2/rect.ha deleted file mode 100644 index 012088e..0000000 --- a/sdl2/rect.ha +++ /dev/null @@ -1,29 +0,0 @@ -// TODO: Flesh me out - -// The structure that defines a point (integer) -export type SDL_Point = struct { - x: int, - y: int, -}; - -// The structure that defines a point (floating point) -export type SDL_FPoint = struct { - x: f32, - y: f32, -}; - -// A rectangle, with the origin at the upper left (integer). -export type SDL_Rect = struct { - x: int, - y: int, - w: int, - h: int, -}; - -// A rectangle, with the origin at the upper left (floating point). -export type SDL_FRect = struct { - x: f32, - y: f32, - w: f32, - h: f32, -}; diff --git a/sdl2/render.ha b/sdl2/render.ha deleted file mode 100644 index 192d608..0000000 --- a/sdl2/render.ha +++ /dev/null @@ -1,371 +0,0 @@ -// TODO: Flesh me out - -// A structure representing rendering state. (Opaque) -export type SDL_Renderer = opaque; - -// An efficient driver-specific representation of pixel data. (Opaque) -export type SDL_Texture = opaque; - -export type SDLPixelFormatValues = enum u32 { - SDL_PIXELFORMAT_UNKNOWN, - SDL_PIXELFORMAT_INDEX1LSB, - SDL_PIXELFORMAT_INDEX1MSB, - SDL_PIXELFORMAT_INDEX4LSB, - SDL_PIXELFORMAT_INDEX4MSB, - SDL_PIXELFORMAT_INDEX8, - SDL_PIXELFORMAT_RGB332, - SDL_PIXELFORMAT_RGB444, - SDL_PIXELFORMAT_RGB555, - SDL_PIXELFORMAT_BGR555, - SDL_PIXELFORMAT_ARGB4444, - SDL_PIXELFORMAT_RGBA4444, - SDL_PIXELFORMAT_ABGR4444, - SDL_PIXELFORMAT_BGRA4444, - SDL_PIXELFORMAT_ARGB1555, - SDL_PIXELFORMAT_RGBA5551, - SDL_PIXELFORMAT_ABGR1555, - SDL_PIXELFORMAT_BGRA5551, - SDL_PIXELFORMAT_RGB565, - SDL_PIXELFORMAT_BGR565, - SDL_PIXELFORMAT_RGB24, - SDL_PIXELFORMAT_BGR24, - SDL_PIXELFORMAT_RGB888, - SDL_PIXELFORMAT_RGBX8888, - SDL_PIXELFORMAT_BGR888, - SDL_PIXELFORMAT_BGRX8888, - SDL_PIXELFORMAT_ARGB8888, - SDL_PIXELFORMAT_RGBA8888, - SDL_PIXELFORMAT_ABGR8888, - SDL_PIXELFORMAT_BGRA8888, -}; - -// Flags used when creating a rendering context. -export type SDL_RendererFlags = enum u32 { - NONE = 0, - SOFTWARE = 0x00000001, - ACCELERATED = 0x00000002, - PRESENTVSYNC = 0x00000004, - TARGETTEXTURE = 0x00000008, -}; - -export type SDL_RendererFlip = enum u32 { - SDL_FLIP_NONE, - SDL_FLIP_HORIZONTAL, - SDL_FLIP_VERTICAL, - SDL_FLIP_BOTH, -}; - -export type SDL_TextureAccess = enum { - SDL_TEXTUREACCESS_STATIC, - SDL_TEXTUREACCESS_STREAMING, - SDL_TEXTUREACCESS_TARGET, -}; - -@symbol("SDL_CreateWindowAndRenderer") fn _SDL_CreateWindowAndRenderer( - width: int, height: int, SDL_WindowFlags: SDL_WindowFlags, - window: nullable **SDL_Window, renderer: nullable **SDL_Renderer) int; - -// Create a window and default renderer. -// -// 'width' and 'height' set the width and height of the window, in screen -// coordinates. 'SDL_WindowFlags' configure additional window parameters. -// -// 'window' and 'renderer' are out parameters, or null, which are filled in with -// the created window and renderer respectively. -export fn SDL_CreateWindowAndRenderer( - width: int, - height: int, - SDL_WindowFlags: SDL_WindowFlags, - window: nullable **SDL_Window, - renderer: nullable **SDL_Renderer, -) (void | error) = wrapvoid(_SDL_CreateWindowAndRenderer(width, height, - SDL_WindowFlags, window, renderer)); - -@symbol("SDL_CreateRenderer") fn _SDL_CreateRenderer(window: *SDL_Window, - index: int, flags: SDL_RendererFlags) nullable *SDL_Renderer; - -// Create a 2D rendering context for a window. -// -// 'window' is the window where rendering is displayed. 'index' is the index of -// the rendering driver to initialize, or -1 to initialize the first one -// supporting the requested flags. -// -// See also: [[create_software_renderer]], [[get_renderer_info]], -// [[SDL_DestroyRenderer]]. -export fn SDL_CreateRenderer( - window: *SDL_Window, - index: int, - flags: SDL_RendererFlags, -) (*SDL_Renderer | error) = - wrapptr(_SDL_CreateRenderer(window, index, flags))?: *SDL_Renderer; - -// Destroy the rendering context for a window and free associated textures. -// -// See also: [[SDL_CreateRenderer]]. -export @symbol("SDL_DestroyRenderer") fn SDL_DestroyRenderer(renderer: *SDL_Renderer) void; - -@symbol("SDL_GetRendererOutputSize") fn _SDL_GetRendererOutputSize(renderer: *SDL_Renderer, - w: *int, h: *int) int; - -// Get the output size in pixels of a rendering context. -export fn SDL_GetRendererOutputSize( - renderer: *SDL_Renderer, - w: *int, h: *int, -) (void | error) = wrapvoid(_SDL_GetRendererOutputSize(renderer, w, h)); - -// Opaque value for the alpha channel (255). -export def ALPHA_OPAQUE: u8 = 255; - -@symbol("SDL_SetRenderDrawColor") fn _SDL_SetRenderDrawColor(renderer: *SDL_Renderer, - r: u8, g: u8, b: u8, a: u8) int; - -// Set the color used for drawing operations (Rect, Line and Clear). -// -// 'renderer' is the renderer for which drawing color should be set. 'r', 'g', -// 'b', and 'a' respectively set the red, gree, blue, and alpha channels. -export fn SDL_SetRenderDrawColor( - renderer: *SDL_Renderer, - r: u8, g: u8, b: u8, a: u8, -) (void | error) = wrapvoid(_SDL_SetRenderDrawColor(renderer, r, g, b, a)); - -@symbol("SDL_RenderClear") fn _SDL_RenderClear(renderer: *SDL_Renderer) int; - -// Clear the current rendering target with the drawing color -// -// This function clears the entire rendering target, ignoring the viewport and -// the clip rectangle. -export fn SDL_RenderClear(renderer: *SDL_Renderer) (void | error) = { - return wrapvoid(_SDL_RenderClear(renderer)); -}; - -// Update the screen with rendering performed. -export @symbol("SDL_RenderPresent") fn SDL_RenderPresent(renderer: *SDL_Renderer) void; - -// Destroy the specified texture. -export @symbol("SDL_DestroyTexture") fn SDL_DestroyTexture(texture: *SDL_Texture) void; - -@symbol("SDL_QueryTexture") fn _SDL_QueryTexture(texture: *SDL_Texture, - format: nullable *u32, access: nullable *int, - w: nullable *int, h: nullable *int) int; - -// Query the attributes of a texture -export fn SDL_QueryTexture( - texture: *SDL_Texture, - format: nullable *u32, - access: nullable *int, - w: nullable *int, h: nullable *int, -) (void | error) = { - return wrapvoid(_SDL_QueryTexture(texture, format, access, w, h)); -}; - -@symbol("SDL_SetTextureColorMod") fn _SDL_SetTextureColorMod( - texture: *SDL_Texture, r: u8, g: u8, b: u8) int; - -// Set an additional color value multiplied into render copy operations. -// -// When this texture is rendered, during the copy operation each source color -// channel is modulated by the appropriate color value according to the -// following formula: -// -// srcC = srcC * (color / 255) -// -// Color modulation is not always supported by the renderer; it will return -1 -// if color modulation is not supported. -export fn SDL_SetTextureColorMod( - texture: *SDL_Texture, - r: u8, g: u8, b: u8, -) (void | error) = { - return wrapvoid(_SDL_SetTextureColorMod(texture, r, g, b)); -}; - -@symbol("SDL_SetTextureAlphaMod") fn _SDL_SetTextureAlphaMod(texture: *SDL_Texture, a: u8) int; - -// Set an additional alpha value multiplied into render copy operations. -// -// When this texture is rendered, during the copy operation the source alpha -// value is modulated by this alpha value according to the following formula: -// -// `srcA = srcA * (alpha / 255)` -// -// Alpha modulation is not always supported by the renderer; it will return an -// error if alpha modulation is not supported. -export fn SDL_SetTextureAlphaMod(texture: *SDL_Texture, a: u8) (void | error) = { - // TODO: Double check errors - return wrapvoid(_SDL_SetTextureAlphaMod(texture, a)); -}; - -@symbol("SDL_SetTextureBlendMode") fn _SDL_SetTextureBlendMode( - texture: *SDL_Texture, mode: SDL_BlendMode) int; - -// Set the blend mode for a texture, used by SDL_RenderCopy(). -export fn SDL_SetTextureBlendMode( - texture: *SDL_Texture, - mode: SDL_BlendMode, -) (void | error) = { - return wrapvoid(_SDL_SetTextureBlendMode(texture, mode)); -}; - -@symbol("SDL_SetRenderDrawBlendMode") fn _SDL_SetRenderDrawBlendMode( - renderer: *SDL_Renderer, mode: SDL_BlendMode) int; - -// Set the blend mode used for drawing operations (fill and line). -export fn SDL_SetRenderDrawBlendMode( - renderer: *SDL_Renderer, - mode: SDL_BlendMode, -) (void | error) = { - return wrapvoid(_SDL_SetRenderDrawBlendMode(renderer, mode)); -}; - -@symbol("SDL_RenderDrawPoint") fn _SDL_RenderDrawPoint( - renderer: *SDL_Renderer, - x: int, - y: int, -) int; - -// Draws a point (pixel) at the given coordinates -export fn SDL_RenderDrawPoint( - renderer: *SDL_Renderer, - x: int, - y: int, -) (void | error) = { - return wrapvoid(_SDL_RenderDrawPoint(renderer, x, y)); -}; - -@symbol("SDL_RenderCopy") fn _SDL_RenderCopy(renderer: *SDL_Renderer, - texture: *SDL_Texture, srcrect: nullable *SDL_Rect, dstrect: nullable *SDL_Rect) int; - -// Copy a portion of the texture to the current rendering target. -export fn SDL_RenderCopy( - renderer: *SDL_Renderer, - texture: *SDL_Texture, - srcrect: nullable *SDL_Rect, - dstrect: nullable *SDL_Rect, -) (void | error) = { - return wrapvoid(_SDL_RenderCopy(renderer, texture, srcrect, dstrect)); -}; - -@symbol("SDL_RenderCopyEx") fn _SDL_RenderCopyEx( - renderer: *SDL_Renderer, - texture: *SDL_Texture, - srcrect: nullable *SDL_Rect, - dstrect: nullable *SDL_Rect, - angle : f64, - center: nullable *SDL_Point, - flip: SDL_RendererFlip, -) int; - -// Sets the rendering pixel scale -export fn SDL_RenderCopyEx( - renderer: *SDL_Renderer, - texture: *SDL_Texture, - srcrect: nullable *SDL_Rect, - dstrect: nullable *SDL_Rect, - angle : f64, - center: nullable *SDL_Point, - flip: SDL_RendererFlip, -) (void | error) = { - return wrapvoid(_SDL_RenderCopyEx( - renderer, texture, srcrect, dstrect, angle, center, flip) - ); -}; - -@symbol("SDL_RenderDrawRect") fn _SDL_RenderDrawRect( - renderer: *SDL_Renderer, rect: const nullable *SDL_Rect) int; - -// Draw a rectangle on the current rendering target. -export fn SDL_RenderDrawRect( - renderer: *SDL_Renderer, - rect: const nullable *SDL_Rect, -) (void | error) = { - return wrapvoid(_SDL_RenderDrawRect(renderer, rect)); -}; - -@symbol("SDL_RenderFillRect") fn _SDL_RenderFillRect( - renderer: *SDL_Renderer, rect: const nullable *SDL_Rect) int; - -// Fills a rectangle on the current rendering target. -export fn SDL_RenderFillRect( - renderer: *SDL_Renderer, - rect: const nullable *SDL_Rect, -) (void | error) = { - return wrapvoid(_SDL_RenderFillRect(renderer, rect)); -}; - -@symbol("SDL_RenderSetLogicalSize") fn _SDL_RenderSetLogicalSize( - renderer: *SDL_Renderer, w: int, h: int) int; - -// Sets the rendering pixel scale -export fn SDL_RenderSetLogicalSize( - renderer: *SDL_Renderer, - w: int, - h: int, -) (void | error) = { - return wrapvoid(_SDL_RenderSetLogicalSize( - renderer, w, h) - ); -}; - -@symbol("SDL_CreateTexture") fn _SDL_CreateTexture( - renderer: *SDL_Renderer, - format: u32, - access: int, - w: int, - h: int) nullable *SDL_Texture; - -export fn SDL_CreateTexture( - renderer: *SDL_Renderer, - format: u32, - access: int, - w: int, - h: int -) (*SDL_Texture | error) = { - return wrapptr(_SDL_CreateTexture( - renderer, format, access, w, h) - )?: *SDL_Texture; -}; - -@symbol("SDL_CreateTextureFromSurface") fn _SDL_CreateTextureFromSurface( - renderer: *SDL_Renderer, - surface: *SDL_Surface) nullable *SDL_Texture; - -export fn SDL_CreateTextureFromSurface( - renderer: *SDL_Renderer, - surface: *SDL_Surface -) (*SDL_Texture | error) = { - return wrapptr(_SDL_CreateTextureFromSurface(renderer, surface))?: *SDL_Texture; -}; - -@symbol("SDL_UpdateTexture") fn _SDL_UpdateTexture(texture: *SDL_Texture, - rect: const nullable *SDL_Rect, pixels: const nullable *opaque, pitch: int) int; - -// Update the given texture rectangle with new pixel data. -export fn SDL_UpdateTexture(texture: *SDL_Texture, - rect: const nullable *SDL_Rect, pixels: const nullable *opaque, pitch: int) - (int | error) = { - return wrapint(_SDL_UpdateTexture(texture, rect, pixels, pitch))?: int; -}; - -@symbol("SDL_LockTexture") fn _SDL_LockTexture(texture: *SDL_Texture, - rect: const nullable *SDL_Rect, pixels: nullable * nullable *opaque, pitch: *int) int; - -// Lock a portion of the texture for write-only pixel access. -export fn SDL_LockTexture(texture: *SDL_Texture, - rect: const nullable *SDL_Rect, pixels: nullable * nullable *opaque, pitch: *int) - (int | error) = { - return wrapint(_SDL_LockTexture(texture, rect, pixels, pitch))?: int; -}; - -// Unlock a texture, uploading the changes to video memory, if needed. -export @symbol("SDL_UnlockTexture") fn SDL_UnlockTexture(texture: *SDL_Texture) void; - -@symbol("SDL_RenderSetScale") fn _SDL_RenderSetScale( - renderer: *SDL_Renderer, scaleX: f32, scaleY: f32) int; - -// Sets the rendering pixel scale -export fn SDL_RenderSetScale( - renderer: *SDL_Renderer, - scaleX: f32, - scaleY: f32, -) (void | error) = { - return wrapvoid(_SDL_RenderSetScale(renderer, scaleX, scaleY)); -}; diff --git a/sdl2/rwops.ha b/sdl2/rwops.ha deleted file mode 100644 index da5d83d..0000000 --- a/sdl2/rwops.ha +++ /dev/null @@ -1,134 +0,0 @@ -use io; -use types::c; - -// RWops types -export type rwops_type = enum u32 { - UNKNOWN = 0, - WINFILE = 1, - STDFILE = 2, - JNIFILE = 3, - MEMORY = 4, - MEMORY_RO = 5, -}; - -// The read/write operation structure -- very basic. -export type SDL_RWops = struct { - sz: *fn(ctx: *SDL_RWops) i64, - seek: *fn(ctx: *SDL_RWops, offs: i64, whence: int) i64, - read: *fn(ctx: *SDL_RWops, ptr: *opaque, sz: size, maxnum: size) size, - write: *fn(ctx: *SDL_RWops, ptr: *const opaque, sz: size, num: size) size, - close: *fn(ctx: *SDL_RWops) int, - - type_: rwops_type, - // XXX: This union is platform-specific - hidden: union { - stdio: struct { - autoclose: bool, - fp: nullable *opaque, // FILE * - }, - mem: struct { - base: nullable *u8, - here: nullable *u8, - stop: nullable *u8, - }, - unknown: struct { - data1: nullable *opaque, - data2: nullable *opaque, - }, - }, -}; - -@symbol("SDL_RWFromFile") fn _rw_from_file( - file: const *c::char, - mode: const *c::char, -) *SDL_RWops; - -// Returns the size of an [[SDL_RWops]], or 0 if unknown or error. -// -// See [[stream_from_rw]] for a more idiomatic Hare interface to SDL_RWops. -export @symbol("SDL_RWsize") fn SDL_RWsize(ctx: *SDL_RWops) i64; - -// Closes an [[SDL_RWops]], returning 1 on success or 0 on error. -// -// See [[stream_from_rw]] for a more idiomatic Hare interface to SDL_RWops. -export @symbol("SDL_RWclose") fn SDL_RWclose(ctx: *SDL_RWops) int; - -// TODO: Other RWops wrappers - -// Creates an [[SDL_RWops]] from an [[io::handle]]. Closing the rwops does not close -// the underlying stream. -export fn rw_from_handle(in: io::handle) *SDL_RWops = { - // TODO: Add stream_from_rw - let rw = alloc(SDL_RWops { - sz = &stream_size, - seek = &stream_seek, - read = &stream_read, - write = &stream_write, - close = &stream_close, - type_ = rwops_type::UNKNOWN, - ... - })!; - // Assert that we can cram an io::handle into the SDL_RWops struct - static assert(size(io::handle) <= size(nullable *u8) * 2); - let ptr = &rw.hidden.unknown.data1: *io::handle; - *ptr = in; - return rw; -}; - -fn stream_size(ctx: *SDL_RWops) i64 = { - const handle = *(&ctx.hidden.unknown.data1: *io::handle); - const old = match (io::tell(handle)) { - case let o: io::off => - yield o; - case io::error => - return -1; - }; - io::seek(handle, 0, io::whence::END)!; - const sz = io::tell(handle)!; - io::seek(handle, old, io::whence::SET)!; - return sz; -}; - -fn stream_seek(ctx: *SDL_RWops, offs: i64, whence: int) i64 = { - const handle = *(&ctx.hidden.unknown.data1: *io::handle); - // Note: whence values in stdio.h match io::whence - match (io::seek(handle, offs: io::off, whence: io::whence)) { - case let o: io::off => - return o; - case io::error => - return -1; - }; -}; - -fn stream_read(ctx: *SDL_RWops, ptr: *opaque, sz: size, maxnum: size) size = { - const handle = *(&ctx.hidden.unknown.data1: *io::handle); - let buf = ptr: *[*]u8; - match (io::readall(handle, buf[..sz * maxnum])) { - case let n: size => - return n / sz; - case io::EOF => - return 0; - case io::error => - return 0; - }; -}; - -fn stream_write(ctx: *SDL_RWops, ptr: *const opaque, sz: size, num: size) size = { - const handle = *(&ctx.hidden.unknown.data1: *io::handle); - let buf = ptr: *[*]const u8; - match (io::writeall(handle, buf[..sz * num])) { - case let n: size => - return n / sz; - case io::error => - return 0; - }; -}; - -fn stream_close(ctx: *SDL_RWops) int = { - const handle = *(&ctx.hidden.unknown.data1: *io::handle); - free(ctx); - match (io::close(handle)) { - case void => return 0; - case io::error => return -1; - }; -}; diff --git a/sdl2/sdl2.ha b/sdl2/sdl2.ha deleted file mode 100644 index 7035e04..0000000 --- a/sdl2/sdl2.ha +++ /dev/null @@ -1,23 +0,0 @@ -export def SDL_INIT_TIMER: uint = 0x00000001u; -export def SDL_INIT_AUDIO: uint = 0x00000010u; -export def SDL_INIT_VIDEO: uint = 0x00000020u; -export def SDL_INIT_JOYSTICK: uint = 0x00000200u; -export def SDL_INIT_HAPTIC: uint = 0x00001000u; -export def SDL_INIT_GAMECONTROLLER: uint = 0x00002000u; -export def SDL_INIT_EVENTS: uint = 0x00004000u; -export def SDL_INIT_SENSOR: uint = 0x00008000u; -export def SDL_INIT_NOPARACHUTE: uint = 0x00100000u; -export def SDL_INIT_EVERYTHING: uint = SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO - | SDL_INIT_EVENTS | SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC - | SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR; - -@symbol("SDL_Init") fn _SDL_Init(flags: uint) int; - -// This function initializes the subsystems specified by 'flags'. -export fn SDL_Init(flags: uint) (void | error) = { - return wrapvoid(_SDL_Init(flags)); -}; - -// This function cleans up all initialized subsystems. You should call it upon -// all exit conditions. -export @symbol("SDL_Quit") fn SDL_Quit() void; diff --git a/sdl2/surface.ha b/sdl2/surface.ha deleted file mode 100644 index afca40c..0000000 --- a/sdl2/surface.ha +++ /dev/null @@ -1,53 +0,0 @@ -// A collection of pixels used in software blitting. -// -// This structure should be treated as read-only, except for 'pixels', which, if -// not null, contains the raw pixel data for the surface. -export type SDL_Surface = struct { - flags: u32, - format: *SDL_PixelFormat, - w: int, - h: int, - pitch: int, - pixels: nullable *opaque, - - userdata: *opaque, - - locked: int, - lock_data: *opaque, - - clip_rect: SDL_Rect, - - map: *SDL_BlitMap, - - refcount: int, -}; - -export type SDL_BlitMap = opaque; - -@symbol("SDL_CreateRGBSurface") fn _SDL_CreateRGBSurface(flags: u32, - width: int, height: int, depth: int, Rmask: u32, Gmask: u32, Bmask: u32, - Amask: u32) *SDL_Surface; - -// Allocate a new RGB surface. -export fn SDL_CreateRGBSurface(flags: u32, - width: int, height: int, depth: int, Rmask: u32, Gmask: u32, Bmask: u32, - Amask: u32) (*SDL_Surface | error) = { - return wrapptr(_SDL_CreateRGBSurface(flags, width, height, depth, Rmask, - Gmask, Bmask, Amask))?: *SDL_Surface; -}; - -@symbol("SDL_FreeSurface") fn _SDL_FreeSurface(surface: nullable *SDL_Surface) void; - -// Free an RGB surface. -export fn SDL_FreeSurface(surface: nullable *SDL_Surface) void = { - _SDL_FreeSurface(surface); -}; - -// NB SDL_BlitSurface is aliased to SDL_UpperBlit via a macro in the SDL header -@symbol("SDL_UpperBlit") fn _SDL_BlitSurface(src: *SDL_Surface, - srcrect: nullable *SDL_Rect, dst: *SDL_Surface, dstrect: nullable *SDL_Rect) int; - -// Perform a fast surface copy to a destination surface. -export fn SDL_BlitSurface(src: *SDL_Surface, srcrect: nullable *SDL_Rect, dst: *SDL_Surface, dstrect: nullable *SDL_Rect) (void | error) = { - return wrapvoid(_SDL_BlitSurface(src, srcrect, dst, dstrect)); -}; diff --git a/sdl2/timer.ha b/sdl2/timer.ha deleted file mode 100644 index d90511a..0000000 --- a/sdl2/timer.ha +++ /dev/null @@ -1,32 +0,0 @@ -// Get the number of milliseconds since SDL library initialization. -// -// This value wraps if the program runs for more than ~49 days. -// -// Returns an unsigned 32-bit value representing the number of milliseconds -// since the SDL library initialized. -export @symbol("SDL_GetTicks") fn SDL_GetTicks() u32; - -// Get the current value of the high resolution counter. -// -// This function is typically used for profiling. -// -// The counter values are only meaningful relative to each other. Differences -// between values can be converted to times by using -// [[SDL_GetPerformanceFrequency]]. -// -// Returns the current counter value. -export @symbol("SDL_GetPerformanceCounter") fn SDL_GetPerformanceCounter() u64; - -// Get the count per second of the high resolution counter. -// -// Returns a platform-specific count per second. -export @symbol("SDL_GetPerformanceFrequency") fn SDL_GetPerformanceFrequency() u64; - -// Wait a specified number of milliseconds before returning. -// -// This function waits a specified number of milliseconds before returning. It -// waits at least the specified time, but possibly longer due to OS -// scheduling. -export @symbol("SDL_Delay") fn SDL_Delay(ms: u32) void; - -// TODO: Timers diff --git a/sdl2/video.ha b/sdl2/video.ha deleted file mode 100644 index 72ed96f..0000000 --- a/sdl2/video.ha +++ /dev/null @@ -1,117 +0,0 @@ -// TODO: Flesh me out -use types::c; - -// The type used to identify a window. (Opaque) -export type SDL_Window = opaque; - -// The flags on a window -export type SDL_WindowFlags = enum u32 { - NONE = 0, - FULLSCREEN = 0x00000001, - OPENGL = 0x00000002, - SHOWN = 0x00000004, - HIDDEN = 0x00000008, - BORDERLESS = 0x00000010, - RESIZABLE = 0x00000020, - MINIMIZED = 0x00000040, - MAXIMIZED = 0x00000080, - INPUT_GRABBED = 0x00000100, - INPUT_FOCUS = 0x00000200, - MOUSE_FOCUS = 0x00000400, - FULLSCREEN_DESKTOP = 0x00001001, - FOREIGN = 0x00000800, - ALLOW_HIGHDPI = 0x00002000, - MOUSE_CAPTURE = 0x00004000, - ALWAYS_ON_TOP = 0x00008000, - SKIP_TASKBAR = 0x00010000, - UTILITY = 0x00020000, - TOOLTIP = 0x00040000, - POPUP_MENU = 0x00080000, - VULKAN = 0x10000000 -}; - -export def SDL_WINDOWPOS_UNDEFINED: int = 0x1FFF0000; -export def SDL_WINDOWPOS_CENTERED: int = 0x2FFF0000; - -@symbol("SDL_CreateWindow") fn _SDL_CreateWindow(title: const *c::char, - x: int, y: int, w: int, h: int, flags: SDL_WindowFlags) nullable *SDL_Window; - -// Create a window with the specified position, dimensions, and flags. -// -// 'title' is the title of the window, in UTF-8 encoding. See [[types::c::fromstr]] -// to prepare a suitable string. -// -// 'x' and 'y' set the position of the window, or use [[SDL_WINDOWPOS_CENTERED]] or -// [[SDL_WINDOWPOS_UNDEFINED]]. -// -// 'w' and 'h' set the width and height of the window, in screen coordinates. -// -// 'flags' configure additional window parameters. -// -// Returns the created window, or null if window creation failed. -// -// If the window is created with the SDL_WINDOW_ALLOW_HIGHDPI flag, its size -// in pixels may differ from its size in screen coordinates on platforms with -// high-DPI support (e.g. iOS and Mac OS X). Use SDL_GetWindowSize() to query -// the client area's size in screen coordinates, and SDL_GL_GetDrawableSize(), -// SDL_Vulkan_GetDrawableSize(), or SDL_GetRendererOutputSize() to query the -// drawable size in pixels. -// -// If the window is created with any of the SDL_WINDOW_OPENGL or -// SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function -// (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the -// corresponding UnloadLibrary function is called by SDL_DestroyWindow(). -// -// If SDL_WINDOW_VULKAN is specified and there isn't a working Vulkan driver, -// SDL_CreateWindow() will fail because SDL_Vulkan_LoadLibrary() will fail. -// -// Note: On non-Apple devices, SDL requires you to either not link to the -// Vulkan loader or link to a dynamic library version. This limitation may be -// removed in a future version of SDL. -// -// See also: [[SDL_DestroyWindow]] [[gl_loadlibrary]], [[vulkan_loadlibrary]]. -export fn SDL_CreateWindow( - title: str, - x: int, - y: int, - w: int, - h: int, - flags: SDL_WindowFlags, -) (*SDL_Window | error) = { - let title = c::fromstr(title)!; - defer free(title); - return wrapptr(_SDL_CreateWindow(title, x, y, w, h, flags))?: *SDL_Window; -}; - -// Destroy a window. -export @symbol("SDL_DestroyWindow") fn SDL_DestroyWindow(window: *SDL_Window) void; - -// Get the size of a window's client area. -// -// Null may safely be passed as the 'w' or 'h' parameter if the width or -// height value is not desired. -// -// The window size in screen coordinates may differ from the size in pixels, if -// the window was created with `ALLOW_HIGHDPI` on a platform with high-dpi -// support (e.g. iOS or macOS). Use [[gl_getdrawablesize]], -// [[vulkan_getdrawablesize]], or [[getrendereroutputsize]] to get the real -// client area size in pixels. -export @symbol("SDL_GetWindowSize") fn SDL_GetWindowSize(window: *SDL_Window, - w: nullable *int, h: nullable *int) void; - -@symbol("SDL_GetWindowSurface") fn _SDL_GetWindowSurface(window: *SDL_Window) - *SDL_Surface; - -// Get the SDL surface associated with the window. -export fn SDL_GetWindowSurface(window: *SDL_Window) (*SDL_Surface | error) = { - return wrapptr(_SDL_GetWindowSurface(window))?: *SDL_Surface; -}; - -// Copy the window surface to the screen. -@symbol("SDL_UpdateWindowSurface") fn _SDL_UpdateWindowSurface(window: *SDL_Window) - int; - -export fn SDL_UpdateWindowSurface(window: *SDL_Window) (void | error) = { - return wrapvoid(_SDL_UpdateWindowSurface(window)); -}; - |
