File Coverage

lib/SDL2/FFI.pm
Criterion Covered Total %
statement 209 637 32.8
branch 0 14 0.0
condition 0 39 0.0
subroutine 70 197 35.5
pod 1 63 1.5
total 280 950 29.4


line stmt bran cond sub pod time code
1             package SDL2::FFI 0.03 {
2 2     2   429371 use lib '../lib', 'lib', '/home/sanko/Projects/SDL2.pm/lib';
  2         9  
  2         8  
3              
4             # ABSTRACT: FFI Wrapper for SDL (Simple DirectMedia Layer) Development Library
5 2     2   1344 use strictures 2;
  2         2866  
  2         66  
6 2     2   1074 use SDL2::Utils;
  2         6  
  2         27  
7             #
8             $|++;
9             our %EXPORT_TAGS;
10              
11             #use Carp::Always;
12             #$ENV{FFI_PLATYPUS_DLERROR} = 1;
13             #
14             #
15 2     2   1157 use experimental 'signatures';
  2         4  
  2         15  
16 2     2   245 use base 'Exporter::Tiny';
  2         16  
  2         125  
17             #
18 2     2   10 use Config;
  2         4  
  2         121  
19             my $bigendian = $Config{byteorder} != 4321;
20              
21             # I need these first
22 2     2   707 use SDL2::version;
  2         5  
  2         128  
23             attach( version => { SDL_GetVersion => [ ['SDL_version'] ] } );
24             #
25             SDL_GetVersion( my $ver = SDL2::version->new() );
26             my $platform = $^O; # https://perldoc.perl.org/perlport#PLATFORMS
27             my $Windows = !!( $platform eq 'MSWin32' );
28             #
29 2     2   598 use SDL2::Point;
  2         4  
  2         53  
30 2     2   543 use SDL2::FPoint;
  2         5  
  2         55  
31 2     2   610 use SDL2::FRect;
  2         5  
  2         51  
32 2     2   556 use SDL2::Rect;
  2         5  
  2         63  
33 2     2   562 use SDL2::DisplayMode;
  2         5  
  2         57  
34 2     2   564 use SDL2::Surface;
  2         4  
  2         55  
35 2     2   730 use SDL2::Window;
  2         9  
  2         2863  
36             #
37             enum
38              
39             # https://github.com/libsdl-org/SDL/blob/main/include/SDL_hints.h
40             SDL_HintPriority => [qw[SDL_HINT_DEFAULT SDL_HINT_NORMAL SDL_HINT_OVERRIDE]],
41             SDL_LogCategory => [
42             qw[
43             SDL_LOG_CATEGORY_APPLICATION SDL_LOG_CATEGORY_ERROR SDL_LOG_CATEGORY_ASSERT
44             SDL_LOG_CATEGORY_SYSTEM SDL_LOG_CATEGORY_AUDIO SDL_LOG_CATEGORY_VIDEO
45             SDL_LOG_CATEGORY_RENDER SDL_LOG_CATEGORY_INPUT SDL_LOG_CATEGORY_TEST
46             SDL_LOG_CATEGORY_RESERVED1 SDL_LOG_CATEGORY_RESERVED2
47             SDL_LOG_CATEGORY_RESERVED3 SDL_LOG_CATEGORY_RESERVED4
48             SDL_LOG_CATEGORY_RESERVED5 SDL_LOG_CATEGORY_RESERVED6
49             SDL_LOG_CATEGORY_RESERVED7 SDL_LOG_CATEGORY_RESERVED8
50             SDL_LOG_CATEGORY_RESERVED9 SDL_LOG_CATEGORY_RESERVED10
51             SDL_LOG_CATEGORY_CUSTOM
52             ]
53             ],
54             SDL_LogPriority => [
55             [ SDL_LOG_PRIORITY_VERBOSE => 1 ], qw[SDL_LOG_PRIORITY_DEBUG SDL_LOG_PRIORITY_INFO
56             SDL_LOG_PRIORITY_WARN SDL_LOG_PRIORITY_ERROR SDL_LOG_PRIORITY_CRITICAL
57             SDL_NUM_LOG_PRIORITIES]
58             ];
59             define SDL_Init => [
60             [ SDL_INIT_TIMER => 0x00000001 ],
61             [ SDL_INIT_AUDIO => 0x00000010 ],
62             [ SDL_INIT_VIDEO => 0x00000020 ],
63             [ SDL_INIT_JOYSTICK => 0x00000200 ],
64             [ SDL_INIT_HAPTIC => 0x00001000 ],
65             [ SDL_INIT_GAMECONTROLLER => 0x00002000 ],
66             [ SDL_INIT_EVENTS => 0x00004000 ],
67             [ SDL_INIT_SENSOR => 0x00008000 ],
68             [ SDL_INIT_NOPARACHUTE => 0x00100000 ],
69             [ SDL_INIT_EVERYTHING => sub {
70 0     0   0 SDL_INIT_TIMER() | SDL_INIT_AUDIO() | SDL_INIT_VIDEO() | SDL_INIT_EVENTS()
71             | SDL_INIT_JOYSTICK() | SDL_INIT_HAPTIC() | SDL_INIT_GAMECONTROLLER()
72             | SDL_INIT_SENSOR();
73             }
74             ]
75             ],
76              
77             # https://github.com/libsdl-org/SDL/blob/main/include/SDL_hints.h
78             SDL_Hint => [
79             [ SDL_HINT_ACCELEROMETER_AS_JOYSTICK => 'SDL_ACCELEROMETER_AS_JOYSTICK' ],
80             [ SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED => 'SDL_ALLOW_ALT_TAB_WHILE_GRABBED' ],
81             [ SDL_HINT_ALLOW_TOPMOST => 'SDL_ALLOW_TOPMOST' ],
82             [ SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION =>
83             'SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION'
84             ],
85             [ SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION =>
86             'SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION'
87             ],
88             [ SDL_HINT_ANDROID_BLOCK_ON_PAUSE => 'SDL_ANDROID_BLOCK_ON_PAUSE' ],
89             [ SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO => 'SDL_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO' ],
90             [ SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH => 'SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH' ],
91             [ SDL_HINT_ANDROID_TRAP_BACK_BUTTON => 'SDL_ANDROID_TRAP_BACK_BUTTON' ],
92             [ SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS => 'SDL_APPLE_TV_CONTROLLER_UI_EVENTS' ],
93             [ SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION => 'SDL_APPLE_TV_REMOTE_ALLOW_ROTATION' ],
94             [ SDL_HINT_AUDIO_CATEGORY => 'SDL_AUDIO_CATEGORY' ],
95             [ SDL_HINT_AUDIO_DEVICE_APP_NAME => 'SDL_AUDIO_DEVICE_APP_NAME' ],
96             [ SDL_HINT_AUDIO_DEVICE_STREAM_NAME => 'SDL_AUDIO_DEVICE_STREAM_NAME' ],
97             [ SDL_HINT_AUDIO_DEVICE_STREAM_ROLE => 'SDL_AUDIO_DEVICE_STREAM_ROLE' ],
98             [ SDL_HINT_AUDIO_RESAMPLING_MODE => 'SDL_AUDIO_RESAMPLING_MODE' ],
99             [ SDL_HINT_AUTO_UPDATE_JOYSTICKS => 'SDL_AUTO_UPDATE_JOYSTICKS' ],
100             [ SDL_HINT_AUTO_UPDATE_SENSORS => 'SDL_AUTO_UPDATE_SENSORS' ],
101             [ SDL_HINT_BMP_SAVE_LEGACY_FORMAT => 'SDL_BMP_SAVE_LEGACY_FORMAT' ],
102             [ SDL_HINT_DISPLAY_USABLE_BOUNDS => 'SDL_DISPLAY_USABLE_BOUNDS' ],
103             [ SDL_HINT_EMSCRIPTEN_ASYNCIFY => 'SDL_EMSCRIPTEN_ASYNCIFY' ],
104             [ SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT => 'SDL_EMSCRIPTEN_KEYBOARD_ELEMENT' ],
105             [ SDL_HINT_ENABLE_STEAM_CONTROLLERS => 'SDL_ENABLE_STEAM_CONTROLLERS' ],
106             [ SDL_HINT_EVENT_LOGGING => 'SDL_EVENT_LOGGING' ],
107             [ SDL_HINT_FRAMEBUFFER_ACCELERATION => 'SDL_FRAMEBUFFER_ACCELERATION' ],
108             [ SDL_HINT_GAMECONTROLLERCONFIG => 'SDL_GAMECONTROLLERCONFIG' ],
109             [ SDL_HINT_GAMECONTROLLERCONFIG_FILE => 'SDL_GAMECONTROLLERCONFIG_FILE' ],
110             [ SDL_HINT_GAMECONTROLLERTYPE => 'SDL_GAMECONTROLLERTYPE' ],
111             [ SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES => 'SDL_GAMECONTROLLER_IGNORE_DEVICES' ],
112             [ SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT =>
113             'SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT'
114             ],
115             [ SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS => 'SDL_GAMECONTROLLER_USE_BUTTON_LABELS' ],
116             [ SDL_HINT_GRAB_KEYBOARD => 'SDL_GRAB_KEYBOARD' ],
117             [ SDL_HINT_IDLE_TIMER_DISABLED => 'SDL_IDLE_TIMER_DISABLED' ],
118             [ SDL_HINT_IME_INTERNAL_EDITING => 'SDL_IME_INTERNAL_EDITING' ],
119             [ SDL_HINT_IOS_HIDE_HOME_INDICATOR => 'SDL_IOS_HIDE_HOME_INDICATOR' ],
120             [ SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS => 'SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS' ],
121             [ SDL_HINT_JOYSTICK_HIDAPI => 'SDL_JOYSTICK_HIDAPI' ],
122             [ SDL_HINT_JOYSTICK_HIDAPI_CORRELATE_XINPUT => 'SDL_JOYSTICK_HIDAPI_CORRELATE_XINPUT' ],
123             [ SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE => 'SDL_JOYSTICK_HIDAPI_GAMECUBE' ],
124             [ SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS => 'SDL_JOYSTICK_HIDAPI_JOY_CONS' ],
125             [ SDL_HINT_JOYSTICK_HIDAPI_PS4 => 'SDL_JOYSTICK_HIDAPI_PS4' ],
126             [ SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE => 'SDL_JOYSTICK_HIDAPI_PS4_RUMBLE' ],
127             [ SDL_HINT_JOYSTICK_HIDAPI_PS5 => 'SDL_JOYSTICK_HIDAPI_PS5' ],
128             [ SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED => 'SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED' ],
129             [ SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE => 'SDL_JOYSTICK_HIDAPI_PS5_RUMBLE' ],
130             [ SDL_HINT_JOYSTICK_HIDAPI_STADIA => 'SDL_JOYSTICK_HIDAPI_STADIA' ],
131             [ SDL_HINT_JOYSTICK_HIDAPI_STEAM => 'SDL_JOYSTICK_HIDAPI_STEAM' ],
132             [ SDL_HINT_JOYSTICK_HIDAPI_SWITCH => 'SDL_JOYSTICK_HIDAPI_SWITCH' ],
133             [ SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED => 'SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED' ],
134             [ SDL_HINT_JOYSTICK_HIDAPI_XBOX => 'SDL_JOYSTICK_HIDAPI_XBOX' ],
135             [ SDL_HINT_JOYSTICK_RAWINPUT => 'SDL_JOYSTICK_RAWINPUT' ],
136             [ SDL_HINT_JOYSTICK_THREAD => 'SDL_JOYSTICK_THREAD' ],
137             [ SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER => 'SDL_KMSDRM_REQUIRE_DRM_MASTER' ],
138             [ SDL_HINT_LINUX_JOYSTICK_DEADZONES => 'SDL_LINUX_JOYSTICK_DEADZONES' ],
139             [ SDL_HINT_MAC_BACKGROUND_APP => 'SDL_MAC_BACKGROUND_APP' ],
140             [ SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK => 'SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK' ],
141             [ SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS => 'SDL_MOUSE_DOUBLE_CLICK_RADIUS' ],
142             [ SDL_HINT_MOUSE_DOUBLE_CLICK_TIME => 'SDL_MOUSE_DOUBLE_CLICK_TIME' ],
143             [ SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH => 'SDL_MOUSE_FOCUS_CLICKTHROUGH' ],
144             [ SDL_HINT_MOUSE_NORMAL_SPEED_SCALE => 'SDL_MOUSE_NORMAL_SPEED_SCALE' ],
145             [ SDL_HINT_MOUSE_RELATIVE_MODE_WARP => 'SDL_MOUSE_RELATIVE_MODE_WARP' ],
146             [ SDL_HINT_MOUSE_RELATIVE_SCALING => 'SDL_MOUSE_RELATIVE_SCALING' ],
147             [ SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE => 'SDL_MOUSE_RELATIVE_SPEED_SCALE' ],
148             [ SDL_HINT_MOUSE_TOUCH_EVENTS => 'SDL_MOUSE_TOUCH_EVENTS' ],
149             [ SDL_HINT_NO_SIGNAL_HANDLERS => 'SDL_NO_SIGNAL_HANDLERS' ],
150             [ SDL_HINT_OPENGL_ES_DRIVER => 'SDL_OPENGL_ES_DRIVER' ],
151             [ SDL_HINT_ORIENTATIONS => 'SDL_ORIENTATIONS' ],
152             [ SDL_HINT_PREFERRED_LOCALES => 'SDL_PREFERRED_LOCALES' ],
153             [ SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION => 'SDL_QTWAYLAND_CONTENT_ORIENTATION' ],
154             [ SDL_HINT_QTWAYLAND_WINDOW_FLAGS => 'SDL_QTWAYLAND_WINDOW_FLAGS' ],
155             [ SDL_HINT_RENDER_BATCHING => 'SDL_RENDER_BATCHING' ],
156             [ SDL_HINT_RENDER_DIRECT3D11_DEBUG => 'SDL_RENDER_DIRECT3D11_DEBUG' ],
157             [ SDL_HINT_RENDER_DIRECT3D_THREADSAFE => 'SDL_RENDER_DIRECT3D_THREADSAFE' ],
158             [ SDL_HINT_RENDER_DRIVER => 'SDL_RENDER_DRIVER' ],
159             [ SDL_HINT_RENDER_LOGICAL_SIZE_MODE => 'SDL_RENDER_LOGICAL_SIZE_MODE' ],
160             [ SDL_HINT_RENDER_OPENGL_SHADERS => 'SDL_RENDER_OPENGL_SHADERS' ],
161             [ SDL_HINT_RENDER_SCALE_QUALITY => 'SDL_RENDER_SCALE_QUALITY' ],
162             [ SDL_HINT_RENDER_VSYNC => 'SDL_RENDER_VSYNC' ],
163             [ SDL_HINT_RETURN_KEY_HIDES_IME => 'SDL_RETURN_KEY_HIDES_IME' ],
164             [ SDL_HINT_RPI_VIDEO_LAYER => 'SDL_RPI_VIDEO_LAYER' ],
165             [ SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL =>
166             'SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL'
167             ],
168             [ SDL_HINT_THREAD_PRIORITY_POLICY => 'SDL_THREAD_PRIORITY_POLICY' ],
169             [ SDL_HINT_THREAD_STACK_SIZE => 'SDL_THREAD_STACK_SIZE' ],
170             [ SDL_HINT_TIMER_RESOLUTION => 'SDL_TIMER_RESOLUTION' ],
171             [ SDL_HINT_TOUCH_MOUSE_EVENTS => 'SDL_TOUCH_MOUSE_EVENTS' ],
172             [ SDL_HINT_TV_REMOTE_AS_JOYSTICK => 'SDL_TV_REMOTE_AS_JOYSTICK' ],
173             [ SDL_HINT_VIDEO_ALLOW_SCREENSAVER => 'SDL_VIDEO_ALLOW_SCREENSAVER' ],
174             [ SDL_HINT_VIDEO_DOUBLE_BUFFER => 'SDL_VIDEO_DOUBLE_BUFFER' ],
175             [ SDL_HINT_VIDEO_EXTERNAL_CONTEXT => 'SDL_VIDEO_EXTERNAL_CONTEXT' ],
176             [ SDL_HINT_VIDEO_HIGHDPI_DISABLED => 'SDL_VIDEO_HIGHDPI_DISABLED' ],
177             [ SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES => 'SDL_VIDEO_MAC_FULLSCREEN_SPACES' ],
178             [ SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS => 'SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS' ],
179             [ SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT => 'SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT' ],
180             [ SDL_HINT_VIDEO_WIN_D3DCOMPILE => 'SDL_VIDEO_WIN_D3DCOMPILE' ],
181             [ SDL_HINT_VIDEO_WIN_D3DCOMPILER => 'SDL_VIDEO_WIN_D3DCOMPILER' ],
182             [ SDL_HINT_VIDEO_X11_FORCE_EGL => 'SDL_VIDEO_X11_FORCE_EGL' ],
183             [ SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR => 'SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR' ],
184             [ SDL_HINT_VIDEO_X11_NET_WM_PING => 'SDL_VIDEO_X11_NET_WM_PING' ],
185             [ SDL_HINT_VIDEO_X11_WINDOW_VISUALID => 'SDL_VIDEO_X11_WINDOW_VISUALID' ],
186             [ SDL_HINT_VIDEO_X11_XINERAMA => 'SDL_VIDEO_X11_XINERAMA' ],
187             [ SDL_HINT_VIDEO_X11_XRANDR => 'SDL_VIDEO_X11_XRANDR' ],
188             [ SDL_HINT_VIDEO_X11_XVIDMODE => 'SDL_VIDEO_X11_XVIDMODE' ],
189             [ SDL_HINT_WAVE_FACT_CHUNK => 'SDL_WAVE_FACT_CHUNK' ],
190             [ SDL_HINT_WAVE_RIFF_CHUNK_SIZE => 'SDL_WAVE_RIFF_CHUNK_SIZE' ],
191             [ SDL_HINT_WAVE_TRUNCATION => 'SDL_WAVE_TRUNCATION' ],
192             [ SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING => 'SDL_WINDOWS_DISABLE_THREAD_NAMING' ],
193             [ SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP => 'SDL_WINDOWS_ENABLE_MESSAGELOOP' ],
194             [ SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS =>
195             'SDL_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS'
196             ],
197             [ SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL => 'SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL' ],
198             [ SDL_HINT_WINDOWS_INTRESOURCE_ICON => 'SDL_WINDOWS_INTRESOURCE_ICON' ],
199             [ SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL => 'SDL_WINDOWS_INTRESOURCE_ICON_SMALL' ],
200             [ SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 => 'SDL_WINDOWS_NO_CLOSE_ON_ALT_F4' ],
201             [ SDL_HINT_WINDOWS_USE_D3D9EX => 'SDL_WINDOWS_USE_D3D9EX' ],
202             [ SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN =>
203             'SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN'
204             ],
205             [ SDL_HINT_WINRT_HANDLE_BACK_BUTTON => 'SDL_WINRT_HANDLE_BACK_BUTTON' ],
206             [ SDL_HINT_WINRT_PRIVACY_POLICY_LABEL => 'SDL_WINRT_PRIVACY_POLICY_LABEL' ],
207             [ SDL_HINT_WINRT_PRIVACY_POLICY_URL => 'SDL_WINRT_PRIVACY_POLICY_URL' ],
208             [ SDL_HINT_XINPUT_ENABLED => 'SDL_XINPUT_ENABLED' ],
209             [ SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING => 'SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING' ]
210             ];
211             FFI::C::ArrayDef->new( # Used sparingly when I need to pass a list of SDL_Point objects
212             ffi,
213             name => 'SDL2x_PointList',
214             class => 'SDL2x::PointList',
215             members => ['SDL_Point'],
216             );
217             FFI::C::ArrayDef->new( # Used sparingly when I need to pass a list of SDL_Point objects
218             ffi,
219             name => 'SDL2x_FPointList',
220             class => 'SDL2x::FPointList',
221             members => ['SDL_Point'],
222             );
223             FFI::C::ArrayDef->new( # Used sparingly when I need to pass a list of SDL_Rect objects
224             ffi,
225             name => 'SDL2x_RectList',
226             class => 'SDL2x::RectList',
227             members => ['SDL_Rect'],
228             );
229             FFI::C::ArrayDef->new( # Used sparingly when I need to pass a list of SDL_Rect objects
230             ffi,
231             name => 'SDL2x_FRectList',
232             class => 'SDL2x::FRectList',
233             members => ['SDL_FRect'],
234             );
235             #
236             push @{ $EXPORT_TAGS{default} }, qw[:init];
237             attach init => {
238             SDL_Init => [ ['uint32'] => 'int' ],
239             SDL_InitSubSystem => [ ['uint32'] => 'int' ],
240             SDL_QuitSubSystem => [ ['uint32'] ],
241             SDL_WasInit => [ ['uint32'] => 'uint32' ],
242             SDL_Quit => [ [] ],
243             };
244             #
245             ffi->type( '(opaque,string,string,string)->void' => 'SDL_HintCallback' );
246             ffi->type( '(opaque,int,int,string)->void' => 'SDL_LogOutputFunction' );
247             ffi->type( '(opaque,opaque,opaque)->int' => 'SDL_HitTest' );
248             attach hints => {
249             SDL_SetHintWithPriority => [ [ 'string', 'string', 'int' ] => 'bool' ],
250             SDL_SetHint => [ [ 'string', 'string' ] => 'bool' ],
251             SDL_GetHint => [ ['string'] => 'string' ],
252             $ver->patch >= 5 ? ( SDL_GetHintBoolean => [ [ 'string', 'bool' ] => 'bool' ] ) : (),
253             SDL_AddHintCallback => [
254             [ 'string', 'SDL_HintCallback', 'opaque' ] => 'void' =>
255             sub ( $xsub, $name, $callback, $userdata ) { # Fake void pointer
256             my $cb = FFI::Platypus::Closure->new(
257             sub ( $ptr, @etc ) { $callback->( $userdata, @etc ) } );
258             $cb->sticky;
259             $xsub->( $name, $cb, $userdata );
260             return $cb;
261             }
262             ],
263             SDL_DelHintCallback => [
264             [ 'string', 'SDL_HintCallback', 'opaque' ] => 'void' =>
265             sub ( $xsub, $name, $callback, $userdata ) { # Fake void pointer
266             my $cb = $callback;
267             $cb->unstick;
268             $xsub->( $name, $cb, $userdata );
269             return $cb;
270             }
271             ],
272             SDL_ClearHints => [ [] => 'void' ],
273             },
274             error => {
275             SDL_SetError => [
276             ['string'] => 'int' =>
277             sub ( $inner, $fmt, @params ) { $inner->( sprintf( $fmt, @params ) ); }
278             ],
279             SDL_GetError => [ [] => 'string' ],
280             SDL_GetErrorMsg => [
281             [ 'string', 'int' ] => 'string' => sub ( $inner, $errstr, $maxlen = length $errstr ) {
282             $_[1] = ' ' x $maxlen if !defined $_[1] || length $errstr != $maxlen;
283             $inner->( $_[1], $maxlen );
284             }
285             ],
286             SDL_ClearError => [ [] => 'void' ]
287             },
288             log => {
289             SDL_LogSetAllPriority => [ ['SDL_LogPriority'] ],
290             SDL_LogSetPriority => [ [ 'SDL_LogCategory', 'SDL_LogPriority' ] ],
291             SDL_LogGetPriority => [ ['SDL_LogCategory'] => 'SDL_LogPriority' ],
292             SDL_LogResetPriorities => [ [] ],
293             SDL_Log => [
294             ['string'] => 'string' =>
295             sub ( $inner, $fmt, @args ) { $inner->( sprintf( $fmt, @args ) ) }
296             ],
297             SDL_LogVerbose => => [
298             [ 'SDL_LogCategory', 'string' ] => sub ( $inner, $category, $fmt, @args ) {
299             $inner->( $category, sprintf( $fmt, @args ) );
300             }
301             ],
302             SDL_LogDebug => => [
303             [ 'SDL_LogCategory', 'string' ] => sub ( $inner, $category, $fmt, @args ) {
304             $inner->( $category, sprintf( $fmt, @args ) );
305             }
306             ],
307             SDL_LogInfo => => [
308             [ 'SDL_LogCategory', 'string' ] => sub ( $inner, $category, $fmt, @args ) {
309             $inner->( $category, sprintf( $fmt, @args ) );
310             }
311             ],
312             SDL_LogWarn => => [
313             [ 'SDL_LogCategory', 'string' ] => sub ( $inner, $category, $fmt, @args ) {
314             $inner->( $category, sprintf( $fmt, @args ) );
315             }
316             ],
317             SDL_LogError => => [
318             [ 'SDL_LogCategory', 'string' ] => sub ( $inner, $category, $fmt, @args ) {
319             $inner->( $category, sprintf( $fmt, @args ) );
320             }
321             ],
322             SDL_LogCritical => => [
323             [ 'SDL_LogCategory', 'string' ] => sub ( $inner, $category, $fmt, @args ) {
324             $inner->( $category, sprintf( $fmt, @args ) );
325             }
326             ],
327             SDL_LogMessage => [
328             [ 'SDL_LogCategory', 'SDL_LogPriority', 'string' ] =>
329             sub ( $inner, $category, $priority, $fmt, @args ) {
330             $inner->( $category, $priority, sprintf( $fmt, @args ) );
331             }
332             ],
333              
334             # TODO
335             SDL_LogGetOutputFunction => [ [ 'SDL_LogOutputFunction', 'opaque' ] ],
336             SDL_LogSetOutputFunction => [
337             [ 'SDL_LogOutputFunction', 'opaque' ] => 'void' => sub ( $xsub, $callback, $userdata )
338             { # Fake void pointer
339             my $cb = FFI::Platypus::Closure->new(
340             sub ( $ptr, @etc ) { $callback->( $userdata, @etc ) } );
341             $cb->sticky;
342             $xsub->( $cb, $userdata );
343             return $cb;
344             }
345             ]
346             };
347             enum
348             SDL_WindowFlags => [
349             [ SDL_WINDOW_FULLSCREEN => 0x00000001 ],
350             [ SDL_WINDOW_OPENGL => 0x00000002 ],
351             [ SDL_WINDOW_SHOWN => 0x00000004 ],
352             [ SDL_WINDOW_HIDDEN => 0x00000008 ],
353             [ SDL_WINDOW_BORDERLESS => 0x00000010 ],
354             [ SDL_WINDOW_RESIZABLE => 0x00000020 ],
355             [ SDL_WINDOW_MINIMIZED => 0x00000040 ],
356             [ SDL_WINDOW_MAXIMIZED => 0x00000080 ],
357             [ SDL_WINDOW_MOUSE_GRABBED => 0x00000100 ],
358             [ SDL_WINDOW_INPUT_FOCUS => 0x00000200 ],
359             [ SDL_WINDOW_MOUSE_FOCUS => 0x00000400 ],
360             [ SDL_WINDOW_FULLSCREEN_DESKTOP => sub { ( SDL_WINDOW_FULLSCREEN() | 0x00001000 ) } ],
361             [ SDL_WINDOW_FOREIGN => 0x00000800 ],
362             [ SDL_WINDOW_ALLOW_HIGHDPI => 0x00002000 ],
363             [ SDL_WINDOW_MOUSE_CAPTURE => 0x00004000 ],
364             [ SDL_WINDOW_ALWAYS_ON_TOP => 0x00008000 ],
365             [ SDL_WINDOW_SKIP_TASKBAR => 0x00010000 ],
366             [ SDL_WINDOW_UTILITY => 0x00020000 ],
367             [ SDL_WINDOW_TOOLTIP => 0x00040000 ],
368             [ SDL_WINDOW_POPUP_MENU => 0x00080000 ],
369             [ SDL_WINDOW_KEYBOARD_GRABBED => 0x00100000 ],
370             [ SDL_WINDOW_VULKAN => 0x10000000 ],
371             [ SDL_WINDOW_METAL => 0x20000000 ],
372             [ SDL_WINDOW_INPUT_GRABBED => sub { SDL_WINDOW_MOUSE_GRABBED() } ],
373             ],
374             SDL_WindowFlagsX => [
375             qw[
376             SDL_WINDOWEVENT_NONE
377             SDL_WINDOWEVENT_SHOWN
378             SDL_WINDOWEVENT_HIDDEN
379             SDL_WINDOWEVENT_EXPOSED
380             SDL_WINDOWEVENT_MOVED
381             SDL_WINDOWEVENT_RESIZED
382             SDL_WINDOWEVENT_SIZE_CHANGED
383             SDL_WINDOWEVENT_MINIMIZED
384             SDL_WINDOWEVENT_MAXIMIZED
385             SDL_WINDOWEVENT_RESTORED
386             SDL_WINDOWEVENT_ENTER
387             SDL_WINDOWEVENT_LEAVE
388             SDL_WINDOWEVENT_FOCUS_GAINED
389             SDL_WINDOWEVENT_FOCUS_LOST
390             SDL_WINDOWEVENT_CLOSE
391             SDL_WINDOWEVENT_TAKE_FOCUS
392             SDL_WINDOWEVENT_HIT_TEST
393             ]
394             ],
395             SDL_DisplayEventID => [
396             qw[SDL_DISPLAYEVENT_NONE SDL_DISPLAYEVENT_ORIENTATION
397             SDL_DISPLAYEVENT_CONNECTED SDL_DISPLAYEVENT_DISCONNECTED
398             ]
399             ],
400             SDL_DisplayOrientation => [
401             qw[SDL_ORIENTATION_UNKNOWN
402             SDL_ORIENTATION_LANDSCAPE SDL_ORIENTATION_LANDSCAPE_FLIPPED
403             SDL_ORIENTATION_PORTRAIT SDL_ORIENTATION_PORTRAIT_FLIPPED
404             ]
405             ];
406              
407             # An opaque handle to an OpenGL context.
408 2     2   23 package SDL2::GLContext { use SDL2::Utils; has() };
  2         3  
  2         19  
409             enum SDL_GLattr => [
410             qw[
411             SDL_GL_RED_SIZE
412             SDL_GL_GREEN_SIZE
413             SDL_GL_BLUE_SIZE
414             SDL_GL_ALPHA_SIZE
415             SDL_GL_BUFFER_SIZE
416             SDL_GL_DOUBLEBUFFER
417             SDL_GL_DEPTH_SIZE
418             SDL_GL_STENCIL_SIZE
419             SDL_GL_ACCUM_RED_SIZE
420             SDL_GL_ACCUM_GREEN_SIZE
421             SDL_GL_ACCUM_BLUE_SIZE
422             SDL_GL_ACCUM_ALPHA_SIZE
423             SDL_GL_STEREO
424             SDL_GL_MULTISAMPLEBUFFERS
425             SDL_GL_MULTISAMPLESAMPLES
426             SDL_GL_ACCELERATED_VISUAL
427             SDL_GL_RETAINED_BACKING
428             SDL_GL_CONTEXT_MAJOR_VERSION
429             SDL_GL_CONTEXT_MINOR_VERSION
430             SDL_GL_CONTEXT_EGL
431             SDL_GL_CONTEXT_FLAGS
432             SDL_GL_CONTEXT_PROFILE_MASK
433             SDL_GL_SHARE_WITH_CURRENT_CONTEXT
434             SDL_GL_FRAMEBUFFER_SRGB_CAPABLE
435             SDL_GL_CONTEXT_RELEASE_BEHAVIOR
436             SDL_GL_CONTEXT_RESET_NOTIFICATION
437             SDL_GL_CONTEXT_NO_ERROR
438             ]
439             ],
440             SDL_GLprofile => [
441             [ SDL_GL_CONTEXT_PROFILE_CORE => 0x0001 ],
442             [ SDL_GL_CONTEXT_PROFILE_COMPATIBILITY => 0x0002 ],
443             [ SDL_GL_CONTEXT_PROFILE_ES => 0x0004 ]
444             ],
445             SDL_GLcontextFlag => [
446             [ SDL_GL_CONTEXT_DEBUG_FLAG => 0x0001 ],
447             [ SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG => 0x0002 ],
448             [ SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG => 0x0004 ],
449             [ SDL_GL_CONTEXT_RESET_ISOLATION_FLAG => 0x0008 ]
450             ],
451             SDL_GLcontextReleaseFlag => [
452             [ SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE => 0x0000 ],
453             [ SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH => 0x0001 ]
454             ],
455             SDL_GLContextResetNotification => [
456             [ SDL_GL_CONTEXT_RESET_NO_NOTIFICATION => 0x0000 ],
457             [ SDL_GL_CONTEXT_RESET_LOSE_CONTEXT => 0x0001 ]
458             ];
459             attach video => {
460             SDL_GetNumVideoDrivers => [ [], 'int' ],
461             SDL_GetVideoDriver => [ ['int'], 'string' ],
462             SDL_VideoInit => [ ['string'], 'int' ],
463             SDL_VideoQuit => [ [] ],
464             SDL_GetCurrentVideoDriver => [ [], 'string' ],
465             SDL_GetNumVideoDisplays => [ [], 'int' ],
466             SDL_GetDisplayName => [ ['int'], 'string' ],
467             SDL_GetDisplayBounds => [ [ 'int', 'SDL_Rect' ], 'int' ],
468             SDL_GetDisplayUsableBounds => [ [ 'int', 'SDL_Rect' ], 'int' ],
469             SDL_GetDisplayDPI => [ [ 'int', 'float *', 'float *', 'float *' ], 'int' ],
470             SDL_GetDisplayOrientation => [ ['int'], 'int' ],
471             SDL_GetNumDisplayModes => [ ['int'], 'int' ],
472             SDL_GetDisplayMode => [ [ 'int', 'int', 'SDL_DisplayMode' ], 'int' ],
473             SDL_GetDesktopDisplayMode => [ [ 'int', 'SDL_DisplayMode' ], 'int' ],
474             SDL_GetCurrentDisplayMode => [ [ 'int', 'SDL_DisplayMode' ], 'int' ],
475             SDL_GetClosestDisplayMode => [ [ 'int', 'SDL_DisplayMode', 'SDL_DisplayMode' ], 'opaque' ],
476             SDL_GetWindowDisplayIndex => [ ['SDL_Window'], 'int' ],
477             SDL_SetWindowDisplayMode => [ [ 'SDL_Window', 'SDL_DisplayMode' ], 'int' ],
478             SDL_GetWindowDisplayMode => [ [ 'SDL_Window', 'SDL_DisplayMode' ], 'int' ],
479             SDL_GetWindowPixelFormat => [ ['SDL_Window'], 'uint32' ],
480             SDL_CreateWindow => [ [ 'string', 'int', 'int', 'int', 'int', 'uint32' ] => 'SDL_Window' ],
481             SDL_CreateWindowFrom => [ ['opaque'] => 'SDL_Window' ],
482             SDL_GetWindowID => [ ['SDL_Window'] => 'uint32' ],
483             SDL_GetWindowFromID => [ ['uint32'] => 'SDL_Window' ],
484             SDL_GetWindowFlags => [ ['SDL_Window'] => 'uint32' ],
485             SDL_SetWindowTitle => [ [ 'SDL_Window', 'string' ] ],
486             SDL_GetWindowTitle => [ ['SDL_Window'], 'string' ],
487             SDL_SetWindowIcon => [ [ 'SDL_Window', 'SDL_Surface' ] ],
488              
489             # These don't work correctly yet. (cast issues)
490             SDL_SetWindowData => [ [ 'SDL_Window', 'string', 'opaque*' ], 'opaque*' ],
491             SDL_GetWindowData => [ [ 'SDL_Window', 'string' ], 'opaque*' ],
492             SDL_SetWindowPosition => [ [ 'SDL_Window', 'int', 'int' ] ],
493             SDL_GetWindowPosition => [ [ 'SDL_Window', 'int*', 'int*' ] ],
494             SDL_SetWindowSize => [ [ 'SDL_Window', 'int', 'int' ] ],
495             SDL_GetWindowSize => [ [ 'SDL_Window', 'int*', 'int*' ] ],
496             SDL_GetWindowBordersSize => [ [ 'SDL_Window', 'int*', 'int*', 'int*', 'int*' ], 'int' ],
497             SDL_SetWindowMinimumSize => [ [ 'SDL_Window', 'int', 'int' ] ],
498             SDL_GetWindowMinimumSize => [ [ 'SDL_Window', 'int*', 'int*' ] ],
499             SDL_SetWindowMaximumSize => [ [ 'SDL_Window', 'int', 'int' ] ],
500             SDL_GetWindowMaximumSize => [ [ 'SDL_Window', 'int*', 'int*' ] ],
501             SDL_SetWindowBordered => [ [ 'SDL_Window', 'bool' ] ],
502             SDL_SetWindowResizable => [ [ 'SDL_Window', 'bool' ] ],
503             SDL_ShowWindow => [ ['SDL_Window'] ],
504             SDL_HideWindow => [ ['SDL_Window'] ],
505             SDL_RaiseWindow => [ ['SDL_Window'] ],
506             SDL_MaximizeWindow => [ ['SDL_Window'] ],
507             SDL_MinimizeWindow => [ ['SDL_Window'] ],
508             SDL_RestoreWindow => [ ['SDL_Window'] ],
509             SDL_SetWindowFullscreen => [ [ 'SDL_Window', 'uint32' ], 'int' ],
510             SDL_GetWindowSurface => [ ['SDL_Window'], 'SDL_Surface' ],
511             SDL_UpdateWindowSurface => [ ['SDL_Window'], 'int' ],
512             SDL_UpdateWindowSurfaceRects => [ [ 'SDL_Window', 'opaque*', 'int' ], 'int' ],
513             SDL_SetWindowGrab => [ [ 'SDL_Window', 'bool' ] ],
514             ( $ver->patch >= 15 ? ( SDL_SetWindowKeyboardGrab => [ [ 'SDL_Window', 'bool' ] ] ) : () ),
515             ( $ver->patch >= 15 ? ( SDL_SetWindowMouseGrab => [ [ 'SDL_Window', 'bool' ] ] ) : () ),
516             SDL_GetWindowGrab => [ ['SDL_Window'], 'bool' ],
517             ( $ver->patch >= 15 ? ( SDL_GetWindowKeyboardGrab => [ ['SDL_Window'], 'bool' ] ) : () ),
518             ( $ver->patch >= 15 ? ( SDL_GetWindowMouseGrab => [ ['SDL_Window'], 'bool' ] ) : () ),
519             SDL_GetGrabbedWindow => [ [], 'SDL_Window' ],
520             SDL_SetWindowBrightness => [ [ 'SDL_Window', 'float' ], 'int' ],
521             SDL_GetWindowBrightness => [ ['SDL_Window'], 'float' ],
522             SDL_SetWindowOpacity => [ [ 'SDL_Window', 'float' ], 'int' ],
523             SDL_GetWindowOpacity => [ [ 'SDL_Window', 'float*' ], 'int' ],
524             SDL_SetWindowModalFor => [ [ 'SDL_Window', 'SDL_Window' ], 'int' ],
525             SDL_SetWindowInputFocus => [ ['SDL_Window'], 'int' ],
526             SDL_SetWindowGammaRamp =>
527             [ [ 'SDL_Window', 'uint32[256]', 'uint32[256]', 'uint32[256]' ], 'int' ],
528             SDL_GetWindowGammaRamp => [
529             [ 'SDL_Window', 'uint32[256]', 'uint32[256]', 'uint32[256]' ], 'int'
530              
531             #=> sub ( $inner, $window ) {
532             # my @red = my @blue = my @green = map { \0 } 1 .. 256;
533             # my $ok = $inner->( $window, \@red, \@green, \@blue );
534             # $ok == 0 ? ( \@red, \@green, \@blue ) : $ok;
535             #}
536             ],
537             SDL_SetWindowHitTest => [
538             [ 'SDL_Window', 'SDL_HitTest', 'opaque' ],
539             'int' => sub ( $xsub, $window, $callback, $callback_data = () ) { # Fake void pointer
540             my $cb = $callback;
541             if ( defined $callback ) {
542             $cb = FFI::Platypus::Closure->new(
543             sub ( $win, $area, $data ) {
544             $callback->(
545             ffi->cast( 'opaque' => 'SDL_Window', $win ),
546             ffi->cast( 'opaque' => 'SDL_Point', $area ),
547             $callback_data
548             );
549             }
550             );
551             $cb->sticky;
552             }
553             $xsub->( $window, $cb, $callback_data );
554             return $cb;
555             }
556             ],
557             ( $ver->patch >= 15 ? ( SDL_FlashWindow => [ [ 'SDL_Window', 'uint32' ], 'int' ] ) : () ),
558             SDL_DestroyWindow => [ ['SDL_Window'] ],
559             SDL_IsScreenSaverEnabled => [ [], 'bool' ],
560             SDL_EnableScreenSaver => [ [] ],
561             SDL_DisableScreenSaver => [ [] ],
562             },
563             opengl => {
564             SDL_GL_LoadLibrary => [ ['string'], 'int' ],
565             SDL_GL_GetProcAddress => [ ['string'], 'opaque' ],
566             SDL_GL_UnloadLibrary => [ [] ],
567             SDL_GL_ExtensionSupported => [ ['string'], 'bool' ],
568             SDL_GL_ResetAttributes => [ [] ],
569             SDL_GL_SetAttribute => [ [ 'SDL_GLattr', 'int' ], 'int' ],
570             SDL_GL_GetAttribute => [ [ 'SDL_GLattr', 'int*' ], 'int' ],
571             SDL_GL_CreateContext => [ ['SDL_Window'], 'SDL_GLContext' ],
572             SDL_GL_MakeCurrent => [ [ 'SDL_Window', 'SDL_GLContext' ], 'int' ],
573             SDL_GL_GetCurrentWindow => [ [], 'SDL_Window' ],
574             SDL_GL_GetCurrentContext => [ [], 'SDL_GLContext' ],
575             SDL_GL_GetDrawableSize => [ [ 'SDL_Window', 'int*', 'int*' ], ],
576             SDL_GL_SetSwapInterval => [ ['int'], 'int' ],
577             SDL_GL_GetSwapInterval => [ [], 'int' ],
578             SDL_GL_SwapWindow => [ ['SDL_Window'] ],
579             SDL_GL_DeleteContext => [ ['SDL_GLContext'] ]
580             };
581             enum SDL_RendererFlags => [
582             [ SDL_RENDERER_SOFTWARE => 0x00000001 ],
583             [ SDL_RENDERER_ACCELERATED => 0x00000002 ],
584             [ SDL_RENDERER_PRESENTVSYNC => 0x00000004 ],
585             [ SDL_RENDERER_TARGETTEXTURE => 0x00000008 ]
586             ];
587              
588             package SDL2::RendererInfo {
589 2     2   2185 use SDL2::Utils;
  2         11  
  2         9  
590             has name => 'opaque', # string
591             flags => 'uint32',
592             num_texture_formats => 'uint32',
593             texture_formats => 'uint32[16]',
594             max_texture_width => 'int',
595             max_texture_height => 'int';
596             };
597             enum
598             SDL_ScaleMode => [qw[SDL_SCALEMODENEAREST SDL_SCALEMODELINEAR SDL_SCALEMODEBEST]],
599             SDL_TextureAccess =>
600             [qw[SDL_TEXTUREACCESS_STATIC SDL_TEXTUREACCESS_STREAMING SDL_TEXTUREACCESS_TARGET]],
601             SDL_TextureModulate => [
602             [ SDL_TEXTUREMODULATE_NONE => 0x00000000 ],
603             [ SDL_TEXTUREMODULATE_COLOR => 0x00000001 ],
604             [ SDL_TEXTUREMODULATE_ALPHA => 0x00000002 ]
605             ],
606             SDL_RendererFlip => [
607             [ SDL_FLIP_NONE => 0x00000000 ],
608             [ SDL_FLIP_HORIZONTAL => 0x00000001 ],
609             [ SDL_FLIP_VERTICAL => 0x00000002 ]
610             ],
611             SDL_BlendMode => [
612             [ SDL_BLENDMODE_NONE => 0x00000000 ],
613             [ SDL_BLENDMODE_BLEND => 0x00000001 ],
614             [ SDL_BLENDMODE_ADD => 0x00000002, ],
615             [ SDL_BLENDMODE_MOD => 0x00000004, ],
616             [ SDL_BLENDMODE_MUL => 0x00000008, ],
617             [ SDL_BLENDMODE_INVALID => 0x7FFFFFFF ]
618             ],
619             SDL_BlendOperation => [
620             [ SDL_BLENDOPERATION_ADD => 0x1 ],
621             [ SDL_BLENDOPERATION_SUBTRACT => 0x2 ],
622             [ SDL_BLENDOPERATION_REV_SUBTRACT => 0x3 ],
623             [ SDL_BLENDOPERATION_MINIMUM => 0x4 ],
624             [ SDL_BLENDOPERATION_MAXIMUM => 0x5 ]
625             ],
626             SDL_BlendFactor => [
627             [ SDL_BLENDFACTOR_ZERO => 0x1 ],
628             [ SDL_BLENDFACTOR_ONE => 0x2 ],
629             [ SDL_BLENDFACTOR_SRC_COLOR => 0x3 ],
630             [ SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR => 0x4 ],
631             [ SDL_BLENDFACTOR_SRC_ALPHA => 0x5 ],
632             [ SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA => 0x6 ],
633             [ SDL_BLENDFACTOR_DST_COLOR => 0x7 ],
634             [ SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR => 0x8 ],
635             [ SDL_BLENDFACTOR_DST_ALPHA => 0x9 ],
636             [ SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA => 0xA ]
637             ];
638              
639 2     2   1004 package SDL2::Renderer { use SDL2::Utils; has() };
  2         56  
  2         15  
640              
641 2     2   908 package SDL2::Texture { use SDL2::Utils; has() };
  2         4  
  2         9  
642             attach render => {
643             SDL_GetNumRenderDrivers => [ [], 'int' ],
644             SDL_GetRenderDriverInfo => [ [ 'int', 'SDL_RendererInfo' ], 'int' ],
645             SDL_CreateWindowAndRenderer => [
646             [ 'int', 'int', 'uint32', 'opaque*', 'opaque*' ], 'int'
647              
648             #=> sub ( $inner, $width, $height, $window_flags ) {
649             # my $window = SDL2::Window->new;
650             # my $renderer = SDL2::Renderer->new;
651             # my $ok = $inner->( $width, $height, $window_flags, \$window, \$renderer );
652             # $ok == 0 ? (
653             # ffi->cast( 'opaque' => 'SDL_Window', $window ),
654             # ffi->cast( 'opaque' => 'SDL_Renderer', $renderer ),
655             # ) :
656             # $ok;
657             #}
658             ],
659             SDL_CreateRenderer => [ [ 'SDL_Window', 'int', 'uint32' ], 'SDL_Renderer' ],
660             SDL_CreateSoftwareRenderer => [ ['SDL_Renderer'], 'SDL_Surface' ],
661             SDL_GetRenderer => [ ['SDL_Window'], 'SDL_Renderer' ],
662             SDL_GetRendererInfo => [ [ 'SDL_Renderer', 'SDL_RendererInfo' ], 'int' ],
663             SDL_GetRendererOutputSize => [ [ 'SDL_Renderer', 'int*', 'int*' ], 'int' ],
664             SDL_CreateTexture => [ [ 'SDL_Renderer', 'uint32', 'int', 'int', 'int' ], 'SDL_Texture' ],
665             SDL_CreateTextureFromSurface => [ [ 'SDL_Renderer', 'SDL_Surface' ], 'SDL_Texture' ],
666             SDL_QueryTexture => [ [ 'SDL_Texture', 'uint32*', 'int*', 'int*', 'int*' ], 'int' ],
667             SDL_SetTextureColorMod => [ [ 'SDL_Texture', 'uint8', 'uint8', 'uint8' ], 'int' ],
668             SDL_GetTextureColorMod => [ [ 'SDL_Texture', 'uint8*', 'uint8*', 'uint8*' ], 'int' ],
669             SDL_SetTextureAlphaMod => [ [ 'SDL_Texture', 'uint8' ], 'int' ],
670             SDL_GetTextureAlphaMod => [ [ 'SDL_Texture', 'uint8*' ], 'int' ],
671             SDL_SetTextureBlendMode => [ [ 'SDL_Texture', 'SDL_BlendMode' ], 'int' ],
672             SDL_GetTextureBlendMode => [ [ 'SDL_Texture', 'int*' ], 'int' ],
673             SDL_UpdateTexture => [ [ 'SDL_Texture', 'SDL_Rect', 'opaque*', 'int' ], 'int' ],
674             SDL_UpdateYUVTexture => [
675             [ 'SDL_Texture', 'SDL_Rect', 'uint8*', 'int', 'uint8*', 'int', 'uint8*', 'int' ], 'int'
676             ], (
677             $ver->patch >= 15 ?
678             ( SDL_UpdateNVTexture =>
679             [ [ 'SDL_Texture', 'SDL_Rect', 'uint8*', 'int', 'uint8*', 'int' ], 'int' ] ) :
680             ()
681             ),
682             SDL_LockTexture => [ [ 'SDL_Texture', 'SDL_Rect', 'opaque*' ], 'int' ],
683             SDL_LockTextureToSurface => [ [ 'SDL_Texture', 'SDL_Rect', 'SDL_Surface' ], 'int' ],
684             SDL_UnlockTexture => [ ['SDL_Texture'] ],
685             SDL_RenderTargetSupported => [ ['SDL_Renderer'], 'bool' ],
686             SDL_SetRenderTarget => [ [ 'SDL_Renderer', 'SDL_Texture' ], 'int' ],
687             SDL_GetRenderTarget => [ ['SDL_Renderer'], 'SDL_Texture' ],
688             SDL_RenderSetLogicalSize => [ [ 'SDL_Renderer', 'int', 'int' ], 'int' ],
689             SDL_RenderGetLogicalSize => [ [ 'SDL_Renderer', 'int*', 'int*' ], 'int' ],
690             SDL_RenderSetIntegerScale => [ [ 'SDL_Renderer', 'bool' ], 'int' ],
691             SDL_RenderGetIntegerScale => [ ['SDL_Renderer'], 'bool' ],
692             SDL_RenderSetViewport => [ [ 'SDL_Renderer', 'SDL_Rect' ], 'int' ],
693             SDL_RenderGetViewport => [ [ 'SDL_Renderer', 'SDL_Rect' ], 'int' ],
694             SDL_RenderSetClipRect => [ [ 'SDL_Renderer', 'SDL_Rect' ], 'int' ],
695             SDL_RenderGetClipRect => [ [ 'SDL_Renderer', 'SDL_Rect' ] ],
696             SDL_RenderIsClipEnabled => [ ['SDL_Renderer'], 'bool' ],
697             SDL_RenderSetScale => [ [ 'SDL_Renderer', 'float', 'float' ], 'int' ],
698             SDL_RenderGetScale => [ [ 'SDL_Renderer', 'float*', 'float*' ], ],
699             SDL_SetRenderDrawColor => [ [ 'SDL_Renderer', 'uint8', 'uint8', 'uint8', 'uint8' ], 'int' ],
700             SDL_GetRenderDrawColor =>
701             [ [ 'SDL_Renderer', 'uint8*', 'uint8*', 'uint8*', 'uint8*' ], 'int' ],
702             SDL_SetRenderDrawBlendMode => [ [ 'SDL_Renderer', 'SDL_BlendMode' ], 'int' ],
703             SDL_GetRenderDrawBlendMode => [ [ 'SDL_Renderer', 'int*' ], 'int' ],
704             SDL_RenderClear => [ ['SDL_Renderer'], 'int' ],
705             SDL_RenderDrawPoint => [ [ 'SDL_Renderer', 'int', 'int' ], 'int' ],
706             SDL_RenderDrawPoints => [
707             [ 'SDL_Renderer', 'SDL2x_PointList', 'int' ],
708             'int' => sub ( $inner, $renderer, @points ) {
709              
710             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
711             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
712             $inner->(
713             $renderer,
714             SDL2x::PointList->new(
715             [ map { ref $_ eq 'HASH' ? $_ : { x => $_->x, y => $_->y } } @points ]
716             ),
717             scalar @points
718             );
719             }
720             ],
721             SDL_RenderDrawLine => [ [ 'SDL_Renderer', 'int', 'int', 'int', 'int' ], 'int' ],
722             SDL_RenderDrawLines => [
723             [ 'SDL_Renderer', 'SDL2x_PointList', 'int' ],
724             'int' => sub ( $inner, $renderer, @points ) {
725              
726             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
727             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
728             $inner->(
729             $renderer,
730             SDL2x::PointList->new(
731             [ map { ref $_ eq 'HASH' ? $_ : { x => $_->x, y => $_->y } } @points ]
732             ),
733             scalar @points
734             );
735             }
736             ],
737             SDL_RenderDrawRect => [ [ 'SDL_Renderer', 'SDL_Rect' ], 'int' ],
738             SDL_RenderDrawRects => [
739             [ 'SDL_Renderer', 'SDL2x_RectList', 'int' ],
740             'int' => sub ( $inner, $renderer, @rects ) {
741              
742             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
743             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
744             $inner->(
745             $renderer,
746             SDL2x::RectList->new(
747             [ map {
748             ref $_ eq 'HASH' ? $_ :
749             { x => $_->x, y => $_->y, w => $_->w, h => $_->h }
750             } @rects
751             ]
752             ),
753             scalar @rects
754             );
755             }
756             ],
757             SDL_RenderFillRect => [ [ 'SDL_Renderer', 'SDL_Rect' ], 'int' ],
758             SDL_RenderFillRects => [
759             [ 'SDL_Renderer', 'SDL2x_RectList', 'int' ],
760             'int' => sub ( $inner, $renderer, @rects ) {
761              
762             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
763             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
764             $inner->(
765             $renderer,
766             SDL2x::RectList->new(
767             [ map {
768             ref $_ eq 'HASH' ? $_ :
769             { x => $_->x, y => $_->y, w => $_->w, h => $_->h }
770             } @rects
771             ]
772             ),
773             scalar @rects
774             );
775             }
776             ],
777             SDL_RenderCopy => [ [ 'SDL_Renderer', 'SDL_Texture', 'SDL_Rect', 'SDL_Rect' ], 'int' ],
778              
779             # XXX - I do not have an example for this function in docs
780             SDL_RenderCopyEx => [
781             [ 'SDL_Renderer', 'SDL_Texture', 'SDL_Rect', 'SDL_Rect',
782             'double', 'SDL_Point', 'SDL_RendererFlip'
783             ],
784             'int'
785             ],
786             SDL_RenderDrawPointF => [ [ 'SDL_Renderer', 'float', 'float' ], 'int' ],
787             SDL_RenderDrawPointsF => [
788             [ 'SDL_Renderer', 'SDL2x_FPointList', 'int' ],
789             'int' => sub ( $inner, $renderer, @points ) {
790              
791             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
792             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
793             $inner->(
794             $renderer,
795             SDL2x::PointFList->new(
796             [ map { ref $_ eq 'HASH' ? $_ : { x => $_->x, y => $_->y } } @points ]
797             ),
798             scalar @points
799             );
800             }
801             ],
802             SDL_RenderDrawLineF => [ [ 'SDL_Renderer', 'float', 'float', 'float', 'float' ], 'int' ],
803             SDL_RenderDrawLinesF => [
804             [ 'SDL_Renderer', 'SDL2x_FPointList', 'int' ],
805             'int' => sub ( $inner, $renderer, @points ) {
806              
807             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
808             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
809             $inner->(
810             $renderer,
811             SDL2x::FPointList->new(
812             [ map { ref $_ eq 'HASH' ? $_ : { x => $_->x, y => $_->y } } @points ]
813             ),
814             scalar @points
815             );
816             }
817             ],
818             SDL_RenderDrawRectF => [
819             [ 'SDL_Renderer', 'SDL2x_FRectList', 'int' ],
820             'int' => sub ( $inner, $renderer, @rects ) {
821              
822             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
823             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
824             $inner->(
825             $renderer,
826             SDL2x::FRectList->new(
827             [ map {
828             ref $_ eq 'HASH' ? $_ :
829             { x => $_->x, y => $_->y, w => $_->w, h => $_->h }
830             } @rects
831             ]
832             ),
833             scalar @rects
834             );
835             }
836             ],
837             SDL_RenderDrawRectsF => [
838             [ 'SDL_Renderer', 'SDL2x_FRectList', 'int' ],
839             'int' => sub ( $inner, $renderer, @rects ) {
840              
841             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
842             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
843             $inner->(
844             $renderer,
845             SDL2x::FRectList->new(
846             [ map {
847             ref $_ eq 'HASH' ? $_ :
848             { x => $_->x, y => $_->y, w => $_->w, h => $_->h }
849             } @rects
850             ]
851             ),
852             scalar @rects
853             );
854             }
855             ],
856             SDL_RenderFillRectsF => [
857             [ 'SDL_Renderer', 'SDL2x_FRectList', 'int' ],
858             'int' => sub ( $inner, $renderer, @rects ) {
859              
860             # XXX - This is a workaround for FFI::C::Array not being able to accept a list of objects
861             # XXX - I can rethink this map when https://github.com/PerlFFI/FFI-C/issues/53 is resolved
862             $inner->(
863             $renderer,
864             SDL2x::FRectList->new(
865             [ map {
866             ref $_ eq 'HASH' ? $_ :
867             { x => $_->x, y => $_->y, w => $_->w, h => $_->h }
868             } @rects
869             ]
870             ),
871             scalar @rects
872             );
873             }
874             ],
875              
876             # XXX - I do not have an example for this function in docs
877             SDL_RenderCopyF => [ [ 'SDL_Renderer', 'SDL_Texture', 'SDL_Rect', 'SDL_FRect' ], 'int' ],
878              
879             # XXX - I do not have an example for this function in docs
880             SDL_RenderCopyExF => [
881             [ 'SDL_Renderer', 'SDL_Texture', 'SDL_Rect', 'SDL_FRect',
882             'double', 'SDL_FPoint', 'SDL_RendererFlip'
883             ],
884             'int'
885             ],
886             SDL_RenderReadPixels =>
887             [ [ 'SDL_Renderer', 'SDL_Rect', 'uint32', 'opaque', 'int' ], 'int' ],
888             SDL_RenderPresent => [ ['SDL_Renderer'] ],
889             SDL_DestroyTexture => [ ['SDL_Texture'] ],
890             SDL_DestroyRenderer => [ ['SDL_Renderer'] ],
891             SDL_RenderFlush => [ ['SDL_Renderer'], 'int' ],
892             SDL_GL_BindTexture => [ [ 'SDL_Texture', 'float*', 'float*' ], 'int' ],
893             SDL_GL_UnbindTexture => [ ['SDL_Texture'], 'int' ],
894             SDL_RenderGetMetalLayer => [ ['SDL_Renderer'], 'opaque' ],
895             SDL_RenderGetMetalCommandEncoder => [ ['SDL_Renderer'], 'opaque' ]
896             };
897             ffi->type( '(int,opaque)->uint32' => 'SDL_TimerCallback' );
898             attach timer => {
899             SDL_GetTicks => [ [], 'uint32' ],
900             SDL_GetPerformanceCounter => [ [], 'uint64' ],
901             SDL_GetPerformanceFrequency => [ [], 'uint64' ],
902             SDL_Delay => [ ['uint32'] ],
903             SDL_AddTimer => [
904             [ 'uint32', 'SDL_TimerCallback', 'opaque' ],
905             'int' => sub ( $xsub, $interval, $callback, $param = () ) {
906              
907             # Fake void pointer
908             my $cb = FFI::Platypus::Closure->new( sub { $callback->(@_); } );
909             $cb->sticky;
910             $xsub->( $interval, $cb, $param );
911             }
912             ],
913             SDL_RemoveTimer => [ ['uint32'] => 'bool' ],
914             };
915 0         0 define audio => [
916             [ SDL_AUDIO_MASK_BITSIZE => 0xFF ],
917             [ SDL_AUDIO_MASK_DATATYPE => ( 1 << 8 ) ],
918             [ SDL_AUDIO_MASK_ENDIAN => ( 1 << 12 ) ],
919             [ SDL_AUDIO_MASK_SIGNED => ( 1 << 15 ) ],
920 0     0   0 [ SDL_AUDIO_BITSIZE => sub ($x) { $x & SDL_AUDIO_MASK_BITSIZE() } ],
  0         0  
  0         0  
  0         0  
921 0     0   0 [ SDL_AUDIO_ISFLOAT => sub ($x) { $x & SDL_AUDIO_MASK_DATATYPE() } ],
  0         0  
  0         0  
  0         0  
922 0     0   0 [ SDL_AUDIO_ISBIGENDIAN => sub ($x) { $x & SDL_AUDIO_MASK_ENDIAN() } ],
  0         0  
  0         0  
  0         0  
923 0     0   0 [ SDL_AUDIO_ISSIGNED => sub ($x) { $x & SDL_AUDIO_MASK_SIGNED() } ],
  0         0  
  0         0  
  0         0  
924 0     0   0 [ SDL_AUDIO_ISINT => sub ($x) { !SDL_AUDIO_ISFLOAT($x) } ],
  0         0  
  0         0  
  0         0  
925 0     0   0 [ SDL_AUDIO_ISLITTLEENDIAN => sub ($x) { !SDL_AUDIO_ISBIGENDIAN($x) } ],
  0         0  
  0         0  
  0         0  
926 0     0   0 [ SDL_AUDIO_ISUNSIGNED => sub ($x) { !SDL_AUDIO_ISSIGNED($x) } ],
  0         0  
  0         0  
  0         0  
927             [ AUDIO_U8 => 0x0008 ],
928             [ AUDIO_S8 => 0x8008 ],
929             [ AUDIO_U16LSB => 0x0010 ],
930             [ AUDIO_S16LSB => 0x8010 ],
931             [ AUDIO_U16MSB => 0x1010 ],
932             [ AUDIO_S16MSB => 0x9010 ],
933 0     0   0 [ AUDIO_U16 => sub () { AUDIO_U16LSB() } ],
  0         0  
  0         0  
934 0     0   0 [ AUDIO_S16 => sub () { AUDIO_S16LSB() } ],
  0         0  
  0         0  
935             [ AUDIO_S32LSB => 0x8020 ],
936             [ AUDIO_S32MSB => 0x9020 ],
937 0     0   0 [ AUDIO_S32 => sub () { AUDIO_S32LSB() } ],
  0         0  
  0         0  
938             [ AUDIO_F32LSB => 0x8120 ],
939             [ AUDIO_F32MSB => 0x9120 ],
940 0     0   0 [ AUDIO_F32 => sub () { AUDIO_F32LSB() } ], (
  0         0  
  0         0  
941             $bigendian ? (
942 0     0   0 [ AUDIO_U16SYS => sub () { AUDIO_U16MSB() } ],
  0         0  
  0         0  
943 0     0   0 [ AUDIO_S16SYS => sub () { AUDIO_S16MSB() } ],
  0         0  
  0         0  
944 0     0   0 [ AUDIO_S32SYS => sub () { AUDIO_S32MSB() } ],
  0         0  
  0         0  
945 0         0 [ AUDIO_F32SYS => sub () { AUDIO_F32MSB() } ]
  0         0  
946             ) : (
947             [ AUDIO_U16SYS => sub () { AUDIO_U16LSB() } ],
948             [ AUDIO_S16SYS => sub () { AUDIO_S16LSB() } ],
949             [ AUDIO_S32SYS => sub () { AUDIO_S32LSB() } ],
950 0     0   0 [ AUDIO_F32SYS => sub () { AUDIO_F32LSB() } ],
951             )
952             ),
953 0     0   0 [ SDL_AUDIO_ALLOW_FREQUENCY_CHANGE => sub () {0x00000001} ],
  0         0  
  0         0  
954 0     0   0 [ SDL_AUDIO_ALLOW_FORMAT_CHANGE => sub () {0x00000002} ],
  0         0  
  0         0  
955 0     0   0 [ SDL_AUDIO_ALLOW_CHANNELS_CHANGE => sub () {0x00000004} ],
  0         0  
  0         0  
956 0     0   0 [ SDL_AUDIO_ALLOW_SAMPLES_CHANGE => sub () {0x00000008} ],
  0         0  
  0         0  
957 0         0 [ SDL_AUDIO_ALLOW_ANY_CHANGE => sub () {
958 0         0 ( SDL_AUDIO_ALLOW_FREQUENCY_CHANGE() | SDL_AUDIO_ALLOW_FORMAT_CHANGE()
959             | SDL_AUDIO_ALLOW_CHANNELS_CHANGE() | SDL_AUDIO_ALLOW_SAMPLES_CHANGE() )
960             }
961             ],
962             ];
963             ffi->type( '(opaque,string,int)->void' => 'SDL_AudioCallback' );
964             ffi->type( 'int' => 'SDL_AudioFormat' );
965              
966             package SDL2::AudioSpec {
967 2     2   4311 use SDL2::Utils;
  2         3  
  2         8  
968             has
969             freq => 'int',
970             format => 'uint16',
971             channels => 'uint8',
972             silence => 'uint8',
973             samples => 'uint16',
974             padding => 'uint16',
975             size => 'uint32',
976             callback => 'opaque', # SDL_AudioCallback
977             userdata => 'opaque' # void *
978             };
979              
980             package SDL2::AudioCVT {
981 2     2   911 use SDL2::Utils;
  2         4  
  2         8  
982             has
983             needed => 'int',
984             src_format => 'uint16', # SDL_AudioFormat
985             dst_format => 'uint16', # SDL_AudioFormat
986             rate_incr => 'double',
987             buf => 'opaque', # uint8 *
988             len => 'int',
989             len_cvt => 'int',
990             len_mult => 'int',
991             len_ratio => 'double',
992             filters => 'opaque', #SDL_AudioFilter[SDL_AUDIOCVT_MAX_FILTERS + 1];
993             filter_index => 'int';
994             };
995             ffi->type( '(opaque,uint16)->void' => 'SDL_AudioFilter' );
996              
997             package SDL2::AudioStream {
998 2     2   897 use SDL2::Utils;
  2         4  
  2         9  
999             has();
1000             };
1001              
1002             package SDL2::AudioDeviceID {
1003 2     2   883 use SDL2::Utils;
  2         4  
  2         6  
1004             has();
1005             };
1006              
1007             package SDL2::AudioStatus {
1008 2     2   881 use SDL2::Utils;
  2         2  
  2         8  
1009             has();
1010             };
1011              
1012             package SDL2::RWops { # TODO: https://github.com/libsdl-org/SDL/blob/main/include/SDL_rwops.h
1013 2     2   849 use SDL2::Utils;
  2         3  
  2         5  
1014             has();
1015             };
1016             define audio => [ [ SDL_AUDIOCVT_MAX_FILTERS => 9 ], ];
1017             attach audio => {
1018             SDL_AudioInit => [ ["string"], "int" ],
1019             SDL_AudioQuit => [ [] ],
1020             SDL_AudioStreamAvailable => [ ["SDL_AudioStream"], "int" ],
1021             SDL_AudioStreamClear => [ ["SDL_AudioStream"] ],
1022             SDL_AudioStreamFlush => [ ["SDL_AudioStream"], "int" ],
1023             SDL_AudioStreamGet => [ [ "SDL_AudioStream", "opaque*", "int" ], "int" ],
1024             SDL_AudioStreamPut => [ [ "SDL_AudioStream", "opaque*", "int" ], "int" ],
1025             SDL_BuildAudioCVT => [
1026             [ "SDL_AudioCVT", "SDL_AudioFormat", "uint8", "int",
1027             "SDL_AudioFormat", "uint8", "int",
1028             ],
1029             "int",
1030             ],
1031             SDL_ClearQueuedAudio => [ ["SDL_AudioDeviceID"] ],
1032             SDL_CloseAudio => [ [] ],
1033             SDL_CloseAudioDevice => [ ["SDL_AudioDeviceID"] ],
1034             SDL_ConvertAudio => [ ["SDL_AudioCVT"], "int" ],
1035             SDL_DequeueAudio => [ [ "SDL_AudioDeviceID", "opaque*", "uint32" ], "uint32" ],
1036             SDL_FreeAudioStream => [ ["SDL_AudioStream"] ],
1037             SDL_FreeWAV => [ ["uint8 *"] ],
1038             SDL_GetAudioDeviceName => [ [ "int", "int" ], "string" ], (
1039             $ver->patch >= 15 ?
1040             ( SDL_GetAudioDeviceSpec => [ [ "int", "int", "SDL_AudioSpec" ], "int" ] ) :
1041             ()
1042             ),
1043             SDL_GetAudioDeviceStatus => [ ["SDL_AudioDeviceID"], "SDL_AudioStatus" ],
1044             SDL_GetAudioDriver => [ ["int"], "string" ],
1045             SDL_GetAudioStatus => [ [], "SDL_AudioStatus" ],
1046             SDL_GetCurrentAudioDriver => [ [], "string" ],
1047             SDL_GetNumAudioDevices => [ ["int"], "int" ],
1048             SDL_GetNumAudioDrivers => [ [], "int" ],
1049             SDL_GetQueuedAudioSize => [ ["SDL_AudioDeviceID"], "uint32" ],
1050              
1051             #SDL_LoadWAV_RW => [
1052             # ["SDL_RWops", "int", "SDL_AudioSpec", "uint8**", "uint32 *"],
1053             # "SDL_AudioSpec",
1054             # ],
1055             SDL_LockAudio => [ [] ],
1056             SDL_LockAudioDevice => [ ["SDL_AudioDeviceID"] ],
1057             SDL_MixAudio => [ [ "uint8 *", "uint8 *", "uint32", "int" ] ],
1058             SDL_MixAudioFormat => [ [ "uint8 *", "uint8 *", "SDL_AudioFormat", "uint32", "int" ] ],
1059             SDL_NewAudioStream => [
1060             [ "SDL_AudioFormat", "uint8", "int", "SDL_AudioFormat", "uint8", "int", ],
1061             "SDL_AudioStream",
1062             ],
1063             SDL_OpenAudio => [
1064             [ 'SDL_AudioSpec', 'SDL_AudioSpec' ],
1065             'int' => sub ( $inner, $desired, $obtained = () ) {
1066             deprecate <<'END';
1067             SDL_OpenAudio( ... ) remains for compatibility with SDL 1.2. The new, more
1068             powerful, and preferred way to do this is SDL_OpenAudioDevice( ... );
1069             END
1070             $inner->( $desired, $obtained );
1071             }
1072             ],
1073             SDL_OpenAudioDevice =>
1074             [ [ "string", "int", "SDL_AudioSpec", "SDL_AudioSpec", "int" ], "SDL_AudioDeviceID", ],
1075             SDL_PauseAudio => [ ["int"] ],
1076             SDL_PauseAudioDevice => [ [ "SDL_AudioDeviceID", "int" ] ],
1077             SDL_QueueAudio => [ [ "SDL_AudioDeviceID", "opaque*", "uint32" ], "int" ],
1078             SDL_UnlockAudio => [ [] ],
1079             SDL_UnlockAudioDevice => [ ["SDL_AudioDeviceID"] ],
1080             };
1081              
1082             # Everything below this line will be rewritten!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1083             #
1084             #https://github.com/libsdl-org/SDL/blob/main/include/SDL_surface.h#L327
1085             push @{ $EXPORT_TAGS{'surface'} }, 'SDL_LoadBMP';
1086             attach surface => { SDL_LoadBMP_RW => [ [ 'SDL_RWops', 'int' ], 'SDL_Surface' ], };
1087 0     0 0 0 sub SDL_LoadBMP ($file) { SDL_LoadBMP_RW( SDL_RWFromFile( $file, "rb" ), 1 ) }
  0         0  
  0         0  
  0         0  
1088             push @{ $EXPORT_TAGS{'surface'} }, 'SDL_FreeSurface';
1089             ffi->attach( SDL_FreeSurface => ['SDL_Surface'] );
1090             ffi->attach( SDL_SaveBMP_RW => [ 'SDL_Surface', 'SDL_RWops', 'int' ], 'int' );
1091             attach future => {
1092             SDL_ComposeCustomBlendMode => [
1093             [ 'SDL_BlendFactor', 'SDL_BlendFactor',
1094             'SDL_BlendOperation', 'SDL_BlendFactor',
1095             'SDL_BlendFactor', 'SDL_BlendOperation'
1096             ],
1097             'SDL_BlendMode'
1098             ],
1099             };
1100             ffi->attach( SDL_RWFromFile => [ 'string', 'string' ], 'SDL_RWops' );
1101              
1102 0     0 0 0 sub SDL_SaveBMP ( $surface, $file ) {
  0         0  
  0         0  
  0         0  
1103 0         0 SDL_SaveBMP_RW( $surface, SDL_RWFromFile( $file, 'wb' ), 1 );
1104             }
1105             ffi->attach( SDL_GetPlatform => [] => 'string' );
1106             ffi->attach( SDL_CreateRGBSurface =>
1107             [ 'uint32', 'int', 'int', 'int', 'uint32', 'uint32', 'uint32', 'uint32' ] =>
1108             'SDL_Surface' );
1109              
1110             # https://wiki.libsdl.org/CategoryCPU
1111             ffi->attach( SDL_GetCPUCacheLineSize => [] => 'int' );
1112             ffi->attach( SDL_GetCPUCount => [] => 'int' );
1113             ffi->attach( SDL_GetSystemRAM => [] => 'int' );
1114             ffi->attach( SDL_Has3DNow => [] => 'bool' );
1115             ffi->attach( SDL_HasAVX => [] => 'bool' );
1116             ffi->attach( SDL_HasAVX2 => [] => 'bool' );
1117             ffi->attach( SDL_HasAltiVec => [] => 'bool' );
1118             ffi->attach( SDL_HasMMX => [] => 'bool' );
1119             ffi->attach( SDL_HasRDTSC => [] => 'bool' );
1120             ffi->attach( SDL_HasSSE => [] => 'bool' );
1121             ffi->attach( SDL_HasSSE2 => [] => 'bool' );
1122             ffi->attach( SDL_HasSSE3 => [] => 'bool' );
1123             ffi->attach( SDL_HasSSE41 => [] => 'bool' );
1124             ffi->attach( SDL_HasSSE42 => [] => 'bool' );
1125              
1126             # https://wiki.libsdl.org/CategoryPower
1127             FFI::C->enum(
1128             'SDL_PowerState',
1129             [ qw[
1130             SDL_POWERSTATE_UNKNOWN
1131             SDL_POWERSTATE_ON_BATTERY SDL_POWERSTATE_NO_BATTERY
1132             SDL_POWERSTATE_CHARGING SDL_POWERSTATE_CHARGED]
1133             ]
1134             );
1135             ffi->attach( SDL_GetPowerInfo => [ 'int*', 'int*' ] => 'int' );
1136              
1137             # https://wiki.libsdl.org/CategoryStandard
1138             ffi->attach( SDL_acos => ['double'] => 'double' );
1139             ffi->attach( SDL_asin => ['double'] => 'double' ); # Not in wiki
1140              
1141             # https://wiki.libsdl.org/CategoryVideo
1142             # Macros defined in SDL_video.h
1143 0         0 define video => [
1144             [ SDL_WINDOWPOS_UNDEFINED_MASK => 0x1FFF0000 ],
1145             [ SDL_WINDOWPOS_UNDEFINED_DISPLAY =>
1146 0     0   0 sub ($X) { ( SDL_WINDOWPOS_UNDEFINED_MASK() | ($X) ) }
  0         0  
  0         0  
1147 0     0   0 ],
1148 0         0 [ SDL_WINDOWPOS_UNDEFINED => sub () { SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) } ],
  0         0  
  0         0  
1149             [ SDL_WINDOWPOS_ISUNDEFINED =>
1150 0     0   0 sub ($X) { ( ( ($X) & 0xFFFF0000 ) == SDL_WINDOWPOS_UNDEFINED_MASK() ) }
  0         0  
  0         0  
1151 0     0   0 ],
1152             #
1153 0         0 [ SDL_WINDOWPOS_CENTERED_MASK => sub () {0x2FFF0000} ],
  0         0  
  0         0  
1154 0     0   0 [ SDL_WINDOWPOS_CENTERED_DISPLAY => sub ($X) { ( SDL_WINDOWPOS_CENTERED_MASK() | ($X) ) } ],
  0         0  
  0         0  
  0         0  
1155 0         0 [ SDL_WINDOWPOS_CENTERED => sub() { SDL_WINDOWPOS_CENTERED_DISPLAY(0) } ],
  0         0  
  0         0  
1156             [ SDL_WINDOWPOS_ISCENTERED =>
1157 0     0   0 sub ($X) { ( ( ($X) & 0xFFFF0000 ) == SDL_WINDOWPOS_CENTERED_MASK() ) }
  0         0  
  0         0  
1158             ],
1159             ];
1160              
1161             # https://wiki.libsdl.org/CategoryPixels
1162             package SDL2::Color {
1163 2     2   2347 use SDL2::Utils;
  2         4  
  2         7  
1164             has r => 'uint8', g => 'uint8', b => 'uint8', a => 'uint8';
1165             };
1166              
1167             package SDL2::Palette {
1168 2     2   877 use SDL2::Utils;
  2         4  
  2         8  
1169             has
1170             ncolors => 'int',
1171             colors => 'SDL_Color';
1172             };
1173              
1174             package SDL2::PixelFormat {
1175 2     2   877 use SDL2::Utils;
  2         4  
  2         7  
1176             has
1177             format => 'uint32',
1178             palette => 'SDL_Palette',
1179             BitsPerPixel => 'uint8',
1180             BytesPerPixel => 'uint8',
1181             padding => 'uint32[2]',
1182             Rmask => 'uint32',
1183             Gmask => 'uint32',
1184             Bmask => 'uint32',
1185             Amask => 'uint32',
1186             Rloss => 'uint8',
1187             Gloss => 'uint8',
1188             Bloss => 'uint8',
1189             Aloss => 'uint8',
1190             Rshift => 'uint8',
1191             Gshift => 'uint8',
1192             Bshift => 'uint8',
1193             Ashift => 'uint8',
1194             refcount => 'int',
1195             next => 'opaque' # SDL_PixelFormat *
1196             };
1197             attach future => {
1198             SDL_FillRect => [ [ 'SDL_Surface', 'opaque', 'uint32' ], 'int' ],
1199             SDL_MapRGB => [
1200             [ 'SDL_PixelFormat', 'uint8', 'uint8', 'uint8' ] => 'uint32' =>
1201             sub ( $inner, $format, $r, $g, $b ) {
1202             $format = ffi->cast( 'opaque', 'SDL_PixelFormat', $format ) if !ref $format;
1203             $inner->( $format, $r, $g, $b );
1204             }
1205             ]
1206             };
1207              
1208             # https://wiki.libsdl.org/CategoryEvents
1209 0     0   0 define events => [
1210             [ SDL_RELEASED => 0 ], [ SDL_PRESSED => 1 ],
1211              
1212             # SDL_EventType
1213             [ SDL_FIRSTEVENT => 0 ], # /**< Unused (do not remove) */
1214              
1215             #
1216             [ SDL_QUIT => 0x100 ], # /**< User-requested quit */
1217 0     0   0 [ SDL_APP_TERMINATING => sub () { SDL_QUIT() + 1 } ],
  0         0  
  0         0  
1218 0     0   0 [ SDL_APP_LOWMEMORY => sub () { SDL_QUIT() + 2 } ],
  0         0  
  0         0  
1219 0     0   0 [ SDL_APP_WILLENTERBACKGROUND => sub () { SDL_QUIT() + 3 } ],
  0         0  
  0         0  
1220 0     0   0 [ SDL_APP_DIDENTERBACKGROUND => sub () { SDL_QUIT() + 4 } ],
  0         0  
  0         0  
1221 0     0   0 [ SDL_APP_WILLENTERFOREGROUND => sub () { SDL_QUIT() + 5 } ],
  0         0  
  0         0  
1222 0     0   0 [ SDL_APP_DIDENTERFOREGROUND => sub () { SDL_QUIT() + 6 } ],
  0         0  
  0         0  
1223             #
1224             [ SDL_DISPLAYEVENT => 0x150 ],
1225             #
1226 0     0   0 [ SDL_WINDOWEVENT => 0x200 ], [ SDL_SYSWMEVENT => sub () { SDL_WINDOWEVENT() + 1 } ],
  0         0  
  0         0  
1227             #
1228 0     0   0 [ SDL_KEYDOWN => 0x300 ], [ SDL_KEYUP => sub () { SDL_KEYDOWN() + 1 } ],
  0         0  
  0         0  
1229 0     0   0 [ SDL_TEXTEDITING => sub () { SDL_KEYDOWN() + 2 } ],
  0         0  
  0         0  
1230 0     0   0 [ SDL_TEXTINPUT => sub () { SDL_KEYDOWN() + 3 } ],
  0         0  
  0         0  
1231 0     0   0 [ SDL_KEYMAPCHANGED => sub () { SDL_KEYDOWN() + 4 } ],
  0         0  
  0         0  
1232             #
1233 0     0   0 [ SDL_MOUSEMOTION => 0x400 ], [ SDL_MOUSEBUTTONDOWN => sub () { SDL_MOUSEMOTION() + 1 } ],
  0         0  
  0         0  
1234 0     0   0 [ SDL_MOUSEBUTTONUP => sub () { SDL_MOUSEMOTION() + 2 } ],
  0         0  
  0         0  
1235 0     0   0 [ SDL_MOUSEWHEEL => sub () { SDL_MOUSEMOTION() + 3 } ],
  0         0  
  0         0  
1236             #
1237             [ SDL_JOYAXISMOTION => 0x600 ],
1238 0     0   0 [ SDL_JOYBALLMOTION => sub () { SDL_JOYAXISMOTION() + 1 } ],
  0         0  
  0         0  
1239 0     0   0 [ SDL_JOYHATMOTION => sub () { SDL_JOYAXISMOTION() + 2 } ],
  0         0  
  0         0  
1240 0     0   0 [ SDL_JOYBUTTONDOWN => sub () { SDL_JOYAXISMOTION() + 3 } ],
  0         0  
  0         0  
1241 0     0   0 [ SDL_JOYBUTTONUP => sub () { SDL_JOYAXISMOTION() + 4 } ],
  0         0  
  0         0  
1242 0     0   0 [ SDL_JOYDEVICEADDED => sub () { SDL_JOYAXISMOTION() + 5 } ],
  0         0  
  0         0  
1243 0     0   0 [ SDL_JOYDEVICEREMOVED => sub () { SDL_JOYAXISMOTION() + 6 } ],
  0         0  
  0         0  
1244             #
1245             [ SDL_CONTROLLERAXISMOTION => 0x650 ],
1246 0     0   0 [ SDL_CONTROLLERBUTTONDOWN => sub () { SDL_CONTROLLERAXISMOTION() + 1 } ],
  0         0  
  0         0  
1247 0     0   0 [ SDL_CONTROLLERBUTTONUP => sub () { SDL_CONTROLLERAXISMOTION() + 2 } ],
  0         0  
  0         0  
1248 0     0   0 [ SDL_CONTROLLERDEVICEADDED => sub () { SDL_CONTROLLERAXISMOTION() + 3 } ],
  0         0  
  0         0  
1249 0     0   0 [ SDL_CONTROLLERDEVICEREMOVED => sub () { SDL_CONTROLLERAXISMOTION() + 4 } ],
  0         0  
  0         0  
1250 0     0   0 [ SDL_CONTROLLERDEVICEREMAPPED => sub () { SDL_CONTROLLERAXISMOTION() + 5 } ],
  0         0  
  0         0  
1251             #
1252 0     0   0 [ SDL_FINGERDOWN => 0x700 ], [ SDL_FINGERUP => sub () { SDL_FINGERDOWN() + 1 } ],
  0         0  
  0         0  
1253 0     0   0 [ SDL_FINGERMOTION => sub () { SDL_FINGERDOWN() + 2 } ],
  0         0  
  0         0  
1254             #
1255 0     0   0 [ SDL_DOLLARGESTURE => 0x800 ], [ SDL_DOLLARRECORD => sub () { SDL_DOLLARGESTURE() + 1 } ],
  0         0  
  0         0  
1256 0     0   0 [ SDL_MULTIGESTURE => sub () { SDL_DOLLARGESTURE() + 2 } ],
  0         0  
  0         0  
1257             #
1258             [ SDL_CLIPBOARDUPDATE => 0x900 ],
1259             #
1260 0     0   0 [ SDL_DROPFILE => 0x1000 ], [ SDL_DROPTEXT => sub () { SDL_DROPFILE() + 1 } ],
  0         0  
  0         0  
1261 0     0   0 [ SDL_DROPBEGIN => sub () { SDL_DROPFILE() + 2 } ],
  0         0  
  0         0  
1262 0     0   0 [ SDL_DROPCOMPLETE => sub () { SDL_DROPFILE() + 3 } ],
  0         0  
  0         0  
1263             #
1264             [ SDL_AUDIODEVICEADDED => 0x1100 ],
1265 0     0   0 [ SDL_AUDIODEVICEREMOVED => sub () { SDL_AUDIODEVICEADDED() + 1 } ],
  0         0  
  0         0  
1266             #
1267             [ SDL_SENSORUPDATE => 0x1200 ],
1268             #
1269             [ SDL_RENDER_TARGETS_RESET => 0x2000 ],
1270 0         0 [ SDL_RENDER_DEVICE_RESET => sub () { SDL_RENDER_TARGETS_RESET() + 1 } ],
  0         0  
1271             #
1272             [ SDL_USEREVENT => 0x8000 ],
1273             #
1274             [ SDL_LASTEVENT => 0xFFFF ],
1275             ];
1276             #
1277             package SDL2::CommonEvent {
1278 2     2   2480 use SDL2::Utils;
  2         4  
  2         7  
1279             has
1280             type => 'uint32',
1281             timestamp => 'uint32';
1282             };
1283              
1284             package SDL2::DisplayEvent {
1285 2     2   890 use SDL2::Utils;
  2         20  
  2         10  
1286             has
1287             type => 'uint32',
1288             timestamp => 'uint32',
1289             display => 'uint32',
1290             event => 'uint8',
1291             padding1 => 'uint8',
1292             padding2 => 'uint8',
1293             padding3 => 'uint8',
1294             data1 => 'sint32';
1295             };
1296              
1297             package SDL2::WindowEvent {
1298 2     2   874 use SDL2::Utils;
  2         11  
  2         17  
1299             has
1300             type => 'uint32',
1301             timestamp => 'uint32',
1302             windowId => 'uint32',
1303             event => 'uint8',
1304             padding1 => 'uint8',
1305             padding2 => 'uint8',
1306             padding3 => 'uint8',
1307             data1 => 'sint32',
1308             data2 => 'sint32';
1309             };
1310              
1311             package SDL2::KeyboardEvent {
1312 2     2   944 use SDL2::Utils;
  2         27  
  2         11  
1313             has
1314             type => 'uint32',
1315             timestamp => 'uint32',
1316             windowId => 'uint32',
1317             state => 'uint8',
1318             repeat => 'uint8',
1319             padding2 => 'uint8',
1320             padding3 => 'uint8',
1321             keysym => 'opaque' # SDL_Keysym
1322             };
1323              
1324             package SDL2::TextEditingEvent {
1325 2     2   861 use SDL2::Utils;
  2         3  
  2         8  
1326             has
1327             type => 'uint32',
1328             timestamp => 'uint32',
1329             windowId => 'uint32',
1330             text => 'char[32]',
1331             start => 'sint32',
1332             length => 'sint32';
1333             };
1334              
1335             package SDL2::TextInputEvent {
1336 2     2   822 use SDL2::Utils;
  2         3  
  2         8  
1337             has
1338             type => 'uint32',
1339             timestamp => 'uint32',
1340             windowId => 'uint32',
1341             text => 'char[32]';
1342             };
1343              
1344             package SDL2::MouseMotionEvent {
1345 2     2   831 use SDL2::Utils;
  2         3  
  2         8  
1346             has
1347             type => 'uint32',
1348             timestamp => 'uint32',
1349             windowId => 'uint32',
1350             which => 'uint32',
1351             state => 'uint8',
1352             x => 'sint32',
1353             y => 'sint32',
1354             xrel => 'sint32',
1355             yrel => 'sint32';
1356             };
1357              
1358             package SDL2::MouseButtonEvent {
1359 2     2   837 use SDL2::Utils;
  2         3  
  2         7  
1360             has
1361             type => 'uint32',
1362             timestamp => 'uint32',
1363             windowID => 'uint32',
1364             which => 'uint32',
1365             button => 'uint8',
1366             state => 'uint8',
1367             clicks => 'uint8',
1368             padding1 => 'uint8',
1369             x => 'sint32',
1370             y => 'sint32';
1371             };
1372              
1373             package SDL2::MouseWheelEvent {
1374 2     2   907 use SDL2::Utils;
  2         2  
  2         7  
1375             has
1376             type => 'uint32',
1377             timestamp => 'uint32',
1378             windowId => 'uint32',
1379             which => 'uint8',
1380             x => 'sint32',
1381             y => 'sint32',
1382             direction => 'uint32';
1383             };
1384              
1385             package SDL2::JoyAxisEvent {
1386 2     2   879 use SDL2::Utils;
  2         3  
  2         8  
1387             has
1388             type => 'uint32',
1389             timestamp => 'uint32',
1390             which => 'opaque', # SDL_JoystickID
1391             padding1 => 'uint8',
1392             padding2 => 'uint8',
1393             padding3 => 'uint8',
1394             value => 'sint16',
1395             padding4 => 'uint16';
1396             };
1397              
1398             package SDL2::JoyBallEvent {
1399 2     2   887 use SDL2::Utils;
  2         4  
  2         6  
1400             has
1401             type => 'uint32',
1402             timestamp => 'uint32',
1403             which => 'opaque', # SDL_JoystickID
1404             padding1 => 'uint8',
1405             padding2 => 'uint8',
1406             padding3 => 'uint8',
1407             xrel => 'sint16',
1408             yrel => 'uint16',
1409             ;
1410             };
1411              
1412             package SDL2::JoyHatEvent {
1413 2     2   871 use SDL2::Utils;
  2         3  
  2         8  
1414             has
1415             type => 'uint32',
1416             timestamp => 'uint32',
1417             which => 'opaque', # SDL_JoystickID
1418             hat => 'uint8',
1419             value => 'uint8',
1420             padding1 => 'uint8',
1421             padding2 => 'uint8';
1422             };
1423              
1424             package SDL2::JoyButtonEvent {
1425 2     2   934 use SDL2::Utils;
  2         3  
  2         7  
1426             has
1427             type => 'uint32',
1428             timestamp => 'uint32',
1429             which => 'opaque', # SDL_JoystickID
1430             button => 'uint8',
1431             state => 'uint8',
1432             padding1 => 'uint8',
1433             padding2 => 'uint8';
1434             };
1435              
1436             package SDL2::JoyDeviceEvent {
1437 2     2   855 use SDL2::Utils;
  2         2  
  2         8  
1438             has
1439             type => 'uint32',
1440             timestamp => 'uint32',
1441             which => 'sint32';
1442             };
1443              
1444             package SDL2::ControllerAxisEvent {
1445 2     2   856 use SDL2::Utils;
  2         2  
  2         7  
1446             has
1447             type => 'uint32',
1448             timestamp => 'uint32',
1449             which => 'opaque', # SDL_JoystickID
1450             axis => 'uint8',
1451             padding1 => 'uint8',
1452             padding2 => 'uint8',
1453             padding3 => 'uint8',
1454             value => 'sint16',
1455             padding4 => 'uint8';
1456             };
1457              
1458             package SDL2::ControllerButtonEvent {
1459 2     2   870 use SDL2::Utils;
  2         3  
  2         7  
1460             has
1461             type => 'uint32',
1462             timestamp => 'uint32',
1463             which => 'opaque', # SDL_JoystickID
1464             button => 'uint8',
1465             state => 'uint8',
1466             padding1 => 'uint8',
1467             padding2 => 'uint8',
1468             ;
1469             };
1470              
1471             package SDL2::ControllerDeviceEvent {
1472 2     2   854 use SDL2::Utils;
  2         3  
  2         7  
1473             has
1474             type => 'uint32',
1475             timestamp => 'uint32',
1476             which => 'sint32';
1477             };
1478              
1479             package SDL2::AudioDeviceEvent {
1480 2     2   844 use SDL2::Utils;
  2         3  
  2         6  
1481             has
1482             type => 'uint32',
1483             timestamp => 'uint32',
1484             which => 'uint32',
1485             iscapture => 'uint8',
1486             padding1 => 'uint8',
1487             padding2 => 'uint8',
1488             padding3 => 'uint8';
1489             };
1490              
1491             package SDL2::TouchFingerEvent {
1492 2     2   906 use SDL2::Utils;
  2         3  
  2         18  
1493             has
1494             type => 'uint32',
1495             timestamp => 'uint32',
1496             touchId => 'opaque', # SDL_TouchID
1497             fingerId => 'opaque', # SDL_FingerID
1498             x => 'float',
1499             y => 'float',
1500             dx => 'float',
1501             dy => 'float',
1502             pressure => 'float';
1503             };
1504              
1505             package SDL2::MultiGestureEvent {
1506 2     2   870 use SDL2::Utils;
  2         2  
  2         8  
1507             has
1508             type => 'uint32',
1509             timestamp => 'uint32',
1510             touchId => 'opaque', # SDL_TouchID
1511             dTheta => 'float',
1512             dDist => 'float',
1513             x => 'float',
1514             y => 'float',
1515             numFingers => 'uint16',
1516             padding => 'uint16';
1517             };
1518              
1519             package SDL2::DollarGestureEvent {
1520 2     2   868 use SDL2::Utils;
  2         4  
  2         6  
1521             has
1522             type => 'uint32',
1523             timestamp => 'uint32',
1524             touchId => 'opaque', # SDL_TouchID
1525             gestureId => 'opaque', # SDL_GestureID
1526             numFingers => 'uint32',
1527             error => 'float',
1528             x => 'float',
1529             y => 'float';
1530             };
1531              
1532             package SDL2::DropEvent {
1533 2     2   955 use SDL2::Utils;
  2         3  
  2         7  
1534             has
1535             type => 'uint32',
1536             timestamp => 'uint32',
1537             file => 'char[256]',
1538             windowID => 'uint32';
1539             };
1540              
1541             package SDL2::SensorEvent {
1542 2     2   840 use SDL2::Utils;
  2         3  
  2         6  
1543             has
1544             type => 'uint32',
1545             timestamp => 'uint32',
1546             which => 'sint32',
1547             data => 'float[6]';
1548             };
1549              
1550             package SDL2::QuitEvent {
1551 2     2   829 use SDL2::Utils;
  2         3  
  2         6  
1552             has type => 'uint32', timestamp => 'uint32';
1553             };
1554              
1555             package SDL2::OSEvent {
1556 2     2   868 use SDL2::Utils;
  2         2  
  2         6  
1557             has
1558             type => 'uint32',
1559             timestamp => 'uint32';
1560             };
1561              
1562             package SDL2::UserEvent {
1563 2     2   849 use SDL2::Utils;
  2         3  
  2         14  
1564             has
1565             type => 'uint32',
1566             timestamp => 'uint32',
1567             windowID => 'uint32',
1568             code => 'sint32',
1569             data1 => 'opaque', # void *
1570             data2 => 'opaque' # void *
1571             };
1572              
1573             package SDL2::SysWMmsg {
1574 2     2   826 use SDL2::Utils;
  2         3  
  2         6  
1575             has();
1576             };
1577              
1578             package SDL2::SysWMEvent {
1579 2     2   808 use SDL2::Utils;
  2         4  
  2         6  
1580             has
1581             type => 'uint32',
1582             timestamp => 'uint32',
1583             msg => 'opaque' # SDL_SysWMmsg
1584             };
1585 2     2   2024 use FFI::C::UnionDef;
  2         1789  
  2         68  
