hedgewars/SDLh.pas
branchwebgl
changeset 9521 8054d9d775fd
parent 9236 ddd675825672
parent 9378 2be457289e60
child 9952 32f5982604f4
--- a/hedgewars/SDLh.pas	Fri Oct 11 11:55:31 2013 +0200
+++ b/hedgewars/SDLh.pas	Fri Oct 11 17:43:13 2013 +0200
@@ -89,20 +89,22 @@
 /////////////////////////////////////////////////////////////////
 
     // 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_TIMER          = $00000001;
+    SDL_INIT_AUDIO          = $00000010;
+    SDL_INIT_VIDEO          = $00000020; // implies SDL_INIT_EVENTS (sdl2)
+    SDL_INIT_JOYSTICK       = $00000200; // implies SDL_INIT_EVENTS (sdl2)
+{$IFDEF SDL2}
+    SDL_INIT_HAPTIC         = $00001000;
+    SDL_INIT_GAMECONTROLLER = $00002000; // implies SDL_INIT_JOYSTICK
+    SDL_INIT_EVENTS         = $00004000;
 {$ELSE}
-    SDL_INIT_CDROM       = $00000100;
-    SDL_INIT_EVENTTHREAD = $01000000;
+    SDL_INIT_CDROM          = $00000100;
+    SDL_INIT_EVENTTHREAD    = $01000000;
 {$ENDIF}
-    SDL_INIT_NOPARACHUTE = $00100000;
-    SDL_INIT_EVERYTHING  = $0000FFFF;
+    SDL_INIT_NOPARACHUTE    = $00100000;
+    //SDL_INIT_EVERYTHING                // unsafe, init subsystems one at a time
 
-    SDL_ALLEVENTS        = $FFFFFFFF;
+    SDL_ALLEVENTS        = $FFFFFFFF;    // dummy event type to prevent stack corruption
     SDL_APPINPUTFOCUS    = $02;
 
     SDL_BUTTON_LEFT      = 1;
@@ -111,10 +113,20 @@
     SDL_BUTTON_WHEELUP   = 4;
     SDL_BUTTON_WHEELDOWN = 5;
 
-{$IFDEF SDL13}
+
+{$IFDEF SDL2}
     // SDL_Event types
-    SDL_FIRSTEVENT        = 0;
+    // pascal does not support unions as is, so we list here every possible event
+    // and later associate a struct type each
+    SDL_FIRSTEVENT        = 0;              // type
+    SDL_COMMONDEVENT      = 1;              // type and timestamp
     SDL_QUITEV            = $100;
+    SDL_APP_TERMINATING   = $101;
+    SDL_APP_LOWMEMORY     = $102;
+    SDL_APP_WILLENTERBACKGROUND = $103;
+    SDL_APP_DIDENTERBACKGROUND = $104;
+    SDL_APP_WILLENTERFOREGROUND = $105;
+    SDL_APP_DIDENTERFOREGROUND = $106;
     SDL_WINDOWEVENT       = $200;
     SDL_SYSWMEVENT        = $201;
     SDL_KEYDOWN           = $300;
@@ -125,22 +137,22 @@
     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;
+    SDL_JOYDEVICEADDED    = $605;
+    SDL_JOYDEVICEREMOVED  = $606;
+    SDL_CONTROLLERAXISMOTION = $650;
+    SDL_CONTROLLERBUTTONDOWN = $651;
+    SDL_CONTROLLERBUTTONUP = $652;
+    SDL_CONTROLLERDEVICEADDED = $653;
+    SDL_CONTROLLERDEVICEREMOVED = $654;
+    SDL_CONTROLLERDEVICEREMAPPED = $655;
     SDL_FINGERDOWN        = $700;
     SDL_FINGERUP          = $701;
     SDL_FINGERMOTION      = $702;
-    SDL_TOUCHBUTTONDOWN   = $703;
-    SDL_TOUCHBUTTONUP     = $704;
     SDL_DOLLARGESTURE     = $800;
     SDL_DOLLARRECORD      = $801;
     SDL_MULTIGESTURE      = $802;
@@ -148,33 +160,21 @@
     SDL_DROPFILE          = $1000;
     SDL_USEREVENT         = $8000;
     SDL_LASTEVENT         = $FFFF;
