index cb5ea6f7ad1f6f9b247e630f8008479c534f5d89..3392c68ef45f081cd50a796f15d189122fc31401 100644 (file)
{$I sdlpixels.inc}
{$I sdlscancode.inc}
+ const
+ DEFAULT_DEPTH = 8;
+
const
SDL_HAT_CENTERED = $00;
SDL_HAT_UP = $01;
1: (mem: TMem);
2: (unknown: TUnknown);
{$IFDEF ANDROID}
- 3: (androidio: TAndroidIO);
+ //3: (androidio: TAndroidIO);
{$ENDIF}
{$IFDEF WINDOWS}
- 3: (windowsio: TWindowsIO);
+ //3: (windowsio: TWindowsIO);
{$ENDIF}
end;
type_: UInt32; // SDL_TEXTINPUT
timestamp: UInt32;
windowID: UInt32; // The window with keyboard focus, if any
- text: array[0..SDL_TEXTINPUTEVENT_TEXT_SIZE] of Char; // The input text
+ text: array[0..SDL_TEXTINPUTEVENT_TEXT_SIZE - 1] of Char; // The input text
end;
TSDL_QuitEvent = record
implementation
- uses e_Log, SysUtils;
+ uses
+ {$IFDEF GO32V2}
+ go32,
+ {$ENDIF}
+ e_Log, SysUtils, ctypes;
const
maxKeyBuffer = 64;
var
- __crt0_argv: PPchar; cvar; external;
- myargv: array [0..255] of Pchar;
keyring: array [0..maxKeyBuffer - 1] of Integer;
keybeg, keyend: Integer;
+ inputChar: Char;
+ inputText: Boolean;
+ ticks: UInt32;
+ quit: Boolean;
+
+ s2lc: array [0..KEY_MAX] of char = (
+ #00, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4',
+ '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
+ #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '`', '-', '=', #00,
+ #09, '[', ']', #10, ';', #39, '\', '\', ',', '.', '/', ' ', #00, #00, #00, #00,
+ #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
+ #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
+ #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
+ );
+ s2uc: array [0..KEY_MAX] of char = (
+ #00, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ')', '!', '@', '#', '$',
+ '%', '^', '&', '*', '(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #00,
+ #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, '~', '_', '+', #00,
+ #09, '{', '}', #10, ':', '"', '|', '|', '<', '>', '?', ' ', #00, #00, #00, #00,
+ #00, #00, #00, #00, #00, '/', '*', '-', '+', #00, #00, #00, #00, #00, #00, #00,
+ #00, #00, #00, #00, '@', #00, ':', #00, '=', #00, ';', #00, #00, #00, #00, #00,
+ #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
+ );
function IsEmptyKeyboard: Boolean;
begin
procedure KeyboardWatcher (scancode: Integer); cdecl;
begin
- if not IsFullKeyboard then
+ if (keybeg - 1) mod maxKeyBuffer <> keyend then (* not IsFullKeyboard *)
begin
keyring[keyend] := scancode;
keyend := (keyend + 1) mod maxKeyBuffer
end
end;
+ procedure KeyboardWatcherEND; begin end;
/// MACRO ///
-//from "sdl_pixels.h"
-
function SDL_PIXELFLAG(X: Cardinal): Cardinal;
begin
Result := (X shr 28) and $0F;
function SDL_IsTextInputActive: TSDL_Bool;
begin
- result := SDL_FALSE
+ if inputText then
+ result := SDL_TRUE
+ else
+ result := SDL_FALSE
end;
procedure SDL_StartTextInput;
begin
+ inputText := True
end;
procedure SDL_StopTextInput;
begin
+ inputText := False
end;
(********** JOYSTICK **********)
(********** TIMERS **********)
+ procedure AllegroTimerCallback; cdecl;
+ begin
+ inc(ticks)
+ end;
+ procedure AllegroTimerCallbackEND; begin end;
+
function SDL_GetPerformanceCounter: UInt64;
begin
- e_LogWriteln('SDL_GetPerformanceCounter');
- result := 1
+ (* TODO *)
+ result := ticks;
end;
function SDL_GetPerformanceFrequency: UInt64;
begin
- e_LogWriteln('SDL_GetPerformanceFrequency');
+ (* TODO *)
result := 1
end;
procedure SDL_Delay(ms: UInt32);
begin
- e_LogWriteln('SDL_Delay');
- //allegro_rest(ms)
+ rest(ms)
end;
function SDL_GetTicks: UInt32;
begin
- e_LogWriteln('SDL_GetTicks');
- result := 1
+ result := ticks;
end;
(********** DISPLAY MODES **********)
e_LogWritefln('SDL_CreateWindow %s %s %s %s %s %u', [title, x, y, w, h, flags]);
result := nil;
+{$IF DEFINED(GO32V2)}
+ mode := GFX_AUTODETECT;
+{$ELSE}
if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
mode := GFX_AUTODETECT_FULLSCREEN
else
mode := GFX_AUTODETECT_WINDOWED;
- mode := GFX_SAFE;
+{$ENDIF}
+ set_color_depth(DEFAULT_DEPTH);
if set_gfx_mode(mode, w, h, 0, 0) = 0 then
begin
new(window);
set_window_title(title);
if sdl2allegro_screen <> nil then
destroy_bitmap(sdl2allegro_screen);
- sdl2allegro_screen := create_video_bitmap(w, h);
- if sdl2allegro_screen = nil then
- sdl2allegro_screen := create_system_bitmap(w, h);
+ sdl2allegro_screen := create_system_bitmap(w, h);
if sdl2allegro_screen = nil then
sdl2allegro_screen := create_bitmap(w, h);
- assert(sdl2allegro_screen <> nil);
+ ASSERT(sdl2allegro_screen <> nil);
window.w := w;
window.h := h;
window.mode := mode;
result := -1;
if window = nil then exit;
+{$IF DEFINED(GO32V2)}
+ mode := GFX_AUTODETECT;
+{$ELSE}
if (flags and (SDL_WINDOW_FULLSCREEN or SDL_WINDOW_FULLSCREEN_DESKTOP)) <> 0 then
mode := GFX_AUTODETECT_FULLSCREEN
else
mode := GFX_AUTODETECT_WINDOWED;
- mode := GFX_SAFE;
+{$ENDIF}
+ set_color_depth(DEFAULT_DEPTH);
if set_gfx_mode(mode, window.w, window.h, 0, 0) = 0 then
begin
-(*
if sdl2allegro_screen <> nil then
destroy_bitmap(sdl2allegro_screen);
-*)
- sdl2allegro_screen := create_video_bitmap(window.w, window.h);
- if sdl2allegro_screen = nil then
- sdl2allegro_screen := create_system_bitmap(window.w, window.h);
+ sdl2allegro_screen := create_system_bitmap(window.w, window.h);
if sdl2allegro_screen = nil then
sdl2allegro_screen := create_bitmap(window.w, window.h);
- assert(sdl2allegro_screen <> nil);
+ ASSERT(sdl2allegro_screen <> nil);
+ set_palette(desktop_palette);
window.mode := mode;
result := 0
end
begin
e_LogWritefln('SDL_SetWindowSize %s %s', [w, h]);
if window = nil then exit;
+ set_color_depth(DEFAULT_DEPTH);
if set_gfx_mode(window.mode, w, h, 0, 0) = 0 then
begin
if sdl2allegro_screen <> nil then
destroy_bitmap(sdl2allegro_screen);
- if sdl2allegro_screen = nil then
- sdl2allegro_screen := create_system_bitmap(w, h);
+ sdl2allegro_screen := create_system_bitmap(w, h);
if sdl2allegro_screen = nil then
sdl2allegro_screen := create_bitmap(w, h);
- sdl2allegro_screen := create_video_bitmap(w, h);
- assert(sdl2allegro_screen <> nil);
+ ASSERT(sdl2allegro_screen <> nil);
+ set_palette(desktop_palette);
window.w := w;
window.h := h;
end
(********** OPENGL MANAGEMENT **********)
- function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
- begin
- e_LogWriteln('SDL_GL_MakeCurrent');
- result := 0
- end;
-
- procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
+ function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
begin
- e_LogWriteln('SDL_GL_DeleteContext');
+ e_LogWritefln('SDL_GL_SetAttribute %s %s', [attr, value]);
+ allegro_error := 'Attribute ' + IntToStr(attr) + ' := ' + IntToStr(value) + 'not supported';
+ result := -1
end;
- procedure SDL_GL_SwapWindow(window: PSDL_Window);
+ function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
begin
- e_LogWriteln('SDL_GL_SwapWindow');
- assert(sdl2allegro_screen <> nil);
- show_video_bitmap(sdl2allegro_screen);
+ e_LogWritefln('SDL_GL_GetAttribute %s', [attr]);
+ value^ := 0; result := -1
end;
function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
result := window
end;
- function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
+ function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32;
begin
- e_LogWritefln('SDL_GL_SetSwapInterval %s', [interval]);
+ e_LogWriteln('SDL_GL_MakeCurrent');
result := 0
end;
- function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
+ procedure SDL_GL_DeleteContext(context: TSDL_GLContext);
begin
- e_LogWritefln('SDL_GL_SetAttribute %s %s', [attr, value]);
- result := -1;
+ e_LogWriteln('SDL_GL_DeleteContext');
end;
- function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
+ function SDL_GL_SetSwapInterval(interval: SInt32): SInt32;
begin
- e_LogWritefln('SDL_GL_GetAttribute %s', [attr]);
- value^ := 0; result := -1
+ e_LogWritefln('SDL_GL_SetSwapInterval %s', [interval]);
+ result := 0
+ end;
+
+ procedure SDL_GL_SwapWindow(window: PSDL_Window);
+ begin
+ ASSERT(sdl2allegro_screen <> nil);
+ acquire_screen;
+ blit(sdl2allegro_screen, screen, 0, 0, 0, 0, sdl2allegro_screen.w, sdl2allegro_screen.h);
+ show_video_bitmap(screen);
+ release_screen;
end;
(********** EVENTS **********)
function SDL_PushEvent(event: PSDL_Event): SInt32;
begin
- e_LogWriteln('SDL_PushEvent');
- result := 0
+ result := 1;
+ case event.type_ of
+ SDL_QUITEV: quit := True;
+ else ASSERT(FALSE); result := 0
+ end
end;
function allegro_to_sdl_scancode (x: Integer): Integer;
end;
function SDL_PollEvent(event: PSDL_Event): SInt32;
- var alscan: Integer;
+ var alscan: Integer; pressed, shift, caps: Boolean;
begin
- e_LogWriteln('SDL_PollEvent');
- poll_keyboard;
result := 0;
+
+ if quit then
+ begin
+ quit := False;
+ event.type_ := SDL_QUITEV;
+ event.quit.timestamp := ticks;
+ result := 1;
+ Exit
+ end;
+
+ if inputText and (inputChar <> #0) then
+ begin
+ event.type_ := SDL_TEXTINPUT;
+ event.text.timestamp := ticks;
+ event.text.windowID := 0;
+ event.text.text[0] := inputChar;
+ event.text.text[1] := #0;
+ inputChar := #0;
+ result := 1;
+ Exit
+ end;
+
+ poll_keyboard;
if not IsEmptyKeyboard then
begin
alscan := NextScancode;
- if alscan and $80 = 0 then
+ pressed := alscan and $80 = 0;
+ if pressed then
+ begin
+ shift := key_shifts and KB_SHIFT_FLAG <> 0;
+ caps := key_shifts and KB_CAPSLOCK_FLAG <> 0;
+ if shift xor caps then
+ inputChar := s2uc[alscan and $7F]
+ else
+ inputChar := s2lc[alscan and $7F];
event.type_ := SDL_KEYDOWN
+ end
else
- event.type_ := SDL_KEYDOWN;
- event.key.timestamp := 0;
+ begin
+ inputChar := #0;
+ event.type_ := SDL_KEYUP
+ end;
+ event.key.timestamp := ticks;
event.key.windowID := 0;
- (* df not use it?
- if alscan and $80 = 0 then
+ (**** df not use it?
+ if pressed then
event.key.state := SDL_PRESSED
else
event.key.state := SDL_RELEASED;
- *)
+ ****)
+ event.key._repeat := 0;
event.key.keysym.scancode := allegro_to_sdl_scancode(alscan);
event.key.keysym.sym := 0; (* df not use it? *)
event.key.keysym._mod := 0; (* df not use it? *)
- result := 1
+ result := 1;
+ Exit
end
end;
function SDL_ShowCursor(toggle: SInt32): SInt32;
begin
e_LogWritefln('SDL_ShowCursor %s', [toggle]);
+ (* TODO *)
result := 0
end;
(********** SDL **********)
+ procedure AllegroQuitCallback; cdecl;
+ begin
+ quit := True
+ end;
+ procedure AllegroQuitCallbackEND; begin end;
+
function SDL_SetHint( const name: PChar; const value: PChar) : boolean;
begin
e_LogWritefln('SDL_SetHint %s %s', [name, value]);
+ (* TODO *)
result := false
end;
function SDL_GetError: PAnsiChar;
begin
- e_LogWritefln('SDL_GetError => %s', [allegro_error]);
result := allegro_error;
end;
- function TestGet: AnsiString;
- begin
- result := '+++ Test concat qwertyiop!'
- end;
+{$IFDEF GO32V2}
+ (* HACK: allegro crashes while init without this *)
+ var
+ __crt0_argv: PPchar; cvar; external;
+ myargv: array [0..255] of Pchar;
- procedure Test;
+ procedure FIX_ARGV;
begin
- // WTF? when 'Test concat qwertyio! ' it not messed!
- //e_LogWriteln('Test concat qwertyiop! ' + ParamStr(0));
- e_LogWriteln('Test concat qwertyiop! ' + TestGet);
+ __crt0_argv := @myargv[0];
+ myargv[0] := PChar(ParamStr(0));
+ e_LogWritefln('argv[0] = %s', [myargv[0]]);
end;
+{$ENDIF}
function SDL_Init(flags: UInt32): SInt32;
begin
- Test;
- e_LogWritefln('SDL_Init %u', [flags]);
result := -1;
- __crt0_argv := @myargv[0];
- myargv[0] := PChar(ParamStr(0));
- e_LogWritefln('argv[0] = %s', [myargv[0]]);
+ {$IFDEF GO32V2}
+ FIX_ARGV;
+ {$ENDIF}
if allegro_init = 0 then
begin
- e_LogWriteln('SDL_Init inited! ' + ParamStr(0) + ' ');
+ e_LogWriteln('Allegro Init: ok');
+ {$IFDEF GO32V2}
+ (* without this df dies with fire when swapped *)
+ lock_data(ticks, sizeof(ticks));
+ lock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
+ lock_data(keybeg, sizeof(keybeg));
+ lock_data(keyend, sizeof(keyend));
+ lock_data(keyring, sizeof(keyring));
+ lock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
+ lock_data(quit, sizeof(quit));
+ lock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
+ {$ENDIF}
install_timer;
install_keyboard;
keyboard_lowlevel_callback := KeyboardWatcher;
set_keyboard_rate(0, 0);
+ install_int_ex(AllegroTimerCallback, MSEC_TO_TIMER(1));
+ set_close_button_callback(AllegroQuitCallback);
result := 0
end
end;
procedure SDL_Quit;
begin
- e_LogWriteln('SDL_Quit');
+ set_close_button_callback(nil);
remove_keyboard;
remove_timer;
+ {$IFDEF GO32V2}
+ unlock_data(ticks, sizeof(ticks));
+ unlock_code(@AllegroTimerCallback, PtrUInt(@AllegroTimerCallbackEND) - PtrUInt(@AllegroTimerCallback));
+ unlock_data(keybeg, sizeof(keybeg));
+ unlock_data(keyend, sizeof(keyend));
+ unlock_data(keyring, sizeof(keyring));
+ unlock_code(@KeyboardWatcher, PtrUInt(@KeyboardWatcherEND) - PtrUInt(@KeyboardWatcher));
+ unlock_data(quit, sizeof(quit));
+ unlock_code(@AllegroQuitCallback, PtrUInt(@AllegroQuitCallbackEND) - PtrUInt(@AllegroQuitCallback));
+ {$ENDIF}
allegro_exit
end;