1586              
1587 2     2   11 package SDL2::Event { use SDL2::Utils; };
  2         3  
  2         10  
1588             FFI::C::UnionDef->new( ffi,
1589             name => 'SDL_Event',
1590             class => 'SDL2::Event',
1591             members => [
1592             type => 'uint32',
1593             common => 'SDL_CommonEvent',
1594             display => 'SDL_DisplayEvent',
1595             window => 'SDL_WindowEvent',
1596             key => 'SDL_KeyboardEvent',
1597             edit => 'SDL_TextEditingEvent',
1598             text => 'SDL_TextInputEvent',
1599             motion => 'SDL_MouseMotionEvent',
1600             button => 'SDL_MouseButtonEvent',
1601             wheel => 'SDL_MouseWheelEvent',
1602             jaxis => 'SDL_JoyAxisEvent',
1603             jball => 'SDL_JoyBallEvent',
1604             jhat => 'SDL_JoyHatEvent',
1605             jbutton => 'SDL_JoyButtonEvent',
1606             jdevice => 'SDL_JoyDeviceEvent',
1607             caxis => 'SDL_ControllerAxisEvent',
1608             cbutton => 'SDL_ControllerButtonEvent',
1609             cdevice => 'SDL_ControllerDeviceEvent',
1610             adevice => 'SDL_AudioDeviceEvent',
1611             sensor => 'SDL_SensorEvent',
1612             quit => 'SDL_QuitEvent',
1613             user => 'SDL_UserEvent',
1614             syswm => 'SDL_SysWMEvent',
1615             tfinger => 'SDL_TouchFingerEvent',
1616             mgesture => 'SDL_MultiGestureEvent',
1617             dgesture => 'SDL_DollarGestureEvent',
1618             drop => 'SDL_DropEvent',
1619             padding => 'uint8[56]'
1620             ]
1621             );
1622             enum SDL_EventAction => [
1623             qw[
1624             SDL_ADDEVENT
1625             SDL_PEEKEVENT
1626             SDL_GETEVENT]
1627             ];
1628             ffi->type( '(opaque, opaque)->int' => 'SDL_EventFilter' );
1629             attach events => {
1630             SDL_PeepEvents =>
1631             [ [ 'SDL_Event', 'int', 'SDL_EventAction', 'uint32', 'uint32' ] => 'int' ],
1632             SDL_HasEvent => [ ['uint32'] => 'bool' ],
1633             SDL_HasEvents => [ [ 'uint32', 'uint32' ] => 'bool' ],
1634             SDL_FlushEvent => [ ['uint32'] ],
1635             SDL_FlushEvents => [ [ 'uint32', 'uint32' ] ],
1636             SDL_PollEvent => [ ['SDL_Event'] => 'int' ],
1637             SDL_WaitEvent => [ ['SDL_Event'] => 'int' ],
1638             SDL_WaitEventTimeout => [ [ 'SDL_Event', 'int' ] => 'int' ],
1639             SDL_PushEvent => [ ['SDL_Event'] => 'int' ],
1640             SDL_SetEventFilter => [ [ 'SDL_EventFilter', 'opaque' ] ],
1641             SDL_GetEventFilter => [ [ 'SDL_EventFilter', 'opaque' ] => 'bool' ],
1642             SDL_AddEventWatch => [ [ 'SDL_EventFilter', 'opaque' ] ],
1643             SDL_DelEventWatch => [ [ 'SDL_EventFilter', 'opaque' ] ],
1644             SDL_FilterEvents => [ [ 'SDL_EventFilter', 'opaque' ] ]
1645             };
1646             #
1647 0     0 0 0 sub SDL_QUERY () {-1}
  0         0  
  0         0  