-    // no compatibility events $7000
 
     // SDL_Surface flags
     SDL_SWSURFACE   = $00000000;  //*< Not used */
     SDL_PREALLOC    = $00000001;  //*< Surface uses preallocated memory */
     SDL_RLEACCEL    = $00000002;  //*< Surface is RLE encoded */
     SDL_DONTFREE    = $00000004;  //*< Surface is referenced internally */
-    SDL_SRCALPHA    = $00010000;
-    SDL_SRCCOLORKEY = $00020000;
-    SDL_ANYFORMAT   = $00100000;
-    SDL_HWPALETTE   = $00200000;
-    SDL_DOUBLEBUF   = $00400000;
-    SDL_FULLSCREEN  = $00800000;
-    SDL_RESIZABLE   = $01000000;
-    SDL_NOFRAME     = $02000000;
-    SDL_OPENGL      = $04000000;
-    SDL_HWSURFACE   = $08000001;  //*< Not used */
-    SDL_ASYNCBLIT   = $08000000;  //*< Not used */
-    SDL_RLEACCELOK  = $08000000;  //*< Not used */
-    SDL_HWACCEL     = $08000000;  //*< Not used */
+    SDL_SRCCOLORKEY = $00020000;  // compatibility only
 
-    // SDL_Renderer flags
+    // SDL_RendererFlags
     SDL_RENDERER_SOFTWARE     = $00000001;     //*< The renderer is a software fallback */
     SDL_RENDERER_ACCELERATED  = $00000002;     //*< The renderer uses hardware acceleration */
-    SDL_RENDERER_PRESENTVSYNC = $00000004;
+    SDL_RENDERER_PRESENTVSYNC = $00000004;     //*< Present is synchronized with the refresh rate */
+    SDL_RENDERER_TARGETTEXTURE = $00000008;    //*< The renderer supports rendering to texture */
 
-    // SDL_WindowFlags (enum)
+    // SDL_WindowFlags
     SDL_WINDOW_FULLSCREEN    = $00000001;      //*< fullscreen window, implies borderless */
     SDL_WINDOW_OPENGL        = $00000002;      //*< window usable with OpenGL context */
     SDL_WINDOW_SHOWN         = $00000004;      //*< window is visible */
@@ -186,11 +186,12 @@
     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 */
+    SDL_WINDOW_FULLSCREEN_DESKTOP = $00001001; //*< fullscreen as maximed window */
     SDL_WINDOW_FOREIGN       = $00000800;      //*< window not created by SDL */
 
     SDL_WINDOWPOS_CENTERED_MASK = $2FFF0000;
 
-    // SDL_WindowEventID (enum)
+    // SDL_WindowEventID
     SDL_WINDOWEVENT_NONE         = 0;    //*< Never used
     SDL_WINDOWEVENT_SHOWN        = 1;    //*< Window has been shown
     SDL_WINDOWEVENT_HIDDEN       = 2;    //*< Window has been hidden
@@ -312,6 +313,7 @@
     SDLK_q         = 113;
     SDLK_w         = 119;
     SDLK_DELETE    = 127;
+    SDLK_KP_ENTER  = 271;
     SDLK_UP        = 273;
     SDLK_DOWN      = 274;
     SDLK_RIGHT     = 275;
@@ -331,18 +333,20 @@
 // http://www.freepascal.org/docs-html/prog/progsu144.html
 
 type
-{$IFDEF SDL13}
+{$IFDEF SDL2}
     PSDL_Window   = Pointer;
     PSDL_Renderer = Pointer;
     PSDL_Texture  = Pointer;
     PSDL_GLContext= Pointer;
-    TSDL_FingerId = Int64;
     TSDL_TouchId  = Int64;
 {$ENDIF}
+    TSDL_FingerId = Int64;
+
+    TSDL_eventaction = (SDL_ADDEVENT, SDL_PEEPEVENT, SDL_GETEVENT);
 
     PSDL_Rect = ^TSDL_Rect;
     TSDL_Rect = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         x, y, w, h: LongInt;
 {$ELSE}
         x, y: SmallInt;
@@ -351,12 +355,12 @@
         end;
 
     TPoint = record
