X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fwrappers%2Fsdl2%2Fsdl2allegro.inc;h=ebedf9c02a85980f99b5b8e619959d3a6c257575;hb=f2421615862d0a6c093c6fc3117849010d26557b;hp=cb5ea6f7ad1f6f9b247e630f8008479c534f5d89;hpb=1d24275aa4b72cac9efc1e14ba377307f89d7728;p=d2df-sdl.git diff --git a/src/wrappers/sdl2/sdl2allegro.inc b/src/wrappers/sdl2/sdl2allegro.inc index cb5ea6f..ebedf9c 100644 --- a/src/wrappers/sdl2/sdl2allegro.inc +++ b/src/wrappers/sdl2/sdl2allegro.inc @@ -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;