1648 0     0 0 0 sub SDL_IGNORE () {0}
  0         0  
  0         0  
1649 0     0 0 0 sub SDL_DISABLE () {0}
  0         0  
  0         0  
1650 0     0 0 0 sub SDL_ENABLE () {1}
  0         0  
  0         0  
1651             #
1652             ffi->attach( SDL_EventState => [ 'uint32', 'int' ] => 'uint8' );
1653 0     0 0 0 sub SDL_GetEventState ($type) { SDL_EventState( $type, SDL_QUERY ) }
  0         0  
  0         0  
  0         0  
1654             ffi->attach( SDL_RegisterEvents => ['int'] => 'uint32' );
1655              
1656             # From src/events/SDL_mouse_c.h
1657             package SDL2::Cursor {
1658 2     2   1415 use SDL2::Utils;
  2         3  
  2         8  
1659             has
1660             next => 'opaque', # SDL_Cursor
1661             driverdata => 'opaque' # void
1662             };
1663              
1664             # From SDL_mouse.h
1665             enum SDL_SystemCursor => [
1666             qw[
1667             SDL_SYSTEM_CURSOR_ARROW
1668             SDL_SYSTEM_CURSOR_IBEAM
1669             SDL_SYSTEM_CURSOR_WAIT
1670             SDL_SYSTEM_CURSOR_CROSSHAIR
1671             SDL_SYSTEM_CURSOR_WAITARROW
1672             SDL_SYSTEM_CURSOR_SIZENWSE
1673             SDL_SYSTEM_CURSOR_SIZENESW
1674             SDL_SYSTEM_CURSOR_SIZEWE
1675             SDL_SYSTEM_CURSOR_SIZENS
1676             SDL_SYSTEM_CURSOR_SIZEALL
1677             SDL_SYSTEM_CURSOR_NO
1678             SDL_SYSTEM_CURSOR_HAND
1679             SDL_NUM_SYSTEM_CURSORS]
1680             ],
1681             SDL_MouseWheelDirection => [
1682             qw[
1683             SDL_MOUSEWHEEL_NORMAL
1684             SDL_MOUSEWHEEL_FLIPPED
1685             ]
1686             ];
1687             ffi->attach( SDL_GetMouseFocus => [] => 'SDL_Window' );
1688             ffi->attach( SDL_GetMouseState => [ 'int', 'int' ] => 'uint32' );
1689             ffi->attach( SDL_GetGlobalMouseState => [ 'int', 'int' ] => 'uint32' );
1690             ffi->attach( SDL_GetRelativeMouseState => [ 'int', 'int' ] => 'uint32' );
1691             ffi->attach( SDL_WarpMouseInWindow => [ 'SDL_Window', 'int', 'int' ] );
1692             ffi->attach( SDL_SetRelativeMouseMode => ['bool'] => 'int' );
1693             ffi->attach( SDL_CaptureMouse => ['bool'] => 'int' );
1694             ffi->attach( SDL_GetRelativeMouseMode => [] => 'bool' );
1695             ffi->attach(
1696             SDL_CreateCursor => [ 'uint8', 'uint8', 'int', 'int', 'int', 'int' ] => 'SDL_Cursor' );
1697             ffi->attach( SDL_CreateSystemCursor => ['SDL_SystemCursor'] => 'SDL_Cursor' );
1698             ffi->attach( SDL_SetCursor => ['SDL_Cursor'] );
1699             ffi->attach( SDL_GetCursor => [] => 'SDL_Cursor' );
1700             ffi->attach( SDL_GetDefaultCursor => [] => 'SDL_Cursor' );
1701             ffi->attach( SDL_FreeCursor => [] => 'SDL_Cursor' );
1702             ffi->attach( SDL_ShowCursor => ['int'] => 'int' );
1703              
1704             # https://wiki.libsdl.org/CategoryPixels
1705 0     0 1 0 sub SDL_ALPHA_OPAQUE() {255}
  0         0  
  0         0  