-        X, Y: LongInt;
+        x, y: LongInt;
         end;
 
     PSDL_PixelFormat = ^TSDL_PixelFormat;
     TSDL_PixelFormat = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         format: LongWord;
         palette: Pointer;
         BitsPerPixel : Byte;
@@ -397,27 +401,24 @@
 {$ENDIF}
         end;
 
-    TSDL_eventaction = (SDL_ADDEVENT, SDL_PEEKEVENT, SDL_GETEVENT);
-
     PSDL_Surface = ^TSDL_Surface;
     TSDL_Surface = record
         flags : LongWord;
         format: PSDL_PixelFormat;
         w, h  : LongInt;
-        pitch : {$IFDEF SDL13}LongInt{$ELSE}Word{$ENDIF};
+        pitch : {$IFDEF SDL2}LongInt{$ELSE}Word{$ENDIF};
         pixels: Pointer;
-        offset: LongInt;
 {$IFDEF PAS2C}
-	hwdata:Pointer;
-	clip_rect:TSDL_Rect;
+        hwdata:Pointer;
+        clip_rect:TSDL_Rect;
         unsed1:LongWord;
         locked:LongWord;
         map:Pointer;
         format_version:Longword;
         refcount:LongInt;
+        offset: LongInt;
 {$ELSE}
-		      
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         userdata: Pointer;
         locked: LongInt;
         lock_data: Pointer;
@@ -434,18 +435,24 @@
             r: Byte;
             g: Byte;
             b: Byte;
-            unused: Byte;
+            a: Byte; //sdl12 name is 'unused' but as long as size matches...
         end;
 
 
+    (* SDL_RWops and friends *)
     PSDL_RWops = ^TSDL_RWops;
+{$IFDEF SDL2}
+    TSize  = function( context: PSDL_RWops): Int64; cdecl;
+    TSeek  = function( context: PSDL_RWops; offset: Int64; whence: LongInt ): Int64; cdecl;
+{$ELSE}
     TSeek  = function( context: PSDL_RWops; offset: LongInt; whence: LongInt ): LongInt; cdecl;
+{$ENDIF}
     TRead  = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; maxnum : LongInt ): LongInt;  cdecl;
     TWrite = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; num: LongInt ): LongInt; cdecl;
     TClose = function( context: PSDL_RWops ): LongInt; cdecl;
 
     TStdio = record
-        autoclose: {$IFDEF SDL13}Boolean{$ELSE}LongInt{$ENDIF};
+        autoclose: {$IFDEF SDL2}Boolean{$ELSE}LongInt{$ENDIF};
         fp: Pointer;
         end;
 
@@ -457,29 +464,63 @@
 
     TUnknown = record
         data1: Pointer;
+{$IFDEF SDL2}
+        data2: Pointer;
+{$ENDIF}
         end;
 
+{$IFDEF ANDROID}
+    TAndroidio = record
+        fileName, inputStream, readableByteChannel: Pointer;
+        readMethod, assetFileDescriptor: Pointer;
+        position, size, offset: Int64;
+        fd: LongInt;
+        end;
+{$ELSE}
+{$IFDEF WIN32}
+    TWinbuffer = record
+        data: Pointer;
+        size, left: LongInt;
+        end;
+    TWindowsio = record
+        append : {$IFDEF SDL2}Boolean{$ELSE}LongInt{$ENDIF};
+        h : Pointer;
+        buffer : TWinbuffer;
+        end;
+{$ENDIF}
+{$ENDIF}
+
     TSDL_RWops = record
+{$IFDEF SDL2}
+        size: TSize;
+{$ENDIF}
         seek: TSeek;
         read: TRead;
         write: TWrite;
         close: TClose;
         type_: LongWord;
         case Byte of
-            0: (stdio: TStdio);
-            1: (mem: TMem);
-            2: (unknown: TUnknown);
+{$IFDEF ANDROID}
+            0: (androidio: TAndroidio);
+{$ELSE}
+{$IFDEF WIN32}
+            0: (windowsio: TWindowsio);
+{$ENDIF}
+{$ENDIF}
+            1: (stdio: TStdio);     // assumes HAVE_STDIO_H
+            2: (mem: TMem);
+            3: (unknown: TUnknown);
             end;
 
 
 {* SDL_Event type definition *}
 
