DEADSOFTWARE

Fix resolution detecting, add vsync
[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, Math, ctypes;
372 const
373 maxKeyBuffer = 64;
375 var
376 deskw, deskh, deskbpp: Integer;
377 keyring: array [0..maxKeyBuffer - 1] of Integer;
378 keybeg, keyend: Integer;
379 inputChar: Char;
380 inputText: Boolean;
381 useVsync: Boolean;
382 ticks: UInt32;
383 quit: Boolean;
385 s2lc: array [0..KEY_MAX] of char = (
386 #00, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
387 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4',
388 '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
389 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '`', '-', '=', #00,
390 #09, '[', ']', #10, ';', #39, '\', '\', ',', '.', '/', ' ', #00, #00, #00, #00,
391 #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
392 #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
393 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
394 );
395 s2uc: array [0..KEY_MAX] of char = (
396 #00, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
397 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ')', '!', '@', '#', '$',
398 '%', '^', '&', '*', '(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
399 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '~', '_', '+', #00,
400 #09, '{', '}', #10, ':', '"', '|', '|', '<', '>', '?', ' ', #00, #00, #00, #00,
401 #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
402 #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
403 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
404 );
405 s2sa: array [0..KEY_MAX] of Integer = (
406 SDL_SCANCODE_UNKNOWN,
407 SDL_SCANCODE_A,
408 SDL_SCANCODE_B,
409 SDL_SCANCODE_C,
410 SDL_SCANCODE_D,
411 SDL_SCANCODE_E,
412 SDL_SCANCODE_F,
413 SDL_SCANCODE_G,
414 SDL_SCANCODE_H,
415 SDL_SCANCODE_I,
416 SDL_SCANCODE_J,
417 SDL_SCANCODE_K,
418 SDL_SCANCODE_L,
419 SDL_SCANCODE_M,
420 SDL_SCANCODE_N,
421 SDL_SCANCODE_O,
422 SDL_SCANCODE_P,
423 SDL_SCANCODE_Q,
424 SDL_SCANCODE_R,
425 SDL_SCANCODE_S,
426 SDL_SCANCODE_T,
427 SDL_SCANCODE_U,
428 SDL_SCANCODE_V,
429 SDL_SCANCODE_W,
430 SDL_SCANCODE_X,
431 SDL_SCANCODE_Y,
432 SDL_SCANCODE_Z,
433 SDL_SCANCODE_0,
434 SDL_SCANCODE_1,
435 SDL_SCANCODE_2,
436 SDL_SCANCODE_3,
437 SDL_SCANCODE_4,
438 SDL_SCANCODE_5,
439 SDL_SCANCODE_6,
440 SDL_SCANCODE_7,
441 SDL_SCANCODE_8,
442 SDL_SCANCODE_9,
443 SDL_SCANCODE_KP_0,
444 SDL_SCANCODE_KP_1,
445 SDL_SCANCODE_KP_2,
446 SDL_SCANCODE_KP_3,
447 SDL_SCANCODE_KP_4,
448 SDL_SCANCODE_KP_5,
449 SDL_SCANCODE_KP_6,
450 SDL_SCANCODE_KP_7,
451 SDL_SCANCODE_KP_8,
452 SDL_SCANCODE_KP_9,
453 SDL_SCANCODE_F1,
454 SDL_SCANCODE_F2,
455 SDL_SCANCODE_F3,
456 SDL_SCANCODE_F4,
457 SDL_SCANCODE_F5,
458 SDL_SCANCODE_F6,
459 SDL_SCANCODE_F7,
460 SDL_SCANCODE_F8,
461 SDL_SCANCODE_F9,
462 SDL_SCANCODE_F10,
463 SDL_SCANCODE_F11,
464 SDL_SCANCODE_F12,
465 SDL_SCANCODE_ESCAPE,
466 SDL_SCANCODE_GRAVE,
467 SDL_SCANCODE_MINUS,
468 SDL_SCANCODE_EQUALS,
469 SDL_SCANCODE_BACKSPACE,
470 SDL_SCANCODE_TAB,
471 SDL_SCANCODE_LEFTBRACKET,
472 SDL_SCANCODE_RIGHTBRACKET,
473 SDL_SCANCODE_RETURN,
474 SDL_SCANCODE_SEMICOLON,
475 SDL_SCANCODE_APOSTROPHE,
476 SDL_SCANCODE_BACKSLASH,
477 SDL_SCANCODE_NONUSHASH,
478 SDL_SCANCODE_COMMA,
479 SDL_SCANCODE_UNKNOWN, (* !!! KEY_STOP *)
480 SDL_SCANCODE_SLASH,
481 SDL_SCANCODE_SPACE,
482 SDL_SCANCODE_INSERT,
483 SDL_SCANCODE_DELETE,
484 SDL_SCANCODE_HOME,
485 SDL_SCANCODE_END,
486 SDL_SCANCODE_PAGEUP,
487 SDL_SCANCODE_PAGEDOWN,
488 SDL_SCANCODE_LEFT,
489 SDL_SCANCODE_RIGHT,
490 SDL_SCANCODE_UP,
491 SDL_SCANCODE_DOWN,
492 SDL_SCANCODE_KP_DIVIDE,
493 SDL_SCANCODE_KP_MULTIPLY,
494 SDL_SCANCODE_KP_MINUS,
495 SDL_SCANCODE_KP_PLUS,
496 SDL_SCANCODE_KP_PERIOD,
497 SDL_SCANCODE_KP_ENTER,
498 SDL_SCANCODE_PRINTSCREEN,
499 SDL_SCANCODE_PAUSE,
500 SDL_SCANCODE_UNKNOWN, (* !!! KEY_ABNT_C1 *)
501 SDL_SCANCODE_INTERNATIONAL3, (* ??? KEY_YEN *)
502 SDL_SCANCODE_LANG3, (* ??? KEY_KANA *)
503 SDL_SCANCODE_UNKNOWN, (* !!! KEY_CONVERT *)
504 SDL_SCANCODE_UNKNOWN, (* !!! KEY_NOCONVERT *)
505 SDL_SCANCODE_KP_AT,
506 SDL_SCANCODE_UNKNOWN, (* !!! KEY_CIRCUMFLEX *)
507 SDL_SCANCODE_KP_COLON,
508 SDL_SCANCODE_UNKNOWN, (* !!! KEY_KANJI *)
509 SDL_SCANCODE_KP_EQUALS,
510 SDL_SCANCODE_UNKNOWN, (* !!! KEY_BACKQUOTE *)
511 SDL_SCANCODE_SEMICOLON,
512 SDL_SCANCODE_LGUI,
513 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN1 *)
514 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN2 *)
515 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN3 *)
516 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN4 *)
517 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN5 *)
518 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN6 *)
519 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN7 *)
520 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN8 *)
521 SDL_SCANCODE_LSHIFT,
522 SDL_SCANCODE_RSHIFT,
523 SDL_SCANCODE_LCTRL,
524 SDL_SCANCODE_RCTRL,
525 SDL_SCANCODE_LALT,
526 SDL_SCANCODE_RALT,
527 SDL_SCANCODE_LGUI,
528 SDL_SCANCODE_RGUI,
529 SDL_SCANCODE_MODE, (* ??? KEY_MENU *)
530 SDL_SCANCODE_SCROLLLOCK,
531 SDL_SCANCODE_NUMLOCKCLEAR,
532 SDL_SCANCODE_CAPSLOCK,
533 SDL_SCANCODE_UNKNOWN (* KEY_MAX *)
534 );
536 function IsEmptyKeyboard: Boolean;
537 begin
538 result := keybeg = keyend
539 end;
541 function IsFullKeyboard: Boolean;
542 begin
543 result := (keybeg - 1) mod maxKeyBuffer = keyend
544 end;
546 function NextScancode: Integer;
547 begin
548 result := 0;
549 if not IsEmptyKeyboard then
550 begin
551 result := keyring[keybeg];
552 keybeg := (keybeg + 1) mod maxKeyBuffer
553 end
554 end;
556 procedure KeyboardWatcher (scancode: Integer); cdecl;
557 begin
558 if (keybeg - 1) mod maxKeyBuffer <> keyend then (* not IsFullKeyboard *)
559 begin
560 keyring[keyend] := scancode;
561 keyend := (keyend + 1) mod maxKeyBuffer
562 end
563 end;
564 procedure KeyboardWatcherEND; begin end;
566 /// MACRO ///
568 function SDL_PIXELFLAG(X: Cardinal): Cardinal;
569 begin
570 Result := (X shr 28) and $0F;
571 end;
573 function SDL_PIXELTYPE(X: Cardinal): Cardinal;
574 begin
575 Result := (X shr 24) and $0F;
576 end;
578 function SDL_PIXELORDER(X: Cardinal): Cardinal;
579 begin
580 Result := (X shr 20) and $0F;
581 end;
583 function SDL_PIXELLAYOUT(X: Cardinal): Cardinal;
584 begin
585 Result := (X shr 16) and $0F;
586 end;
588 function SDL_BITSPERPIXEL(X: Cardinal): Cardinal;
589 begin
590 Result := (X shr 8) and $FF;
591 end;
593 function SDL_IsPixelFormat_FOURCC(format: Variant): Boolean;
594 begin
595 Result := format and SDL_PIXELFLAG(format) <> 1;
596 end;
598 /// FUNCTIONS ////
600 (********** FILES **********)
602 function SDL_RWFromFile(const _file: PAnsiChar; const mode: PAnsiChar): PSDL_RWops;
603 begin
604 result := nil (* stub, used for sdl2stub_mixer *)
605 end;
607 function SDL_RWFromConstMem(const mem: Pointer; size: SInt32): PSDL_RWops;
608 begin
609 result := nil (* stub, used for sdl2stub_mixer *)
610 end;
612 (********** KEYBOARD **********)
614 function SDL_GetScancodeName(scancode: TSDL_ScanCode): PAnsiChar;
615 begin
616 case scancode of
617 SDL_SCANCODE_A: result := 'A';
618 SDL_SCANCODE_B: result := 'B';
619 SDL_SCANCODE_C: result := 'C';
620 SDL_SCANCODE_D: result := 'D';
621 SDL_SCANCODE_E: result := 'E';
622 SDL_SCANCODE_F: result := 'F';
623 SDL_SCANCODE_G: result := 'G';
624 SDL_SCANCODE_H: result := 'H';
625 SDL_SCANCODE_I: result := 'I';
626 SDL_SCANCODE_J: result := 'J';
627 SDL_SCANCODE_K: result := 'K';
628 SDL_SCANCODE_L: result := 'L';
629 SDL_SCANCODE_M: result := 'M';
630 SDL_SCANCODE_N: result := 'N';
631 SDL_SCANCODE_O: result := 'O';
632 SDL_SCANCODE_P: result := 'P';
633 SDL_SCANCODE_Q: result := 'Q';
634 SDL_SCANCODE_R: result := 'R';
635 SDL_SCANCODE_S: result := 'S';
636 SDL_SCANCODE_T: result := 'T';
637 SDL_SCANCODE_U: result := 'U';
638 SDL_SCANCODE_V: result := 'V';
639 SDL_SCANCODE_W: result := 'W';
640 SDL_SCANCODE_X: result := 'X';
641 SDL_SCANCODE_Y: result := 'Y';
642 SDL_SCANCODE_Z: result := 'Z';
643 SDL_SCANCODE_0: result := '0';
644 SDL_SCANCODE_1: result := '1';
645 SDL_SCANCODE_2: result := '2';
646 SDL_SCANCODE_3: result := '3';
647 SDL_SCANCODE_4: result := '4';
648 SDL_SCANCODE_5: result := '5';
649 SDL_SCANCODE_6: result := '6';
650 SDL_SCANCODE_7: result := '7';
651 SDL_SCANCODE_8: result := '8';
652 SDL_SCANCODE_9: result := '9';
653 SDL_SCANCODE_RETURN: result := 'Return';
654 SDL_SCANCODE_ESCAPE: result := 'Escape';
655 SDL_SCANCODE_BACKSPACE: result := 'Backspace';
656 SDL_SCANCODE_TAB: result := 'Tab';
657 SDL_SCANCODE_SPACE: result := 'Space';
658 SDL_SCANCODE_MINUS: result := '-';
659 SDL_SCANCODE_EQUALS: result := '=';
660 SDL_SCANCODE_LEFTBRACKET: result := '[';
661 SDL_SCANCODE_RIGHTBRACKET: result := ']';
662 SDL_SCANCODE_BACKSLASH: result := '\';
663 SDL_SCANCODE_SEMICOLON: result := ';';
664 SDL_SCANCODE_APOSTROPHE: result := '''';
665 SDL_SCANCODE_GRAVE: result := '`';
666 SDL_SCANCODE_COMMA: result := ',';
667 SDL_SCANCODE_PERIOD: result := '.';
668 SDL_SCANCODE_SLASH: result := '/';
669 SDL_SCANCODE_CAPSLOCK: result := 'CapsLock';
670 SDL_SCANCODE_F1: result := 'F1';
671 SDL_SCANCODE_F2: result := 'F2';
672 SDL_SCANCODE_F3: result := 'F3';
673 SDL_SCANCODE_F4: result := 'F4';
674 SDL_SCANCODE_F5: result := 'F5';
675 SDL_SCANCODE_F6: result := 'F6';
676 SDL_SCANCODE_F7: result := 'F7';
677 SDL_SCANCODE_F8: result := 'F8';
678 SDL_SCANCODE_F9: result := 'F9';
679 SDL_SCANCODE_F10: result := 'F10';
680 SDL_SCANCODE_F11: result := 'F11';
681 SDL_SCANCODE_F12: result := 'F12';
682 SDL_SCANCODE_PRINTSCREEN: result := 'PrintScreen';
683 SDL_SCANCODE_SCROLLLOCK: result := 'ScrollLock';
684 SDL_SCANCODE_PAUSE: result := 'Pause';
685 SDL_SCANCODE_INSERT: result := 'Insert';
686 SDL_SCANCODE_HOME: result := 'Home';
687 SDL_SCANCODE_PAGEUP: result := 'PageUp';
688 SDL_SCANCODE_DELETE: result := 'Delete';
689 SDL_SCANCODE_END: result := 'End';
690 SDL_SCANCODE_PAGEDOWN: result := 'PageDown';
691 SDL_SCANCODE_RIGHT: result := 'Right';
692 SDL_SCANCODE_LEFT: result := 'Left';
693 SDL_SCANCODE_DOWN: result := 'Down';
694 SDL_SCANCODE_UP: result := 'Up';
695 SDL_SCANCODE_NUMLOCKCLEAR: result := 'Numlock';
696 SDL_SCANCODE_KP_DIVIDE: result := 'Keypad /';
697 SDL_SCANCODE_KP_MULTIPLY: result := 'Keypad *';
698 SDL_SCANCODE_KP_MINUS: result := 'Keypad -';
699 SDL_SCANCODE_KP_PLUS: result := 'Keypad +';
700 SDL_SCANCODE_KP_ENTER: result := 'Keypad Enter';
701 SDL_SCANCODE_KP_1: result := 'Keypad 1';
702 SDL_SCANCODE_KP_2: result := 'Keypad 2';
703 SDL_SCANCODE_KP_3: result := 'Keypad 3';
704 SDL_SCANCODE_KP_4: result := 'Keypad 4';
705 SDL_SCANCODE_KP_5: result := 'Keypad 5';
706 SDL_SCANCODE_KP_6: result := 'Keypad 6';
707 SDL_SCANCODE_KP_7: result := 'Keypad 7';
708 SDL_SCANCODE_KP_8: result := 'Keypad 8';
709 SDL_SCANCODE_KP_9: result := 'Keypad 9';
710 SDL_SCANCODE_KP_0: result := 'Keypad 0';
711 SDL_SCANCODE_KP_PERIOD: result := 'Keypad .';
712 SDL_SCANCODE_APPLICATION: result := 'Application';
713 SDL_SCANCODE_POWER: result := 'Power';
714 SDL_SCANCODE_KP_EQUALS: result := 'Keypad =';
715 (* !!! F1x/F2x and multimedia ... *)
716 SDL_SCANCODE_KP_COMMA: result := 'Keypad ,';
717 SDL_SCANCODE_KP_EQUALSAS400: result := 'Keypad = (AS400)';
718 SDL_SCANCODE_ALTERASE: result := 'AltErase';
719 SDL_SCANCODE_SYSREQ: result := 'SysReq';
720 SDL_SCANCODE_CANCEL: result := 'Cancel';
721 SDL_SCANCODE_CLEAR: result := 'Clear';
722 SDL_SCANCODE_PRIOR: result := 'Prior';
723 SDL_SCANCODE_RETURN2: result := 'Return';
724 SDL_SCANCODE_SEPARATOR: result := 'Separator';
725 SDL_SCANCODE_OUT: result := 'Out';
726 SDL_SCANCODE_OPER: result := 'Oper';
727 SDL_SCANCODE_CLEARAGAIN: result := 'Clear / Again';
728 SDL_SCANCODE_CRSEL: result := 'CrSel';
729 SDL_SCANCODE_EXSEL: result := 'ExSel';
730 (* !!! Additional KP *)
731 SDL_SCANCODE_LCTRL: result := 'Left Ctrl';
732 SDL_SCANCODE_LSHIFT: result := 'Left Shift';
733 SDL_SCANCODE_LALT: result := 'Left Alt';
734 SDL_SCANCODE_LGUI: result := 'Left GUI';
735 SDL_SCANCODE_RCTRL: result := 'Right Ctrl';
736 SDL_SCANCODE_RSHIFT: result := 'Right Shift';
737 SDL_SCANCODE_RALT: result := 'Right Alt';
738 SDL_SCANCODE_RGUI: result := 'Right GUI';
739 SDL_SCANCODE_MODE: result := 'ModeSwitch';
740 (* !!! ... *)
741 else
742 result := ''
743 end
744 end;
746 function SDL_IsTextInputActive: TSDL_Bool;
747 begin
748 if inputText then
749 result := SDL_TRUE
750 else
751 result := SDL_FALSE
752 end;
754 procedure SDL_StartTextInput;
755 begin
756 inputText := True
757 end;
759 procedure SDL_StopTextInput;
760 begin
761 inputText := False
762 end;
764 (********** JOYSTICK **********)
766 function SDL_NumJoysticks: SInt32;
767 begin
768 result := 0
769 end;
771 function SDL_JoystickOpen(device_index: SInt32): PSDL_Joystick;
772 begin
773 result := nil
774 end;
776 function SDL_JoystickName(joystick: PSDL_Joystick): PAnsiChar;
777 begin
778 result := ''
779 end;
781 function SDL_JoystickNumAxes(joystick: PSDL_Joystick): SInt32;
782 begin
783 result := 0
784 end;
786 function SDL_JoystickNumButtons(joystick: PSDL_Joystick): SInt32;
787 begin
788 result := 0
789 end;
791 function SDL_JoystickNumHats(joystick: PSDL_Joystick): SInt32;
792 begin
793 result := 0
794 end;
796 procedure SDL_JoystickClose(joystick: PSDL_Joystick);
797 begin
798 end;
800 procedure SDL_JoystickUpdate;
801 begin
802 end;
804 function SDL_JoystickGetButton(joystick: PSDL_Joystick; button: SInt32): UInt8;
805 begin
806 result := 0
807 end;
809 function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: SInt32): SInt16;
810 begin
811 result := 0
812 end;
814 function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: SInt32): UInt8;
815 begin
816 result := 0
817 end;
819 (********** TOUCH **********)
821 function SDL_GetNumTouchDevices: SInt32;
822 begin
823 result := 0
824 end;
826 (********** TIMERS **********)
828 procedure AllegroTimerCallback; cdecl;
829 begin
830 inc(ticks)
831 end;
832 procedure AllegroTimerCallbackEND; begin end;
834 function SDL_GetPerformanceCounter: UInt64;
835 begin
836 result := ticks (* !!! *)
837 end;
839 function SDL_GetPerformanceFrequency: UInt64;
840 begin
841 result := 1 (* !!! *)
842 end;
844 procedure SDL_Delay(ms: UInt32);
845 begin
846 rest(ms)
847 end;
849 function SDL_GetTicks: UInt32;
850 begin
851 result := ticks
852 end;
854 (********** DISPLAY MODES **********)
856 function GetPixelFormat (bpp: Integer): UInt32;
857 begin
858 case bpp of
859 8: result := SDL_PIXELFORMAT_INDEX8;
860 15: result := SDL_PIXELFORMAT_RGB555;
861 16: result := SDL_PIXELFORMAT_RGB565;
862 24: result := SDL_PIXELFORMAT_RGB888;
863 32: result := SDL_PIXELFORMAT_RGBA8888;
864 else result := SDL_PIXELFORMAT_UNKNOWN
865 end
866 end;
868 function SDL_GetDesktopDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
869 begin
870 ASSERT(mode <> nil);
871 mode.format := GetPixelFormat(deskbpp);
872 mode.w := deskw;
873 mode.h := deskh;
874 mode.refresh_rate := 0;
875 mode.driverdata := nil;
876 result := 0
877 end;
879 function SDL_GetClosestDisplayMode(displayIndex: SInt32; const mode: PSDL_DisplayMode; closest: PSDL_DisplayMode): PSDL_DisplayMode;
880 var m: PGFX_MODE_LIST; i, bpp: Integer;
881 begin
882 ASSERT(mode <> nil);
883 ASSERT(closest <> nil);
885 result := nil;
886 bpp := SDL_BITSPERPIXEL(mode.format);
887 if bpp = 0 then bpp := deskbpp;
889 m := nil;
890 if (gfx_driver <> nil) and (@gfx_driver.fetch_mode_list <> nil) then
891 m := gfx_driver.fetch_mode_list;
893 if m <> nil then
894 begin
895 i := 0;
896 while (i < m.num_modes) and (m.mode[i].bpp <> bpp) do inc(i);
897 if i < m.num_modes then
898 begin
899 closest.format := mode.format;
900 closest.refresh_rate := 0;
901 closest.driverdata := nil;
902 closest.w := m.mode[i].width;
903 closest.h := m.mode[i].height;
904 result := closest
905 end;
906 while i < m.num_modes do
907 begin
908 if (m.mode[i].bpp = bpp) and (closest.w >= mode.w) and (m.mode[i].width <= closest.w) and (closest.h >= mode.h) and (m.mode[i].height <= closest.h) then
909 begin
910 closest.w := m.mode[i].width;
911 closest.h := m.mode[i].height;
912 result := closest
913 end;
914 inc(i)
915 end;
916 destroy_gfx_mode_list(m)
917 end
918 end;
920 function SDL_GetNumDisplayModes(displayIndex: SInt32): SInt32;
921 var m: PGFX_MODE_LIST;
922 begin
923 result := -1;
925 m := nil;
926 if (gfx_driver <> nil) and (@gfx_driver.fetch_mode_list <> nil) then
927 m := gfx_driver.fetch_mode_list;
929 if m <> nil then
930 begin
931 result := m.num_modes;
932 destroy_gfx_mode_list(m);
933 end
934 end;
936 function SDL_GetDisplayMode(displayIndex: SInt32; modeIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
937 var m: PGFX_MODE_LIST;
938 begin
939 result := -1;
941 m := nil;
942 if (gfx_driver <> nil) and (@gfx_driver.fetch_mode_list <> nil) then
943 m := gfx_driver.fetch_mode_list;
945 if m <> nil then
946 begin
947 if (modeIndex >= 0) and (modeIndex < m.num_modes) then
948 begin
949 mode.format := GetPixelFormat(m.mode[modeIndex].bpp);
950 mode.w := m.mode[modeIndex].width;
951 mode.h := m.mode[modeIndex].height;
952 mode.refresh_rate := 0;
953 mode.driverdata := nil;
954 result := 0
955 end;
956 destroy_gfx_mode_list(m)
957 end
958 end;
960 function SDL_GetDisplayDPI(displayIndex: SInt32; ddpi, hdpi, vdpi: PFloat): SInt32;
961 begin
962 result := -1 (* stub *)
963 end;
965 (*********** WINDOW MANAGEMENT **********)
967 function SDL_CreateWindow(const title: PAnsiChar; x: SInt32; y: SInt32; w: SInt32; h: SInt32; flags: UInt32): PSDL_Window;
968 var window: PSDL_Window; mode: Integer;
969 begin
970 result := nil;
972 {$IF DEFINED(GO32V2)}
973 mode := GFX_AUTODETECT;
974 {$ELSE}
975 if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
976 mode := GFX_AUTODETECT_FULLSCREEN
977 else
978 mode := GFX_AUTODETECT_WINDOWED;
979 {$ENDIF}
981 if sdl2allegro_bpp = 0 then sdl2allegro_bpp := gBPP;
982 if sdl2allegro_bpp = 0 then sdl2allegro_bpp := deskbpp;
984 set_color_depth(sdl2allegro_bpp);
985 if set_gfx_mode(mode, w, h, 0, 0) = 0 then
986 begin
987 new(window);
988 set_window_title(title);
989 if sdl2allegro_screen <> nil then
990 destroy_bitmap(sdl2allegro_screen);
991 sdl2allegro_screen := create_system_bitmap(w, h);
992 if sdl2allegro_screen = nil then
993 sdl2allegro_screen := create_bitmap(w, h);
994 ASSERT(sdl2allegro_screen <> nil);
995 window.w := w;
996 window.h := h;
997 window.mode := mode;
998 result := window
999 end
1000 end;
1002 function SDL_SetWindowFullscreen(window: PSDL_Window; flags: UInt32): SInt32;
1003 var mode: Integer;
1004 begin
1005 ASSERT(window <> nil);
1006 result := -1;
1008 {$IF DEFINED(GO32V2)}
1009 mode := GFX_AUTODETECT;
1010 {$ELSE}
1011 if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
1012 mode := GFX_AUTODETECT_FULLSCREEN
1013 else
1014 mode := GFX_AUTODETECT_WINDOWED;
1015 {$ENDIF}
1017 set_color_depth(sdl2allegro_bpp);
1018 if set_gfx_mode(mode, window.w, window.h, 0, 0) = 0 then
1019 begin
1020 if sdl2allegro_screen <> nil then
1021 destroy_bitmap(sdl2allegro_screen);
1022 sdl2allegro_screen := create_system_bitmap(window.w, window.h);
1023 if sdl2allegro_screen = nil then
1024 sdl2allegro_screen := create_bitmap(window.w, window.h);
1025 ASSERT(sdl2allegro_screen <> nil);
1026 set_palette(desktop_palette);
1027 window.mode := mode;
1028 result := 0
1029 end
1030 end;
1032 procedure SDL_SetWindowSize(window: PSDL_Window; w: SInt32; h: SInt32);
1033 begin
1034 ASSERT(window <> nil);
1035 set_color_depth(sdl2allegro_bpp);
1036 if set_gfx_mode(window.mode, w, h, 0, 0) = 0 then
1037 begin
1038 if sdl2allegro_screen <> nil then
1039 destroy_bitmap(sdl2allegro_screen);
1040 sdl2allegro_screen := create_system_bitmap(w, h);
1041 if sdl2allegro_screen = nil then
1042 sdl2allegro_screen := create_bitmap(w, h);
1043 ASSERT(sdl2allegro_screen <> nil);
1044 set_palette(desktop_palette);
1045 window.w := w;
1046 window.h := h
1047 end
1048 else
1049 begin
1050 ASSERT(FALSE, 'Unable to set window size')
1051 end
1052 end;
1054 procedure SDL_DestroyWindow(window: PSDL_Window);
1055 begin
1056 if window = nil then exit;
1057 if sdl2allegro_screen <> nil then
1058 destroy_bitmap(sdl2allegro_screen);
1059 sdl2allegro_screen := nil;
1060 dispose(window)
1061 end;
1063 procedure SDL_GetWindowSize(window: PSDL_Window; w: PInt; h: PInt);
1064 begin
1065 ASSERT(window <> nil);
1066 if w <> nil then w^ := window.w;
1067 if h <> nil then h^ := window.h;
1068 end;
1070 procedure SDL_RestoreWindow(window: PSDL_Window);
1071 begin
1072 ASSERT(window <> nil);
1073 (* stub *)
1074 end;
1076 function SDL_SetWindowGammaRamp(window: PSDL_Window; const red: PUInt16; const green: PUInt16; const blue: PUInt16): SInt32;
1077 begin
1078 ASSERT(window <> nil);
1079 result := 0 (* stub *)
1080 end;
1082 function SDL_GetWindowGammaRamp(window: PSDL_Window; red: PUInt16; green: PUInt16; blue: PUInt16): SInt32;
1083 begin
1084 ASSERT(window <> nil);
1085 result := 0 (* stub *)
1086 end;
1088 (********** OPENGL MANAGEMENT **********)
1090 function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
1091 begin
1092 e_LogWritefln('SDL_GL_SetAttribute %s %s', [attr, value]);
1093 allegro_error := 'Attribute ' + IntToStr(attr) + ' := ' + IntToStr(value) + 'not supported';
1094 result := -1
1095 end;
1097 function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
1098 begin
1099 e_LogWritefln('SDL_GL_GetAttribute %s', [attr]);
1100 value^ := 0; result := -1
1101 end;
1103 function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
1104 begin
1105 result := window (* stub *)
1106 end;
1108 function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
1109 begin
1110 ASSERT(window <> nil);
1111 if context <> nil then
1112 ASSERT(window = context);
1113 result := 0 (* stub *)
1114 end;
1116 procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
1117 begin
1118 (* stub *)
1119 end;
1121 function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
1122 begin
1123 result := 0;
1124 if interval = 0 then
1125 useVsync := False
1126 else
1127 useVsync := True
1128 end;
1130 procedure SDL_GL_SwapWindow(window: PSDL_Window);
1131 begin
1132 ASSERT(window <> nil);
1133 ASSERT(sdl2allegro_screen <> nil);
1134 acquire_screen;
1135 blit(sdl2allegro_screen, screen, 0, 0, 0, 0, min(sdl2allegro_screen.w, screen.w), min(sdl2allegro_screen.h, screen.h));
1136 show_video_bitmap(screen);
1137 release_screen;
1138 if useVsync then
1139 vsync;
1140 end;
1142 (********** EVENTS **********)
1144 function SDL_PushEvent(event: PSDL_Event): SInt32;
1145 begin
1146 result := 1;
1147 case event.type_ of
1148 SDL_QUITEV: quit := True;
1149 else
1150 ASSERT(FALSE);
1151 result := 0
1152 end
1153 end;
1155 function SDL_PollEvent(event: PSDL_Event): SInt32;
1156 var alscan: Integer; pressed, shift, caps: Boolean;
1157 begin
1158 result := 0;
1160 if quit then
1161 begin
1162 quit := False;
1163 event.type_ := SDL_QUITEV;
1164 event.quit.timestamp := ticks;
1165 result := 1;
1166 Exit
1167 end;
1169 if inputText and (inputChar <> #0) then
1170 begin
1171 event.type_ := SDL_TEXTINPUT;
1172 event.text.timestamp := ticks;
1173 event.text.windowID := 0;
1174 event.text.text[0] := inputChar;
1175 event.text.text[1] := #0;
1176 inputChar := #0;
1177 result := 1;
1178 Exit
1179 end
1180 else
1181 inputChar := #0;
1183 poll_keyboard;
1184 if not IsEmptyKeyboard then
1185 begin
1186 alscan := NextScancode;
1187 pressed := alscan and $80 = 0;
1189 inputChar := #0;
1190 if pressed then
1191 begin
1192 shift := key_shifts and KB_SHIFT_FLAG <> 0;
1193 caps := key_shifts and KB_CAPSLOCK_FLAG <> 0;
1194 if shift xor caps then
1195 inputChar := s2uc[alscan and $7F]
1196 else
1197 inputChar := s2lc[alscan and $7F];
1198 event.type_ := SDL_KEYDOWN
1199 end
1200 else
1201 event.type_ := SDL_KEYUP;
1203 event.key.timestamp := ticks;
1204 event.key.windowID := 0;
1206 (**** df not use it?
1207 if pressed then
1208 event.key.state := SDL_PRESSED
1209 else
1210 event.key.state := SDL_RELEASED;
1211 ****)
1213 event.key._repeat := 0;
1214 event.key.keysym.scancode := s2sa[alscan and $7F];
1215 event.key.keysym.sym := 0; (* df not use it? *)
1216 event.key.keysym._mod := 0; (* df not use it? *)
1217 result := 1;
1218 Exit
1219 end
1220 end;
1222 (********** MOUSE **********)
1224 function SDL_ShowCursor(toggle: SInt32): SInt32;
1225 begin
1226 result := 0 (* stub *)
1227 end;
1229 (********** SDL **********)
1231 procedure AllegroQuitCallback; cdecl;
1232 begin
1233 quit := True
1234 end;
1235 procedure AllegroQuitCallbackEND; begin end;
1237 function SDL_SetHint(const name: PChar; const value: PChar): boolean;
1238 begin
1239 e_LogWritefln('SDL_SetHint %s %s', [name, value]);
1240 result := false (* stub *)
1241 end;
1243 function SDL_GetError: PAnsiChar;
1244 begin
1245 result := allegro_error
1246 end;
1248 {$IFDEF GO32V2}
1249 (* HACK: allegro crashes while init without this *)
1250 var
1251 __crt0_argv: PPchar; cvar; external;
1252 myargv: array [0..1] of Pchar;
1254 procedure FIX_ARGV;
1255 begin
1256 __crt0_argv := @myargv[0];
1257 myargv[0] := PChar(ParamStr(0));
1258 e_LogWritefln('argv[0] = %s', [myargv[0]]);
1259 end;
1260 {$ENDIF}
1262 function SDL_Init(flags: UInt32): SInt32;
1263 begin
1264 result := -1;
1265 {$IFDEF GO32V2}
1266 FIX_ARGV;
1267 {$ENDIF}
1268 if allegro_init = 0 then
1269 begin
1270 e_LogWriteln('Allegro Init: ok');
1271 {$IFDEF GO32V2}
1272 (* without this df dies with fire when swapped *)
1273 lock_data(ticks, sizeof(ticks));
1274 lock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
1275 lock_data(keybeg, sizeof(keybeg));
1276 lock_data(keyend, sizeof(keyend));
1277 lock_data(keyring, sizeof(keyring));
1278 lock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
1279 lock_data(quit, sizeof(quit));
1280 lock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
1281 {$ENDIF}
1282 install_timer;
1283 install_keyboard;
1284 keyboard_lowlevel_callback := KeyboardWatcher;
1285 set_keyboard_rate(0, 0);
1286 install_int_ex(AllegroTimerCallback, MSEC_TO_TIMER(1));
1287 set_close_button_callback(AllegroQuitCallback);
1288 deskbpp := desktop_color_depth;
1289 if deskbpp = 0 then deskbpp := 8;
1290 if get_desktop_resolution(@deskw, @deskh) <> 0 then
1291 begin
1292 deskw := 640;
1293 deskh := 480
1294 end;
1295 result := 0
1296 end
1297 end;
1299 procedure SDL_Quit;
1300 begin
1301 set_close_button_callback(nil);
1302 remove_keyboard;
1303 remove_timer;
1304 {$IFDEF GO32V2}
1305 unlock_data(ticks, sizeof(ticks));
1306 unlock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
1307 unlock_data(keybeg, sizeof(keybeg));
1308 unlock_data(keyend, sizeof(keyend));
1309 unlock_data(keyring, sizeof(keyring));
1310 unlock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
1311 unlock_data(quit, sizeof(quit));
1312 unlock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
1313 {$ENDIF}
1314 allegro_exit
1315 end;