1706 0     0 0 0 sub SDL_ALPHA_TRANSPARENT() {0}
  0         0  
  0         0  
1707             FFI::C->enum(
1708             pixel_type => [
1709             qw[
1710             SDL_PIXELTYPE_UNKNOWN
1711             SDL_PIXELTYPE_INDEX1
1712             SDL_PIXELTYPE_INDEX4
1713             SDL_PIXELTYPE_INDEX8
1714             SDL_PIXELTYPE_PACKED8
1715             SDL_PIXELTYPE_PACKED16
1716             SDL_PIXELTYPE_PACKED32
1717             SDL_PIXELTYPE_ARRAYU8
1718             SDL_PIXELTYPE_ARRAYU16
1719             SDL_PIXELTYPE_ARRAYU32
1720             SDL_PIXELTYPE_ARRAYF16
1721             SDL_PIXELTYPE_ARRAYF32
1722             ]
1723             ]
1724             );
1725             FFI::C->enum(
1726             bitmap_order => [
1727             qw[
1728             SDL_BITMAPORDER_NONE
1729             SDL_BITMAPORDER_4321
1730             SDL_BITMAPORDER_1234
1731             ]
1732             ]
1733             );
1734             FFI::C->enum(
1735             packed_order => [
1736             qw[
1737             SDL_PACKEDORDER_NONE
1738             SDL_PACKEDORDER_XRGB
1739             SDL_PACKEDORDER_RGBX
1740             SDL_PACKEDORDER_ARGB
1741             SDL_PACKEDORDER_RGBA
1742             SDL_PACKEDORDER_XBGR
1743             SDL_PACKEDORDER_BGRX
1744             SDL_PACKEDORDER_ABGR
1745             SDL_PACKEDORDER_BGRA
1746             ]
1747             ]
1748             );
1749             FFI::C->enum(
1750             array_order => [
1751             qw[
1752             SDL_ARRAYORDER_NONE
1753             SDL_ARRAYORDER_RGB
1754             SDL_ARRAYORDER_RGBA
1755             SDL_ARRAYORDER_ARGB
1756             SDL_ARRAYORDER_BGR
1757             SDL_ARRAYORDER_BGRA
1758             SDL_ARRAYORDER_ABGR
1759             ]
1760             ]
1761             );
1762             FFI::C->enum(
1763             packed_layout => [
1764             qw[
1765             SDL_PACKEDLAYOUT_NONE
1766             SDL_PACKEDLAYOUT_332
1767             SDL_PACKEDLAYOUT_4444
1768             SDL_PACKEDLAYOUT_1555
1769             SDL_PACKEDLAYOUT_5551
1770             SDL_PACKEDLAYOUT_565
1771             SDL_PACKEDLAYOUT_8888
1772             SDL_PACKEDLAYOUT_2101010
1773             SDL_PACKEDLAYOUT_1010102
1774             ]
1775             ]
1776             );
1777 0     0 0 0 sub SDL_DEFINE_PIXELFOURCC ( $A, $B, $C, $D ) { SDL_FOURCC( $A, $B, $C, $D ) }
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
1778              
1779 0     0 0 0 sub SDL_DEFINE_PIXELFORMAT ( $type, $order, $layout, $bits, $bytes ) {
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
1780 0         0 ( ( 1 << 28 ) | ( ($type) << 24 ) | ( ($order) << 20 ) | ( ($layout) << 16 )
1781             | ( ($bits) << 8 ) | ( ($bytes) << 0 ) )
1782             }
1783 0     0 0 0 sub SDL_PIXELFLAG ($X) { ( ( ($X) >> 28 ) & 0x0F ) }
  0         0  
  0         0  
  0         0  
