# HG changeset patch # User koda # Date 1300984116 -3600 # Node ID fc6639d56799a774dbee43f7611937728bd5bbdc # Parent f215eb5d4b75012f1f58d618af9627b9ac4031bc this brings compatibility up with SDL HEAD (5504), but maybe breaks compatibility with sdl 1.2 so please test! still has problems with keyboard input and rendered ttf textures diff -r f215eb5d4b75 -r fc6639d56799 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Thu Mar 24 16:06:03 2011 +0100 +++ b/hedgewars/SDLh.pas Thu Mar 24 17:28:36 2011 +0100 @@ -93,46 +93,52 @@ ///////////////////// CONSTANT DEFINITIONS ///////////////////// ///////////////////////////////////////////////////////////////// - SDL_INIT_TIMER = $00000001; - SDL_INIT_AUDIO = $00000010; - SDL_INIT_VIDEO = $00000020; - SDL_INIT_JOYSTICK = $00000200; + // SDL_Init() flags + SDL_INIT_TIMER = $00000001; + SDL_INIT_AUDIO = $00000010; + SDL_INIT_VIDEO = $00000020; + SDL_INIT_JOYSTICK = $00000200; {$IFDEF SDL13} - SDL_INIT_HAPTIC = $00001000; + SDL_INIT_HAPTIC = $00001000; {$ELSE} - SDL_INIT_CDROM = $00000100; + SDL_INIT_CDROM = $00000100; + SDL_INIT_EVENTTHREAD = $01000000; {$ENDIF} SDL_INIT_NOPARACHUTE = $00100000; - SDL_INIT_EVENTTHREAD = $01000000; SDL_INIT_EVERYTHING = $0000FFFF; - SDL_APPINPUTFOCUS = 2; + SDL_APPINPUTFOCUS = $02; SDL_BUTTON_WHEELUP = 4; SDL_BUTTON_WHEELDOWN = 5; {$IFDEF SDL13} // SDL_Event types - SDL_FIRSTEVENT = 0; - SDL_QUITEV = $100; - SDL_WINDOWEVENT = $200; - SDL_SYSWMEVENT = $201; - SDL_KEYDOWN = $300; - SDL_KEYUP = $301; - SDL_TEXTEDITING = $302; - SDL_TEXTINPUT = $303; - SDL_MOUSEMOTION = $400; - SDL_MOUSEBUTTONDOWN = $401; - SDL_MOUSEBUTTONUP = $402; - SDL_MOUSEWHEEL = $403; - SDL_PROXIMITYIN = $500; - SDL_PROXIMITYOUT = $501; - SDL_JOYAXISMOTION = $600; - SDL_JOYBALLMOTION = $601; - SDL_JOYHATMOTION = $602; - SDL_JOYBUTTONDOWN = $603; - SDL_JOYBUTTONUP = $604; - SDL_USEREVENT = $8000; - SDL_LASTEVENT = $FFFF; + SDL_FIRSTEVENT = 0; + SDL_QUITEV = $100; + SDL_WINDOWEVENT = $200; + SDL_SYSWMEVENT = $201; + SDL_KEYDOWN = $300; + SDL_KEYUP = $301; + SDL_TEXTEDITING = $302; + SDL_TEXTINPUT = $303; + SDL_MOUSEMOTION = $400; + SDL_MOUSEBUTTONDOWN = $401; + SDL_MOUSEBUTTONUP = $402; + SDL_MOUSEWHEEL = $403; + SDL_INPUTMOTION = $500; + SDL_INPUTBUTTONDOWN = $501; + SDL_INPUTBUTTONUP = $502; + SDL_INPUTWHEEL = $503; + SDL_INPUTPROXIMITYIN = $504; + SDL_INPUTPROXIMITYOUT = $505; + SDL_JOYAXISMOTION = $600; + SDL_JOYBALLMOTION = $601; + SDL_JOYHATMOTION = $602; + SDL_JOYBUTTONDOWN = $603; + SDL_JOYBUTTONUP = $604; + //TODO: implement otheer event types + SDL_USEREVENT = $8000; + SDL_LASTEVENT = $FFFF; // SDL_Surface flags SDL_SWSURFACE = $00000000; //*< Not used */ @@ -153,15 +159,20 @@ SDL_RLEACCELOK = $08000000; //*< Not used */ SDL_HWACCEL = $08000000; //*< Not used */ + // SDL_Renderer flags + SDL_RENDERER_SOFTWARE = $00000001; //*< The renderer is a software fallback */ + SDL_RENDERER_ACCELERATED = $00000002; //*< The renderer uses hardware acceleration */ + SDL_RENDERER_PRESENTVSYNC = $00000004; + // SDL_WindowFlags (enum) SDL_WINDOW_FULLSCREEN = $00000001; //*< fullscreen window, implies borderless */ SDL_WINDOW_OPENGL = $00000002; //*< window usable with OpenGL context */ SDL_WINDOW_SHOWN = $00000004; //*< window is visible */ -// SDL_WINDOW_HIDDEN = $00000008; //*< window is not visible */ - SDL_WINDOW_BORDERLESS = $00000008; //*< no window decoration */ - SDL_WINDOW_RESIZABLE = $00000010; //*< window can be resized */ - SDL_WINDOW_MINIMIZED = $00000020; //*< window is minimized */ - SDL_WINDOW_MAXIMIZED = $00000040; //*< window is maximized */ + SDL_WINDOW_HIDDEN = $00000008; //*< window is not visible */ + SDL_WINDOW_BORDERLESS = $00000010; //*< no window decoration */ + SDL_WINDOW_RESIZABLE = $00000020; //*< window can be resized */ + SDL_WINDOW_MINIMIZED = $00000040; //*< window is minimized */ + SDL_WINDOW_MAXIMIZED = $00000080; //*< window is maximized */ SDL_WINDOW_INPUT_GRABBED = $00000100; //*< window has grabbed input focus */ SDL_WINDOW_INPUT_FOCUS = $00000200; //*< window has input focus */ SDL_WINDOW_MOUSE_FOCUS = $00000400; //*< window has mouse focus */ @@ -176,17 +187,15 @@ SDL_WINDOWEVENT_EXPOSED = 3; //*< Window has been exposed and should be redrawn SDL_WINDOWEVENT_MOVED = 4; //*< Window has been moved to data1, data2 SDL_WINDOWEVENT_RESIZED = 5; //*< Window size changed to data1xdata2 - SDL_WINDOWEVENT_MINIMIZED = 6; //*< Window has been minimized - SDL_WINDOWEVENT_MAXIMIZED = 7; //*< Window has been maximized - SDL_WINDOWEVENT_RESTORED = 8; //*< Window has been restored to normal size and position - SDL_WINDOWEVENT_ENTER = 9; //*< Window has gained mouse focus - SDL_WINDOWEVENT_LEAVE = 10; //*< Window has lost mouse focus - SDL_WINDOWEVENT_FOCUS_GAINED = 11; //*< Window has gained keyboard focus - SDL_WINDOWEVENT_FOCUS_LOST = 12; //*< Window has lost keyboard focus - SDL_WINDOWEVENT_CLOSE = 13; //*< The window manager requests that the window be closed */ - - SDL_RENDERER_ACCELERATED = $00000001; //*< The renderer uses hardware acceleration - SDL_RENDERER_PRESENTVSYNC = $00000002; //*< Present is synchronized with the refresh rate + SDL_WINDOWEVENT_SIZE_CHANGED = 6; //*< The window size has changed, [...] */ + SDL_WINDOWEVENT_MINIMIZED = 7; //*< Window has been minimized + SDL_WINDOWEVENT_MAXIMIZED = 8; //*< Window has been maximized + SDL_WINDOWEVENT_RESTORED = 9; //*< Window has been restored to normal size and position + SDL_WINDOWEVENT_ENTER = 10; //*< Window has gained mouse focus + SDL_WINDOWEVENT_LEAVE = 11; //*< Window has lost mouse focus + SDL_WINDOWEVENT_FOCUS_GAINED = 12; //*< Window has gained keyboard focus + SDL_WINDOWEVENT_FOCUS_LOST = 13; //*< Window has lost keyboard focus + SDL_WINDOWEVENT_CLOSE = 14; //*< The window manager requests that the window be closed */ {$ELSE} // SDL_Event types SDL_NOEVENT = 0; @@ -274,6 +283,12 @@ ///////////////////////////////////////////////////////////////// type +{$IFDEF SDL13} + PSDL_Window = Pointer; + PSDL_Renderer = Pointer; + PSDL_Texture = Pointer; +{$ENDIF} + PSDL_Rect = ^TSDL_Rect; TSDL_Rect = record {$IFDEF SDL13} @@ -285,15 +300,32 @@ end; TPoint = record - X: LongInt; - Y: LongInt; + X, Y: LongInt; end; PSDL_PixelFormat = ^TSDL_PixelFormat; TSDL_PixelFormat = record {$IFDEF SDL13} format: Longword; -{$ENDIF} + palette: Pointer; // actually it is a PSDL_Palette + BitsPerPixel : Byte; + BytesPerPixel: Byte; + padding: array[0..1] of Byte; + RMask : Longword; + GMask : Longword; + BMask : Longword; + AMask : Longword; + Rloss : Byte; + Gloss : Byte; + Bloss : Byte; + Aloss : Byte; + Rshift: Byte; + Gshift: Byte; + Bshift: Byte; + Ashift: Byte; + refcount: LongInt; + next: PSDL_PixelFormat; +{$ELSE} palette: Pointer; BitsPerPixel : Byte; BytesPerPixel: Byte; @@ -309,10 +341,6 @@ GMask : Longword; BMask : Longword; AMask : Longword; -{$IFDEF SDL13} - refcount: LongInt; - next: Pointer; -{$ELSE} colorkey: Longword; alpha: Byte; {$ENDIF} @@ -327,18 +355,25 @@ pitch : Word; pixels: Pointer; offset: LongInt; +{$IFDEF SDL13} + userdata: Pointer; + locked: LongInt; + lock_data: Pointer; + clip_rect: TSDL_Rect; + map: Pointer; + refcount: LongInt; +{$ENDIF} end; PSDL_Color = ^TSDL_Color; TSDL_Color = record case byte of - 0: ( r: Byte; - g: Byte; - b: Byte; - unused: Byte; - ); - 1: ( value: Longword); + 0: ( r: Byte; + g: Byte; + b: Byte; + unused: Byte; ); + 1: ( value: Longword; ); end; @@ -349,7 +384,7 @@ TClose = function( context: PSDL_RWops ): LongInt; cdecl; TStdio = record - autoclose: LongInt; + autoclose: {$IFDEF SDL13}boolean{$ELSE}LongInt{$ENDIF}; fp: pointer; end; @@ -379,9 +414,12 @@ {* SDL_Event type definition *} {$IFDEF SDL13} - PSDL_Window = pointer; - PSDL_Renderer = pointer; - PSDL_Texture = pointer; + TSDL_KeySym = record + scancode: LongInt; + sym: LongInt; + modifier: Smallint; + unicode: LongInt; + end; TSDL_WindowEvent = record type_: LongInt; @@ -390,15 +428,6 @@ padding1, padding2, padding3: byte; data1, data2: LongInt; end; - - TSDL_KeySym = record - scancode, - sym, - modifier, - unicode: LongInt; - end; - -// implement SDL_TextEditingEvent + SDL_TextInputEvent for sdl13 {$ELSE} TSDL_KeySym = record scancode: Byte; @@ -421,6 +450,22 @@ end; {$ENDIF} + TSDL_KeyboardEvent = record +{$IFDEF SDL13} + type_: LongInt; + windowID: LongInt; + state, repeat_, padding2, padding3: byte; +{$ELSE} + type_: byte; + which: byte; + state: byte; +{$ENDIF} + keysym: TSDL_KeySym; + end; + +//TODO: implement SDL_TextEditingEvent + SDL_TextInputEvent for sdl13 + + // this structure is wrong but the correct version makes the game hang TSDL_MouseMotionEvent = record which: byte; state: byte; @@ -437,27 +482,14 @@ {$ENDIF} end; - TSDL_KeyboardEvent = record + TSDL_MouseButtonEvent = record {$IFDEF SDL13} type_: LongInt; windowID: LongInt; - padding1, padding2: byte; -{$ELSE} - type_: byte; -{$ENDIF} - which: byte; - state: byte; - keysym: TSDL_KeySym; - end; - - TSDL_MouseButtonEvent = record -{$IFDEF SDL13} - _type: LongInt; - windowID: LongInt; x, y: LongInt; padding1: byte; {$ELSE} - _type, + type_, which, button, state: byte; @@ -471,21 +503,17 @@ windowID: LongInt; which: Byte; x, y: LongInt; - padding1, padding2, padding3: byte; end; - // implement SDL_ProximityEvent +//TODO: implement SDL_ProximityEvent {$ENDIF} TSDL_JoyAxisEvent = record -{$IFDEF SDL13} - type_: LongInt; -{$ELSE} - type_: Byte; -{$ENDIF} + type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; which: Byte; axis: Byte; {$IFDEF SDL13} + padding1, padding2: Byte; value: LongInt; {$ELSE} value: Smallint; @@ -493,45 +521,41 @@ end; TSDL_JoyBallEvent = record + type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; which: Byte; ball: Byte; {$IFDEF SDL13} - type_: LongInt; + padding1, padding2: Byte; xrel, yrel: LongInt; {$ELSE} - type_: Byte; xrel, yrel: Smallint; {$ENDIF} end; TSDL_JoyHatEvent = record -{$IFDEF SDL13} - type_: LongInt; -{$ELSE} - type_: Byte; -{$ENDIF} + type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; which: Byte; hat: Byte; value: Byte; +{$IFDEF SDL13} + padding1: Byte; +{$ENDIF} end; TSDL_JoyButtonEvent = record -{$IFDEF SDL13} - type_: LongInt; -{$ELSE} - type_: Byte; -{$ENDIF} + type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; which: Byte; button: Byte; state: Byte; +{$IFDEF SDL13} + padding1: Byte; +{$ENDIF} end; +//TODO: implement SDL_TouchButtonEvent, SDL_MultiGestureEvent, SDL_DollarGestureEvent + TSDL_QuitEvent = record -{$IFDEF SDL13} - type_: LongInt; -{$ELSE} - type_: Byte; -{$ENDIF} + type_: {$IFDEF SDL13}LongInt{$ELSE}Byte{$ENDIF}; end; TSDL_UserEvent = record @@ -550,7 +574,6 @@ {$IFDEF SDL13} case LongInt of SDL_FIRSTEVENT: (type_: LongInt); - SDL_QUITEV: (quit: TSDL_QuitEvent); SDL_WINDOWEVENT: (wevent: TSDL_WindowEvent); SDL_KEYDOWN, SDL_KEYUP: (key: TSDL_KeyboardEvent); @@ -565,7 +588,9 @@ SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent); SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent); + SDL_QUITEV: (quit: TSDL_QuitEvent); SDL_USEREVENT: (user: TSDL_UserEvent); + //TODO: implement other events {$ELSE} case Byte of SDL_NOEVENT: (type_: byte); @@ -757,12 +782,19 @@ function SDL_AllocFormat(format: Longword): PSDL_PixelFormat; cdecl; external SDLLibName; procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); cdecl; external SDLLibName; +procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName; + +procedure SDL_WarpMouse(x, y: Word); +{$ELSE} +procedure SDL_WarpMouse(x, y: Word); cdecl; external SDLLibName; + +function SDL_AllocFormat(format: Longword): PSDL_PixelFormat; +procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); {$ENDIF} function SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName {$IFDEF SDL13} name 'SDL_GetKeyboardState'{$ENDIF}; function SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName; function SDL_GetKeyName(key: Longword): PChar; cdecl; external SDLLibName; -procedure SDL_WarpMouse(x, y: Word); cdecl; external SDLLibName; procedure SDL_PumpEvents; cdecl; external SDLLibName; function SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName; @@ -860,7 +892,7 @@ function IMG_Load(const _file: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName; function IMG_Load_RW(rwop: PSDL_RWops; freesrc: LongInt): PSDL_Surface; cdecl; external SDL_ImageLibName; function IMG_LoadPNG_RW(rwop: PSDL_RWops): PSDL_Surface; cdecl; external SDL_ImageLibName; -function IMG_LoadTyped_RW(rwop: PSDL_RWops; freesrc: LongInt; _type: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName; +function IMG_LoadTyped_RW(rwop: PSDL_RWops; freesrc: LongInt; type_: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName; (* SDL_net *) function SDLNet_Init: LongInt; cdecl; external SDL_NetLibName; @@ -884,6 +916,31 @@ function SDLNet_Read32(buf: pointer): LongWord; implementation +uses uVariables; + +{$IFDEF SDL13} +procedure SDL_WarpMouse(x, y: Word); +begin + SDL_WarpMouseInWindow(SDLwindow, x, y); +end; +{$ELSE} +function SDL_AllocFormat(format: Longword): PSDL_PixelFormat; +const conversionFormat: TSDL_PixelFormat = ( + palette: nil; BitsPerPixel: 32; BytesPerPixel: 4; + Rloss: 0; Gloss: 0; Bloss: 0; Aloss: 0; + Rshift: RShift; Gshift: GShift; Bshift: BShift; Ashift: AShift; + RMask: RMask; GMask: GMask; BMask: BMask; AMask: AMask; + colorkey: 0; alpha: 255); +begin + format:= format; + exit(@conversionFormat); +end; + +procedure SDL_FreeFormat; +begin + // yay free space +end; +{$ENDIF} function SDL_MustLock(Surface: PSDL_Surface): Boolean; begin diff -r f215eb5d4b75 -r fc6639d56799 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Thu Mar 24 16:06:03 2011 +0100 +++ b/hedgewars/uMisc.pas Thu Mar 24 17:28:36 2011 +0100 @@ -118,21 +118,12 @@ // http://www.idevgames.com/forums/thread-5602-post-21860.html#pid21860 function doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface; -const conversionFormat: TSDL_PixelFormat = ( -{$IFDEF SDL13}format: 0;{$ENDIF} - palette: nil; BitsPerPixel: 32; BytesPerPixel: 4; - Rloss: 0; Gloss: 0; Bloss: 0; Aloss: 0; -{$IFDEF ENDIAN_LITTLE}Rshift: 0; Gshift: 8; Bshift: 16; Ashift: 24; -{$ELSE} Rshift: 24; Gshift: 16; Bshift: 8; Ashift: 0;{$ENDIF} - RMask: RMask; GMask: GMask; BMask: BMask; AMask: AMask; -{$IFDEF SDL13}refcount: 0; next: nil; -{$ELSE} colorkey: 0; alpha: 255{$ENDIF}); var convertedSurf: PSDL_Surface; begin if ((tmpsurf^.format^.bitsperpixel = 32) and (tmpsurf^.format^.rshift > tmpsurf^.format^.bshift)) or (tmpsurf^.format^.bitsperpixel = 24) then begin - convertedSurf:= SDL_ConvertSurface(tmpsurf, @conversionFormat, SDL_SWSURFACE); + convertedSurf:= SDL_ConvertSurface(tmpsurf, conversionFormat, SDL_SWSURFACE); SDL_FreeSurface(tmpsurf); exit(convertedSurf); end; @@ -150,11 +141,14 @@ procedure initModule; begin + // SDL_PIXELFORMAT_RGB8888 + conversionFormat:= SDL_AllocFormat($86462004); end; procedure freeModule; begin recordFileName:= ''; + SDL_FreeFormat(conversionFormat); end; end. diff -r f215eb5d4b75 -r fc6639d56799 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Thu Mar 24 16:06:03 2011 +0100 +++ b/hedgewars/uVariables.pas Thu Mar 24 17:28:36 2011 +0100 @@ -158,6 +158,7 @@ Theme : shortstring; disableLandBack : boolean; + conversionFormat: PSDL_PixelFormat; {$IFDEF SDL13} SDLwindow : PSDL_Window;