-{$IFDEF SDL13}
-    TSDL_KeySym = record
+{$IFDEF SDL2}
+    TSDL_Keysym = record
         scancode: LongInt;
-        sym: LongWord;
+        sym: LongInt;
         modifier: Word;
-        unicode: LongWord;
+        unused: LongWord;
         end;
 
     TSDL_WindowEvent = record
@@ -511,27 +552,15 @@
     TSDL_TouchFingerEvent = record
         type_: LongWord;
         timestamp: LongWord;
-        windowId: LongWord;
         touchId: TSDL_TouchId;
         fingerId: TSDL_FingerId;
-        state, padding1, padding2, padding3: Byte;
-        x, y: Word;
-        dx, dy: SmallInt;
-        pressure: Word;
-        end;
-
-    TSDL_TouchButtonEvent = record
-        type_: LongWord;
-        timestamp: LongWord;
-        windowId: LongWord;
-        touchId: TSDL_TouchId;
-        state, button, padding1, padding2: Byte;
+        x, y, dx, dy: Single;
+        pressure: Single;
         end;
 
     TSDL_MultiGestureEvent = record
         type_: LongWord;
         timestamp: LongWord;
-        windowId: LongWord;
         touchId: TSDL_TouchId;
         dTheta, dDist, x, y: Single;
         numFingers, padding: Word;
@@ -540,11 +569,10 @@
     TSDL_DollarGestureEvent = record
         type_: LongWord;
         timestamp: LongWord;
-        windowId: LongWord;
         touchId: Int64;
         gesturedId: Int64;
         numFingers: LongWord;
-        error: Single;
+        error, x, y: Single;
         end;
 
     TSDL_DropEvent = record
@@ -558,6 +586,37 @@
         timestamp: LongWord;
         msg: Pointer;
         end;
+
+    TSDL_ControllerAxisEvent = record
+        type_: LongWord;
+        timestamp: LongWord;
+        which: LongInt;
+        axis, padding1, padding2, padding3: Byte;
+        value: SmallInt;
+        padding4: Word;
+        end;
+
+    TSDL_ControllerButtonEvent = record
+        type_: LongWord;
+        timestamp: LongWord;
+        which: LongInt;
+        button, states, padding1, padding2: Byte;
+        end;
+
+    TSDL_ControllerDeviceEvent = record
+        type_: LongWord;
+        timestamp: LongWord;
+        which: SmallInt;
+        end;
+
+    TSDL_JoyDeviceEvent = TSDL_ControllerDeviceEvent;
+
+    TSDL_CommonEvent = record
+        type_: LongWord;
+        timestamp: LongWord;
+        end;
+
+    TSDL_OSEvent = TSDL_CommonEvent;
 {$ELSE}
     TSDL_KeySym = record
         scancode: Byte;
@@ -579,35 +638,36 @@
 {$ENDIF}
 
     TSDL_KeyboardEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
-//        timestamp: LongWord;
+        timestamp: LongWord;
         windowID: LongWord;
-        state, repeat_ {*,padding2, padding3*}: Byte;
+        state, repeat_, padding2, padding3: Byte;
 {$ELSE}
         type_, which, state: Byte;
 {$ENDIF}
-        keysym: TSDL_KeySym;
+        keysym: TSDL_Keysym;
         end;
 
     TSDL_MouseMotionEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
         windowID: LongWord;
-        state, padding1, padding2, padding3: Byte;
-        x, y, z, xrel, yrel : LongInt;
+        which, state: LongWord;
+        x, y, xrel, yrel: LongInt;
 {$ELSE}
         type_, which, state: Byte;
-        x, y, xrel, yrel : Word;
+        x, y, xrel, yrel: Word;
 {$ENDIF}
         end;
 
     TSDL_MouseButtonEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
         windowID: LongWord;
+        which: LongWord;
         button, state, padding1, padding2: Byte;
         x, y: LongInt;
 {$ELSE}
@@ -618,9 +678,10 @@
 
     TSDL_MouseWheelEvent = record
         type_: LongWord;
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         timestamp: LongWord;
         windowID: LongWord;
+        which: LongWord;
 {$ELSE}
         which: Byte;
 {$ENDIF}