1784 0     0 0 0 sub SDL_PIXELTYPE ($X) { ( ( ($X) >> 24 ) & 0x0F ) }
  0         0  
  0         0  
  0         0  
1785 0     0 0 0 sub SDL_PIXELORDER ($X) { ( ( ($X) >> 20 ) & 0x0F ) }
  0         0  
  0         0  
  0         0  
1786 0     0 0 0 sub SDL_PIXELLAYOUT ($X) { ( ( ($X) >> 16 ) & 0x0F ) }
  0         0  
  0         0  
  0         0  
1787 0     0 0 0 sub SDL_BITSPERPIXEL ($X) { ( ( ($X) >> 8 ) & 0xFF ) }
  0         0  
  0         0  
  0         0  
1788              
1789 0     0 0 0 sub SDL_BYTESPERPIXEL ($X) {
  0         0  
  0         0  
1790             (
1791 0 0 0     0 SDL_ISPIXELFORMAT_FOURCC($X) ? (
    0          
1792             (
1793             ( ($X) == SDL_PIXELFORMAT_YUY2() ) ||
1794             ( ($X) == SDL_PIXELFORMAT_UYVY() ) ||
1795             ( ($X) == SDL_PIXELFORMAT_YVYU() )
1796             ) ? 2 : 1
1797             ) :
1798             ( ( ($X) >> 0 ) & 0xFF )
1799             )
1800             }
1801              
1802 0     0 0 0 sub SDL_ISPIXELFORMAT_INDEXED ($format) {
  0         0  
  0         0  
1803             (
1804 0 0 0     0 !SDL_ISPIXELFORMAT_FOURCC($format) &&
      0        
1805             ( ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_INDEX1() ) ||
1806             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_INDEX4() ) ||
1807             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_INDEX8() ) )
1808             )
1809             }
1810              
1811 0     0 0 0 sub SDL_ISPIXELFORMAT_PACKED ($format) {
  0         0  
  0         0  
1812             (
1813 0 0 0     0 !SDL_ISPIXELFORMAT_FOURCC($format) &&
      0        
1814             ( ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_PACKED8() ) ||
1815             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_PACKED16() ) ||
1816             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_PACKED32() ) )
1817             )
1818             }
1819              
1820 0     0 0 0 sub SDL_ISPIXELFORMAT_ARRAY ($format) {
  0         0  
  0         0  
1821             (
1822 0 0 0     0 !SDL_ISPIXELFORMAT_FOURCC($format) &&
      0        
      0        
      0        
1823             ( ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_ARRAYU8() ) ||
1824             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_ARRAYU16() ) ||
1825             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_ARRAYU32() ) ||
1826             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_ARRAYF16() ) ||
1827             ( SDL_PIXELTYPE($format) == SDL_PIXELTYPE_ARRAYF32() ) )
1828             )
1829             }
1830              
1831 0     0 0 0 sub SDL_ISPIXELFORMAT_ALPHA ($format) {
  0         0  
  0         0  
1832             (
1833             (
1834 0 0 0     0 SDL_ISPIXELFORMAT_PACKED($format) &&
      0        
      0        
      0        
1835             ( ( SDL_PIXELORDER($format) == SDL_PACKEDORDER_ARGB() ) ||
1836             ( SDL_PIXELORDER($format) == SDL_PACKEDORDER_RGBA() ) ||
1837             ( SDL_PIXELORDER($format) == SDL_PACKEDORDER_ABGR() ) ||
1838             ( SDL_PIXELORDER($format) == SDL_PACKEDORDER_BGRA() ) )
1839             ) ||
1840             (
1841             SDL_ISPIXELFORMAT_ARRAY($format) &&
1842             ( ( SDL_PIXELORDER($format) == SDL_ARRAYORDER_ARGB() ) ||
1843             ( SDL_PIXELORDER($format) == SDL_ARRAYORDER_RGBA() ) ||
1844             ( SDL_PIXELORDER($format) == SDL_ARRAYORDER_ABGR() ) ||
1845             ( SDL_PIXELORDER($format) == SDL_ARRAYORDER_BGRA() ) )
1846             )
1847             )
1848             }
1849              
1850             #/* The flag is set to 1 because 0x1? is not in the printable ASCII range */
1851 0 0   0 0 0 sub SDL_ISPIXELFORMAT_FOURCC ($format) { ( ($format) && ( SDL_PIXELFLAG($format) != 1 ) ) }
  0         0  
  0         0  
  0         0  
