DEADSOFTWARE

fixed small fonts, translation and change point size
[d2df-sdl.git] / src / wrappers / sdl2 / sdl2allegro.inc
index cb5ea6f7ad1f6f9b247e630f8008479c534f5d89..ebedf9c02a85980f99b5b8e619959d3a6c257575 100644 (file)
@@ -9,6 +9,9 @@ interface
   {$I sdlpixels.inc}
   {$I sdlscancode.inc}
 
+  const
+    DEFAULT_DEPTH = 8;
+
   const
     SDL_HAT_CENTERED  = $00;
     SDL_HAT_UP        = $01;
@@ -80,10 +83,10 @@ interface
       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;
 
@@ -362,16 +365,20 @@ interface
 
 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;
+    ticks: UInt32;
+    quit: Boolean;
 
   function IsEmptyKeyboard: Boolean;
   begin
@@ -395,17 +402,16 @@ implementation
 
   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;
@@ -534,28 +540,32 @@ implementation
 
 (********** 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 **********)
@@ -621,24 +631,26 @@ implementation
     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;
@@ -653,24 +665,25 @@ implementation
     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
@@ -680,16 +693,16 @@ implementation
   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
@@ -752,10 +765,15 @@ implementation
   end;
 
   procedure SDL_GL_SwapWindow(window: PSDL_Window);
+    var res: cint;
   begin
-    e_LogWriteln('SDL_GL_SwapWindow');
-    assert(sdl2allegro_screen <> nil);
-    show_video_bitmap(sdl2allegro_screen);
+    //e_LogWriteln('SDL_GL_SwapWindow');
+    ASSERT(sdl2allegro_screen <> nil);
+    acquire_screen;
+    blit(sdl2allegro_screen, screen, 0, 0, 0, 0, sdl2allegro_screen.w, sdl2allegro_screen.h);
+    res := show_video_bitmap(screen);
+    release_screen;
+//    ASSERT(res = 0);
   end;
 
   function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext;
@@ -773,7 +791,8 @@ implementation
   function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32;
   begin
     e_LogWritefln('SDL_GL_SetAttribute %s %s', [attr, value]);
-    result := -1;
+    allegro_error := 'Attribute ' + IntToStr(attr) + ' := ' + IntToStr(value) + 'not supported';
+    result := -1
   end;
 
   function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32;
@@ -786,8 +805,11 @@ implementation
 
   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;
@@ -874,28 +896,38 @@ implementation
   function SDL_PollEvent(event: PSDL_Event): SInt32;
     var alscan: Integer;
   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;
+
+    poll_keyboard;
     if not IsEmptyKeyboard then
     begin
       alscan := NextScancode;
       if alscan and $80 = 0 then
         event.type_ := SDL_KEYDOWN
       else
-        event.type_ := SDL_KEYDOWN;
-      event.key.timestamp := 0;
+        event.type_ := SDL_KEYUP;
+      event.key.timestamp := ticks;
       event.key.windowID := 0;
-      (* df not use it?
+      (**** df not use it?
       if alscan and $80 = 0 then
         event.key.state := SDL_PRESSED
       else
         event.key.state := SDL_RELEASED;
-      *)
+      ****)
       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;
 
@@ -904,58 +936,88 @@ implementation
   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;