@@ -628,56 +689,58 @@
         end;
 
     TSDL_JoyAxisEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
+        which: LongWord;
 {$ELSE}
         type_: Byte;
+        which: Byte;
 {$ENDIF}
-        which: Byte;
         axis: Byte;
-{$IFDEF SDL13}
-        padding1, padding2: Byte;
+{$IFDEF SDL2}
+        padding1, padding2, padding3: Byte;
         value: LongInt;
+        padding4: Word;
 {$ELSE}
         value: SmallInt;
 {$ENDIF}
         end;
 
     TSDL_JoyBallEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
+        which: LongWord;
 {$ELSE}
         type_: Byte;
+        which: Byte;
 {$ENDIF}
-        which: Byte;
         ball: Byte;
-{$IFDEF SDL13}
-        padding1, padding2: Byte;
-        xrel, yrel: LongInt;
-{$ELSE}
+{$IFDEF SDL2}
+        padding1, padding2, padding3: Byte;
+{$ENDIF}
         xrel, yrel: SmallInt;
-{$ENDIF}
         end;
 
     TSDL_JoyHatEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
+        which: LongWord;
 {$ELSE}
         type_: Byte;
+        which: Byte;
 {$ENDIF}
-        which: Byte;
         hat: Byte;
         value: Byte;
-{$IFDEF SDL13}
-        padding1: Byte;
+{$IFDEF SDL2}
+        padding1, padding2: Byte;
 {$ENDIF}
         end;
 
     TSDL_JoyButtonEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
 {$ELSE}
@@ -686,13 +749,13 @@
         which: Byte;
         button: Byte;
         state: Byte;
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         padding1: Byte;
 {$ENDIF}
         end;
 
     TSDL_QuitEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
 {$ELSE}
@@ -701,7 +764,7 @@
         end;
 
     TSDL_UserEvent = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         type_: LongWord;
         timestamp: LongWord;
         windowID: LongWord;
@@ -714,9 +777,10 @@
 
     PSDL_Event = ^TSDL_Event;
     TSDL_Event = record
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         case LongInt of
-            SDL_FIRSTEVENT: (type_: LongInt);
+            SDL_FIRSTEVENT: (type_: LongWord);
+            SDL_COMMONDEVENT: (common: TSDL_CommonEvent);
             SDL_WINDOWEVENT: (window: TSDL_WindowEvent);
             SDL_KEYDOWN,
             SDL_KEYUP: (key: TSDL_KeyboardEvent);
@@ -731,14 +795,20 @@
             SDL_JOYHATMOTION: (jhat: TSDL_JoyHatEvent);
             SDL_JOYBUTTONDOWN,
             SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent);
+            SDL_JOYDEVICEADDED,
+            SDL_JOYDEVICEREMOVED: (jdevice: TSDL_JoyDeviceEvent);
+            SDL_CONTROLLERAXISMOTION: (caxis: TSDL_ControllerAxisEvent);
+            SDL_CONTROLLERBUTTONUP,
+            SDL_CONTROLLERBUTTONDOWN: (cbutton: TSDL_ControllerButtonEvent);
+            SDL_CONTROLLERDEVICEADDED,
+            SDL_CONTROLLERDEVICEREMAPPED,
+            SDL_CONTROLLERDEVICEREMOVED: (cdevice: TSDL_ControllerDeviceEvent);
             SDL_QUITEV: (quit: TSDL_QuitEvent);
             SDL_USEREVENT: (user: TSDL_UserEvent);
             SDL_SYSWMEVENT: (syswm: TSDL_SysWMEvent);
             SDL_FINGERDOWN,
             SDL_FINGERUP,
             SDL_FINGERMOTION: (tfinger: TSDL_TouchFingerEvent);
-            SDL_TOUCHBUTTONUP,
-            SDL_TOUCHBUTTONDOWN: (tbutton: TSDL_TouchButtonEvent);
             SDL_MULTIGESTURE: (mgesture: TSDL_MultiGestureEvent);
             SDL_DOLLARGESTURE: (dgesture: TSDL_DollarGestureEvent);
             SDL_DROPFILE: (drop: TSDL_DropEvent);