1852 0     0 0 0 sub SDL_PIXELFORMAT_UNKNOWN () {0}
  0         0  
  0         0  
1853              
1854 0     0 0 0 sub SDL_PIXELFORMAT_INDEX1LSB () {
  0         0  
1855 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_INDEX1(), SDL_BITMAPORDER_4321(), 0, 1, 0 );
1856             }
1857              
1858 0     0 0 0 sub SDL_PIXELFORMAT_INDEX1MSB () {
  0         0  
1859 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_INDEX1(), SDL_BITMAPORDER_1234(), 0, 1, 0 );
1860             }
1861              
1862 0     0 0 0 sub SDL_PIXELFORMAT_INDEX4LSB () {
  0         0  
1863 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_INDEX4(), SDL_BITMAPORDER_4321(), 0, 4, 0 );
1864             }
1865              
1866 0     0 0 0 sub SDL_PIXELFORMAT_INDEX4MSB () {
  0         0  
1867 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_INDEX4(), SDL_BITMAPORDER_1234(), 0, 4, 0 );
1868             }
1869              
1870 0     0 0 0 sub SDL_PIXELFORMAT_INDEX8 () {
  0         0  
1871 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_INDEX8(), 0, 0, 8, 1 );
1872             }
1873              
1874 0     0 0 0 sub SDL_PIXELFORMAT_RGB332 () {
  0         0  
1875 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED8(), SDL_PACKEDORDER_XRGB(),
1876             SDL_PACKEDLAYOUT_332(), 8, 1 );
1877             }
1878              
1879 0     0 0 0 sub SDL_PIXELFORMAT_RGB444 () {
  0         0  
1880 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_XRGB(),
1881             SDL_PACKEDLAYOUT_4444(), 12, 2 );
1882             }
1883              
1884 0     0 0 0 sub SDL_PIXELFORMAT_RGB555 () {
  0         0  
1885 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_XRGB(),
1886             SDL_PACKEDLAYOUT_1555(), 15, 2 );
1887             }
1888              
1889 0     0 0 0 sub SDL_PIXELFORMAT_BGR555 () {
  0         0  
1890 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_XBGR(),
1891             SDL_PACKEDLAYOUT_1555(), 15, 2 );
1892             }
1893              
1894 0     0 0 0 sub SDL_PIXELFORMAT_ARGB4444 () {
  0         0  
1895 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_ARGB(),
1896             SDL_PACKEDLAYOUT_4444(), 16, 2 );
1897             }
1898              
1899 0     0 0 0 sub SDL_PIXELFORMAT_RGBA4444 () {
  0         0  
1900 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_RGBA(),
1901             SDL_PACKEDLAYOUT_4444(), 16, 2 );
1902             }
1903              
1904 0     0 0 0 sub SDL_PIXELFORMAT_ABGR4444 () {
  0         0  
1905 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_ABGR(),
1906             SDL_PACKEDLAYOUT_4444(), 16, 2 );
1907             }
1908              
1909 0     0 0 0 sub SDL_PIXELFORMAT_BGRA4444 () {
  0         0  
1910 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_BGRA(),
1911             SDL_PACKEDLAYOUT_4444(), 16, 2 );
1912             }
1913              
1914 0     0 0 0 sub SDL_PIXELFORMAT_ARGB1555 () {
  0         0  
1915 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_ARGB(),
1916             SDL_PACKEDLAYOUT_1555(), 16, 2 );
1917             }
1918              
1919 0     0 0 0 sub SDL_PIXELFORMAT_RGBA5551 () {
  0         0  
1920 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_RGBA(),
1921             SDL_PACKEDLAYOUT_5551(), 16, 2 );
1922             }
1923              
1924 0     0 0 0 sub SDL_PIXELFORMAT_ABGR1555 () {
  0         0  
1925 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_ABGR(),
1926             SDL_PACKEDLAYOUT_1555(), 16, 2 );
1927             }
1928              
1929 0     0 0 0 sub SDL_PIXELFORMAT_BGRA5551 () {
  0         0  
1930 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_BGRA(),
1931             SDL_PACKEDLAYOUT_5551(), 16, 2 );
1932             }
1933              
1934 0     0 0 0 sub SDL_PIXELFORMAT_RGB565 () {
  0         0  
1935 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_XRGB(),
1936             SDL_PACKEDLAYOUT_565(), 16, 2 );
1937             }
1938              
1939 0     0 0 0 sub SDL_PIXELFORMAT_BGR565 () {
  0         0  
1940 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED16(), SDL_PACKEDORDER_XBGR(),
1941             SDL_PACKEDLAYOUT_565(), 16, 2 );
1942             }
1943              
1944 0     0 0 0 sub SDL_PIXELFORMAT_RGB24 () {
  0         0  
1945 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_ARRAYU8(), SDL_ARRAYORDER_RGB(), 0, 24, 3 );
1946             }
1947              
1948 0     0 0 0 sub SDL_PIXELFORMAT_BGR24 () {
  0         0  
1949 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_ARRAYU8(), SDL_ARRAYORDER_BGR(), 0, 24, 3 );
1950             }
1951              
1952 0     0 0 0 sub SDL_PIXELFORMAT_RGB888 () {
  0         0  
1953 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_XRGB(),
1954             SDL_PACKEDLAYOUT_8888(), 24, 4 );
1955             }
1956              
1957 0     0 0 0 sub SDL_PIXELFORMAT_RGBX8888 () {
  0         0  
1958 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_RGBX(),
1959             SDL_PACKEDLAYOUT_8888(), 24, 4 );
1960             }
1961              
1962 0     0 0 0 sub SDL_PIXELFORMAT_BGR888 () {
  0         0  
1963 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_XBGR(),
1964             SDL_PACKEDLAYOUT_8888(), 24, 4 );
1965             }
1966              
1967 0     0 0 0 sub SDL_PIXELFORMAT_BGRX8888 () {
  0         0  
1968 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_BGRX(),
1969             SDL_PACKEDLAYOUT_8888(), 24, 4 );
1970             }
1971 0     0   0 define pixel_format => [
1972 0         0 [ SDL_PIXELFORMAT_ARGB8888 => sub () {
1973 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_ARGB(),
1974             SDL_PACKEDLAYOUT_8888(), 32, 4 );
1975             }
1976             ]
1977             ];
1978              
1979 0     0 0 0 sub SDL_PIXELFORMAT_RGBA8888 () {
  0         0  
1980 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_RGBA(),
1981             SDL_PACKEDLAYOUT_8888(), 32, 4 );
1982             }
1983              
1984 0     0 0 0 sub SDL_PIXELFORMAT_ABGR8888 () {
  0         0  
1985 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_ABGR(),
1986             SDL_PACKEDLAYOUT_8888(), 32, 4 );
1987             }
1988              
1989 0     0 0 0 sub SDL_PIXELFORMAT_BGRA8888 () {
  0         0  
1990 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_BGRA(),
1991             SDL_PACKEDLAYOUT_8888(), 32, 4 );
1992             }
1993              
1994 0     0 0 0 sub SDL_PIXELFORMAT_ARGB2101010 () {
  0         0  
1995 0         0 SDL_DEFINE_PIXELFORMAT( SDL_PIXELTYPE_PACKED32(), SDL_PACKEDORDER_ARGB(),
1996             SDL_PACKEDLAYOUT_2101010(),
1997             32, 4 );
1998             }
1999              
2000             # /* Aliases for RGBA byte arrays of color data, for the current platform */
2001             #if SDL_BYTEORDER == SDL_BIG_ENDIAN
2002             # SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888,
2003             # SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888,
2004             # SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888,
2005             # SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888,
2006             #else
2007             # SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888,
2008             # SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888,
2009             # SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888,
2010             # SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888,
2011             #endif
2012 0     0 0 0 sub SDL_PIXELFORMAT_YV12 () {
  0         0  
2013 0         0 SDL_DEFINE_PIXELFOURCC( 'Y', 'V', '1', '2' );
2014             }
2015              
2016 0     0 0 0 sub SDL_PIXELFORMAT_IYUV () {
  0         0  
2017 0         0 SDL_DEFINE_PIXELFOURCC( 'I', 'Y', 'U', 'V' );
2018             }
2019              
2020 0     0 0 0 sub SDL_PIXELFORMAT_YUY2 () {
  0         0  
2021 0         0 SDL_DEFINE_PIXELFOURCC( 'Y', 'U', 'Y', '2' );
2022             }
2023              
2024 0     0 0 0 sub SDL_PIXELFORMAT_UYVY () {
  0         0  
2025 0         0 SDL_DEFINE_PIXELFOURCC( 'U', 'Y', 'V', 'Y' );
2026             }
2027              
2028 0     0 0 0 sub SDL_PIXELFORMAT_YVYU () {
  0         0  
2029 0         0 SDL_DEFINE_PIXELFOURCC( 'Y', 'V', 'Y', 'U' );
2030             }
2031              
2032 0     0 0 0 sub SDL_PIXELFORMAT_NV12 () {
  0         0  
2033 0         0 SDL_DEFINE_PIXELFOURCC( 'N', 'V', '1', '2' );
2034             }
2035              
2036 0     0 0 0 sub SDL_PIXELFORMAT_NV21 () {
  0         0  
2037 0         0 SDL_DEFINE_PIXELFOURCC( 'N', 'V', '2', '1' );
2038             }
2039              
2040 0     0 0 0 sub SDL_PIXELFORMAT_EXTERNAL_OES () {
  0         0  
2041 0         0 SDL_DEFINE_PIXELFOURCC( 'O', 'E', 'S', ' ' );
2042             }
2043              
2044             # include/SDL_stdinc.h
2045 0     0 0 0 sub SDL_FOURCC ( $A, $B, $C, $D ) { $A << 0 | $B << 8 | $C << 16 | $D << 24 }
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
2046              
2047             # Unsorted - https://github.com/libsdl-org/SDL/blob/c59d4dcd38c382a1e9b69b053756f1139a861574/include/SDL_keycode.h
2048             # https://github.com/libsdl-org/SDL/blob/c59d4dcd38c382a1e9b69b053756f1139a861574/include/SDL_scancode.h#L151
2049 2     2 0 14 sub SDLK_SCANCODE_MASK { 1 << 30 }
2050 2     2 0 5 sub SDL_SCANCODE_TO_KEYCODE ($X) { $X | SDLK_SCANCODE_MASK }
  2         4  
  2         3  
  2         8  
