DEADSOFTWARE

a5de6da8d5ad15f3f407d13b8c4aca4570fdb319
[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;
299 globalTransTable: COLOR_MAP_T;
300 redTransTable: COLOR_MAP_T;
301 greenTransTable: COLOR_MAP_T;
302 blueTransTable: COLOR_MAP_T;
303 darkTransTable: COLOR_MAP_T;
304 lightTransTable: COLOR_MAP_T;
307 /// FUNCTIONS ///
309 function SDL_SetWindowGammaRamp(window: PSDL_Window; const red: PUInt16; const green: PUInt16; const blue: PUInt16): SInt32;
310 function SDL_GetWindowGammaRamp(window: PSDL_Window; red: PUInt16; green: PUInt16; blue: PUInt16): SInt32;
312 function SDL_NumJoysticks: SInt32;
313 function SDL_JoystickOpen(device_index: SInt32): PSDL_Joystick;
314 function SDL_JoystickName(joystick: PSDL_Joystick): PAnsiChar;
315 function SDL_JoystickNumAxes(joystick: PSDL_Joystick): SInt32;
316 function SDL_JoystickNumButtons(joystick: PSDL_Joystick): SInt32;
317 function SDL_JoystickNumHats(joystick: PSDL_Joystick): SInt32;
318 procedure SDL_JoystickClose(joystick: PSDL_Joystick);
319 procedure SDL_JoystickUpdate;
320 function SDL_JoystickGetButton(joystick: PSDL_Joystick; button: SInt32): UInt8;
321 function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: SInt32): SInt16;
322 function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: SInt32): UInt8;
324 function SDL_GetScancodeName(scancode: TSDL_ScanCode): PAnsiChar;
326 function SDL_GetPerformanceCounter: UInt64;
327 function SDL_GetPerformanceFrequency: UInt64;
329 function SDL_RWFromFile(const _file: PAnsiChar; const mode: PAnsiChar): PSDL_RWops;
330 function SDL_RWFromConstMem(const mem: Pointer; size: SInt32): PSDL_RWops;
332 function SDL_GetDisplayDPI(displayIndex: SInt32; ddpi, hdpi, vdpi: PFloat): SInt32;
333 function SDL_IsTextInputActive: TSDL_Bool;
334 procedure SDL_StartTextInput;
335 procedure SDL_StopTextInput;
336 function SDL_GetNumTouchDevices: SInt32;
338 function SDL_GetDesktopDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
339 function SDL_GetClosestDisplayMode(displayIndex: SInt32; const mode: PSDL_DisplayMode; closest: PSDL_DisplayMode): PSDL_DisplayMode;
341 procedure SDL_DestroyWindow(window: PSDL_Window);
342 procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
343 procedure SDL_RestoreWindow(window: PSDL_Window);
344 procedure SDL_SetWindowSize(window: PSDL_Window; w: SInt32; h: SInt32);
345 function SDL_CreateWindow(const title: PAnsiChar; x: SInt32; y: SInt32; w: SInt32; h: SInt32; flags: UInt32): PSDL_Window;
346 function SDL_SetWindowFullscreen(window: PSDL_Window; flags: UInt32): SInt32;
347 function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
348 procedure SDL_GetWindowSize(window: PSDL_Window; w: PInt; h: PInt);
349 function SDL_GetNumDisplayModes(displayIndex: SInt32): SInt32;
350 function SDL_GetDisplayMode(displayIndex: SInt32; modeIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
352 function SDL_ShowCursor(toggle: SInt32): SInt32;
353 procedure SDL_Delay(ms: UInt32);
354 procedure SDL_GL_SwapWindow(window: PSDL_Window);
356 function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
357 function SDL_GetTicks: UInt32;
359 function SDL_PushEvent(event: PSDL_Event): SInt32;
360 function SDL_PollEvent(event: PSDL_Event): SInt32;
361 function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
362 function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
363 function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
365 function SDL_GetError: PAnsiChar;
367 function SDL_Init(flags: UInt32): SInt32;
368 procedure SDL_Quit();
369 function SDL_SetHint( const name: PChar; const value: PChar) : boolean;
371 implementation
373 uses
374 {$IFDEF GO32V2}
375 go32,
376 {$ENDIF}
377 e_Log, g_options, SysUtils, Math, Classes, ctypes;
379 const
380 maxKeyBuffer = 64;
382 var
383 deskw, deskh, deskbpp: Integer;
384 keyring: array [0..maxKeyBuffer - 1] of Integer;
385 keybeg, keyend: Integer;
386 inputChar: Char;
387 inputText: Boolean;
388 useVsync: Boolean;
389 ticks: UInt32;
390 quit: Boolean;
391 custompal: PALETTE;
393 s2lc: 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', '0', '1', '2', '3', '4',
396 '5', '6', '7', '8', '9', '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, ';', #39, '\', '\', ',', '.', '/', ' ', #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 s2uc: array [0..KEY_MAX] of char = (
404 #00, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
405 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ')', '!', '@', '#', '$',
406 '%', '^', '&', '*', '(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
407 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '~', '_', '+', #00,
408 #09, '{', '}', #10, ':', '"', '|', '|', '<', '>', '?', ' ', #00, #00, #00, #00,
409 #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
410 #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
411 #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
412 );
413 s2sa: array [0..KEY_MAX] of Integer = (
414 SDL_SCANCODE_UNKNOWN,
415 SDL_SCANCODE_A,
416 SDL_SCANCODE_B,
417 SDL_SCANCODE_C,
418 SDL_SCANCODE_D,
419 SDL_SCANCODE_E,
420 SDL_SCANCODE_F,
421 SDL_SCANCODE_G,
422 SDL_SCANCODE_H,
423 SDL_SCANCODE_I,
424 SDL_SCANCODE_J,
425 SDL_SCANCODE_K,
426 SDL_SCANCODE_L,
427 SDL_SCANCODE_M,
428 SDL_SCANCODE_N,
429 SDL_SCANCODE_O,
430 SDL_SCANCODE_P,
431 SDL_SCANCODE_Q,
432 SDL_SCANCODE_R,
433 SDL_SCANCODE_S,
434 SDL_SCANCODE_T,
435 SDL_SCANCODE_U,
436 SDL_SCANCODE_V,
437 SDL_SCANCODE_W,
438 SDL_SCANCODE_X,
439 SDL_SCANCODE_Y,
440 SDL_SCANCODE_Z,
441 SDL_SCANCODE_0,
442 SDL_SCANCODE_1,
443 SDL_SCANCODE_2,
444 SDL_SCANCODE_3,
445 SDL_SCANCODE_4,
446 SDL_SCANCODE_5,
447 SDL_SCANCODE_6,
448 SDL_SCANCODE_7,
449 SDL_SCANCODE_8,
450 SDL_SCANCODE_9,
451 SDL_SCANCODE_KP_0,
452 SDL_SCANCODE_KP_1,
453 SDL_SCANCODE_KP_2,
454 SDL_SCANCODE_KP_3,
455 SDL_SCANCODE_KP_4,
456 SDL_SCANCODE_KP_5,
457 SDL_SCANCODE_KP_6,
458 SDL_SCANCODE_KP_7,
459 SDL_SCANCODE_KP_8,
460 SDL_SCANCODE_KP_9,
461 SDL_SCANCODE_F1,
462 SDL_SCANCODE_F2,
463 SDL_SCANCODE_F3,
464 SDL_SCANCODE_F4,
465 SDL_SCANCODE_F5,
466 SDL_SCANCODE_F6,
467 SDL_SCANCODE_F7,
468 SDL_SCANCODE_F8,
469 SDL_SCANCODE_F9,
470 SDL_SCANCODE_F10,
471 SDL_SCANCODE_F11,
472 SDL_SCANCODE_F12,
473 SDL_SCANCODE_ESCAPE,
474 SDL_SCANCODE_GRAVE,
475 SDL_SCANCODE_MINUS,
476 SDL_SCANCODE_EQUALS,
477 SDL_SCANCODE_BACKSPACE,
478 SDL_SCANCODE_TAB,
479 SDL_SCANCODE_LEFTBRACKET,
480 SDL_SCANCODE_RIGHTBRACKET,
481 SDL_SCANCODE_RETURN,
482 SDL_SCANCODE_SEMICOLON,
483 SDL_SCANCODE_APOSTROPHE,
484 SDL_SCANCODE_BACKSLASH,
485 SDL_SCANCODE_NONUSHASH,
486 SDL_SCANCODE_COMMA,
487 SDL_SCANCODE_UNKNOWN, (* !!! KEY_STOP *)
488 SDL_SCANCODE_SLASH,
489 SDL_SCANCODE_SPACE,
490 SDL_SCANCODE_INSERT,
491 SDL_SCANCODE_DELETE,
492 SDL_SCANCODE_HOME,
493 SDL_SCANCODE_END,
494 SDL_SCANCODE_PAGEUP,
495 SDL_SCANCODE_PAGEDOWN,
496 SDL_SCANCODE_LEFT,
497 SDL_SCANCODE_RIGHT,
498 SDL_SCANCODE_UP,
499 SDL_SCANCODE_DOWN,
500 SDL_SCANCODE_KP_DIVIDE,
501 SDL_SCANCODE_KP_MULTIPLY,
502 SDL_SCANCODE_KP_MINUS,
503 SDL_SCANCODE_KP_PLUS,
504 SDL_SCANCODE_KP_PERIOD,
505 SDL_SCANCODE_KP_ENTER,
506 SDL_SCANCODE_PRINTSCREEN,
507 SDL_SCANCODE_PAUSE,
508 SDL_SCANCODE_UNKNOWN, (* !!! KEY_ABNT_C1 *)
509 SDL_SCANCODE_INTERNATIONAL3, (* ??? KEY_YEN *)
510 SDL_SCANCODE_LANG3, (* ??? KEY_KANA *)
511 SDL_SCANCODE_UNKNOWN, (* !!! KEY_CONVERT *)
512 SDL_SCANCODE_UNKNOWN, (* !!! KEY_NOCONVERT *)
513 SDL_SCANCODE_KP_AT,
514 SDL_SCANCODE_UNKNOWN, (* !!! KEY_CIRCUMFLEX *)
515 SDL_SCANCODE_KP_COLON,
516 SDL_SCANCODE_UNKNOWN, (* !!! KEY_KANJI *)
517 SDL_SCANCODE_KP_EQUALS,
518 SDL_SCANCODE_UNKNOWN, (* !!! KEY_BACKQUOTE *)
519 SDL_SCANCODE_SEMICOLON,
520 SDL_SCANCODE_LGUI,
521 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN1 *)
522 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN2 *)
523 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN3 *)
524 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN4 *)
525 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN5 *)
526 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN6 *)
527 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN7 *)
528 SDL_SCANCODE_UNKNOWN, (* !!! KEY_UNKNOWN8 *)
529 SDL_SCANCODE_LSHIFT,
530 SDL_SCANCODE_RSHIFT,
531 SDL_SCANCODE_LCTRL,
532 SDL_SCANCODE_RCTRL,
533 SDL_SCANCODE_LALT,
534 SDL_SCANCODE_RALT,
535 SDL_SCANCODE_LGUI,
536 SDL_SCANCODE_RGUI,
537 SDL_SCANCODE_MODE, (* ??? KEY_MENU *)
538 SDL_SCANCODE_SCROLLLOCK,
539 SDL_SCANCODE_NUMLOCKCLEAR,
540 SDL_SCANCODE_CAPSLOCK,
541 SDL_SCANCODE_UNKNOWN (* KEY_MAX *)
542 );
544 procedure LoadCustomPalette (const name: String);
545 var f: TFileStream; i: Integer;
546 begin
547 try
548 f := TFileStream.Create(name, fmOpenRead);
549 e_LogWriteLn('Load custom palette ' + name);
550 for i := 0 to 255 do
551 begin
552 custompal[i].r := f.ReadByte();
553 custompal[i].g := f.ReadByte();
554 custompal[i].b := f.ReadByte();
555 custompal[i].filler := $FF;
556 end;
557 f.Destroy
558 except
559 e_LogWriteLn('Fallback to default palette');
560 custompal := default_palette;
561 (*
562 for i := 0 to 255 do
563 begin
564 custompal[i].r := i div 4;
565 custompal[i].g := i div 4;
566 custompal[i].b := i div 4;
567 custompal[i].filler := $FF;
568 end;
569 *)
570 end
571 end;
573 procedure UpdatePalette;
574 begin
575 set_palette(custompal);
576 select_palette(custompal);
577 create_trans_table(@globalTransTable, custompal, 255, 255, 255, nil);
578 create_trans_table(@redTransTable, custompal, 0, 255, 255, nil);
579 create_trans_table(@greenTransTable, custompal, 255, 0, 255, nil);
580 create_trans_table(@blueTransTable, custompal, 255, 255, 0, nil);
581 create_trans_table(@darkTransTable, custompal, 191, 191, 191, nil);
582 create_trans_table(@lightTransTable, custompal, 64, 64, 64, nil);
583 color_map := @globalTransTable;
584 end;
586 function IsEmptyKeyboard: Boolean;
587 begin
588 result := keybeg = keyend
589 end;
591 function IsFullKeyboard: Boolean;
592 begin
593 result := (keybeg - 1) mod maxKeyBuffer = keyend
594 end;
596 function NextScancode: Integer;
597 begin
598 result := 0;
599 if not IsEmptyKeyboard then
600 begin
601 result := keyring[keybeg];
602 keybeg := (keybeg + 1) mod maxKeyBuffer
603 end
604 end;
606 procedure KeyboardWatcher (scancode: Integer); cdecl;
607 begin
608 if (keybeg - 1) mod maxKeyBuffer <> keyend then (* not IsFullKeyboard *)
609 begin
610 keyring[keyend] := scancode;
611 keyend := (keyend + 1) mod maxKeyBuffer
612 end
613 end;
614 procedure KeyboardWatcherEND; begin end;
616 /// MACRO ///
618 function SDL_PIXELFLAG(X: Cardinal): Cardinal;
619 begin
620 Result := (X shr 28) and $0F;
621 end;
623 function SDL_PIXELTYPE(X: Cardinal): Cardinal;
624 begin
625 Result := (X shr 24) and $0F;
626 end;
628 function SDL_PIXELORDER(X: Cardinal): Cardinal;
629 begin
630 Result := (X shr 20) and $0F;
631 end;
633 function SDL_PIXELLAYOUT(X: Cardinal): Cardinal;
634 begin
635 Result := (X shr 16) and $0F;
636 end;
638 function SDL_BITSPERPIXEL(X: Cardinal): Cardinal;
639 begin
640 Result := (X shr 8) and $FF;
641 end;
643 function SDL_IsPixelFormat_FOURCC(format: Variant): Boolean;
644 begin
645 Result := format and SDL_PIXELFLAG(format) <> 1;
646 end;
648 /// FUNCTIONS ////
650 (********** FILES **********)
652 function SDL_RWFromFile(const _file: PAnsiChar; const mode: PAnsiChar): PSDL_RWops;
653 begin
654 result := nil (* stub, used for sdl2stub_mixer *)
655 end;
657 function SDL_RWFromConstMem(const mem: Pointer; size: SInt32): PSDL_RWops;
658 begin
659 result := nil (* stub, used for sdl2stub_mixer *)
660 end;
662 (********** KEYBOARD **********)
664 function SDL_GetScancodeName(scancode: TSDL_ScanCode): PAnsiChar;
665 begin
666 case scancode of
667 SDL_SCANCODE_A: result := 'A';
668 SDL_SCANCODE_B: result := 'B';
669 SDL_SCANCODE_C: result := 'C';
670 SDL_SCANCODE_D: result := 'D';
671 SDL_SCANCODE_E: result := 'E';
672 SDL_SCANCODE_F: result := 'F';
673 SDL_SCANCODE_G: result := 'G';
674 SDL_SCANCODE_H: result := 'H';
675 SDL_SCANCODE_I: result := 'I';
676 SDL_SCANCODE_J: result := 'J';
677 SDL_SCANCODE_K: result := 'K';
678 SDL_SCANCODE_L: result := 'L';
679 SDL_SCANCODE_M: result := 'M';
680 SDL_SCANCODE_N: result := 'N';
681 SDL_SCANCODE_O: result := 'O';
682 SDL_SCANCODE_P: result := 'P';
683 SDL_SCANCODE_Q: result := 'Q';
684 SDL_SCANCODE_R: result := 'R';
685 SDL_SCANCODE_S: result := 'S';
686 SDL_SCANCODE_T: result := 'T';
687 SDL_SCANCODE_U: result := 'U';
688 SDL_SCANCODE_V: result := 'V';
689 SDL_SCANCODE_W: result := 'W';
690 SDL_SCANCODE_X: result := 'X';
691 SDL_SCANCODE_Y: result := 'Y';
692 SDL_SCANCODE_Z: result := 'Z';
693 SDL_SCANCODE_0: result := '0';
694 SDL_SCANCODE_1: result := '1';
695 SDL_SCANCODE_2: result := '2';
696 SDL_SCANCODE_3: result := '3';
697 SDL_SCANCODE_4: result := '4';
698 SDL_SCANCODE_5: result := '5';
699 SDL_SCANCODE_6: result := '6';
700 SDL_SCANCODE_7: result := '7';
701 SDL_SCANCODE_8: result := '8';
702 SDL_SCANCODE_9: result := '9';
703 SDL_SCANCODE_RETURN: result := 'Return';
704 SDL_SCANCODE_ESCAPE: result := 'Escape';
705 SDL_SCANCODE_BACKSPACE: result := 'Backspace';
706 SDL_SCANCODE_TAB: result := 'Tab';
707 SDL_SCANCODE_SPACE: result := 'Space';
708 SDL_SCANCODE_MINUS: result := '-';
709 SDL_SCANCODE_EQUALS: result := '=';
710 SDL_SCANCODE_LEFTBRACKET: result := '[';
711 SDL_SCANCODE_RIGHTBRACKET: result := ']';
712 SDL_SCANCODE_BACKSLASH: result := '\';
713 SDL_SCANCODE_SEMICOLON: result := ';';
714 SDL_SCANCODE_APOSTROPHE: result := '''';
715 SDL_SCANCODE_GRAVE: result := '`';
716 SDL_SCANCODE_COMMA: result := ',';
717 SDL_SCANCODE_PERIOD: result := '.';
718 SDL_SCANCODE_SLASH: result := '/';
719 SDL_SCANCODE_CAPSLOCK: result := 'CapsLock';
720 SDL_SCANCODE_F1: result := 'F1';
721 SDL_SCANCODE_F2: result := 'F2';
722 SDL_SCANCODE_F3: result := 'F3';
723 SDL_SCANCODE_F4: result := 'F4';
724 SDL_SCANCODE_F5: result := 'F5';
725 SDL_SCANCODE_F6: result := 'F6';
726 SDL_SCANCODE_F7: result := 'F7';
727 SDL_SCANCODE_F8: result := 'F8';
728 SDL_SCANCODE_F9: result := 'F9';
729 SDL_SCANCODE_F10: result := 'F10';
730 SDL_SCANCODE_F11: result := 'F11';
731 SDL_SCANCODE_F12: result := 'F12';
732 SDL_SCANCODE_PRINTSCREEN: result := 'PrintScreen';
733 SDL_SCANCODE_SCROLLLOCK: result := 'ScrollLock';
734 SDL_SCANCODE_PAUSE: result := 'Pause';
735 SDL_SCANCODE_INSERT: result := 'Insert';
736 SDL_SCANCODE_HOME: result := 'Home';
737 SDL_SCANCODE_PAGEUP: result := 'PageUp';
738 SDL_SCANCODE_DELETE: result := 'Delete';
739 SDL_SCANCODE_END: result := 'End';
740 SDL_SCANCODE_PAGEDOWN: result := 'PageDown';
741 SDL_SCANCODE_RIGHT: result := 'Right';
742 SDL_SCANCODE_LEFT: result := 'Left';
743 SDL_SCANCODE_DOWN: result := 'Down';
744 SDL_SCANCODE_UP: result := 'Up';
745 SDL_SCANCODE_NUMLOCKCLEAR: result := 'Numlock';
746 SDL_SCANCODE_KP_DIVIDE: result := 'Keypad /';
747 SDL_SCANCODE_KP_MULTIPLY: result := 'Keypad *';
748 SDL_SCANCODE_KP_MINUS: result := 'Keypad -';
749 SDL_SCANCODE_KP_PLUS: result := 'Keypad +';
750 SDL_SCANCODE_KP_ENTER: result := 'Keypad Enter';
751 SDL_SCANCODE_KP_1: result := 'Keypad 1';
752 SDL_SCANCODE_KP_2: result := 'Keypad 2';
753 SDL_SCANCODE_KP_3: result := 'Keypad 3';
754 SDL_SCANCODE_KP_4: result := 'Keypad 4';
755 SDL_SCANCODE_KP_5: result := 'Keypad 5';
756 SDL_SCANCODE_KP_6: result := 'Keypad 6';
757 SDL_SCANCODE_KP_7: result := 'Keypad 7';
758 SDL_SCANCODE_KP_8: result := 'Keypad 8';
759 SDL_SCANCODE_KP_9: result := 'Keypad 9';
760 SDL_SCANCODE_KP_0: result := 'Keypad 0';
761 SDL_SCANCODE_KP_PERIOD: result := 'Keypad .';
762 SDL_SCANCODE_APPLICATION: result := 'Application';
763 SDL_SCANCODE_POWER: result := 'Power';
764 SDL_SCANCODE_KP_EQUALS: result := 'Keypad =';
765 (* !!! F1x/F2x and multimedia ... *)
766 SDL_SCANCODE_KP_COMMA: result := 'Keypad ,';
767 SDL_SCANCODE_KP_EQUALSAS400: result := 'Keypad = (AS400)';
768 SDL_SCANCODE_ALTERASE: result := 'AltErase';
769 SDL_SCANCODE_SYSREQ: result := 'SysReq';
770 SDL_SCANCODE_CANCEL: result := 'Cancel';
771 SDL_SCANCODE_CLEAR: result := 'Clear';
772 SDL_SCANCODE_PRIOR: result := 'Prior';
773 SDL_SCANCODE_RETURN2: result := 'Return';
774 SDL_SCANCODE_SEPARATOR: result := 'Separator';
775 SDL_SCANCODE_OUT: result := 'Out';
776 SDL_SCANCODE_OPER: result := 'Oper';
777 SDL_SCANCODE_CLEARAGAIN: result := 'Clear / Again';
778 SDL_SCANCODE_CRSEL: result := 'CrSel';
779 SDL_SCANCODE_EXSEL: result := 'ExSel';
780 (* !!! Additional KP *)
781 SDL_SCANCODE_LCTRL: result := 'Left Ctrl';
782 SDL_SCANCODE_LSHIFT: result := 'Left Shift';
783 SDL_SCANCODE_LALT: result := 'Left Alt';
784 SDL_SCANCODE_LGUI: result := 'Left GUI';
785 SDL_SCANCODE_RCTRL: result := 'Right Ctrl';
786 SDL_SCANCODE_RSHIFT: result := 'Right Shift';
787 SDL_SCANCODE_RALT: result := 'Right Alt';
788 SDL_SCANCODE_RGUI: result := 'Right GUI';
789 SDL_SCANCODE_MODE: result := 'ModeSwitch';
790 (* !!! ... *)
791 else
792 result := ''
793 end
794 end;
796 function SDL_IsTextInputActive: TSDL_Bool;
797 begin
798 if inputText then
799 result := SDL_TRUE
800 else
801 result := SDL_FALSE
802 end;
804 procedure SDL_StartTextInput;
805 begin
806 inputText := True
807 end;
809 procedure SDL_StopTextInput;
810 begin
811 inputText := False
812 end;
814 (********** JOYSTICK **********)
816 function SDL_NumJoysticks: SInt32;
817 begin
818 result := 0
819 end;
821 function SDL_JoystickOpen(device_index: SInt32): PSDL_Joystick;
822 begin
823 result := nil
824 end;
826 function SDL_JoystickName(joystick: PSDL_Joystick): PAnsiChar;
827 begin
828 result := ''
829 end;
831 function SDL_JoystickNumAxes(joystick: PSDL_Joystick): SInt32;
832 begin
833 result := 0
834 end;
836 function SDL_JoystickNumButtons(joystick: PSDL_Joystick): SInt32;
837 begin
838 result := 0
839 end;
841 function SDL_JoystickNumHats(joystick: PSDL_Joystick): SInt32;
842 begin
843 result := 0
844 end;
846 procedure SDL_JoystickClose(joystick: PSDL_Joystick);
847 begin
848 end;
850 procedure SDL_JoystickUpdate;
851 begin
852 end;
854 function SDL_JoystickGetButton(joystick: PSDL_Joystick; button: SInt32): UInt8;
855 begin
856 result := 0
857 end;
859 function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: SInt32): SInt16;
860 begin
861 result := 0
862 end;
864 function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: SInt32): UInt8;
865 begin
866 result := 0
867 end;
869 (********** TOUCH **********)
871 function SDL_GetNumTouchDevices: SInt32;
872 begin
873 result := 0
874 end;
876 (********** TIMERS **********)
878 procedure AllegroTimerCallback; cdecl;
879 begin
880 inc(ticks)
881 end;
882 procedure AllegroTimerCallbackEND; begin end;
884 function SDL_GetPerformanceCounter: UInt64;
885 begin
886 result := ticks (* !!! *)
887 end;
889 function SDL_GetPerformanceFrequency: UInt64;
890 begin
891 result := 1 (* !!! *)
892 end;
894 procedure SDL_Delay(ms: UInt32);
895 begin
896 rest(ms)
897 end;
899 function SDL_GetTicks: UInt32;
900 begin
901 result := ticks
902 end;
904 (********** DISPLAY MODES **********)
906 function GetPixelFormat (bpp: Integer): UInt32;
907 begin
908 case bpp of
909 8: result := SDL_PIXELFORMAT_INDEX8;
910 15: result := SDL_PIXELFORMAT_RGB555;
911 16: result := SDL_PIXELFORMAT_RGB565;
912 24: result := SDL_PIXELFORMAT_RGB888;
913 32: result := SDL_PIXELFORMAT_RGBA8888;
914 else result := SDL_PIXELFORMAT_UNKNOWN
915 end
916 end;
918 function SDL_GetDesktopDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
919 begin
920 ASSERT(mode <> nil);
921 mode.format := GetPixelFormat(deskbpp);
922 mode.w := deskw;
923 mode.h := deskh;
924 mode.refresh_rate := 0;
925 mode.driverdata := nil;
926 result := 0
927 end;
929 function SDL_GetClosestDisplayMode(displayIndex: SInt32; const mode: PSDL_DisplayMode; closest: PSDL_DisplayMode): PSDL_DisplayMode;
930 var m: PGFX_MODE_LIST; i, bpp: Integer;
931 begin
932 ASSERT(mode <> nil);
933 ASSERT(closest <> nil);
935 result := nil;
936 bpp := SDL_BITSPERPIXEL(mode.format);
937 if bpp = 0 then bpp := deskbpp;
939 m := nil;
940 if (gfx_driver <> nil) and (@gfx_driver.fetch_mode_list <> nil) then
941 m := gfx_driver.fetch_mode_list;
943 if m <> nil then
944 begin
945 i := 0;
946 while (i < m.num_modes) and (m.mode[i].bpp <> bpp) do inc(i);
947 if i < m.num_modes then
948 begin
949 closest.format := mode.format;
950 closest.refresh_rate := 0;
951 closest.driverdata := nil;
952 closest.w := m.mode[i].width;
953 closest.h := m.mode[i].height;
954 result := closest
955 end;
956 while i < m.num_modes do
957 begin
958 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
959 begin
960 closest.w := m.mode[i].width;
961 closest.h := m.mode[i].height;
962 result := closest
963 end;
964 inc(i)
965 end;
966 destroy_gfx_mode_list(m)
967 end
968 end;
970 function SDL_GetNumDisplayModes(displayIndex: SInt32): SInt32;
971 var m: PGFX_MODE_LIST;
972 begin
973 result := -1;
975 m := nil;
976 if (gfx_driver <> nil) and (@gfx_driver.fetch_mode_list <> nil) then
977 m := gfx_driver.fetch_mode_list;
979 if m <> nil then
980 begin
981 result := m.num_modes;
982 destroy_gfx_mode_list(m);
983 end
984 end;
986 function SDL_GetDisplayMode(displayIndex: SInt32; modeIndex: SInt32; mode: PSDL_DisplayMode): SInt32;
987 var m: PGFX_MODE_LIST;
988 begin
989 result := -1;
991 m := nil;
992 if (gfx_driver <> nil) and (@gfx_driver.fetch_mode_list <> nil) then
993 m := gfx_driver.fetch_mode_list;
995 if m <> nil then
996 begin
997 if (modeIndex >= 0) and (modeIndex < m.num_modes) then
998 begin
999 mode.format := GetPixelFormat(m.mode[modeIndex].bpp);
1000 mode.w := m.mode[modeIndex].width;
1001 mode.h := m.mode[modeIndex].height;
1002 mode.refresh_rate := 0;
1003 mode.driverdata := nil;
1004 result := 0
1005 end;
1006 destroy_gfx_mode_list(m)
1007 end
1008 end;
1010 function SDL_GetDisplayDPI(displayIndex: SInt32; ddpi, hdpi, vdpi: PFloat): SInt32;
1011 begin
1012 result := -1 (* stub *)
1013 end;
1015 (*********** WINDOW MANAGEMENT **********)
1017 function SDL_CreateWindow(const title: PAnsiChar; x: SInt32; y: SInt32; w: SInt32; h: SInt32; flags: UInt32): PSDL_Window;
1018 var window: PSDL_Window; mode: Integer;
1019 begin
1020 result := nil;
1022 {$IF DEFINED(GO32V2)}
1023 mode := GFX_AUTODETECT;
1024 {$ELSE}
1025 if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
1026 mode := GFX_AUTODETECT_FULLSCREEN
1027 else
1028 mode := GFX_AUTODETECT_WINDOWED;
1029 {$ENDIF}
1031 if sdl2allegro_bpp = 0 then sdl2allegro_bpp := gBPP;
1032 if sdl2allegro_bpp = 0 then sdl2allegro_bpp := deskbpp;
1034 set_color_depth(sdl2allegro_bpp);
1035 if set_gfx_mode(mode, w, h, 0, 0) = 0 then
1036 begin
1037 new(window);
1038 set_window_title(title);
1039 if sdl2allegro_screen <> nil then
1040 destroy_bitmap(sdl2allegro_screen);
1041 sdl2allegro_screen := create_system_bitmap(w, h);
1042 if sdl2allegro_screen = nil then
1043 sdl2allegro_screen := create_bitmap(w, h);
1044 ASSERT(sdl2allegro_screen <> nil);
1045 window.w := w;
1046 window.h := h;
1047 window.mode := mode;
1048 UpdatePalette;
1049 result := window
1050 end
1051 end;
1053 function SDL_SetWindowFullscreen(window: PSDL_Window; flags: UInt32): SInt32;
1054 var mode: Integer;
1055 begin
1056 ASSERT(window <> nil);
1057 result := -1;
1059 {$IF DEFINED(GO32V2)}
1060 mode := GFX_AUTODETECT;
1061 {$ELSE}
1062 if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
1063 mode := GFX_AUTODETECT_FULLSCREEN
1064 else
1065 mode := GFX_AUTODETECT_WINDOWED;
1066 {$ENDIF}
1068 set_color_depth(sdl2allegro_bpp);
1069 if set_gfx_mode(mode, window.w, window.h, 0, 0) = 0 then
1070 begin
1071 if sdl2allegro_screen <> nil then
1072 destroy_bitmap(sdl2allegro_screen);
1073 sdl2allegro_screen := create_system_bitmap(window.w, window.h);
1074 if sdl2allegro_screen = nil then
1075 sdl2allegro_screen := create_bitmap(window.w, window.h);
1076 ASSERT(sdl2allegro_screen <> nil);
1077 UpdatePalette;
1078 window.mode := mode;
1079 result := 0
1080 end
1081 end;
1083 procedure SDL_SetWindowSize(window: PSDL_Window; w: SInt32; h: SInt32);
1084 begin
1085 ASSERT(window <> nil);
1086 set_color_depth(sdl2allegro_bpp);
1087 if set_gfx_mode(window.mode, w, h, 0, 0) = 0 then
1088 begin
1089 if sdl2allegro_screen <> nil then
1090 destroy_bitmap(sdl2allegro_screen);
1091 sdl2allegro_screen := create_system_bitmap(w, h);
1092 if sdl2allegro_screen = nil then
1093 sdl2allegro_screen := create_bitmap(w, h);
1094 ASSERT(sdl2allegro_screen <> nil);
1095 UpdatePalette;
1096 window.w := w;
1097 window.h := h
1098 end
1099 else
1100 begin
1101 ASSERT(FALSE, 'Unable to set window size')
1102 end
1103 end;
1105 procedure SDL_DestroyWindow(window: PSDL_Window);
1106 begin
1107 if window = nil then exit;
1108 if sdl2allegro_screen <> nil then
1109 destroy_bitmap(sdl2allegro_screen);
1110 sdl2allegro_screen := nil;
1111 dispose(window)
1112 end;
1114 procedure SDL_GetWindowSize(window: PSDL_Window; w: PInt; h: PInt);
1115 begin
1116 ASSERT(window <> nil);
1117 if w <> nil then w^ := window.w;
1118 if h <> nil then h^ := window.h;
1119 end;
1121 procedure SDL_RestoreWindow(window: PSDL_Window);
1122 begin
1123 ASSERT(window <> nil);
1124 (* stub *)
1125 end;
1127 function SDL_SetWindowGammaRamp(window: PSDL_Window; const red: PUInt16; const green: PUInt16; const blue: PUInt16): SInt32;
1128 begin
1129 ASSERT(window <> nil);
1130 result := 0 (* stub *)
1131 end;
1133 function SDL_GetWindowGammaRamp(window: PSDL_Window; red: PUInt16; green: PUInt16; blue: PUInt16): SInt32;
1134 begin
1135 ASSERT(window <> nil);
1136 result := 0 (* stub *)
1137 end;
1139 (********** OPENGL MANAGEMENT **********)
1141 function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
1142 begin
1143 e_LogWritefln('SDL_GL_SetAttribute %s %s', [attr, value]);
1144 allegro_error := 'Attribute ' + IntToStr(attr) + ' := ' + IntToStr(value) + 'not supported';
1145 result := -1
1146 end;
1148 function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
1149 begin
1150 e_LogWritefln('SDL_GL_GetAttribute %s', [attr]);
1151 value^ := 0; result := -1
1152 end;
1154 function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
1155 begin
1156 result := window (* stub *)
1157 end;
1159 function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
1160 begin
1161 ASSERT(window <> nil);
1162 if context <> nil then
1163 ASSERT(window = context);
1164 result := 0 (* stub *)
1165 end;
1167 procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
1168 begin
1169 (* stub *)
1170 end;
1172 function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
1173 begin
1174 result := 0;
1175 if interval = 0 then
1176 useVsync := False
1177 else
1178 useVsync := True
1179 end;
1181 procedure SDL_GL_SwapWindow(window: PSDL_Window);
1182 begin
1183 ASSERT(window <> nil);
1184 ASSERT(sdl2allegro_screen <> nil);
1185 acquire_screen;
1186 blit(sdl2allegro_screen, screen, 0, 0, 0, 0, min(sdl2allegro_screen.w, screen.w), min(sdl2allegro_screen.h, screen.h));
1187 show_video_bitmap(screen);
1188 release_screen;
1189 if useVsync then
1190 vsync;
1191 end;
1193 (********** EVENTS **********)
1195 function SDL_PushEvent(event: PSDL_Event): SInt32;
1196 begin
1197 result := 1;
1198 case event.type_ of
1199 SDL_QUITEV: quit := True;
1200 else
1201 ASSERT(FALSE);
1202 result := 0
1203 end
1204 end;
1206 function SDL_PollEvent(event: PSDL_Event): SInt32;
1207 var alscan: Integer; pressed, shift, caps: Boolean;
1208 begin
1209 result := 0;
1211 if quit then
1212 begin
1213 quit := False;
1214 event.type_ := SDL_QUITEV;
1215 event.quit.timestamp := ticks;
1216 result := 1;
1217 Exit
1218 end;
1220 if inputText and (inputChar <> #0) then
1221 begin
1222 event.type_ := SDL_TEXTINPUT;
1223 event.text.timestamp := ticks;
1224 event.text.windowID := 0;
1225 event.text.text[0] := inputChar;
1226 event.text.text[1] := #0;
1227 inputChar := #0;
1228 result := 1;
1229 Exit
1230 end
1231 else
1232 inputChar := #0;
1234 poll_keyboard;
1235 if not IsEmptyKeyboard then
1236 begin
1237 alscan := NextScancode;
1238 pressed := alscan and $80 = 0;
1240 inputChar := #0;
1241 if pressed then
1242 begin
1243 shift := key_shifts and KB_SHIFT_FLAG <> 0;
1244 caps := key_shifts and KB_CAPSLOCK_FLAG <> 0;
1245 if shift xor caps then
1246 inputChar := s2uc[alscan and $7F]
1247 else
1248 inputChar := s2lc[alscan and $7F];
1249 event.type_ := SDL_KEYDOWN
1250 end
1251 else
1252 event.type_ := SDL_KEYUP;
1254 event.key.timestamp := ticks;
1255 event.key.windowID := 0;
1257 (**** df not use it?
1258 if pressed then
1259 event.key.state := SDL_PRESSED
1260 else
1261 event.key.state := SDL_RELEASED;
1262 ****)
1264 event.key._repeat := 0;
1265 event.key.keysym.scancode := s2sa[alscan and $7F];
1266 event.key.keysym.sym := 0; (* df not use it? *)
1267 event.key.keysym._mod := 0; (* df not use it? *)
1268 result := 1;
1269 Exit
1270 end
1271 end;
1273 (********** MOUSE **********)
1275 function SDL_ShowCursor(toggle: SInt32): SInt32;
1276 begin
1277 result := 0 (* stub *)
1278 end;
1280 (********** SDL **********)
1282 procedure AllegroQuitCallback; cdecl;
1283 begin
1284 quit := True
1285 end;
1286 procedure AllegroQuitCallbackEND; begin end;
1288 function SDL_SetHint(const name: PChar; const value: PChar): boolean;
1289 begin
1290 e_LogWritefln('SDL_SetHint %s %s', [name, value]);
1291 result := false (* stub *)
1292 end;
1294 function SDL_GetError: PAnsiChar;
1295 begin
1296 result := allegro_error
1297 end;
1299 {$IFDEF GO32V2}
1300 (* HACK: allegro crashes while init without this *)
1301 var
1302 __crt0_argv: PPchar; cvar; external;
1303 myargv: array [0..1] of Pchar;
1305 procedure FIX_ARGV;
1306 begin
1307 __crt0_argv := @myargv[0];
1308 myargv[0] := PChar(ParamStr(0));
1309 e_LogWritefln('argv[0] = %s', [myargv[0]]);
1310 end;
1311 {$ENDIF}
1313 function SDL_Init(flags: UInt32): SInt32;
1314 begin
1315 result := -1;
1316 {$IFDEF GO32V2}
1317 FIX_ARGV;
1318 {$ENDIF}
1319 if allegro_init = 0 then
1320 begin
1321 e_LogWriteln('Allegro Init: ok');
1322 {$IFDEF GO32V2}
1323 (* without this df dies with fire when swapped *)
1324 lock_data(ticks, sizeof(ticks));
1325 lock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
1326 lock_data(keybeg, sizeof(keybeg));
1327 lock_data(keyend, sizeof(keyend));
1328 lock_data(keyring, sizeof(keyring));
1329 lock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
1330 lock_data(quit, sizeof(quit));
1331 lock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
1332 {$ENDIF}
1333 install_timer;
1334 install_keyboard;
1335 keyboard_lowlevel_callback := KeyboardWatcher;
1336 set_keyboard_rate(0, 0);
1337 install_int_ex(AllegroTimerCallback, MSEC_TO_TIMER(1));
1338 set_close_button_callback(AllegroQuitCallback);
1339 deskbpp := desktop_color_depth;
1340 if deskbpp = 0 then deskbpp := 8;
1341 if get_desktop_resolution(@deskw, @deskh) <> 0 then
1342 begin
1343 deskw := 640;
1344 deskh := 480
1345 end;
1346 LoadCustomPalette('PLAYPAL.LMP');
1347 result := 0
1348 end
1349 end;
1351 procedure SDL_Quit;
1352 begin
1353 set_close_button_callback(nil);
1354 remove_keyboard;
1355 remove_timer;
1356 {$IFDEF GO32V2}
1357 unlock_data(ticks, sizeof(ticks));
1358 unlock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
1359 unlock_data(keybeg, sizeof(keybeg));
1360 unlock_data(keyend, sizeof(keyend));
1361 unlock_data(keyring, sizeof(keyring));
1362 unlock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
1363 unlock_data(quit, sizeof(quit));
1364 unlock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
1365 {$ENDIF}
1366 allegro_exit
1367 end;