@@ -792,16 +862,20 @@
         SDL_GL_MULTISAMPLEBUFFERS,
         SDL_GL_MULTISAMPLESAMPLES,
         SDL_GL_ACCELERATED_VISUAL,
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         SDL_GL_RETAINED_BACKING,
         SDL_GL_CONTEXT_MAJOR_VERSION,
-        SDL_GL_CONTEXT_MINOR_VERSION
+        SDL_GL_CONTEXT_MINOR_VERSION,
+        SDL_GL_CONTEXT_EGL,
+        SDL_GL_CONTEXT_FLAGS,
+        SDL_GL_CONTEXT_PROFILE_MASK,
+        SDL_GL_SHARE_WITH_CURRENT_CONTEXT
 {$ELSE}
         SDL_GL_SWAP_CONTROL
 {$ENDIF}
         );
 
-{$IFDEF SDL13}
+{$IFDEF SDL2}
     TSDL_ArrayByteOrder = (  // array component order, low Byte -> high Byte
         SDL_ARRAYORDER_NONE,
         SDL_ARRAYORDER_RGB,
@@ -813,7 +887,7 @@
         );
 {$ENDIF}
 
-// Joystick/Controller support
+    // Joystick/Controller support
     PSDL_Joystick = ^TSDL_Joystick;
     TSDL_Joystick = record
             end;
@@ -849,7 +923,7 @@
     TMixMusic = record
                 end;
 
-    TPostMix = procedure(udata: pointer; stream: PByte; len: LongInt); cdecl;
+    TPostMix = procedure(udata: Pointer; stream: PByte; len: LongInt); cdecl;
 
     {* SDL_net *}
     TIPAddress = record
@@ -916,7 +990,7 @@
 function  SDL_RWFromFile(filename, mode: PChar): PSDL_RWops; cdecl; external SDLLibName;
 function  SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: LongInt): LongInt; cdecl; external SDLLibName;
 
-{$IFDEF SDL13}
+{$IFDEF SDL2}
 function  SDL_CreateWindow(title: PChar; x,y,w,h: LongInt; flags: LongWord): PSDL_Window; cdecl; external SDLLibName;
 function  SDL_CreateRenderer(window: PSDL_Window; index: LongInt; flags: LongWord): PSDL_Renderer; cdecl; external SDLLibName;
 function  SDL_DestroyWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName;
@@ -949,8 +1023,15 @@
 procedure SDL_StartTextInput; cdecl; external SDLLibName;
 
 function  SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; minType, maxType: LongWord): LongInt; cdecl; external SDLLibName;
+
+function  SDL_AllocFormat(format: LongWord): PSDL_PixelFormat; cdecl; external SDLLibName;
+procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); cdecl; external SDLLibName;
 {$ELSE}
 function  SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; mask: LongWord): LongInt; cdecl; external SDLLibName;
+
+function  SDL_EnableUNICODE(enable: LongInt): LongInt; cdecl; external SDLLibName;
+function  SDL_EnableKeyRepeat(timedelay, interval: LongInt): LongInt; cdecl; external SDLLibName;
+function  SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar; cdecl; external SDLLibName;
 {$ENDIF}
 
 
@@ -966,22 +1047,24 @@
 procedure SDL_SetEventFilter(filter: TSDL_EventFilter); cdecl; external SDLLibName;
 
 function  SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName;
+procedure SDL_WarpMouse(x, y: Word); {$IFDEF SDL2}inline{$ELSE}cdecl; external SDLLibName{$ENDIF};
+function  SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName {$IFDEF SDL2} name 'SDL_GetKeyboardState'{$ENDIF};
 
 procedure SDL_WM_SetIcon(icon: PSDL_Surface; mask : Byte); cdecl; external SDLLibName;
 procedure SDL_WM_SetCaption(title: PChar; icon: PChar); cdecl; external SDLLibName;
 function  SDL_WM_ToggleFullScreen(surface: PSDL_Surface): LongInt; cdecl; external SDLLibName;
 
 