2051             FFI::C->enum(
2052             'SDL_Keycode',
2053             [ [ SDLK_UP => SDL_SCANCODE_TO_KEYCODE(82) ], # 82 comes from include/SDL_scancode.h
2054              
2055             # The following are incorrect!!!!!!!!!!!!!!!!!!!
2056             qw[SDLK_DOWN
2057             SDLK_LEFT
2058             SDLK_RIGHT]
2059             ]
2060             );
2061             attach(
2062             all => {
2063              
2064             # Unknown...
2065             SDL_SetMainReady => [ [] => 'void' ]
2066             }
2067             );
2068 0           define SDL_Mouse => [
2069 0     0     [ SDL_BUTTON => sub ($x) { 1 << ( ($x) - 1 ) } ],
  0            
  0            
  0            
2070             [ SDL_BUTTON_LEFT => 1 ],
2071             [ SDL_BUTTON_MIDDLE => 2 ],
2072             [ SDL_BUTTON_RIGHT => 3 ],
2073             [ SDL_BUTTON_X1 => 4 ],
2074             [ SDL_BUTTON_X2 => 5 ],
2075 0     0     [ SDL_BUTTON_LMASK => sub () { SDL_BUTTON( SDL_BUTTON_LEFT() ); } ],
  0            
  0            
2076 0     0     [ SDL_BUTTON_MMASK => sub () { SDL_BUTTON( SDL_BUTTON_MIDDLE() ); } ],
  0            
  0            
2077 0     0     [ SDL_BUTTON_RMASK => sub () { SDL_BUTTON( SDL_BUTTON_RIGHT() ); } ],
  0            
  0            
2078 0     0     [ SDL_BUTTON_X1MASK => sub () { SDL_BUTTON( SDL_BUTTON_X1() ); } ],
  0            
  0            
2079 0           [ SDL_BUTTON_X2MASK => sub () { SDL_BUTTON( SDL_BUTTON_X2() ); } ]
  0            
2080             ];
2081              
2082             # TODO
2083             package SDL2::assert_data { };
2084              
2085             package SDL2::AssertData {
2086 2     2   5826 use SDL2::Utils;
  2         2  
  2         9  
2087             has
2088             always_ignore => 'int',
2089             trigger_count => 'uint',
2090             condition => 'opaque', # string
2091             filename => 'opaque', # string
2092             linenum => 'int',
2093             function => 'opaque', # string
2094             next => 'opaque' # const struct SDL_AssertData *next
2095             };
2096              
2097             package SDL2::atomic_t {
2098 2     2   917 use SDL2::Utils;
  2         3  
  2         7  
2099             has value => 'int';
2100             };
2101              
2102             package SDL2::AudioCVT {
2103             };
2104              
2105             package SDL2::AudioDeviceEvent { };
2106              
2107             package SDL2::AudioStream { };
2108              
2109             package SDL2::Color { };
2110              
2111             package SDL2::ControllerAxisEvent { };
2112              
2113             package SDL2::ControllerButtonEvent { };
2114              
2115             package SDL2::ControllerDeviceEvent { };
2116              
2117             package SDL2::DisplayMode { };
2118              
2119             package SDL2::DollarGestureEvent { };
2120              
2121             package SDL2::DropEvent { };
2122              
2123             package SDL2::Event { };
2124              
2125             package SDL2::Finger {
2126 2     2   990 use SDL2::Utils;
  2         2  
  2         9  
2127             has
2128             id => 'sint64', # SDL_FingerID
2129             x => 'float',
2130             y => 'float',
2131             pressure => 'float';
2132             };
2133              
2134             package SDL2::GameControllerButtonBind { };
2135              
2136             package SDL2::_GameController { };
2137              
2138             package SDL2::GameCrontroller { };
2139              
2140             package SDL2::_Haptic { };
2141              
2142             package SDL2::Haptic { };
2143              
2144             package SDL2::HapticCondition { };
2145              
2146             package SDL2::HapticConstant { };
2147              
2148             package SDL2::HapticCustom { };
2149              
2150             package SDL2::HapticDirection { };
2151              
2152             package SDL2::HapticEffect { };
2153              
2154             package SDL2::HapticLeftRight { };
2155              
2156             package SDL2::HapticPeriodic { };
2157              
2158             package SDL2::HapticRamp { };
2159              
2160             package SDL2::JoyAxisEvent { };
2161              
2162             package SDL2::JoyBallEvent { };
2163              
2164             package SDL2::JoyButtonEvent { };
2165              
2166             package SDL2::JoyDeviceEvent { };
2167              
2168             package SDL2::JoyHatEvent { };
2169              
2170             package SDL2::Joystick { };
2171              
2172             package SDL2::JoystickGUID { };
2173              
2174             package SDL2::JoystickID { };
2175              
2176             package SDL2::_JoyStick { };
2177              
2178             package SDL2::KeyboardEvent { };
2179              
2180             package SDL2::Keysym {
2181 2     2   1216 use SDL2::Utils;
  2         2  
  2         8  
2182             has
2183             scancode => 'opaque', # SDL_Scancode
2184             sym => 'opaque', # SDL_Keycode
2185             mod => 'uint16',
2186             unused => 'uint32';
2187             };
2188              
2189             package SDL2::MessageBoxButtonData {
2190 2     2   884 use SDL2::Utils;
  2         3  
  2         8  
2191             has
2192             flags => 'uint32',
2193             buttonid => 'int',
2194             text => 'opaque' # 'string'
2195             };
2196              
2197             package SDL2::MessageBoxColor {
2198 2     2   1169 use SDL2::Utils;
  2         4  
  2         7  
2199             has
2200             r => 'uint8',
2201             g => 'uint8',
2202             b => 'uint8';
2203             };
2204              
2205             package SDL2::MessageBoxColorScheme {
2206 2     2   862 use SDL2::Utils;
  2         4  
  2         6  
2207             has colors => 'opaque' # SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX];
2208             };
2209             attach messagebox => {
2210              
2211             #SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, ("R.E.L.I.V.E. " + BuildString()).c_str(), msg, nullptr);
2212             SDL_ShowSimpleMessageBox => [ [ 'uint32', 'string', 'string', 'SDL_Window' ], 'int' ]
2213             };
2214              
2215             package SDL2::MessageBoxData {
2216 2     2   887 use SDL2::Utils;
  2         4  
  2         5  
2217             has
2218             flags => 'uint32',
2219             window => 'opaque', # SDL_Window*
2220             title => 'opaque', # string
2221             message => 'opaque', # string
2222             numbuttons => 'int',
2223             buttons => 'opaque', # SDL_MessageBoxButtonData*
2224             colorScheme => 'opaque' # SDL_MessageBoxColorScheme *
2225             };
2226              
2227             package SDL2::MouseButtonEvent { };
2228              
2229             package SDL2::MouseMotionEvent { };
2230              
2231             package SDL2::MouseWheelEvent { };
2232              
2233             package SDL2::MultiGestureEvent { };
2234              
2235             package SDL2::Palette { };
2236              
2237             package SDL2::PixelFormat { };
2238              
2239             package SDL2::QuitEvent { };
2240              
2241             package SDL2::Renderer { };
2242              
2243             package SDL2::RendererInfo { };
2244              
2245             package SDL2::RWops { };
2246              
2247             package SDL2::SensorEvent { };
2248              
2249             package SDL2::SysWMEvent { };
2250              
2251             package SDL2::SysWMinfo { };
2252              
2253             package SDL2::SysWMmsg { };
2254              
2255             package SDL2::Sensor { };
2256              
2257             package SDL2::SensorID { }; # type
2258              
2259             package SDL2::TextEditingEvent { };
2260              
2261             package SDL2::TextInputEvent { };
2262              
2263             package SDL2::TouchFingerEvent { };
2264              
2265             package SDL2::ControllerTouchpadEvent { };
2266              
2267             package SDL2::UserEvent { };
2268              
2269             package SDL2::WindowEvent { };
2270              
2271             package SDL2::Mixer { };
2272              
2273             package SDL2::Mixer::Mix::Chunk { };
2274              
2275             package SDL2::Mixer::Mix::Fading { };
2276              
2277             package SDL2::Mixer::Mix::MusicType { };
2278              
2279             package SDL2::Mixer::Mix::Music { };
2280              
2281             package SDL2::Mixer::Mix::Chunk { };
2282              
2283             package SDL2::Mixer::Chunk { };
2284              
2285             package SDL2::Mixer::Fading { };
2286              
2287             package SDL2::Mixer::MusicType { };
2288              
2289             package SDL2::Mixer::Music { };
2290              
2291             package SDL2::Mixer::Chunk { };
2292              
2293             package SDL2::Image { };
2294              
2295             package SDL2::iconv_t { }; # int ptr
2296              
2297             package SDL2::WindowShapeMode { };
2298              
2299             package SDL2::WindowShapeParams { }; # union
2300              
2301             package SDL2::TTF { };
2302              
2303             package SDL2::TTF::Image { };
2304              
2305             package SDL2::TTF::Font { };
2306              
2307             package SDL2::TTF::PosBuf { };
2308              
2309             package SDL2::Net { };
2310              
2311             package SDL2::RTF { };
2312              
2313             package SDL2::RTF::Context { };
2314              
2315             package SDL2::RTF::FontEngine { };
2316              
2317             package SDL2::Mutex { };
2318              
2319             package SDL2::Semaphore { };
2320              
2321             package SDL2::Sem { };
2322              
2323             package SDL2::Cond { };
2324              
2325             package SDL2::Thread {
2326 2     2   1564 use SDL2::Utils;
  2         3  
  2         9  
2327             has();
2328             }
2329              
2330             package SDL2::Locale {
2331 2     2   813 use SDL2::Utils;
  2         25  
  2         9  
2332             has
2333             language => 'opaque', # string
2334             country => 'opaque' # string
2335             };
2336              
2337             #warn SDL2::SDLK_UP();
2338             #warn SDL2::SDLK_DOWN();
2339             # https://github.com/libsdl-org/SDL/blob/main/include/SDL_hints.h
2340             # Export symbols!
2341             our @EXPORT_OK = map {@$_} values %EXPORT_TAGS;
2342              
2343             #$EXPORT_TAGS{default} = []; # Export nothing by default
2344             $EXPORT_TAGS{all} = \@EXPORT_OK; # Export everything with :all tag
2345              
2346             #use Data::Dump;
2347             #ddx \%EXPORT_TAGS;
2348             #ddx \%SDL2::;
2349             }
2350             1;
2351              
2352             =head1 LICENSE
2353              
2354             Copyright (C) Sanko Robinson.
2355              
2356             This library is free software; you can redistribute it and/or modify it under
2357             the terms found in the Artistic License 2. Other copyrights, terms, and
2358             conditions may apply to data transmitted through this module.
2359              
2360             =head1 AUTHOR
2361              
2362             Sanko Robinson Esanko@cpan.orgE
2363              
2364             =cut
2365              
2366             # Examples:
2367             # - https://github.com/crust/sdl2-examples
2368             #