DEADSOFTWARE

Added BPP switching
[d2df-sdl.git] / src / wrappers / sdl2 / sdl2allegro.inc
1 {$INCLUDE ../shared/a_modes.inc}
2 {$SCOPEDENUMS OFF}
4 interface
6 uses Allegro;
8 {$I sdltype.inc}
9 {$I sdlpixels.inc}
10 {$I sdlscancode.inc}
12 const
13 SDL_HAT_CENTERED = $00;
14 SDL_HAT_UP = $01;
15 SDL_HAT_RIGHT = $02;
16 SDL_HAT_DOWN = $04;
17 SDL_HAT_LEFT = $08;
18 SDL_HAT_RIGHTUP = SDL_HAT_RIGHT or SDL_HAT_UP;
19 SDL_HAT_RIGHTDOWN = SDL_HAT_RIGHT or SDL_HAT_DOWN;
20 SDL_HAT_LEFTUP = SDL_HAT_LEFT or SDL_HAT_UP;
21 SDL_HAT_LEFTDOWN = SDL_HAT_LEFT or SDL_HAT_DOWN;
23 const
24 AUDIO_U8 = $0008;
25 AUDIO_S8 = $8008;
26 AUDIO_U16LSB = $0010;
27 AUDIO_S16LSB = $8010;
28 AUDIO_U16MSB = $1010;
29 AUDIO_S16MSB = $9010;
30 AUDIO_U16 = AUDIO_U16LSB;
31 AUDIO_S16 = AUDIO_S16LSB;
33 const
34 SDL_TOUCH_MOUSEID = UInt32(-1);
36 type
37 PSDL_Window = ^TSDL_Window;
38 TSDL_Window = record
39 w, h, mode: Integer; (* Allegro-specific *)
40 end;
42 PSDL_Joystick = Pointer;
43 TSDL_JoystickGUID = record
44 data: array[0..15] of UInt8;
45 end;
46 TSDL_JoystickID = SInt32;
48 PSDL_RWops = ^TSDL_RWops;
50 TSize = function(context: PSDL_RWops): SInt64; cdecl;
51 TSeek = function(context: PSDL_RWops; offset: SInt64; whence: SInt32): SInt64; cdecl;
52 TRead = function(context: PSDL_RWops; ptr: Pointer; size: size_t; maxnum: size_t): size_t; cdecl;
53 TWrite = function(context: PSDL_RWops; const ptr: Pointer; size: size_t; num: size_t): size_t; cdecl;
54 TClose = function(context: PSDL_RWops): SInt32; cdecl;
56 TStdio = record
57 autoclose: TSDL_Bool;
58 fp: file;
59 end;
61 TMem = record
62 base: PUInt8;
63 here: PUInt8;
64 stop: PUInt8;
65 end;
67 TUnknown = record
68 data1: Pointer;
69 end;
71 TSDL_RWops = packed record
72 size: TSize;
73 seek: TSeek;
74 read: TRead;
75 write: TWrite;
76 close: TClose;
77 _type: UInt32;
78 case Integer of
79 0: (stdio: TStdio);
80 1: (mem: TMem);
81 2: (unknown: TUnknown);
82 {$IFDEF ANDROID}
83 //3: (androidio: TAndroidIO);
84 {$ENDIF}
85 {$IFDEF WINDOWS}
86 //3: (windowsio: TWindowsIO);
87 {$ENDIF}
88 end;
90 PSDL_TouchID = ^TSDL_TouchID;
91 TSDL_TouchID = SInt64;
93 PSDL_FingerID = ^TSDL_FingerID;
94 TSDL_FingerID = SInt64;
97 const
98 { Touch events }
99 SDL_FINGERDOWN = $700;
100 SDL_FINGERUP = $701;
101 SDL_FINGERMOTION = $702;
103 type
104 TSDL_TouchFingerEvent = record
105 type_: UInt32;
106 timestamp: UInt32;
107 touchId: TSDL_TouchID;
108 fingerId: TSDL_FingerID;
109 x, y, dx, dy: Float;
110 pressure: Float;
111 end;
114 const
115 SDL_WINDOWPOS_CENTERED_MASK = $2FFF0000;
116 SDL_WINDOWPOS_CENTERED = SDL_WINDOWPOS_CENTERED_MASK or 0;
118 type
119 PSDL_DisplayMode = ^TSDL_DisplayMode;
120 TSDL_DisplayMode = record
121 format: UInt32;
122 w: SInt32;
123 h: SInt32;
124 refresh_rate: SInt32;
125 driverdata: Pointer;
126 end;
128 TSDL_GLContext = Pointer;
130 const
131 SDL_WINDOW_FULLSCREEN = $00000001;
132 SDL_WINDOW_OPENGL = $00000002;
133 SDL_WINDOW_SHOWN = $00000004;
134 SDL_WINDOW_HIDDEN = $00000008;
135 SDL_WINDOW_BORDERLESS = $00000010;
136 SDL_WINDOW_RESIZABLE = $00000020;
137 SDL_WINDOW_MINIMIZED = $00000040;
138 SDL_WINDOW_MAXIMIZED = $00000080;
139 SDL_WINDOW_INPUT_GRABBED = $00000100;
140 SDL_WINDOW_INPUT_FOCUS = $00000200;
141 SDL_WINDOW_MOUSE_FOCUS = $00000400;
142 SDL_WINDOW_FULLSCREEN_DESKTOP = SDL_WINDOW_FULLSCREEN or $00001000;
143 SDL_WINDOW_FOREIGN = $00000800;
144 SDL_WINDOW_ALLOW_HIGHDPI = $00002000;
146 SDL_WINDOWEVENT_EXPOSED = 3;
147 SDL_WINDOWEVENT_MOVED = 4;
148 SDL_WINDOWEVENT_RESIZED = 5;
149 SDL_WINDOWEVENT_MINIMIZED = 7;
150 SDL_WINDOWEVENT_MAXIMIZED = 8;
151 SDL_WINDOWEVENT_RESTORED = 9;
152 SDL_WINDOWEVENT_FOCUS_GAINED = 12;
153 SDL_WINDOWEVENT_FOCUS_LOST = 13;
155 SDL_DISABLE = 0;
156 SDL_ENABLE = 1;
158 SDL_TEXTINPUTEVENT_TEXT_SIZE = 32;
160 SDL_FIRSTEVENT = 0;
161 SDL_COMMONEVENT = 1;
162 SDL_QUITEV = $100;
163 SDL_WINDOWEVENT = $200;
164 SDL_KEYDOWN = $300;
165 SDL_KEYUP = $301;
166 //SDL_TEXTEDITING = $302;
167 SDL_TEXTINPUT = $303;
169 type
170 TSDL_WindowEvent = record
171 type_: UInt32; // SDL_WINDOWEVENT
172 timestamp: UInt32;
173 windowID: UInt32; // The associated window
174 event: UInt8; // SDL_WindowEventID
175 padding1: UInt8;
176 padding2: UInt8;
177 padding3: UInt8;
178 data1: SInt32; // event dependent data
179 data2: SInt32; // event dependent data
180 end;
182 PSDL_Keysym = ^TSDL_Keysym;
183 TSDL_Keysym = record
184 scancode: TSDL_ScanCode; // SDL physical key code - see SDL_Scancode for details
185 sym: TSDL_KeyCode; // SDL virtual key code - see SDL_Keycode for details
186 _mod: UInt16; // current key modifiers
187 unicode: UInt32; // (deprecated) use SDL_TextInputEvent instead
188 end;
190 TSDL_KeyboardEvent = record
191 type_: UInt32; // SDL_KEYDOWN or SDL_KEYUP
192 timestamp: UInt32;
193 windowID: UInt32; // The window with keyboard focus, if any
194 state: UInt8; // SDL_PRESSED or SDL_RELEASED
195 _repeat: UInt8; // Non-zero if this is a key repeat
196 padding2: UInt8;
197 padding3: UInt8;
198 keysym: TSDL_KeySym; // The key that was pressed or released
199 end;
201 TSDL_TextInputEvent = record
202 type_: UInt32; // SDL_TEXTINPUT
203 timestamp: UInt32;
204 windowID: UInt32; // The window with keyboard focus, if any
205 text: array[0..SDL_TEXTINPUTEVENT_TEXT_SIZE - 1] of Char; // The input text
206 end;
208 TSDL_QuitEvent = record
209 type_: UInt32; // SDL_QUIT
210 timestamp: UInt32;
211 end;
213 PSDL_Event = ^TSDL_Event;
214 TSDL_Event = record
215 case Integer of
216 0: (type_: UInt32);
217 //SDL_COMMONEVENT: (common: TSDL_CommonEvent);
218 SDL_WINDOWEVENT: (window: TSDL_WindowEvent);
219 SDL_KEYUP,
220 SDL_KEYDOWN: (key: TSDL_KeyboardEvent);
221 //SDL_TEXTEDITING: (edit: TSDL_TextEditingEvent);
222 SDL_TEXTINPUT: (text: TSDL_TextInputEvent);
223 //SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
224 //SDL_MOUSEBUTTONUP,
225 //SDL_MOUSEBUTTONDOWN: (button: TSDL_MouseButtonEvent);
226 //SDL_MOUSEWHEEL: (wheel: TSDL_MouseWheelEvent);
227 //SDL_JOYAXISMOTION: (jaxis: TSDL_JoyAxisEvent);
228 //SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent);
229 //SDL_JOYHATMOTION: (jhat: TSDL_JoyHatEvent);
230 //SDL_JOYBUTTONDOWN,
231 //SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent);
232 //SDL_JOYDEVICEADDED,
233 //SDL_JOYDEVICEREMOVED: (jdevice: TSDL_JoyDeviceEvent);
234 //SDL_CONTROLLERAXISMOTION: (caxis: TSDL_ControllerAxisEvent);
235 //SDL_CONTROLLERBUTTONUP,
236 //SDL_CONTROLLERBUTTONDOWN: (cbutton: TSDL_ControllerButtonEvent);
237 //SDL_CONTROLLERDEVICEADDED,
238 //SDL_CONTROLLERDEVICEREMOVED,
239 //SDL_CONTROLLERDEVICEREMAPPED: (cdevice: TSDL_ControllerDeviceEvent);
240 //SDL_AUDIODEVICEADDED,
241 //SDL_AUDIODEVICEREMOVED: (adevice: TSDL_AudioDeviceEvent);
242 SDL_QUITEV: (quit: TSDL_QuitEvent);
243 //SDL_USEREVENT: (user: TSDL_UserEvent);
244 //SDL_SYSWMEVENT: (syswm: TSDL_SysWMEvent);
245 SDL_FINGERDOWN,
246 SDL_FINGERUP,
247 SDL_FINGERMOTION: (tfinger: TSDL_TouchFingerEvent);
248 //SDL_MULTIGESTURE: (mgesture: TSDL_MultiGestureEvent);
249 //SDL_DOLLARGESTURE,SDL_DOLLARRECORD: (dgesture: TSDL_DollarGestureEvent);
250 //SDL_DROPFILE: (drop: TSDL_DropEvent);
251 end;
253 const
254 SDL_GL_RED_SIZE = 0;
255 SDL_GL_GREEN_SIZE = 1;
256 SDL_GL_BLUE_SIZE = 2;
257 SDL_GL_ALPHA_SIZE = 3;
258 SDL_GL_BUFFER_SIZE = 4;
259 SDL_GL_DOUBLEBUFFER = 5;
260 SDL_GL_DEPTH_SIZE = 6;
261 SDL_GL_STENCIL_SIZE = 7;
262 SDL_GL_ACCUM_RED_SIZE = 8;
263 SDL_GL_ACCUM_GREEN_SIZE = 9;
264 SDL_GL_ACCUM_BLUE_SIZE = 10;
265 SDL_GL_ACCUM_ALPHA_SIZE = 11;
266 SDL_GL_STEREO = 12;
267 SDL_GL_MULTISAMPLEBUFFERS = 13;
268 SDL_GL_MULTISAMPLESAMPLES = 14;
269 SDL_GL_ACCELERATED_VISUAL = 15;
270 SDL_GL_RETAINED_BACKING = 16;
271 SDL_GL_CONTEXT_MAJOR_VERSION = 17;
272 SDL_GL_CONTEXT_MINOR_VERSION = 18;
273 SDL_GL_CONTEXT_EGL = 19;
274 SDL_GL_CONTEXT_FLAGS = 20;
275 SDL_GL_CONTEXT_PROFILE_MASK = 21;
276 SDL_GL_SHARE_WITH_CURRENT_CONTEXT = 22;
277 SDL_GL_FRAMEBUFFER_SRGB_CAPABLE = 23;
279 type
280 TSDL_GLattr = DWord;
282 const
283 SDL_INIT_TIMER = $00000001;
284 SDL_INIT_AUDIO = $00000010;
285 SDL_INIT_VIDEO = $00000020;
286 SDL_INIT_JOYSTICK = $00000200;
287 SDL_INIT_HAPTIC = $00001000;
288 SDL_INIT_GAMECONTROLLER = $00002000; //turn on game controller also implicitly does JOYSTICK
289 SDL_INIT_NOPARACHUTE = $00100000; //Don't catch fatal signals
290 SDL_INIT_EVERYTHING = SDL_INIT_TIMER or SDL_INIT_AUDIO or
291 SDL_INIT_VIDEO or SDL_INIT_JOYSTICK or
292 SDL_INIT_HAPTIC or SDL_INIT_GAMECONTROLLER;
294 SDL_HINT_ACCELEROMETER_AS_JOYSTICK = 'SDL_ACCELEROMETER_AS_JOYSTICK';
296 var
297 sdl2allegro_screen: PBITMAP;
298 sdl2allegro_bpp: Integer;
300 /// FUNCTIONS ///
302 function SDL_SetWindowGammaRamp(window: PSDL_Window; const red: PUInt16; const green: PUInt16; const blue: PUInt16): SInt32;
303 function SDL_GetWindowGammaRamp(window: PSDL_Window; red: PUInt16; green: PUInt16; blue: PUInt16): SInt32;
305 function SDL_NumJoysticks: SInt32;
306 function SDL_JoystickOpen(device_index: SInt32): PSDL_Joystick;
307 function SDL_JoystickName(joystick: PSDL_Joystick): PAnsiChar;
308 function SDL_JoystickNumAxes(joystick: PSDL_Joystick): SInt32;
309 function SDL_JoystickNumButtons(joystick: PSDL_Joystick): SInt32;
310 function SDL_JoystickNumHats(joystick: PSDL_Joystick): SInt32;
311 procedure SDL_JoystickClose(joystick: PSDL_Joystick);
312 procedure SDL_JoystickUpdate;
313 function SDL_JoystickGetButton(joystick: PSDL_Joystick; button: SInt32): UInt8;
314 function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: SInt32): SInt16;
315 function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: SInt32): UInt8;
317 function SDL_GetScancodeName(scancode: TSDL_ScanCode): PAnsiChar;
319 function SDL_GetPerformanceCounter: UInt64;
320 function SDL_GetPerformanceFrequency: UInt64;
322 function SDL_RWFromFile(const _file: PAnsiChar; const mode: PAnsiChar): PSDL_RWops;
323 function SDL_RWFromConstMem(const mem: Pointer; size: SInt32): PSDL_RWops;
325 function SDL_GetDisplayDPI(displayIndex: SInt32; ddpi, hdpi, vdpi: PFloat): SInt32;
326 function SDL_IsTextInputActive: TSDL_Bool;
327 procedure SDL_StartTextInput;
328 procedure SDL_StopTextInput;
329 function SDL_GetNumTouchDevices: SInt32;
331 function SDL_GetDesktopDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
332 function SDL_GetClosestDisplayMode(displayIndex: SInt32; const mode: PSDL_DisplayMode; closest: PSDL_DisplayMode): PSDL_DisplayMode;
334 procedure SDL_DestroyWindow(window: PSDL_Window);
335 procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
336 procedure SDL_RestoreWindow(window: PSDL_Window);
337 procedure SDL_SetWindowSize(window: PSDL_Window; w: SInt32; h: SInt32);
338 function SDL_CreateWindow(const title: PAnsiChar; x: SInt32; y: SInt32; w: SInt32; h: SInt32; flags: UInt32): PSDL_Window;
339 function SDL_SetWindowFullscreen(window: PSDL_Window; flags: UInt32): SInt32;
340 function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
341 procedure SDL_GetWindowSize(window: PSDL_Window; w: PInt; h: PInt);
342 function SDL_GetNumDisplayModes(displayIndex: SInt32): SInt32;
343 function SDL_GetDisplayMode(displayIndex: SInt32; modeIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
345 function SDL_ShowCursor(toggle: SInt32): SInt32;
346 procedure SDL_Delay(ms: UInt32);
347 procedure SDL_GL_SwapWindow(window: PSDL_Window);
349 function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
350 function SDL_GetTicks: UInt32;
352 function SDL_PushEvent(event: PSDL_Event): SInt32;
353 function SDL_PollEvent(event: PSDL_Event): SInt32;
354 function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
355 function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
356 function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
358 function SDL_GetError: PAnsiChar;
360 function SDL_Init(flags: UInt32): SInt32;
361 procedure SDL_Quit();
362 function SDL_SetHint( const name: PChar; const value: PChar) : boolean;
364 implementation
366 uses
367 {$IFDEF GO32V2}
368 go32,
369 {$ENDIF}
370 e_Log, g_options, SysUtils, ctypes;
372 const
373 maxKeyBuffer = 64;
375 var
376 keyring: array [0..maxKeyBuffer - 1] of Integer;
377 keybeg, keyend: Integer;
378 inputChar: Char;
379 inputText: Boolean;
380 ticks: UInt32;
381 quit: Boolean;
383 s2lc: array [0..KEY_MAX] of char = (
384 #00, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
385 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4',
386 '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
387 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '`', '-', '=', #00,
388 #09, '[', ']', #10, ';', #39, '\', '\', ',', '.', '/', ' ', #00, #00, #00, #00,
389 #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
390 #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
391 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
392 );
393 s2uc: array [0..KEY_MAX] of char = (
394 #00, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
395 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ')', '!', '@', '#', '$',
396 '%', '^', '&', '*', '(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
397 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '~', '_', '+', #00,
398 #09, '{', '}', #10, ':', '"', '|', '|', '<', '>', '?', ' ', #00, #00, #00, #00,
399 #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
400 #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
401 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
402 );
403 s2sa: array [0..KEY_MAX] of Integer = (
404 SDL_SCANCODE_UNKNOWN,
405 SDL_SCANCODE_A,
406 SDL_SCANCODE_B,
407 SDL_SCANCODE_C,
408 SDL_SCANCODE_D,
409 SDL_SCANCODE_E,
410 SDL_SCANCODE_F,
411 SDL_SCANCODE_G,
412 SDL_SCANCODE_H,
413 SDL_SCANCODE_I,
414 SDL_SCANCODE_J,
415 SDL_SCANCODE_K,
416 SDL_SCANCODE_L,
417 SDL_SCANCODE_M,
418 SDL_SCANCODE_N,
419 SDL_SCANCODE_O,
420 SDL_SCANCODE_P,
421 SDL_SCANCODE_Q,
422 SDL_SCANCODE_R,
423 SDL_SCANCODE_S,
424 SDL_SCANCODE_T,
425 SDL_SCANCODE_U,
426 SDL_SCANCODE_V,
427 SDL_SCANCODE_W,
428 SDL_SCANCODE_X,
429 SDL_SCANCODE_Y,
430 SDL_SCANCODE_Z,
431 SDL_SCANCODE_0,
432 SDL_SCANCODE_1,
433 SDL_SCANCODE_2,
434 SDL_SCANCODE_3,
435 SDL_SCANCODE_4,
436 SDL_SCANCODE_5,
437 SDL_SCANCODE_6,
438 SDL_SCANCODE_7,
439 SDL_SCANCODE_8,
440 SDL_SCANCODE_9,
441 SDL_SCANCODE_KP_0,
442 SDL_SCANCODE_KP_1,
443 SDL_SCANCODE_KP_2,
444 SDL_SCANCODE_KP_3,
445 SDL_SCANCODE_KP_4,
446 SDL_SCANCODE_KP_5,
447 SDL_SCANCODE_KP_6,
448 SDL_SCANCODE_KP_7,
449 SDL_SCANCODE_KP_8,
450 SDL_SCANCODE_KP_9,
451 SDL_SCANCODE_F1,
452 SDL_SCANCODE_F2,
453 SDL_SCANCODE_F3,
454 SDL_SCANCODE_F4,
455 SDL_SCANCODE_F5,
456 SDL_SCANCODE_F6,
457 SDL_SCANCODE_F7,
458 SDL_SCANCODE_F8,
459 SDL_SCANCODE_F9,
460 SDL_SCANCODE_F10,
461 SDL_SCANCODE_F11,
462 SDL_SCANCODE_F12,
463 SDL_SCANCODE_ESCAPE,
464 SDL_SCANCODE_GRAVE,
465 SDL_SCANCODE_MINUS,
466 SDL_SCANCODE_EQUALS,
467 SDL_SCANCODE_BACKSPACE,
468 SDL_SCANCODE_TAB,
469 SDL_SCANCODE_LEFTBRACKET,
470 SDL_SCANCODE_RIGHTBRACKET,
471 SDL_SCANCODE_RETURN,
472 SDL_SCANCODE_SEMICOLON,
473 SDL_SCANCODE_APOSTROPHE,
474 SDL_SCANCODE_BACKSLASH,
475 SDL_SCANCODE_NONUSHASH,
476 SDL_SCANCODE_COMMA,
477 SDL_SCANCODE_UNKNOWN, (* !!! KEY_STOP *)
478 SDL_SCANCODE_SLASH,
479 SDL_SCANCODE_SPACE,
480 SDL_SCANCODE_INSERT,
481 SDL_SCANCODE_DELETE,
482 SDL_SCANCODE_HOME,
483 SDL_SCANCODE_END,
484 SDL_SCANCODE_PAGEUP,
485 SDL_SCANCODE_PAGEDOWN,
486 SDL_SCANCODE_LEFT,
487 SDL_SCANCODE_RIGHT,
488 SDL_SCANCODE_UP,
489 SDL_SCANCODE_DOWN,
490 SDL_SCANCODE_KP_DIVIDE,
491 SDL_SCANCODE_KP_MULTIPLY,
492 SDL_SCANCODE_KP_MINUS,
493 SDL_SCANCODE_KP_PLUS,
494 SDL_SCANCODE_KP_PERIOD,
495 SDL_SCANCODE_KP_ENTER,
496 SDL_SCANCODE_PRINTSCREEN,
497 SDL_SCANCODE_PAUSE,
498 SDL_SCANCODE_UNKNOWN, (* !!! KEY_ABNT_C1 *)
499 SDL_SCANCODE_INTERNATIONAL3, (* ??? KEY_YEN *)
500 SDL_SCANCODE_LANG3, (* ??? KEY_KANA *)
501 SDL_SCANCODE_UNKNOWN, (* !!! KEY_CONVERT *)
502 SDL_SCANCODE_UNKNOWN, (* !!! KEY_NOCONVERT *)
503 SDL_SCANCODE_KP_AT,
504 SDL_SCANCODE_UNKNOWN, (* !!! KEY_CIRCUMFLEX *)
505 SDL_SCANCODE_KP_COLON,
506 SDL_SCANCODE_UNKNOWN, (* !!! KEY_KANJI *)
507 SDL_SCANCODE_KP_EQUALS,
508 SDL_SCANCODE_UNKNOWN, (* !!! KEY_BACKQUOTE *)
509 SDL_SCANCODE_SEMICOLON,
510 SDL_SCANCODE_LGUI,
511 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN1 *)
512 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN2 *)
513 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN3 *)
514 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN4 *)
515 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN5 *)
516 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN6 *)
517 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN7 *)
518 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN8 *)
519 SDL_SCANCODE_LSHIFT,
520 SDL_SCANCODE_RSHIFT,
521 SDL_SCANCODE_LCTRL,
522 SDL_SCANCODE_RCTRL,
523 SDL_SCANCODE_LALT,
524 SDL_SCANCODE_RALT,
525 SDL_SCANCODE_LGUI,
526 SDL_SCANCODE_RGUI,
527 SDL_SCANCODE_MODE, (* ??? KEY_MENU *)
528 SDL_SCANCODE_SCROLLLOCK,
529 SDL_SCANCODE_NUMLOCKCLEAR,
530 SDL_SCANCODE_CAPSLOCK,
531 SDL_SCANCODE_UNKNOWN (* KEY_MAX *)
532 );
534 function IsEmptyKeyboard: Boolean;
535 begin
536 result := keybeg = keyend
537 end;
539 function IsFullKeyboard: Boolean;
540 begin
541 result := (keybeg - 1) mod maxKeyBuffer = keyend
542 end;
544 function NextScancode: Integer;
545 begin
546 result := 0;
547 if not IsEmptyKeyboard then
548 begin
549 result := keyring[keybeg];
550 keybeg := (keybeg + 1) mod maxKeyBuffer
551 end
552 end;
554 procedure KeyboardWatcher (scancode: Integer); cdecl;
555 begin
556 if (keybeg - 1) mod maxKeyBuffer <> keyend then (* not IsFullKeyboard *)
557 begin
558 keyring[keyend] := scancode;
559 keyend := (keyend + 1) mod maxKeyBuffer
560 end
561 end;
562 procedure KeyboardWatcherEND; begin end;
564 /// MACRO ///
566 function SDL_PIXELFLAG(X: Cardinal): Cardinal;
567 begin
568 Result := (X shr 28) and $0F;
569 end;
571 function SDL_PIXELTYPE(X: Cardinal): Cardinal;
572 begin
573 Result := (X shr 24) and $0F;
574 end;
576 function SDL_PIXELORDER(X: Cardinal): Cardinal;
577 begin
578 Result := (X shr 20) and $0F;
579 end;
581 function SDL_PIXELLAYOUT(X: Cardinal): Cardinal;
582 begin
583 Result := (X shr 16) and $0F;
584 end;
586 function SDL_BITSPERPIXEL(X: Cardinal): Cardinal;
587 begin
588 Result := (X shr 8) and $FF;
589 end;
591 function SDL_IsPixelFormat_FOURCC(format: Variant): Boolean;
592 begin
593 Result := format and SDL_PIXELFLAG(format) <> 1;
594 end;
596 /// FUNCTIONS ////
598 (********** FILES **********)
600 function SDL_RWFromFile(const _file: PAnsiChar; const mode: PAnsiChar): PSDL_RWops;
601 begin
602 result := nil
603 end;
605 function SDL_RWFromConstMem(const mem: Pointer; size: SInt32): PSDL_RWops;
606 begin
607 result := nil
608 end;
610 (********** KEYBOARD **********)
612 function SDL_GetScancodeName(scancode: TSDL_ScanCode): PAnsiChar;
613 begin
614 case scancode of
615 SDL_SCANCODE_A: result := 'A';
616 SDL_SCANCODE_B: result := 'B';
617 SDL_SCANCODE_C: result := 'C';
618 SDL_SCANCODE_D: result := 'D';
619 SDL_SCANCODE_E: result := 'E';
620 SDL_SCANCODE_F: result := 'F';
621 SDL_SCANCODE_G: result := 'G';
622 SDL_SCANCODE_H: result := 'H';
623 SDL_SCANCODE_I: result := 'I';
624 SDL_SCANCODE_J: result := 'J';
625 SDL_SCANCODE_K: result := 'K';
626 SDL_SCANCODE_L: result := 'L';
627 SDL_SCANCODE_M: result := 'M';
628 SDL_SCANCODE_N: result := 'N';
629 SDL_SCANCODE_O: result := 'O';
630 SDL_SCANCODE_P: result := 'P';
631 SDL_SCANCODE_Q: result := 'Q';
632 SDL_SCANCODE_R: result := 'R';
633 SDL_SCANCODE_S: result := 'S';
634 SDL_SCANCODE_T: result := 'T';
635 SDL_SCANCODE_U: result := 'U';
636 SDL_SCANCODE_V: result := 'V';
637 SDL_SCANCODE_W: result := 'W';
638 SDL_SCANCODE_X: result := 'X';
639 SDL_SCANCODE_Y: result := 'Y';
640 SDL_SCANCODE_Z: result := 'Z';
641 SDL_SCANCODE_0: result := '0';
642 SDL_SCANCODE_1: result := '1';
643 SDL_SCANCODE_2: result := '2';
644 SDL_SCANCODE_3: result := '3';
645 SDL_SCANCODE_4: result := '4';
646 SDL_SCANCODE_5: result := '5';
647 SDL_SCANCODE_6: result := '6';
648 SDL_SCANCODE_7: result := '7';
649 SDL_SCANCODE_8: result := '8';
650 SDL_SCANCODE_9: result := '9';
651 SDL_SCANCODE_RETURN: result := 'Return';
652 SDL_SCANCODE_ESCAPE: result := 'Escape';
653 SDL_SCANCODE_BACKSPACE: result := 'Backspace';
654 SDL_SCANCODE_TAB: result := 'Tab';
655 SDL_SCANCODE_SPACE: result := 'Space';
656 SDL_SCANCODE_MINUS: result := '-';
657 SDL_SCANCODE_EQUALS: result := '=';
658 SDL_SCANCODE_LEFTBRACKET: result := '[';
659 SDL_SCANCODE_RIGHTBRACKET: result := ']';
660 SDL_SCANCODE_BACKSLASH: result := '\';
661 SDL_SCANCODE_SEMICOLON: result := ';';
662 SDL_SCANCODE_APOSTROPHE: result := '''';
663 SDL_SCANCODE_GRAVE: result := '`';
664 SDL_SCANCODE_COMMA: result := ',';
665 SDL_SCANCODE_PERIOD: result := '.';
666 SDL_SCANCODE_SLASH: result := '/';
667 SDL_SCANCODE_CAPSLOCK: result := 'CapsLock';
668 SDL_SCANCODE_F1: result := 'F1';
669 SDL_SCANCODE_F2: result := 'F2';
670 SDL_SCANCODE_F3: result := 'F3';
671 SDL_SCANCODE_F4: result := 'F4';
672 SDL_SCANCODE_F5: result := 'F5';
673 SDL_SCANCODE_F6: result := 'F6';
674 SDL_SCANCODE_F7: result := 'F7';
675 SDL_SCANCODE_F8: result := 'F8';
676 SDL_SCANCODE_F9: result := 'F9';
677 SDL_SCANCODE_F10: result := 'F10';
678 SDL_SCANCODE_F11: result := 'F11';
679 SDL_SCANCODE_F12: result := 'F12';
680 SDL_SCANCODE_PRINTSCREEN: result := 'PrintScreen';
681 SDL_SCANCODE_SCROLLLOCK: result := 'ScrollLock';
682 SDL_SCANCODE_PAUSE: result := 'Pause';
683 SDL_SCANCODE_INSERT: result := 'Insert';
684 SDL_SCANCODE_HOME: result := 'Home';
685 SDL_SCANCODE_PAGEUP: result := 'PageUp';
686 SDL_SCANCODE_DELETE: result := 'Delete';
687 SDL_SCANCODE_END: result := 'End';
688 SDL_SCANCODE_PAGEDOWN: result := 'PageDown';
689 SDL_SCANCODE_RIGHT: result := 'Right';
690 SDL_SCANCODE_LEFT: result := 'Left';
691 SDL_SCANCODE_DOWN: result := 'Down';
692 SDL_SCANCODE_UP: result := 'Up';
693 SDL_SCANCODE_NUMLOCKCLEAR: result := 'Numlock';
694 SDL_SCANCODE_KP_DIVIDE: result := 'Keypad /';
695 SDL_SCANCODE_KP_MULTIPLY: result := 'Keypad *';
696 SDL_SCANCODE_KP_MINUS: result := 'Keypad -';
697 SDL_SCANCODE_KP_PLUS: result := 'Keypad +';
698 SDL_SCANCODE_KP_ENTER: result := 'Keypad Enter';
699 SDL_SCANCODE_KP_1: result := 'Keypad 1';
700 SDL_SCANCODE_KP_2: result := 'Keypad 2';
701 SDL_SCANCODE_KP_3: result := 'Keypad 3';
702 SDL_SCANCODE_KP_4: result := 'Keypad 4';
703 SDL_SCANCODE_KP_5: result := 'Keypad 5';
704 SDL_SCANCODE_KP_6: result := 'Keypad 6';
705 SDL_SCANCODE_KP_7: result := 'Keypad 7';
706 SDL_SCANCODE_KP_8: result := 'Keypad 8';
707 SDL_SCANCODE_KP_9: result := 'Keypad 9';
708 SDL_SCANCODE_KP_0: result := 'Keypad 0';
709 SDL_SCANCODE_KP_PERIOD: result := 'Keypad .';
710 SDL_SCANCODE_APPLICATION: result := 'Application';
711 SDL_SCANCODE_POWER: result := 'Power';
712 SDL_SCANCODE_KP_EQUALS: result := 'Keypad =';
713 (* !!! F1x/F2x and multimedia ... *)
714 SDL_SCANCODE_KP_COMMA: result := 'Keypad ,';
715 SDL_SCANCODE_KP_EQUALSAS400: result := 'Keypad = (AS400)';
716 SDL_SCANCODE_ALTERASE: result := 'AltErase';
717 SDL_SCANCODE_SYSREQ: result := 'SysReq';
718 SDL_SCANCODE_CANCEL: result := 'Cancel';
719 SDL_SCANCODE_CLEAR: result := 'Clear';
720 SDL_SCANCODE_PRIOR: result := 'Prior';
721 SDL_SCANCODE_RETURN2: result := 'Return';
722 SDL_SCANCODE_SEPARATOR: result := 'Separator';
723 SDL_SCANCODE_OUT: result := 'Out';
724 SDL_SCANCODE_OPER: result := 'Oper';
725 SDL_SCANCODE_CLEARAGAIN: result := 'Clear / Again';
726 SDL_SCANCODE_CRSEL: result := 'CrSel';
727 SDL_SCANCODE_EXSEL: result := 'ExSel';
728 (* !!! Additional KP *)
729 SDL_SCANCODE_LCTRL: result := 'Left Ctrl';
730 SDL_SCANCODE_LSHIFT: result := 'Left Shift';
731 SDL_SCANCODE_LALT: result := 'Left Alt';
732 SDL_SCANCODE_LGUI: result := 'Left GUI';
733 SDL_SCANCODE_RCTRL: result := 'Right Ctrl';
734 SDL_SCANCODE_RSHIFT: result := 'Right Shift';
735 SDL_SCANCODE_RALT: result := 'Right Alt';
736 SDL_SCANCODE_RGUI: result := 'Right GUI';
737 SDL_SCANCODE_MODE: result := 'ModeSwitch';
738 (* !!! ... *)
739 else
740 result := ''
741 end
742 end;
744 function SDL_IsTextInputActive: TSDL_Bool;
745 begin
746 if inputText then
747 result := SDL_TRUE
748 else
749 result := SDL_FALSE
750 end;
752 procedure SDL_StartTextInput;
753 begin
754 inputText := True
755 end;
757 procedure SDL_StopTextInput;
758 begin
759 inputText := False
760 end;
762 (********** JOYSTICK **********)
764 function SDL_NumJoysticks: SInt32;
765 begin
766 result := 0
767 end;
769 function SDL_JoystickOpen(device_index: SInt32): PSDL_Joystick;
770 begin
771 result := nil
772 end;
774 function SDL_JoystickName(joystick: PSDL_Joystick): PAnsiChar;
775 begin
776 result := ''
777 end;
779 function SDL_JoystickNumAxes(joystick: PSDL_Joystick): SInt32;
780 begin
781 result := 0
782 end;
784 function SDL_JoystickNumButtons(joystick: PSDL_Joystick): SInt32;
785 begin
786 result := 0
787 end;
789 function SDL_JoystickNumHats(joystick: PSDL_Joystick): SInt32;
790 begin
791 result := 0
792 end;
794 procedure SDL_JoystickClose(joystick: PSDL_Joystick);
795 begin
796 end;
798 procedure SDL_JoystickUpdate;
799 begin
800 end;
802 function SDL_JoystickGetButton(joystick: PSDL_Joystick; button: SInt32): UInt8;
803 begin
804 result := 0
805 end;
807 function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: SInt32): SInt16;
808 begin
809 result := 0
810 end;
812 function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: SInt32): UInt8;
813 begin
814 result := 0
815 end;
817 (********** TOUCH **********)
819 function SDL_GetNumTouchDevices: SInt32;
820 begin
821 result := 0
822 end;
824 (********** TIMERS **********)
826 procedure AllegroTimerCallback; cdecl;
827 begin
828 inc(ticks)
829 end;
830 procedure AllegroTimerCallbackEND; begin end;
832 function SDL_GetPerformanceCounter: UInt64;
833 begin
834 result := ticks (* !!! *)
835 end;
837 function SDL_GetPerformanceFrequency: UInt64;
838 begin
839 result := 1 (* !!! *)
840 end;
842 procedure SDL_Delay(ms: UInt32);
843 begin
844 rest(ms)
845 end;
847 function SDL_GetTicks: UInt32;
848 begin
849 result := ticks;
850 end;
852 (********** DISPLAY MODES **********)
854 function SDL_GetDesktopDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
855 begin
856 e_LogWritefln('SDL_GetDesktopDisplayMode %s', [displayIndex]);
857 result := -1;
858 mode.format := SDL_PIXELFORMAT_UNKNOWN; (* !!! *)
859 mode.refresh_rate := 0;
860 mode.driverdata := nil;
861 if get_desktop_resolution(@mode.w, @mode.h) = 0 then
862 result := 0
863 end;
865 function SDL_GetClosestDisplayMode(displayIndex: SInt32; const mode: PSDL_DisplayMode; closest: PSDL_DisplayMode): PSDL_DisplayMode;
866 begin
867 e_LogWritefln('SDL_GetClosestDisplayMode %s', [displayIndex]);
868 result := nil;
869 end;
871 function SDL_GetNumDisplayModes(displayIndex: SInt32): SInt32;
872 var m: PGFX_MODE_LIST;
873 begin
874 e_LogWritefln('SDL_GetNumDisplayModes %s', [displayIndex]);
875 result := -1;
876 m := get_gfx_mode_list(GFX_AUTODETECT);
877 if m <> nil then
878 begin
879 result := m.num_modes;
880 destroy_gfx_mode_list(m);
881 end
882 end;
884 function SDL_GetDisplayMode(displayIndex: SInt32; modeIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
885 var m: PGFX_MODE_LIST;
886 begin
887 e_LogWritefln('SDL_GetDisplayMode %s %s', [displayIndex, modeIndex]);
888 result := -1;
889 m := get_gfx_mode_list(GFX_AUTODETECT);
890 if (m <> nil) and (modeIndex >= 0) and (modeIndex < m.num_modes) then
891 begin
892 mode.format := SDL_PIXELFORMAT_UNKNOWN; (* FIX IT *)
893 mode.w := m.mode[modeIndex].width;
894 mode.h := m.mode[modeIndex].height;
895 mode.refresh_rate := 0;
896 mode.driverdata := nil;
897 destroy_gfx_mode_list(m);
898 result := 0
899 end
900 end;
902 function SDL_GetDisplayDPI(displayIndex: SInt32; ddpi, hdpi, vdpi: PFloat): SInt32;
903 begin
904 result := -1
905 end;
907 (*********** WINDOW MANAGEMENT **********)
909 function SDL_CreateWindow(const title: PAnsiChar; x: SInt32; y: SInt32; w: SInt32; h: SInt32; flags: UInt32): PSDL_Window;
910 var window: PSDL_Window; mode: Integer;
911 begin
912 e_LogWritefln('SDL_CreateWindow %s %s %s %s %s %u', [title, x, y, w, h, flags]);
913 result := nil;
915 {$IF DEFINED(GO32V2)}
916 mode := GFX_AUTODETECT;
917 {$ELSE}
918 if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
919 mode := GFX_AUTODETECT_FULLSCREEN
920 else
921 mode := GFX_AUTODETECT_WINDOWED;
922 {$ENDIF}
924 sdl2allegro_bpp := gBPP;
925 set_color_depth(sdl2allegro_bpp);
926 if set_gfx_mode(mode, w, h, 0, 0) = 0 then
927 begin
928 new(window);
929 set_window_title(title);
930 if sdl2allegro_screen <> nil then
931 destroy_bitmap(sdl2allegro_screen);
932 sdl2allegro_screen := create_system_bitmap(w, h);
933 if sdl2allegro_screen = nil then
934 sdl2allegro_screen := create_bitmap(w, h);
935 ASSERT(sdl2allegro_screen <> nil);
936 window.w := w;
937 window.h := h;
938 window.mode := mode;
939 result := window
940 end
941 end;
943 function SDL_SetWindowFullscreen(window: PSDL_Window; flags: UInt32): SInt32;
944 var mode: Integer;
945 begin
946 e_LogWritefln('SDL_SetWindowFullscreen %u', [flags]);
947 result := -1;
948 if window = nil then exit;
950 {$IF DEFINED(GO32V2)}
951 mode := GFX_AUTODETECT;
952 {$ELSE}
953 if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
954 mode := GFX_AUTODETECT_FULLSCREEN
955 else
956 mode := GFX_AUTODETECT_WINDOWED;
957 {$ENDIF}
959 set_color_depth(sdl2allegro_bpp);
960 if set_gfx_mode(mode, window.w, window.h, 0, 0) = 0 then
961 begin
962 if sdl2allegro_screen <> nil then
963 destroy_bitmap(sdl2allegro_screen);
964 sdl2allegro_screen := create_system_bitmap(window.w, window.h);
965 if sdl2allegro_screen = nil then
966 sdl2allegro_screen := create_bitmap(window.w, window.h);
967 ASSERT(sdl2allegro_screen <> nil);
968 set_palette(desktop_palette);
969 window.mode := mode;
970 result := 0
971 end
972 end;
974 procedure SDL_SetWindowSize(window: PSDL_Window; w: SInt32; h: SInt32);
975 begin
976 e_LogWritefln('SDL_SetWindowSize %s %s', [w, h]);
977 if window = nil then exit;
979 set_color_depth(sdl2allegro_bpp);
980 if set_gfx_mode(window.mode, w, h, 0, 0) = 0 then
981 begin
982 if sdl2allegro_screen <> nil then
983 destroy_bitmap(sdl2allegro_screen);
984 sdl2allegro_screen := create_system_bitmap(w, h);
985 if sdl2allegro_screen = nil then
986 sdl2allegro_screen := create_bitmap(w, h);
987 ASSERT(sdl2allegro_screen <> nil);
988 set_palette(desktop_palette);
989 window.w := w;
990 window.h := h;
991 end
992 end;
994 procedure SDL_DestroyWindow(window: PSDL_Window);
995 begin
996 e_LogWriteln('SDL_DestroyWindow');
997 if window = nil then exit;
998 if sdl2allegro_screen <> nil then
999 destroy_bitmap(sdl2allegro_screen);
1000 sdl2allegro_screen := nil;
1001 dispose(window)
1002 end;
1004 procedure SDL_GetWindowSize(window: PSDL_Window; w: PInt; h: PInt);
1005 begin
1006 e_LogWriteln('SDL_GetWindowSize');
1007 if window = nil then exit;
1008 if w <> nil then
1009 w^ := window.w;
1010 if h <> nil then
1011 h^ := window.h;
1012 end;
1014 procedure SDL_RestoreWindow(window: PSDL_Window);
1015 begin
1016 e_LogWriteln('SDL_RestoreWindow');
1017 if window = nil then exit;
1018 (* stub *)
1019 end;
1021 function SDL_SetWindowGammaRamp(window: PSDL_Window; const red: PUInt16; const green: PUInt16; const blue: PUInt16): SInt32;
1022 begin
1023 e_LogWriteln('SDL_SetWindowGammaRamp');
1024 result := -1;
1025 if window = nil then exit;
1026 result := 0
1027 end;
1029 function SDL_GetWindowGammaRamp(window: PSDL_Window; red: PUInt16; green: PUInt16; blue: PUInt16): SInt32;
1030 begin
1031 e_LogWriteln('SDL_GetWindowGammaRamp');
1032 result := -1;
1033 if window = nil then exit;
1034 result := 0
1035 end;
1037 (********** OPENGL MANAGEMENT **********)
1039 function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
1040 begin
1041 e_LogWritefln('SDL_GL_SetAttribute %s %s', [attr, value]);
1042 allegro_error := 'Attribute ' + IntToStr(attr) + ' := ' + IntToStr(value) + 'not supported';
1043 result := -1
1044 end;
1046 function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
1047 begin
1048 e_LogWritefln('SDL_GL_GetAttribute %s', [attr]);
1049 value^ := 0; result := -1
1050 end;
1052 function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
1053 begin
1054 e_LogWriteln('SDL_GL_CreateContext');
1055 result := window
1056 end;
1058 function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
1059 begin
1060 e_LogWriteln('SDL_GL_MakeCurrent');
1061 result := 0
1062 end;
1064 procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
1065 begin
1066 e_LogWriteln('SDL_GL_DeleteContext');
1067 end;
1069 function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
1070 begin
1071 e_LogWritefln('SDL_GL_SetSwapInterval %s', [interval]);
1072 result := 0
1073 end;
1075 procedure SDL_GL_SwapWindow(window: PSDL_Window);
1076 begin
1077 ASSERT(sdl2allegro_screen <> nil);
1078 acquire_screen;
1079 blit(sdl2allegro_screen, screen, 0, 0, 0, 0, sdl2allegro_screen.w, sdl2allegro_screen.h);
1080 show_video_bitmap(screen);
1081 release_screen;
1082 end;
1084 (********** EVENTS **********)
1086 function SDL_PushEvent(event: PSDL_Event): SInt32;
1087 begin
1088 result := 1;
1089 case event.type_ of
1090 SDL_QUITEV: quit := True;
1091 else ASSERT(FALSE); result := 0
1092 end
1093 end;
1095 function SDL_PollEvent(event: PSDL_Event): SInt32;
1096 var alscan: Integer; pressed, shift, caps: Boolean;
1097 begin
1098 result := 0;
1100 if quit then
1101 begin
1102 quit := False;
1103 event.type_ := SDL_QUITEV;
1104 event.quit.timestamp := ticks;
1105 result := 1;
1106 Exit
1107 end;
1109 if inputText and (inputChar <> #0) then
1110 begin
1111 event.type_ := SDL_TEXTINPUT;
1112 event.text.timestamp := ticks;
1113 event.text.windowID := 0;
1114 event.text.text[0] := inputChar;
1115 event.text.text[1] := #0;
1116 inputChar := #0;
1117 result := 1;
1118 Exit
1119 end;
1121 poll_keyboard;
1122 if not IsEmptyKeyboard then
1123 begin
1124 alscan := NextScancode;
1125 pressed := alscan and $80 = 0;
1126 if pressed then
1127 begin
1128 shift := key_shifts and KB_SHIFT_FLAG <> 0;
1129 caps := key_shifts and KB_CAPSLOCK_FLAG <> 0;
1130 if shift xor caps then
1131 inputChar := s2uc[alscan and $7F]
1132 else
1133 inputChar := s2lc[alscan and $7F];
1134 event.type_ := SDL_KEYDOWN
1135 end
1136 else
1137 begin
1138 inputChar := #0;
1139 event.type_ := SDL_KEYUP
1140 end;
1141 event.key.timestamp := ticks;
1142 event.key.windowID := 0;
1143 (**** df not use it?
1144 if pressed then
1145 event.key.state := SDL_PRESSED
1146 else
1147 event.key.state := SDL_RELEASED;
1148 ****)
1149 event.key._repeat := 0;
1150 event.key.keysym.scancode := s2sa[alscan and $7F];
1151 event.key.keysym.sym := 0; (* df not use it? *)
1152 event.key.keysym._mod := 0; (* df not use it? *)
1153 result := 1;
1154 Exit
1155 end
1156 end;
1158 (********** MOUSE **********)
1160 function SDL_ShowCursor(toggle: SInt32): SInt32;
1161 begin
1162 e_LogWritefln('SDL_ShowCursor %s', [toggle]);
1163 (* TODO *)
1164 result := 0
1165 end;
1167 (********** SDL **********)
1169 procedure AllegroQuitCallback; cdecl;
1170 begin
1171 quit := True
1172 end;
1173 procedure AllegroQuitCallbackEND; begin end;
1175 function SDL_SetHint( const name: PChar; const value: PChar) : boolean;
1176 begin
1177 e_LogWritefln('SDL_SetHint %s %s', [name, value]);
1178 (* TODO *)
1179 result := false
1180 end;
1182 function SDL_GetError: PAnsiChar;
1183 begin
1184 result := allegro_error;
1185 end;
1187 {$IFDEF GO32V2}
1188 (* HACK: allegro crashes while init without this *)
1189 var
1190 __crt0_argv: PPchar; cvar; external;
1191 myargv: array [0..1] of Pchar;
1193 procedure FIX_ARGV;
1194 begin
1195 __crt0_argv := @myargv[0];
1196 myargv[0] := PChar(ParamStr(0));
1197 e_LogWritefln('argv[0] = %s', [myargv[0]]);
1198 end;
1199 {$ENDIF}
1201 function SDL_Init(flags: UInt32): SInt32;
1202 begin
1203 result := -1;
1204 {$IFDEF GO32V2}
1205 FIX_ARGV;
1206 {$ENDIF}
1207 if allegro_init = 0 then
1208 begin
1209 e_LogWriteln('Allegro Init: ok');
1210 {$IFDEF GO32V2}
1211 (* without this df dies with fire when swapped *)
1212 lock_data(ticks, sizeof(ticks));
1213 lock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
1214 lock_data(keybeg, sizeof(keybeg));
1215 lock_data(keyend, sizeof(keyend));
1216 lock_data(keyring, sizeof(keyring));
1217 lock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
1218 lock_data(quit, sizeof(quit));
1219 lock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
1220 {$ENDIF}
1221 install_timer;
1222 install_keyboard;
1223 keyboard_lowlevel_callback := KeyboardWatcher;
1224 set_keyboard_rate(0, 0);
1225 install_int_ex(AllegroTimerCallback, MSEC_TO_TIMER(1));
1226 set_close_button_callback(AllegroQuitCallback);
1227 result := 0
1228 end
1229 end;
1231 procedure SDL_Quit;
1232 begin
1233 set_close_button_callback(nil);
1234 remove_keyboard;
1235 remove_timer;
1236 {$IFDEF GO32V2}
1237 unlock_data(ticks, sizeof(ticks));
1238 unlock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
1239 unlock_data(keybeg, sizeof(keybeg));
1240 unlock_data(keyend, sizeof(keyend));
1241 unlock_data(keyring, sizeof(keyring));
1242 unlock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
1243 unlock_data(quit, sizeof(quit));
1244 unlock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
1245 {$ENDIF}
1246 allegro_exit
1247 end;