-// remember to mark the threaded functions as 'cdecl; export;'
-// (or have fun debugging nil arguments)
-function  SDL_CreateThread(fn: Pointer; {$IFDEF SDL13}name: PChar;{$ENDIF} data: Pointer): PSDL_Thread; cdecl; external SDLLibName;
+(* remember to mark the threaded functions as 'cdecl; export;'
+   (or have fun debugging nil arguments) *)
+function  SDL_CreateThread(fn: Pointer; {$IFDEF SDL2}name: PChar;{$ENDIF} data: Pointer): PSDL_Thread; cdecl; external SDLLibName;
 procedure SDL_WaitThread(thread: PSDL_Thread; status: PLongInt); cdecl; external SDLLibName;
 procedure SDL_KillThread(thread: PSDL_Thread); cdecl; external SDLLibName;
 
 function  SDL_CreateMutex: PSDL_mutex; cdecl; external SDLLibName;
 procedure SDL_DestroyMutex(mutex: PSDL_mutex); cdecl; external SDLLibName;
-function  SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName name 'SDL_mutexP';
-function  SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName name 'SDL_mutexV';
+function  SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName {$IFNDEF SDL2}name 'SDL_mutexP'{$ENDIF};
+function  SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName {$IFNDEF SDL2}name 'SDL_mutexV'{$ENDIF};
 
 function  SDL_GL_SetAttribute(attr: TSDL_GLattr; value: LongInt): LongInt; cdecl; external SDLLibName;
 procedure SDL_GL_SwapBuffers; cdecl; external SDLLibName;
@@ -1012,15 +1095,6 @@
 {$ENDIF}
 
 
-{* Compatibility between SDL-1.2 and SDL-1.3 *}
-procedure SDL_WarpMouse(x, y: Word); {$IFDEF SDL13}inline{$ELSE}cdecl; external SDLLibName{$ENDIF};
-function  SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName {$IFDEF SDL13} name 'SDL_GetKeyboardState'{$ENDIF};
-function  SDL_AllocFormat(format: LongWord): PSDL_PixelFormat; {$IFDEF SDL13}cdecl; external SDLLibName;{$ENDIF}
-procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); {$IFDEF SDL13}cdecl; external SDLLibName;{$ENDIF}
-function  SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar; {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF}
-function  SDL_EnableUNICODE(enable: LongInt): LongInt; {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF}
-function  SDL_EnableKeyRepeat(timedelay, interval: LongInt): LongInt; {$IFNDEF SDL13}cdecl; external SDLLibName;{$ENDIF}
-
 (*  SDL_ttf  *)
 function  TTF_Init: LongInt; cdecl; external SDL_TTFLibName;
 procedure TTF_Quit; cdecl; external SDL_TTFLibName;
@@ -1035,8 +1109,8 @@
 procedure TTF_SetFontStyle(font: PTTF_Font; style: LongInt); cdecl; external SDL_TTFLibName;
 
 (*  SDL_mixer  *)
-function  Mix_Init(flags: LongInt): LongInt; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName;{$ENDIF}
-procedure Mix_Quit; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName;{$ENDIF}
+function  Mix_Init(flags: LongInt): LongInt; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName{$ELSE}inline{$ENDIF};
+procedure Mix_Quit; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName{$ELSE}inline{$ENDIF};
 
 function  Mix_OpenAudio(frequency: LongInt; format: Word; channels: LongInt; chunksize: LongInt): LongInt; cdecl; external SDL_MixerLibName;
 procedure Mix_CloseAudio; cdecl; external SDL_MixerLibName;
@@ -1068,11 +1142,11 @@
 function  Mix_FadeInChannelTimed(channel: LongInt; chunk: PMixChunk; loops: LongInt; fadems: LongInt; ticks: LongInt): LongInt; cdecl; external SDL_MixerLibName;
 function  Mix_FadeOutChannel(channel: LongInt; fadems: LongInt): LongInt; cdecl; external SDL_MixerLibName;
 
-procedure Mix_SetPostMix( mix_func: TPostMix; arg: pointer); cdecl; external SDL_MixerLibName;
+procedure Mix_SetPostMix( mix_func: TPostMix; arg: Pointer); cdecl; external SDL_MixerLibName;
 
 (*  SDL_image  *)
-function  IMG_Init(flags: LongInt): LongInt; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName;{$ENDIF}
-procedure IMG_Quit; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName;{$ENDIF}
+function  IMG_Init(flags: LongInt): LongInt; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName{$ELSE}inline{$ENDIF};
+procedure IMG_Quit; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName{$ELSE}inline{$ENDIF};
 
 function  IMG_Load(const _file: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName;
 function  IMG_Load_RW(rwop: PSDL_RWops; freesrc: LongBool): PSDL_Surface; cdecl; external SDL_ImageLibName;
@@ -1101,73 +1175,23 @@
 function  SDLNet_Read32(buf: Pointer): LongWord;
 
 implementation
-{$IFDEF SDL13}
-uses strings, uVariables, uStore;
+{$IFDEF SDL2}
+uses uStore;
 
-// compatible functions
+// for sdl1.2 we directly call SDL_WarpMouse()
+// for sdl2 we provide a SDL_WarpMouse() which calls the right SDL_WarpMouseInWindow() function
+// this has the advantage of reducing 'uses' and 'ifdef' statements
+// (SDLwindow is a private member of uStore module)
 procedure SDL_WarpMouse(x, y: Word); inline;
 begin
     WarpMouse(x, y);
 end;
-
-function SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar;
-var name : PChar = nil;
-begin
-    name:= SDL_GetCurrentVideoDriver();
-    if (name <> nil) and (namebuf <> nil) then
-        begin
-        strlcopy(namebuf, name, maxlen);
-        SDL_VideoDriverName:= namebuf
-        end;
-    SDL_VideoDriverName:= name;
-end;
-
-function SDL_EnableUNICODE(enable: LongInt): LongInt;
-begin
-    enable:= enable; // avoid hint
-    SDL_StartTextInput();
-    SDL_EnableUNICODE:= 0;
-end;
-
-function SDL_EnableKeyRepeat(timedelay, interval: LongInt): LongInt;
-begin
-    timedelay:= timedelay;  // avoid hint
-    interval:= interval;    // avoid hint
-    SDL_EnableKeyRepeat:= 0;
-end;
-{$ELSE}
-const convFormat:TSDL_PixelFormat = (
-        palette: nil; BitsPerPixel: 32; BytesPerPixel: 4;
-        Rloss: 0; Gloss: 0; Bloss: 0; Aloss: 0;
-        Rshift: RShift; Gshift: GShift; Bshift: BShift; Ashift: AShift;
-
-        //TODO: FIXME in pas2c
-        {$IFDEF WEBGL}
-        Rmask: RMask; Gmask: GMask; Bmask: BMask; Amask: AMask;
-        {$ELSE}
-        RMask: RMask; GMask: GMask; BMask: BMask; AMask: AMask;
-        colorkey: 0; alpha: 255
-        {$ENDIF}
-        );
-
-function SDL_AllocFormat(format: LongWord): PSDL_PixelFormat;
-begin
-    format:= format;
-    SDL_AllocFormat:= @convFormat;
-end;
-
-procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat);
-begin
-   {$IFNDEF PAS2C}
-    pixelformat:= pixelformat;  // avoid hint
-   {$ENDIF}
-end;
 {$ENDIF}
 
 function SDL_MustLock(Surface: PSDL_Surface): Boolean;
 begin
     SDL_MustLock:=
-{$IFDEF SDL13}
+{$IFDEF SDL2}
         ((surface^.flags and SDL_RLEACCEL) <> 0)
 {$ELSE}
         {$IFNDEF WEBGL}( surface^.offset <> 0 ) or {$ENDIF}(( surface^.flags and (SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL)) <> 0)
@@ -1175,23 +1199,23 @@
 end;
 
 {$IFNDEF SDL_MIXER_NEWER}
-function  Mix_Init(flags: LongInt): LongInt;
+function  Mix_Init(flags: LongInt): LongInt; inline;
 begin
     Mix_Init:= flags;
 end;
 
-procedure Mix_Quit;
+procedure Mix_Quit; inline;
 begin
 end;
 {$ENDIF}
 
 {$IFNDEF SDL_IMAGE_NEWER}
-function  IMG_Init(flags: LongInt): LongInt;
+function  IMG_Init(flags: LongInt): LongInt; inline;
 begin
     IMG_Init:= flags;
 end;
 
-procedure IMG_Quit;
+procedure IMG_Quit; inline;
 begin
 end;
 {$ENDIF}