DEADSOFTWARE

moved to SDL2
authorFGSFDSFGS <derp.primus@gmail.com>
Wed, 6 Apr 2016 12:30:57 +0000 (15:30 +0300)
committerFGSFDSFGS <derp.primus@gmail.com>
Wed, 6 Apr 2016 12:35:28 +0000 (15:35 +0300)
50 files changed:
src/engine/e_graphics.pas
src/engine/e_input.pas
src/game/Doom2DF.dpr
src/game/g_main.pas
src/game/g_window.pas
src/lib/sdl2/LICENSE [new file with mode: 0644]
src/lib/sdl2/README.md [new file with mode: 0644]
src/lib/sdl2/SDL2_gfx.pas [new file with mode: 0644]
src/lib/sdl2/SDL2_image.pas [new file with mode: 0644]
src/lib/sdl2/SDL2_mixer.pas [new file with mode: 0644]
src/lib/sdl2/SDL2_net.pas [new file with mode: 0644]
src/lib/sdl2/SDL2_ttf.pas [new file with mode: 0644]
src/lib/sdl2/jedi.inc [new file with mode: 0644]
src/lib/sdl2/sdl.inc [new file with mode: 0644]
src/lib/sdl2/sdl2.pas [new file with mode: 0644]
src/lib/sdl2/sdlaudio.inc [new file with mode: 0644]
src/lib/sdl2/sdlblendmode.inc [new file with mode: 0644]
src/lib/sdl2/sdlclipboard.inc [new file with mode: 0644]
src/lib/sdl2/sdlcpuinfo.inc [new file with mode: 0644]
src/lib/sdl2/sdlerror.inc [new file with mode: 0644]
src/lib/sdl2/sdlevents.inc [new file with mode: 0644]
src/lib/sdl2/sdlfilesystem.inc [new file with mode: 0644]
src/lib/sdl2/sdlgamecontroller.inc [new file with mode: 0644]
src/lib/sdl2/sdlgesture.inc [new file with mode: 0644]
src/lib/sdl2/sdlhaptic.inc [new file with mode: 0644]
src/lib/sdl2/sdlhints.inc [new file with mode: 0644]
src/lib/sdl2/sdljoystick.inc [new file with mode: 0644]
src/lib/sdl2/sdlkeyboard.inc [new file with mode: 0644]
src/lib/sdl2/sdlloadso.inc [new file with mode: 0644]
src/lib/sdl2/sdllog.inc [new file with mode: 0644]
src/lib/sdl2/sdlmessagebox.inc [new file with mode: 0644]
src/lib/sdl2/sdlmouse.inc [new file with mode: 0644]
src/lib/sdl2/sdlmutex.inc [new file with mode: 0644]
src/lib/sdl2/sdlpixels.inc [new file with mode: 0644]
src/lib/sdl2/sdlplatform.inc [new file with mode: 0644]
src/lib/sdl2/sdlpower.inc [new file with mode: 0644]
src/lib/sdl2/sdlrect.inc [new file with mode: 0644]
src/lib/sdl2/sdlrenderer.inc [new file with mode: 0644]
src/lib/sdl2/sdlrwops.inc [new file with mode: 0644]
src/lib/sdl2/sdlscancode.inc [new file with mode: 0644]
src/lib/sdl2/sdlshape.inc [new file with mode: 0644]
src/lib/sdl2/sdlsurface.inc [new file with mode: 0644]
src/lib/sdl2/sdlsystem.inc [new file with mode: 0644]
src/lib/sdl2/sdlsyswm.inc [new file with mode: 0644]
src/lib/sdl2/sdlthread.inc [new file with mode: 0644]
src/lib/sdl2/sdltimer.inc [new file with mode: 0644]
src/lib/sdl2/sdltouch.inc [new file with mode: 0644]
src/lib/sdl2/sdltype.inc [new file with mode: 0644]
src/lib/sdl2/sdlversion.inc [new file with mode: 0644]
src/lib/sdl2/sdlvideo.inc [new file with mode: 0644]

index 07ad1744eb81d6b089e4919486324675a1394ff3..25c2e8b3dad59995a08f51775aa7306e077b4016 100644 (file)
@@ -3,7 +3,7 @@ unit e_graphics;
 interface
 
 uses
-  SysUtils, Math, e_log, e_textures, SDL, GL, GLExt, MAPDEF;
+  SysUtils, Math, e_log, e_textures, SDL2, GL, GLExt, MAPDEF;
 
 type
   TMirrorType=(M_NONE, M_HORIZONTAL, M_VERTICAL);
@@ -105,8 +105,8 @@ procedure e_EndRender();
 procedure e_SaveGLContext();
 procedure e_RestoreGLContext();
 
-function e_GetGamma(): Byte;
-procedure e_SetGamma(Gamma: Byte);
+function e_GetGamma(win: PSDL_Window): Byte;
+procedure e_SetGamma(win: PSDL_Window;Gamma: Byte);
 
 procedure e_MakeScreenshot(FileName: string; Width, Height: Word);
 
@@ -961,7 +961,7 @@ begin
   FreeMem(pixels);
 end;}
 
-function e_GetGamma(): Byte;
+function e_GetGamma(win: PSDL_Window): Byte;
 var
   ramp: array [0..256*3-1] of Word;
   rgb: array [0..2] of Double;
@@ -976,7 +976,7 @@ begin
  rgb[1] := 1.0;
  rgb[2] := 1.0;
 
- SDL_GetGammaRamp(@ramp[0], @ramp[256], @ramp[512]);
+ SDL_GetWindowGammaRamp(win, @ramp[0], @ramp[256], @ramp[512]);
 
  for i := 0 to 2 do
  begin
@@ -999,7 +999,7 @@ begin
  Result := 100 - Trunc(((rgb[0] + rgb[1] + rgb[2])/3 - 0.23) * 100/(2.7 - 0.23));
 end;
 
-procedure e_SetGamma(Gamma: Byte);
+procedure e_SetGamma(win: PSDL_Window; Gamma: Byte);
 var
   ramp: array [0..256*3-1] of Word;
   i: integer;
@@ -1018,7 +1018,7 @@ begin
   ramp[i + 512] := trunc(r);
  end;
 
- SDL_SetGammaRamp(@ramp[0], @ramp[256], @ramp[512]);
+ SDL_SetWindowGammaRamp(win, @ramp[0], @ramp[256], @ramp[512]);
 end;
 
 function e_CharFont_Create(sp: ShortInt=0): DWORD;
index 40b7522c8690c3d0896fa842424fc0facccf5c30..818fe8b952685c1aaf3ae18422f1bb1b31df3aad 100644 (file)
@@ -5,10 +5,10 @@ interface
 uses
   SysUtils,
   e_log,
-  SDL;
+  SDL2;
 
 const
-  e_MaxKbdKeys  = 321;
+  e_MaxKbdKeys  = SDL_NUM_SCANCODES;
   e_MaxJoys     = 4;
   e_MaxJoyBtns  = 32;
   e_MaxJoyAxes  = 4;
@@ -23,39 +23,39 @@ const
   // $$$..$$$ -  4*4 Joystick hats (L U R D)
 
   // these are apparently used in g_gui and g_game and elsewhere
-  IK_UNKNOWN = SDLK_UNKNOWN;
   IK_INVALID = 65535;
-  IK_ESCAPE  = SDLK_ESCAPE;
-  IK_RETURN  = SDLK_RETURN;
-  IK_ENTER   = SDLK_RETURN;
-  IK_UP      = SDLK_UP;
-  IK_DOWN    = SDLK_DOWN;
-  IK_LEFT    = SDLK_LEFT;
-  IK_RIGHT   = SDLK_RIGHT;
-  IK_DELETE  = SDLK_DELETE;
-  IK_HOME    = SDLK_HOME;
-  IK_INSERT  = SDLK_INSERT;
-  IK_SPACE   = SDLK_SPACE;
-  IK_CONTROL = SDLK_LCTRL;
-  IK_SHIFT   = SDLK_LSHIFT;
-  IK_TAB     = SDLK_TAB;
-  IK_PAGEUP  = SDLK_PAGEUP;
-  IK_PAGEDN  = SDLK_PAGEDOWN;
-  IK_F2      = SDLK_F2;
-  IK_F3      = SDLK_F3;
-  IK_F4      = SDLK_F4;
-  IK_F5      = SDLK_F5;
-  IK_F6      = SDLK_F6;
-  IK_F7      = SDLK_F7;
-  IK_F8      = SDLK_F8;
-  IK_F9      = SDLK_F9;
-  IK_F10     = SDLK_F10;
-  IK_END     = SDLK_END;
-  IK_BACKSPACE = SDLK_BACKSPACE;
-  IK_BACKQUOTE = SDLK_BACKQUOTE;
-  IK_PAUSE   = SDLK_PAUSE;
+  IK_ESCAPE  = SDL_SCANCODE_ESCAPE;
+  IK_RETURN  = SDL_SCANCODE_RETURN;
+  IK_ENTER   = SDL_SCANCODE_RETURN;
+  IK_UP      = SDL_SCANCODE_UP;
+  IK_DOWN    = SDL_SCANCODE_DOWN;
+  IK_LEFT    = SDL_SCANCODE_LEFT;
+  IK_RIGHT   = SDL_SCANCODE_RIGHT;
+  IK_DELETE  = SDL_SCANCODE_DELETE;
+  IK_HOME    = SDL_SCANCODE_HOME;
+  IK_INSERT  = SDL_SCANCODE_INSERT;
+  IK_SPACE   = SDL_SCANCODE_SPACE;
+  IK_CONTROL = SDL_SCANCODE_LCTRL;
+  IK_SHIFT   = SDL_SCANCODE_LSHIFT;
+  IK_TAB     = SDL_SCANCODE_TAB;
+  IK_PAGEUP  = SDL_SCANCODE_PAGEUP;
+  IK_PAGEDN  = SDL_SCANCODE_PAGEDOWN;
+  IK_F2      = SDL_SCANCODE_F2;
+  IK_F3      = SDL_SCANCODE_F3;
+  IK_F4      = SDL_SCANCODE_F4;
+  IK_F5      = SDL_SCANCODE_F5;
+  IK_F6      = SDL_SCANCODE_F6;
+  IK_F7      = SDL_SCANCODE_F7;
+  IK_F8      = SDL_SCANCODE_F8;
+  IK_F9      = SDL_SCANCODE_F9;
+  IK_F10     = SDL_SCANCODE_F10;
+  IK_END     = SDL_SCANCODE_END;
+  IK_BACKSPACE = SDL_SCANCODE_BACKSPACE;
+  IK_BACKQUOTE = SDL_SCANCODE_GRAVE;
+  IK_GRAVE     = SDL_SCANCODE_GRAVE;
+  IK_PAUSE   = SDL_SCANCODE_PAUSE;
   // TODO: think of something better than this shit
-  IK_LASTKEY = 320;
+  IK_LASTKEY = SDL_NUM_SCANCODES-1;
 
   AX_MINUS  = 0;
   AX_PLUS   = 1;
@@ -164,7 +164,7 @@ var
   i: Cardinal;
 begin
   Result := False;
-  Keys := SDL_GetKeyState(@NKeys);
+  Keys := SDL_GetKeyboardState(@NKeys);
   if (Keys = nil) or (NKeys < 1) then
     Exit;
   for i := 0 to NKeys do
@@ -205,11 +205,7 @@ var
 begin
   // keyboard key names
   for i := 0 to IK_LASTKEY do
-  begin
-    e_KeyNames[i] := SDL_GetKeyName(i);
-    if e_KeyNames[i] = 'unknown key' then
-      e_KeyNames[i] := '';
-  end;
+    e_KeyNames[i] := SDL_GetScancodeName(i);
 
   // joysticks
   for j := 0 to e_MaxJoys-1 do
@@ -240,7 +236,7 @@ end;
 function e_InitInput(): Boolean;
 begin
   Result := False;
-
+  
   e_JoysticksAvailable := OpenJoysticks();
   e_EnableInput := True;
   GenerateKeyNames();
index f7a58b9eae1f8a95e9f91ac73aae3f780d7e1b5e..bba77f400c9b4fec6ed77710158accb6fc87fb4a 100644 (file)
@@ -7,6 +7,7 @@ program Doom2DF;
 uses
   GL,
   GLExt,
+  SDL2 in '../lib/sdl2/sdl2.pas',
   ENet in '../lib/enet/enet.pp',
   ENetTypes in '../lib/enet/enettypes.pp',
   ENetList in '../lib/enet/enetlist.pp',
index 357f0225355986087c2fb36636f61b96a0373ac9..8c43ef8472b6b45efc755df3ca17fd3a42408def 100644 (file)
@@ -20,7 +20,7 @@ var
 implementation
 
 uses
-  SDL, GL, GLExt, WADEDITOR, e_log, g_window,
+  SDL2, GL, GLExt, WADEDITOR, e_log, g_window,
   e_graphics, e_input, g_game, g_console, g_gui,
   e_sound, g_options, g_sound, g_player,
   g_weapons, SysUtils, g_triggers, MAPDEF, g_map,
@@ -49,8 +49,10 @@ begin
   e_WriteLog(gLanguage, MSG_NOTIFY);
   g_Language_Set(gLanguage);
 
-  if SDL_Init(SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_AUDIO) < 0 then
+  if SDL_Init(SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO) < 0 then
     raise Exception.Create('SDL: Init failed: ' + SDL_GetError());
+    
+  SDL_StartTextInput();
 
   e_WriteLog('Entering SDLMain', MSG_NOTIFY);
 
@@ -58,6 +60,8 @@ begin
   SDLMain();
   {$WARNINGS ON}
 
+  SDL_StopTextInput();
+  
   e_WriteLog('Releasing SDL', MSG_NOTIFY);
   SDL_Quit();
 end;
index 8427dd30667efdf4cec6fae89589dde49f6b7f3d..d4cd928673a591bd2b16dbf0d7156cf708cf2be9 100644 (file)
@@ -23,15 +23,17 @@ function  g_Window_SetSize(W, H: Word; FScreen: Boolean): Boolean;
 implementation
 
 uses
-  SDL, GL, GLExt, e_graphics, e_log, g_main,
+  SDL2, GL, GLExt, e_graphics, e_log, g_main,
   g_console, SysUtils, e_input, g_options, g_game,
   g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net;
 
 var
-  h_Wnd: PSDL_Surface;
+  h_Wnd: PSDL_Window;
+  h_GL: TSDL_GLContext;
   wFlags: LongWord = 0;
   Time, Time_Delta, Time_Old: Int64;
   flag: Boolean;
+  wTitle: PChar = nil;
   wNeedTimeReset: Boolean = False;
   wWindowCreated: Boolean = False;
   //wCursorShown: Boolean = False;
@@ -71,21 +73,29 @@ begin
 
   e_WriteLog('Setting display mode...', MSG_NOTIFY);
 
-  if wWindowCreated and PreserveGL then
-    e_SaveGLContext(); // we need this and restore because of a bug in SDL1.2, apparently
+  // if wWindowCreated and PreserveGL then
+  //   e_SaveGLContext(); // we need this and restore because of a bug in SDL1.2, apparently
 
-  wFlags := SDL_RESIZABLE or SDL_OPENGL;
-  if gFullscreen then wFlags := wFlags or SDL_FULLSCREEN;
+  wFlags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE;
+  if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN;
+  if gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED;
+  
+  if h_Wnd <> nil then
+  begin
+    SDL_DestroyWindow(h_Wnd);
+    h_Wnd := nil;
+  end;
 
-  h_Wnd := SDL_SetVideoMode(gScreenWidth, gScreenHeight, gBPP, wFlags);
-  SDL_EnableUNICODE(SDL_ENABLE);
-  SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+  h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
+  if h_Wnd = nil then Exit;
+  
+  SDL_GL_MakeCurrent(h_Wnd, h_GL);
   SDL_ShowCursor(SDL_DISABLE);
 
-  if wWindowCreated and PreserveGL then
-    e_RestoreGLContext();
+  // if wWindowCreated and PreserveGL then
+  //  e_RestoreGLContext();
 
-  Result := h_Wnd <> nil;
+  Result := True;
 end;
 
 procedure ReShowCursor();
@@ -95,32 +105,24 @@ end;
 
 function GetDisplayModes(dBPP: DWORD; var SelRes: DWORD): SArray;
 var
-  modesp: PPSDL_Rect;
-  tmpp: PSDL_Rect;
-  tmpr: SDL_Rect;
-  i: Integer;
+  mode: TSDL_DisplayMode;
+  res, i, k: Integer;
 begin
   SetLength(Result, 0);
-  modesp := SDL_ListModes(nil, SDL_FULLSCREEN or SDL_HWSURFACE);
-  if modesp = nil then exit;
-  if Pointer(-1) = modesp then exit;
 
-  tmpp := modesp^;
-  i := 0;
-  while tmpp <> nil do
+  k := 0;
+  for i := 0 to SDL_GetNumDisplayModes(0) do
   begin
-    tmpr := tmpp^;
-    if (tmpr.w = gScreenWidth) and (tmpr.h = gScreenHeight) then
-      SelRes := i;
-    SetLength(Result, Length(Result) + 1);
-    Result[i] := IntToStr(tmpr.w) + 'x' + IntToStr(tmpr.h);
-
-    modesp := Pointer(Cardinal(modesp) + SizeOf(PSDL_Rect));
-    tmpp := modesp^;
-    Inc(i);
+    res := SDL_GetDisplayMode(0, i, @mode);
+    if res < 0 then continue;
+    if (mode.w = gScreenWidth) and (mode.h = gScreenHeight) then
+      SelRes := k;
+    Inc(k);
+    SetLength(Result, k);
+    Result[k-1] := IntToStr(mode.w) + 'x' + IntToStr(mode.h);
   end;
 
-  e_WriteLog('SDL: Got ' + IntToStr(Length(Result)) + ' resolutions.', MSG_NOTIFY);
+  e_WriteLog('SDL: Got ' + IntToStr(k) + ' resolutions.', MSG_NOTIFY);
 end;
 
 procedure Sleep(ms: LongWord);
@@ -166,103 +168,148 @@ begin
   end;
 end;
 
-function EventHandler(ev: TSDL_Event): Boolean;
+function WindowEventHandler(ev: TSDL_WindowEvent): Boolean;
 var
-  key, keychr: Word;
-  //joy: Integer;
+  wActivate, wDeactivate: Boolean;
 begin
   Result := False;
-  case ev.type_ of
-    SDL_VIDEORESIZE:
+  wActivate := False;
+  wDeactivate := False;
+  
+  case ev.event of
+    SDL_WINDOWEVENT_MOVED:
     begin
-      g_Window_SetSize(ev.resize.w, ev.resize.h, gFullscreen);
-      e_Clear();
+      if not (gFullscreen or gWinMaximized) then
+      begin
+        gWinRealPosX := ev.data1;
+        gWinRealPosY := ev.data2;
+      end;
     end;
-
-    SDL_ACTIVEEVENT:
+    
+    SDL_WINDOWEVENT_MINIMIZED:
     begin
-      if (ev.active.gain = 0) then
+      if not wMinimized then
       begin
-        if g_debug_WinMsgs then
-        begin
-          g_Console_Add('Inactive');
-          e_WriteLog('[DEBUG] WinMsgs: Inactive', MSG_NOTIFY);
-        end;
-
-        if LongBool(ev.active.state and SDL_APPINPUTFOCUS) and gWinActive then
-        begin
-          e_EnableInput := False;
-          e_ClearInputBuffer();
-
-          if gMuteWhenInactive then
-            e_MuteChannels(True);
-
-          if g_debug_WinMsgs then
-          begin
-            g_Console_Add('Inactive indeed');
-            e_WriteLog('[DEBUG] WinMsgs: Inactive indeed', MSG_NOTIFY);
-          end;
-
-          gWinActive := False;
-        end;
+        e_ResizeWindow(0, 0);
+        wMinimized := True;
 
-        if LongBool(ev.active.state and SDL_APPACTIVE) and (not wMinimized) then
+        if g_debug_WinMsgs then
         begin
-          e_ResizeWindow(0, 0);
-          wMinimized := True;
-
-          if g_debug_WinMsgs then
-          begin
-            g_Console_Add('Minimized indeed');
-            e_WriteLog('[DEBUG] WinMsgs: Minimized indeed', MSG_NOTIFY);
-          end;
+          g_Console_Add('Now minimized');
+          e_WriteLog('[DEBUG] WinMsgs: Now minimized', MSG_NOTIFY);
         end;
-      end
-      else
+        wDeactivate := True;
+      end;
+    end;
+    
+    SDL_WINDOWEVENT_RESIZED:
+    begin
+      gScreenWidth := ev.data1;
+      gScreenHeight := ev.data2;
+      ChangeWindowSize();
+      SwapBuffers();
+      if g_debug_WinMsgs then
+      begin
+        g_Console_Add('Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2));
+        e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), MSG_NOTIFY);
+      end;
+    end;
+    
+    SDL_WINDOWEVENT_EXPOSED:
+      SwapBuffers();
+    
+    SDL_WINDOWEVENT_MAXIMIZED:
+    begin
+      if wMinimized then
       begin
+        e_ResizeWindow(gScreenWidth, gScreenHeight);
+        wMinimized := False;
+        wActivate := True;
+      end;
+      if not gWinMaximized then
+      begin
+        gWinMaximized := True;
         if g_debug_WinMsgs then
         begin
-          g_Console_Add('Active');
-          e_WriteLog('[DEBUG] WinMsgs: Active', MSG_NOTIFY);
+          g_Console_Add('Now maximized');
+          e_WriteLog('[DEBUG] WinMsgs: Now maximized', MSG_NOTIFY);
         end;
+      end;
+    end;
+    
+    SDL_WINDOWEVENT_RESTORED:
+    begin
+      if wMinimized then
+      begin
+        e_ResizeWindow(gScreenWidth, gScreenHeight);
+        wMinimized := False;
+        wActivate := True;
+      end;
+      if gWinMaximized then
+        gWinMaximized := False;
+      if g_debug_WinMsgs then
+      begin
+        g_Console_Add('Now restored');
+        e_WriteLog('[DEBUG] WinMsgs: Now restored', MSG_NOTIFY);
+      end;
+    end;
+    
+    SDL_WINDOWEVENT_FOCUS_GAINED:
+      wActivate := True;
+    
+    SDL_WINDOWEVENT_FOCUS_LOST:
+      wDeactivate := True;
+  end;
+  
+  if wDeactivate then
+  begin
+    if gWinActive then
+    begin
+      e_EnableInput := False;
+      e_ClearInputBuffer();
 
-        // Ã…ñëè Ã®ÃªÃ­Ã® Ã¡Ã»Ã«Ã® Ã­Ã¥Ã ÃªÃ²Ã¨Ã¢Ã­Ã»Ã¬:
-        if LongBool(ev.active.state and SDL_APPINPUTFOCUS) and (not gWinActive) then
-        begin
-          e_EnableInput := True;
-
-          if gMuteWhenInactive then
-            e_MuteChannels(False);
-
-          if g_debug_WinMsgs then
-          begin
-            g_Console_Add('Active indeed');
-            e_WriteLog('[DEBUG] WinMsgs: Active indeed', MSG_NOTIFY);
-          end;
+      if gMuteWhenInactive then
+        e_MuteChannels(True);
 
-          gWinActive := True;
-        end;
+      if g_debug_WinMsgs then
+      begin
+        g_Console_Add('Now inactive');
+        e_WriteLog('[DEBUG] WinMsgs: Now inactive', MSG_NOTIFY);
+      end;
 
-        if LongBool(ev.active.state and SDL_APPACTIVE) and wMinimized then
-        begin
-          e_ResizeWindow(gScreenWidth, gScreenHeight);
+      gWinActive := False;
+    end;
+  end
+  else if wActivate then
+  begin
+    if not gWinActive then
+    begin
+      e_EnableInput := True;
 
-          wMinimized := False;
+      if gMuteWhenInactive then
+        e_MuteChannels(False);
 
-          if g_debug_WinMsgs then
-          begin
-            g_Console_Add('Restored indeed');
-            e_WriteLog('[DEBUG] WinMsgs: Restored indeed', MSG_NOTIFY);
-          end;
-        end;
+      if g_debug_WinMsgs then
+      begin
+        g_Console_Add('Now active');
+        e_WriteLog('[DEBUG] WinMsgs: Now active', MSG_NOTIFY);
       end;
-    end;
 
-    SDL_VIDEOEXPOSE:
-    begin
-      // TODO: the fuck is this event?
-      // Draw();
+      gWinActive := True;
     end;
+  end;
+end;
+
+function EventHandler(ev: TSDL_Event): Boolean;
+var
+  key, keychr: Word;
+  uc: UnicodeChar;
+  //joy: Integer;
+begin
+  Result := False;
+  case ev.type_ of
+    SDL_WINDOWEVENT:
+      Result := WindowEventHandler(ev.window);
 
     SDL_QUITEV:
     begin
@@ -281,28 +328,34 @@ begin
 
     SDL_KEYDOWN:
     begin
-      key := ev.key.keysym.sym;
-      keychr := ev.key.keysym.unicode;
+      key := ev.key.keysym.scancode;
       KeyPress(key);
-      if (keychr > 7) and (key <> IK_BACKSPACE) then
-      begin
-        if (keychr >= 128) then
-          keychr := WCharToCP1251(keychr);
-        CharPress(Chr(keychr));
-      end;
+    end;
+    
+    SDL_TEXTINPUT:
+    begin
+      Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
+      keychr := Word(uc);
+      if (keychr > 127) then
+        keychr := WCharToCP1251(keychr);
+      CharPress(Chr(keychr));
     end;
 
-    // key presses and joysticks are handled in e_input
+    // other key presses and joysticks are handled in e_input
   end;
 end;
 
 procedure SwapBuffers();
 begin
-  SDL_GL_SwapBuffers();
+  SDL_GL_SwapWindow(h_Wnd);
 end;
 
 procedure KillGLWindow();
 begin
+  if h_Wnd <> nil then SDL_DestroyWindow(h_Wnd);
+  if h_GL <> nil then SDL_GL_DeleteContext(h_GL);
+  h_Wnd := nil;
+  h_GL := nil;
   wWindowCreated := False;
 end;
 
@@ -315,6 +368,7 @@ begin
   gWinSizeX := gScreenWidth;
   gWinSizeY := gScreenHeight;
 
+  wTitle := Title;
   e_WriteLog('Creating window', MSG_NOTIFY);
 
   if not g_Window_SetDisplay() then
@@ -324,7 +378,9 @@ begin
     exit;
   end;
 
-  SDL_WM_SetCaption(Title, Title);
+  h_Gl := SDL_GL_CreateContext(h_Wnd);
+  if h_Gl = nil then Exit;
+  
   wWindowCreated := True;
 
   e_ResizeWindow(gScreenWidth, gScreenHeight);
@@ -477,12 +533,14 @@ var
   v: Byte;
 begin
   if VSync then v := 1 else v := 0;
+  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
+  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
   SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
   SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
   SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
   SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-  SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, v);
+  SDL_GL_SetSwapInterval(v);
 end;
 
 function SDLMain(): Integer;
diff --git a/src/lib/sdl2/LICENSE b/src/lib/sdl2/LICENSE
new file mode 100644 (file)
index 0000000..14e2f77
--- /dev/null
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in 
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/src/lib/sdl2/README.md b/src/lib/sdl2/README.md
new file mode 100644 (file)
index 0000000..9c5f9b9
--- /dev/null
@@ -0,0 +1,4 @@
+Pascal-SDL-2-Headers
+====================
+
+This are the Pascal SDL 2 Headers.
\ No newline at end of file
diff --git a/src/lib/sdl2/SDL2_gfx.pas b/src/lib/sdl2/SDL2_gfx.pas
new file mode 100644 (file)
index 0000000..1d97b55
--- /dev/null
@@ -0,0 +1,559 @@
+unit SDL2_gfx;
+
+(*
+
+SDL2_framerate.h: framerate manager
+SDL2_gfxPrimitives.h: graphics primitives for SDL
+SDL2_imageFilter.h: byte-image "filter" routines 
+SDL2_rotozoom.h: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces
+
+Copyright (C) 2001-2012  Andreas Schiffler
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+
+Andreas Schiffler -- aschiffler at ferzkopp dot net
+
+*)
+
+{$INCLUDE jedi.inc}
+
+interface
+   uses SDL2;
+
+const
+  {$IFDEF WINDOWS}
+    GFX_LibName = 'SDL2_gfx.dll';
+  {$ENDIF}
+
+  {$IFDEF UNIX}
+    {$IFDEF DARWIN}
+      GFX_LibName = 'libSDL2_gfx.dylib';
+    {$ELSE}
+      {$IFDEF FPC}
+        GFX_LibName = 'libSDL2_gfx.so';
+      {$ELSE}
+        GFX_LibName = 'libSDL2_gfx.so.0';
+      {$ENDIF}
+    {$ENDIF}
+  {$ENDIF}
+
+  {$IFDEF MACOS}
+    GFX_LibName = 'SDL2_gfx';
+    {$IFDEF FPC}
+      {$linklib libSDL2_gfx}
+    {$ENDIF}
+  {$ENDIF}
+
+  {$IF DEFINED(DELPHI) AND DEFINED(MACOS)}
+     {$DEFINE DELMAC}
+  {$ENDIF}
+
+Procedure SDL_GFX_VERSION(Out X: TSDL_Version);
+
+{---< SDL2_framerate.h >---}
+
+Const
+   {*!
+    \brief Highest possible rate supported by framerate controller in Hz (1/s).
+    *}
+   FPS_UPPER_LIMIT = 200;
+
+   {*!
+    \brief Lowest possible rate supported by framerate controller in Hz (1/s).
+    *}
+   FPS_LOWER_LIMIT = 1;
+
+   {*!
+    \brief Default rate of framerate controller in Hz (1/s).
+    *}
+   FPS_DEFAULT = 30;
+
+Type
+   {*! 
+    \brief Structure holding the state and timing information of the framerate controller. 
+    *}
+   
+   TFPSManager = record
+      framecount : uInt32;
+      rateticks : Single; // float rateticks;
+      baseticks : uInt32;
+      lastticks : uInt32;
+      rate : uInt32;
+   end;
+   
+   PFPSManager = ^TFPSManager;
+
+Procedure SDL_initFramerate(manager: PFPSManager);
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_initFramerate' {$ENDIF};
+
+Function SDL_setFramerate(manager: PFPSManager; rate: uInt32):sInt32;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_setFramerate' {$ENDIF};
+   
+Function SDL_getFramerate(manager: PFPSManager):sInt32;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_getFramerate' {$ENDIF};
+   
+Function SDL_getFramecount(manager: PFPSManager):sInt32;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_getFramecount' {$ENDIF};
+
+Function SDL_framerateDelay(manager: PFPSManager):uInt32;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_framerateDelay' {$ENDIF};
+
+
+{---< SDL2_gfxPrimitives.h >---}
+
+Const
+   SDL2_GFXPRIMITIVES_MAJOR = 1;
+   SDL2_GFXPRIMITIVES_MINOR = 0;
+   SDL2_GFXPRIMITIVES_MICRO = 1;
+
+(* Note: all ___Color routines expect the colour to be in format 0xRRGGBBAA *)
+
+
+{* Pixel *}
+
+Function pixelColor(renderer: PSDL_Renderer; x, y: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_pixelColor' {$ENDIF};
+      
+Function pixelRGBA(renderer: PSDL_Renderer; x, y: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_pixelRGBA' {$ENDIF};
+
+{ Horizontal line }
+
+Function hlineColor(renderer: PSDL_Renderer; x1, x2, y: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_hlineColor' {$ENDIF};
+   
+Function hlineRGBA(renderer: PSDL_Renderer; x1, x2, y:sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_hlineRGBA' {$ENDIF};
+
+{ Vertical line }
+
+Function vlineColor(renderer: PSDL_Renderer; x, y1, y2: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_vlineColor' {$ENDIF};
+   
+Function vlineRGBA(renderer: PSDL_Renderer; x, y1, y2: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_vlineRGBA' {$ENDIF};
+
+{ Rectangle }
+
+Function rectangleColor(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rectangleColor' {$ENDIF};
+   
+Function rectangleRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rectangleRGBA' {$ENDIF};
+
+{ Rounded-Corner Rectangle }
+
+Function roundedRectangleColor(renderer: PSDL_Renderer; x1, y1, x2, y2, rad: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_roundedRectangleColor' {$ENDIF};
+   
+Function roundedRectangleRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2, rad: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_roundedRectangleRGBA' {$ENDIF};
+
+{ Filled rectangle (Box) }
+
+Function boxColor(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_boxColor' {$ENDIF};
+   
+Function boxRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_boxRGBA' {$ENDIF};
+
+{ Rounded-Corner Filled rectangle (Box) }
+
+Function roundedBoxColor(renderer: PSDL_Renderer; x1, y1, x2, y2, rad: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_roundedBoxColor' {$ENDIF};
+   
+Function roundedBoxRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2, rad: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_roundedBoxRGBA' {$ENDIF};
+
+{ Line }
+
+Function lineColor(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_lineColor' {$ENDIF};
+   
+Function lineRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_lineRGBA' {$ENDIF};
+
+{ AA Line }
+
+Function aalineColor(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aalineColor' {$ENDIF};
+   
+Function aalineRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aalineRGBA' {$ENDIF};
+
+{ Thick Line }
+Function thickLineColor(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; width: uInt8; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_thickLineColor' {$ENDIF};
+   
+Function thickLineRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2: sInt16; width, r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_thickLineRGBA' {$ENDIF};
+
+{ Circle }
+
+Function circleColor(renderer: PSDL_Renderer; x, y, rad: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_circleColor' {$ENDIF};
+   
+Function circleRGBA(renderer: PSDL_Renderer; x, y, rad: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_circleRGBA' {$ENDIF};
+
+{ Arc }
+
+Function arcColor(renderer: PSDL_Renderer; x, y, rad, start, finish: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_arcColor' {$ENDIF};
+   
+Function arcRGBA(renderer: PSDL_Renderer; x, y, rad, start, finish: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_arcRGBA' {$ENDIF};
+
+{ AA Circle }
+
+Function aacircleColor(renderer: PSDL_Renderer; x, y, rad: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aacircleColor' {$ENDIF};
+   
+Function aacircleRGBA(renderer: PSDL_Renderer; x, y, rad: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aacircleRGBA' {$ENDIF};
+
+{ Filled Circle }
+
+Function filledCircleColor(renderer: PSDL_Renderer; x, y, rad: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledCircleColor' {$ENDIF};
+   
+Function filledCircleRGBA(renderer: PSDL_Renderer; x, y, rad: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledCircleRGBA' {$ENDIF};
+
+{ Ellipse }
+
+Function ellipseColor(renderer: PSDL_Renderer; x, y, rx, ry: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_ellipseColor' {$ENDIF};
+   
+Function ellipseRGBA(renderer: PSDL_Renderer; x, y, rx, ry: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_ellipseRGBA' {$ENDIF};
+
+{ AA Ellipse }
+
+Function aaellipseColor(renderer: PSDL_Renderer; x, y, rx, ry: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aaellipseColor' {$ENDIF};
+   
+Function aaellipseRGBA(renderer: PSDL_Renderer; x, y, rx, ry: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aaellipseRGBA' {$ENDIF};
+
+{ Filled Ellipse }
+
+Function filledEllipseColor(renderer: PSDL_Renderer; x, y, rx, ry: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledEllipseColor' {$ENDIF};
+   
+Function filledEllipseRGBA(renderer: PSDL_Renderer; x, y, rx, ry: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledEllipseRGBA' {$ENDIF};
+
+{ Pie }
+
+Function pieColor(renderer: PSDL_Renderer; x, y, rad, start, finish: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_pieColor' {$ENDIF};
+   
+Function pieRGBA(renderer: PSDL_Renderer; x, y, rad, start, finish: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_pieRGBA' {$ENDIF};
+
+{ Filled Pie }
+
+Function filledPieColor(renderer: PSDL_Renderer; x, y, rad, start, finish: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledPieColor' {$ENDIF};
+   
+Function filledPieRGBA(renderer: PSDL_Renderer; x, y, rad, start, finish: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledPieRGBA' {$ENDIF};
+
+{ Trigon }
+
+Function trigonColor(renderer: PSDL_Renderer; x1, y1, x2, y2, x3, y3: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_trigonColor' {$ENDIF};
+   
+Function trigonRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2, x3, y3: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_trigonRGBA' {$ENDIF};
+
+{ AA-Trigon }
+
+Function aatrigonColor(renderer: PSDL_Renderer; x1, y1, x2, y2, x3, y3: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aatrigonColor' {$ENDIF};
+   
+Function aatrigonRGBA(renderer: PSDL_Renderer;  x1, y1, x2, y2, x3, y3: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aatrigonRGBA' {$ENDIF};
+
+{ Filled Trigon }
+
+Function filledTrigonColor(renderer: PSDL_Renderer; x1, y1, x2, y2, x3, y3: sInt16; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledTrigonColor' {$ENDIF};
+   
+Function filledTrigonRGBA(renderer: PSDL_Renderer; x1, y1, x2, y2, x3, y3: sInt16; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledTrigonRGBA' {$ENDIF};
+
+{ Polygon }
+
+Function polygonColor(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_polygonColor' {$ENDIF};
+   
+Function polygonRGBA(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_polugonRGBA' {$ENDIF};
+
+{ AA-Polygon }
+
+Function aapolygonColor(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aapolygonColor' {$ENDIF};
+   
+Function aapolygonRGBA(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_aapolygonRGBA' {$ENDIF};
+
+{ Filled Polygon }
+
+Function filledPolygonColor(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledPolygonColor' {$ENDIF};
+   
+Function filledPolygonRGBA(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_filledPolygonRGBA' {$ENDIF};
+
+{ Textured Polygon }
+
+Function texturedPolygon(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n: sInt32; texture: PSDL_Surface; texture_dx, texture_dy: sInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_texturedPolygon' {$ENDIF};
+
+{ Bezier }
+
+Function bezierColor(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n, s: sInt32; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_bezierColor' {$ENDIF};
+   
+Function bezierRGBA(renderer: PSDL_Renderer; Const vx, vy: PsInt16; n, s: sInt32; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_bezierRGBA' {$ENDIF};
+
+{ Characters/Strings }
+
+Procedure gfxPrimitivesSetFont(Const fontdata: Pointer; cw, ch: uInt32); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_gfxPrimitivesSetFont' {$ENDIF};
+
+Procedure gfxPrimitivesSetFontRotation(rotation: uInt32); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_gfxPrimitivesSetFontRotation' {$ENDIF};
+
+
+Function characterColor(renderer: PSDL_Renderer; x, y: sInt16; c: Char; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_characterColor' {$ENDIF};
+   
+Function characterRGBA(renderer: PSDL_Renderer; x, y: sInt16; c: Char; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_characterRGBA' {$ENDIF};
+   
+   
+Function stringColor(renderer: PSDL_Renderer; x, y: sInt16; Const str: PChar; colour: uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_stringColor' {$ENDIF};
+   
+Function stringRGBA(renderer: PSDL_Renderer; x, y: sInt16; Const syt: PChar; r, g, b, a: uInt8):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_stringRGBA' {$ENDIF};
+
+
+
+{---< SDL2_imageFilter.h >---}
+
+(* Comments:                                                                           *
+ *  1.) MMX functions work best if all data blocks are aligned on a 32 bytes boundary. *
+ *  2.) Data that is not within an 8 byte boundary is processed using the C routine.   *
+ *  3.) Convolution routines do not have C routines at this time.                      *)
+
+// Detect MMX capability in CPU
+Function SDL_imageFilterMMXdetect():sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMMXdetect' {$ENDIF};
+
+// Force use of MMX off (or turn possible use back on)
+Procedure SDL_imageFilterMMXoff(); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMMXoff' {$ENDIF};
+   
+Procedure SDL_imageFilterMMXon(); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMMXon' {$ENDIF};
+
+
+//  SDL_imageFilterAdd: D = saturation255(S1 + S2)
+Function SDL_imageFilterAdd(Src1, Src2, Dest : PuInt8; Length : uInt32):sInt32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterAdd' {$ENDIF};
+
+//  SDL_imageFilterMean: D = S1/2 + S2/2
+Function SDL_imageFilterMean(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMean' {$ENDIF};
+
+//  SDL_imageFilterSub: D = saturation0(S1 - S2)
+Function SDL_imageFilterSub(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterSub' {$ENDIF};
+
+//  SDL_imageFilterAbsDiff: D = | S1 - S2 |
+Function SDL_imageFilterAbsDiff(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterAbsDiff' {$ENDIF};
+
+
+//  SDL_imageFilterMult: D = saturation(S1 * S2)
+Function SDL_imageFilterMult(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMult' {$ENDIF};
+
+//  SDL_imageFilterMultNor: D = S1 * S2   (non-MMX)
+Function SDL_imageFilterMultNor(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMultNor' {$ENDIF};
+
+//  SDL_imageFilterMultDivby2: D = saturation255(S1/2 * S2)
+Function SDL_imageFilterMultDivby2(Src1, Src2, Dest : PuInt8; Length: uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMultDivby2' {$ENDIF};
+
+//  SDL_imageFilterMultDivby4: D = saturation255(S1/2 * S2/2)
+Function SDL_imageFilterMultDivby4(Src1, Src2, Dest : PuInt8; Length : uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMultDivby4' {$ENDIF};
+
+
+//  SDL_imageFilterBitAnd: D = S1 & S2
+Function SDL_imageFilterBitAnd(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterBitAnd' {$ENDIF};
+
+//  SDL_imageFilterBitOr: D = S1 | S2
+Function SDL_imageFilterBitOr(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterBitOr' {$ENDIF};
+
+
+//  SDL_imageFilterDiv: D = S1 / S2   (non-MMX)
+Function SDL_imageFilterDiv(Src1, Src2, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterDiv' {$ENDIF};
+
+//  SDL_imageFilterBitNegation: D = !S
+Function SDL_imageFilterBitNegation(Src1, Dest : PuInt8; Length:uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterBitNegation' {$ENDIF};
+
+
+//  SDL_imageFilterAddByte: D = saturation255(S + C)
+Function SDL_imageFilterAddByte(Src1, Dest : PuInt8; Length:uInt32; C : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterAddByte' {$ENDIF};
+
+//  SDL_imageFilterAddUsInt32: D = saturation255(S + (usInt32)C)
+Function SDL_imageFilterAddUsInt32(Src1, Dest : PuInt8; Length:uInt32; C : uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterAddUsInt32' {$ENDIF};
+
+//  SDL_imageFilterAddByteToHalf: D = saturation255(S/2 + C)
+Function SDL_imageFilterAddByteToHalf(Src1, Dest : PuInt8; Length:uInt32; C : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterAddByteToHalf' {$ENDIF};
+
+
+//  SDL_imageFilterSubByte: D = saturation0(S - C)
+Function SDL_imageFilterSubByte(Src1, Dest : PuInt8; Length:uInt32; C : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterSubByte' {$ENDIF};
+
+//  SDL_imageFilterSubUsInt32: D = saturation0(S - (usInt32)C)
+Function SDL_imageFilterSubUsInt32(Src1, Dest : PuInt8; Length:uInt32; C : uInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterSubUsInt32' {$ENDIF};
+
+
+//  SDL_imageFilterShiftRight: D = saturation0(S >> N)
+Function SDL_imageFilterShiftRight(Src1, Dest : PuInt8; Length:uInt32; N : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterShiftRight' {$ENDIF};
+
+//  SDL_imageFilterShiftRightUsInt32: D = saturation0((usInt32)S >> N)
+Function SDL_imageFilterShiftRightUsInt32(Src1, Dest : PuInt8; Length:uInt32; N : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterShiftRightUsInt32' {$ENDIF};
+
+
+//  SDL_imageFilterMultByByte: D = saturation255(S * C)
+Function SDL_imageFilterMultByByte(Src1, Dest : PuInt8; Length:uInt32; C : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterMultByByte' {$ENDIF};
+
+//  SDL_imageFilterShiftRightAndMultByByte: D = saturation255((S >> N) * C)
+Function SDL_imageFilterShiftRightAndMultByByte(Src1, Dest : PuInt8; Length:uInt32; N, C : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterShiftRightAndMultByByte' {$ENDIF};
+
+
+//  SDL_imageFilterShiftLeftByte: D = (S << N)
+Function SDL_imageFilterShiftLeftByte(Src1, Dest : PuInt8; Length:uInt32; N: uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterShiftLeftByte' {$ENDIF};
+
+//  SDL_imageFilterShiftLeftUsInt32: D = ((usInt32)S << N)
+Function SDL_imageFilterShiftLeftUsInt32(Src1, Dest : PuInt8; Length:uInt32; N:uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterShiftLeftUsInt32' {$ENDIF};
+
+//  SDL_imageFilterShiftLeft: D = saturation255(S << N)
+Function SDL_imageFilterShiftLeft(Src1, Dest : PuInt8; Length:uInt32; N : uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterShiftLeft' {$ENDIF};
+
+
+//  SDL_imageFilterBinarizeUsingThreshold: D = S >= T ? 255:0
+Function SDL_imageFilterBinarizeUsingThreshold(Src1, Dest : PuInt8; Length:uInt32; T: uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterBinarizeUsingThreshold' {$ENDIF};
+
+//  SDL_imageFilterClipToRange: D = (S >= Tmin) & (S <= Tmax) 255:0
+Function SDL_imageFilterClipToRange(Src1, Dest : PuInt8; Length:uInt32; Tmin, Tmax: uInt8):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterClipToRange' {$ENDIF};
+
+//  SDL_imageFilterNormalizeLinear: D = saturation255((Nmax - Nmin)/(Cmax - Cmin)*(S - Cmin) + Nmin)
+Function SDL_imageFilterNormalizeLinear(Src, Dest: PuInt8; Length, Cmin, Cmax, Nmin, Nmax: sInt32):Sint32; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_SDL_imageFilterNormalizeLinear' {$ENDIF};
+
+
+{---< SDL2_rotozoom.h >---}
+
+Const
+   {*!
+    \brief Disable anti-aliasing (no smoothing).
+   *}
+   SMOOTHING_OFF = 0;
+
+   {*!
+    \brief Enable anti-aliasing (smoothing).
+   *}
+   SMOOTHING_ON = 1;
+
+{ Rotozoom functions }
+
+Function rotozoomSurface(src: PSDL_Surface; angle, zoom: Double; smooth: sInt32):PSDL_Surface; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rotozoomSurface' {$ENDIF};
+
+Function rotozoomSurfaceXY(src: PSDL_Surface; angle, zoomx, zoomy: Double; smooth: sInt32):PSDL_Surface; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rotozoomSurfaceXY' {$ENDIF};
+
+
+Procedure rotozoomSurfaceSize(width, height: sInt32; angle, zoom: Double; dstwidth, dstheight: PuInt32); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rotozoomSurfaceSize' {$ENDIF};
+
+Procedure rotozoomSurfaceSizeXY(width, height: sInt32; angle, zoomx, zoomy: Double; dstwidth, dstheight:PuInt32); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rotozoomSurfaceSizeXY' {$ENDIF};
+
+
+{ Zooming functions }
+
+Function zoomSurface(src: PSDL_Surface; zoomx, zoomy: Double; smooth: sInt32):PSDL_Surface; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_zoomSurface' {$ENDIF};
+
+Procedure zoomSurfaceSize(width, height: sInt32; zoomx, zoomy: Double; dstwidth, dstheight: PuInt32); cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_zoomSurfaceSize' {$ENDIF};
+
+{ Shrinking functions }
+
+Function shrinkSurface(src: PSDL_Surface; factorx, factory: sInt32):PSDL_Surface; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_shrinkSurface' {$ENDIF};
+
+{ Specialized rotation functions }
+
+Function rotateSurface90Degrees(src: PSDL_Surface; numClockwiseTurns: sInt32):PSDL_Surface; cdecl;
+   external GFX_LibName {$IFDEF DELMAC} name '_rotateSurface90Degrees' {$ENDIF};
+
+
+implementation
+
+Procedure SDL_GFX_VERSION(Out X: TSDL_Version);
+begin
+   X.Major := SDL2_GFXPRIMITIVES_MAJOR;
+   X.Minor := SDL2_GFXPRIMITIVES_MINOR;
+   X.Patch := SDL2_GFXPRIMITIVES_MICRO
+end;
+
+end.
diff --git a/src/lib/sdl2/SDL2_image.pas b/src/lib/sdl2/SDL2_image.pas
new file mode 100644 (file)
index 0000000..7afdfe6
--- /dev/null
@@ -0,0 +1,188 @@
+unit sdl2_image;
+
+{*
+  SDL_image:  An example image loading library for use with SDL
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  Pascal-Header-Translation 2013 by Tim Blume
+
+  Both, header translation and sdl_image, under following license:
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  ChangeLog (Header-Translation):
+  -------------------------------
+
+  v.1.72-stable; 29.09.2013: fixed bug with procedure without parameters 
+                             (they must have brackets)
+  v.1.70-stable; 11.09.2013: MacOS compatibility (with Delphi)
+  v.1.33-Alpha; 31.07.2013: Initial Commit
+
+*}
+
+{$DEFINE SDL_IMAGE}
+
+{$I jedi.inc}
+
+interface
+
+uses
+  SDL2;
+
+const
+  {$IFDEF WINDOWS}
+    IMG_LibName = 'SDL2_image.dll';
+  {$ENDIF}
+
+  {$IFDEF UNIX}
+    {$IFDEF DARWIN}
+      IMG_LibName = 'libSDL2_image.dylib';
+    {$ELSE}
+      {$IFDEF FPC}
+        IMG_LibName = 'libSDL2_image.so';
+      {$ELSE}
+        IMG_LibName = 'libSDL2_image.so.0';
+      {$ENDIF}
+    {$ENDIF}
+  {$ENDIF}
+
+  {$IFDEF MACOS}
+    IMG_LibName = 'SDL2_image';
+    {$IFDEF FPC}
+      {$linklib libSDL2_image}
+    {$ENDIF}
+  {$ENDIF}
+
+  {* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL *}
+  SDL_IMAGE_MAJOR_VERSION = 2;
+  SDL_IMAGE_MINOR_VERSION = 0;
+  SDL_IMAGE_PATCHLEVEL    = 0;
+
+  {* This macro can be used to fill a version structure with the compile-time
+   * version of the SDL_image library.
+   *}
+
+procedure SDL_IMAGE_VERSION(Out X: TSDL_Version);
+
+  {* This function gets the version of the dynamically linked SDL_image library.
+   * 
+   * Note that this function does NOT allocate a new TSDL_Version and fill it with info,
+   * but returns a pointer to a TSDL_Version residing inside dynlinked file.
+   * 
+   * As such, attempting to Dispose() of this memory will result in access violation.
+   *}
+function IMG_Linked_Version: PSDL_Version cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_Linked_Version' {$ENDIF} {$ENDIF};
+
+const
+  IMG_INIT_JPG  = $00000001;
+  IMG_INIT_PNG  = $00000002;
+  IMG_INIT_TIF  = $00000004;
+  IMG_INIT_WEBP = $00000008;
+
+type
+  TIMG_InitFlags = DWord;
+
+  {* Loads dynamic libraries and prepares them for use.  Flags should be
+     one or more flags from IMG_InitFlags OR'd together.
+     It returns the flags successfully initialized, or 0 on failure.
+   *}
+function IMG_Init(flags: SInt32): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_Init' {$ENDIF} {$ENDIF};
+
+  {* Unloads libraries loaded with IMG_Init *}
+procedure IMG_Quit() cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_Quit' {$ENDIF} {$ENDIF};
+
+  {* Load an image from an SDL data source.
+     The 'type' may be one of: "BMP", "GIF", "PNG", etc.
+
+     If the image format supports a transparent pixel, SDL will set the
+     colorkey for the surface.  You can enable RLE acceleration on the
+     surface afterwards by calling:
+      SDL_SetColorKey(image, SDL_RLEACCEL, image->format->colorkey);
+   *}
+function IMG_LoadTyped_RW(src: PSDL_RWops; freesrc: SInt32; _type: PAnsiChar): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadTyped_RW' {$ENDIF} {$ENDIF};
+  {* Convenience functions *}
+function IMG_Load(_file: PAnsiChar): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_Load' {$ENDIF} {$ENDIF};
+function IMG_Load_RW(src: PSDL_RWops; freesrc: SInt32): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_Load_RW' {$ENDIF} {$ENDIF};
+
+  {* Load an image directly into a render texture. *}
+function IMG_LoadTexture(renderer: PSDL_Renderer; _file: PAnsiChar): PSDL_Texture cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadTexture' {$ENDIF} {$ENDIF};
+function IMG_LoadTexture_RW(renderer: PSDL_Renderer; src: PSDL_RWops; freesrc: SInt32): PSDL_Texture cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadTexture_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadTextureTyped_RW(renderer: PSDL_Renderer; src: PSDL_RWops; freesrc: SInt32; _type: PAnsiChar): PSDL_Texture cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadTextureTyped_RW' {$ENDIF} {$ENDIF};
+
+  {* Functions to detect a file type, given a seekable source *}
+function IMG_isICO(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isICO' {$ENDIF} {$ENDIF};
+function IMG_isCUR(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isCUR' {$ENDIF} {$ENDIF};
+function IMG_isBMP(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isBMP' {$ENDIF} {$ENDIF};
+function IMG_isGIF(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isGIF' {$ENDIF} {$ENDIF};
+function IMG_isJPG(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isJPG' {$ENDIF} {$ENDIF};
+function IMG_isLBM(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isLBM' {$ENDIF} {$ENDIF};
+function IMG_isPCX(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isPCX' {$ENDIF} {$ENDIF};
+function IMG_isPNG(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isPNG' {$ENDIF} {$ENDIF};
+function IMG_isPNM(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isPNM' {$ENDIF} {$ENDIF};
+function IMG_isTIF(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isTIF' {$ENDIF} {$ENDIF};
+function IMG_isXCF(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '-IMG_isXCF' {$ENDIF} {$ENDIF};
+function IMG_isXPM(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isXPM' {$ENDIF} {$ENDIF};
+function IMG_isXV(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isXV' {$ENDIF} {$ENDIF};
+function IMG_isWEBP(src: PSDL_RWops): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_isWEBP' {$ENDIF} {$ENDIF};
+
+  {* Individual loading functions *}
+function IMG_LoadICO_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadICO_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadCUR_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadCUR_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadBMP_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadBMP_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadGIF_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadGIF_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadJPG_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadJPG_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadLBM_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadLBM_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadPCX_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadPCX_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadPNG_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadPNG_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadPNM_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadPNM_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadTGA_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadTGA_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadTIF_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadTIF_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadXCF_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadXCF_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadXPM_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadXMP_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadXV_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadXV_RW' {$ENDIF} {$ENDIF};
+function IMG_LoadWEBP_RW(src: PSDL_RWops): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_LoadWEBP_RW' {$ENDIF} {$ENDIF};
+
+function IMG_ReadXPMFromArray(xpm: PPChar): PSDL_Surface cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_ReadXPMFromArray' {$ENDIF} {$ENDIF};
+
+  {* Individual saving functions *}
+function IMG_SavePNG(surface: PSDL_Surface; const _file: PAnsiChar): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_SavePNG' {$ENDIF} {$ENDIF};
+function IMG_SavePNG_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: SInt32): SInt32 cdecl; external IMG_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_IMG_SavePNG_RW' {$ENDIF} {$ENDIF};
+
+{* We'll use SDL for reporting errors *}
+function IMG_SetError(fmt: PAnsiChar): SInt32; cdecl;
+function IMG_GetError: PAnsiChar; cdecl;
+
+implementation
+
+procedure SDL_IMAGE_VERSION(Out X: TSDL_Version);
+begin
+  X.major := SDL_IMAGE_MAJOR_VERSION;
+  X.minor := SDL_IMAGE_MINOR_VERSION;
+  X.patch := SDL_IMAGE_PATCHLEVEL;
+end;
+
+function IMG_SetError(fmt: PAnsiChar): SInt32; cdecl;
+begin
+  Result := SDL_SetError(fmt);
+end;
+
+function IMG_GetError: PAnsiChar; cdecl;
+begin
+  Result := SDL_GetError();
+end;
+
+end.
diff --git a/src/lib/sdl2/SDL2_mixer.pas b/src/lib/sdl2/SDL2_mixer.pas
new file mode 100644 (file)
index 0000000..e7f8131
--- /dev/null
@@ -0,0 +1,696 @@
+unit SDL2_mixer;
+
+{*
+  SDL_mixer:  An audio mixer library based on the SDL library
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*}
+
+{* ChangeLog: (Header Translation)
+   ----------
+
+   v.1.72-stable; 29.09.2013: fixed bug with procedures without parameters
+                              (they must have brackets)  
+   v.1.70-stable; 16.09.2013: Initial Commit
+
+*}
+
+interface
+
+{$I jedi.inc}
+
+uses
+  SDL2;
+
+const
+  {$IFDEF WINDOWS}
+    MIX_LibName = 'SDL2_mixer.dll';
+  {$ENDIF}
+
+  {$IFDEF UNIX}
+    {$IFDEF DARWIN}
+      MIX_LibName = 'libSDL2_mixer.dylib';
+    {$ELSE}
+      {$IFDEF FPC}
+        MIX_LibName = 'libSDL2_mixer.so';
+      {$ELSE}
+        MIX_LibName = 'libSDL2_mixer.so.0';
+      {$ENDIF}
+    {$ENDIF}
+  {$ENDIF}
+
+  {$IFDEF MACOS}
+    MIX_LibName = 'SDL2_mixer';
+    {$IFDEF FPC}
+      {$linklib libSDL2_mixer}
+    {$ENDIF}
+  {$ENDIF}
+
+  {* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL *}
+const
+  SDL_MIXER_MAJOR_VERSION = 2;
+  SDL_MIXER_MINOR_VERSION = 0;
+  SDL_MIXER_PATCHLEVEL    = 0;
+
+  {* This macro can be used to fill a version structure with the compile-time
+   * version of the SDL_mixer library.
+   *}
+procedure SDL_MIXER_VERSION(Out X: TSDL_Version);
+
+  {* Backwards compatibility *}
+const
+  MIX_MAJOR_VERSION = SDL_MIXER_MAJOR_VERSION;
+  MIX_MINOR_VERSION = SDL_MIXER_MINOR_VERSION;
+  MIX_PATCHLEVEL    = SDL_MIXER_PATCHLEVEL;
+
+procedure MIX_VERSION(Out X: TSDL_Version);
+
+  {* This function gets the version of the dynamically linked SDL_mixer library.
+     it should NOT be used to fill a version structure, instead you should
+     use the SDL_MIXER_VERSION() macro.
+   *}
+function Mix_Linked_Version: PSDL_Version cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Linked_Version' {$ENDIF} {$ENDIF};
+
+const
+  MIX_INIT_FLAC        = $00000001;
+  MIX_INIT_MOD         = $00000002;
+  MIX_INIT_MODPLUG     = $00000004;
+  MIX_INIT_MP3         = $00000008;
+  MIX_INIT_OGG         = $00000010;
+  MIX_INIT_FLUIDSYNTH  = $00000020;
+type
+  TMIX_InitFlags = Byte;
+
+  {* Loads dynamic libraries and prepares them for use.  Flags should be
+     one or more flags from MIX_InitFlags OR'd together.
+     It returns the flags successfully initialized, or 0 on failure.
+   *}
+function Mix_Init(flags: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Init' {$ENDIF} {$ENDIF};
+
+  {* Unloads libraries loaded with Mix_Init *}
+procedure Mix_Quit() cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Quit' {$ENDIF} {$ENDIF};
+
+
+  {* The default mixer has 8 simultaneous mixing channels *}
+{$IFNDEF MIX_CHANNELS}
+const
+  MIX_CHANNELS = 8;
+{$ENDIF}
+
+  {* Good default values for a PC soundcard *}
+const
+  MIX_DEFAULT_FREQUENCY = 22050;
+  MIX_DEFAULT_CHANNELS = 2;
+  MIX_MAX_VOLUME       = 128; {* Volume of a chunk *}
+
+{$IFDEF FPC}
+   {$IF DEFINED(ENDIAN_LITTLE)}
+      MIX_DEFAULT_FORMAT = AUDIO_S16LSB;
+   {$ELSEIF DEFINED(ENDIAN_BIG)}
+      MIX_DEFAULT_FORMAT = AUDIO_S16MSB;
+   {$ELSE}
+      {$FATAL Unable to determine endianness.}
+   {$IFEND}
+{$ENDIF}
+
+  {* The internal format for an audio chunk *}
+type
+  PMix_Chunk = ^TMix_Chunk;
+  TMix_Chunk = record
+    allocated: Integer;
+    abuf: PUInt8;
+    alen: UInt32;
+    volume: UInt8;       {* Per-sample volume, 0-128 *}
+  end;
+
+  {* The different fading types supported *}
+type
+  TMix_Fading = (MIX_NO_FADING, MIX_FADING_OUT, MIX_FADING_IN);
+
+  TMix_MusicType = (MUS_NONE,
+                    MUS_CMD,
+                    MUS_WAV,
+                    MUS_MOD,
+                    MUS_MID,
+                    MUS_OGG,
+                    MUS_MP3,
+                    MUS_MP3_MAD,
+                    MUS_FLAC,
+                    MUS_MODPLUG);
+
+  {* The internal format for a music chunk interpreted via mikmod *}
+  PMix_Music = ^TMix_Music;
+  TMix_Music = record end;
+
+  {* Open the mixer with a certain audio format *}
+function Mix_OpenAudio(frequency: Integer; format: UInt16; channels: Integer; chunksize: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_OpenAudio' {$ENDIF} {$ENDIF};
+
+  {* Dynamically change the number of channels managed by the mixer.
+     If decreasing the number of channels, the upper channels are
+     stopped.
+     This function returns the new number of allocated channels.
+   *}
+function Mix_AllocateChannels(numchans: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_AllocateChannels' {$ENDIF} {$ENDIF};
+
+  {* Find out what the actual audio device parameters are.
+     This function returns 1 if the audio has been opened, 0 otherwise.
+   *}
+function Mix_QuerySpec(frequency: PInt; format: PUInt16; channels: PInt): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_QuerySpec' {$ENDIF} {$ENDIF};
+
+  {* Load a wave file or a music (.mod .s3m .it .xm) file *}
+function Mix_LoadWAV_RW(src: PSDL_RWops; freesrc: Integer): PMix_Chunk cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_LoadWAV_RW' {$ENDIF} {$ENDIF};
+function Mix_LoadWAV(_file: PAnsiChar): PMix_Chunk;
+function Mix_LoadMUS(_file: PAnsiChar): PMix_Music cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_LoadMUS' {$ENDIF} {$ENDIF};
+
+  {* Load a music file from an SDL_RWop object (Ogg and MikMod specific currently)
+     Matt Campbell (matt@campbellhome.dhs.org) April 2000 *}
+function Mix_LoadMUS_RW(src: PSDL_RWops; freesrc: Integer): PMix_Music cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_LoadMUS_RW' {$ENDIF} {$ENDIF};
+
+  {* Load a music file from an SDL_RWop object assuming a specific format *}
+function Mix_LoadMUSType_RW(src: PSDL_RWops; _type: TMix_MusicType; freesrc: Integer): PMix_Music cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_LoadMUSType_RW' {$ENDIF} {$ENDIF};
+
+  {* Load a wave file of the mixer format from a memory buffer *}
+function Mix_QuickLoad_WAV(mem: PUInt8): PMix_Chunk cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_QuickLoad_WAV' {$ENDIF} {$ENDIF};
+
+  {* Load raw audio data of the mixer format from a memory buffer *}
+function Mix_QuickLoad_RAW(mem: PUInt8; len: UInt32): PMix_Chunk cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_QuickLoad_RAW' {$ENDIF} {$ENDIF};
+
+  {* Free an audio chunk previously loaded *}
+procedure Mix_FreeChunk(chunk: PMix_Chunk) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FreeChunk' {$ENDIF} {$ENDIF};
+procedure Mix_FreeMusic(music: PMix_Music) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FreeMusic' {$ENDIF} {$ENDIF};
+
+  {* Get a list of chunk/music decoders that this build of SDL_mixer provides.
+     This list can change between builds AND runs of the program, if external
+     libraries that add functionality become available.
+     You must successfully call Mix_OpenAudio() before calling these functions.
+     This API is only available in SDL_mixer 1.2.9 and later.
+
+     // usage...
+     int i;
+     const int total = Mix_GetNumChunkDecoders();
+     for (i = 0; i < total; i++)
+         printf("Supported chunk decoder: [%s]\n", Mix_GetChunkDecoder(i));
+
+     Appearing in this list doesn't promise your specific audio file will
+     decode...but it's handy to know if you have, say, a functioning Timidity
+     install.
+
+     These return values are static, read-only data; do not modify or free it.
+     The pointers remain valid until you call Mix_CloseAudio().
+  *}
+function Mix_GetNumChunkDecoders: Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetNumChunkDecoders' {$ENDIF} {$ENDIF};
+function Mix_GetChunkDecoder(index: Integer): PAnsiChar cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetChunkDecoder' {$ENDIF} {$ENDIF};
+function Mix_GetNumMusicDecoders: Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetNumMusicDecoders' {$ENDIF} {$ENDIF};
+function Mix_GetMusicDecoder(index: Integer): PAnsiChar cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetMusicDecoder' {$ENDIF} {$ENDIF};
+
+  {* Find out the music format of a mixer music, or the currently playing
+     music, if 'music' is NULL.
+  *}
+function Mix_GetMusicType(music: TMix_Music): TMix_MusicType cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetMusicType' {$ENDIF} {$ENDIF};
+
+  {* Set a function that is called after all mixing is performed.
+     This can be used to provide real-time visual display of the audio stream
+     or add a custom mixer filter for the stream data.
+  *}
+type
+  TMix_Func = procedure(udata: Pointer; stream: PUInt8; len: Integer);
+
+procedure Mix_SetPostMix(func: TMix_Func; arg: Pointer) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetPostMix' {$ENDIF} {$ENDIF};
+
+  {* Add your own music player or additional mixer function.
+     If 'mix_func' is NULL, the default music player is re-enabled.
+   *}
+procedure Mix_HookMusic(func: TMix_Func; arg: Pointer) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_HookMusic' {$ENDIF} {$ENDIF};
+
+  {* Add your own callback when the music has finished playing.
+     This callback is only called if the music finishes naturally.
+   *}
+type
+  PMix_Music_Finished = ^TMix_Music_Finished;
+  TMix_Music_Finished = procedure();
+procedure Mix_HookMusicFinished(music_finished: PMix_Music_Finished) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_HookMusicFinished' {$ENDIF} {$ENDIF};
+
+  {* Get a pointer to the user data for the current music hook *}
+function Mix_GetMusicHookData: Pointer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetMusicHookData' {$ENDIF} {$ENDIF};
+
+  {*
+   * Add your own callback when a channel has finished playing. NULL
+   *  to disable callback. The callback may be called from the mixer's audio
+   *  callback or it could be called as a result of Mix_HaltChannel(), etc.
+   *  do not call SDL_LockAudio() from this callback; you will either be
+   *  inside the audio callback, or SDL_mixer will explicitly lock the audio
+   *  before calling your callback.
+   *}
+type
+  TMix_Channel_Finished = procedure(channel: Integer);
+procedure Mix_ChannelFinished(channel_finished: TMix_Channel_Finished) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_ChannelFinished' {$ENDIF} {$ENDIF};
+
+  {* Special Effects API by ryan c. gordon. (icculus@icculus.org) *}
+const
+  MIX_CHANNEL_POST = -2;
+
+  {* This is the format of a special effect callback:
+   *
+   *   myeffect(int chan, void *stream, int len, void *udata);
+   *
+   * (chan) is the channel number that your effect is affecting. (stream) is
+   *  the buffer of data to work upon. (len) is the size of (stream), and
+   *  (udata) is a user-defined bit of data, which you pass as the last arg of
+   *  Mix_RegisterEffect(), and is passed back unmolested to your callback.
+   *  Your effect changes the contents of (stream) based on whatever parameters
+   *  are significant, or just leaves it be, if you prefer. You can do whatever
+   *  you like to the buffer, though, and it will continue in its changed state
+   *  down the mixing pipeline, through any other effect functions, then finally
+   *  to be mixed with the rest of the channels and music for the final output
+   *  stream.
+   *
+   * DO NOT EVER call SDL_LockAudio() from your callback function!
+   *}
+type
+  TMix_EffectFunc_t = procedure(chan: Integer; stream: Pointer; len: Integer; udata: Pointer);
+
+  {*
+   * This is a callback that signifies that a channel has finished all its
+   *  loops and has completed playback. This gets called if the buffer
+   *  plays out normally, or if you call Mix_HaltChannel(), implicitly stop
+   *  a channel via Mix_AllocateChannels(), or unregister a callback while
+   *  it's still playing.
+   *
+   * DO NOT EVER call SDL_LockAudio() from your callback function!
+   *}
+type
+  TMix_EffectDone_t = procedure(chan: Integer; udata: Pointer);
+
+  {* Register a special effect function. At mixing time, the channel data is
+   *  copied into a buffer and passed through each registered effect function.
+   *  After it passes through all the functions, it is mixed into the final
+   *  output stream. The copy to buffer is performed once, then each effect
+   *  function performs on the output of the previous effect. Understand that
+   *  this extra copy to a buffer is not performed if there are no effects
+   *  registered for a given chunk, which saves CPU cycles, and any given
+   *  effect will be extra cycles, too, so it is crucial that your code run
+   *  fast. Also note that the data that your function is given is in the
+   *  format of the sound device, and not the format you gave to Mix_OpenAudio(),
+   *  although they may in reality be the same. This is an unfortunate but
+   *  necessary speed concern. Use Mix_QuerySpec() to determine if you can
+   *  handle the data before you register your effect, and take appropriate
+   *  actions.
+   * You may also specify a callback (Mix_EffectDone_t) that is called when
+   *  the channel finishes playing. This gives you a more fine-grained control
+   *  than Mix_ChannelFinished(), in case you need to free effect-specific
+   *  resources, etc. If you don't need this, you can specify NULL.
+   * You may set the callbacks before or after calling Mix_PlayChannel().
+   * Things like Mix_SetPanning() are just internal special effect functions,
+   *  so if you are using that, you've already incurred the overhead of a copy
+   *  to a separate buffer, and that these effects will be in the queue with
+   *  any functions you've registered. The list of registered effects for a
+   *  channel is reset when a chunk finishes playing, so you need to explicitly
+   *  set them with each call to Mix_PlayChannel*().
+   * You may also register a special effect function that is to be run after
+   *  final mixing occurs. The rules for these callbacks are identical to those
+   *  in Mix_RegisterEffect, but they are run after all the channels and the
+   *  music have been mixed into a single stream, whereas channel-specific
+   *  effects run on a given channel before any other mixing occurs. These
+   *  global effect callbacks are call "posteffects". Posteffects only have
+   *  their Mix_EffectDone_t function called when they are unregistered (since
+   *  the main output stream is never "done" in the same sense as a channel).
+   *  You must unregister them manually when you've had enough. Your callback
+   *  will be told that the channel being mixed is (MIX_CHANNEL_POST) if the
+   *  processing is considered a posteffect.
+   *
+   * After all these effects have finished processing, the callback registered
+   *  through Mix_SetPostMix() runs, and then the stream goes to the audio
+   *  device.
+   *
+   * DO NOT EVER call SDL_LockAudio() from your callback function!
+   *
+   * returns zero if error (no such channel), nonzero if added.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_RegisterEffect(chan: Integer; f: TMix_EffectFunc_t; d: TMix_EffectDone_t; arg: Pointer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_RegisterEffect' {$ENDIF} {$ENDIF};
+
+  {* You may not need to call this explicitly, unless you need to stop an
+   *  effect from processing in the middle of a chunk's playback.
+   * Posteffects are never implicitly unregistered as they are for channels,
+   *  but they may be explicitly unregistered through this function by
+   *  specifying MIX_CHANNEL_POST for a channel.
+   * returns zero if error (no such channel or effect), nonzero if removed.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_UnregisterEffect(channel: Integer; f: TMix_EffectFunc_t): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_UnregisterEffect' {$ENDIF} {$ENDIF};
+
+  {* You may not need to call this explicitly, unless you need to stop all
+   *  effects from processing in the middle of a chunk's playback. Note that
+   *  this will also shut off some internal effect processing, since
+   *  Mix_SetPanning() and others may use this API under the hood. This is
+   *  called internally when a channel completes playback.
+   * Posteffects are never implicitly unregistered as they are for channels,
+   *  but they may be explicitly unregistered through this function by
+   *  specifying MIX_CHANNEL_POST for a channel.
+   * returns zero if error (no such channel), nonzero if all effects removed.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_UnregisterAllEffects(channel: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_UnregisterEffects' {$ENDIF} {$ENDIF};
+
+const
+  MIX_EFFECTSMAXSPEED = 'MIX_EFFECTSMAXSPEED';
+
+  {*
+   * These are the internally-defined mixing effects. They use the same API that
+   *  effects defined in the application use, but are provided here as a
+   *  convenience. Some effects can reduce their quality or use more memory in
+   *  the name of speed; to enable this, make sure the environment variable
+   *  MIX_EFFECTSMAXSPEED (see above) is defined before you call
+   *  Mix_OpenAudio().
+   *}
+
+  {* Set the panning of a channel. The left and right channels are specified
+   *  as integers between 0 and 255, quietest to loudest, respectively.
+   *
+   * Technically, this is just individual volume control for a sample with
+   *  two (stereo) channels, so it can be used for more than just panning.
+   *  If you want real panning, call it like this:
+   *
+   *   Mix_SetPanning(channel, left, 255 - left);
+   *
+   * ...which isn't so hard.
+   *
+   * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and
+   *  the panning will be done to the final mixed stream before passing it on
+   *  to the audio device.
+   *
+   * This uses the Mix_RegisterEffect() API internally, and returns without
+   *  registering the effect function if the audio device is not configured
+   *  for stereo output. Setting both (left) and (right) to 255 causes this
+   *  effect to be unregistered, since that is the data's normal state.
+   *
+   * returns zero if error (no such channel or Mix_RegisterEffect() fails),
+   *  nonzero if panning effect enabled. Note that an audio device in mono
+   *  mode is a no-op, but this call will return successful in that case.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_SetPanning(channel: Integer; left: UInt8; right: UInt8): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetPanning' {$ENDIF} {$ENDIF};
+
+  {* Set the position of a channel. (angle) is an integer from 0 to 360, that
+   *  specifies the location of the sound in relation to the listener. (angle)
+   *  will be reduced as neccesary (540 becomes 180 degrees, -100 becomes 260).
+   *  Angle 0 is due north, and rotates clockwise as the value increases.
+   *  For efficiency, the precision of this effect may be limited (angles 1
+   *  through 7 might all produce the same effect, 8 through 15 are equal, etc).
+   *  (distance) is an integer between 0 and 255 that specifies the space
+   *  between the sound and the listener. The larger the number, the further
+   *  away the sound is. Using 255 does not guarantee that the channel will be
+   *  culled from the mixing process or be completely silent. For efficiency,
+   *  the precision of this effect may be limited (distance 0 through 5 might
+   *  all produce the same effect, 6 through 10 are equal, etc). Setting (angle)
+   *  and (distance) to 0 unregisters this effect, since the data would be
+   *  unchanged.
+   *
+   * If you need more precise positional audio, consider using OpenAL for
+   *  spatialized effects instead of SDL_mixer. This is only meant to be a
+   *  basic effect for simple "3D" games.
+   *
+   * If the audio device is configured for mono output, then you won't get
+   *  any effectiveness from the angle; however, distance attenuation on the
+   *  channel will still occur. While this effect will function with stereo
+   *  voices, it makes more sense to use voices with only one channel of sound,
+   *  so when they are mixed through this effect, the positioning will sound
+   *  correct. You can convert them to mono through SDL before giving them to
+   *  the mixer in the first place if you like.
+   *
+   * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and
+   *  the positioning will be done to the final mixed stream before passing it
+   *  on to the audio device.
+   *
+   * This is a convenience wrapper over Mix_SetDistance() and Mix_SetPanning().
+   *
+   * returns zero if error (no such channel or Mix_RegisterEffect() fails),
+   *  nonzero if position effect is enabled.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_SetPosition(channel: Integer; angle: SInt16; distance: UInt8): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetPosition' {$ENDIF} {$ENDIF};
+
+  {* Set the "distance" of a channel. (distance) is an integer from 0 to 255
+   *  that specifies the location of the sound in relation to the listener.
+   *  Distance 0 is overlapping the listener, and 255 is as far away as possible
+   *  A distance of 255 does not guarantee silence; in such a case, you might
+   *  want to try changing the chunk's volume, or just cull the sample from the
+   *  mixing process with Mix_HaltChannel().
+   * For efficiency, the precision of this effect may be limited (distances 1
+   *  through 7 might all produce the same effect, 8 through 15 are equal, etc).
+   *  (distance) is an integer between 0 and 255 that specifies the space
+   *  between the sound and the listener. The larger the number, the further
+   *  away the sound is.
+   * Setting (distance) to 0 unregisters this effect, since the data would be
+   *  unchanged.
+   * If you need more precise positional audio, consider using OpenAL for
+   *  spatialized effects instead of SDL_mixer. This is only meant to be a
+   *  basic effect for simple "3D" games.
+   *
+   * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and
+   *  the distance attenuation will be done to the final mixed stream before
+   *  passing it on to the audio device.
+   *
+   * This uses the Mix_RegisterEffect() API internally.
+   *
+   * returns zero if error (no such channel or Mix_RegisterEffect() fails),
+   *  nonzero if position effect is enabled.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_SetDistance(channel: Integer; distance: UInt8): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetDistance' {$ENDIF} {$ENDIF};
+
+{*
+ * !!! FIXME : Haven't implemented, since the effect goes past the
+ *              end of the sound buffer. Will have to think about this.
+ *               --ryan.
+ *}
+//#if 0
+{* Causes an echo effect to be mixed into a sound. (echo) is the amount
+ *  of echo to mix. 0 is no echo, 255 is infinite (and probably not
+ *  what you want).
+ *
+ * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and
+ *  the reverbing will be done to the final mixed stream before passing it on
+ *  to the audio device.
+ *
+ * This uses the Mix_RegisterEffect() API internally. If you specify an echo
+ *  of zero, the effect is unregistered, as the data is already in that state.
+ *
+ * returns zero if error (no such channel or Mix_RegisterEffect() fails),
+ *  nonzero if reversing effect is enabled.
+ *  Error messages can be retrieved from Mix_GetError().
+ *}
+//extern no_parse_DECLSPEC int SDLCALL Mix_SetReverb(int channel, Uint8 echo);
+//#endif
+
+  {* Causes a channel to reverse its stereo. This is handy if the user has his
+   *  speakers hooked up backwards, or you would like to have a minor bit of
+   *  psychedelia in your sound code.  :)  Calling this function with (flip)
+   *  set to non-zero reverses the chunks's usual channels. If (flip) is zero,
+   *  the effect is unregistered.
+   *
+   * This uses the Mix_RegisterEffect() API internally, and thus is probably
+   *  more CPU intensive than having the user just plug in his speakers
+   *  correctly. Mix_SetReverseStereo() returns without registering the effect
+   *  function if the audio device is not configured for stereo output.
+   *
+   * If you specify MIX_CHANNEL_POST for (channel), then this the effect is used
+   *  on the final mixed stream before sending it on to the audio device (a
+   *  posteffect).
+   *
+   * returns zero if error (no such channel or Mix_RegisterEffect() fails),
+   *  nonzero if reversing effect is enabled. Note that an audio device in mono
+   *  mode is a no-op, but this call will return successful in that case.
+   *  Error messages can be retrieved from Mix_GetError().
+   *}
+function Mix_SetReverseStereo(channel: Integer; flip: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetReverseStereo' {$ENDIF} {$ENDIF};
+
+  {* end of effects API. --ryan. *}
+
+  {* Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate
+     them dynamically to the next sample if requested with a -1 value below.
+     Returns the number of reserved channels.
+   *}
+function Mix_ReserveChannels(num: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_ReverseChannels' {$ENDIF} {$ENDIF};
+
+  {* Channel grouping functions *}
+
+  {* Attach a tag to a channel. A tag can be assigned to several mixer
+     channels, to form groups of channels.
+     If 'tag' is -1, the tag is removed (actually -1 is the tag used to
+     represent the group of all the channels).
+     Returns true if everything was OK.
+   *}
+function Mix_GroupChannel(which: Integer; tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GroupChannel' {$ENDIF} {$ENDIF};
+  {* Assign several consecutive channels to a group *}
+function Mix_GroupChannels(from: Integer; _to: Integer; tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GroupChannels' {$ENDIF} {$ENDIF};
+  {* Finds the first available channel in a group of channels,
+     returning -1 if none are available.
+   *}
+function Mix_GroupAvailable(tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GroupAvailable' {$ENDIF} {$ENDIF};
+  {* Returns the number of channels in a group. This is also a subtle
+     way to get the total number of channels when 'tag' is -1
+   *}
+function Mix_GroupCount(tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GroupCount' {$ENDIF} {$ENDIF};
+  {* Finds the "oldest" sample playing in a group of channels *}
+function Mix_GroupOldest(tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GroupOldest' {$ENDIF} {$ENDIF};
+  {* Finds the "most recent" (i.e. last) sample playing in a group of channels *}
+function Mix_GroupNewer(tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GroupNewer' {$ENDIF} {$ENDIF};
+
+  {* Play an audio chunk on a specific channel.
+     If the specified channel is -1, play on the first free channel.
+     If 'loops' is greater than zero, loop the sound that many times.
+     If 'loops' is -1, loop inifinitely (~65000 times).
+     Returns which channel was used to play the sound.
+  *}
+function Mix_PlayChannel(channel: Integer; chunk: PMix_Chunk; loops: Integer): Integer;
+  {* The same as above, but the sound is played at most 'ticks' milliseconds *}
+function Mix_PlayChannelTimed(channel: Integer; chunk: PMix_Chunk; loops: Integer; ticks: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_PlayChannelTimed' {$ENDIF} {$ENDIF};
+function Mix_PlayMusic(music: PMix_Music; loops: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_PlayMusic' {$ENDIF} {$ENDIF};
+
+  {* Fade in music or a channel over "ms" milliseconds, same semantics as the "Play" functions *}
+function Mix_FadeInMusic(music: PMix_Music; loops: Integer; ms: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadeInMusic' {$ENDIF} {$ENDIF};
+function Mix_FadeInMusicPos(music: PMix_Music; loops: Integer; ms: Integer; position: Double): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadeInMusicPos' {$ENDIF} {$ENDIF};
+function Mix_FadeInChannel(channel: Integer; chunk: PMix_Chunk; loops: Integer; ms: Integer): Integer;
+function Mix_FadeInChannelTimed(channel: Integer; chunk: PMix_Chunk; loops: Integer; ms: Integer; ticks: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadeInChannelTimed' {$ENDIF} {$ENDIF};
+
+  {* Set the volume in the range of 0-128 of a specific channel or chunk.
+     If the specified channel is -1, set volume for all channels.
+     Returns the original volume.
+     If the specified volume is -1, just return the current volume.
+  *}
+function Mix_Volume(channel: Integer; volume: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Volume' {$ENDIF} {$ENDIF};
+function Mix_VolumeChunk(chunk: PMix_Chunk; volume: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_VolumeChunk' {$ENDIF} {$ENDIF};
+function Mix_VolumeMusic(volume: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_VolumeMusic' {$ENDIF} {$ENDIF};
+
+  {* Halt playing of a particular channel *}
+function Mix_HaltChannel(channel: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_HaltChannel' {$ENDIF} {$ENDIF};
+function Mix_HaltGroup(tag: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_HaltGroup' {$ENDIF} {$ENDIF};
+function Mix_HaltMusic: Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_HaltMusic' {$ENDIF} {$ENDIF};
+
+  {* Change the expiration delay for a particular channel.
+     The sample will stop playing after the 'ticks' milliseconds have elapsed,
+     or remove the expiration if 'ticks' is -1
+  *}
+function Mix_ExpireChannel(channel: Integer; ticks: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_ExpireChannel' {$ENDIF} {$ENDIF};
+
+  {* Halt a channel, fading it out progressively till it's silent
+     The ms parameter indicates the number of milliseconds the fading
+     will take.
+   *}
+function Mix_FadeOutChannel(which: Integer; ms: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadeOutChannel' {$ENDIF} {$ENDIF};
+function Mix_FadeOutGroup(tag: Integer; ms: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadeOutGroup' {$ENDIF} {$ENDIF};
+function Mix_FadeOutMusic(ms: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadeOutMusic' {$ENDIF} {$ENDIF};
+
+  {* Query the fading status of a channel *}
+function Mix_FadingMusic: TMix_Fading cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadingMusic' {$ENDIF} {$ENDIF};
+function Mix_FadingChannel(which: Integer): TMix_Fading cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_FadingChannel' {$ENDIF} {$ENDIF};
+
+  {* Pause/Resume a particular channel *}
+procedure Mix_Pause(channel: Integer) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Pause' {$ENDIF} {$ENDIF};
+procedure Mix_Resume(channel: Integer) cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Resume' {$ENDIF} {$ENDIF};
+function Mix_Paused(channel: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Paused' {$ENDIF} {$ENDIF};
+
+  {* Pause/Resume the music stream *}
+procedure Mix_PauseMusic cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_PauseMusic' {$ENDIF} {$ENDIF};
+procedure Mix_ResumeMusic cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_ResumeMusic' {$ENDIF} {$ENDIF};
+procedure Mix_RewindMusic cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_RewindMusic' {$ENDIF} {$ENDIF};
+function Mix_PausedMusic: Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_PausedMusic' {$ENDIF} {$ENDIF};
+
+  {* Set the current position in the music stream.
+     This returns 0 if successful, or -1 if it failed or isn't implemented.
+     This function is only implemented for MOD music formats (set pattern
+     order number) and for OGG, FLAC, MP3_MAD, and MODPLUG music (set
+     position in seconds), at the moment.
+  *}
+function Mix_SetMusicPosition(position: Double): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetMusicPosition' {$ENDIF} {$ENDIF};
+
+  {* Check the status of a specific channel.
+     If the specified channel is -1, check all channels.
+  *}
+function Mix_Playing(channel: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_Playing' {$ENDIF} {$ENDIF};
+function Mix_PlayingMusic: Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_PlayingMusic' {$ENDIF} {$ENDIF};
+
+  {* Stop music and set external music playback command *}
+function Mix_SetMusicCMD(command: PAnsiChar): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetMusicCMD' {$ENDIF} {$ENDIF};
+
+  {* Synchro value is set by MikMod from modules while playing *}
+function Mix_SetSynchroValue(value: Integer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetSynchroValue' {$ENDIF} {$ENDIF};
+function Mix_GetSynchroValue: Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetSynchroValue' {$ENDIF} {$ENDIF};
+
+  {* Set/Get/Iterate SoundFonts paths to use by supported MIDI backends *}
+function Mix_SetSoundFonts(paths: PAnsiChar): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_SetSoundFonts' {$ENDIF} {$ENDIF};
+function Mix_GetSoundFonts: PAnsiChar cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetSoundFonts' {$ENDIF} {$ENDIF};
+
+type
+  TMix_SoundFunc = function(c: PAnsiChar; p: Pointer): Integer;
+
+function Mix_EachSoundFont(func: TMix_SoundFunc; data: Pointer): Integer cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_EachSoundFont' {$ENDIF} {$ENDIF};
+
+  {* Get the Mix_Chunk currently associated with a mixer channel
+      Returns NULL if it's an invalid channel, or there's no chunk associated.
+  *}
+function Mix_GetChunk(channel: Integer): PMix_Chunk cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_GetChunk' {$ENDIF} {$ENDIF};
+
+  {* Close the mixer, halting all playing audio *}
+procedure Mix_CloseAudio cdecl; external MIX_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_MIX_CloseAudio' {$ENDIF} {$ENDIF};
+
+{* We'll use SDL for reporting errors *}
+function Mix_SetError(const fmt: PAnsiChar): SInt32; cdecl;
+function Mix_GetError: PAnsiChar; cdecl;
+
+implementation
+
+procedure SDL_MIXER_VERSION(Out X: TSDL_Version);
+begin
+  X.major := SDL_MIXER_MAJOR_VERSION;
+  X.minor := SDL_MIXER_MINOR_VERSION;
+  X.patch := SDL_MIXER_PATCHLEVEL;
+end;
+
+procedure MIX_VERSION(Out X: TSDL_Version);
+begin
+  SDL_MIXER_VERSION(X);
+end;
+
+function Mix_FadeInChannel(channel: Integer; chunk: PMix_Chunk; loops: Integer; ms: Integer): Integer;
+begin
+  Result := Mix_FadeInChannelTimed(channel, chunk, loops, ms, -1);
+end;
+
+function Mix_PlayChannel(channel: Integer; chunk: PMix_Chunk; loops: Integer): Integer;
+begin
+  Result := Mix_PlayChannelTimed(channel, chunk, loops, -1);
+end;
+
+function Mix_LoadWAV(_file: PAnsiChar): PMix_Chunk;
+begin
+  Result := Mix_LoadWAV_RW(SDL_RWFromFile(_file, 'rb'), 1);
+end;
+
+function Mix_SetError(const fmt: PAnsiChar): SInt32; cdecl;
+begin
+  Result := SDL_SetError(fmt);
+end;
+
+function Mix_GetError: PAnsiChar; cdecl;
+begin
+  Result := SDL_GetError();
+end;
+
+end.
diff --git a/src/lib/sdl2/SDL2_net.pas b/src/lib/sdl2/SDL2_net.pas
new file mode 100644 (file)
index 0000000..5f1309a
--- /dev/null
@@ -0,0 +1,429 @@
+       
+
+    {*
+      SDL_net:  An example cross-platform network library for use with SDL
+      Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+      Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
+     
+      This software is provided 'as-is', without any express or implied
+      warranty.  In no event will the authors be held liable for any damages
+      arising from the use of this software.
+     
+      Permission is granted to anyone to use this software for any purpose,
+      including commercial applications, and to alter it and redistribute it
+      freely, subject to the following restrictions:
+     
+      1. The origin of this software must not be misrepresented; you must not
+         claim that you wrote the original software. If you use this software
+         in a product, an acknowledgment in the product documentation would be
+         appreciated but is not required.
+      2. Altered source versions must be plainly marked as such, and must not be
+         misrepresented as being the original software.
+      3. This notice may not be removed or altered from any source distribution.
+    *}
+    unit SDL2_net;
+    
+    {$INCLUDE jedi.inc}
+     
+    interface
+     
+    uses SDL2;
+     
+    const
+      {$IFDEF WINDOWS}
+        SDLNet_LibName = 'SDL2_net.dll';
+      {$ENDIF}
+     
+      {$IFDEF UNIX}
+        {$IFDEF DARWIN}
+          SDLNet_LibName = 'libSDL2_net.dylib';
+        {$ELSE}
+          {$IFDEF FPC}
+            SDLNet_LibName = 'libSDL2_net.so';
+          {$ELSE}
+            SDLNet_LibName = 'libSDL2_net-2.0.so.0';
+          {$ENDIF}
+        {$ENDIF}
+      {$ENDIF}
+     
+      {$IFDEF MACOS}
+        SDLNet_LibName = 'SDL2_net';
+        {$IFDEF FPC}
+          {$linklib libSDL2_net}
+        {$ENDIF}
+      {$ENDIF}
+     
+     
+    type
+      TSDLNet_Version = TSDL_Version;
+     
+    const
+      {* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL *}
+      SDL_NET_MAJOR_VERSION = 2;
+      SDL_NET_MINOR_VERSION = 0;
+      SDL_NET_PATCHLEVEL    = 0;
+     
+      {* This macro can be used to fill a version structure with the compile-time
+       * version of the SDL_net library.
+       *}
+    procedure SDL_NET_VERSION(Out X: TSDL_Version);
+     
+      {* This function gets the version of the dynamically linked SDL_net library.
+         it should NOT be used to fill a version structure, instead you should
+         use the SDL_NET_VERSION() macro.
+       *}
+    procedure SDLNet_Linked_Version() cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_Linked_Version' {$ENDIF} {$ENDIF};
+     
+      {* Initialize/Cleanup the network API
+         SDL must be initialized before calls to functions in this library,
+         because this library uses utility functions from the SDL library.
+      *}
+    function SDLNet_Init(): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_Init' {$ENDIF} {$ENDIF};
+    procedure SDLNet_Quit() cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_Quit' {$ENDIF} {$ENDIF};
+     
+    type
+      {***********************************************************************}
+      {* IPv4 hostname resolution API                                        *}
+      {***********************************************************************}
+      TIPaddress = record
+        host: UInt32;            {* 32-bit IPv4 host address *}
+        port: UInt16;            {* 16-bit protocol port *}  
+      end;
+      PIPaddress = ^TIPaddress;
+     
+      {* Resolve a host name and port to an IP address in network form.
+         If the function succeeds, it will return 0.
+         If the host couldn't be resolved, the host portion of the returned
+         address will be INADDR_NONE, and the function will return -1.
+         If 'host' is NULL, the resolved host will be set to INADDR_ANY.
+       *}
+    const
+      INADDR_ANY       = $00000000;
+      INADDR_NONE      = $FFFFFFFF;
+      INADDR_LOOPBACK  = $7f000001;
+      INADDR_BROADCAST = $FFFFFFFF;
+     
+    function SDLNet_ResolveHost(address: PIPaddress; const host: PAnsiChar; port: UInt16): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_ResolveHost' {$ENDIF} {$ENDIF};
+     
+      {* Resolve an ip address to a host name in canonical form.
+         If the ip couldn't be resolved, this function returns NULL,
+         otherwise a pointer to a static buffer containing the hostname
+         is returned.  Note that this function is not thread-safe.
+      *}
+    function SDLNet_ResolveIP(const ip: PIPaddress): PAnsiChar cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_ResolveIP' {$ENDIF} {$ENDIF};
+     
+      {* Get the addresses of network interfaces on this system.
+         This returns the number of addresses saved in 'addresses'
+       *}
+    function SDLNet_GetLocalAddresses(addresses: PIPaddress; maxcount: Integer): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_GetLocalAddresses' {$ENDIF} {$ENDIF};
+     
+    {***********************************************************************}
+    {* TCP network API                                                     *}
+    {***********************************************************************}
+    type
+      _TCPSocket = record
+      end;
+      TTCPSocket = ^_TCPSocket;
+     
+      {* Open a TCP network socket
+         If ip.host is INADDR_NONE or INADDR_ANY, this creates a local server
+         socket on the given port, otherwise a TCP connection to the remote
+         host and port is attempted. The address passed in should already be
+         swapped to network byte order (addresses returned from
+         SDLNet_ResolveHost() are already in the correct form).
+         The newly created socket is returned, or NULL if there was an error.
+      *}
+    function SDLNet_TCP_Open(ip: PIPaddress): TTCPSocket cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_TCP_Open' {$ENDIF} {$ENDIF};
+     
+      {* Accept an incoming connection on the given server socket.
+         The newly created socket is returned, or NULL if there was an error.
+      *}
+    function SDLNet_TCP_Accept(server: TTCPSocket): TTCPSocket cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_TCP_Accept' {$ENDIF} {$ENDIF};
+     
+      {* Get the IP address of the remote system associated with the socket.
+         If the socket is a server socket, this function returns NULL.
+      *}
+    function SDLNet_TCP_GetPeerAddress(sock: TTCPSocket): PIPaddress cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_TCP_GetPeerAddress' {$ENDIF} {$ENDIF};
+     
+      {* Send 'len' bytes of 'data' over the non-server socket 'sock'
+         This function returns the actual amount of data sent.  If the return value
+         is less than the amount of data sent, then either the remote connection was
+         closed, or an unknown socket error occurred.
+      *}
+    function SDLNet_TCP_Send(sock: TTCPSocket; const data: Pointer; len: Integer): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_TCP_Send' {$ENDIF} {$ENDIF};
+     
+      {* Receive up to 'maxlen' bytes of data over the non-server socket 'sock',
+         and store them in the buffer pointed to by 'data'.
+         This function returns the actual amount of data received.  If the return
+         value is less than or equal to zero, then either the remote connection was
+         closed, or an unknown socket error occurred.
+      *}
+    function SDLNet_TCP_Recv(sock: TTCPSocket; data: Pointer; maxlen: Integer): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_TCP_Recv' {$ENDIF} {$ENDIF};
+     
+      {* Close a TCP network socket *}
+    procedure SDLNet_TCP_Close(sock: TTCPSocket) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_TCP_Close' {$ENDIF} {$ENDIF};
+     
+    {***********************************************************************}
+    {* UDP network API                                                     *}
+    {***********************************************************************}
+     
+    const
+      {* The maximum channels on a a UDP socket *}
+       SDLNET_MAX_UDPCHANNELS = 32;
+      {* The maximum addresses bound to a single UDP socket channel *}
+      SDLNET_MAX_UDPADDRESSES = 4;
+     
+    type
+      TUDPSocket = record
+      end;
+      PUDPSocket = ^TUDPSocket;
+     
+      TUDPPacket = record
+        channel: Integer;     {* The src/dst channel of the packet *}
+        data: PUInt8;         {* The packet data *}
+        len: Integer;         {* The length of the packet data *}
+        maxlen: Integer;      {* The size of the data buffer *}
+        status: Integer;      {* packet status after sending *}
+        address: TIPaddress;  {* The source/dest address of an incoming/outgoing packet *}
+      end;
+      PUDPPacket = ^TUDPPacket;
+      PPUDPPacket = ^PUDPPacket;
+     
+      {* Allocate/resize/free a single UDP packet 'size' bytes long.
+         The new packet is returned, or NULL if the function ran out of memory.
+       *}
+    function SDLNet_AllocPacket(size: Integer): PUDPPacket cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_AllocPacket' {$ENDIF} {$ENDIF};
+    function SDLNet_ResizePacket(packet: PUDPPacket; newsize: Integer): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_ResizePacket' {$ENDIF} {$ENDIF};
+    procedure SDLNet_FreePacket(packet: PUDPPacket) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_FreePacket' {$ENDIF} {$ENDIF};
+     
+      {* Allocate/Free a UDP packet vector (array of packets) of 'howmany' packets,
+         each 'size' bytes long.
+         A pointer to the first packet in the array is returned, or NULL if the
+         function ran out of memory.
+       *}
+    function SDLNet_AllocPacketV(howmany: Integer; size: Integer): PPUDPPacket cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_AllocPacketV' {$ENDIF} {$ENDIF};
+    procedure SDLNet_FreePacketV(packetV: PPUDPPacket) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_FreePacketV' {$ENDIF} {$ENDIF};
+     
+      {* Open a UDP network socket
+         If 'port' is non-zero, the UDP socket is bound to a local port.
+         The 'port' should be given in native byte order, but is used
+         internally in network (big endian) byte order, in addresses, etc.
+         This allows other systems to send to this socket via a known port.
+      *}
+    function SDLNet_UDP_Open(port: UInt16): TUDPSocket cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_Open' {$ENDIF} {$ENDIF};
+     
+      {* Set the percentage of simulated packet loss for packets sent on the socket. *}
+    procedure SDLNet_UDP_SetPacketLoss(sock: TUDPSocket; percent: Integer) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_SetPacketLoss' {$ENDIF} {$ENDIF};
+     
+      {* Bind the address 'address' to the requested channel on the UDP socket.
+         If the channel is -1, then the first unbound channel that has not yet
+         been bound to the maximum number of addresses will be bound with
+         the given address as it's primary address.
+         If the channel is already bound, this new address will be added to the
+         list of valid source addresses for packets arriving on the channel.
+         If the channel is not already bound, then the address becomes the primary
+         address, to which all outbound packets on the channel are sent.
+         This function returns the channel which was bound, or -1 on error.
+      *}
+    function SDLNet_UDP_Bind(sock: TUDPSocket; channel: Integer; const address: PIPaddress): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_Bind' {$ENDIF} {$ENDIF};
+     
+      {* Unbind all addresses from the given channel *}
+    procedure SDLNet_UDP_Unbind(sock: TUDPSocket; channel: Integer) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_Unbind' {$ENDIF} {$ENDIF};
+     
+      {* Get the primary IP address of the remote system associated with the
+         socket and channel.  If the channel is -1, then the primary IP port
+         of the UDP socket is returned -- this is only meaningful for sockets
+         opened with a specific port.
+         If the channel is not bound and not -1, this function returns NULL.
+       *}
+    function SDLNet_UDP_GetPeerAddress(sock: TUDPSocket; channel: Integer): PIPaddress cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_GetPeerAddress' {$ENDIF} {$ENDIF};
+     
+      {* Send a vector of packets to the the channels specified within the packet.
+         If the channel specified in the packet is -1, the packet will be sent to
+         the address in the 'src' member of the packet.
+         Each packet will be updated with the status of the packet after it has
+         been sent, -1 if the packet send failed.
+         This function returns the number of packets sent.
+      *}
+    function SDLNet_UDP_SendV(sock: TUDPSocket; packets: PPUDPPacket; npackets: Integer): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_SendV' {$ENDIF} {$ENDIF};
+     
+      {* Send a single packet to the specified channel.
+         If the channel specified in the packet is -1, the packet will be sent to
+         the address in the 'src' member of the packet.
+         The packet will be updated with the status of the packet after it has
+         been sent.
+         This function returns 1 if the packet was sent, or 0 on error.
+     
+         NOTE:
+         The maximum size of the packet is limited by the MTU (Maximum Transfer Unit)
+         of the transport medium.  It can be as low as 250 bytes for some PPP links,
+         and as high as 1500 bytes for ethernet.
+      *}
+    function SDLNet_UDP_Send(sock: TUDPSocket; channel: Integer; packet: PUDPPacket): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_Send' {$ENDIF} {$ENDIF};
+     
+      {* Receive a vector of pending packets from the UDP socket.
+         The returned packets contain the source address and the channel they arrived
+         on.  If they did not arrive on a bound channel, the the channel will be set
+         to -1.
+         The channels are checked in highest to lowest order, so if an address is
+         bound to multiple channels, the highest channel with the source address
+         bound will be returned.
+         This function returns the number of packets read from the network, or -1
+         on error.  This function does not block, so can return 0 packets pending.
+      *}
+    function SDLNet_UDP_RecvV(sock: TUDPSocket; packets: PPUDPPacket): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_RecvV' {$ENDIF} {$ENDIF};
+     
+      {* Receive a single packet from the UDP socket.
+         The returned packet contains the source address and the channel it arrived
+         on.  If it did not arrive on a bound channel, the the channel will be set
+         to -1.
+         The channels are checked in highest to lowest order, so if an address is
+         bound to multiple channels, the highest channel with the source address
+         bound will be returned.
+         This function returns the number of packets read from the network, or -1
+         on error.  This function does not block, so can return 0 packets pending.
+      *}
+    function SDLNet_UDP_Recv(sock: TUDPSocket; packet: PUDPPacket): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_Recv' {$ENDIF} {$ENDIF};
+     
+      {* Close a UDP network socket *}
+    procedure SDLNet_UDP_Close(sock: TUDPSocket) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_UDP_Close' {$ENDIF} {$ENDIF};
+     
+    {***********************************************************************}
+    {* Hooks for checking sockets for available data                       *}
+    {***********************************************************************}
+     
+    type
+      TSDLNet_SocketSet = record
+      end;
+      PSDLNet_SocketSet = ^TSDLNet_SocketSet;
+     
+      {* Any network socket can be safely cast to this socket type *}
+      TSDLNet_GenericSocket = record
+        ready: Integer;
+      end;
+      PSDLNet_GenericSocket = ^TSDLNet_GenericSocket;
+     
+      {* Allocate a socket set for use with SDLNet_CheckSockets()
+         This returns a socket set for up to 'maxsockets' sockets, or NULL if
+         the function ran out of memory.
+       *}
+    function SDLNet_AllocSocketSet(maxsockets: Integer): TSDLNet_GenericSocket cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_AllocSocketSet' {$ENDIF} {$ENDIF};
+     
+      {* Add a socket to a set of sockets to be checked for available data *}
+    function SDLNet_AddSocket(set_: TSDLNet_SocketSet; sock: TSDLNet_GenericSocket): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_AddSocket' {$ENDIF} {$ENDIF};
+    //function SDLNet_TCP_AddSocket(set_: TSDLNet_SocketSet; sock: TTCPSocket): Integer; inline;
+    //function SDLNet_UDP_AddSocket(set_: TSDLNet_SocketSet; sock: TUDPSocket): Integer; inline;
+     
+      {* Remove a socket from a set of sockets to be checked for available data *}
+    function SDLNet_DelSocket(set_: TSDLNet_SocketSet; sock: TSDLNet_GenericSocket): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_DelSocket' {$ENDIF} {$ENDIF};
+    //function SDLNet_TCP_DelSocket(set_: TSDLNet_SocketSet; sock: TTCPSocket): Integer; inline;
+    //function SDLNet_UDP_DelSocket(set_: TSDLNet_SocketSet; sock: TUDPSocket): Integer; inline;
+     
+      {* This function checks to see if data is available for reading on the
+         given set of sockets.  If 'timeout' is 0, it performs a quick poll,
+         otherwise the function returns when either data is available for
+         reading, or the timeout in milliseconds has elapsed, which ever occurs
+         first.  This function returns the number of sockets ready for reading,
+         or -1 if there was an error with the select() system call.
+      *}
+    function SDLNet_CheckSockets(set_: TSDLNet_SocketSet; timeout: UInt32): Integer cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_CheckSockets' {$ENDIF} {$ENDIF};
+     
+      {* After calling SDLNet_CheckSockets(), you can use this function on a
+         socket that was in the socket set, to find out if data is available
+         for reading.
+       *}
+    function SDLNet_SocketReady(sock: TSDLNet_GenericSocket): Integer; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF};
+     
+      {* Free a set of sockets allocated by SDL_NetAllocSocketSet() *}
+    procedure SDLNet_FreeSocketSet(set_: TSDLNet_SocketSet) cdecl; external SDLNet_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDLNet_FreeSocketSet' {$ENDIF} {$ENDIF};
+     
+    {***********************************************************************}
+    {* Error reporting functions                                           *}
+    {***********************************************************************}
+     
+    procedure SDLNet_SetError(const fmt: PAnsiChar); cdecl;
+    function SDLNet_GetError(): PAnsiChar; cdecl;
+     
+    {***********************************************************************}
+    {* Inline functions to read/write network data                         *}
+    {***********************************************************************}
+     
+    {* Write a 16/32-bit value to network packet buffer *}
+     
+    //procedure SDLNet_Write16(value: UInt16; areap: Pointer); inline;
+    //procedure SDLNet_Write32(value: UInt32; areap: Pointer); inline;
+     
+    {* Read a 16/32-bit value from network packet buffer *}
+    //function SDLNet_Read16(const areap: Pointer): UInt16; inline;
+    //function SDLNet_Read32(const areap: Pointer): UInt32; inline;
+     
+    implementation
+     
+    procedure SDL_NET_VERSION(Out X: TSDL_Version);
+    begin
+      X.major := SDL_NET_MAJOR_VERSION;
+      X.minor := SDL_NET_MINOR_VERSION;
+      X.patch := SDL_NET_PATCHLEVEL;
+    end;
+     
+    (*
+    function SDLNet_TCP_AddSocket(set_: TSDLNet_SocketSet; sock: TTCPSocket): Integer;
+    begin
+      Result := SDLNet_AddSocket(set_, TSDLNet_GenericSocket(sock));
+    end;
+     
+    function SDLNet_UDP_AddSocket(set_: TSDLNet_SocketSet; sock: TUDPSocket): Integer;
+    begin
+      Result := SDLNet_AddSocket(set_, TSDLNet_GenericSocket(sock));
+    end;
+     
+    function SDLNet_TCP_DelSocket(set_: TSDLNet_SocketSet; sock: TTCPSocket): Integer;
+    begin
+      Result := SDLNet_DelSocket(set_, TSDLNet_GenericSocket(sock));
+    end;
+     
+    function SDLNet_UDP_DelSocket(set_: TSDLNet_SocketSet; sock: TUDPSocket): Integer;
+    begin
+      Result := SDLNet_DelSocket(set_, TSDLNet_GenericSocket(sock));
+    end;
+    *)
+     
+    function SDLNet_SocketReady(sock: TSDLNet_GenericSocket): Integer;
+    begin
+      Result := sock.ready;
+    end;
+     
+    procedure SDLNet_SetError(const fmt: PAnsiChar); cdecl;
+    begin
+      SDL_SetError(fmt);
+    end;
+     
+    function SDLNet_GetError(): PAnsiChar; cdecl;
+    begin
+      Result := SDL_GetError();
+    end;
+     
+    (*
+    procedure SDLNet_Write16(value: UInt16; areap: Pointer);
+    begin
+      PUInt16(areap) := SDL_SwapBE16(value);
+    end;
+     
+    procedure SDLNet_Write32(value: UInt32; areap: Pointer);
+    begin
+      PUInt32(areap) := SDL_SwapBE32(value);
+    end;
+     
+    {* Read a 16/32-bit value from network packet buffer *}
+    function SDLNet_Read16(const areap: Pointer): UInt16;
+    begin
+      Result := SDL_SwapBE16(PUInt16(areap));
+    end;
+     
+    function SDLNet_Read32(const areap: Pointer): UInt32;
+    begin
+      Result := SDL_SwapBE32(PUInt32(areap));
+    end;
+    *)
+    end.
+
diff --git a/src/lib/sdl2/SDL2_ttf.pas b/src/lib/sdl2/SDL2_ttf.pas
new file mode 100644 (file)
index 0000000..420c6a9
--- /dev/null
@@ -0,0 +1,306 @@
+unit sdl2_ttf;
+
+{*
+  SDL_ttf:  A companion library to SDL for working with TrueType (tm) fonts
+  Copyright (C) 2001-2013 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgement in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*}
+
+{* This library is a wrapper around the excellent FreeType 2.0 library,
+   available at:
+    http://www.freetype.org/
+*}
+
+{* ChangeLog: (Header Translation)
+   ----------
+
+   v.1.72-stable; 29.09.2013: fixed bug with procedures without parameters
+                              (they must have brackets)
+   v.1.70-stable; 11.09.2013: Initial Commit
+
+*}
+
+interface
+
+{$I jedi.inc}
+
+uses
+  SDL2;
+
+const
+  {$IFDEF WINDOWS}
+    TTF_LibName = 'SDL2_ttf.dll';
+  {$ENDIF}
+
+  {$IFDEF UNIX}
+    {$IFDEF DARWIN}
+      TTF_LibName = 'libSDL2_tff.dylib';
+    {$ELSE}
+      {$IFDEF FPC}
+        TTF_LibName = 'libSDL2_ttf.so';
+      {$ELSE}
+        TTF_LibName = 'libSDL2_ttf.so.0';
+      {$ENDIF}
+    {$ENDIF}
+  {$ENDIF}
+
+  {$IFDEF MACOS}
+    TTF_LibName = 'SDL2_ttf';
+    {$IFDEF FPC}
+      {$linklib libSDL2_ttf}
+    {$ENDIF}
+  {$ENDIF}
+
+{* Set up for C function definitions, even when using C++ *}
+
+{* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL *}
+const
+  SDL_TTF_MAJOR_VERSION = 2;
+  SDL_TTF_MINOR_VERSION = 0;
+  SDL_TTF_PATCHLEVEL    = 12;
+
+Procedure SDL_TTF_VERSION(Out X:TSDL_Version);
+
+{* Backwards compatibility *}
+const
+  TTF_MAJOR_VERSION = SDL_TTF_MAJOR_VERSION;
+  TTF_MINOR_VERSION = SDL_TTF_MINOR_VERSION;
+  TTF_PATCHLEVEL    = SDL_TTF_PATCHLEVEL;
+  //TTF_VERSION(X)    = SDL_TTF_VERSION(X);
+
+ {* This function gets the version of the dynamically linked SDL_ttf library.
+   it should NOT be used to fill a version structure, instead you should
+   use the SDL_TTF_VERSION() macro.
+ *}
+function TTF_Linked_Version: TSDL_Version cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_Linked_Version' {$ENDIF} {$ENDIF};
+
+{* ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) *}
+const
+  UNICODE_BOM_NATIVE  = $FEFF;
+  UNICODE_BOM_SWAPPED = $FFFE;
+
+{* This function tells the library whether UNICODE text is generally
+   byteswapped.  A UNICODE BOM character in a string will override
+   this setting for the remainder of that string.
+*}
+procedure TTF_ByteSwappedUNICODE(swapped: Integer) cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_ByteSwappedUNICODE' {$ENDIF} {$ENDIF};
+
+{* The internal structure containing font information *}
+type
+  PTTF_Font = ^TTTF_Font;
+  TTTF_Font = record  end; //todo?
+
+{* Initialize the TTF engine - returns 0 if successful, -1 on error *}
+function TTF_Init(): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_Init' {$ENDIF} {$ENDIF};
+
+{* Open a font file and create a font of the specified point size.
+ * Some .fon fonts will have several sizes embedded in the file, so the
+ * point size becomes the index of choosing which size.  If the value
+ * is too high, the last indexed size will be the default. *}
+function TTF_OpenFont(_file: PAnsiChar; ptsize: Integer): PTTF_Font cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_OpenFont' {$ENDIF} {$ENDIF};
+function TTF_OpenFontIndex(_file: PAnsiChar; ptsize: Integer; index: LongInt): PTTF_Font cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_OpenFontIndex' {$ENDIF} {$ENDIF};
+function TTF_OpenFontRW(src: PSDL_RWops; freesrc: Integer; ptsize: LongInt): PTTF_Font cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_OpenFontRW' {$ENDIF} {$ENDIF};
+function TTF_OpenFontIndexRW(src: PSDL_RWops; freesrc: Integer; ptsize: Integer; index: LongInt): PTTF_Font cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_OpenFontIndexRW' {$ENDIF} {$ENDIF};
+
+{* Set and retrieve the font style *}
+const
+  TTF_STYLE_NORMAL        = $00;
+  TTF_STYLE_BOLD          = $01;
+  TTF_STYLE_ITALIC        = $02;
+  TTF_STYLE_UNDERLINE     = $04;
+  TTF_STYLE_STRIKETHROUGH = $08;
+
+function TTF_GetFontStyle(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GetFontStyle' {$ENDIF} {$ENDIF};
+procedure TTF_SetFontStyle(font: PTTF_Font; style: Integer) cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SetFontStyle' {$ENDIF} {$ENDIF};
+function TTF_GetFontOutline(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GetFontOutline' {$ENDIF} {$ENDIF};
+procedure TTF_SetFontOutline(font: PTTF_Font; outline: Integer) cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SetFontOutline' {$ENDIF} {$ENDIF};
+
+{* Set and retrieve FreeType hinter settings *}
+const
+  TTF_HINTING_NORMAL  = 0;
+  TTF_HINTING_LIGHT   = 1;
+  TTF_HINTING_MONO    = 2;
+  TTF_HINTING_NONE    = 3;
+
+function TTF_GetFontHinting(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GetFontHinting' {$ENDIF} {$ENDIF};
+procedure TTF_SetFontHinting(font: PTTF_Font; hinting: Integer) cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SetFontHinting' {$ENDIF} {$ENDIF};
+
+{* Get the total height of the font - usually equal to point size *}
+function TTF_FontHeight(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontHeight' {$ENDIF} {$ENDIF};
+
+{* Get the offset from the baseline to the top of the font
+   This is a positive value, relative to the baseline.
+ *}
+function TTF_FontAscent(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontAscent' {$ENDIF} {$ENDIF};
+
+{* Get the offset from the baseline to the bottom of the font
+   This is a negative value, relative to the baseline.
+ *}
+function TTF_FontDescent(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontDescent' {$ENDIF} {$ENDIF};
+
+{* Get the recommended spacing between lines of text for this font *}
+function TTF_FontLineSkip(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontLineSkip' {$ENDIF} {$ENDIF};
+
+{* Get/Set whether or not kerning is allowed for this font *}
+function TTF_GetFontKerning(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GetFontKerning' {$ENDIF} {$ENDIF};
+procedure TTF_SetFontKerning(font: PTTF_Font; allowed: Integer) cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SetFontKerning' {$ENDIF} {$ENDIF};
+
+{* Get the number of faces of the font *}
+function TTF_FontFaces(font: PTTF_Font): LongInt cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontFaces' {$ENDIF} {$ENDIF};
+
+{* Get the font face attributes, if any *}
+function TTF_FontFaceIsFixedWidth(font: PTTF_Font): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontFaceIsFixedWidth' {$ENDIF} {$ENDIF};
+function TTF_FontFaceFamilyName(font: PTTF_Font): PAnsiChar cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontFaceFamilyName' {$ENDIF} {$ENDIF};
+function TTF_FontFaceStyleName(font: PTTF_Font): PAnsiChar cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_FontFaceStyleName' {$ENDIF} {$ENDIF};
+
+{* Check wether a glyph is provided by the font or not *}
+function TTF_GlyphIsProvided(font: PTTF_Font; ch: UInt16): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GlyphIsProvided' {$ENDIF} {$ENDIF};
+
+{* Get the metrics (dimensions) of a glyph
+   To understand what these metrics mean, here is a useful link:
+    http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html
+ *}
+function TTF_GlyphMetrics(font: PTTF_Font; ch: UInt16;
+                          minx, maxx: PInt;
+                          miny, maxy: PInt; advance: PInt): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GlyphMetrics' {$ENDIF} {$ENDIF};
+
+{* Get the dimensions of a rendered string of text *}
+function TTF_SizeText(font: PTTF_Font; text: PAnsiChar; w, h: PInt): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SizeText' {$ENDIF} {$ENDIF};
+function TTF_SizeUTF8(font: PTTF_Font; text: PAnsiChar; w, h: PInt): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SizeUTF8' {$ENDIF} {$ENDIF};
+function TTF_SizeUNICODE(font: PTTF_Font; text: PUInt16; w, h: PInt): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_SizeUNICODE' {$ENDIF} {$ENDIF};
+
+{* Create an 8-bit palettized surface and render the given text at
+   fast quality with the given font and color.  The 0 pixel is the
+   colorkey, giving a transparent background, and the 1 pixel is set
+   to the text color.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderText_Solid(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderText_Solid' {$ENDIF} {$ENDIF};
+function TTF_RenderUTF8_Solid(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUTF8_Solid' {$ENDIF} {$ENDIF};
+function TTF_RenderUNICODE_Solid(font: PTTF_Font; text: PUInt16; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUNICODE_Solid' {$ENDIF} {$ENDIF};
+
+{* Create an 8-bit palettized surface and render the given glyph at
+   fast quality with the given font and color.  The 0 pixel is the
+   colorkey, giving a transparent background, and the 1 pixel is set
+   to the text color.  The glyph is rendered without any padding or
+   centering in the X direction, and aligned normally in the Y direction.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderGlyph_Solid(font: PTTF_Font; ch: UInt16; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderGlyph_Solid' {$ENDIF} {$ENDIF};
+
+{* Create an 8-bit palettized surface and render the given text at
+   high quality with the given font and colors.  The 0 pixel is background,
+   while other pixels have varying degrees of the foreground color.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderText_Shaded(font: PTTF_Font; text: PAnsiChar; fg, bg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderText_Shaded' {$ENDIF} {$ENDIF};
+function TTF_RenderUTF8_Shaded(font: PTTF_Font; text: PAnsiChar; fg, bg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUTF8_Shaded' {$ENDIF} {$ENDIF};
+function TTF_RenderUNICODE_Shaded(font: PTTF_Font; text: PUInt16; fg, bg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUNICODE_Shaded' {$ENDIF} {$ENDIF};
+
+{* Create an 8-bit palettized surface and render the given glyph at
+   high quality with the given font and colors.  The 0 pixel is background,
+   while other pixels have varying degrees of the foreground color.
+   The glyph is rendered without any padding or centering in the X
+   direction, and aligned normally in the Y direction.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderGlyph_Shaded(font: PTTF_Font; ch: UInt16; fg, bg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderGlyph_Shaded' {$ENDIF} {$ENDIF};
+
+{* Create a 32-bit ARGB surface and render the given text at high quality,
+   using alpha blending to dither the font with the given color.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderText_Blended(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderText_Blended' {$ENDIF} {$ENDIF};
+function TTF_RenderUTF8_Blended(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUTF8_Blended' {$ENDIF} {$ENDIF};
+function TTF_RenderUNICODE_Blended(font: PTTF_Font; text: UInt16; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUNICODE_Blended' {$ENDIF} {$ENDIF};
+
+{* Create a 32-bit ARGB surface and render the given text at high quality,
+   using alpha blending to dither the font with the given color.
+   Text is wrapped to multiple lines on line endings and on word boundaries
+   if it extends beyond wrapLength in pixels.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderText_Blended_Wrapped(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color; wrapLength: UInt32): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderText_Blended_Wrapped' {$ENDIF} {$ENDIF};
+function TTF_RenderUTF8_Blended_Wrapped(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color; wrapLength: UInt32): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUTF8_Blended_Wrapped' {$ENDIF} {$ENDIF};
+function TTF_RenderUNICODE_Blended_Wrapped(font: PTTF_Font; text: PUInt16; fg: TSDL_Color; wrapLength: UInt32): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUNICODE_Blended_Wrapped' {$ENDIF} {$ENDIF};
+
+{* Create a 32-bit ARGB surface and render the given glyph at high quality,
+   using alpha blending to dither the font with the given color.
+   The glyph is rendered without any padding or centering in the X
+   direction, and aligned normally in the Y direction.
+   This function returns the new surface, or NULL if there was an error.
+*}
+function TTF_RenderGlyph_Blended(font: PTTF_Font; ch: UInt16; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderGlyph_Blended' {$ENDIF} {$ENDIF};
+
+{* For compatibility with previous versions, here are the old functions *}
+function TTF_RenderText(font: PTTF_Font; text: PAnsiChar; fg, bg: TSDL_Color): PSDL_Surface;
+function TTF_RenderUTF8(font: PTTF_Font; text: PAnsiChar; fg, bg: TSDL_Color): PSDL_Surface;
+function TTF_RenderUNICODE(font: PTTF_Font; text: PUInt16; fg, bg: TSDL_Color): PSDL_Surface;
+
+{* Close an opened font file *}
+procedure TTF_CloseFont(font: PTTF_Font) cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_CloseFont' {$ENDIF} {$ENDIF};
+
+{* De-initialize the TTF engine *}
+procedure TTF_Quit() cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_Quit' {$ENDIF} {$ENDIF};
+
+{* Check if the TTF engine is initialized *}
+function TTF_WasInit: Boolean cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_WasInit' {$ENDIF} {$ENDIF};
+
+{* Get the kerning size of two glyphs *}
+function TTF_GetFontKerningSize(font: PTTF_Font; prev_index, index: Integer): Integer cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_GetFontKerningSize' {$ENDIF} {$ENDIF};
+
+{* We'll use SDL for reporting errors *}
+function TTF_SetError(const fmt: PAnsiChar): SInt32; cdecl;
+function TTF_GetError: PAnsiChar; cdecl;
+
+implementation
+
+Procedure SDL_TTF_VERSION(Out X:TSDL_Version);
+begin
+  x.major := SDL_TTF_MAJOR_VERSION;
+  x.minor := SDL_TTF_MINOR_VERSION;
+  x.patch := SDL_TTF_PATCHLEVEL;
+end;
+
+function TTF_SetError(const fmt: PAnsiChar): SInt32; cdecl;
+begin
+  Result := SDL_SetError(fmt);
+end;
+
+function TTF_GetError: PAnsiChar; cdecl;
+begin
+  Result := SDL_GetError();
+end;
+
+function TTF_RenderText(font: PTTF_Font; text: PAnsiChar; fg, bg: TSDL_Color): PSDL_Surface;
+begin
+  Result := TTF_RenderText_Shaded(font, text, fg, bg);
+end;
+
+function TTF_RenderUTF8(font: PTTF_Font; text: PAnsiChar; fg, bg: TSDL_Color): PSDL_Surface;
+begin
+  Result := TTF_RenderUTF8_Shaded(font, text, fg, bg);
+end;
+
+function TTF_RenderUNICODE(font: PTTF_Font; text: PUInt16; fg, bg: TSDL_Color): PSDL_Surface;
+begin
+  Result := TTF_RenderUNICODE_Shaded(font, text, fg, bg);
+end;
+
+end.
+
diff --git a/src/lib/sdl2/jedi.inc b/src/lib/sdl2/jedi.inc
new file mode 100644 (file)
index 0000000..fcbb84a
--- /dev/null
@@ -0,0 +1,501 @@
+{
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  Pascal-Header-Conversion
+  Copyright (c) 2012/13 Tim Blume aka End
+
+  sdl.inc is based on the files:
+    "begin_code.h",
+    "close_code.h",
+         "sdl_config.h",
+         "sdl_config_windows.h",
+       ...
+  it defines some variables for several Pascal-Compilers and OS-versions.
+
+  It is based on mine updated version of jedi-sdl.inc from the SDL 1.2 Headers,
+  they can be found at delphigl.com or on my github-repository:
+
+  https://github.com/ev1313/
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+}
+
+{
+  Changelog:
+  ----------
+  v. 1.63-stable; 16.09.13: since GPC isn't supported anymore, i've deleted it from here, too.
+  v. 1.22-alpha; 24.07.13: fixed some bugs. special thanks to kotai from pascalgamedevelopment.com
+  v. 1.00-alpha; 05.07.13: Initial Alpha-Release
+}
+
+{.$define Debug}           { uncomment for debugging }
+
+{$IFNDEF FPC}
+  {$IFDEF Debug}
+    {$F+,D+,Q-,L+,R+,I-,S+,Y+,A+}
+  {$ELSE}
+    {$F+,Q-,R-,S-,I-,A+}
+  {$ENDIF}
+{$ELSE}
+  {$MODE DELPHI}
+{$ENDIF}
+
+{$IFDEF LINUX}
+{$DEFINE UNIX}
+{$ENDIF}
+
+{$IFDEF ver70}
+   {$IFDEF Windows}
+     {$DEFINE Win16}
+   {$ENDIF Windows}
+   {$IFDEF MSDOS}
+     {$DEFINE NO_EXPORTS}
+   {$ENDIF MSDOS}
+   {$IFDEF DPMI}
+     {$DEFINE BP_DPMI}
+   {$ENDIF}
+   {$DEFINE OS_16_BIT}
+   {$DEFINE __OS_DOS__}
+{$ENDIF ver70}
+
+{$IFDEF ver80}
+   {$DEFINE Delphi}      {Delphi 1.x}
+   {$DEFINE Delphi16}
+   {$DEFINE Win16}
+   {$DEFINE OS_16_BIT}
+   {$DEFINE __OS_DOS__}
+{$ENDIF ver80}
+
+{$IFDEF ver90}
+   {$DEFINE Delphi}      {Delphi 2.x}
+   {$DEFINE WIN32}
+   {$DEFINE WINDOWS}
+{$ENDIF ver90}
+
+{$IFDEF ver100}
+   {$DEFINE Delphi}      {Delphi 3.x}
+   {$DEFINE WIN32}
+   {$DEFINE WINDOWS}
+{$ENDIF ver100}
+
+{$IFDEF ver93}
+   {$DEFINE Delphi}      {C++ Builder 1.x}
+   {$DEFINE WINDOWS}
+{$ENDIF ver93}
+
+{$IFDEF ver110}
+   {$DEFINE Delphi}      {C++ Builder 3.x}
+   {$DEFINE WINDOWS}
+{$ENDIF ver110}
+
+{$IFDEF ver120}
+   {$DEFINE Delphi}      {Delphi 4.x}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Has_Int64}
+   {$DEFINE WINDOWS}
+{$ENDIF ver120}
+
+{$IFDEF ver130}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 5.x}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Has_Int64}
+   {$DEFINE WINDOWS}
+{$ENDIF ver130}
+
+{$IFDEF ver140}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 6.x}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Has_Int64}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver140}
+
+{$IFDEF ver150}
+   {$DEFINE Delphi}      {Delphi 7.x}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver150}
+
+{$IFDEF ver160}
+   {$DEFINE Delphi}      {Delphi 8.x}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver160}
+
+{$IFDEF ver170}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 2005}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver170}
+
+{$IFDEF ver180}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 2006 / 2007}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver180}
+
+{$IFDEF ver185}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 2007}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver185}
+
+{$IFDEF ver190}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 2007 }
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver190}
+
+{$IFDEF ver200}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 2009 }
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver200}
+
+{$IFDEF ver210}
+   {$DEFINE Delphi}      {Delphi / C++ Builder 2010}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver210}
+
+{$IFDEF ver220}
+   {$DEFINE Delphi}      {Delphi / C++ Builder XE}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$DEFINE Delphi15UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver220}
+
+{$IFDEF ver230}
+   {$DEFINE Delphi}      {Delphi / C++ Builder XE2}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$DEFINE Delphi15UP}
+   {$DEFINE Delphi16UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver230}
+
+{$IFDEF ver240}
+   {$DEFINE Delphi}      {Delphi / C++ Builder XE4}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$DEFINE Delphi15UP}
+   {$DEFINE Delphi16UP}
+   {$DEFINE Delphi17UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver240}
+
+{$IFDEF ver250}
+   {$DEFINE Delphi}      {Delphi / C++ Builder XE5}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$DEFINE Delphi15UP}
+   {$DEFINE Delphi16UP}
+   {$DEFINE Delphi17UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver250}
+
+{$IFDEF ver260}
+   {$DEFINE Delphi}      {Delphi / C++ Builder XE6}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$DEFINE Delphi15UP}
+   {$DEFINE Delphi16UP}
+   {$DEFINE Delphi17UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver260}
+
+{$IFDEF ver270}
+   {$DEFINE Delphi}      {Delphi / C++ Builder XE7}
+   {$DEFINE Delphi4UP}
+   {$DEFINE Delphi5UP}
+   {$DEFINE Delphi6UP}
+   {$DEFINE Delphi7UP}
+   {$DEFINE Delphi8UP}
+   {$DEFINE Delphi9UP}
+   {$DEFINE Delphi10UP}
+   {$DEFINE Delphi11UP}
+   {$DEFINE Delphi12UP}
+   {$DEFINE Delphi13UP}
+   {$DEFINE Delphi14UP}
+   {$DEFINE Delphi15UP}
+   {$DEFINE Delphi16UP}
+   {$DEFINE Delphi17UP}
+   {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types}
+   {$DEFINE Has_Int64}
+   {$DEFINE Has_UInt64}
+   {$DEFINE Has_Native}
+   {$DEFINE HAS_TYPES}
+{$ENDIF ver270}
+
+{*************** define 16/32/64 Bit ********************}
+
+{$IFDEF WIN16}
+  {$DEFINE 16BIT}
+  {$DEFINE WINDOWS}
+{$ELSE}
+  {$IFDEF WIN32}
+    {$DEFINE 32BIT}
+    {$DEFINE WINDOWS}
+  {$ELSE}
+    {$IFDEF WIN64}
+      {$DEFINE 64BIT}
+      {$DEFINE WINDOWS}
+    {$ELSE}
+      //TODO!!
+      {$DEFINE 32BIT}
+    {$ENDIF}
+  {$ENDIF}
+{$ENDIF}
+
+{$IFDEF Delphi}
+  {$DEFINE USE_STDCALL}
+  {$IFDEF 32Bit}
+    {$DEFINE DELPHI32}
+  {$ELSE}
+    {$IFDEF 64Bit}
+         {$DEFINE DELPHI64}
+       {$ELSE}
+         {$DEFINE DELPHI16}
+       {$ENDIF}
+  {$ENDIF}
+  //{$ALIGN ON}
+{$ENDIF Delphi}
+
+{$IFDEF FPC}
+  {$H+}
+  {$PACKRECORDS C}        // Added for record
+  {$MACRO ON}             // Added For OpenGL
+  {$DEFINE Delphi}
+  {$DEFINE UseAT}
+  {$UNDEF USE_STDCALL}
+  {$DEFINE OS_BigMem}
+  {$DEFINE NO_EXPORTS}
+  {$DEFINE Has_UInt64}
+  {$DEFINE Has_Int64}
+  {$DEFINE Has_Native}
+  {$DEFINE NOCRT}
+  {$IFDEF UNIX}
+     {$DEFINE fpc_unix}
+  {$ELSE}
+     {$DEFINE __OS_DOS__}
+  {$ENDIF}
+  {$IFDEF WIN32}
+   {$DEFINE UseWin}
+  {$ENDIF}
+  {$DEFINE HAS_TYPES}
+{$ENDIF FPC}
+
+{$IFDEF Win16}
+  {$K+}   {smart callbacks}
+{$ENDIF Win16}
+
+{$IFDEF Win32}
+  {$DEFINE OS_BigMem}
+{$ENDIF Win32}
+
+{ ************************** dos/dos-like platforms **************}
+{$IFDEF Windows}
+   {$DEFINE __OS_DOS__}
+   {$DEFINE UseWin}
+   {$DEFINE MSWINDOWS}
+{$ENDIF Delphi}
+
+{$IFDEF OS2}
+   {$DEFINE __OS_DOS__}
+   {$DEFINE Can_Use_DLL}
+{$ENDIF Delphi}
+
+{$IFDEF UseWin}
+   {$DEFINE Can_Use_DLL}
+{$ENDIF}
+
+{$IFDEF Win16}
+   {$DEFINE Can_Use_DLL}
+{$ENDIF}
+
+{$IFDEF BP_DPMI}
+   {$DEFINE Can_Use_DLL}
+{$ENDIF}
+
+{$IFDEF USE_STDCALL}
+  {$DEFINE BY_NAME}
+{$ENDIF}
+
+{*************** define LITTLE ENDIAN platforms ********************}
+
+
+{$IFDEF Delphi}
+  {$DEFINE IA32}
+{$ENDIF}
+
+{$IFDEF FPC}
+  {$IFDEF FPC_LITTLE_ENDIAN}
+    {$DEFINE IA32}
+  {$ENDIF}
+{$ENDIF}
diff --git a/src/lib/sdl2/sdl.inc b/src/lib/sdl2/sdl.inc
new file mode 100644 (file)
index 0000000..17b0b86
--- /dev/null
@@ -0,0 +1,62 @@
+//from "sdl.h"
+
+const
+
+  SDL_INIT_TIMER          = $00000001;
+  {$EXTERNALSYM SDL_INIT_TIMER}
+  SDL_INIT_AUDIO          = $00000010;
+  {$EXTERNALSYM SDL_INIT_AUDIO}
+  SDL_INIT_VIDEO          = $00000020;
+  {$EXTERNALSYM SDL_INIT_VIDEO}
+  SDL_INIT_JOYSTICK       = $00000200;
+  {$EXTERNALSYM SDL_INIT_JOYSTICK}
+  SDL_INIT_HAPTIC         = $00001000;
+  {$EXTERNALSYM SDL_INIT_HAPTIC}
+  SDL_INIT_GAMECONTROLLER = $00002000;  //turn on game controller also implicitly does JOYSTICK
+  {$EXTERNALSYM SDL_INIT_GAMECONTROLLER}
+  SDL_INIT_NOPARACHUTE    = $00100000;  //Don't catch fatal signals
+  {$EXTERNALSYM SDL_INIT_NOPARACHUTE}
+  SDL_INIT_EVERYTHING     = SDL_INIT_TIMER    or
+                                                       SDL_INIT_AUDIO    or
+                                                       SDL_INIT_VIDEO    or
+                                                       SDL_INIT_JOYSTICK or
+                                                       SDL_INIT_HAPTIC   or
+                                                       SDL_INIT_GAMECONTROLLER;
+  {$EXTERNALSYM SDL_INIT_EVERYTHING}
+
+{**
+ *  This function initializes  the subsystems specified by flags
+ *  Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup
+ *  signal handlers for some commonly ignored fatal signals (like SIGSEGV).
+ *}
+
+function SDL_Init(flags: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Init' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function initializes specific SDL subsystems
+ *}
+
+function SDL_InitSubSystem(flags: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_InitSubSystem' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function cleans up specific SDL subsystems
+ *}
+procedure SDL_QuitSubSystem(flags: UInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_QuitSubSystem' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns a mask of the specified subsystems which have
+ *  previously been initialized.
+ *  
+ *  If flags is 0, it returns a mask of all initialized subsystems.
+ *}
+function SDL_WasInit(flags: UInt32): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WasInit' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function cleans up all initialized subsystems. You should
+ *  call it upon all exit conditions.
+ *}
+procedure SDL_Quit() cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Quit' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdl2.pas b/src/lib/sdl2/sdl2.pas
new file mode 100644 (file)
index 0000000..92f71d9
--- /dev/null
@@ -0,0 +1,427 @@
+unit SDL2;
+
+{
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  Pascal-Header-Conversion
+  Copyright (C) 2012-2014 Tim Blume aka End/EV1313
+
+  SDL.pas is based on the files:
+  "sdl.h",
+  "sdl_audio.h",
+  "sdl_blendmode.h",
+  "sdl_clipboard.h",
+  "sdl_cpuinfo.h",
+  "sdl_events.h",
+  "sdl_error.h",
+  "sdl_filesystem.h",
+  "sdl_gamecontroller.h",
+  "sdl_gesture.h",
+  "sdl_haptic.h",
+  "sdl_hints.h",
+  "sdl_joystick.h",
+  "sdl_keyboard.h",
+  "sdl_keycode.h",
+  "sdl_loadso.h",
+  "sdl_log.h",
+  "sdl_pixels.h",
+  "sdl_power.h",
+  "sdl_main.h",
+  "sdl_messagebox.h",
+  "sdl_mouse.h",
+  "sdl_mutex.h",
+  "sdl_rect.h",
+  "sdl_render.h",
+  "sdl_rwops.h",
+  "sdl_scancode.h",
+  "sdl_shape.h",
+  "sdl_stdinc.h",
+  "sdl_surface.h",
+  "sdl_system.h",
+  "sdl_syswm.h",
+  "sdl_thread.h",
+  "sdl_timer.h",
+  "sdl_touch.h",
+  "sdl_version.h",
+  "sdl_video.h",
+  "sdl_types.h"
+
+  I will not translate:
+  "sdl_opengl.h",
+  "sdl_opengles.h"
+  "sdl_opengles2.h"
+
+  cause there's a much better OpenGL-Header avaible at delphigl.com:
+
+  the dglopengl.pas
+
+  Parts of the SDL.pas are from the SDL-1.2-Headerconversion from the JEDI-Team,
+  written by Domenique Louis and others.
+
+  I've changed the names of the dll for 32 & 64-Bit, so theres no conflict
+  between 32 & 64 bit Libraries.
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no case will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Special Thanks to:
+
+   - DelphiGL.com - Community
+   - Domenique Louis and everyone else from the JEDI-Team
+   - Sam Latinga and everyone else from the SDL-Team
+}
+
+{
+  Changelog:
+  ----------
+               ? 31.01.2016: updated sdlevents.inc to SDL2 2.0.4, adressing issue #24 (thx to imantsg)
+               ? 16.01.2016: Delphi 6+ bugfixes/compatibility. Thx to Peter Karpov for identifiying and testing.
+  v.1.80-stable; 09.10.2014: added sdl_cpuinfo.h and sdl_clipboard.h
+  v.1.74-stable; 10.11.2013: added sdl_gamecontroller.h
+  v.1.73-stable; 08.11.2013: added sdl_hints.h and some keystate helpers
+                             thx to Cybermonkey!
+  v.1.72-stable; 23.09.2013: fixed bug with procedures without parameters
+                             (they must have brakets)
+  v.1.70-stable; 17.09.2013: added "sdl_messagebox.h" and "sdl_haptic.h"
+  v.1.63-stable; 16.09.2013: added libs sdl2_image and sdl2_ttf and added sdl_audio.h
+  v.1.62-stable; 03.09.2013: fixed.
+  v.1.61-stable; 02.09.2013: now it should REALLY work with Mac...
+  v.1.60-stable; 01.09.2013: now it should work with Delphi XE4 for Windows and
+                            MacOS and of course Lazarus. thx to kotai :D
+  v.1.55-Alpha; 24.08.2013: fixed bug with SDL_GetEventState thx to d.l.i.w.
+  v.1.54-Alpha; 24.08.2013: added sdl_loadso.h
+  v.1.53-Alpha; 24.08.2013: renamed *really* and fixed linux comp.
+  v.1.52-Alpha; 24.08.2013: renamed sdl.pas to sdl2.pas
+  v.1.51-Alpha; 24.08.2013: added sdl_platform.h
+  v.1.50-Alpha; 24.08.2013: the header is now modular. thx for the hint from d.l.i.w.
+  v.1.40-Alpha; 13.08.2013: Added MacOS compatibility (thx to stoney-fd)
+  v.1.34-Alpha; 05.08.2013: Added missing functions from sdl_thread.h
+  v.1.33-Alpha; 31.07.2013: Added missing units for Linux. thx to Cybermonkey
+  v.1.32-Alpha; 31.07.2013: Fixed three bugs, thx to grieferatwork
+  v.1.31-Alpha; 30.07.2013: Added "sdl_power.h"
+  v.1.30-Alpha; 26.07.2013: Added "sdl_thread.h" and "sdl_mutex.h"
+  v.1.25-Alpha; 29.07.2013: Added Makros for SDL_RWops
+  v.1.24-Alpha; 28.07.2013: Fixed bug with RWops and size_t
+  v.1.23-Alpha; 27.07.2013: Fixed two bugs, thx to GrieferAtWork
+  v.1.22-Alpha; 24.07.2013: Added "sdl_shape.h" and TSDL_Window
+                            (and ordered the translated header list ^^)
+  v.1.21-Alpha; 23.07.2013: Added TSDL_Error
+  v.1.20-Alpha; 19.07.2013: Added "sdl_timer.h"
+  v.1.10-Alpha; 09.07.2013: Added "sdl_render.h"
+  v.1.00-Alpha; 05.07.2013: Initial Alpha-Release.
+}
+
+{$DEFINE SDL}
+
+{$I jedi.inc}
+
+interface
+
+  {$IFDEF WINDOWS}
+    uses
+      Windows;
+  {$ENDIF}
+
+  {$IFDEF LINUX}
+    uses
+      X,
+      XLib;
+  {$ENDIF}
+  
+  {$IFDEF DARWIN}
+    uses
+      X,
+      XLib,
+      CocoaAll;
+  {$ENDIF}
+
+const
+
+  {$IFDEF WINDOWS}
+    SDL_LibName = 'SDL2.dll';
+  {$ENDIF}
+
+  {$IFDEF UNIX}
+    {$IFDEF DARWIN}
+      SDL_LibName = 'libSDL2.dylib';
+    {$ELSE}
+      {$IFDEF FPC}
+        SDL_LibName = 'libSDL2.so';
+      {$ELSE}
+        SDL_LibName = 'libSDL2.so.0';
+      {$ENDIF}
+    {$ENDIF}
+  {$ENDIF}
+
+  {$IFDEF MACOS}
+    SDL_LibName = 'SDL2';
+    {$IFDEF FPC}
+      {$linklib libSDL2}
+    {$ENDIF}
+  {$ENDIF}
+
+{$I sdltype.inc}
+{$I sdlversion.inc}
+{$I sdlerror.inc}
+{$I sdlplatform.inc}
+{$I sdlpower.inc}
+{$I sdlthread.inc}
+{$I sdlmutex.inc}
+{$I sdltimer.inc}
+{$I sdlpixels.inc}
+{$I sdlrect.inc}
+{$I sdlrwops.inc}
+{$I sdlaudio.inc}
+{$I sdlblendmode.inc}
+{$I sdlsurface.inc}
+{$I sdlshape.inc}
+{$I sdlvideo.inc}
+{$I sdlhints.inc}
+{$I sdlloadso.inc}
+{$I sdlmessagebox.inc}
+{$I sdlrenderer.inc}
+{$I sdlscancode.inc}
+{$I sdlkeyboard.inc}
+{$I sdlmouse.inc}
+{$I sdljoystick.inc}
+{$I sdlgamecontroller.inc}
+{$I sdlhaptic.inc}
+{$I sdltouch.inc}
+{$I sdlgesture.inc}
+{$I sdlsyswm.inc}
+{$I sdlevents.inc}
+{$I sdlclipboard.inc}
+{$I sdlcpuinfo.inc}
+{$I sdlfilesystem.inc}
+{$I sdllog.inc}
+{$I sdlsystem.inc}
+{$I sdl.inc}
+
+implementation
+
+//from "sdl_version.h"
+procedure SDL_VERSION(Out x: TSDL_Version);
+begin
+  x.major := SDL_MAJOR_VERSION;
+  x.minor := SDL_MINOR_VERSION;
+  x.patch := SDL_PATCHLEVEL;
+end;
+
+function SDL_VERSIONNUM(X,Y,Z: UInt32): Cardinal;
+begin
+  Result := X*1000 + Y*100 + Z;
+end;
+
+function SDL_COMPILEDVERSION: Cardinal;
+begin
+  Result := SDL_VERSIONNUM(SDL_MAJOR_VERSION,
+                           SDL_MINOR_VERSION,
+                           SDL_PATCHLEVEL);
+end;
+
+function SDL_VERSION_ATLEAST(X,Y,Z: Cardinal): Boolean;
+begin
+  Result := SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X,Y,Z);
+end;
+
+//from "sdl_mouse.h"
+function SDL_Button(button: SInt32): SInt32;
+begin
+  Result := 1 shl (button - 1); 
+end;
+
+{$IFDEF WINDOWS}
+//from "sdl_thread.h"
+
+function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer): PSDL_Thread; overload;
+begin
+  Result := SDL_CreateThread(fn,name,data,nil,nil);
+end;
+
+{$ENDIF}
+
+//from "sdl_rect.h"
+function SDL_RectEmpty(X: TSDL_Rect): Boolean;
+begin
+  Result := (X.w <= 0) or (X.h <= 0);
+end;
+
+function SDL_RectEquals(A: TSDL_Rect; B: TSDL_Rect): Boolean;
+begin
+  Result := (A.x = B.x) and (A.y = B.y) and (A.w = B.w) and (A.h = B.h);
+end;
+
+//from "sdl_rwops.h"
+
+function SDL_RWsize(ctx: PSDL_RWops): SInt64;
+begin
+  Result := ctx^.size(ctx);
+end;
+
+function SDL_RWseek(ctx: PSDL_RWops; offset: SInt64; whence: SInt32): SInt64;
+begin
+  Result := ctx^.seek(ctx,offset,whence);
+end;
+
+function SDL_RWtell(ctx: PSDL_RWops): SInt64;
+begin
+  Result := ctx^.seek(ctx, 0, RW_SEEK_CUR);
+end;
+
+function SDL_RWread(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t;
+begin
+  Result := ctx^.read(ctx, ptr, size, n);
+end;
+
+function SDL_RWwrite(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t;
+begin
+  Result := ctx^.write(ctx, ptr, size, n);
+end;
+
+function SDL_RWclose(ctx: PSDL_RWops): SInt32;
+begin
+  Result := ctx^.close(ctx);
+end;
+
+//from "sdl_audio.h"
+
+function SDL_LoadWAV(_file: PAnsiChar; spec: PSDL_AudioSpec; audio_buf: PPUInt8; audio_len: PUInt32): PSDL_AudioSpec;
+begin
+  Result := SDL_LoadWAV_RW(SDL_RWFromFile(_file, 'rb'), 1, spec, audio_buf, audio_len);
+end;
+  
+function SDL_AUDIO_BITSIZE(x: Cardinal): Cardinal;
+begin
+  Result := x and SDL_AUDIO_MASK_BITSIZE;
+end;
+
+function SDL_AUDIO_ISFLOAT(x: Cardinal): Cardinal;
+begin
+  Result := x and SDL_AUDIO_MASK_DATATYPE;
+end;
+
+function SDL_AUDIO_ISBIGENDIAN(x: Cardinal): Cardinal;
+begin
+  Result := x and SDL_AUDIO_MASK_ENDIAN;
+end;
+
+function SDL_AUDIO_ISSIGNED(x: Cardinal): Cardinal;
+begin
+  Result := x and SDL_AUDIO_MASK_SIGNED;
+end;
+
+function SDL_AUDIO_ISINT(x: Cardinal): Cardinal;
+begin
+  Result := not SDL_AUDIO_ISFLOAT(x);
+end;
+
+function SDL_AUDIO_ISLITTLEENDIAN(x: Cardinal): Cardinal;
+begin
+  Result := not SDL_AUDIO_ISLITTLEENDIAN(x);
+end;
+
+function SDL_AUDIO_ISUNSIGNED(x: Cardinal): Cardinal;
+begin
+  Result := not SDL_AUDIO_ISSIGNED(x);
+end;
+
+//from "sdl_pixels.h"
+
+function SDL_PIXELFLAG(X: Cardinal): Boolean;
+begin
+  Result := (X shr 28) = $0F;
+end;
+
+function SDL_PIXELTYPE(X: Cardinal): Boolean;
+begin
+  Result := (X shr 24) = $0F;
+end;
+
+function SDL_PIXELORDER(X: Cardinal): Boolean;
+begin
+  Result := (X shr 20) = $0F;
+end;
+
+function SDL_PIXELLAYOUT(X: Cardinal): Boolean;
+begin
+  Result := (X shr 16) = $0F;
+end;
+
+function SDL_BITSPERPIXEL(X: Cardinal): Boolean;
+begin
+  Result := (X shr 8) = $FF;
+end;
+
+function SDL_IsPixelFormat_FOURCC(format: Variant): Boolean;
+begin
+  {* The flag is set to 1 because 0x1? is not in the printable ASCII range *}
+  Result := format and SDL_PIXELFLAG(format) <> 1;
+end;
+
+//from "sdl_surface.h"
+function SDL_LoadBMP(_file: PAnsiChar): PSDL_Surface;
+begin
+  Result := SDL_LoadBMP_RW(SDL_RWFromFile(_file, 'rb'), 1);
+end;
+
+function SDL_SaveBMP(Const surface:PSDL_Surface; Const filename:AnsiString):sInt32;
+begin
+   Result := SDL_SaveBMP_RW(surface, SDL_RWFromFile(PAnsiChar(filename), 'wb'), 1)
+end;
+
+{**
+ *  Evaluates to true if the surface needs to be locked before access.
+ *}
+function SDL_MUSTLOCK(Const S:PSDL_Surface):Boolean;
+begin
+  Result := ((S^.flags and SDL_RLEACCEL) <> 0)
+end;
+
+//from "sdl_video.h"
+function SDL_WindowPos_IsUndefined(X: Variant): Variant;
+begin
+  Result := (X and $FFFF0000) = SDL_WINDOWPOS_UNDEFINED_MASK;
+end;
+
+function SDL_WindowPos_IsCentered(X: Variant): Variant;
+begin
+  Result := (X and $FFFF0000) = SDL_WINDOWPOS_CENTERED_MASK;
+end;
+
+//from "sdl_events.h"
+
+function SDL_GetEventState(type_: UInt32): UInt8;
+begin
+  Result := SDL_EventState(type_, SDL_QUERY);
+end;
+
+// from "sdl_timer.h"
+function SDL_TICKS_PASSED(Const A, B:UInt32):Boolean;
+begin
+   Result := ((Int64(B) - Int64(A)) <= 0)
+end;
+
+// from "sdl_gamecontroller.h"
+  {**
+   *  Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
+   *}
+function SDL_GameControllerAddMappingsFromFile(Const FilePath:PAnsiChar):SInt32;
+begin
+  Result := SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(FilePath, 'rb'), 1)
+end;
+
+end.
diff --git a/src/lib/sdl2/sdlaudio.inc b/src/lib/sdl2/sdlaudio.inc
new file mode 100644 (file)
index 0000000..79bf7f0
--- /dev/null
@@ -0,0 +1,425 @@
+//from sdl_audio.h
+ {**
+   *   Audio format flags.
+   *
+   *  These are what the 16 bits in SDL_AudioFormat currently mean...
+   *  (Unspecified bits are always zero).
+   *
+   *
+      ++-----------------------sample is signed if set
+      ||
+      ||       ++-----------sample is bigendian if set
+      ||       ||
+      ||       ||          ++---sample is float if set
+      ||       ||          ||
+      ||       ||          || +---sample bit size---+
+      ||       ||          || |                     |
+      15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
+   *
+   *  There are macros in SDL 2.0 and later to query these bits.
+   *}
+type
+  TSDL_AudioFormat = UInt16;
+
+  {**
+   *   Audio flags
+   *}
+const
+  SDL_AUDIO_MASK_BITSIZE      = ($FF);
+  SDL_AUDIO_MASK_DATATYPE     = (1 shl 8);
+  SDL_AUDIO_MASK_ENDIAN       = (1 shl 12);
+  SDL_AUDIO_MASK_SIGNED       = (1 shl 15);
+
+function SDL_AUDIO_BITSIZE(x: Cardinal): Cardinal;
+function SDL_AUDIO_ISFLOAT(x: Cardinal): Cardinal;
+function SDL_AUDIO_ISBIGENDIAN(x: Cardinal): Cardinal;
+function SDL_AUDIO_ISSIGNED(x: Cardinal): Cardinal;
+function SDL_AUDIO_ISINT(x: Cardinal): Cardinal;
+function SDL_AUDIO_ISLITTLEENDIAN(x: Cardinal): Cardinal;
+function SDL_AUDIO_ISUNSIGNED(x: Cardinal): Cardinal;
+
+  {**
+   *   Audio format flags
+   *
+   *  Defaults to LSB byte order.
+   *}
+const
+  AUDIO_U8      = $0008;  {**< Unsigned 8-bit samples *}
+  AUDIO_S8      = $8008;  {**< Signed 8-bit samples *}
+  AUDIO_U16LSB  = $0010;  {**< Unsigned 16-bit samples *}
+  AUDIO_S16LSB  = $8010;  {**< Signed 16-bit samples *}
+  AUDIO_U16MSB  = $1010;  {**< As above, but big-endian byte order *}
+  AUDIO_S16MSB  = $9010;  {**< As above, but big-endian byte order *}
+  AUDIO_U16     = AUDIO_U16LSB;
+  AUDIO_S16     = AUDIO_S16LSB;
+
+  {**
+   *   int32 support
+   *}
+const
+  AUDIO_S32LSB  = $8020;  {**< 32-bit integer samples *}
+  AUDIO_S32MSB  = $9020;  {**< As above, but big-endian byte order *}
+  AUDIO_S32     = AUDIO_S32LSB;
+
+  {**
+   *   float32 support
+   *}
+const
+  AUDIO_F32LSB  = $8120;  {**< 32-bit floating point samples *}
+  AUDIO_F32MSB  = $9120;  {**< As above, but big-endian byte order *}
+  AUDIO_F32     = AUDIO_F32LSB;
+
+  {**
+   *   Native audio byte ordering
+   *}
+{$IFDEF FPC}
+   {$IF DEFINED(ENDIAN_LITTLE)}
+      AUDIO_U16SYS = AUDIO_U16LSB;
+      AUDIO_S16SYS = AUDIO_S16LSB;
+      AUDIO_S32SYS = AUDIO_S32LSB;
+      AUDIO_F32SYS = AUDIO_F32LSB;
+   {$ELSEIF DEFINED(ENDIAN_BIG)}
+      AUDIO_U16SYS = AUDIO_U16MSB;
+      AUDIO_S16SYS = AUDIO_S16MSB;
+      AUDIO_S32SYS = AUDIO_S32MSB;
+      AUDIO_F32SYS = AUDIO_F32MSB;
+   {$ELSE}
+      {$FATAL Cannot determine endianness.}
+   {$IFEND}
+{$ENDIF}
+
+  {**
+   *   Allow change flags
+   *
+   *  Which audio format changes are allowed when opening a device.
+   *}
+const
+  SDL_AUDIO_ALLOW_FREQUENCY_CHANGE  = $00000001;
+  SDL_AUDIO_ALLOW_FORMAT_CHANGE     = $00000002;
+  SDL_AUDIO_ALLOW_CHANNELS_CHANGE   = $00000004;
+  SDL_AUDIO_ALLOW_ANY_CHANGE        = (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE or
+                                       SDL_AUDIO_ALLOW_FORMAT_CHANGE or
+                                                SDL_AUDIO_ALLOW_CHANNELS_CHANGE);
+
+  {*Audio flags*}
+
+  {**
+   *  This function is called when the audio device needs more data.
+   *
+   *   userdata An application-specific parameter saved in
+   *                  the SDL_AudioSpec structure
+   *   stream A pointer to the audio data buffer.
+   *   len    The length of that buffer in bytes.
+   *
+   *  Once the callback returns, the buffer will no longer be valid.
+   *  Stereo samples are stored in a LRLRLR ordering.
+   *}
+type
+  TSDL_AudioCallback = procedure(userdata: Pointer; stream: PUInt8; len: Integer) cdecl;
+
+  {**
+   *  The calculated values in this structure are calculated by SDL_OpenAudio().
+   *}
+type
+  PSDL_AudioSpec = ^TSDL_AudioSpec;
+  TSDL_AudioSpec = record
+    freq: Integer;                {**< DSP frequency -- samples per second *}
+    format: TSDL_AudioFormat;     {**< Audio data format *}
+    channels: UInt8;              {**< Number of channels: 1 mono, 2 stereo *}
+    silence: UInt8;               {**< Audio buffer silence value (calculated) *}
+    samples: UInt16;              {**< Audio buffer size in samples (power of 2) *}
+    padding: UInt16;              {**< Necessary for some compile environments *}
+    size: UInt32;                 {**< Audio buffer size in bytes (calculated) *}
+    callback: TSDL_AudioCallback;
+    userdata: Pointer;
+  end;
+
+  PSDL_AudioCVT = ^TSDL_AudioCVT;
+  TSDL_AudioFilter = procedure(cvt: PSDL_AudioCVT; format: TSDL_AudioFormat) cdecl;
+
+  {**
+   *  A structure to hold a set of audio conversion filters and buffers.
+   *}
+  TSDL_AudioCVT = record
+    needed: Integer;                           {**< Set to 1 if conversion possible *}
+    src_format: TSDL_AudioFormat;              {**< Source audio format *}
+    dst_format: TSDL_AudioFormat;                {**< Target audio format *}
+    rate_incr: Double;                        {**< Rate conversion increment *}
+    buf: PUInt8;                             {**< Buffer to hold entire audio data *}
+    len: Integer;                               {**< Length of original audio buffer *}
+    len_cvt: Integer;                           {**< Length of converted audio buffer *}
+    len_mult: Integer;                          {**< buffer must be len*len_mult big *}
+    len_ratio: Double;                        {**< Given len, final size is len*len_ratio *}
+    filters: array[0..9] of TSDL_AudioFilter; {**< Filter list *}
+    filter_index: Integer;                      {**< Current audio conversion function *}
+  end;
+
+
+  {* Function prototypes *}
+
+  {**
+   *   Driver discovery functions
+   *
+   *  These functions return the list of built in audio drivers, in the
+   *  order that they are normally initialized by default.
+   *}
+
+function SDL_GetNumAudioDrivers: Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumAudioDrivers' {$ENDIF} {$ENDIF};
+function SDL_GetAudioDriver(index: Integer): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetAudioDriver' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Initialization and cleanup
+   *
+   *  These functions are used internally, and should not be used unless
+   *  you have a specific need to specify the audio driver you want to
+   *  use.  You should normally use SDL_Init() or SDL_InitSubSystem().
+   *}
+function SDL_AudioInit(driver_name: PAnsiChar): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AudioInit' {$ENDIF} {$ENDIF};
+procedure SDL_AudioQuit cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AudioQuit' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This function returns the name of the current audio driver, or NULL
+   *  if no driver has been initialized.
+   *}
+function SDL_GetCurrentAudioDriver: PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetCurrentAudioDriver' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This function opens the audio device with the desired parameters, and
+   *  returns 0 if successful, placing the actual hardware parameters in the
+   *  structure pointed to by obtained.  If obtained is NULL, the audio
+   *  data passed to the callback function will be guaranteed to be in the
+   *  requested format, and will be automatically converted to the hardware
+   *  audio format if necessary.  This function returns -1 if it failed
+   *  to open the audio device, or couldn't set up the audio thread.
+   *
+   *  When filling in the desired audio spec structure,
+   *    - desired->freq should be the desired audio frequency in samples-per-
+   *      second.
+   *    - desired->format should be the desired audio format.
+   *    - desired->samples is the desired size of the audio buffer, in
+   *      samples.  This number should be a power of two, and may be adjusted by
+   *      the audio driver to a value more suitable for the hardware.  Good values
+   *      seem to range between 512 and 8096 inclusive, depending on the
+   *      application and CPU speed.  Smaller values yield faster response time,
+   *      but can lead to underflow if the application is doing heavy processing
+   *      and cannot fill the audio buffer in time.  A stereo sample consists of
+   *      both right and left channels in LR ordering.
+   *      Note that the number of samples is directly related to time by the
+   *      following formula:  ms := (samples*1000)/freq;
+   *    - desired->size is the size in bytes of the audio buffer, and is
+   *      calculated by SDL_OpenAudio().
+   *    - desired->silence is the value used to set the buffer to silence,
+   *      and is calculated by SDL_OpenAudio().
+   *    - desired->callback should be set to a function that will be called
+   *      when the audio device is ready for more data.  It is passed a pointer
+   *      to the audio buffer, and the length in bytes of the audio buffer.
+   *      This function usually runs in a separate thread, and so you should
+   *      protect data structures that it accesses by calling SDL_LockAudio()
+   *      and SDL_UnlockAudio() in your code.
+   *    - desired->userdata is passed as the first parameter to your callback
+   *      function.
+   *
+   *  The audio device starts out playing silence when it's opened, and should
+   *  be enabled for playing by calling SDL_PauseAudio(0) when you are ready
+   *  for your audio callback function to be called.  Since the audio driver
+   *  may modify the requested size of the audio buffer, you should allocate
+   *  any local mixing buffers after you open the audio device.
+   *}
+function SDL_OpenAudio(desired: PSDL_AudioSpec; obtained: PSDL_AudioSpec): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_OpenAudio' {$ENDIF} {$ENDIF};
+
+  {**
+   *  SDL Audio Device IDs.
+   *
+   *  A successful call to SDL_OpenAudio() is always device id 1, and legacy
+   *  SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls
+   *  always returns devices >= 2 on success. The legacy calls are good both
+   *  for backwards compatibility and when you don't care about multiple,
+   *  specific, or capture devices.
+   *}
+type
+  TSDL_AudioDeviceID = UInt32;
+
+  {**
+   *  Get the number of available devices exposed by the current driver.
+   *  Only valid after a successfully initializing the audio subsystem.
+   *  Returns -1 if an explicit list of devices can't be determined; this is
+   *  not an error. For example, if SDL is set up to talk to a remote audio
+   *  server, it can't list every one available on the Internet, but it will
+   *  still allow a specific host to be specified to SDL_OpenAudioDevice().
+   *
+   *  In many common cases, when this function returns a value <= 0, it can still
+   *  successfully open the default device (NULL for first argument of
+   *  SDL_OpenAudioDevice()).
+   *}
+function SDL_GetNumAudioDevices(iscapture: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumAudioDevices' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the human-readable name of a specific audio device.
+   *  Must be a value between 0 and (number of audio devices-1).
+   *  Only valid after a successfully initializing the audio subsystem.
+   *  The values returned by this function reflect the latest call to
+   *  SDL_GetNumAudioDevices(); recall that function to redetect available
+   *  hardware.
+   *
+   *  The string returned by this function is UTF-8 encoded, read-only, and
+   *  managed internally. You are not to free it. If you need to keep the
+   *  string for any length of time, you should make your own copy of it, as it
+   *  will be invalid next time any of several other SDL functions is called.
+   *}
+function SDL_GetAudioDeviceName(index: Integer; iscapture: Integer): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetAudioDeviceName' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Open a specific audio device. Passing in a device name of NULL requests
+   *  the most reasonable default (and is equivalent to calling SDL_OpenAudio()).
+   *
+   *  The device name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but
+   *  some drivers allow arbitrary and driver-specific strings, such as a
+   *  hostname/IP address for a remote audio server, or a filename in the
+   *  diskaudio driver.
+   *
+   *   0 on error, a valid device ID that is >= 2 on success.
+   *
+   *  SDL_OpenAudio(), unlike this function, always acts on device ID 1.
+   *}
+function SDL_OpenAudioDevice(device: PAnsiChar;
+                             iscapture: Integer;
+                             desired: PSDL_AudioSpec;
+                             obtained: PSDL_AudioSpec;
+                                  allowed_changes: Integer): TSDL_AudioDeviceID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_OpenAudioDevice' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Audio state
+   *
+   *  Get the current audio state.
+   *}
+
+type
+  TSDL_AudioStatus = (SDL_AUDIO_STOPPED,SDL_AUDIO_PLAYING,SDL_AUDIO_PAUSED);
+
+function SDL_GetAudioStatus: TSDL_AudioStatus cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetAudioStatus' {$ENDIF} {$ENDIF};
+
+function SDL_GetAudioDeviceStatus(dev: TSDL_AudioDeviceID): TSDL_AudioStatus cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetAudioDeviceStatus' {$ENDIF} {$ENDIF};
+  {*Audio State*}
+
+  {**
+   *   Pause audio functions
+   *
+   *  These functions pause and unpause the audio callback processing.
+   *  They should be called with a parameter of 0 after opening the audio
+   *  device to start playing sound.  This is so you can safely initialize
+   *  data for your callback function after opening the audio device.
+   *  Silence will be written to the audio device during the pause.
+   *}
+
+procedure SDL_PauseAudio(pause_on: Integer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PauseAudio' {$ENDIF} {$ENDIF};
+procedure SDL_PauseAudioDevice(dev: TSDL_AudioDeviceID; pause_on: Integer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PauseAudioDevice' {$ENDIF} {$ENDIF};
+  {*Pause audio functions*}
+
+  {**
+   *  This function loads a WAVE from the data source, automatically freeing
+   *  that source if freesrc is non-zero.  For example, to load a WAVE file,
+   *  you could do:
+   *
+   *      SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...);
+   *
+   *
+   *  If this function succeeds, it returns the given SDL_AudioSpec,
+   *  filled with the audio data format of the wave data, and sets
+   *   *audio_buf to a malloc()'d buffer containing the audio data,
+   *  and sets  *audio_len to the length of that audio buffer, in bytes.
+   *  You need to free the audio buffer with SDL_FreeWAV() when you are
+   *  done with it.
+   *
+   *  This function returns NULL and sets the SDL error message if the
+   *  wave file cannot be opened, uses an unknown data format, or is
+   *  corrupt.  Currently raw and MS-ADPCM WAVE files are supported.
+   *}
+function SDL_LoadWAV_RW(src: PSDL_RWops; freesrc: Integer; spec: PSDL_AudioSpec; audio_buf: PPUInt8; audio_len: PUInt32): PSDL_AudioSpec cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LoadWAV_RW' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Loads a WAV from a file.
+   *  Compatibility convenience function.
+   *}
+
+   function SDL_LoadWAV(_file: PAnsiChar; spec: PSDL_AudioSpec; audio_buf: PPUInt8; audio_len: PUInt32): PSDL_AudioSpec;
+
+  {**
+   *  This function frees data previously allocated with SDL_LoadWAV_RW()
+   *}
+  procedure SDL_FreeWAV(audio_buf: PUInt8) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FreeWAV' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This function takes a source format and rate and a destination format
+   *  and rate, and initializes the cvt structure with information needed
+   *  by SDL_ConvertAudio() to convert a buffer of audio data from one format
+   *  to the other.
+   *
+   *   -1 if the format conversion is not supported, 0 if there's
+   *  no conversion needed, or 1 if the audio filter is set up.
+   *}
+function SDL_BuildAudioCVT(cvt: PSDL_AudioCVT;
+                           src_format: TSDL_AudioFormat;
+                           src_channels: UInt8;
+                           src_rate: Integer;
+                           dst_format: TSDL_AudioFormat;
+                           dst_channels: UInt8;
+                           dst_rate: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_BuildAudioCVT' {$ENDIF} {$ENDIF};
+
+{**
+ *  Once you have initialized the cvt structure using SDL_BuildAudioCVT(),
+ *  created an audio buffer cvt->buf, and filled it with cvt->len bytes of
+ *  audio data in the source format, this function will convert it in-place
+ *  to the desired format.
+ *
+ *  The data conversion may expand the size of the audio data, so the buffer
+ *  cvt->buf should be allocated after the cvt structure is initialized by
+ *  SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long.
+ *}
+function SDL_ConvertAudio(cvt: PSDL_AudioCVT): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ConvertAudio' {$ENDIF} {$ENDIF};
+
+const
+  SDL_MIX_MAXVOLUME = 128;
+
+  {**
+   *  This takes two audio buffers of the playing audio format and mixes
+   *  them, performing addition, volume adjustment, and overflow clipping.
+   *  The volume ranges from 0 - 128, and should be set to ::SDL_MIX_MAXVOLUME
+   *  for full audio volume.  Note this does not change hardware volume.
+   *  This is provided for convenience -- you can mix your own audio data.
+   *}
+procedure SDL_MixAudio(dst: PUInt8; src: PUInt8; len: UInt32; volume: Integer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MixAudio' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This works like SDL_MixAudio(), but you specify the audio format instead of
+   *  using the format of audio device 1. Thus it can be used when no audio
+   *  device is open at all.
+   *}
+procedure SDL_MixAudioFormat(dst: PUInt8; src: PUInt8; format: TSDL_AudioFormat; len: UInt32; volume: Integer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MixAudioFormat' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Audio lock functions
+   *
+   *  The lock manipulated by these functions protects the callback function.
+   *  During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that
+   *  the callback function is not running.  Do not call these from the callback
+   *  function or you will cause deadlock.
+   *}
+
+procedure SDL_LockAudio cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LockAudio' {$ENDIF} {$ENDIF};
+procedure SDL_LockAudioDevice(dev: TSDL_AudioDeviceID) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LockAudioDevice' {$ENDIF} {$ENDIF};
+procedure SDL_UnlockAudio cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Unlock' {$ENDIF} {$ENDIF};
+procedure SDL_UnlockAudioDevice(dev: TSDL_AudioDeviceID) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UnlockAudioDevice' {$ENDIF} {$ENDIF};
+  {*Audio lock functions*}
+
+  {**
+   *  This function shuts down audio processing and closes the audio device.
+   *}
+procedure SDL_CloseAudio cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CloseAudio' {$ENDIF} {$ENDIF};
+procedure SDL_CloseAudioDevice(dev: TSDL_AudioDeviceID) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CloseAudioDevice' {$ENDIF} {$ENDIF};
+
+  {**
+   *  1 if audio device is still functioning, zero if not, -1 on error.
+   *}
+function SDL_AudioDeviceConnected(dev: TSDL_AudioDeviceID): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AudioDeviceConnected' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdlblendmode.inc b/src/lib/sdl2/sdlblendmode.inc
new file mode 100644 (file)
index 0000000..d655dc7
--- /dev/null
@@ -0,0 +1,15 @@
+//from "sdl_blendmode.h"
+
+{**
+ *  The blend mode used in SDL_RenderCopy() and drawing operations.
+ *}
+
+type
+  PSDL_BlendMode = ^TSDL_BlendMode;
+  TSDL_BlendMode = DWord;
+
+const
+  SDL_BLENDMODE_NONE  = $00000000;    {**< No blending *}
+  SDL_BLENDMODE_BLEND = $00000001;    {**< dst = (src * A) + (dst * (1-A)) *}
+  SDL_BLENDMODE_ADD   = $00000002;    {**< dst = (src * A) + dst *}
+  SDL_BLENDMODE_MOD   = $00000004;    {**< dst = src * dst *}
diff --git a/src/lib/sdl2/sdlclipboard.inc b/src/lib/sdl2/sdlclipboard.inc
new file mode 100644 (file)
index 0000000..07eab87
--- /dev/null
@@ -0,0 +1,24 @@
+
+{* Function prototypes *}
+
+{**
+ * \brief Put UTF-8 text into the clipboard
+ *
+ * \sa SDL_GetClipboardText()
+ *}
+function SDL_SetClipboardText(const text: PAnsiChar): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetClipboardText' {$ENDIF} {$ENDIF};
+
+{**
+ * \brief Get UTF-8 text from the clipboard, which must be freed with SDL_free()
+ *
+ * \sa SDL_SetClipboardText()
+ *}
+function SDL_GetClipboardText(): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetClipboardText' {$ENDIF} {$ENDIF};
+
+{**
+ * \brief Returns a flag indicating whether the clipboard exists and contains a text string that is non-empty
+ *
+ * \sa SDL_GetClipboardText()
+ *}
+function SDL_HasClipboardText(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasClipboardText' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdlcpuinfo.inc b/src/lib/sdl2/sdlcpuinfo.inc
new file mode 100644 (file)
index 0000000..2ea9f29
--- /dev/null
@@ -0,0 +1,77 @@
+
+{* This is a guess for the cacheline size used for padding.
+ * Most x86 processors have a 64 byte cache line.
+ * The 64-bit PowerPC processors have a 128 byte cache line.
+ * We'll use the larger value to be generally safe.
+ *}
+const
+  SDL_CACHELINE_SIZE = 128;
+
+{**
+ *  This function returns the number of CPU cores available.
+ *}
+function SDL_GetCPUCount(): Integer; cdecl external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetCPUCount' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns the L1 cache line size of the CPU
+ *
+ *  This is useful for determining multi-threaded structure padding
+ *  or SIMD prefetch sizes.
+ *}
+function SDL_GetCPUCacheLineSize(): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetCPUCacheLineSize' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has the RDTSC instruction.
+ *}
+function SDL_HasRDTSC(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasRDTSC' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has AltiVec features.
+ *}
+function SDL_HasAltiVec(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasAltiVec' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has MMX features.
+ *}
+function SDL_HasMMX(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasMMX' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has 3DNow! features.
+ *}
+function SDL_Has3DNow(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Has3DNow' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has SSE features.
+ *}
+function SDL_HasSSE(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasSSE' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has SSE2 features.
+ *}
+function SDL_HasSSE2(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasSSE2' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has SSE3 features.
+ *}
+function SDL_HasSSE3(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasSSE3' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has SSE4.1 features.
+ *}
+function SDL_HasSSE41(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasSSE41' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has SSE4.2 features.
+ *}
+function SDL_HasSSE42(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasSSE42' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns true if the CPU has AVX features.
+ *}
+function SDL_HasAVX(): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasAVX' {$ENDIF} {$ENDIF};
+
+{**
+ *  This function returns the amount of RAM configured in the system, in MB.
+ *}
+function SDL_GetSystemRAM(): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetSystemRAM' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdlerror.inc b/src/lib/sdl2/sdlerror.inc
new file mode 100644 (file)
index 0000000..523e9cb
--- /dev/null
@@ -0,0 +1,55 @@
+//from "sdl_error.h"
+const
+  ERR_MAX_STRLEN = 128;
+  ERR_MAX_ARGS   = 5;
+
+  {* Public functions *}
+
+  {* SDL_SetError() unconditionally returns -1. *}
+function SDL_SetError(const fmt: PAnsiChar): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetError' {$ENDIF} {$ENDIF};
+function SDL_GetError: PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetError' {$ENDIF} {$ENDIF};
+procedure SDL_ClearError cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ClearError' {$ENDIF} {$ENDIF};
+  {*Internal error functions*}
+  {**
+   *  Internal error functions
+   *
+   *  Private error reporting function - used internally.
+   *}
+
+    {
+#define SDL_OutOfMemory()   SDL_Error(SDL_ENOMEM)
+#define SDL_Unsupported()   SDL_Error(SDL_UNSUPPORTED)
+#define SDL_InvalidParamError(param)    SDL_SetError("Parameter '%s' is invalid", (param))
+   }
+type
+  TSDL_ErrorCode = (SDL_ENOMEM,
+                    SDL_EFREAD,
+                    SDL_EFWRITE,
+                    SDL_EFSEEK,
+                    SDL_UNSUPPORTED,
+                    SDL_LASTERROR);
+
+  TSDL_Error = record
+    {* This is a numeric value corresponding to the current error *}
+    error: SInt32;
+
+    {* This is a key used to index into a language hashtable containing
+       internationalized versions of the SDL error messages.  If the key
+       is not in the hashtable, or no hashtable is available, the key is
+       used directly as an error message format string.
+     *}
+    key: String[ERR_MAX_STRLEN];
+
+    {* These are the arguments for the error functions *}
+    argc: SInt32;
+    case SInt32 of
+         {* What is a character anyway?  (UNICODE issues) *}
+      0: (value_c: Byte;);
+      1: (value_ptr: Pointer;);
+      2: (value_i: SInt32;);
+      3: (value_f: Double;);
+      4: (buf: String[ERR_MAX_STRLEN];);
+  end;
+
+  {* SDL_Error() unconditionally returns -1. *}
+function SDL_Error(code: TSDL_ErrorCode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Error' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlevents.inc b/src/lib/sdl2/sdlevents.inc
new file mode 100644 (file)
index 0000000..34b02df
--- /dev/null
@@ -0,0 +1,702 @@
+//from "sdl_events.h"
+
+  {**
+   *  The types of events that can be delivered.
+   *}
+
+const
+
+  SDL_FIRSTEVENT       = 0;     // Unused (do not remove) (needed in pascal?)
+
+  SDL_COMMONEVENT      = 1;     //added for pascal-compatibility
+
+  { Application events }
+  SDL_QUITEV           = $100;  // User-requested quit (originally SDL_QUIT, but changed, cause theres a method called SDL_QUIT)
+
+
+  {* These application events have special meaning on iOS, see README.iOS for details *}
+  SDL_APP_TERMINATING  = $101;   {**< The application is being terminated by the OS
+                                      Called on iOS in applicationWillTerminate()
+                                      Called on Android in onDestroy()
+                                  *}
+  SDL_APP_LOWMEMORY    = $102;   {**< The application is low on memory, free memory if possible.
+                                      Called on iOS in applicationDidReceiveMemoryWarning()
+                                      Called on Android in onLowMemory()
+                                  *}
+  SDL_APP_WILLENTERBACKGROUND = $103; {**< The application is about to enter the background
+                                           Called on iOS in applicationWillResignActive()
+                                           Called on Android in onPause()
+                                       *}
+  SDL_APP_DIDENTERBACKGROUND = $104;  {**< The application did enter the background and may not get CPU for some time
+                                           Called on iOS in applicationDidEnterBackground()
+                                           Called on Android in onPause()
+                                       *}
+  SDL_APP_WILLENTERFOREGROUND = $105; {**< The application is about to enter the foreground
+                                           Called on iOS in applicationWillEnterForeground()
+                                           Called on Android in onResume()
+                                       *}
+  SDL_APP_DIDENTERFOREGROUND = $106;  {**< The application is now interactive
+                                           Called on iOS in applicationDidBecomeActive()
+                                           Called on Android in onResume()
+                                       *}
+
+  { Window events }
+  SDL_WINDOWEVENT      = $200;  // Window state change
+  SDL_SYSWMEVENT       = $201;  // System specific event
+
+  { Keyboard events }
+  SDL_KEYDOWN          = $300;  // Key pressed
+  SDL_KEYUP            = $301;  // Key released
+  SDL_TEXTEDITING      = $302;  // Keyboard text editing (composition)
+  SDL_TEXTINPUT        = $303;  // Keyboard text input
+  SDL_KEYMAPCHANGED    = $304;  // Keymap changed due to a system event such as an
+                                // input language or keyboard layout change.
+
+  { Mouse events }
+  SDL_MOUSEMOTION      = $400;  // Mouse moved
+  SDL_MOUSEBUTTONDOWN  = $401;  // Mouse button pressed
+  SDL_MOUSEBUTTONUP    = $402;  // Mouse button released
+  SDL_MOUSEWHEEL       = $403;  // Mouse wheel motion
+
+  { Joystick events }
+  SDL_JOYAXISMOTION    = $600;  // Joystick axis motion
+  SDL_JOYBALLMOTION    = $601;  // Joystick trackball motion
+  SDL_JOYHATMOTION     = $602;  // Joystick hat position change
+  SDL_JOYBUTTONDOWN    = $603;  // Joystick button pressed
+  SDL_JOYBUTTONUP      = $604;  // Joystick button released
+  SDL_JOYDEVICEADDED   = $605;  // A new joystick has been inserted into the system 
+  SDL_JOYDEVICEREMOVED = $606;  // An opened joystick has been removed 
+
+  { Game controller events }
+  SDL_CONTROLLERAXISMOTION     = $650;  // Game controller axis motion
+  SDL_CONTROLLERBUTTONDOWN     = $651;  // Game controller button pressed 
+  SDL_CONTROLLERBUTTONUP       = $652;  // Game controller button released
+  SDL_CONTROLLERDEVICEADDED    = $653;  // A new Game controller has been inserted into the system 
+  SDL_CONTROLLERDEVICEREMOVED  = $654;  // An opened Game controller has been removed 
+  SDL_CONTROLLERDEVICEREMAPPED = $655;  // The controller mapping was updated 
+   
+  { Touch events }
+  SDL_FINGERDOWN      = $700;
+  SDL_FINGERUP        = $701;
+  SDL_FINGERMOTION    = $702;
+
+  { Gesture events }
+  SDL_DOLLARGESTURE   = $800;
+  SDL_DOLLARRECORD    = $801;
+  SDL_MULTIGESTURE    = $802;
+
+  { Clipboard events }
+  SDL_CLIPBOARDUPDATE = $900; // The clipboard changed
+
+  { Drag and drop events }
+  SDL_DROPFILE        = $1000; // The system requests a file open
+
+  { Audio hotplug events }
+  SDL_AUDIODEVICEADDED     = $1100; // A new audio device is available
+  SDL_AUDIODEVICEREMOVED   = $1101; // An audio device has been removed.
+
+  { Render events }
+  SDL_RENDER_TARGETS_RESET = $2000; // The render targets have been reset
+  SDL_RENDER_DEVICE_RESET  = $2001; // The device has been reset and all textures need to be recreated
+  
+  {** Events SDL_USEREVENT through SDL_LASTEVENT are for your use,
+   *  and should be allocated with SDL_RegisterEvents()
+   *}
+  SDL_USEREVENT    = $8000;
+
+  {**
+   *  This last event is only for bounding internal arrays (needed in pascal ??)
+   *}
+  SDL_LASTEVENT    = $FFFF;
+
+type
+
+  TSDL_EventType = Word;
+
+  {**
+   *  Fields shared by every event
+   *}
+
+  TSDL_CommonEvent = record
+    type_: UInt32;
+    timestamp: UInt32;
+  end;
+
+  {**
+   *  Window state change event data (event.window.*)
+   *}
+
+  TSDL_WindowEvent = record
+    type_: UInt32;       // SDL_WINDOWEVENT
+    timestamp: UInt32;
+    windowID: UInt32;    // The associated window
+    event: UInt8;        // SDL_WindowEventID
+    padding1: UInt8;
+    padding2: UInt8;
+    padding3: UInt8;
+    data1: SInt32;       // event dependent data
+    data2: SInt32;       // event dependent data 
+  end;
+
+  {**
+   *  Keyboard button event structure (event.key.*)
+   *}
+  TSDL_KeyboardEvent = record
+    type_: UInt32;        // SDL_KEYDOWN or SDL_KEYUP
+    timestamp: UInt32;
+    windowID: UInt32;     // The window with keyboard focus, if any
+    state: UInt8;         // SDL_PRESSED or SDL_RELEASED 
+    _repeat: UInt8;       // Non-zero if this is a key repeat
+    padding2: UInt8;
+    padding3: UInt8;
+    keysym: TSDL_KeySym;  // The key that was pressed or released
+  end;
+
+const
+  SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32;
+
+type
+  {**
+   *  Keyboard text editing event structure (event.edit.*)
+   *}
+
+  TSDL_TextEditingEvent = record
+    type_: UInt32;                               // SDL_TEXTEDITING 
+    timestamp: UInt32;
+    windowID: UInt32;                            // The window with keyboard focus, if any
+    text: array[0..SDL_TEXTEDITINGEVENT_TEXT_SIZE] of Char;  // The editing text 
+    start: SInt32;                               // The start cursor of selected editing text
+    length: SInt32;                              // The length of selected editing text
+  end;
+
+const
+  SDL_TEXTINPUTEVENT_TEXT_SIZE = 32;
+
+type
+
+  {**
+   *  Keyboard text input event structure (event.text.*)
+   *}
+
+  TSDL_TextInputEvent = record
+    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 
+  end;
+
+  {**
+   *  Mouse motion event structure (event.motion.*)
+   *}
+  TSDL_MouseMotionEvent = record
+    type_: UInt32;       // SDL_MOUSEMOTION
+    timestamp: UInt32;
+    windowID: UInt32;    // The window with mouse focus, if any
+    which: UInt32;       // The mouse instance id, or SDL_TOUCH_MOUSEID
+    state: UInt8;        // The current button state 
+    padding1: UInt8;
+    padding2: UInt8;
+    padding3: UInt8;
+    x: SInt32;           // X coordinate, relative to window
+    y: SInt32;           // Y coordinate, relative to window
+    xrel: SInt32;        // The relative motion in the X direction 
+    yrel: SInt32;        // The relative motion in the Y direction
+  end;
+
+  {**
+   *  Mouse button event structure (event.button.*)
+   *}
+
+  TSDL_MouseButtonEvent = record
+    type_: UInt32;       // SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP 
+    timestamp: UInt32;
+    windowID: UInt32;    // The window with mouse focus, if any
+    which: UInt32;       // The mouse instance id, or SDL_TOUCH_MOUSEID 
+    button: UInt8;       // The mouse button index
+    state: UInt8;        // SDL_PRESSED or SDL_RELEASED
+    clicks: UInt8;       // 1 for single-click, 2 for double-click, etc.
+    padding1: UInt8;
+    x: SInt32;           // X coordinate, relative to window
+    y: SInt32;           // Y coordinate, relative to window 
+  end;
+
+  {**
+   *  Mouse wheel event structure (event.wheel.*)
+   *}
+  TSDL_MouseWheelEvent = record
+    type_: UInt32;        // SDL_MOUSEWHEEL
+    timestamp: UInt32;
+    windowID: UInt32;    // The window with mouse focus, if any
+    which: UInt32;       // The mouse instance id, or SDL_TOUCH_MOUSEID
+    x: SInt32;           // The amount scrolled horizontally 
+    y: SInt32;           // The amount scrolled vertically
+    direction: UInt32;   // Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back
+  end;
+
+  {**
+   *  Joystick axis motion event structure (event.jaxis.*)
+   *}
+
+  TSDL_JoyAxisEvent = record
+    type_: UInt32;         // SDL_JOYAXISMOTION 
+    timestamp: UInt32;
+    which: TSDL_JoystickID; // The joystick instance id
+    axis: UInt8;           // The joystick axis index 
+    padding1: UInt8;
+    padding2: UInt8;
+    padding3: UInt8;
+    value: SInt16;         // The axis value (range: -32768 to 32767)
+    padding4: UInt16;
+  end;
+
+  {**
+   *  Joystick trackball motion event structure (event.jball.*)
+   *}
+
+  TSDL_JoyBallEvent = record
+    type_: UInt32;         // SDL_JOYBALLMOTION
+    timestamp: UInt32;
+    which: TSDL_JoystickID; // The joystick instance id
+    ball: UInt8;           // The joystick trackball index
+    padding1: UInt8;
+    padding2: UInt8;
+    padding3: UInt8;
+    xrel: SInt16;          // The relative motion in the X direction
+    yrel: SInt16;          // The relative motion in the Y direction
+  end;
+
+  {**
+   *  Joystick hat position change event structure (event.jhat.*)
+   *}
+
+  TSDL_JoyHatEvent = record
+    type_: UInt32;         // SDL_JOYHATMOTION
+    timestamp: UInt32;
+    which: TSDL_JoystickID; // The joystick instance id
+    hat: UInt8;            // The joystick hat index
+    value: UInt8;         {*  The hat position value.
+                           *  SDL_HAT_LEFTUP   SDL_HAT_UP       SDL_HAT_RIGHTUP
+                           *  SDL_HAT_LEFT     SDL_HAT_CENTERED SDL_HAT_RIGHT
+                           *  SDL_HAT_LEFTDOWN SDL_HAT_DOWN     SDL_HAT_RIGHTDOWN
+                           *
+                           *  Note that zero means the POV is centered.
+                           *}
+    padding1: UInt8;
+    padding2: UInt8;
+  end;
+
+  {**
+   *  Joystick button event structure (event.jbutton.*)
+   *}
+
+  TSDL_JoyButtonEvent = record
+    type_: UInt32;        // SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP
+    timestamp: UInt32;
+    which: TSDL_JoystickID; // The joystick instance id 
+    button: UInt8;         // The joystick button index
+    state: UInt8;          // SDL_PRESSED or SDL_RELEASED
+    padding1: UInt8;
+    padding2: UInt8;
+  end;
+
+  {**
+   *  Joystick device event structure (event.jdevice.*)
+   *}
+
+  TSDL_JoyDeviceEvent = record
+    type_: UInt32;      // SDL_JOYDEVICEADDED or SDL_JOYDEVICEREMOVED
+    timestamp: UInt32;
+    which: SInt32;      // The joystick device index for the ADDED event, instance id for the REMOVED event
+  end;
+
+  {**
+   *  Game controller axis motion event structure (event.caxis.*)
+   *}
+
+  TSDL_ControllerAxisEvent = record
+    type_: UInt32;         // SDL_CONTROLLERAXISMOTION
+    timestamp: UInt32;
+    which: TSDL_JoystickID; // The joystick instance id
+    axis: UInt8;           // The controller axis (SDL_GameControllerAxis)
+    padding1: UInt8;
+    padding2: UInt8;
+    padding3: UInt8;
+    value: SInt16;         // The axis value (range: -32768 to 32767)
+    padding4: UInt16;
+  end;
+
+  {**
+   *  Game controller button event structure (event.cbutton.*)
+   *}
+
+  TSDL_ControllerButtonEvent = record
+    type_: UInt32;         // SDL_CONTROLLERBUTTONDOWN or SDL_CONTROLLERBUTTONUP
+    timestamp: UInt32;
+    which: TSDL_JoystickID; // The joystick instance id
+    button: UInt8;         // The controller button (SDL_GameControllerButton)
+    state: UInt8;          // SDL_PRESSED or SDL_RELEASED
+    padding1: UInt8;
+    padding2: UInt8;
+  end;
+
+
+  {**
+   *  Controller device event structure (event.cdevice.*)
+   *}
+
+  TSDL_ControllerDeviceEvent = record
+    type_: UInt32;       // SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED, or SDL_CONTROLLERDEVICEREMAPPED
+    timestamp: UInt32;
+    which: SInt32;       // The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event
+  end;
+
+  {**
+   *  Audio device event structure (event.adevice.*)
+   *}
+
+  TSDL_AudioDeviceEvent = record
+    type_: UInt32;        // ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED
+    timestamp: UInt32;
+    which: UInt32;        // The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event
+    iscapture: UInt8;     // zero if an output device, non-zero if a capture device.
+    padding1: UInt8;
+    padding2: UInt8;
+    padding3: UInt8;
+  end;
+
+
+  {**
+   *  Touch finger event structure (event.tfinger.*)
+   *}
+
+  TSDL_TouchFingerEvent = record
+    type_: UInt32;         // SDL_FINGERMOTION or SDL_FINGERDOWN or SDL_FINGERUP
+    timestamp: UInt32;
+    touchId: TSDL_TouchID;  // The touch device id
+    fingerId: TSDL_FingerID;
+    x: Float;              // Normalized in the range 0...1
+    y: Float;              // Normalized in the range 0...1
+    dx: Float;             // Normalized in the range 0...1
+    dy: Float;             // Normalized in the range 0...1
+    pressure: Float;       // Normalized in the range 0...1
+  end;
+
+  {**
+   *  Multiple Finger Gesture Event (event.mgesture.*)
+   *}
+  TSDL_MultiGestureEvent = record
+    type_: UInt32;        // SDL_MULTIGESTURE
+    timestamp: UInt32;
+    touchId: TSDL_TouchID; // The touch device index
+    dTheta: Float;
+    dDist: Float;
+    x: Float;
+    y: Float;
+    numFingers: UInt16;
+    padding: UInt16;
+  end;
+
+
+  {* (event.dgesture.*) *}
+  TSDL_DollarGestureEvent = record
+    type_: UInt32;         // SDL_DOLLARGESTURE
+    timestamp: UInt32;
+    touchId: TSDL_TouchID;  // The touch device id
+    gestureId: TSDL_GestureID;
+    numFingers: UInt32;
+    error: Float;
+    x: Float;              // Normalized center of gesture
+    y: Float;              // Normalized center of gesture
+  end;
+
+
+  {**
+   *  An event used to request a file open by the system (event.drop.*)
+   *  This event is disabled by default, you can enable it with SDL_EventState()
+   *  If you enable this event, you must free the filename in the event.
+   *}
+
+  TSDL_DropEvent = record
+    type_: UInt32;      // SDL_DROPFILE
+    timestamp: UInt32;
+    _file: PAnsiChar;   // The file name, which should be freed with SDL_free()
+  end;
+
+  {**
+   *  The "quit requested" event
+   *}
+
+  TSDL_QuitEvent = record
+    type_: UInt32;        // SDL_QUIT
+    timestamp: UInt32;
+  end;
+
+  {**
+   *  A user-defined event type (event.user.*)
+   *}
+
+  TSDL_UserEvent = record
+    type_: UInt32;       // SDL_USEREVENT through SDL_NUMEVENTS-1
+    timestamp: UInt32;
+    windowID: UInt32;    // The associated window if any
+    code: SInt32;        // User defined event code
+    data1: Pointer;      // User defined data pointer
+    data2: Pointer;      // User defined data pointer
+  end;
+
+  {**
+   *  A video driver dependent system event (event.syswm.*)
+   *  This event is disabled by default, you can enable it with SDL_EventState()
+   *
+   *  If you want to use this event, you should include SDL_syswm.h.
+   *}
+
+  PSDL_SysWMEvent = ^TSDL_SysWMEvent;
+  TSDL_SysWMEvent = record
+    type_: UInt32;       // SDL_SYSWMEVENT
+    timestamp: UInt32;
+    msg: PSDL_SysWMmsg;  // driver dependent data (defined in SDL_syswm.h)
+  end;
+
+  {**
+   *  General event structure
+   *}
+
+  PSDL_Event = ^TSDL_Event;
+  TSDL_Event = record
+    case Integer of
+      0:  (type_: UInt32);
+
+      SDL_COMMONEVENT:  (common: TSDL_CommonEvent);
+      SDL_WINDOWEVENT:  (window: TSDL_WindowEvent);
+
+      SDL_KEYUP,
+      SDL_KEYDOWN:  (key: TSDL_KeyboardEvent);
+      SDL_TEXTEDITING:  (edit: TSDL_TextEditingEvent);
+      SDL_TEXTINPUT:  (text: TSDL_TextInputEvent);
+
+      SDL_MOUSEMOTION:  (motion: TSDL_MouseMotionEvent);
+      SDL_MOUSEBUTTONUP,
+      SDL_MOUSEBUTTONDOWN:  (button: TSDL_MouseButtonEvent);
+      SDL_MOUSEWHEEL:  (wheel: TSDL_MouseWheelEvent);
+     
+      SDL_JOYAXISMOTION:  (jaxis: TSDL_JoyAxisEvent);
+      SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent);
+      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_CONTROLLERDEVICEREMOVED,
+      SDL_CONTROLLERDEVICEREMAPPED: (cdevice: TSDL_ControllerDeviceEvent);
+
+      SDL_AUDIODEVICEADDED,
+      SDL_AUDIODEVICEREMOVED: (adevice: TSDL_AudioDeviceEvent);
+
+      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_MULTIGESTURE: (mgesture: TSDL_MultiGestureEvent);
+      SDL_DOLLARGESTURE,SDL_DOLLARRECORD: (dgesture: TSDL_DollarGestureEvent);
+
+      SDL_DROPFILE: (drop: TSDL_DropEvent);
+  end;
+
+
+  {* Function prototypes *}
+
+  {**
+   *  Pumps the event loop, gathering events from the input devices.
+   *  
+   *  This function updates the event queue and internal input device state.
+   *  
+   *  This should only be run in the thread that sets the video mode.
+   *}
+  procedure SDL_PumpEvents cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PumpEvents' {$ENDIF} {$ENDIF};
+
+const
+  SDL_ADDEVENT = 0;
+  SDL_PEEKEVENT = 1;
+  SDL_GETEVENT = 2;
+
+type
+  TSDL_EventAction = Word;
+
+  {**
+   *  Checks the event queue for messages and optionally returns them.
+   *
+   *  If action is SDL_ADDEVENT, up to numevents events will be added to
+   *  the back of the event queue.
+   *
+   *  If action is SDL_PEEKEVENT, up to numevents events at the front
+   *  of the event queue, within the specified minimum and maximum type,
+   *  will be returned and will not be removed from the queue.
+   *
+   *  If action is SDL_GETEVENT, up to numevents events at the front
+   *  of the event queue, within the specified minimum and maximum type,
+   *  will be returned and will be removed from the queue.
+   *
+   *  Result: The number of events actually stored, or -1 if there was an error.
+   *
+   *  This function is thread-safe.
+   *}
+
+  function SDL_PeepEvents(events: PSDL_Event; numevents: SInt32; action: TSDL_EventAction; minType: UInt32; maxType: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PeepEvents' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Checks to see if certain event types are in the event queue.
+   *}
+
+  function SDL_HasEvent(type_: UInt32): TSDL_Bool  cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasEvent' {$ENDIF} {$ENDIF};
+  function SDL_HasEvents(minType: UInt32; maxType: UInt32): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasEvents' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This function clears events from the event queue
+   *}
+
+  procedure SDL_FlushEvent(type_: UInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FlushEvent' {$ENDIF} {$ENDIF};
+  procedure SDL_FlushEvents(minType: UInt32; maxType: UInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FlushEvents' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Polls for currently pending events.
+   *
+   *  1 if there are any pending events, or 0 if there are none available.
+   *
+   *  event - If not nil, the next event is removed from the queue and
+   *               stored in that area.
+   *}
+
+  function SDL_PollEvent(event: PSDL_Event): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PollEvent' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Waits indefinitely for the next available event.
+   *  
+   *  1, or 0 if there was an error while waiting for events.
+   *   
+   *  event - If not nil, the next event is removed from the queue and 
+   *  stored in that area.
+   *}
+
+  function SDL_WaitEvent(event: PSDL_Event): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WaitEvent' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Waits until the specified timeout (in milliseconds) for the next
+   *  available event.
+   *  
+   *  1, or 0 if there was an error while waiting for events.
+   *  
+   *  event - If not nil, the next event is removed from the queue and
+   *  stored in that area.
+   *}
+  function SDL_WaitEventTimeout(event: PSDL_Event; timeout: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WaitEventTimeout' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Add an event to the event queue.
+   *  
+   *  1 on success, 0 if the event was filtered, or -1 if the event queue
+   *  was full or there was some other error.
+   *}
+
+  function SDL_PushEvent(event: PSDL_Event): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PumpEvents' {$ENDIF} {$ENDIF};
+
+type
+  PSDL_EventFilter = ^TSDL_EventFilter;
+  {$IFNDEF GPC}
+    TSDL_EventFilter = function( userdata: Pointer; event: PSDL_Event ): Integer; cdecl;
+  {$ELSE}
+    TSDL_EventFilter = function( userdata: Pointer; event: PSDL_Event ): Integer;
+  {$ENDIF}
+
+  {**
+   *  Sets up a filter to process all events before they change internal state and
+   *  are posted to the internal event queue.
+   *
+   *  If the filter returns 1, then the event will be added to the internal queue.
+   *  If it returns 0, then the event will be dropped from the queue, but the 
+   *  internal state will still be updated.  This allows selective filtering of
+   *  dynamically arriving events.
+   *
+   *  Be very careful of what you do in the event filter function, as 
+   *  it may run in a different thread!
+   *  
+   *  There is one caveat when dealing with the SDL_QUITEVENT event type.  The
+   *  event filter is only called when the window manager desires to close the
+   *  application window.  If the event filter returns 1, then the window will
+   *  be closed, otherwise the window will remain open if possible.
+   *
+   *  If the quit event is generated by an interrupt signal, it will bypass the
+   *  internal queue and be delivered to the application at the next event poll.
+   *}
+  procedure SDL_SetEventFilter(filter: TSDL_EventFilter; userdata: Pointer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetEventFilter' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return the current event filter - can be used to "chain" filters.
+   *  If there is no event filter set, this function returns SDL_FALSE.
+   *}
+
+  function SDL_GetEventFilter(var filter: PSDL_EventFilter; var userdata: PPointer): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetEventFilter' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Add a function which is called when an event is added to the queue.
+   *}
+  procedure SDL_AddEventWatch(filter: TSDL_EventFilter; userdata: Pointer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AddEventWatch' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Remove an event watch function added with SDL_AddEventWatch()
+   *}
+  procedure SDL_DelEventWatch(filter: TSDL_EventFilter; userdata: Pointer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DelEventWatch' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Run the filter function on the current event queue, removing any
+   *  events for which the filter returns 0.
+   *}
+
+  procedure SDL_FilterEvents(filter: TSDL_EventFilter; userdata: Pointer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FilterEvents' {$ENDIF} {$ENDIF};
+
+const
+
+  SDL_QUERY   =   -1;
+  SDL_IGNORE  =    0;
+  SDL_DISABLE =    0;
+  SDL_ENABLE  =  1;
+
+  {**
+   *  This function allows you to set the state of processing certain events.
+   *   - If state is set to SDL_IGNORE, that event will be automatically
+   *     dropped from the event queue and will not event be filtered.
+   *   - If state is set to SDL_ENABLE, that event will be processed
+   *     normally.
+   *   - If state is set to SDL_QUERY, SDL_EventState() will return the
+   *     current processing state of the specified event.
+   *}
+
+  function SDL_EventState(type_: UInt32; state: SInt32): UInt8 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_EventState' {$ENDIF} {$ENDIF};
+
+  function SDL_GetEventState(type_: UInt32): UInt8;
+
+  {**
+   *  This function allocates a set of user-defined events, and returns
+   *  the beginning event number for that set of events.
+   *
+   *  If there aren't enough user-defined events left, this function
+   *  returns (Uint32)-1
+   *}
+
+  function SDL_RegisterEvents(numevents: SInt32): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RegisterEvents' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlfilesystem.inc b/src/lib/sdl2/sdlfilesystem.inc
new file mode 100644 (file)
index 0000000..d89b9e7
--- /dev/null
@@ -0,0 +1,88 @@
+
+{**
+ * \brief Get the path where the application resides.
+ *
+ * Get the "base path". This is the directory where the application was run
+ *  from, which is probably the installation directory, and may or may not
+ *  be the process's current working directory.
+ *
+ * This returns an absolute path in UTF-8 encoding, and is guaranteed to
+ *  end with a path separator ('\\' on Windows, '/' most other places).
+ *
+ * The pointer returned by this function is owned by you. Please call
+ *  SDL_free() on the pointer when you are done with it, or it will be a
+ *  memory leak. This is not necessarily a fast call, though, so you should
+ *  call this once near startup and save the string if you need it.
+ *
+ * Some platforms can't determine the application's path, and on other
+ *  platforms, this might be meaningless. In such cases, this function will
+ *  return NULL.
+ *
+ *  \return String of base dir in UTF-8 encoding, or NULL on error.
+ *
+ * \sa SDL_GetPrefPath
+ *}
+function SDL_GetBasePath(): PChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetBasePath' {$ENDIF} {$ENDIF};
+
+{**
+ * \brief Get the user-and-app-specific path where files can be written.
+ *
+ * Get the "pref dir". This is meant to be where users can write personal
+ *  files (preferences and save games, etc) that are specific to your
+ *  application. This directory is unique per user, per application.
+ *
+ * This function will decide the appropriate location in the native filesystem,
+ *  create the directory if necessary, and return a string of the absolute
+ *  path to the directory in UTF-8 encoding.
+ *
+ * On Windows, the string might look like:
+ *  "C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\"
+ *
+ * On Linux, the string might look like:
+ *  "/home/bob/.local/share/My Program Name/"
+ *
+ * On Mac OS X, the string might look like:
+ *  "/Users/bob/Library/Application Support/My Program Name/"
+ *
+ * (etc.)
+ *
+ * You specify the name of your organization (if it's not a real organization,
+ *  your name or an Internet domain you own might do) and the name of your
+ *  application. These should be untranslated proper names.
+ *
+ * Both the org and app strings may become part of a directory name, so
+ *  please follow these rules:
+ *
+ *    - Try to use the same org string (including case-sensitivity) for
+ *      all your applications that use this function.
+ *    - Always use a unique app string for each one, and make sure it never
+ *      changes for an app once you've decided on it.
+ *    - Unicode characters are legal, as long as it's UTF-8 encoded, but...
+ *    - ...only use letters, numbers, and spaces. Avoid punctuation like
+ *      "Game Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient.
+ *
+ * This returns an absolute path in UTF-8 encoding, and is guaranteed to
+ *  end with a path separator ('\\' on Windows, '/' most other places).
+ *
+ * The pointer returned by this function is owned by you. Please call
+ *  SDL_free() on the pointer when you are done with it, or it will be a
+ *  memory leak. This is not necessarily a fast call, though, so you should
+ *  call this once near startup and save the string if you need it.
+ *
+ * You should assume the path returned by this function is the only safe
+ *  place to write files (and that SDL_GetBasePath(), while it might be
+ *  writable, or even the parent of the returned path, aren't where you
+ *  should be writing things).
+ *
+ * Some platforms can't determine the pref path, and on other
+ *  platforms, this might be meaningless. In such cases, this function will
+ *  return NULL.
+ *
+ *   \param org The name of your organization.
+ *   \param app The name of your application.
+ *  \return UTF-8 string of user dir in platform-dependent notation. NULL
+ *          if there's a problem (creating directory failed, etc).
+ *
+ * \sa SDL_GetBasePath
+ *}
+function SDL_GetPrefPath(const org: PAnsiChar; const app: PAnsiChar): PChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetPrefPath' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlgamecontroller.inc b/src/lib/sdl2/sdlgamecontroller.inc
new file mode 100644 (file)
index 0000000..f758310
--- /dev/null
@@ -0,0 +1,249 @@
+//from sdl_gamecontroller.h
+
+{**
+ *   SDL_gamecontroller.h
+ *
+ *  In order to use these functions, SDL_Init() must have been called
+ *  with the ::SDL_INIT_JOYSTICK flag.  This causes SDL to scan the system
+ *  for game controllers, and load appropriate drivers.
+ *
+ *  If you would like to receive controller updates while the application
+ *  is in the background, you should set the following hint before calling
+ *  SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+ *}
+
+{* The gamecontroller structure used to identify an SDL game controller *}
+type
+  PSDL_GameController = ^TSDL_GameController;
+  TSDL_GameController = Pointer; //todo
+
+  TSDL_GameControllerBindType = (SDL_CONTROLLER_BINDTYPE_NONE,
+                                 SDL_CONTROLLER_BINDTYPE_BUTTON,
+                                 SDL_CONTROLLER_BINDTYPE_AXIS,
+                                 SDL_CONTROLLER_BINDTYPE_HAT);
+
+  {**
+   *  Get the SDL joystick layer binding for this controller button/axis mapping
+   *}
+  THat = record
+    hat: Integer;
+    hat_mask: Integer;
+  end;
+
+  TSDL_GameControllerButtonBind = record
+    bindType: TSDL_GameControllerBindType;
+    case Integer of
+      0: ( button: Integer; );
+      1: ( axis: Integer; );
+      2: ( hat: THat; );
+  end;
+
+  {**
+   *  To count the number of game controllers in the system for the following:
+   *  int nJoysticks = SDL_NumJoysticks();
+   *  int nGameControllers = 0;
+   *  for ( int i = 0; i < nJoysticks; i++ ) {
+   *      if ( SDL_IsGameController(i) ) {
+   *          nGameControllers++;
+   *
+   *
+   *
+   *  Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is:
+   *  guid,name,mappings
+   *
+   *  Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones.
+   *  Under Windows there is a reserved GUID of "xinput" that covers any XInput devices.
+   *  The mapping format for joystick is:
+   *      bX - a joystick button, index X
+   *      hX.Y - hat X with value Y
+   *      aX - axis X of the joystick
+   *  Buttons can be used as a controller axis and vice versa.
+   *
+   *  This string shows an example of a valid mapping for a controller
+   *  "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7",
+   *
+   *}
+
+  {**
+   *  Add or update an existing mapping configuration
+   *
+   *  1 if mapping is added, 0 if updated, -1 on error
+   *}
+function SDL_GameControllerAddMapping( mappingString: PAnsiChar ): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerAddMapping' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Load a set of mappings from a seekable SDL data stream (memory or file), filtered by the current SDL_GetPlatform()
+   *  A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt
+   *
+   *  If freerw is non-zero, the stream will be closed after being read.
+   * 
+   *  Returns number of mappings added, -1 on error
+   *}
+function SDL_GameControllerAddMappingsFromRW(rw: PSDL_RWops; freerw: SInt32):SInt32;
+   cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerAddMappingsFromRW' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get a mapping string for a GUID
+   *
+   *   the mapping string.  Must be freed with SDL_free.  Returns NULL if no mapping is available
+   *}
+function SDL_GameControllerMappingForGUID( guid: TSDL_JoystickGUID ): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerMappingForGUID' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get a mapping string for an open GameController
+   *
+   *   the mapping string.  Must be freed with SDL_free.  Returns NULL if no mapping is available
+   *}
+function SDL_GameControllerMapping( gamecontroller: PSDL_GameController ): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerMapping' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Is the joystick on this index supported by the game controller interface?
+   *}
+function SDL_IsGameController(joystick_index: Integer): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IsGameController' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the implementation dependent name of a game controller.
+   *  This can be called before any controllers are opened.
+   *  If no name can be found, this function returns NULL.
+   *}
+function SDL_GameControllerNameForIndex(joystick_index: Integer): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerNameForIndex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Open a game controller for use.
+   *  The index passed as an argument refers to the N'th game controller on the system.
+   *  This index is the value which will identify this controller in future controller
+   *  events.
+   *
+   *   A controller identifier, or NULL if an error occurred.
+   *}
+function SDL_GameControllerOpen(joystick_index: Integer): PSDL_GameController cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerOpen' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return the name for this currently opened controller
+   *}
+function SDL_GameControllerName(gamecontroller: PSDL_GameController): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerName' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns SDL_TRUE if the controller has been opened and currently connected,
+   *  or SDL_FALSE if it has not.
+   *}
+function SDL_GameControllerGetAttached(gamecontroller: PSDL_GameController): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetAttached' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the underlying joystick object used by a controller
+   *}
+function SDL_GameControllerGetJoystick(gamecontroller: PSDL_GameController): PSDL_Joystick cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetJoystick' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Enable/disable controller event polling.
+   *
+   *  If controller events are disabled, you must call SDL_GameControllerUpdate()
+   *  yourself and check the state of the controller when you want controller
+   *  information.
+   *
+   *  The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE.
+   *}
+function SDL_GameControllerEventState(state: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerEventState' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Update the current state of the open game controllers.
+   *
+   *  This is called automatically by the event loop if any game controller
+   *  events are enabled.
+   *}
+procedure SDL_GameControllerUpdate() cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerUpdate' {$ENDIF} {$ENDIF};
+
+  {**
+   *  The list of axes available from a controller
+   *}
+
+const
+  SDL_CONTROLLER_AXIS_INVALID = -1;
+  SDL_CONTROLLER_AXIS_LEFTX = 0;
+  SDL_CONTROLLER_AXIS_LEFTY = 1;
+  SDL_CONTROLLER_AXIS_RIGHTX = 2;
+  SDL_CONTROLLER_AXIS_RIGHTY = 3;
+  SDL_CONTROLLER_AXIS_TRIGGERLEFT = 4;
+  SDL_CONTROLLER_AXIS_TRIGGERRIGHT = 5;
+  SDL_CONTROLLER_AXIS_MAX = 6;
+type
+  TSDL_GameControllerAxis = Byte;
+
+  {**
+   *  turn this string into a axis mapping
+   *}
+function SDL_GameControllerGetAxisFromString(pchString: PAnsiChar): TSDL_GameControllerAxis cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetAxisFromString' {$ENDIF} {$ENDIF};
+
+  {**
+   *  turn this axis enum into a string mapping
+   *}
+function SDL_GameControllerGetStringForAxis(axis: TSDL_GameControllerAxis): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetStringForAxis' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the SDL joystick layer binding for this controller button mapping
+   *}
+function SDL_GameControllerGetBindForAxis(gamecontroller: PSDL_GameController; axis: TSDL_GameControllerAxis): TSDL_GameControllerButtonBind cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetBindForAxis' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the current state of an axis control on a game controller.
+   *
+   *  The state is a value ranging from -32768 to 32767.
+   *
+   *  The axis indices start at index 0.
+   *}
+function SDL_GameControllerGetAxis(gamecontroller: PSDL_GameController; axis: TSDL_GameControllerAxis): SInt16 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetAxis' {$ENDIF} {$ENDIF};
+
+  {**
+   *  The list of buttons available from a controller
+   *}
+const
+  SDL_CONTROLLER_BUTTON_INVALID = -1;
+  SDL_CONTROLLER_BUTTON_A = 0;
+  SDL_CONTROLLER_BUTTON_B = 1;
+  SDL_CONTROLLER_BUTTON_X = 2;
+  SDL_CONTROLLER_BUTTON_Y = 3;
+  SDL_CONTROLLER_BUTTON_BACK = 4;
+  SDL_CONTROLLER_BUTTON_GUIDE = 5;
+  SDL_CONTROLLER_BUTTON_START = 6;
+  SDL_CONTROLLER_BUTTON_LEFTSTICK = 7;
+  SDL_CONTROLLER_BUTTON_RIGHTSTICK = 8;
+  SDL_CONTROLLER_BUTTON_LEFTSHOULDER = 9;
+  SDL_CONTROLLER_BUTTON_RIGHTSHOULDER = 10;
+  SDL_CONTROLLER_BUTTON_DPAD_UP = 11;
+  SDL_CONTROLLER_BUTTON_DPAD_DOWN = 12;
+  SDL_CONTROLLER_BUTTON_DPAD_LEFT = 13;
+  SDL_CONTROLLER_BUTTON_DPAD_RIGHT = 14;
+  SDL_CONTROLLER_BUTTON_MAX = 15;
+type
+  TSDL_GameControllerButton = Byte;
+
+  {**
+   *  turn this string into a button mapping
+   *}
+function SDL_GameControllerGetButtonFromString(pchString: PAnsiChar): TSDL_GameControllerButton cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetButtonFromString' {$ENDIF} {$ENDIF};
+
+  {**
+   *  turn this button enum into a string mapping
+   *}
+function SDL_GameControllerGetStringForButton(button: TSDL_GameControllerButton): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetStringForButton' {$ENDIF} {$ENDIF};
+
+{**
+ *  Get the SDL joystick layer binding for this controller button mapping
+ *}
+function SDL_GameControllerGetBindForButton(gamecontroller: PSDL_GameController; button: TSDL_GameControllerButton): TSDL_GameControllerButtonBind cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetBindForButton' {$ENDIF} {$ENDIF};
+
+
+{**
+ *  Get the current state of a button on a game controller.
+ *
+ *  The button indices start at index 0.
+ *}
+function SDL_GameControllerGetButton(gamecontroller: PSDL_GameController; button: TSDL_GameControllerButton): UInt8 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerGetButton' {$ENDIF} {$ENDIF};
+
+{**
+ *  Close a controller previously opened with SDL_GameControllerOpen().
+ *}
+procedure SDL_GameControllerClose(gamecontroller: PSDL_GameController) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GameControllerClose' {$ENDIF} {$ENDIF};
+
+
+function SDL_GameControllerAddMappingsFromFile(Const FilePath:PAnsiChar):SInt32;
diff --git a/src/lib/sdl2/sdlgesture.inc b/src/lib/sdl2/sdlgesture.inc
new file mode 100644 (file)
index 0000000..b4640fd
--- /dev/null
@@ -0,0 +1,35 @@
+//from "sdl_gesture.h"
+
+type
+  TSDL_GestureID = SInt64;
+
+  {* Function prototypes *}
+
+  {**
+   *  Begin Recording a gesture on the specified touch, or all touches (-1)
+   *
+   *
+   *}
+function SDL_RecordGesture(touchId: TSDL_TouchID): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RecordGesture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Save all currently loaded Dollar Gesture templates
+   *
+   *
+   *}
+function SDL_SaveAllDollarTemplates(src: PSDL_RWops): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SaveAllDollarTemplates' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Save a currently loaded Dollar Gesture template
+   *
+   *
+   *}
+function SDL_SaveDollarTemplate(gestureId: TSDL_GestureID; src: PSDL_RWops): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SaveDollarTemplate' {$ENDIF} {$ENDIF};
+
+
+  {**
+   *  Load Dollar Gesture templates from a file
+   *
+   *
+   *}
+function SDL_LoadDollarTemplates(touchId: TSDL_TouchID; src: PSDL_RWops): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LoadDollarTemplates' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlhaptic.inc b/src/lib/sdl2/sdlhaptic.inc
new file mode 100644 (file)
index 0000000..b0ef8f4
--- /dev/null
@@ -0,0 +1,1157 @@
+//from "sdl_haptic.h"
+
+{**
+ *
+ *   The SDL Haptic subsystem allows you to control haptic (force feedback)
+ *   devices.
+ *
+ *  The basic usage is as follows:
+ *   - Initialize the Subsystem (::SDL_INIT_HAPTIC).
+ *   - Open a Haptic Device.
+ *    - SDL_HapticOpen() to open from index.
+ *    - SDL_HapticOpenFromJoystick() to open from an existing joystick.
+ *   - Create an effect (::SDL_HapticEffect).
+ *   - Upload the effect with SDL_HapticNewEffect().
+ *   - Run the effect with SDL_HapticRunEffect().
+ *   - (optional) Free the effect with SDL_HapticDestroyEffect().
+ *   - Close the haptic device with SDL_HapticClose().
+ *
+ *  Simple rumble example:
+ *
+ *    SDL_Haptic *haptic;
+ *
+ *    // Open the device
+ *    haptic = SDL_HapticOpen( 0 );
+ *    if (haptic == NULL)
+ *       return -1;
+ *
+ *    // Initialize simple rumble
+ *    if (SDL_HapticRumbleInit( haptic ) != 0)
+ *       return -1;
+ *
+ *    // Play effect at 50% strength for 2 seconds
+ *    if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0)
+ *       return -1;
+ *    SDL_Delay( 2000 );
+ *
+ *    // Clean up
+ *    SDL_HapticClose( haptic );
+ *
+ *
+ *  Complete example:
+ *
+ * int test_haptic( SDL_Joystick * joystick )
+ *    SDL_Haptic *haptic;
+ *    SDL_HapticEffect effect;
+ *    int effect_id;
+ *
+ *    // Open the device
+ *    haptic = SDL_HapticOpenFromJoystick( joystick );
+ *    if (haptic == NULL) return -1; // Most likely joystick isn't haptic
+ *
+ *    // See if it can do sine waves
+ *    if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0)
+ *       SDL_HapticClose(haptic); // No sine effect
+ *       return -1;
+ *
+ *
+ *    // Create the effect
+ *    memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default
+ *    effect.type = SDL_HAPTIC_SINE;
+ *    effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates
+ *    effect.periodic.direction.dir[0] = 18000; // Force comes from south
+ *    effect.periodic.period = 1000; // 1000 ms
+ *    effect.periodic.magnitude = 20000; // 20000/32767 strength
+ *    effect.periodic.length = 5000; // 5 seconds long
+ *    effect.periodic.attack_length = 1000; // Takes 1 second to get max strength
+ *    effect.periodic.fade_length = 1000; // Takes 1 second to fade away
+ *
+ *    // Upload the effect
+ *    effect_id = SDL_HapticNewEffect( haptic, &effect );
+ *
+ *    // Test the effect
+ *    SDL_HapticRunEffect( haptic, effect_id, 1 );
+ *    SDL_Delay( 5000); // Wait for the effect to finish
+ *
+ *    // We destroy the effect, although closing the device also does this
+ *    SDL_HapticDestroyEffect( haptic, effect_id );
+ *
+ *    // Close the device
+ *    SDL_HapticClose(haptic);
+ *
+ *    return 0; // Success
+ *
+ *
+ *
+ * You can also find out more information on my blog:
+ * http://bobbens.dyndns.org/journal/2010/sdl_haptic/
+ *
+ *  Edgar Simo Serra
+ *}
+
+{$I jedi.inc}
+
+  {**
+   *   SDL_Haptic
+   *
+   *  The haptic structure used to identify an SDL haptic.
+   *
+   *   SDL_HapticOpen
+   *   SDL_HapticOpenFromJoystick
+   *   SDL_HapticClose
+   *}
+type
+  PSDL_Haptic = ^TSDL_Haptic;
+  TSDL_Haptic = record end;
+
+  {**
+   *   Haptic features
+   *
+   *  Different haptic features a device can have.
+   *}
+
+  {**
+   *   Haptic effects
+   *}
+
+  {**
+   *   Constant effect supported.
+   *
+   *  Constant haptic effect.
+   *
+   *   SDL_HapticCondition
+   *}
+const
+  SDL_HAPTIC_CONSTANT = (1 shl 0);
+
+  {**
+   *   Sine wave effect supported.
+   *
+   *  Periodic haptic effect that simulates sine waves.
+   *
+   *   SDL_HapticPeriodic
+   *}
+const
+  SDL_HAPTIC_SINE     = (1 shl 1);
+
+  {**
+   *   Square wave effect supported.
+   *
+   *  Periodic haptic effect that simulates square waves.
+   *
+   *   SDL_HapticPeriodic
+   *}
+const
+  SDL_HAPTIC_SQUARE   = (1 shl 2);
+
+  {**
+   *   Triangle wave effect supported.
+   *
+   *  Periodic haptic effect that simulates triangular waves.
+   *
+   *   SDL_HapticPeriodic
+   *}
+const
+  SDL_HAPTIC_TRIANGLE = (1 shl 3);
+
+  {**
+   *   Sawtoothup wave effect supported.
+   *
+   *  Periodic haptic effect that simulates saw tooth up waves.
+   *
+   *   SDL_HapticPeriodic
+   *}
+const
+  SDL_HAPTIC_SAWTOOTHUP = (1 shl 4);
+
+  {**
+   *   Sawtoothdown wave effect supported.
+   *
+   *  Periodic haptic effect that simulates saw tooth down waves.
+   *
+   *   SDL_HapticPeriodic
+   *}
+const
+  SDL_HAPTIC_SAWTOOTHDOWN = (1 shl 5);
+
+  {**
+   *   Ramp effect supported.
+   *
+   *  Ramp haptic effect.
+   *
+   *   SDL_HapticRamp
+   *}
+const
+  SDL_HAPTIC_RAMP = (1 shl 6);
+
+  {**
+   *   Spring effect supported - uses axes position.
+   *
+   *  Condition haptic effect that simulates a spring.  Effect is based on the
+   *  axes position.
+   *
+   *   SDL_HapticCondition
+   *}
+const
+  SDL_HAPTIC_SPRING = (1 shl 7);
+
+  {**
+   *   Damper effect supported - uses axes velocity.
+   *
+   *  Condition haptic effect that simulates dampening.  Effect is based on the
+   *  axes velocity.
+   *
+   *   SDL_HapticCondition
+   *}
+const
+  SDL_HAPTIC_DAMPER = (1 shl 8);
+
+  {**
+   *   Inertia effect supported - uses axes acceleration.
+   *
+   *  Condition haptic effect that simulates inertia.  Effect is based on the axes
+   *  acceleration.
+   *
+   *   SDL_HapticCondition
+   *}
+const
+  SDL_HAPTIC_INERTIA = (1 shl 9);
+
+  {**
+   *   Friction effect supported - uses axes movement.
+   *
+   *  Condition haptic effect that simulates friction.  Effect is based on the
+   *  axes movement.
+   *
+   *   SDL_HapticCondition
+   *}
+const
+  SDL_HAPTIC_FRICTION = (1 shl 10);
+
+  {**
+   *   Custom effect is supported.
+   *
+   *  User defined custom haptic effect.
+   *}
+const
+  SDL_HAPTIC_CUSTOM = (1 shl 11);
+
+  {*Haptic effects*}
+
+  {* These last few are features the device has, not effects *}
+
+  {**
+   *   Device can set global gain.
+   *
+   *  Device supports setting the global gain.
+   *
+   *   SDL_HapticSetGain
+   *}
+const
+  SDL_HAPTIC_GAIN = (1 shl 12);
+
+  {**
+   *   Device can set autocenter.
+   *
+   *  Device supports setting autocenter.
+   *
+   *   SDL_HapticSetAutocenter
+   *}
+const
+  SDL_HAPTIC_AUTOCENTER = (1 shl 13);
+
+  {**
+   *   Device can be queried for effect status.
+   *
+   *  Device can be queried for effect status.
+   *
+   *   SDL_HapticGetEffectStatus
+   *}
+const
+  SDL_HAPTIC_STATUS = (1 shl 14);
+
+  {**
+   *   Device can be paused.
+   *
+   *   SDL_HapticPause
+   *   SDL_HapticUnpause
+   *}
+const
+  SDL_HAPTIC_PAUSE = (1 shl 15);
+
+  {**
+   *  Direction encodings
+   *}
+
+  {**
+   *   Uses polar coordinates for the direction.
+   *
+   *   SDL_HapticDirection
+   *}
+const
+  SDL_HAPTIC_POLAR = 0;
+
+  {**
+   *   Uses cartesian coordinates for the direction.
+   *
+   *   SDL_HapticDirection
+   *}
+const
+  SDL_HAPTIC_CARTESIAN = 1;
+
+  {**
+   *   Uses spherical coordinates for the direction.
+   *
+   *   SDL_HapticDirection
+   *}
+const
+  SDL_HAPTIC_SPHERICAL = 2;
+
+  {*Direction encodings*}
+
+  {*Haptic features*}
+
+  {*
+   * Misc defines.
+   *}
+
+  {**
+   *  Used to play a device an infinite number of times.
+   *
+   *  SDL_HapticRunEffect
+   *}
+const
+  //SDL_HAPTIC_INFINITY = 4294967295U;
+  SDL_HAPTIC_INFINITY = 4294967295; //right?!
+
+  {**
+   *   Structure that represents a haptic direction.
+   *
+   *  Directions can be specified by:
+   *   - SDL_HAPTIC_POLAR : Specified by polar coordinates.
+   *   - SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates.
+   *   - SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates.
+   *
+   *  Cardinal directions of the haptic device are relative to the positioning
+   *  of the device.  North is considered to be away from the user.
+   *
+   *  The following diagram represents the cardinal directions:
+   *
+                   .--.
+                   |__| .-------.
+                   |=.| |.-----.|
+                   |--| ||     ||
+                   |  | |'-----'|
+                   |__|~')_____('
+                     [ COMPUTER ]
+
+
+                       North (0,-1)
+                           ^
+                           |
+                           |
+      (1,0)  West <----[ HAPTIC ]----> East (-1,0)
+                           |
+                           |
+                           v
+                        South (0,1)
+
+
+                        [ USER ]
+                          \|||/
+                          (o o)
+                    ---ooO-(_)-Ooo---
+
+   *
+   *  If type is SDL_HAPTIC_POLAR, direction is encoded by hundredths of a
+   *  degree starting north and turning clockwise.  ::SDL_HAPTIC_POLAR only uses
+   *  the first dir parameter.  The cardinal directions would be:
+   *   - North: 0 (0 degrees)
+   *   - East: 9000 (90 degrees)
+   *   - South: 18000 (180 degrees)
+   *   - West: 27000 (270 degrees)
+   *
+   *  If type is SDL_HAPTIC_CARTESIAN, direction is encoded by three positions
+   *  (X axis, Y axis and Z axis (with 3 axes)).  ::SDL_HAPTIC_CARTESIAN uses
+   *  the first three dir parameters.  The cardinal directions would be:
+   *   - North:  0,-1, 0
+   *   - East:  -1, 0, 0
+   *   - South:  0, 1, 0
+   *   - West:   1, 0, 0
+   *
+   *  The Z axis represents the height of the effect if supported, otherwise
+   *  it's unused.  In cartesian encoding (1, 2) would be the same as (2, 4), you
+   *  can use any multiple you want, only the direction matters.
+   *
+   *  If type is SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations.
+   *  The first two dir parameters are used.  The dir parameters are as
+   *  follows (all values are in hundredths of degrees):
+   *   - Degrees from (1, 0) rotated towards (0, 1).
+   *   - Degrees towards (0, 0, 1) (device needs at least 3 axes).
+   *
+   *
+   *  Example of force coming from the south with all encodings (force coming
+   *  from the south means the user will have to pull the stick to counteract):
+   *
+   *  SDL_HapticDirection direction;
+   *
+   *  // Cartesian directions
+   *  direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding.
+   *  direction.dir[0] = 0; // X position
+   *  direction.dir[1] = 1; // Y position
+   *  // Assuming the device has 2 axes, we don't need to specify third parameter.
+   *
+   *  // Polar directions
+   *  direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding.
+   *  direction.dir[0] = 18000; // Polar only uses first parameter
+   *
+   *  // Spherical coordinates
+   *  direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding
+   *  direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters.
+   *
+   *
+   *   SDL_HAPTIC_POLAR
+   *   SDL_HAPTIC_CARTESIAN
+   *   SDL_HAPTIC_SPHERICAL
+   *   SDL_HapticEffect
+   *   SDL_HapticNumAxes
+   *}
+type
+  TSDL_HapticDirection = record
+    _type: UInt8;               {**< The type of encoding. *}
+    dir: array[0..2] of SInt32; {**< The encoded direction. *}
+  end;
+
+  {**
+   *   A structure containing a template for a Constant effect.
+   *
+   *  The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect.
+   *
+   *  A constant effect applies a constant force in the specified direction
+   *  to the joystick.
+   *
+   *   SDL_HAPTIC_CONSTANT
+   *   SDL_HapticEffect
+   *}
+type
+  TSDL_HapticConstant = record
+    {* Header *}
+    _type: UInt16;                   {**< SDL_HAPTIC_CONSTANT *}
+    direction: TSDL_HapticDirection; {**< Direction of the effect. *}
+
+    {* Replay *}
+    length: UInt32;          {**< Duration of the effect. *}
+    delay: UInt16;           {**< Delay before starting the effect. *}
+
+    {* Trigger *}
+    button: UInt16;          {**< Button that triggers the effect. *}
+    interval: UInt16;        {**< How soon it can be triggered again after button. *}
+
+    {* Constant *}
+    level: SInt16;           {**< Strength of the constant effect. *}
+
+    {* Envelope *}
+    attack_length: UInt16;   {**< Duration of the attack. *}
+    attack_level: UInt16;    {**< Level at the start of the attack. *}
+    fade_length: UInt16;     {**< Duration of the fade. *}
+    fade_level: UInt16;      {**< Level at the end of the fade. *}
+  end;
+
+  {**
+   *   A structure containing a template for a Periodic effect.
+   *
+   *  The struct handles the following effects:
+   *   - SDL_HAPTIC_SINE
+   *   - SDL_HAPTIC_SQUARE
+   *   - SDL_HAPTIC_TRIANGLE
+   *   - SDL_HAPTIC_SAWTOOTHUP
+   *   - SDL_HAPTIC_SAWTOOTHDOWN
+   *
+   *  A periodic effect consists in a wave-shaped effect that repeats itself
+   *  over time.  The type determines the shape of the wave and the parameters
+   *  determine the dimensions of the wave.
+   *
+   *  Phase is given by hundredth of a cycle meaning that giving the phase a value
+   *  of 9000 will displace it 25% of its period.  Here are sample values:
+   *   -     0: No phase displacement.
+   *   -  9000: Displaced 25% of its period.
+   *   - 18000: Displaced 50% of its period.
+   *   - 27000: Displaced 75% of its period.
+   *   - 36000: Displaced 100% of its period, same as 0, but 0 is preferred.
+   *
+   *  Examples:
+   *
+      SDL_HAPTIC_SINE
+        __      __      __      __
+       /  \    /  \    /  \    /
+      /    \__/    \__/    \__/
+
+      SDL_HAPTIC_SQUARE
+       __    __    __    __    __
+      |  |  |  |  |  |  |  |  |  |
+      |  |__|  |__|  |__|  |__|  |
+
+      SDL_HAPTIC_TRIANGLE
+        /\    /\    /\    /\    /\
+       /  \  /  \  /  \  /  \  /
+      /    \/    \/    \/    \/
+
+      SDL_HAPTIC_SAWTOOTHUP
+        /|  /|  /|  /|  /|  /|  /|
+       / | / | / | / | / | / | / |
+      /  |/  |/  |/  |/  |/  |/  |
+
+      SDL_HAPTIC_SAWTOOTHDOWN
+      \  |\  |\  |\  |\  |\  |\  |
+       \ | \ | \ | \ | \ | \ | \ |
+        \|  \|  \|  \|  \|  \|  \|
+
+   *
+   *   SDL_HAPTIC_SINE
+   *   SDL_HAPTIC_SQUARE
+   *   SDL_HAPTIC_TRIANGLE
+   *   SDL_HAPTIC_SAWTOOTHUP
+   *   SDL_HAPTIC_SAWTOOTHDOWN
+   *   SDL_HapticEffect
+   *}
+type
+  TSDL_HapticPeriodic = record
+    { Header *}
+    _type: UInt16;        {**< SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE,
+                               SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or
+                               SDL_HAPTIC_SAWTOOTHDOWN *}
+    direction: TSDL_HapticDirection;  {**< Direction of the effect. *}
+
+    {* Replay *}
+    length: UInt32;          {**< Duration of the effect. *}
+    delay: UInt16;           {**< Delay before starting the effect. *}
+
+    {* Trigger *}
+    button: UInt16;          {**< Button that triggers the effect. *}
+    interval: UInt16;        {**< How soon it can be triggered again after button. *}
+
+    {* Periodic *}
+    period: UInt16;          {**< Period of the wave. *}
+    magnitude: SInt16;       {**< Peak value. *}
+    offset: SInt16;          {**< Mean value of the wave. *}
+    phase: UInt16;           {**< Horizontal shift given by hundredth of a cycle. *}
+
+    {* Envelope *}
+    attack_length: UInt16;   {**< Duration of the attack. *}
+    attack_level: UInt16;    {**< Level at the start of the attack. *}
+    fade_length: UInt16;     {**< Duration of the fade. *}
+    fade_level: UInt16;      {**< Level at the end of the fade. *}
+  end;
+
+  {**
+   *   A structure containing a template for a Condition effect.
+   *
+   *  The struct handles the following effects:
+   *   - SDL_HAPTIC_SPRING: Effect based on axes position.
+   *   - SDL_HAPTIC_DAMPER: Effect based on axes velocity.
+   *   - SDL_HAPTIC_INERTIA: Effect based on axes acceleration.
+   *   - SDL_HAPTIC_FRICTION: Effect based on axes movement.
+   *
+   *  Direction is handled by condition internals instead of a direction member.
+   *  The condition effect specific members have three parameters.  The first
+   *  refers to the X axis, the second refers to the Y axis and the third
+   *  refers to the Z axis.  The right terms refer to the positive side of the
+   *  axis and the left terms refer to the negative side of the axis.  Please
+   *  refer to the ::SDL_HapticDirection diagram for which side is positive and
+   *  which is negative.
+   *
+   *   SDL_HapticDirection
+   *   SDL_HAPTIC_SPRING
+   *   SDL_HAPTIC_DAMPER
+   *   SDL_HAPTIC_INERTIA
+   *   SDL_HAPTIC_FRICTION
+   *   SDL_HapticEffect
+   *}
+type
+  TSDL_HapticCondition = record
+    {* Header *}
+    _type: UInt16;                    {**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER,
+                                           SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION *}
+    direction: TSDL_HapticDirection;  {**< Direction of the effect - Not used ATM. *}
+
+    {* Replay *}
+    length: UInt32;                   {**< Duration of the effect. *}
+    delay: UInt16;                    {**< Delay before starting the effect. *}
+
+    {* Trigger *}
+    button: UInt16;                   {**< Button that triggers the effect. *}
+    interval: UInt16;                 {**< How soon it can be triggered again after button. *}
+
+    {* Condition *}
+    right_sat: array[0..2] of UInt16; {**< Level when joystick is to the positive side. *}
+    left_sat: array[0..2] of UInt16;  {**< Level when joystick is to the negative side. *}
+    right_coeff: array[0..2] of SInt16;  {**< How fast to increase the force towards the positive side. *}
+    left_coeff: array[0..2] of SInt16;   {**< How fast to increase the force towards the negative side. *}
+    deadband: array[0..2] of UInt16;     {**< Size of the dead zone. *}
+    center: array[0..2] of SInt16;       {**< Position of the dead zone. *}
+  end;
+
+  {**
+   *   A structure containing a template for a Ramp effect.
+   *
+   *  This struct is exclusively for the ::SDL_HAPTIC_RAMP effect.
+   *
+   *  The ramp effect starts at start strength and ends at end strength.
+   *  It augments in linear fashion.  If you use attack and fade with a ramp
+   *  the effects get added to the ramp effect making the effect become
+   *  quadratic instead of linear.
+   *
+   *   SDL_HAPTIC_RAMP
+   *   SDL_HapticEffect
+   *}
+type
+  TSDL_HapticRamp = record
+    {* Header *}
+    _type: UInt16;                    {**< SDL_HAPTIC_RAMP *}
+    direction: TSDL_HapticDirection;  {**< Direction of the effect. *}
+
+    {* Replay *}
+    length: UInt32;                   {**< Duration of the effect. *}
+    delay: UInt16;                    {**< Delay before starting the effect. *}
+
+    {* Trigger *}
+    button: UInt16;                   {**< Button that triggers the effect. *}
+    interval: UInt16;                 {**< How soon it can be triggered again after button. *}
+
+    {* Ramp *}
+    start: SInt16;                    {**< Beginning strength level. *}
+    _end: SInt16;                     {**< Ending strength level. *}
+
+    {* Envelope *}
+    attack_length: UInt16;            {**< Duration of the attack. *}
+    attack_level: UInt16;             {**< Level at the start of the attack. *}
+    fade_length: UInt16;              {**< Duration of the fade. *}
+    fade_level: UInt16;               {**< Level at the end of the fade. *}
+  end;
+
+  {**
+   *   A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect.
+   *
+   *  A custom force feedback effect is much like a periodic effect, where the
+   *  application can define its exact shape.  You will have to allocate the
+   *  data yourself.  Data should consist of channels * samples Uint16 samples.
+   *
+   *  If channels is one, the effect is rotated using the defined direction.
+   *  Otherwise it uses the samples in data for the different axes.
+   *
+   *   SDL_HAPTIC_CUSTOM
+   *   SDL_HapticEffect
+   *}
+type
+  TSDL_HapticCustom = record
+    {* Header *}
+    _type: UInt16;                    {**< SDL_HAPTIC_CUSTOM *}
+    direction: TSDL_HapticDirection;  {**< Direction of the effect. *}
+
+    {* Replay *}
+    length: UInt32;                   {**< Duration of the effect. *}
+    delay: UInt16;                    {**< Delay before starting the effect. *}
+
+    {* Trigger *}
+    button: UInt16;                   {**< Button that triggers the effect. *}
+    interval: UInt16;                 {**< How soon it can be triggered again after button. *}
+
+    {* Custom *}
+    channels: UInt8;                  {**< Axes to use, minimum of one. *}
+    period: UInt16;                   {**< Sample periods. *}
+    samples: UInt16;                  {**< Amount of samples. *}
+    data: PUInt16;                    {**< Should contain channels*samples items. *}
+
+    {* Envelope *}
+    attack_length: UInt16;            {**< Duration of the attack. *}
+    attack_level: UInt16;             {**< Level at the start of the attack. *}
+    fade_length: UInt16;              {**< Duration of the fade. *}
+    fade_level: UInt16;               {**< Level at the end of the fade. *}
+  end;
+
+  {**
+   *   The generic template for any haptic effect.
+   *
+   *  All values max at 32767 (0x7FFF).  Signed values also can be negative.
+   *  Time values unless specified otherwise are in milliseconds.
+   *
+   *  You can also pass SDL_HAPTIC_INFINITY to length instead of a 0-32767
+   *  value.  Neither delay, interval, attack_length nor fade_length support
+   *  SDL_HAPTIC_INFINITY.  Fade will also not be used since effect never ends.
+   *
+   *  Additionally, the SDL_HAPTIC_RAMP effect does not support a duration of
+   *  SDL_HAPTIC_INFINITY.
+   *
+   *  Button triggers may not be supported on all devices, it is advised to not
+   *  use them if possible.  Buttons start at index 1 instead of index 0 like
+   *  the joystick.
+   *
+   *  If both attack_length and fade_level are 0, the envelope is not used,
+   *  otherwise both values are used.
+   *
+   *  Common parts:
+   *
+   *  // Replay - All effects have this
+   *  Uint32 length;        // Duration of effect (ms).
+   *  Uint16 delay;         // Delay before starting effect.
+   *
+   *  // Trigger - All effects have this
+   *  Uint16 button;        // Button that triggers effect.
+   *  Uint16 interval;      // How soon before effect can be triggered again.
+   *
+   *  // Envelope - All effects except condition effects have this
+   *  Uint16 attack_length; // Duration of the attack (ms).
+   *  Uint16 attack_level;  // Level at the start of the attack.
+   *  Uint16 fade_length;   // Duration of the fade out (ms).
+   *  Uint16 fade_level;    // Level at the end of the fade.
+   *
+   *
+   *
+   *  Here we have an example of a constant effect evolution in time:
+   *
+      Strength
+      ^
+      |
+      |    effect level -->  _________________
+      |                     /                 \
+      |                    /                   \
+      |                   /                     \
+      |                  /                       \
+      | attack_level --> |                        \
+      |                  |                        |  <---  fade_level
+      |
+      +--------------------------------------------------> Time
+                         [--]                 [---]
+                         attack_length        fade_length
+
+      [------------------][-----------------------]
+      delay               length
+
+   *
+   *  Note either the attack_level or the fade_level may be above the actual
+   *  effect level.
+   *
+   *   SDL_HapticConstant
+   *   SDL_HapticPeriodic
+   *   SDL_HapticCondition
+   *   SDL_HapticRamp
+   *   SDL_HapticCustom
+   *}
+type
+  PSDL_HapticEffect = ^TSDL_HapticEffect;
+  TSDL_HapticEffect = record
+    {* Common for all force feedback effects *}
+    _type: UInt16;                  {**< Effect type. *}
+    case UInt16 of
+      0: (constant: TSDL_HapticConstant;);    {**< Constant effect. *}
+      1: (periodic: TSDL_HapticPeriodic;);    {**< Periodic effect. *}
+      2: (condition: TSDL_HapticCondition;);  {**< Condition effect. *}
+      3: (ramp: TSDL_HapticRamp;);            {**< Ramp effect. *}
+      4: (custom: TSDL_HapticCustom;);        {**< Custom effect. *}
+  end;
+
+  {* Function prototypes *}
+
+  {**
+   *   Count the number of haptic devices attached to the system.
+   *
+   *   Number of haptic devices detected on the system.
+   *}
+function SDL_NumHaptics: Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_NumHaptics' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Get the implementation dependent name of a Haptic device.
+   *
+   *  This can be called before any joysticks are opened.
+   *  If no name can be found, this function returns NULL.
+   *
+   *   device_index Index of the device to get its name.
+   *   Name of the device or NULL on error.
+   *
+   *   SDL_NumHaptics
+   *}
+function SDL_HapticName(device_index: Integer): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticName' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Opens a Haptic device for usage.
+   *
+   *  The index passed as an argument refers to the N'th Haptic device on this
+   *  system.
+   *
+   *  When opening a haptic device, its gain will be set to maximum and
+   *  autocenter will be disabled.  To modify these values use
+   *  SDL_HapticSetGain() and SDL_HapticSetAutocenter().
+   *
+   *   device_index Index of the device to open.
+   *   Device identifier or NULL on error.
+   *
+   *   SDL_HapticIndex
+   *   SDL_HapticOpenFromMouse
+   *   SDL_HapticOpenFromJoystick
+   *   SDL_HapticClose
+   *   SDL_HapticSetGain
+   *   SDL_HapticSetAutocenter
+   *   SDL_HapticPause
+   *   SDL_HapticStopAll
+   *}
+function SDL_HapticOpen(device_index: Integer): PSDL_Haptic cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpen' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Checks if the haptic device at index has been opened.
+   *
+   *   device_index Index to check to see if it has been opened.
+   *   1 if it has been opened or 0 if it hasn't.
+   *
+   *   SDL_HapticOpen
+   *   SDL_HapticIndex
+   *}
+function SDL_HapticOpened(device_index: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpened' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Gets the index of a haptic device.
+   *
+   *   haptic Haptic device to get the index of.
+   *   The index of the haptic device or -1 on error.
+   *
+   *   SDL_HapticOpen
+   *   SDL_HapticOpened
+   *}
+function SDL_HapticIndex(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticIndex' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Gets whether or not the current mouse has haptic capabilities.
+   *
+   *   SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't.
+   *
+   *   SDL_HapticOpenFromMouse
+   *}
+function SDL_MouseIsHaptic: Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MouseInHaptic' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Tries to open a haptic device from the current mouse.
+   *
+   *   The haptic device identifier or NULL on error.
+   *
+   *   SDL_MouseIsHaptic
+   *   SDL_HapticOpen
+   *}
+function SDL_HapticOpenFromMouse: PSDL_Haptic cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpenFromMouse' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Checks to see if a joystick has haptic features.
+   *
+   *   joystick Joystick to test for haptic capabilities.
+   *   1 if the joystick is haptic, 0 if it isn't
+   *   or -1 if an error ocurred.
+   *
+   *   SDL_HapticOpenFromJoystick
+   *}
+function SDL_JoystickIsHaptic(joystick: PSDL_Joystick): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickIsHaptic' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Opens a Haptic device for usage from a Joystick device.
+   *
+   *  You must still close the haptic device seperately.  It will not be closed
+   *  with the joystick.
+   *
+   *  When opening from a joystick you should first close the haptic device before
+   *  closing the joystick device.  If not, on some implementations the haptic
+   *  device will also get unallocated and you'll be unable to use force feedback
+   *  on that device.
+   *
+   *   joystick Joystick to create a haptic device from.
+   *   A valid haptic device identifier on success or NULL on error.
+   *
+   *   SDL_HapticOpen
+   *   SDL_HapticClose
+   *}
+function SDL_HapticOpenFromJoystick(joystick: PSDL_Joystick): PSDL_Haptic cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticOpenFromJoystick' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Closes a Haptic device previously opened with SDL_HapticOpen().
+   *
+   *   haptic Haptic device to close.
+   *}
+procedure SDL_HapticClose(haptic: PSDL_Haptic) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticClose' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Returns the number of effects a haptic device can store.
+   *
+   *  On some platforms this isn't fully supported, and therefore is an
+   *  approximation.  Always check to see if your created effect was actually
+   *  created and do not rely solely on SDL_HapticNumEffects().
+   *
+   *   haptic The haptic device to query effect max.
+   *   The number of effects the haptic device can store or
+   *   -1 on error.
+   *
+   *   SDL_HapticNumEffectsPlaying
+   *   SDL_HapticQuery
+   *}
+function SDL_HapticNumEffects(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNumEffects' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Returns the number of effects a haptic device can play at the same
+   *   time.
+   *
+   *  This is not supported on all platforms, but will always return a value.
+   *  Added here for the sake of completeness.
+   *
+   *   haptic The haptic device to query maximum playing effects.
+   *   The number of effects the haptic device can play at the same time
+   *   or -1 on error.
+   *
+   *   SDL_HapticNumEffects
+   *   SDL_HapticQuery
+   *}
+function SDL_HapticNumEffectsPlaying(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNumEffectsPlaying' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Gets the haptic devices supported features in bitwise matter.
+   *
+   *  Example:
+   *
+   *  if (SDL_HapticQueryEffects(haptic) & SDL_HAPTIC_CONSTANT)
+   *      printf("We have constant haptic effect!");
+   *
+   *
+   *
+   *   haptic The haptic device to query.
+   *   Haptic features in bitwise manner (OR'd).
+   *
+   *   SDL_HapticNumEffects
+   *   SDL_HapticEffectSupported
+   *}
+function SDL_HapticQuery(haptic: PSDL_Haptic): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticQuery' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Gets the number of haptic axes the device has.
+   *
+   *   SDL_HapticDirection
+   *}
+function SDL_HapticNumAxes(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNumAxes' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Checks to see if effect is supported by haptic.
+   *
+   *   haptic Haptic device to check on.
+   *   effect Effect to check to see if it is supported.
+   *   SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error.
+   *
+   *   SDL_HapticQuery
+   *   SDL_HapticNewEffect
+   *}
+function SDL_HapticEffectSupported(haptic: PSDL_Haptic; effect: PSDL_HapticEffect): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticEffectSupported' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Creates a new haptic effect on the device.
+   *
+   *   haptic Haptic device to create the effect on.
+   *   effect Properties of the effect to create.
+   *   The id of the effect on success or -1 on error.
+   *
+   *   SDL_HapticUpdateEffect
+   *   SDL_HapticRunEffect
+   *   SDL_HapticDestroyEffect
+   *}
+function SDL_HapticNewEffect(haptic: PSDL_Haptic; effect: PSDL_HapticEffect): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticNewEffect' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Updates the properties of an effect.
+   *
+   *  Can be used dynamically, although behaviour when dynamically changing
+   *  direction may be strange.  Specifically the effect may reupload itself
+   *  and start playing from the start.  You cannot change the type either when
+   *  running SDL_HapticUpdateEffect().
+   *
+   *   haptic Haptic device that has the effect.
+   *   effect Effect to update.
+   *   data New effect properties to use.
+   *   The id of the effect on success or -1 on error.
+   *
+   *   SDL_HapticNewEffect
+   *   SDL_HapticRunEffect
+   *   SDL_HapticDestroyEffect
+   *}
+function SDL_HapticUpdateEffect(haptic: PSDL_Haptic; effect: Integer; data: PSDL_HapticEffect): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticUpdateEffect' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Runs the haptic effect on its associated haptic device.
+   *
+   *  If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over
+   *  repeating the envelope (attack and fade) every time.  If you only want the
+   *  effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length
+   *  parameter.
+   *
+   *   haptic Haptic device to run the effect on.
+   *   effect Identifier of the haptic effect to run.
+   *   iterations Number of iterations to run the effect. Use
+   *   SDL_HAPTIC_INFINITY for infinity.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticStopEffect
+   *   SDL_HapticDestroyEffect
+   *   SDL_HapticGetEffectStatus
+   *}
+function SDL_HapticRunEffect(haptic: PSDL_Haptic; effect: Integer; iterations: UInt32): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRunEffect' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Stops the haptic effect on its associated haptic device.
+   *
+   *   haptic Haptic device to stop the effect on.
+   *   effect Identifier of the effect to stop.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticRunEffect
+   *   SDL_HapticDestroyEffect
+   *}
+function SDL_HapticStopEffect(haptic: PSDL_Haptic; effect: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticStopEffect' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Destroys a haptic effect on the device.
+   *
+   *  This will stop the effect if it's running.  Effects are automatically
+   *  destroyed when the device is closed.
+   *
+   *   haptic Device to destroy the effect on.
+   *   effect Identifier of the effect to destroy.
+   *
+   *   SDL_HapticNewEffect
+   *}
+procedure SDL_HapticDestroyEffect(haptic: PSDL_Haptic; effect: Integer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticDestroyEffect' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Gets the status of the current effect on the haptic device.
+   *
+   *  Device must support the ::SDL_HAPTIC_STATUS feature.
+   *
+   *   haptic Haptic device to query the effect status on.
+   *   effect Identifier of the effect to query its status.
+   *   0 if it isn't playing, 1 if it is playing or -1 on error.
+   *
+   *   SDL_HapticRunEffect
+   *   SDL_HapticStopEffect
+   *}
+function SDL_HapticGetEffectStatus(haptic: PSDL_Haptic; effect: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticGetEffectStatus' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Sets the global gain of the device.
+   *
+   *  Device must support the SDL_HAPTIC_GAIN feature.
+   *
+   *  The user may specify the maximum gain by setting the environment variable
+   *  SDL_HAPTIC_GAIN_MAX which should be between 0 and 100.  All calls to
+   *  SDL_HapticSetGain() will scale linearly using SDL_HAPTIC_GAIN_MAX as the
+   *  maximum.
+   *
+   *   haptic Haptic device to set the gain on.
+   *   gain Value to set the gain to, should be between 0 and 100.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticQuery
+   *}
+function SDL_HapticSetGain(haptic: PSDL_Haptic; gain: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticSetGain' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Sets the global autocenter of the device.
+   *
+   *  Autocenter should be between 0 and 100.  Setting it to 0 will disable
+   *  autocentering.
+   *
+   *  Device must support the ::SDL_HAPTIC_AUTOCENTER feature.
+   *
+   *   haptic Haptic device to set autocentering on.
+   *   autocenter Value to set autocenter to, 0 disables autocentering.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticQuery
+   *}
+function SDL_HapticSetAutocenter(haptic: PSDL_Haptic; autocenter: Integer): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticSetAutocenter' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Pauses a haptic device.
+   *
+   *  Device must support the SDL_HAPTIC_PAUSE feature.  Call
+   *  SDL_HapticUnpause() to resume playback.
+   *
+   *  Do not modify the effects nor add new ones while the device is paused.
+   *  That can cause all sorts of weird errors.
+   *
+   *   haptic Haptic device to pause.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticUnpause
+   *}
+function SDL_HapticPause(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticPause' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Unpauses a haptic device.
+   *
+   *  Call to unpause after SDL_HapticPause().
+   *
+   *   haptic Haptic device to pause.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticPause
+   *}
+function SDL_HapticUnpause(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticUnPause' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Stops all the currently playing effects on a haptic device.
+   *
+   *   haptic Haptic device to stop.
+   *   0 on success or -1 on error.
+   *}
+function SDL_HapticStopAll(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticStopAll' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Checks to see if rumble is supported on a haptic device..
+   *
+   *   haptic Haptic device to check to see if it supports rumble.
+   *   SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error.
+   *
+   *   SDL_HapticRumbleInit
+   *   SDL_HapticRumblePlay
+   *   SDL_HapticRumbleStop
+   *}
+function SDL_HapticRumbleSupported(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumbleSupported' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Initializes the haptic device for simple rumble playback.
+   *
+   *   haptic Haptic device to initialize for simple rumble playback.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticOpen
+   *   SDL_HapticRumbleSupported
+   *   SDL_HapticRumblePlay
+   *   SDL_HapticRumbleStop
+   *}
+function SDL_HapticRumbleInit(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumbleInit' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Runs simple rumble on a haptic device
+   *
+   *   haptic Haptic device to play rumble effect on.
+   *   strength Strength of the rumble to play as a 0-1 float value.
+   *   length Length of the rumble to play in milliseconds.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticRumbleSupported
+   *   SDL_HapticRumbleInit
+   *   SDL_HapticRumbleStop
+   *}
+function SDL_HapticRumblePlay(haptic: PSDL_Haptic; strength: Float; length: UInt32): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumblePlay' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Stops the simple rumble on a haptic device.
+   *
+   *   haptic Haptic to stop the rumble on.
+   *   0 on success or -1 on error.
+   *
+   *   SDL_HapticRumbleSupported
+   *   SDL_HapticRumbleInit
+   *   SDL_HapticRumblePlay
+   *}
+function SDL_HapticRumbleStop(haptic: PSDL_Haptic): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HapticRumbleStop' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdlhints.inc b/src/lib/sdl2/sdlhints.inc
new file mode 100644 (file)
index 0000000..b3f393d
--- /dev/null
@@ -0,0 +1,507 @@
+{// from "SDL_hints.h"
+ /*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ *  \file SDL_hints.h
+ *
+ *  Official documentation for SDL configuration variables
+ *
+ *  This file contains functions to set and get configuration hints,
+ *  as well as listing each of them alphabetically.
+ *
+ *  The convention for naming hints is SDL_HINT_X, where "SDL_X" is
+ *  the environment variable that can be used to override the default.
+ *
+ *  In general these hints are just that - they may or may not be
+ *  supported or applicable on any given platform, but they provide
+ *  a way for an application or user to give the library a hint as
+ *  to how they would like the library to work.
+ */
+}
+
+
+(**
+ *  \brief  A variable controlling how 3D acceleration is used to accelerate the SDL screen surface.
+ *
+ *  SDL can try to accelerate the SDL screen surface by using streaming
+ *  textures with a 3D rendering engine.  This variable controls whether and
+ *  how this is done.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable 3D acceleration
+ *    "1"       - Enable 3D acceleration, using the default renderer.
+ *    "X"       - Enable 3D acceleration, using X where X is one of the valid rendering drivers.  (e.g. "direct3d", "opengl", etc.)
+ *
+ *  By default SDL tries to make a best guess for each platform whether
+ *  to use acceleration or not.
+ *)
+const
+SDL_HINT_FRAMEBUFFER_ACCELERATION  = 'SDL_FRAMEBUFFER_ACCELERATION';
+
+{/**
+ *  \brief  A variable specifying which render driver to use.
+ *
+ *  If the application doesn't pick a specific renderer to use, this variable
+ *  specifies the name of the preferred renderer.  If the preferred renderer
+ *  can't be initialized, the normal default renderer is used.
+ *
+ *  This variable is case insensitive and can be set to the following values:
+ *    "direct3d"
+ *    "opengl"
+ *    "opengles2"
+ *    "opengles"
+ *    "software"
+ *
+ *  The default varies by platform, but it's the first one in the list that
+ *  is available on the current platform.
+ */}
+SDL_HINT_RENDER_DRIVER = 'SDL_RENDER_DRIVER';
+
+{/**
+ *  \brief  A variable controlling whether the OpenGL render driver uses shaders if they are available.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable shaders
+ *    "1"       - Enable shaders
+ *
+ *  By default shaders are used if OpenGL supports them.
+ */}
+SDL_HINT_RENDER_OPENGL_SHADERS = 'SDL_RENDER_OPENGL_SHADERS';
+
+  {**
+   *  \brief  A variable controlling whether the Direct3D device is initialized for thread-safe operations.
+   *
+   *  This variable can be set to the following values:
+   *    "0"       - Thread-safety is not enabled (faster)
+   *    "1"       - Thread-safety is enabled
+   *
+   *  By default the Direct3D device is created with thread-safety disabled.
+   *}
+SDL_HINT_RENDER_DIRECT3D_THREADSAFE = 'SDL_RENDER_DIRECT3D_THREADSAFE';
+
+  {**
+   *  \brief  A variable controlling whether to enable Direct3D 11+'s Debug Layer.
+   *
+   *  This variable does not have any effect on the Direct3D 9 based renderer.
+   *
+   *  This variable can be set to the following values:
+   *    "0"       - Disable Debug Layer use
+   *    "1"       - Enable Debug Layer use
+   *
+   *  By default, SDL does not use Direct3D Debug Layer.
+   *}
+SDL_HINT_RENDER_DIRECT3D11_DEBUG = 'SDL_HINT_RENDER_DIRECT3D11_DEBUG';
+
+{/**
+ *  \brief  A variable controlling the scaling quality
+ *
+ *  This variable can be set to the following values:
+ *    "0" or "nearest" - Nearest pixel sampling
+ *    "1" or "linear"  - Linear filtering (supported by OpenGL and Direct3D)
+ *    "2" or "best"    - Currently this is the same as "linear"
+ *
+ *  By default nearest pixel sampling is used
+ */}
+SDL_HINT_RENDER_SCALE_QUALITY = 'SDL_RENDER_SCALE_QUALITY';
+
+{/**
+ *  \brief  A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable vsync
+ *    "1"       - Enable vsync
+ *
+ *  By default SDL does not sync screen surface updates with vertical refresh.
+ */}
+SDL_HINT_RENDER_VSYNC = 'SDL_RENDER_VSYNC';
+
+{/**
+ *  \brief  A variable controlling whether the screensaver is enabled. 
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable screensaver
+ *    "1"       - Enable screensaver
+ *
+ *  By default SDL will disable the screensaver.
+ */}
+SDL_HINT_VIDEO_ALLOW_SCREENSAVER = 'SDL_VIDEO_ALLOW_SCREENSAVER';
+
+{/**
+ *  \brief  A variable controlling whether the X11 VidMode extension should be used.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable XVidMode
+ *    "1"       - Enable XVidMode
+ *
+ *  By default SDL will use XVidMode if it is available.
+ */}
+SDL_HINT_VIDEO_X11_XVIDMODE = 'SDL_VIDEO_X11_XVIDMODE';
+
+{/**
+ *  \brief  A variable controlling whether the X11 Xinerama extension should be used.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable Xinerama
+ *    "1"       - Enable Xinerama
+ *
+ *  By default SDL will use Xinerama if it is available.
+ */}
+SDL_HINT_VIDEO_X11_XINERAMA = 'SDL_VIDEO_X11_XINERAMA';
+
+{/**
+ *  \brief  A variable controlling whether the X11 XRandR extension should be used.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Disable XRandR
+ *    "1"       - Enable XRandR
+ *
+ *  By default SDL will not use XRandR because of window manager issues.
+ */}
+SDL_HINT_VIDEO_X11_XRANDR = 'SDL_VIDEO_X11_XRANDR';
+
+{/**
+ *  \brief  A variable controlling whether grabbing input grabs the keyboard
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Grab will affect only the mouse
+ *    "1"       - Grab will affect mouse and keyboard
+ *
+ *  By default SDL will not grab the keyboard so system shortcuts still work.
+ */}
+SDL_HINT_GRAB_KEYBOARD = 'SDL_GRAB_KEYBOARD';
+
+{/**
+ *  \brief  A variable controlling whether relative mouse mode is implemented using mouse warping
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Relative mouse mode uses raw input
+ *    "1"       - Relative mouse mode uses mouse warping
+ *
+ *  By default SDL will use raw input for relative mouse mode
+ */}
+SDL_HINT_MOUSE_RELATIVE_MODE_WARP = 'SDL_MOUSE_RELATIVE_MODE_WARP';
+
+{/**
+ *  \brief Minimize your SDL_Window if it loses key focus when in Fullscreen mode. Defaults to true.
+ *
+ */}
+SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS = 'SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS';
+
+
+{/**
+ *  \brief  A variable controlling whether the idle timer is disabled on iOS.
+ *
+ *  When an iOS app does not receive touches for some time, the screen is
+ *  dimmed automatically. For games where the accelerometer is the only input
+ *  this is problematic. This functionality can be disabled by setting this
+ *  hint.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - Enable idle timer
+ *    "1"       - Disable idle timer
+ */}
+SDL_HINT_IDLE_TIMER_DISABLED = 'SDL_IOS_IDLE_TIMER_DISABLED';
+
+{/**
+ *  \brief  A variable controlling which orientations are allowed on iOS.
+ *
+ *  In some circumstances it is necessary to be able to explicitly control
+ *  which UI orientations are allowed.
+ *
+ *  This variable is a space delimited list of the following values:
+ *    "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown"
+ */}
+SDL_HINT_ORIENTATIONS = 'SDL_IOS_ORIENTATIONS';
+
+{/**
+ *  \brief  A variable controlling whether an Android built-in accelerometer should be
+ *  listed as a joystick device, rather than listing actual joysticks only.
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - List only real joysticks and accept input from them
+ *    "1"       - List real joysticks along with the accelerometer as if it were a 3 axis joystick (the default).
+ */}
+SDL_HINT_ACCELEROMETER_AS_JOYSTICK = 'SDL_ACCELEROMETER_AS_JOYSTICK';
+
+{/**
+ *  \brief  A variable that lets you disable the detection and use of Xinput gamepad devices
+ *
+ *  The variable can be set to the following values:
+ *    "0"       - Disable XInput timer (only uses direct input)
+ *    "1"       - Enable XInput timer (the default)
+ */}
+SDL_HINT_XINPUT_ENABLED = 'SDL_XINPUT_ENABLED';
+
+
+{/**
+ *  \brief  A variable that lets you manually hint extra gamecontroller db entries
+ *
+ *  The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h
+ *
+ *  This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER)
+ *  You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping()
+ */}
+SDL_HINT_GAMECONTROLLERCONFIG = 'SDL_GAMECONTROLLERCONFIG';
+
+
+{/**
+ *  \brief  A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background.
+ *
+ *  The variable can be set to the following values:
+ *    "0"       - Disable joystick & gamecontroller input events when the
+ *                application is in the background.
+ *    "1"       - Enable joystick & gamecontroller input events when the
+ *                application is in the backgroumd.
+ *
+ *  The default value is "0".  This hint may be set at any time.
+ */}
+SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS = 'SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS';
+
+
+{/**
+ *  \brief If set to 0 then never set the top most bit on a SDL Window, even if the video mode expects it.
+ *      This is a debugging aid for developers and not expected to be used by end users. The default is "1"
+ *
+ *  This variable can be set to the following values:
+ *    "0"       - don't allow topmost
+ *    "1"       - allow topmost
+ */}
+SDL_HINT_ALLOW_TOPMOST = 'SDL_ALLOW_TOPMOST';
+
+
+{/**
+ *  \brief A variable that controls the timer resolution, in milliseconds.
+ *
+ *  The higher resolution the timer, the more frequently the CPU services
+ *  timer interrupts, and the more precise delays are, but this takes up
+ *  power and CPU time.  This hint is only used on Windows 7 and earlier.
+ *
+ *  See this blog post for more information:
+ *  http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/
+ *
+ *  If this variable is set to "0", the system timer resolution is not set.
+ *
+ *  The default value is "1". This hint may be set at any time.
+ */}
+SDL_HINT_TIMER_RESOLUTION = 'SDL_TIMER_RESOLUTION';
+
+{**
+ *  \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac)
+ *}
+SDL_HINT_VIDEO_HIGHDPI_DISABLED = 'SDL_VIDEO_HIGHDPI_DISABLED';
+
+{**
+ *  \brief A variable that determines whether ctrl+click should generate a right-click event on Mac
+ *  
+ *  If present, holding ctrl while left clicking will generate a right click
+ *  event when on Mac.
+ *}
+SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK = 'SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK';
+
+{**
+ *  \brief  A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries
+ *
+ *  SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It
+ *  can use two different sets of binaries, those compiled by the user from source
+ *  or those provided by the Chrome browser. In the later case, these binaries require
+ *  that SDL loads a DLL providing the shader compiler.
+ *
+ *  This variable can be set to the following values:
+ *    "d3dcompiler_46.dll" - default, best for Vista or later.
+ *    "d3dcompiler_43.dll" - for XP support.
+ *    "none" - do not load any library, useful if you compiled ANGLE from source and included the compiler in your binaries.
+ *
+ *}
+SDL_HINT_VIDEO_WIN_D3DCOMPILER = 'SDL_VIDEO_WIN_D3DCOMPILER';
+
+{/**
+ *  \brief  A variable that is the address of another SDL_Window* (as a hex string formatted with "%p").
+ *  
+ *  If this hint is set before SDL_CreateWindowFrom() and the SDL_Window* it is set to has
+ *  SDL_WINDOW_OPENGL set (and running on WGL only, currently), then two things will occur on the newly 
+ *  created SDL_Window:
+ *
+ *  1. Its pixel format will be set to the same pixel format as this SDL_Window.  This is
+ *  needed for example when sharing an OpenGL context across multiple windows.
+ *
+ *  2. The flag SDL_WINDOW_OPENGL will be set on the new window so it can be used for
+ *  OpenGL rendering.
+ *
+ *  This variable can be set to the following values:
+ *    The address (as a string "%p") of the SDL_Window* that new windows created with SDL_CreateWindowFrom() should
+ *    share a pixel format with.
+ */}
+SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT = 'SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT';
+
+  {**
+   *  \brief A URL to a WinRT app's privacy policy
+   *
+   *  All network-enabled WinRT apps must make a privacy policy available to its
+   *  users.  On Windows 8, 8.1, and RT, Microsoft mandates that this policy be
+   *  be available in the Windows Settings charm, as accessed from within the app.
+   *  SDL provides code to add a URL-based link there, which can point to the app's
+   *  privacy policy.
+   *
+   *  To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL
+   *  before calling any SDL_Init functions.  The contents of the hint should
+   *  be a valid URL.  For example, "http://www.example.com".
+   *
+   *  The default value is "", which will prevent SDL from adding a privacy policy
+   *  link to the Settings charm.  This hint should only be set during app init.
+   *
+   *  The label text of an app's "Privacy Policy" link may be customized via another
+   *  hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL.
+   *
+   *  Please note that on Windows Phone, Microsoft does not provide standard UI
+   *  for displaying a privacy policy link, and as such, SDL_HINT_WINRT_PRIVACY_POLICY_URL
+   *  will not get used on that platform.  Network-enabled phone apps should display
+   *  their privacy policy through some other, in-app means.
+   *}
+SDL_HINT_WINRT_PRIVACY_POLICY_URL = 'SDL_HINT_WINRT_PRIVACY_POLICY_URL';
+
+  {**
+   *  \brief Label text for a WinRT app's privacy policy link
+   *
+   *  Network-enabled WinRT apps must include a privacy policy.  On Windows 8, 8.1, and RT,
+   *  Microsoft mandates that this policy be available via the Windows Settings charm.
+   *  SDL provides code to add a link there, with it's label text being set via the
+   *  optional hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL.
+   *
+   *  Please note that a privacy policy's contents are not set via this hint.  A separate
+   *  hint, SDL_HINT_WINRT_PRIVACY_POLICY_URL, is used to link to the actual text of the
+   *  policy.
+   *
+   *  The contents of this hint should be encoded as a UTF8 string.
+   *
+   *  The default value is "Privacy Policy".  This hint should only be set during app
+   *  initialization, preferably before any calls to SDL_Init.
+   *
+   *  For additional information on linking to a privacy policy, see the documentation for
+   *  SDL_HINT_WINRT_PRIVACY_POLICY_URL.
+   *}
+SDL_HINT_WINRT_PRIVACY_POLICY_LABEL = 'SDL_HINT_WINRT_PRIVACY_POLICY_LABEL';
+
+  {**
+   *  \brief If set to 1, back button press events on Windows Phone 8+ will be marked as handled.
+   *
+   *  TODO, WinRT: document SDL_HINT_WINRT_HANDLE_BACK_BUTTON need and use
+   *  For now, more details on why this is needed can be found at the
+   *  beginning of the following web page:
+   *  http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx
+   *}
+SDL_HINT_WINRT_HANDLE_BACK_BUTTON = 'SDL_HINT_WINRT_HANDLE_BACK_BUTTON';
+
+  {**
+   *  \brief  A variable that dictates policy for fullscreen Spaces on Mac OS X.
+   *
+   *  This hint only applies to Mac OS X.
+   *
+   *  The variable can be set to the following values:
+   *    "0"       - Disable Spaces support (FULLSCREEN_DESKTOP won't use them and
+   *                SDL_WINDOW_RESIZABLE windows won't offer the "fullscreen"
+   *                button on their titlebars).
+   *    "1"       - Enable Spaces support (FULLSCREEN_DESKTOP will use them and
+   *                SDL_WINDOW_RESIZABLE windows will offer the "fullscreen"
+   *                button on their titlebars.
+   *
+   *  The default value is "1". Spaces are disabled regardless of this hint if
+   *   the OS isn't at least Mac OS X Lion (10.7). This hint must be set before
+   *   any windows are created.
+   *}
+SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES = 'SDL_VIDEO_MAC_FULLSCREEN_SPACES';
+
+
+{/**
+ *  \brief  An enumeration of hint priorities
+ */}
+type
+  SDL_HintPriority = (SDL_HINT_DEFAULT, SDL_HINT_NORMAL, SDL_HINT_OVERRIDE);
+
+
+{/**
+ *  \brief Set a hint with a specific priority
+ *
+ *  The priority controls the behavior when setting a hint that already
+ *  has a value.  Hints will replace existing hints of their priority and
+ *  lower.  Environment variables are considered to have override priority.
+ *
+ *  \return SDL_TRUE if the hint was set, SDL_FALSE otherwise
+ */}
+function SDL_SetHintWithPriority( const name: PChar; const value: PChar; priority: SDL_HintPriority) : boolean; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetHintWithPriority' {$ENDIF} {$ENDIF};
+
+// extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name,
+//                                                         const char *value,
+//                                                         SDL_HintPriority priority);
+{/**
+ *  \brief Set a hint with normal priority
+ *
+ *  \return SDL_TRUE if the hint was set, SDL_FALSE otherwise
+ */}
+ function SDL_SetHint( const name: PChar; const value: PChar) : boolean; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetHint' {$ENDIF} {$ENDIF};
+
+ //extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name,
+  //                                           const char *value);
+
+{/**
+ *  \brief Get a hint
+ *
+ *  \return The string value of a hint variable.
+ */}
+function SDL_GetHint( const name: PChar): PChar; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetHint' {$ENDIF} {$ENDIF};
+ //extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name);
+
+
+{/**
+ *  \brief Add a function to watch a particular hint
+ *
+ *  \param name The hint to watch
+ *  \param callback The function to call when the hint value changes
+ *  \param userdata A pointer to pass to the callback function
+ */}
+type
+TSDL_HintCallback = procedure(userdata: Pointer; const name: PChar; const oldValue: PChar; const newValue: PChar);
+procedure SDL_AddHintCallback(const name: PChar; callback: TSDL_HintCallback; userdata: Pointer); cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AddHintCallback' {$ENDIF} {$ENDIF};
+ //typedef void (*SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue);
+//extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name,
+//                                                 SDL_HintCallback callback,
+//                                                 void *userdata);
+
+{/**
+ *  \brief Remove a function watching a particular hint
+ *
+ *  \param name The hint being watched
+ *  \param callback The function being called when the hint value changes
+ *  \param userdata A pointer being passed to the callback function
+ */}
+procedure SDL_DelHintCallback(const name: PChar; callback: TSDL_HintCallback; userdata: Pointer); cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DelHintCallback' {$ENDIF} {$ENDIF};
+//extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name,
+//                                                 SDL_HintCallback callback,
+//                                                 void *userdata);
+
+{/**
+ *  \brief  Clear all hints
+ *
+ *  This function is called during SDL_Quit() to free stored hints.
+ */}
+//extern DECLSPEC void SDLCALL SDL_ClearHints(void);
+procedure SDL_ClearHints(); cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ClearHints' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdljoystick.inc b/src/lib/sdl2/sdljoystick.inc
new file mode 100644 (file)
index 0000000..a2df058
--- /dev/null
@@ -0,0 +1,185 @@
+//from "sdl_joystick.h"
+
+  {**
+   *  SDL_joystick.h
+   *
+   *  In order to use these functions, SDL_Init() must have been called
+   *  with the ::SDL_INIT_JOYSTICK flag.  This causes SDL to scan the system
+   *  for joysticks, and load appropriate drivers.
+   *}
+
+type
+
+  {* The joystick structure used to identify an SDL joystick *}
+  PSDL_Joystick = Pointer; // todo!!
+
+{* A structure that encodes the stable unique id for a joystick device *}
+
+  TSDL_JoystickGUID = record
+    data: array[0..15] of UInt8;
+  end;
+
+  TSDL_JoystickID = SInt32;
+
+  {* Function prototypes *}
+  {**
+   *  Count the number of joysticks attached to the system right now
+   *}
+function SDL_NumJoysticks: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_NumJoysticks' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the implementation dependent name of a joystick.
+   *  This can be called before any joysticks are opened.
+   *  If no name can be found, this function returns NULL.
+   *}
+function SDL_JoystickNameForIndex(device_index: SInt32): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickNameForIndex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Open a joystick for use.
+   *  The index passed as an argument refers tothe N'th joystick on the system.
+   *  This index is the value which will identify this joystick in future joystick
+   *  events.
+   *
+   *  A joystick identifier, or NULL if an error occurred.
+   *}
+function SDL_JoystickOpen(device_index: SInt32): PSDL_Joystick cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickOpen' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return the name for this currently opened joystick.
+   *  If no name can be found, this function returns NULL.
+   *}
+function SDL_JoystickName(joystick: PSDL_Joystick): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickName' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return the GUID for the joystick at this index
+   *}
+function SDL_JoystickGetDeviceGUID(device_index: SInt32): TSDL_JoystickGUID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetDeviceGUID' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return the GUID for this opened joystick
+   *}
+function SDL_JoystickGetGUID(joystick: PSDL_Joystick): TSDL_JoystickGUID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetGUID' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return a string representation for this guid. pszGUID must point to at least 33 bytes
+   *  (32 for the string plus a NULL terminator).
+   *}
+procedure SDL_JoystickGetGUIDString(guid: TSDL_JoystickGUId; pszGUID: PAnsiChar; cbGUID: SInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetGUIDString' {$ENDIF} {$ENDIF};
+
+  {**
+   *  convert a string into a joystick formatted guid
+   *}
+function SDL_JoystickGetGUIDFromString(const pchGUID: PAnsiChar): TSDL_JoystickGUID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetGUIDFromString' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns SDL_TRUE if the joystick has been opened and currently connected, or SDL_FALSE if it has not.
+   *}
+function SDL_JoystickGetAttached(joystick: PSDL_Joystick): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetAttached' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the instance ID of an opened joystick or -1 if the joystick is invalid.
+   *}
+function SDL_JoystickInstanceID(joystick: PSDL_Joystick): TSDL_JoystickID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickInstanceID' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the number of general axis controls on a joystick.
+   *}
+function SDL_JoystickNumAxes(joystick: PSDL_Joystick): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickNumAxes' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the number of trackballs on a joystick.
+   *
+   *  Joystick trackballs have only relative motion events associated
+   *  with them and their state cannot be polled.
+   *}
+function SDL_JoystickNumBalls(joystick: PSDL_Joystick): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickNumBalls' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the number of POV hats on a joystick.
+   *}
+function SDL_JoystickNumHats(joystick: PSDL_Joystick): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickNumHats' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the number of buttons on a joystick.
+   *}
+function SDL_JoystickNumButtons(joystick: PSDL_Joystick): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickNumButtons' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Update the current state of the open joysticks.
+   *
+   *  This is called automatically by the event loop if any joystick
+   *  events are enabled.
+   *}
+procedure SDL_JoystickUpdate cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickUpdate' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Enable/disable joystick event polling.
+   *
+   *  If joystick events are disabled, you must call SDL_JoystickUpdate()
+   *  yourself and check the state of the joystick when you want joystick
+   *  information.
+   *
+   *  The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE.
+   *}
+function SDL_JoystickEventState(state: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickEventState' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the current state of an axis control on a joystick.
+   *
+   *  The state is a value ranging from -32768 to 32767.
+   *
+   *  The axis indices start at index 0.
+   *}
+function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: SInt32): SInt16 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetAxis' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Hat positions
+   *}
+const
+  SDL_HAT_CENTERED  = $00;
+  SDL_HAT_UP        = $01;
+  SDL_HAT_RIGHT     = $02;
+  SDL_HAT_DOWN      = $04;
+  SDL_HAT_LEFT      = $08;
+  SDL_HAT_RIGHTUP   = SDL_HAT_RIGHT or SDL_HAT_UP;
+  SDL_HAT_RIGHTDOWN = SDL_HAT_RIGHT or SDL_HAT_DOWN;
+  SDL_HAT_LEFTUP    = SDL_HAT_LEFT or SDL_HAT_UP;
+  SDL_HAT_LEFTDOWN  = SDL_HAT_LEFT or SDL_HAT_DOWN;
+
+  {**
+   *  Get the current state of a POV hat on a joystick.
+   *
+   *  The hat indices start at index 0.
+   *
+   *  The return value is one of the following positions:
+   *   - SDL_HAT_CENTERED
+   *   - SDL_HAT_UP
+   *   - SDL_HAT_RIGHT
+   *   - SDL_HAT_DOWN
+   *   - SDL_HAT_LEFT
+   *   - SDL_HAT_RIGHTUP
+   *   - SDL_HAT_RIGHTDOWN
+   *   - SDL_HAT_LEFTUP
+   *   - SDL_HAT_LEFTDOWN
+   *}
+function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: SInt32): UInt8 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetHat' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the ball axis change since the last poll.
+   *
+   *  0, or -1 if you passed it invalid parameters.
+   *
+   *  The ball indices start at index 0.
+   *}
+function SDL_JoystickGetBall(joystick: PSDL_Joystick; ball: SInt32; dx: PInt; dy: PInt): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetBall' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the current state of a button on a joystick.
+   *
+   *  The button indices start at index 0.
+   *}
+function SDL_JoystickGetButton(joystick: PSDL_Joystick; button: SInt32): UInt8 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickGetButton' {$ENDIF} {$ENDIF};
+  {**
+   *  Close a joystick previously opened with SDL_JoystickOpen().
+   *}
+procedure SDL_JoystickClose(joystick: PSDL_Joystick) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_JoystickClose' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlkeyboard.inc b/src/lib/sdl2/sdlkeyboard.inc
new file mode 100644 (file)
index 0000000..90040aa
--- /dev/null
@@ -0,0 +1,177 @@
+//from "sdl_keyboard.h"
+
+type
+  PKeyStateArr = ^TKeyStateArr;
+  TKeyStateArr = array[0..65000] of UInt8;
+
+  {**
+   *  The SDL keysym structure, used in key events.
+   *}
+  PSDL_Keysym = ^TSDL_Keysym;
+  TSDL_Keysym = record
+    scancode: TSDL_ScanCode;      // SDL physical key code - see SDL_Scancode for details
+    sym: TSDL_KeyCode;            // SDL virtual key code - see SDL_Keycode for details
+    _mod: UInt16;                 // current key modifiers
+    unicode: UInt32;              // (deprecated) use SDL_TextInputEvent instead
+  end;
+
+  {**
+   *  Get the window which currently has keyboard focus.
+   *}
+
+  function SDL_GetKeyboardFocus: PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetKeyboardFocus' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get a snapshot of the current state of the keyboard.
+   *
+   *  numkeys if non-nil, receives the length of the returned array.
+   *  
+   *  An array of key states. Indexes into this array are obtained by using SDL_Scancode values.
+   *
+   *}
+
+  function SDL_GetKeyboardState(numkeys: PInt): PUInt8 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetKeyboardState' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get the current key modifier state for the keyboard.
+   *}
+
+  function SDL_GetModState: TSDL_KeyMod cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetModState' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Set the current key modifier state for the keyboard.
+   *  
+   *  This does not change the keyboard state, only the key modifier flags.
+   *}
+
+  procedure SDL_SetModState(modstate: TSDL_KeyMod) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetModState' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get the key code corresponding to the given scancode according
+   *         to the current keyboard layout.
+   *
+   *  See SDL_Keycode for details.
+   *  
+   *  SDL_GetKeyName()
+   *}
+
+  function SDL_GetKeyFromScancode(scancode: TSDL_ScanCode): TSDL_KeyCode cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetKeyFromScancode' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get the scancode corresponding to the given key code according to the
+   *         current keyboard layout.
+   *
+   *  See SDL_Scancode for details.
+   *
+   *  SDL_GetScancodeName()
+   *}
+
+  function SDL_GetScancodeFromKey(key: TSDL_KeyCode): TSDL_ScanCode cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetScancodeFromKey' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get a human-readable name for a scancode.
+   *
+   *  A pointer to the name for the scancode.
+   *
+   *  If the scancode doesn't have a name, this function returns
+   *  an empty string ("").
+   *
+   *}
+
+  function SDL_GetScancodeName(scancode: TSDL_ScanCode): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetScancodeName' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get a scancode from a human-readable name
+   *
+   *  scancode, or SDL_SCANCODE_UNKNOWN if the name wasn't recognized
+   *
+   *  SDL_Scancode
+   *}
+
+  function SDL_GetScancodeFromName(const name: PAnsiChar): TSDL_ScanCode cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetScancodeFromName' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get a human-readable name for a key.
+   *
+   *  A pointer to a UTF-8 string that stays valid at least until the next
+   *  call to this function. If you need it around any longer, you must
+   *  copy it.  If the key doesn't have a name, this function returns an
+   *  empty string ("").
+   *  
+   *  SDL_Key
+   *}
+
+  function SDL_GetKeyName(key: TSDL_ScanCode): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetKeyName' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get a key code from a human-readable name
+   *
+   *  key code, or SDLK_UNKNOWN if the name wasn't recognized
+   *
+   *  SDL_Keycode
+   *}
+
+  function SDL_GetKeyFromName(const name: PAnsiChar): TSDL_KeyCode cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetKeyFromName' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Start accepting Unicode text input events.
+   *  This function will show the on-screen keyboard if supported.
+   *  
+   *  SDL_StopTextInput()
+   *  SDL_SetTextInputRect()
+   *  SDL_HasScreenKeyboardSupport()
+   *}
+
+  procedure SDL_StartTextInput cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_StartTextInput' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Return whether or not Unicode text input events are enabled.
+   *
+   *  SDL_StartTextInput()
+   *  SDL_StopTextInput()
+   *}
+
+  function SDL_IsTextInputActive: TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IsTextInputActive' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Stop receiving any text input events.
+   *  This function will hide the on-screen keyboard if supported.
+   *  
+   *  SDL_StartTextInput()
+   *  SDL_HasScreenKeyboardSupport()
+   *}
+
+  procedure SDL_StopTextInput cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_StopTextInput' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Set the rectangle used to type Unicode text inputs.
+   *  This is used as a hint for IME and on-screen keyboard placement.
+   *  
+   *  SDL_StartTextInput()
+   *}
+
+  procedure SDL_SetTextInputRect(rect: PSDL_Rect) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetTextInputRect' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Returns whether the platform has some screen keyboard support.
+   *  
+   *  SDL_TRUE if some keyboard support is available else SDL_FALSE.
+   *
+   *  Not all screen keyboard functions are supported on all platforms.
+   *
+   *  SDL_IsScreenKeyboardShown()
+   *}
+
+  function SDL_HasScreenKeyboardSupport: TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasScreenKeyboardSupport' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Returns whether the screen keyboard is shown for given window.
+   *
+   *  window The window for which screen keyboard should be queried.
+   *
+   *  Result - SDL_TRUE if screen keyboard is shown else SDL_FALSE.
+   *
+   *  SDL_HasScreenKeyboardSupport()
+   *}
+
+  function SDL_IsScreenKeyboardShown(window: PSDL_Window): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IsScreenKeyboardShown' {$ENDIF}{$ENDIF};
diff --git a/src/lib/sdl2/sdlloadso.inc b/src/lib/sdl2/sdlloadso.inc
new file mode 100644 (file)
index 0000000..2a7ca13
--- /dev/null
@@ -0,0 +1,23 @@
+//from sdl_loadso.h
+
+{**
+ *  This function dynamically loads a shared object and returns a pointer
+ *  to the object handle (or NULL if there was an error).
+ *  The 'sofile' parameter is a system dependent name of the object file.
+ *}
+function SDL_LoadObject(Const sofile: PAnsiChar): Pointer; cdecl;
+   external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LoadObject' {$ENDIF}{$ENDIF};
+
+{**
+ *  Given an object handle, this function looks up the address of the
+ *  named function in the shared object and returns it.  This address
+ *  is no longer valid after calling SDL_UnloadObject().
+ *}
+function SDL_LoadFunction(handle: Pointer; Const name: PAnsiChar): Pointer; cdecl;
+   external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LoadFunction' {$ENDIF}{$ENDIF};
+
+{**
+ *  Unload a shared object from memory.
+ *}
+procedure SDL_UnloadObject(handle: Pointer); cdecl;
+   external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UnloadObject' {$ENDIF}{$ENDIF};
diff --git a/src/lib/sdl2/sdllog.inc b/src/lib/sdl2/sdllog.inc
new file mode 100644 (file)
index 0000000..169334a
--- /dev/null
@@ -0,0 +1,147 @@
+
+//since the array of const in delphi is not C compatible:
+{$IFDEF FPC}
+
+{**
+ *  \brief The maximum size of a log message
+ *
+ *  Messages longer than the maximum size will be truncated
+ *}
+const
+  SDL_MAX_LOG_MESSAGE = 4096;
+
+{**
+ *  \brief The predefined log categories
+ *
+ *  By default the application category is enabled at the INFO level,
+ *  the assert category is enabled at the WARN level, test is enabled
+ *  at the VERBOSE level and all other categories are enabled at the
+ *  CRITICAL level.
+ *}
+type
+  TSDL_LogCategory = (SDL_LOG_CATEGORY_APPLICATION,
+                                         SDL_LOG_CATEGORY_ERROR,
+                                         SDL_LOG_CATEGORY_ASSERT,
+                                         SDL_LOG_CATEGORY_SYSTEM,
+                                         SDL_LOG_CATEGORY_AUDIO,
+                                     SDL_LOG_CATEGORY_VIDEO,
+                                         SDL_LOG_CATEGORY_RENDER,
+                                         SDL_LOG_CATEGORY_INPUT,
+                                         SDL_LOG_CATEGORY_TEST,
+                                       
+                                         {* Reserved for future SDL library use *}
+                                         SDL_LOG_CATEGORY_RESERVED1,
+                                         SDL_LOG_CATEGORY_RESERVED2,
+                                         SDL_LOG_CATEGORY_RESERVED3,
+                                         SDL_LOG_CATEGORY_RESERVED4,
+                                         SDL_LOG_CATEGORY_RESERVED5,
+                                         SDL_LOG_CATEGORY_RESERVED6,
+                                         SDL_LOG_CATEGORY_RESERVED7,
+                                         SDL_LOG_CATEGORY_RESERVED8,
+                                         SDL_LOG_CATEGORY_RESERVED9,
+                                         SDL_LOG_CATEGORY_RESERVED10,
+                                       
+                                         {* Beyond this point is reserved for application use *}
+                                         SDL_LOG_CATEGORY_CUSTOM);
+
+{**
+ *  \brief The predefined log priorities
+ *}
+const
+  SDL_LOG_PRIORITY_VERBOSE = 1;
+  SDL_LOG_PRIORITY_DEBUG = 2;
+  SDL_LOG_PRIORITY_INFO = 3;
+  SDL_LOG_PRIORITY_WARN = 4;
+  SDL_LOG_PRIORITY_ERROR = 5;
+  SDL_LOG_PRIORITY_CRITICAL = 6;
+  SDL_NUM_LOG_PRIORITIES = 7;
+type 
+  TSDL_LogPriority = Integer;
+
+
+{**
+ *  \brief Set the priority of all log categories
+ *}
+procedure SDL_LogSetAllPriority(priority: TSDL_LogPriority) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogSetAllPriority' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Set the priority of a particular log category
+ *}
+procedure SDL_LogSetPriority(category: Integer; priority: TSDL_LogPriority) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogSetPriority' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Get the priority of a particular log category
+ *}
+function SDL_LogGetPriority(category: Integer): TSDL_LogPriority cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogGetPriority' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Reset all priorities to default.
+ *
+ *  \note This is called in SDL_Quit().
+ *}
+procedure SDL_LogResetPriorities() cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogResetPriorities' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO
+ *}
+procedure SDL_Log(const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Log' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_PRIORITY_VERBOSE
+ *}
+procedure SDL_LogVerbose(category: Integer; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogVerbose' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_PRIORITY_DEBUG
+ *}
+procedure SDL_LogDebug(category: Integer; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogDebug' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_PRIORITY_INFO
+ *}
+procedure SDL_LogInfo(category: Integer; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogInfo' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_PRIORITY_WARN
+ *}
+procedure SDL_LogWarn(category: Integer; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogWarn' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_PRIORITY_ERROR
+ *}
+procedure SDL_LogError(category: Integer; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogError' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with SDL_LOG_PRIORITY_CRITICAL
+ *}
+procedure SDL_LogCritical(category: Integer; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogCritical' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with the specified category and priority.
+ *}
+procedure SDL_LogMessage(category: Integer; priority: TSDL_LogPriority; const fmt: PAnsiChar; pars: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogMessage' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief Log a message with the specified category and priority.
+ *}
+procedure SDL_LogMessageV(category: Integer; priority: TSDL_LogPriority; const fmt: PAnsiChar; ap: array of const) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogMessageV' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief The prototype for the log output function
+ *}
+type
+  TSDL_LogOutputFunction = procedure(userdata: Pointer; category: Integer; priority: TSDL_LogPriority; const msg: PAnsiChar);
+  PSDL_LogOutputFunction = ^TSDL_LogOutputFunction;
+  
+{**
+ *  \brief Get the current log output function.
+ *}
+procedure SDL_LogGetOutputFunction(callback: PSDL_LogOutputFunction; userdata: PPointer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogGetOutputFunction' {$ENDIF} {$ENDIF};
+
+{**
+ *  \brief This function allows you to replace the default log output
+ *         function with one of your own.
+ *}
+procedure SDL_LogSetOutputFunction(callback: TSDL_LogOutputFunction; userdata: Pointer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LogSetOutputFunction' {$ENDIF} {$ENDIF};
+
+{$ENDIF}
diff --git a/src/lib/sdl2/sdlmessagebox.inc b/src/lib/sdl2/sdlmessagebox.inc
new file mode 100644 (file)
index 0000000..2728f56
--- /dev/null
@@ -0,0 +1,108 @@
+//from "sdl_messagebox.h"
+
+  {**
+   *  SDL_MessageBox flags. If supported will display warning icon, etc.
+   *}
+const
+  SDL_MESSAGEBOX_ERROR        = $00000010;   {**< error dialog *}
+  SDL_MESSAGEBOX_WARNING      = $00000020;   {**< warning dialog *}
+  SDL_MESSAGEBOX_INFORMATION  = $00000040;   {**< informational dialog *}
+
+type
+  TSDL_MessageBoxFlags = Byte;
+
+  {**
+   *  Flags for SDL_MessageBoxButtonData.
+   *}
+const
+  SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = $00000001;  {**< Marks the default button when return is hit *}
+  SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = $00000002;   {**< Marks the default button when escape is hit *}
+type
+  TSDL_MessageBoxButtonFlags = Byte;
+
+  {**
+   *   Individual button data.
+   *}
+type
+  PSDL_MessageBoxButtonData = ^TSDL_MessageBoxButtonData;
+  TSDL_MessageBoxButtonData = record
+    flags: UInt32;     {**< ::SDL_MessageBoxButtonFlags *}
+    buttonid: Integer; {**< User defined button id (value returned via SDL_ShowMessageBox) *}
+    text: PAnsiChar;   {**< The UTF-8 button text *}
+  end;
+
+  {**
+   *  RGB value used in a message box color scheme
+   *}
+type
+  PSDL_MessageBoxColor = ^TSDL_MessageBoxColor;
+  TSDL_MessageBoxColor = record
+    r, g, b: UInt8;
+  end;
+
+  PSDL_MessageBoxColorType = ^TSDL_MessageBoxColorType;
+  TSDL_MessageBoxColorType = (SDL_MESSAGEBOX_COLOR_BACKGROUND,
+                              SDL_MESSAGEBOX_COLOR_TEXT,
+                              SDL_MESSAGEBOX_COLOR_BUTTON_BORDER,
+                              SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND,
+                              SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED,
+                              SDL_MESSAGEBOX_COLOR_MAX);
+
+  {**
+   *  A set of colors to use for message box dialogs
+   *}
+type
+  PSDL_MessageBoxColorScheme = ^TSDL_MessageBoxColorScheme;
+  TSDL_MessageBoxColorScheme = record
+    //colors: array[0..SDL_MESSAGEBOX_COLOR_MAX-1] of TSDL_MessageBoxColor;
+    colors: array[0..4] of TSDL_MessageBoxColor;   //right?!
+  end;
+
+  {**
+   *   MessageBox structure containing title, text, window, etc.
+   *}
+type
+  PSDL_MessageBoxData = ^TSDL_MessageBoxData;
+  TSDL_MessageBoxData = record
+    flags: UInt32;             {**< SDL_MessageBoxFlags *}
+    window: PSDL_Window;       {**< Parent window, can be NULL *}
+    title: PAnsiChar;          {**< UTF-8 title *}
+    _message: PAnsiChar;       {**< UTF-8 message text *}
+
+    numbuttons: Integer;
+    buttons: PSDL_MessageBoxButtonData;
+
+    colorScheme: PSDL_MessageBoxColorScheme;   {**< SDL_MessageBoxColorScheme, can be NULL to use system settings *}
+  end;
+
+  {**
+   *   Create a modal message box.
+   *
+   *   messageboxdata The SDL_MessageBoxData structure with title, text, etc.
+   *   buttonid The pointer to which user id of hit button should be copied.
+   *
+   *   -1 on error, otherwise 0 and buttonid contains user id of button
+   *   hit or -1 if dialog was closed.
+   *
+   *   This function should be called on the thread that created the parent
+   *   window, or on the main thread if the messagebox has no parent.  It will
+   *   block execution of that thread until the user clicks a button or
+   *   closes the messagebox.
+   *}
+function SDL_ShowMessageBox(messageboxdata: PSDL_MessageBoxData; buttonid: PInt): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ShowMessageBox' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Create a simple modal message box
+   *
+   *   flags    SDL_MessageBoxFlags
+   *   title    UTF-8 title text
+   *   message  UTF-8 message text
+   *   window   The parent window, or NULL for no parent
+   *
+   *   0 on success, -1 on error
+   *
+   *   SDL_ShowMessageBox
+   *}
+function SDL_ShowSimpleMessageBox(flags: UInt32; title: PAnsiChar; _message: PAnsiChar; window: PSDL_Window): Integer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ShowSimpleMessageBox' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdlmouse.inc b/src/lib/sdl2/sdlmouse.inc
new file mode 100644 (file)
index 0000000..994b52c
--- /dev/null
@@ -0,0 +1,187 @@
+//from "sdl_mouse.h"
+
+type
+  PSDL_Cursor = Pointer;
+
+const
+
+  {**
+   *  Cursor types for SDL_CreateSystemCursor.
+   *}
+
+  SDL_SYSTEM_CURSOR_ARROW = 0;     // Arrow
+  SDL_SYSTEM_CURSOR_IBEAM = 1;     // I-beam
+  SDL_SYSTEM_CURSOR_WAIT = 2;      // Wait
+  SDL_SYSTEM_CURSOR_CROSSHAIR = 3; // Crosshair
+  SDL_SYSTEM_CURSOR_WAITARROW = 4; // Small wait cursor (or Wait if not available)
+  SDL_SYSTEM_CURSOR_SIZENWSE = 5;  // Double arrow pointing northwest and southeast
+  SDL_SYSTEM_CURSOR_SIZENESW = 6;  // Double arrow pointing northeast and southwest
+  SDL_SYSTEM_CURSOR_SIZEWE = 7;    // Double arrow pointing west and east
+  SDL_SYSTEM_CURSOR_SIZENS = 8;    // Double arrow pointing north and south
+  SDL_SYSTEM_CURSOR_SIZEALL = 9;   // Four pointed arrow pointing north, south, east, and west
+  SDL_SYSTEM_CURSOR_NO = 10;        // Slashed circle or crossbones
+  SDL_SYSTEM_CURSOR_HAND = 11;      // Hand
+  SDL_NUM_SYSTEM_CURSORS = 12;
+
+type
+  PSDL_SystemCursor = ^TSDL_SystemCursor;
+  TSDL_SystemCursor = Word;
+
+  {* Function prototypes *}
+
+  {**
+   *  Get the window which currently has mouse focus.
+   *}
+
+  function SDL_GetMouseFocus: PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetMouseFocus' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Retrieve the current state of the mouse.
+   *  
+   *  The current button state is returned as a button bitmask, which can
+   *  be tested using the SDL_BUTTON(X) macros, and x and y are set to the
+   *  mouse cursor position relative to the focus window for the currently
+   *  selected mouse.  You can pass nil for either x or y.
+   *
+   * SDL_Button = 1 shl ((X)-1)
+   *}
+
+  function SDL_GetMouseState(x: PInt; y: PInt): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetMouseState' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Retrieve the relative state of the mouse.
+   *
+   *  The current button state is returned as a button bitmask, which can
+   *  be tested using the SDL_BUTTON(X) macros, and x and y are set to the
+   *  mouse deltas since the last call to SDL_GetRelativeMouseState().
+   *}
+
+  function SDL_GetRelativeMouseState(x: PInt; y: PInt): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRelativeMouseState' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Moves the mouse to the given position within the window.
+   *
+   *   window The window to move the mouse into, or nil for the current mouse focus
+   *   x The x coordinate within the window
+   *   y The y coordinate within the window
+   *
+   *  This function generates a mouse motion event
+   *}
+
+  procedure SDL_WarpMouseInWindow(window: PSDL_Window; x: SInt32; y: SInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WarpMouseInWindow' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Set relative mouse mode.
+   *
+   *  enabled Whether or not to enable relative mode
+   *
+   *  0 on success, or -1 if relative mode is not supported.
+   *
+   *  While the mouse is in relative mode, the cursor is hidden, and the
+   *  driver will try to report continuous motion in the current window.
+   *  Only relative motion events will be delivered, the mouse position
+   *  will not change.
+   *
+   *  This function will flush any pending mouse motion.
+   *  
+   *  SDL_GetRelativeMouseMode()
+   *}
+
+  function SDL_SetRelativeMouseMode(enabled: TSDL_Bool): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetRelativeMouseMode' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Query whether relative mouse mode is enabled.
+   *  
+   *  SDL_SetRelativeMouseMode()
+   *}
+
+  function SDL_GetRelativeMouseMode: TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRelativeMouseMode' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Create a cursor, using the specified bitmap data and
+   *  mask (in MSB format).
+   *
+   *  The cursor width must be a multiple of 8 bits.
+   *
+   *  The cursor is created in black and white according to the following:
+   *  <table>
+   *  <tr><td> data </td><td> mask </td><td> resulting pixel on screen </td></tr>
+   *  <tr><td>  0   </td><td>  1   </td><td> White </td></tr>
+   *  <tr><td>  1   </td><td>  1   </td><td> Black </td></tr>
+   *  <tr><td>  0   </td><td>  0   </td><td> Transparent </td></tr>
+   *  <tr><td>  1   </td><td>  0   </td><td> Inverted color if possible, black 
+   *                                         if not. </td></tr>
+   *  </table>
+   *  
+   *  SDL_FreeCursor()
+   *}
+
+  function SDL_CreateCursor(const data: PUInt8; const mask: PUInt8; w: SInt32; h: SInt32; hot_x: SInt32; hot_y: SInt32): PSDL_Cursor cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateCursor' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Create a color cursor.
+   *
+   *  SDL_FreeCursor()
+   *}
+
+  function SDL_CreateColorCursor(surface: PSDL_Surface; hot_x: SInt32; hot_y: SInt32): PSDL_Cursor cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateColorCursor' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Create a system cursor.
+   *
+   *  SDL_FreeCursor()
+   *}
+
+  function SDL_CreateSystemCursor(id: TSDL_SystemCursor): PSDL_Cursor cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateSystemCursor' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Set the active cursor.
+   *}
+
+  procedure SDL_SetCursor(cursor: PSDL_Cursor) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetCursor' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Return the active cursor.
+   *}
+
+  function SDL_GetCursor: PSDL_Cursor cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetCursor' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Frees a cursor created with SDL_CreateCursor().
+   *
+   *  SDL_CreateCursor()
+   *}
+
+  procedure SDL_FreeCursor(cursor: PSDL_Cursor) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FreeCursor' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Toggle whether or not the cursor is shown.
+   *
+   *  toggle 1 to show the cursor, 0 to hide it, -1 to query the current
+   *                state.
+   *  
+   *  1 if the cursor is shown, or 0 if the cursor is hidden.
+   *}
+
+  function SDL_ShowCursor(toggle: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ShowCursor' {$ENDIF}{$ENDIF};
+
+  function SDL_Button(button: SInt32): SInt32; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+
+const
+  {**
+   *  Used as a mask when testing buttons in buttonstate.
+   *   - Button 1:  Left mouse button
+   *   - Button 2:  Middle mouse button
+   *   - Button 3:  Right mouse button
+   *}
+
+  SDL_BUTTON_LEFT      = 1;
+  SDL_BUTTON_MIDDLE    = 2;
+  SDL_BUTTON_RIGHT     = 3;
+  SDL_BUTTON_X1            = 4;
+  SDL_BUTTON_X2            = 5;
+  SDL_BUTTON_LMASK  = 1 shl ((SDL_BUTTON_LEFT) - 1);
+  SDL_BUTTON_MMASK  = 1 shl ((SDL_BUTTON_MIDDLE) - 1);
+  SDL_BUTTON_RMASK  = 1 shl ((SDL_BUTTON_RIGHT) - 1);
+  SDL_BUTTON_X1MASK = 1 shl ((SDL_BUTTON_X1) - 1);
+  SDL_BUTTON_X2MASK = 1 shl ((SDL_BUTTON_X2) - 1);
diff --git a/src/lib/sdl2/sdlmutex.inc b/src/lib/sdl2/sdlmutex.inc
new file mode 100644 (file)
index 0000000..802ce98
--- /dev/null
@@ -0,0 +1,194 @@
+//from "sdl_mutex.h"
+
+  {**
+   *  Synchronization functions which can time out return this value
+   *  if they time out.
+   *}
+const
+  SDL_MUTEX_TIMEDOUT = 1;
+
+  {**
+   *  This is the timeout value which corresponds to never time out.
+   *}
+  //SDL_MUTEX_MAXWAIT   (~(Uint32)0)
+
+
+  {**
+   *  Mutex functions
+   *}
+type
+  {* The SDL mutex structure, defined in SDL_mutex.c *}
+  PSDL_Mutex = Pointer; //todo!
+
+  {**
+   *  Create a mutex, initialized unlocked.
+   *}
+function SDL_CreateMutex: PSDL_Mutex cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateMutex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Lock the mutex.
+   *
+   *   0, or -1 on error.
+   *}
+//#define SDL_mutexP(m)   SDL_LockMutex(m)
+function SDL_LockMutex(mutex: PSDL_Mutex): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LockMutex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Try to lock the mutex
+   *
+   *   0, SDL_MUTEX_TIMEDOUT, or -1 on error
+   *}
+function SDL_TryLockMutex(mutex: PSDL_Mutex): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_TryLockMutex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Unlock the mutex.
+   *
+   *   0, or -1 on error.
+   *
+   *   It is an error to unlock a mutex that has not been locked by
+   *   the current thread, and doing so results in undefined behavior.
+   *}
+//#define SDL_mutexV(m)   SDL_UnlockMutex(m)
+function SDL_UnlockMutex(mutex: PSDL_Mutex): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UnlockMutex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Destroy a mutex.
+   *}
+procedure SDL_DestroyMutex(mutex: PSDL_Mutex) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DestroyMutex' {$ENDIF} {$ENDIF};
+
+  {*Mutex functions*}
+
+  {**
+   *   Semaphore functions
+   *}
+type
+  {* The SDL semaphore structure, defined in SDL_sem.c *}
+  PSDL_Sem = Pointer; //todo!
+
+  {**
+   *  Create a semaphore, initialized with value, returns NULL on failure.
+   *}
+function SDL_CreateSemaphore(initial_value: UInt32): PSDL_sem cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateSemaphore' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Destroy a semaphore.
+   *}
+procedure SDL_DestroySemaphore(sem: PSDL_Sem) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DestroySemaphore' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This function suspends the calling thread until the semaphore pointed
+   *  to by sem has a positive count. It then atomically decreases the
+   *  semaphore count.
+   *}
+function SDL_SemWait(sem: PSDL_Sem): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SemWait' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Non-blocking variant of SDL_SemWait().
+   *
+   *   0 if the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait would
+   *   block, and -1 on error.
+   *}
+function SDL_SemTryWait(sem: PSDL_Sem): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SemTryWait' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Variant of SDL_SemWait() with a timeout in milliseconds.
+   *
+   *   0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait does not
+   *   succeed in the allotted time, and -1 on error.
+   *
+   *   On some platforms this function is implemented by looping with a
+   *   delay of 1 ms, and so should be avoided if possible.
+   *}
+function SDL_SemWaitTimeout(sem: PSDL_Sem; ms: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SemWaitTimeout' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Atomically increases the semaphore'_S count (not blocking).
+   *
+   *   0, or -1 on error.
+   *}
+function SDL_SemPost(sem: PSDL_Sem): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SemPost' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns the current count of the semaphore.
+   *}
+function SDL_SemValue(sem: PSDL_Sem): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SemValue' {$ENDIF} {$ENDIF};
+
+  {*Semaphore functions*}
+
+  {**
+   *  Condition variable functions
+   * }
+type
+  {* The SDL condition variable structure, defined in SDL_cond.c *}
+  PSDL_Cond = Pointer; //todo!!
+
+  {**
+   *  Create a condition variable.
+   *
+   *  Typical use of condition variables:
+   *
+   *  Thread A:
+   *    SDL_LockMutex(lock);
+   *    while ( not condition )
+   *    begin
+   *      SDL_CondWait(cond, lock);
+   *    end;
+   *    SDL_UnlockMutex(lock);
+   *
+   *  Thread B:
+   *    SDL_LockMutex(lock);
+   *    ...
+   *    condition := true;
+   *    ...
+   *    SDL_CondSignal(cond);
+   *    SDL_UnlockMutex(lock);
+   *
+   *  There is some discussion whether to signal the condition variable
+   *  with the mutex locked or not.  There is some potential performance
+   *  benefit to unlocking first on some platforms, but there are some
+   *  potential race conditions depending on how your code is structured.
+   *
+   *  In general it'_S safer to signal the condition variable while the
+   *  mutex is locked.
+   *}
+function SDL_CreateCond: PSDL_Cond cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateCond' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Destroy a condition variable.
+   *}
+procedure SDL_DestroyCond(cond: PSDL_Cond) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DestroyCond' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Restart one of the threads that are waiting on the condition variable.
+   *
+   *   0 or -1 on error.
+   *}
+function SDL_CondSignal(cond: PSDL_Cond): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CondSignal' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Restart all threads that are waiting on the condition variable.
+   *
+   *   0 or -1 on error.
+   *}
+function SDL_CondBroadcast(cond: PSDL_Cond): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CondBroadcast' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Wait on the condition variable, unlocking the provided mutex.
+   *
+   *   The mutex must be locked before entering this function!
+   *
+   *  The mutex is re-locked once the condition variable is signaled.
+   *
+   *   0 when it is signaled, or -1 on error.
+   *}
+function SDL_CondWait(cond: PSDL_Cond; mutex: PSDL_Mutex): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CondWait' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Waits for at most ms milliseconds, and returns 0 if the condition
+   *  variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not
+   *  signaled in the allotted time, and -1 on error.
+   *
+   *   On some platforms this function is implemented by looping with a
+   *   delay of 1 ms, and so should be avoided if possible.
+   *}
+function SDL_CondWaitTimeout(cond: PSDL_Cond; mutex: PSDL_Mutex; ms: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CondWaitTimeout' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlpixels.inc b/src/lib/sdl2/sdlpixels.inc
new file mode 100644 (file)
index 0000000..fc6aad3
--- /dev/null
@@ -0,0 +1,504 @@
+//from "sdl_pixels.h"
+
+  {**
+   *  Transparency definitions
+   *
+   *  These define alpha as the opacity of a surface.
+   *}
+
+  const
+    SDL_ALPHA_OPAQUE = 255;
+    SDL_ALPHA_TRANSPARENT = 0;
+
+    {** Pixel type. *}
+    SDL_PIXELTYPE_UNKNOWN = 0;
+    SDL_PIXELTYPE_INDEX1 = 1;
+    SDL_PIXELTYPE_INDEX4 = 2;
+    SDL_PIXELTYPE_INDEX8 = 3;
+    SDL_PIXELTYPE_PACKED8 = 4;
+    SDL_PIXELTYPE_PACKED16 = 5;
+    SDL_PIXELTYPE_PACKED32 = 6;
+    SDL_PIXELTYPE_ARRAYU8 = 7;
+    SDL_PIXELTYPE_ARRAYU16 = 8;
+    SDL_PIXELTYPE_ARRAYU32 = 9;
+    SDL_PIXELTYPE_ARRAYF16 = 10;
+    SDL_PIXELTYPE_ARRAYF32 = 11;
+
+    {** Bitmap pixel order, high bit -> low bit. *}
+    SDL_BITMAPORDER_NONE = 0;
+    SDL_BITMAPORDER_4321 = 1;
+    SDL_BITMAPORDER_1234 = 2;
+
+    {** Packed component order, high bit -> low bit. *}
+
+    SDL_PACKEDORDER_NONE = 0;
+    SDL_PACKEDORDER_XRGB = 1;
+    SDL_PACKEDORDER_RGBX = 2;
+    SDL_PACKEDORDER_ARGB = 3;
+    SDL_PACKEDORDER_RGBA = 4;
+    SDL_PACKEDORDER_XBGR = 5;
+    SDL_PACKEDORDER_BGRX = 6;
+    SDL_PACKEDORDER_ABGR = 7;
+    SDL_PACKEDORDER_BGRA = 8;
+
+    {** Array component order, low byte -> high byte. *}
+    SDL_ARRAYORDER_NONE = 0;
+    SDL_ARRAYORDER_RGB  = 1;
+    SDL_ARRAYORDER_RGBA = 2;
+    SDL_ARRAYORDER_ARGB = 3;
+    SDL_ARRAYORDER_BGR  = 4;
+    SDL_ARRAYORDER_BGRA = 5;
+    SDL_ARRAYORDER_ABGR = 6;
+
+    {** Packed component layout. *}
+    SDL_PACKEDLAYOUT_NONE = 0;
+    SDL_PACKEDLAYOUT_332  = 1;
+    SDL_PACKEDLAYOUT_4444 = 2;
+    SDL_PACKEDLAYOUT_1555 = 3;
+    SDL_PACKEDLAYOUT_5551 = 4;
+    SDL_PACKEDLAYOUT_565  = 5;
+    SDL_PACKEDLAYOUT_8888 = 6;
+    SDL_PACKEDLAYOUT_2101010 = 7;
+    SDL_PACKEDLAYOUT_1010102 = 8;
+
+    {
+        //todo!!
+function SDL_DEFINE_PIXELFORMAT(type, order, layour, bit, bytes: UInt32): Result;
+
+function SDL_DEFINE_PIXELFOURCC(A,B,C,D: Variant): Variant;
+
+#define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \
+    ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \
+     ((bits) << 8) | ((bytes) << 0))
+       }
+
+function SDL_PIXELFLAG(X: Cardinal): Boolean;
+function SDL_PIXELTYPE(X: Cardinal): Boolean;
+function SDL_PIXELORDER(X: Cardinal): Boolean;
+function SDL_PIXELLAYOUT(X: Cardinal): Boolean;
+function SDL_BITSPERPIXEL(X: Cardinal): Boolean;
+     {
+#define SDL_BYTESPERPIXEL(X) \
+    (SDL_ISPIXELFORMAT_FOURCC(X) ? \
+        ((((X) == SDL_PIXELFORMAT_YUY2) || \
+          ((X) == SDL_PIXELFORMAT_UYVY) || \
+          ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF))
+
+#define SDL_ISPIXELFORMAT_INDEXED(format)   \
+    (!SDL_ISPIXELFORMAT_FOURCC(format) && \
+     ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \
+      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \
+      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8)))
+
+#define SDL_ISPIXELFORMAT_ALPHA(format)   \
+    (!SDL_ISPIXELFORMAT_FOURCC(format) && \
+     ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \
+      (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \
+      (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \
+      (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA)))
+
+  function SDL_IsPixelFormat_FOURCC(format: Variant);
+
+  {* Note: If you modify this list, update SDL_GetPixelFormatName() *}
+
+const
+    SDL_PIXELFORMAT_UNKNOWN = 0;
+    SDL_PIXELFORMAT_INDEX1LSB = (1 shl 28)                    or
+                                (SDL_PIXELTYPE_INDEX1 shl 24) or
+                                (SDL_BITMAPORDER_4321 shl 20) or
+                                (0 shl 16)                    or
+                                (1 shl 8)                     or
+                                (0 shl 0);
+
+    SDL_PIXELFORMAT_INDEX1MSB = (1 shl 28)                    or
+                                (SDL_PIXELTYPE_INDEX1 shl 24) or
+                                (SDL_BITMAPORDER_1234 shl 20) or
+                                (0 shl 16)                    or
+                                (1 shl 8)                     or
+                                (0 shl 0);
+
+    SDL_PIXELFORMAT_INDEX4LSB = (1 shl 28)                    or
+                                (SDL_PIXELTYPE_INDEX4 shl 24) or
+                                (SDL_BITMAPORDER_4321 shl 20) or
+                                (0 shl 16)                    or
+                                (4 shl 8)                     or
+                                (0 shl 0);
+
+    SDL_PIXELFORMAT_INDEX4MSB = (1 shl 28)                    or
+                                (SDL_PIXELTYPE_INDEX4 shl 24) or
+                                (SDL_BITMAPORDER_1234 shl 20) or
+                                (0 shl 16)                    or
+                                (4 shl 8)                     or
+                                (0 shl 0);
+
+    SDL_PIXELFORMAT_INDEX8 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED8 shl 24)  or
+                                (0 shl 20)                      or
+                                (0 shl 16)                      or
+                                (8 shl 8)                       or
+                                (1 shl 0);
+
+    SDL_PIXELFORMAT_RGB332 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED8 shl 24)  or
+                                (SDL_PACKEDORDER_XRGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_332 shl 16)   or
+                                (8 shl 8)                       or
+                                (1 shl 0);
+
+    SDL_PIXELFORMAT_RGB444 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_XRGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_4444 shl 16)  or
+                                (12 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_RGB555 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_XRGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_1555 shl 16)  or
+                                (15 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_BGR555 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_XBGR shl 20)   or
+                                (SDL_PACKEDLAYOUT_1555 shl 16)  or
+                                (15 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_ARGB4444 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_ARGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_4444 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_RGBA4444 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_RGBA shl 20)   or
+                                (SDL_PACKEDLAYOUT_4444 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_ABGR4444 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_ABGR shl 20)   or
+                                (SDL_PACKEDLAYOUT_4444 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_BGRA4444 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_BGRA shl 20)   or
+                                (SDL_PACKEDLAYOUT_4444 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_ARGB1555 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_ARGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_1555 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_RGBA5551 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_RGBA shl 20)   or
+                                (SDL_PACKEDLAYOUT_5551 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_ABGR1555 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_ABGR shl 20)   or
+                                (SDL_PACKEDLAYOUT_1555 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_BGRA5551 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_BGRA shl 20)   or
+                                (SDL_PACKEDLAYOUT_5551 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_RGB565 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_XRGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_565 shl 16)   or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_BGR565 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED16 shl 24) or
+                                (SDL_PACKEDORDER_XBGR shl 20)   or
+                                (SDL_PACKEDLAYOUT_1555 shl 16)  or
+                                (16 shl 8)                      or
+                                (2 shl 0);
+
+    SDL_PIXELFORMAT_RGB24 =     (1 shl 28)                      or
+                                (SDL_PIXELTYPE_ARRAYU8 shl 24)  or
+                                (SDL_ARRAYORDER_RGB shl 20)     or
+                                (0 shl 16)                      or
+                                (24 shl 8)                      or
+                                (3 shl 0);
+
+    SDL_PIXELFORMAT_BGR24 =     (1 shl 28)                      or
+                                (SDL_PIXELTYPE_ARRAYU8 shl 24)  or
+                                (SDL_ARRAYORDER_BGR shl 20)     or
+                                (0 shl 16)                      or
+                                (24 shl 8)                      or
+                                (3 shl 0);
+
+    SDL_PIXELFORMAT_RGB888 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_XRGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (24 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_RGBX8888 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_RGBX shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (24 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_BGR888 =    (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_XBGR shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (24 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_BGRX8888 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_BGRX shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (24 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_ARGB8888 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_ARGB shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (32 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_RGBA8888 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_RGBA shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (32 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_ABGR8888 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_ABGR shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (32 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_BGRA8888 =  (1 shl 28)                      or
+                                (SDL_PIXELTYPE_PACKED32 shl 24) or
+                                (SDL_PACKEDORDER_RGBX shl 20)   or
+                                (SDL_PACKEDLAYOUT_8888 shl 16)  or
+                                (32 shl 8)                      or
+                                (4 shl 0);
+
+    SDL_PIXELFORMAT_ARGB2101010 = (1 shl 28)                       or
+                                  (SDL_PIXELTYPE_PACKED32 shl 24)  or
+                                  (SDL_PACKEDORDER_ARGB shl 20)    or
+                                  (SDL_PACKEDLAYOUT_2101010 shl 16)or
+                                  (32 shl 8)                       or
+                                  (4 shl 0);
+
+    {**< Planar mode: Y + V + U  (3 planes) *}
+    SDL_PIXELFORMAT_YV12 = (Integer('Y')       ) or
+                           (Integer('V') shl  8) or
+                           (Integer('1') shl 16) or
+                           (Integer('2') shl 24);
+    {**< Planar mode: Y + U + V  (3 planes) *}
+    SDL_PIXELFORMAT_IYUV = (Integer('I')       ) or
+                           (Integer('Y') shl  8) or
+                           (Integer('U') shl 16) or
+                           (Integer('V') shl 24);
+    {**< Packed mode: Y0+U0+Y1+V0 (1 plane) *}
+    SDL_PIXELFORMAT_YUY2 = (Integer('Y')       ) or
+                           (Integer('U') shl  8) or
+                           (Integer('Y') shl 16) or
+                           (Integer('2') shl 24);
+    {**< Packed mode: U0+Y0+V0+Y1 (1 plane) *}
+    SDL_PIXELFORMAT_UYVY = (Integer('U')       ) or
+                           (Integer('Y') shl  8) or
+                           (Integer('V') shl 16) or
+                           (Integer('Y') shl 24);
+    {**< Packed mode: Y0+V0+Y1+U0 (1 plane) *}
+    SDL_PIXELFORMAT_YVYU = (Integer('Y')       ) or
+                           (Integer('V') shl  8) or
+                           (Integer('Y') shl 16) or
+                           (Integer('U') shl 24);
+
+type
+  PSDL_Color = ^TSDL_Color;
+  TSDL_Color = record
+    r: UInt8;
+    g: UInt8;
+    b: UInt8;
+    a: UInt8;
+  end;
+
+  TSDL_Colour = TSDL_Color;
+  PSDL_Colour = ^TSDL_Colour;
+
+  PSDL_Palette = ^TSDL_Palette;
+  TSDL_Palette = record
+    ncolors: SInt32;
+    colors: PSDL_Color;
+    version: UInt32;
+    refcount: SInt32;
+  end;
+
+  {**
+   *  Everything in the pixel format structure is read-only.
+   *}
+
+  PSDL_PixelFormat = ^TSDL_PixelFormat;
+  TSDL_PixelFormat = record
+    format: UInt32;
+    palette: PSDL_Palette;
+    BitsPerPixel: UInt8;
+    BytesPerPixel: UInt8;
+    padding: array[0..1] of UInt8;
+    Rmask: UInt32;
+    Gmask: UInt32;
+    Bmask: UInt32;
+    Amask: UInt32;
+    Rloss: UInt8;
+    Gloss: UInt8;
+    Bloss: UInt8;
+    Aloss: UInt8;
+    Rshift: UInt8;
+    Gshift: UInt8;
+    Bshift: UInt8;
+    Ashift: UInt8;
+    refcount: SInt32;
+    next: PSDL_PixelFormat;
+  end;
+
+  {**
+   *  Get the human readable name of a pixel format
+   *}
+
+function SDL_GetPixelFormatName(format: UInt32): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetPixelFormatName' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Convert one of the enumerated pixel formats to a bpp and RGBA masks.
+   *
+   *  SDL_TRUE, or SDL_FALSE if the conversion wasn't possible.
+   *
+   *  SDL_MasksToPixelFormatEnum()
+   *}
+
+function SDL_PixelFormatEnumToMasks(format: UInt32; bpp: PInt; Rmask: PUInt32; Gmask: PUInt32; Bmask: PUInt32; Amask: PUInt32): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_PixelFormatEnumToMasks' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Convert a bpp and RGBA masks to an enumerated pixel format.
+   *
+   *  The pixel format, or SDL_PIXELFORMAT_UNKNOWN if the conversion
+   *  wasn't possible.
+   *
+   *  SDL_PixelFormatEnumToMasks()
+   *}
+
+function SDL_MasksToPixelFormatEnum(bpp: SInt32; Rmask: UInt32; Gmask: UInt32; Bmask: UInt32; Amask: UInt32): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MasksToPixelFormatEnum' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create an SDL_PixelFormat structure from a pixel format enum.
+   *}
+
+function SDL_AllocFormat(pixel_format: UInt32): PSDL_PixelFormat cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AllocFormat' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Free an SDL_PixelFormat structure.
+   *}
+
+procedure SDL_FreeFormat(format: PSDL_PixelFormat) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FreeFormat' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a palette structure with the specified number of color
+   *  entries.
+   *
+   *  A new palette, or nil if there wasn't enough memory.
+   *
+   *  The palette entries are initialized to white.
+   *  
+   *  SDL_FreePalette()
+   *}
+
+function SDL_AllocPalette(ncolors: SInt32): PSDL_Palette cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AllocPalette' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the palette for a pixel format structure.
+   *}
+
+function SDL_SetPixelFormatPalette(format: PSDL_PixelFormat; palette: PSDL_Palette): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetPixelFormatPalette' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set a range of colors in a palette.
+   *
+   *  palette    The palette to modify.
+   *  colors     An array of colors to copy into the palette.
+   *  firstcolor The index of the first palette entry to modify.
+   *  ncolors    The number of entries to modify.
+   *
+   *  0 on success, or -1 if not all of the colors could be set.
+   *}
+
+function SDL_SetPaletteColors(palette: PSDL_Palette; const colors: PSDL_Color; firstcolor: SInt32; ncolors: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetPaletteColors' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Free a palette created with SDL_AllocPalette().
+   *
+   *  SDL_AllocPalette()
+   *}
+
+procedure SDL_FreePalette(palette: PSDL_Palette) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FreePalette' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Maps an RGB triple to an opaque pixel value for a given pixel format.
+   *
+   *  SDL_MapRGBA
+   *}
+
+function SDL_MapRGB(const format: PSDL_PixelFormat; r: UInt8; g: UInt8; b: UInt8): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MapRGB' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Maps an RGBA quadruple to a pixel value for a given pixel format.
+   *
+   *  SDL_MapRGB
+   *}
+
+function SDL_MapRGBA(const format: PSDL_PixelFormat; r: UInt8; g: UInt8; b: UInt8; a: UInt8): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MapRGBA' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the RGB components from a pixel of the specified format.
+   *
+   *  SDL_GetRGBA
+   *}
+
+procedure SDL_GetRGB(pixel: UInt32; const format: PSDL_PixelFormat; r: PUInt8; g: PUInt8; b: PUInt8) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRGB' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the RGBA components from a pixel of the specified format.
+   *
+   *  SDL_GetRGB
+   *}
+
+procedure SDL_GetRGBA(pixel: UInt32; const format: PSDL_PixelFormat; r: PUInt8; g: PUInt8; b: PUInt8; a: PUInt8) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRGBA' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Calculate a 256 entry gamma ramp for a gamma value.
+   *}
+
+procedure SDL_CalculateGammaRamp(gamma: Float; ramp: PUInt16) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CalculateGammaRamp' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlplatform.inc b/src/lib/sdl2/sdlplatform.inc
new file mode 100644 (file)
index 0000000..fe283c5
--- /dev/null
@@ -0,0 +1,6 @@
+//from sdl_platform.h
+
+{**
+ *  Gets the name of the platform.
+ *}
+function SDL_GetPlatform: PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetPlatform' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlpower.inc b/src/lib/sdl2/sdlpower.inc
new file mode 100644 (file)
index 0000000..1e1bcb6
--- /dev/null
@@ -0,0 +1,26 @@
+//from "sdl_power.h"
+
+  {**
+   *  The basic state for the system's power supply.
+   *}
+type
+  TSDL_PowerState = (SDL_POWERSTATE_UNKNOWN,      {**< cannot determine power status *}
+                     SDL_POWERSTATE_ON_BATTERY,   {**< Not plugged in, running on the battery *}
+                     SDL_POWERSTATE_NO_BATTERY,   {**< Plugged in, no battery available *}
+                     SDL_POWERSTATE_CHARGING,     {**< Plugged in, charging battery *}
+                     SDL_POWERSTATE_CHARGED);     {**< Plugged in, battery charged *}
+
+  {**
+   *  Get the current power supply details.
+   *
+   *   secs Seconds of battery life left. You can pass a NULL here if
+   *        you don't care. Will return -1 if we can't determine a
+   *        value, or we're not running on a battery.
+   *
+   *   pct Percentage of battery life left, between 0 and 100. You can
+   *       pass a NULL here if you don't care. Will return -1 if we
+   *       can't determine a value, or we're not running on a battery.
+   *
+   *  The state of the battery (if any).
+   *}
+function SDL_GetPowerInfo(secs: PInt; pct: PInt): TSDL_PowerState cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetPowerInfo' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlrect.inc b/src/lib/sdl2/sdlrect.inc
new file mode 100644 (file)
index 0000000..b7837bd
--- /dev/null
@@ -0,0 +1,83 @@
+//from "sdl_rect.h"
+
+type
+  {**
+   *  The structure that defines a point
+   *
+   *  SDL_EnclosePoints
+   *}
+
+  PSDL_Point = ^TSDL_Point;
+  TSDL_Point = record
+    x: SInt32;
+    y: SInt32;
+  end;
+
+  {**
+   *  A rectangle, with the origin at the upper left.
+   *
+   *  SDL_RectEmpty
+   *  SDL_RectEquals
+   *  SDL_HasIntersection
+   *  SDL_IntersectRect
+   *  SDL_UnionRect
+   *  SDL_EnclosePoints
+   *}
+
+  PSDL_Rect = ^TSDL_Rect;
+  TSDL_Rect = record
+    x,y: SInt32;
+    w,h: SInt32;
+  end;
+
+  {**
+   *  Returns true if the rectangle has no area.
+   *}
+
+  //changed from variant(b�����h!) to TSDL_Rect
+  //maybe PSDL_Rect?
+function SDL_RectEmpty(X: TSDL_Rect): Boolean;
+
+    {**
+     *  Returns true if the two rectangles are equal.
+     *}
+
+function SDL_RectEquals(A: TSDL_Rect; B: TSDL_Rect): Boolean;
+
+  {**
+   *  Determine whether two rectangles intersect.
+   *
+   *  SDL_TRUE if there is an intersection, SDL_FALSE otherwise.
+   *}
+
+function SDL_HasIntersection(const A: PSDL_Rect; const B: PSDL_Rect): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HasIntersection' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Calculate the intersection of two rectangles.
+   *
+   *  SDL_TRUE if there is an intersection, SDL_FALSE otherwise.
+   *}
+
+function SDL_IntersectRect(const A: PSDL_Rect; const B: PSDL_Rect; result: PSDL_Rect): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IntersectRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Calculate the union of two rectangles.
+   *}
+
+procedure SDL_UnionRect(const A: PSDL_Rect; const B: PSDL_Rect; result: PSDL_Rect) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UnionRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Calculate a minimal rectangle enclosing a set of points
+   *
+   *  SDL_TRUE if any points were within the clipping rect
+   *}
+
+function SDL_EnclosePoints(const points: PSDL_Point; count: SInt32; const clip: PSDL_Rect; result: PSDL_Rect): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_EnclosePoints' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Calculate the intersection of a rectangle and line segment.
+   *
+   *  SDL_TRUE if there is an intersection, SDL_FALSE otherwise.
+   *}
+
+function SDL_IntersectRectAndLine(const rect: PSDL_Rect; X1: PInt; Y1: PInt; X2: PInt; Y2: PInt): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IntersectRectAndLine' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlrenderer.inc b/src/lib/sdl2/sdlrenderer.inc
new file mode 100644 (file)
index 0000000..466173c
--- /dev/null
@@ -0,0 +1,743 @@
+//from "sdl_renderer.h"
+
+  {**
+   *  Flags used when creating a rendering context
+   *}
+const
+  SDL_RENDERER_SOFTWARE = $00000001;          {**< The renderer is a software fallback *}
+  SDL_RENDERER_ACCELERATED = $00000002;       {**< The renderer uses hardware
+                                                   acceleration *}
+  SDL_RENDERER_PRESENTVSYNC = $00000004;      {**< Present is synchronized
+                                                   with the refresh rate *}
+  SDL_RENDERER_TARGETTEXTURE = $00000008;     {**< The renderer supports
+                                                   rendering to texture *}
+
+type
+  PSDL_RendererFlags = ^TSDL_RendererFlags;
+  TSDL_RendererFlags = Word;
+
+  {**
+   *  Information on the capabilities of a render driver or context.
+   *}
+  PSDL_RendererInfo = ^TSDL_RendererInfo;
+  TSDL_RendererInfo = record  
+    name: PAnsiChar;                         {**< The name of the renderer *}
+    flags: UInt32;                           {**< Supported ::SDL_RendererFlags *}
+    num_texture_formats: UInt32;             {**< The number of available texture formats *}
+    texture_formats: array[0..15] of UInt32; {**< The available texture formats *}
+    max_texture_width: SInt32;               {**< The maximimum texture width *}
+    max_texture_height: SInt32;              {**< The maximimum texture height *}
+  end;
+
+  {**
+   *  The access pattern allowed for a texture.
+   *}
+type
+  PSDL_TextureAccess = ^TSDL_TextureAccess;
+  TSDL_TextureAccess = SInt32;
+
+const
+  SDL_TEXTUREACCESS_STATIC    = 0; {**< Changes rarely, not lockable *}
+  SDL_TEXTUREACCESS_STREAMING = 1; {**< Changes frequently, lockable *}
+  SDL_TEXTUREACCESS_TARGET    = 2; {**< Texture can be used as a render target *}
+
+type
+  {**
+   *  The texture channel modulation used in SDL_RenderCopy().
+   *}
+  PSDL_TextureModulate = ^TSDL_TextureModulate;
+  TSDL_TextureModulate = (
+                          SDL_TEXTUREMODULATE_NONE,     {**< No modulation *}
+                          SDL_TEXTUREMODULATE_COLOR,    {**< srcC = srcC * color *}
+                          SDL_TEXTUREMODULATE_ALPHA     {**< srcA = srcA * alpha *}
+                          );
+
+  {**
+   *  Flip constants for SDL_RenderCopyEx
+   *}
+type
+  PSDL_RendererFlip = ^TSDL_RendererFlip;
+  TSDL_RendererFlip = (SDL_FLIP_NONE,       {**< Do not flip *}
+                       SDL_FLIP_HORIZONTAL, {**< flip horizontally *}
+                       SDL_FLIP_VERTICAL    {**< flip vertically *}
+                       );
+
+  {**
+   *  A structure representing rendering state
+   *}
+
+  PPSDL_Renderer = ^PSDL_Renderer;
+  PSDL_Renderer = ^TSDL_Renderer;
+  TSDL_Renderer = record
+    end;
+
+  {**
+   *  An efficient driver-specific representation of pixel data
+   *}
+  PSDL_Texture = ^TSDL_Texture;
+  TSDL_Texture = record
+    end;
+
+  {* Function prototypes *}
+
+  {**
+   *  Get the number of 2D rendering drivers available for the current
+   *  display.
+   *
+   *  A render driver is a set of code that handles rendering and texture
+   *  management on a particular display.  Normally there is only one, but
+   *  some drivers may have several available with different capabilities.
+   *
+   *   SDL_GetRenderDriverInfo()
+   *   SDL_CreateRenderer()
+   *}
+function SDL_GetNumRenderDrivers: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumRenderDrivers' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get information about a specific 2D rendering driver for the current
+   *  display.
+   *
+   *   index The index of the driver to query information about.
+   *   info  A pointer to an SDL_RendererInfo struct to be filled with
+   *               information on the rendering driver.
+   *
+   *   0 on success, -1 if the index was out of range.
+   *
+   *   SDL_CreateRenderer()
+   *}
+function SDL_GetRenderDriverInfo(index: SInt32; info: PSDL_RendererInfo): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRenderDriverInfo' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a window and default renderer
+   *
+   *   width    The width of the window
+   *   height   The height of the window
+   *   window_flags The flags used to create the window
+   *   window   A pointer filled with the window, or NULL on error
+   *   renderer A pointer filled with the renderer, or NULL on error
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_CreateWindowAndRenderer(width: SInt32; height: SInt32; window_flags: UInt32; window: PPSDL_Window; renderer: PPSDL_Renderer): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateWindowAndRenderer' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a 2D rendering context for a window.
+   *
+   *   window The window where rendering is displayed.
+   *   index    The index of the rendering driver to initialize, or -1 to
+   *                  initialize the first one supporting the requested flags.
+   *   flags    ::SDL_RendererFlags.
+   *
+   *   A valid rendering context or NULL if there was an error.
+   *
+   *   SDL_CreateSoftwareRenderer()
+   *   SDL_GetRendererInfo()
+   *   SDL_DestroyRenderer()
+   *}
+function SDL_CreateRenderer(window: PSDL_Window; index: SInt32; flags: UInt32): PSDL_Renderer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateRenderer' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a 2D software rendering context for a surface.
+   *
+   *   surface The surface where rendering is done.
+   *
+   *   A valid rendering context or NULL if there was an error.
+   *
+   *   SDL_CreateRenderer()
+   *   SDL_DestroyRenderer()
+   *}
+function SDL_CreateSoftwareRenderer(surface: PSDL_Surface): PSDL_Renderer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateSoftwareRenderer' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the renderer associated with a window.
+   *}
+function SDL_GetRenderer(window: PSDL_Window): PSDL_Renderer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRenderer' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get information about a rendering context.
+   *}
+function SDL_GetRendererInfo(renderer: PSDL_Renderer; info: PSDL_RendererInfo): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRendererInfo' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the output size of a rendering context.
+   *}
+function SDL_GetRendererOutputSize(renderer: PSDL_Renderer; w: PInt; h: PInt): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRendererOutputSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a texture for a rendering context.
+   *
+   *   renderer The renderer.
+   *   format The format of the texture.
+   *   access One of the enumerated values in ::SDL_TextureAccess.
+   *   w      The width of the texture in pixels.
+   *   h      The height of the texture in pixels.
+   *
+   *   The created texture is returned, or 0 if no rendering context was
+   *   active,  the format was unsupported, or the width or height were out
+   *   of range.
+   *
+   *  SDL_QueryTexture()
+   *  SDL_UpdateTexture()
+   *  SDL_DestroyTexture()
+   *}
+function SDL_CreateTexture(renderer: PSDL_Renderer; format: UInt32; access: SInt32; w: SInt32; h: SInt32): PSDL_Texture cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a texture from an existing surface.
+   *
+   *   renderer The renderer.
+   *   surface The surface containing pixel data used to fill the texture.
+   *
+   *   The created texture is returned, or 0 on error.
+   *
+   *   The surface is not modified or freed by this function.
+   *
+   *   SDL_QueryTexture()
+   *   SDL_DestroyTexture()
+   *}
+function SDL_CreateTextureFromSurface(renderer: PSDL_Renderer; surface: PSDL_Surface): PSDL_Texture cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateTextureFromSurface' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Query the attributes of a texture
+   *
+   *   texture A texture to be queried.
+   *   format  A pointer filled in with the raw format of the texture.  The
+   *           actual format may differ, but pixel transfers will use this
+   *           format.
+   *   access  A pointer filled in with the actual access to the texture.
+   *   w       A pointer filled in with the width of the texture in pixels.
+   *   h       A pointer filled in with the height of the texture in pixels.
+   *
+   *   0 on success, or -1 if the texture is not valid.
+   *}
+function SDL_QueryTexture(texture: PSDL_Texture; format: PUInt32; access: PInt; w: PInt; h: PInt): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_QueryTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set an additional color value used in render copy operations.
+   *
+   *   texture The texture to update.
+   *   r       The red color value multiplied into copy operations.
+   *   g       The green color value multiplied into copy operations.
+   *   b       The blue color value multiplied into copy operations.
+   *
+   *   0 on success, or -1 if the texture is not valid or color modulation
+   *   is not supported.
+   *
+   *   SDL_GetTextureColorMod()
+   *}
+function SDL_SetTextureColorMod(texture: PSDL_Texture; r: UInt8; g: UInt8; b: UInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetTextureColorMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the additional color value used in render copy operations.
+   *
+   *   texture The texture to query.
+   *   r         A pointer filled in with the current red color value.
+   *   g         A pointer filled in with the current green color value.
+   *   b         A pointer filled in with the current blue color value.
+   *
+   *   0 on success, or -1 if the texture is not valid.
+   *
+   *   SDL_SetTextureColorMod()
+   *}
+function SDL_GetTextureColorMod(texture: PSDL_Texture; r: PUInt8; g: PUInt8; b: PUInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetTextureColorMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set an additional alpha value used in render copy operations.
+   *
+   *   texture The texture to update.
+   *   alpha     The alpha value multiplied into copy operations.
+   *
+   *   0 on success, or -1 if the texture is not valid or alpha modulation
+   *   is not supported.
+   *
+   *   SDL_GetTextureAlphaMod()
+   *}
+function SDL_SetTextureAlphaMod(texture: PSDL_Texture; alpha: UInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetTextureAlphaMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the additional alpha value used in render copy operations.
+   *
+   *   texture The texture to query.
+   *   alpha     A pointer filled in with the current alpha value.
+   *
+   *   0 on success, or -1 if the texture is not valid.
+   *
+   *   SDL_SetTextureAlphaMod()
+   *}
+function SDL_GetTextureAlphaMod(texture: PSDL_Texture; alpha: PUInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetTextureAlphaMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *   Set the blend mode used for texture copy operations.
+   *
+   *   texture The texture to update.
+   *   blendMode ::SDL_BlendMode to use for texture blending.
+   *
+   *   0 on success, or -1 if the texture is not valid or the blend mode is
+   *   not supported.
+   *
+   *   If the blend mode is not supported, the closest supported mode is
+   *   chosen.
+   *
+   *   SDL_GetTextureBlendMode()
+   *}
+function SDL_SetTextureBlendMode(texture: PSDL_Texture; blendMode: TSDL_BlendMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetTextureBlendMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the blend mode used for texture copy operations.
+   *
+   *   texture   The texture to query.
+   *   blendMode A pointer filled in with the current blend mode.
+   *
+   *   0 on success, or -1 if the texture is not valid.
+   *
+   *   SDL_SetTextureBlendMode()
+   *}
+function SDL_GetTextureBlendMode(texture: PSDL_Texture; blendMode: PSDL_BlendMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetTextureBlendMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Update the given texture rectangle with new pixel data.
+   *
+   *   texture   The texture to update
+   *   rect      A pointer to the rectangle of pixels to update, or NULL to
+   *                   update the entire texture.
+   *   pixels    The raw pixel data.
+   *   pitch     The number of bytes between rows of pixel data.
+   *
+   *   0 on success, or -1 if the texture is not valid.
+   *
+   *   This is a fairly slow function.
+   *}
+function SDL_UpdateTexture(texture: PSDL_Texture; rect: PSDL_Rect; pixels: Pointer; pitch: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UpdateTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Lock a portion of the texture for write-only pixel access.
+   *
+   *   texture   The texture to lock for access, which was created with
+   *             SDL_TEXTUREACCESS_STREAMING.
+   *   rect      A pointer to the rectangle to lock for access. If the rect
+   *             is NULL, the entire texture will be locked.
+   *   pixels    This is filled in with a pointer to the locked pixels,
+   *             appropriately offset by the locked area.
+   *   pitch     This is filled in with the pitch of the locked pixels.
+   *
+   *   0 on success, or -1 if the texture is not valid or was not created with ::SDL_TEXTUREACCESS_STREAMING.
+   *
+   *   SDL_UnlockTexture()
+   *}
+function SDL_LockTexture(texture: PSDL_Texture; rect: PSDL_Rect; pixels: PPointer; pitch: PInt): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LockTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Unlock a texture, uploading the changes to video memory, if needed.
+   *
+   *   SDL_LockTexture()
+   *}
+procedure SDL_UnlockTexture(texture: PSDL_Texture) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LockTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Determines whether a window supports the use of render targets
+   *
+   *  renderer The renderer that will be checked
+   *
+   *  SDL_TRUE if supported, SDL_FALSE if not.
+   *}
+function SDL_RenderTargetSupported(renderer: PSDL_Renderer): Boolean cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderTargetSupported' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set a texture as the current rendering target.
+   *
+   *  renderer The renderer.
+   *  texture The targeted texture, which must be created with the SDL_TEXTUREACCESS_TARGET flag, or NULL for the default render target
+   *
+   *  0 on success, or -1 on error
+   *
+   *   SDL_GetRenderTarget()
+   *}
+function SDL_SetRenderTarget(renderer: PSDL_Renderer; texture: PSDL_Texture): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetRenderTarget' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the current render target or NULL for the default render target.
+   *
+   *  The current render target
+   *
+   *   SDL_SetRenderTarget()
+   *}
+function SDL_GetRenderTarget(renderer: PSDL_Renderer): PSDL_Texture cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRenderTarget' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set device independent resolution for rendering
+   *
+   *   renderer The renderer for which resolution should be set.
+   *   w      The width of the logical resolution
+   *   h      The height of the logical resolution
+   *
+   *  This function uses the viewport and scaling functionality to allow a fixed logical
+   *  resolution for rendering, regardless of the actual output resolution.  If the actual
+   *  output resolution doesn't have the same aspect ratio the output rendering will be
+   *  centered within the output display.
+   *
+   *  If the output display is a window, mouse events in the window will be filtered
+   *  and scaled so they seem to arrive within the logical resolution.
+   *
+   *   If this function results in scaling or subpixel drawing by the
+   *   rendering backend, it will be handled using the appropriate
+   *   quality hints.
+   *
+   *   SDL_RenderGetLogicalSize()
+   *   SDL_RenderSetScale()
+   *   SDL_RenderSetViewport()
+   *}
+function SDL_RenderSetLogicalSize(renderer: PSDL_Renderer; w: SInt32; h: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderSetLogicalSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get device independent resolution for rendering
+   *
+   *   renderer The renderer from which resolution should be queried.
+   *   w      A pointer filled with the width of the logical resolution
+   *   h      A pointer filled with the height of the logical resolution
+   *
+   *   SDL_RenderSetLogicalSize()
+   *}
+procedure SDL_RenderGetLogicalSize(renderer: PSDL_Renderer; w: PInt; h: PInt) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderGetLogicalSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the drawing area for rendering on the current target.
+   *
+   *   renderer The renderer for which the drawing area should be set.
+   *   rect The rectangle representing the drawing area, or NULL to set the viewport to the entire target.
+   *
+   *  The x,y of the viewport rect represents the origin for rendering.
+   *
+   *   0 on success, or -1 on error
+   *
+   *  If the window associated with the renderer is resized, the viewport is automatically reset.
+   *
+   *   SDL_RenderGetViewport()
+   *   SDL_RenderSetLogicalSize()
+   *}
+function SDL_RenderSetViewport(renderer: PSDL_Renderer; const rect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderSetViewport' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the drawing area for the current target.
+   *
+   *   SDL_RenderSetViewport()
+   *}
+procedure SDL_RenderGetViewport(renderer: PSDL_Renderer; rect: PSDL_Rect) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderGetViewport' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the clip rectangle for the current target.
+   *
+   *   renderer The renderer for which clip rectangle should be set.
+   *   rect   A pointer to the rectangle to set as the clip rectangle, or
+   *          NULL to disable clipping.
+   *
+   *   0 on success, or -1 on error
+   *
+   *   SDL_RenderGetClipRect()
+   *}
+function SDL_RenderSetClipRect(renderer: PSDL_Renderer; rect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderSetClipRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the clip rectangle for the current target.
+   *
+   *   renderer The renderer from which clip rectangle should be queried.
+   *   rect   A pointer filled in with the current clip rectangle, or
+   *          an empty rectangle if clipping is disabled.
+   *
+   *   SDL_RenderSetClipRect()
+   *}
+procedure SDL_RenderGetClipRect(renderer: PSDL_Renderer; rect: PSDL_Rect) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderGetClipRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the drawing scale for rendering on the current target.
+   *
+   *   renderer The renderer for which the drawing scale should be set.
+   *   scaleX The horizontal scaling factor
+   *   scaleY The vertical scaling factor
+   *
+   *  The drawing coordinates are scaled by the x/y scaling factors
+   *  before they are used by the renderer.  This allows resolution
+   *  independent drawing with a single coordinate system.
+   *
+   *  If this results in scaling or subpixel drawing by the
+   *  rendering backend, it will be handled using the appropriate
+   *  quality hints.  For best results use integer scaling factors.
+   *
+   *   SDL_RenderGetScale()
+   *   SDL_RenderSetLogicalSize()
+   *}
+function SDL_RenderSetScale(renderer: PSDL_Renderer; scaleX: Float; scaleY: Float): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderSetScale' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the drawing scale for the current target.
+   *
+   *   renderer The renderer from which drawing scale should be queried.
+   *   scaleX A pointer filled in with the horizontal scaling factor
+   *   scaleY A pointer filled in with the vertical scaling factor
+   *
+   *   SDL_RenderSetScale()
+   *}
+procedure SDL_RenderGetScale(renderer: PSDL_Renderer; scaleX: PFloat; scaleY: PFloat) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderGetScale' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the color used for drawing operations (Rect, Line and Clear).
+   *
+   *   renderer The renderer for which drawing color should be set.
+   *   r The red value used to draw on the rendering target.
+   *   g The green value used to draw on the rendering target.
+   *   b The blue value used to draw on the rendering target.
+   *   a The alpha value used to draw on the rendering target, usually
+   *     SDL_ALPHA_OPAQUE (255).
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_SetRenderDrawColor(renderer: PSDL_Renderer; r: UInt8; g: UInt8; b: UInt8; a: UInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetRenderDrawColor' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the color used for drawing operations (Rect, Line and Clear).
+   *
+   *   renderer The renderer from which drawing color should be queried.
+   *   r A pointer to the red value used to draw on the rendering target.
+   *   g A pointer to the green value used to draw on the rendering target.
+   *   b A pointer to the blue value used to draw on the rendering target.
+   *   a A pointer to the alpha value used to draw on the rendering target,
+   *     usually SDL_ALPHA_OPAQUE (255).
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_GetRenderDrawColor(renderer: PSDL_Renderer; r: PUInt8; g: PUInt8; b: PUInt8; a: PUInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRenderDrawColor' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the blend mode used for drawing operations (Fill and Line).
+   *
+   *   renderer The renderer for which blend mode should be set.
+   *   blendMode SDL_BlendMode to use for blending.
+   *
+   *   0 on success, or -1 on error
+   *
+   *   If the blend mode is not supported, the closest supported mode is
+   *        chosen.
+   *
+   *   SDL_GetRenderDrawBlendMode()
+   *}
+function SDL_SetRenderDrawBlendMode(renderer: PSDL_Renderer; blendMode: TSDL_BlendMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetRenderDrawBlendMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the blend mode used for drawing operations.
+   *
+   *   renderer The renderer from which blend mode should be queried.
+   *   blendMode A pointer filled in with the current blend mode.
+   *
+   *   0 on success, or -1 on error
+   *
+   *   SDL_SetRenderDrawBlendMode()
+   *}
+function SDL_GetRenderDrawBlendMode(renderer: PSDL_Renderer; blendMode: PSDL_BlendMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRenderDrawBlendMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Clear the current rendering target with the drawing color
+   *
+   *  This function clears the entire rendering target, ignoring the viewport.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderClear(renderer: PSDL_Renderer): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderClear' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Draw a point on the current rendering target.
+   *
+   *   renderer The renderer which should draw a point.
+   *   x The x coordinate of the point.
+   *   y The y coordinate of the point.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderDrawPoint(renderer: PSDL_Renderer; x: SInt32; y: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderDrawPoint' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Draw multiple points on the current rendering target.
+   *
+   *   renderer The renderer which should draw multiple points.
+   *   points The points to draw
+   *   count The number of points to draw
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderDrawPoints(renderer: PSDL_Renderer; points: PSDL_Point; count: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderDrawPoints' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Draw a line on the current rendering target.
+   *
+   *   renderer The renderer which should draw a line.
+   *   x1 The x coordinate of the start point.
+   *   y1 The y coordinate of the start point.
+   *   x2 The x coordinate of the end point.
+   *   y2 The y coordinate of the end point.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderDrawLine(renderer: PSDL_Renderer; x1: SInt32; y1: SInt32; x2: SInt32; y2: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderDrawLine' {$ENDIF} {$ENDIF};
+
+  {**
+   *  \brief Draw a series of connected lines on the current rendering target.
+   *
+   *  \param renderer The renderer which should draw multiple lines.
+   *  \param points The points along the lines
+   *  \param count The number of points, drawing count-1 lines
+   *
+   *  \return 0 on success, or -1 on error
+   *}
+function SDL_RenderDrawLines(renderer: PSDL_Renderer; points: PSDL_Point; count: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderDrawLines' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Draw a rectangle on the current rendering target.
+   *
+   *   renderer The renderer which should draw a rectangle.
+   *   rect A pointer to the destination rectangle, or NULL to outline the entire rendering target.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderDrawRect(renderer: PSDL_Renderer; rect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderDrawRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Draw some number of rectangles on the current rendering target.
+   *
+   *   renderer The renderer which should draw multiple rectangles.
+   *   rects A pointer to an array of destination rectangles.
+   *   count The number of rectangles.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderDrawRects(renderer: PSDL_Renderer; rects: PSDL_Rect; count: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderDrawRects' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Fill a rectangle on the current rendering target with the drawing color.
+   *
+   *   renderer The renderer which should fill a rectangle.
+   *   rect A pointer to the destination rectangle, or NULL for the entire
+   *        rendering target.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderFillRect(renderer: PSDL_Renderer; rect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderFillRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Fill some number of rectangles on the current rendering target with the drawing color.
+   *
+   *   renderer The renderer which should fill multiple rectangles.
+   *   rects A pointer to an array of destination rectangles.
+   *   count The number of rectangles.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderFillRects(renderer: PSDL_Renderer; rects: PSDL_Rect; count: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderFillRects' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Copy a portion of the texture to the current rendering target.
+   *
+   *   renderer The renderer which should copy parts of a texture.
+   *   texture The source texture.
+   *   srcrect   A pointer to the source rectangle, or NULL for the entire
+   *             texture.
+   *   dstrect   A pointer to the destination rectangle, or NULL for the
+   *             entire rendering target.
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderCopy(renderer: PSDL_Renderer; texture: PSDL_Texture; srcrect: PSDL_Rect; dstrect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderCopy' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center
+   *
+   *   renderer The renderer which should copy parts of a texture.
+   *   texture The source texture.
+   *   srcrect   A pointer to the source rectangle, or NULL for the entire
+   *                   texture.
+   *   dstrect   A pointer to the destination rectangle, or NULL for the
+   *                   entire rendering target.
+   *   angle    An angle in degrees that indicates the rotation that will be applied to dstrect
+   *   center   A pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done aroud dstrect.w/2, dstrect.h/2)
+   *   flip     An SDL_RendererFlip value stating which flipping actions should be performed on the texture
+   *
+   *   0 on success, or -1 on error
+   *}
+function SDL_RenderCopyEx(renderer: PSDL_Renderer; texture: PSDL_Texture; const srcrect: PSDL_Rect; dstrect: PSDL_Rect; angle: Double; center: PSDL_Point; flip: TSDL_RendererFlip): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderCopyEx' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Read pixels from the current rendering target.
+   *
+   *   renderer The renderer from which pixels should be read.
+   *   rect   A pointer to the rectangle to read, or NULL for the entire
+   *                render target.
+   *   format The desired format of the pixel data, or 0 to use the format
+   *                of the rendering target
+   *   pixels A pointer to be filled in with the pixel data
+   *   pitch  The pitch of the pixels parameter.
+   *
+   *   0 on success, or -1 if pixel reading is not supported.
+   *
+   *   This is a very slow operation, and should not be used frequently.
+   *}
+function SDL_RenderReadPixels(renderer: PSDL_Renderer; rect: PSDL_Rect; format: UInt32; pixels: Pointer; pitch: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderReadPixels' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Update the screen with rendering performed.
+   *}
+procedure SDL_RenderPresent(renderer: PSDL_Renderer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderPresent' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Destroy the specified texture.
+   *
+   *   SDL_CreateTexture()
+   *   SDL_CreateTextureFromSurface()
+   *}
+procedure SDL_DestroyTexture(texture: PSDL_Texture) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DestroyTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Destroy the rendering context for a window and free associated
+   *  textures.
+   *
+   *   SDL_CreateRenderer()
+   *}
+procedure SDL_DestroyRenderer(renderer: PSDL_Renderer) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DestroyRenderer' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Bind the texture to the current OpenGL/ES/ES2 context for use with
+   *  OpenGL instructions.
+   *
+   *   texture  The SDL texture to bind
+   *   texw     A pointer to a float that will be filled with the texture width
+   *   texh     A pointer to a float that will be filled with the texture height
+   *
+   *   0 on success, or -1 if the operation is not supported
+   *}
+function SDL_GL_BindTexture(texture: PSDL_Texture; texw: PFloat; texh: PFloat): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_BindTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Unbind a texture from the current OpenGL/ES/ES2 context.
+   *
+   *   texture  The SDL texture to unbind
+   *
+   *   0 on success, or -1 if the operation is not supported
+   *}
+function SDL_GL_UnbindTexture(texture: PSDL_Texture): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_UnbindTexture' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Update a rectangle within a planar YV12 or IYUV texture with new pixel data.
+   *
+   *  texture   The texture to update
+   *  rect      A pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+   *  Yplane    The raw pixel data for the Y plane.
+   *  Ypitch    The number of bytes between rows of pixel data for the Y plane.
+   *  Uplane    The raw pixel data for the U plane.
+   *  Upitch    The number of bytes between rows of pixel data for the U plane.
+   *  Vplane    The raw pixel data for the V plane.
+   *  Vpitch    The number of bytes between rows of pixel data for the V plane.
+   *
+   *  0 on success, or -1 if the texture is not valid.
+   *
+   *  You can use SDL_UpdateTexture() as long as your pixel data is
+   *  a contiguous block of Y and U/V planes in the proper order, but
+   *  this function is available if your pixel data is not contiguous.
+   *}
+function SDL_UpdateYUVTexture(texture: PSDL_Texture; rect: PSDL_Rect; Yplane: PUInt8; Ypitch: SInt32; Uplane: PUInt8; UPitch: SInt32; Vplane: UInt8; VPitch: SInt32):SInt32;
+   cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UpdateYUVTexture' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlrwops.inc b/src/lib/sdl2/sdlrwops.inc
new file mode 100644 (file)
index 0000000..335fcba
--- /dev/null
@@ -0,0 +1,188 @@
+//from "sdl_rwops"
+
+const
+  {* RWops Types *}
+  SDL_RWOPS_UNKNOWN      = 0;  {* Unknown stream type *}
+  SDL_RWOPS_WINFILE      = 1;  {* Win32 file *}
+  SDL_RWOPS_STDFILE      = 2;  {* Stdio file *}
+  SDL_RWOPS_JNIFILE      = 3;  {* Android asset *}
+  SDL_RWOPS_MEMORY    =        4;      {* Memory stream *}
+  SDL_RWOPS_MEMORY_RO =        5;      {* Read-Only memory stream *}
+
+type
+  PSDL_RWops = ^TSDL_RWops;
+
+  {**
+   * This is the read/write operation structure -- very basic.
+   *}
+
+  {**
+   *  Return the size of the file in this rwops, or -1 if unknown
+   *}
+  TSize = function(context: PSDL_RWops): SInt64; {$IFNDEF GPC} cdecl; {$ENDIF}
+
+  {**
+   *  Seek to offset relative to whence, one of stdio's whence values:
+   *  RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END
+   *
+   *  the final offset in the data stream, or -1 on error.
+   *}
+  TSeek = function(context: PSDL_RWops; offset: SInt64; whence: SInt32): SInt64; {$IFNDEF GPC} cdecl; {$ENDIF}
+                   
+  {**
+   *  Read up to maxnum objects each of size size from the data
+   *  stream to the area pointed at by ptr.
+   *
+   *  the number of objects read, or 0 at error or end of file.
+   *}
+
+   TRead = function(context: PSDL_RWops; ptr: Pointer; size: size_t; maxnum: size_t): size_t; {$IFNDEF GPC} cdecl; {$ENDIF}
+
+  {**
+   *  Write exactly num objects each of size size from the area
+   *  pointed at by ptr to data stream.
+   *  
+   *  the number of objects written, or 0 at error or end of file.
+   *}
+       
+   TWrite = function(context: PSDL_RWops; const ptr: Pointer; size: size_t; num: size_t): size_t; {$IFNDEF GPC} cdecl; {$ENDIF}
+       
+  {**
+   *  Close and free an allocated SDL_RWops structure.
+   *  
+   *  0 if successful or -1 on write error when flushing data.
+   *}
+
+  TClose =  function(context: PSDL_RWops): SInt32; {$IFNDEF GPC} cdecl; {$ENDIF}
+
+  TStdio = record
+    autoclose: TSDL_Bool;
+       fp: file;
+  end;
+  
+  TMem = record
+    base: PUInt8;
+       here: PUInt8;
+       stop: PUInt8;
+  end;
+  
+  TUnknown = record
+    data1: Pointer;
+  end;
+
+  TAndroidIO = record
+    fileNameRef: Pointer;
+    inputStreamRef: Pointer;
+    readableByteChannelRef: Pointer;
+    readMethod: Pointer;
+    assetFileDescriptorRef: Pointer;
+    position: LongInt;
+    size: LongInt;
+    offset: LongInt;
+    fd: SInt32;
+  end;
+
+  TWindowsIOBuffer = record
+    data: Pointer;
+       size: size_t;
+       left: size_t;
+  end;
+
+  TWindowsIO = record
+    append: TSDL_Bool;
+    h: Pointer;
+    buffer: TWindowsIOBuffer;
+  end;
+
+  TSDL_RWops = packed record
+    size: TSize;
+    seek: TSeek;
+    read: TRead;
+    write: TWrite;
+    close: TClose;
+
+    _type: UInt32;
+
+       case Integer of
+         0: (stdio: TStdio);
+         1: (mem: TMem);
+         2: (unknown: TUnknown);
+         {$IFDEF ANDROID}
+         3: (androidio: TAndroidIO);
+         {$ENDIF}
+         {$IFDEF WINDOWS}
+         3: (windowsio: TWindowsIO);
+         {$ENDIF}
+  end;
+
+  {**
+   *  RWFrom functions
+   *
+   *  Functions to create SDL_RWops structures from various data streams.
+   *}
+
+function SDL_RWFromFile(const _file: PAnsiChar; const mode: PAnsiChar): PSDL_RWops; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RWFromFile' {$ENDIF} {$ENDIF};
+
+  {function SDL_RWFromFP(fp: file; autoclose: TSDL_Bool): PSDL_RWops; cdecl; external SDL_LibName;} //don't know if this works
+
+function SDL_RWFromFP(fp: Pointer; autoclose: TSDL_Bool): PSDL_RWops; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RWFromFP' {$ENDIF} {$ENDIF};
+
+function SDL_RWFromMem(mem: Pointer; size: SInt32): PSDL_RWops; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RWFromMem' {$ENDIF} {$ENDIF};
+function SDL_RWFromConstMem(const mem: Pointer; size: SInt32): PSDL_RWops; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RWFromConstMem' {$ENDIF} {$ENDIF};
+
+{*RWFrom functions*}
+
+
+function SDL_AllocRW: PSDL_RWops; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AllocRW' {$ENDIF} {$ENDIF};
+procedure SDL_FreeRW(area: PSDL_RWops); cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FreeRW' {$ENDIF} {$ENDIF};
+
+const
+  RW_SEEK_SET = 0;       {**< Seek from the beginning of data *}
+  RW_SEEK_CUR = 1;       {**< Seek relative to current read point *}
+  RW_SEEK_END = 2;       {**< Seek relative to the end of data *}
+
+  {**
+   *  Read/write macros
+   *
+   *  Macros to easily read and write from an SDL_RWops structure.
+   *}
+
+  function SDL_RWsize(ctx: PSDL_RWops): SInt64; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+  function SDL_RWseek(ctx: PSDL_RWops; offset: SInt64; whence: SInt32): SInt64; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+  function SDL_RWtell(ctx: PSDL_RWops): SInt64; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+  function SDL_RWread(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+  function SDL_RWwrite(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+  function SDL_RWclose(ctx: PSDL_RWops): SInt32; {$IFNDEF DELPHI} inline; {$ELSE} {$IFDEF DELPHI10UP} inline; {$ENDIF} {$ENDIF}
+  { Read/write macros }
+
+
+  {**
+   *  Read endian functions
+   *
+   *  Read an item of the specified endianness and return in native format.
+   *}
+
+function SDL_ReadU8(src: PSDL_RWops): UInt8 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadU8' {$ENDIF} {$ENDIF};
+function SDL_ReadLE16(src: PSDL_RWops): UInt16 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadLE16' {$ENDIF} {$ENDIF};
+function SDL_ReadBE16(src: PSDL_RWops): UInt16 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadBE16' {$ENDIF} {$ENDIF};
+function SDL_ReadLE32(src: PSDL_RWops): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadLE32' {$ENDIF} {$ENDIF};
+function SDL_ReadBE32(src: PSDL_RWops): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadBE32' {$ENDIF} {$ENDIF};
+function SDL_ReadLE64(src: PSDL_RWops): UInt64 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadLE64' {$ENDIF} {$ENDIF};
+function SDL_ReadBE64(src: PSDL_RWops): UInt64 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ReadBE64' {$ENDIF} {$ENDIF};
+
+  {*Read endian functions*}
+
+  {**
+   *  Write endian functions
+   *
+   *  Write an item of native format to the specified endianness.
+   *}
+
+function SDL_WriteU8(dst: PSDL_RWops; value: UInt8): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteU8' {$ENDIF} {$ENDIF};
+function SDL_WriteLE16(dst: PSDL_RWops; value: UInt16): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteLE16' {$ENDIF} {$ENDIF};
+function SDL_WriteBE16(dst: PSDL_RWops; value: UInt16): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteBE16' {$ENDIF} {$ENDIF};
+function SDL_WriteLE32(dst: PSDL_RWops; value: UInt32): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteLE32' {$ENDIF} {$ENDIF};
+function SDL_WriteBE32(dst: PSDL_RWops; value: UInt32): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteBE32' {$ENDIF} {$ENDIF};
+function SDL_WriteLE64(dst: PSDL_RWops; value: UInt64): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteLE64' {$ENDIF} {$ENDIF};
+function SDL_WriteBE64(dst: PSDL_RWops; value: UInt64): size_t cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WriteBE64' {$ENDIF} {$ENDIF};
+  { Write endian functions }
diff --git a/src/lib/sdl2/sdlscancode.inc b/src/lib/sdl2/sdlscancode.inc
new file mode 100644 (file)
index 0000000..eb64319
--- /dev/null
@@ -0,0 +1,662 @@
+//from "sdl_scancode.h"
+
+  {**
+   *  The SDL keyboard scancode representation.
+   *
+   *  Values of this type are used to represent keyboard keys, among other places
+   *  in the SDL_Keysym.scancode key.keysym.scancode \endlink field of the
+   *  SDL_Event structure.
+   *
+   *  The values in this enumeration are based on the USB usage page standard:
+   *  http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf
+   *}
+
+const
+  SDL_SCANCODE_UNKNOWN = 0;
+
+  {**
+   *  Usage page $07
+   *
+   *  These values are from usage page $07 (USB keyboard page).
+   *}
+
+  SDL_SCANCODE_A = 4;
+  SDL_SCANCODE_B = 5;
+  SDL_SCANCODE_C = 6;
+  SDL_SCANCODE_D = 7;
+  SDL_SCANCODE_E = 8;
+  SDL_SCANCODE_F = 9;
+  SDL_SCANCODE_G = 10;
+  SDL_SCANCODE_H = 11;
+  SDL_SCANCODE_I = 12;
+  SDL_SCANCODE_J = 13;
+  SDL_SCANCODE_K = 14;
+  SDL_SCANCODE_L = 15;
+  SDL_SCANCODE_M = 16;
+  SDL_SCANCODE_N = 17;
+  SDL_SCANCODE_O = 18;
+  SDL_SCANCODE_P = 19;
+  SDL_SCANCODE_Q = 20;
+  SDL_SCANCODE_R = 21;
+  SDL_SCANCODE_S = 22;
+  SDL_SCANCODE_T = 23;
+  SDL_SCANCODE_U = 24;
+  SDL_SCANCODE_V = 25;
+  SDL_SCANCODE_W = 26;
+  SDL_SCANCODE_X = 27;
+  SDL_SCANCODE_Y = 28;
+  SDL_SCANCODE_Z = 29;
+
+  SDL_SCANCODE_1 = 30;
+  SDL_SCANCODE_2 = 31;
+  SDL_SCANCODE_3 = 32;
+  SDL_SCANCODE_4 = 33;
+  SDL_SCANCODE_5 = 34;
+  SDL_SCANCODE_6 = 35;
+  SDL_SCANCODE_7 = 36;
+  SDL_SCANCODE_8 = 37;
+  SDL_SCANCODE_9 = 38;
+  SDL_SCANCODE_0 = 39;
+
+  SDL_SCANCODE_RETURN = 40;
+  SDL_SCANCODE_ESCAPE = 41;
+  SDL_SCANCODE_BACKSPACE = 42;
+  SDL_SCANCODE_TAB = 43;
+  SDL_SCANCODE_SPACE = 44;
+
+  SDL_SCANCODE_MINUS = 45;
+  SDL_SCANCODE_EQUALS = 46;
+  SDL_SCANCODE_LEFTBRACKET = 47;
+  SDL_SCANCODE_RIGHTBRACKET = 48;
+  SDL_SCANCODE_BACKSLASH = 49; {**< Located at the lower left of the return
+                                *   key on ISO keyboards and at the right end
+                                *   of the QWERTY row on ANSI keyboards.
+                                *   Produces REVERSE SOLIDUS (backslash) and
+                                *   VERTICAL LINE in a US layout; REVERSE 
+                                *   SOLIDUS and VERTICAL LINE in a UK Mac
+                                *   layout; NUMBER SIGN and TILDE in a UK 
+                                *   Windows layout; DOLLAR SIGN and POUND SIGN
+                                *   in a Swiss German layout; NUMBER SIGN and
+                                *   APOSTROPHE in a German layout; GRAVE
+                                *   ACCENT and POUND SIGN in a French Mac 
+                                *   layout; and ASTERISK and MICRO SIGN in a
+                                *   French Windows layout.
+                                *}
+  SDL_SCANCODE_NONUSHASH = 50; {**< ISO USB keyboards actually use this code
+                                *   instead of 49 for the same key; but all
+                                *   OSes I've seen treat the two codes 
+                                *   identically. So; as an implementor; unless
+                                *   your keyboard generates both of those 
+                                *   codes and your OS treats them differently;
+                                *   you should generate SDL_SCANCODE_BACKSLASH
+                                *   instead of this code. As a user; you
+                                *   should not rely on this code because SDL
+                                *   will never generate it with most (all?)
+                                *   keyboards.
+                                *}
+  SDL_SCANCODE_SEMICOLON = 51;
+  SDL_SCANCODE_APOSTROPHE = 52;
+  SDL_SCANCODE_GRAVE = 53;     {**< Located in the top left corner (on both ANSI
+                                *   and ISO keyboards). Produces GRAVE ACCENT and
+                                *   TILDE in a US Windows layout and in US and UK
+                                *   Mac layouts on ANSI keyboards; GRAVE ACCENT
+                                *   and NOT SIGN in a UK Windows layout; SECTION
+                                *   SIGN and PLUS-MINUS SIGN in US and UK Mac
+                                *   layouts on ISO keyboards; SECTION SIGN and
+                                *   DEGREE SIGN in a Swiss German layout (Mac:
+                                *   only on ISO keyboards); CIRCUMFLEX ACCENT and
+                                *   DEGREE SIGN in a German layout (Mac: only on
+                                *   ISO keyboards); SUPERSCRIPT TWO and TILDE in a
+                                *   French Windows layout; COMMERCIAL AT and
+                                *   NUMBER SIGN in a French Mac layout on ISO
+                                *   keyboards; and LESS-THAN SIGN and GREATER-THAN
+                                *   SIGN in a Swiss German; German; or French Mac
+                                *   layout on ANSI keyboards.
+                                *}
+  SDL_SCANCODE_COMMA = 54;
+  SDL_SCANCODE_PERIOD = 55;
+  SDL_SCANCODE_SLASH = 56;
+
+  SDL_SCANCODE_CAPSLOCK = 57;
+
+  SDL_SCANCODE_F1 = 58;
+  SDL_SCANCODE_F2 = 59;
+  SDL_SCANCODE_F3 = 60;
+  SDL_SCANCODE_F4 = 61;
+  SDL_SCANCODE_F5 = 62;
+  SDL_SCANCODE_F6 = 63;
+  SDL_SCANCODE_F7 = 64;
+  SDL_SCANCODE_F8 = 65;
+  SDL_SCANCODE_F9 = 66;
+  SDL_SCANCODE_F10 = 67;
+  SDL_SCANCODE_F11 = 68;
+  SDL_SCANCODE_F12 = 69;
+
+  SDL_SCANCODE_PRINTSCREEN = 70;
+  SDL_SCANCODE_SCROLLLOCK = 71;
+  SDL_SCANCODE_PAUSE = 72;
+  SDL_SCANCODE_INSERT = 73; {**< insert on PC; help on some Mac keyboards (but
+                                 does send code 73; not 117) *}
+  SDL_SCANCODE_HOME = 74;
+  SDL_SCANCODE_PAGEUP = 75;
+  SDL_SCANCODE_DELETE = 76;
+  SDL_SCANCODE_END = 77;
+  SDL_SCANCODE_PAGEDOWN = 78;
+  SDL_SCANCODE_RIGHT = 79;
+  SDL_SCANCODE_LEFT = 80;
+  SDL_SCANCODE_DOWN = 81;
+  SDL_SCANCODE_UP = 82;
+
+  SDL_SCANCODE_NUMLOCKCLEAR = 83; {**< num lock on PC; clear on Mac keyboards
+                                   *}
+  SDL_SCANCODE_KP_DIVIDE = 84;
+  SDL_SCANCODE_KP_MULTIPLY = 85;
+  SDL_SCANCODE_KP_MINUS = 86;
+  SDL_SCANCODE_KP_PLUS = 87;
+  SDL_SCANCODE_KP_ENTER = 88;
+  SDL_SCANCODE_KP_1 = 89;
+  SDL_SCANCODE_KP_2 = 90;
+  SDL_SCANCODE_KP_3 = 91;
+  SDL_SCANCODE_KP_4 = 92;
+  SDL_SCANCODE_KP_5 = 93;
+  SDL_SCANCODE_KP_6 = 94;
+  SDL_SCANCODE_KP_7 = 95;
+  SDL_SCANCODE_KP_8 = 96;
+  SDL_SCANCODE_KP_9 = 97;
+  SDL_SCANCODE_KP_0 = 98;
+  SDL_SCANCODE_KP_PERIOD = 99;
+
+  SDL_SCANCODE_NONUSBACKSLASH = 100; {**< This is the additional key that ISO
+                                      *   keyboards have over ANSI ones; 
+                                      *   located between left shift and Y. 
+                                      *   Produces GRAVE ACCENT and TILDE in a
+                                      *   US or UK Mac layout; REVERSE SOLIDUS
+                                      *   (backslash) and VERTICAL LINE in a 
+                                      *   US or UK Windows layout; and 
+                                      *   LESS-THAN SIGN and GREATER-THAN SIGN
+                                      *   in a Swiss German; German; or French
+                                      *   layout. *}
+  SDL_SCANCODE_APPLICATION = 101;    {**< windows contextual menu; compose *}
+  SDL_SCANCODE_POWER = 102;          {**< The USB document says this is a status flag;
+                                       *  not a physical key - but some Mac keyboards
+                                       *  do have a power key. *}
+  SDL_SCANCODE_KP_EQUALS = 103;
+  SDL_SCANCODE_F13 = 104;
+  SDL_SCANCODE_F14 = 105;
+  SDL_SCANCODE_F15 = 106;
+  SDL_SCANCODE_F16 = 107;
+  SDL_SCANCODE_F17 = 108;
+  SDL_SCANCODE_F18 = 109;
+  SDL_SCANCODE_F19 = 110;
+  SDL_SCANCODE_F20 = 111;
+  SDL_SCANCODE_F21 = 112;
+  SDL_SCANCODE_F22 = 113;
+  SDL_SCANCODE_F23 = 114;
+  SDL_SCANCODE_F24 = 115;
+  SDL_SCANCODE_EXECUTE = 116;
+  SDL_SCANCODE_HELP = 117;
+  SDL_SCANCODE_MENU = 118;
+  SDL_SCANCODE_SELECT = 119;
+  SDL_SCANCODE_STOP = 120;
+  SDL_SCANCODE_AGAIN = 121;   {**< redo *}
+  SDL_SCANCODE_UNDO = 122;
+  SDL_SCANCODE_CUT = 123;
+  SDL_SCANCODE_COPY = 124;
+  SDL_SCANCODE_PASTE = 125;
+  SDL_SCANCODE_FIND = 126;
+  SDL_SCANCODE_MUTE = 127;
+  SDL_SCANCODE_VOLUMEUP = 128;
+  SDL_SCANCODE_VOLUMEDOWN = 129;
+  {* not sure whether there's a reason to enable these *}
+  {*     SDL_SCANCODE_LOCKINGCAPSLOCK = 130;  *}
+  {*     SDL_SCANCODE_LOCKINGNUMLOCK = 131; *}
+  {*     SDL_SCANCODE_LOCKINGSCROLLLOCK = 132; *}
+  SDL_SCANCODE_KP_COMMA = 133;
+  SDL_SCANCODE_KP_EQUALSAS400 = 134;
+
+  SDL_SCANCODE_INTERNATIONAL1 = 135; {**< used on Asian keyboards; see footnotes in USB doc *}
+  SDL_SCANCODE_INTERNATIONAL2 = 136;
+  SDL_SCANCODE_INTERNATIONAL3 = 137; {**< Yen *}
+  SDL_SCANCODE_INTERNATIONAL4 = 138;
+  SDL_SCANCODE_INTERNATIONAL5 = 139;
+  SDL_SCANCODE_INTERNATIONAL6 = 140;
+  SDL_SCANCODE_INTERNATIONAL7 = 141;
+  SDL_SCANCODE_INTERNATIONAL8 = 142;
+  SDL_SCANCODE_INTERNATIONAL9 = 143;
+  SDL_SCANCODE_LANG1 = 144; {**< Hangul{English toggle *}
+  SDL_SCANCODE_LANG2 = 145; {**< Hanja conversion *}
+  SDL_SCANCODE_LANG3 = 146; {**< Katakana *}
+  SDL_SCANCODE_LANG4 = 147; {**< Hiragana *}
+  SDL_SCANCODE_LANG5 = 148; {**< Zenkaku{Hankaku *}
+  SDL_SCANCODE_LANG6 = 149; {**< reserved *}
+  SDL_SCANCODE_LANG7 = 150; {**< reserved *}
+  SDL_SCANCODE_LANG8 = 151; {**< reserved *}
+  SDL_SCANCODE_LANG9 = 152; {**< reserved *}
+
+  SDL_SCANCODE_ALTERASE = 153; {**< Erase-Eaze *}
+  SDL_SCANCODE_SYSREQ = 154;
+  SDL_SCANCODE_CANCEL = 155;
+  SDL_SCANCODE_CLEAR = 156;
+  SDL_SCANCODE_PRIOR = 157;
+  SDL_SCANCODE_RETURN2 = 158;
+  SDL_SCANCODE_SEPARATOR = 159;
+  SDL_SCANCODE_OUT = 160;
+  SDL_SCANCODE_OPER = 161;
+  SDL_SCANCODE_CLEARAGAIN = 162;
+  SDL_SCANCODE_CRSEL = 163;
+  SDL_SCANCODE_EXSEL = 164;
+
+  SDL_SCANCODE_KP_00 = 176;
+  SDL_SCANCODE_KP_000 = 177;
+  SDL_SCANCODE_THOUSANDSSEPARATOR = 178;
+  SDL_SCANCODE_DECIMALSEPARATOR = 179;
+  SDL_SCANCODE_CURRENCYUNIT = 180;
+  SDL_SCANCODE_CURRENCYSUBUNIT = 181;
+  SDL_SCANCODE_KP_LEFTPAREN = 182;
+  SDL_SCANCODE_KP_RIGHTPAREN = 183;
+  SDL_SCANCODE_KP_LEFTBRACE = 184;
+  SDL_SCANCODE_KP_RIGHTBRACE = 185;
+  SDL_SCANCODE_KP_TAB = 186;
+  SDL_SCANCODE_KP_BACKSPACE = 187;
+  SDL_SCANCODE_KP_A = 188;
+  SDL_SCANCODE_KP_B = 189;
+  SDL_SCANCODE_KP_C = 190;
+  SDL_SCANCODE_KP_D = 191;
+  SDL_SCANCODE_KP_E = 192;
+  SDL_SCANCODE_KP_F = 193;
+  SDL_SCANCODE_KP_XOR = 194;
+  SDL_SCANCODE_KP_POWER = 195;
+  SDL_SCANCODE_KP_PERCENT = 196;
+  SDL_SCANCODE_KP_LESS = 197;
+  SDL_SCANCODE_KP_GREATER = 198;
+  SDL_SCANCODE_KP_AMPERSAND = 199;
+  SDL_SCANCODE_KP_DBLAMPERSAND = 200;
+  SDL_SCANCODE_KP_VERTICALBAR = 201;
+  SDL_SCANCODE_KP_DBLVERTICALBAR = 202;
+  SDL_SCANCODE_KP_COLON = 203;
+  SDL_SCANCODE_KP_HASH = 204;
+  SDL_SCANCODE_KP_SPACE = 205;
+  SDL_SCANCODE_KP_AT = 206;
+  SDL_SCANCODE_KP_EXCLAM = 207;
+  SDL_SCANCODE_KP_MEMSTORE = 208;
+  SDL_SCANCODE_KP_MEMRECALL = 209;
+  SDL_SCANCODE_KP_MEMCLEAR = 210;
+  SDL_SCANCODE_KP_MEMADD = 211;
+  SDL_SCANCODE_KP_MEMSUBTRACT = 212;
+  SDL_SCANCODE_KP_MEMMULTIPLY = 213;
+  SDL_SCANCODE_KP_MEMDIVIDE = 214;
+  SDL_SCANCODE_KP_PLUSMINUS = 215;
+  SDL_SCANCODE_KP_CLEAR = 216;
+  SDL_SCANCODE_KP_CLEARENTRY = 217;
+  SDL_SCANCODE_KP_BINARY = 218;
+  SDL_SCANCODE_KP_OCTAL = 219;
+  SDL_SCANCODE_KP_DECIMAL = 220;
+  SDL_SCANCODE_KP_HEXADECIMAL = 221;
+
+  SDL_SCANCODE_LCTRL = 224;
+  SDL_SCANCODE_LSHIFT = 225;
+  SDL_SCANCODE_LALT = 226; {**< alt; option *}
+  SDL_SCANCODE_LGUI = 227; {**< windows; command (apple); meta *}
+  SDL_SCANCODE_RCTRL = 228;
+  SDL_SCANCODE_RSHIFT = 229;
+  SDL_SCANCODE_RALT = 230; {**< alt gr; option *}
+  SDL_SCANCODE_RGUI = 231; {**< windows; command (apple); meta *}
+
+  SDL_SCANCODE_MODE = 257;    {**< I'm not sure if this is really not covered 
+                               *   by any of the above; but since there's a 
+                               *   special KMOD_MODE for it I'm adding it here
+                               *}
+    
+  {*Usage page $07*}
+
+  {**
+   *  Usage page $0C
+   *
+   *  These values are mapped from usage page $0C (USB consumer page).
+   *}
+
+  SDL_SCANCODE_AUDIONEXT = 258;
+  SDL_SCANCODE_AUDIOPREV = 259;
+  SDL_SCANCODE_AUDIOSTOP = 260;
+  SDL_SCANCODE_AUDIOPLAY = 261;
+  SDL_SCANCODE_AUDIOMUTE = 262;
+  SDL_SCANCODE_MEDIASELECT = 263;
+  SDL_SCANCODE_WWW = 264;
+  SDL_SCANCODE_MAIL = 265;
+  SDL_SCANCODE_CALCULATOR = 266;
+  SDL_SCANCODE_COMPUTER = 267;
+  SDL_SCANCODE_AC_SEARCH = 268;
+  SDL_SCANCODE_AC_HOME = 269;
+  SDL_SCANCODE_AC_BACK = 270;
+  SDL_SCANCODE_AC_FORWARD = 271;
+  SDL_SCANCODE_AC_STOP = 272;
+  SDL_SCANCODE_AC_REFRESH = 273;
+  SDL_SCANCODE_AC_BOOKMARKS = 274;
+
+  {*Usage page $0C*}
+
+  {**
+   *  Walther keys
+   *
+   *  These are values that Christian Walther added (for mac keyboard?).
+   *}
+
+  SDL_SCANCODE_BRIGHTNESSDOWN = 275;
+  SDL_SCANCODE_BRIGHTNESSUP = 276;
+  SDL_SCANCODE_DISPLAYSWITCH = 277; {**< display mirroring{dual display
+                                         switch; video mode switch *}
+  SDL_SCANCODE_KBDILLUMTOGGLE = 278;
+  SDL_SCANCODE_KBDILLUMDOWN = 279;
+  SDL_SCANCODE_KBDILLUMUP = 280;
+  SDL_SCANCODE_EJECT = 281;
+  SDL_SCANCODE_SLEEP = 282;
+
+  SDL_SCANCODE_APP1 = 283;
+  SDL_SCANCODE_APP2 = 284;
+
+  {*Walther keys*}
+
+  {* Add any other keys here. *}
+
+  SDL_NUM_SCANCODES = 512; {**< not a key, just marks the number of scancodes
+                               for array bounds *}
+
+type
+  PSDL_ScanCode = ^TSDL_ScanCode;
+  TSDL_ScanCode = DWord;
+
+  //from "sdl_keycode.h"
+
+  {**
+   *  The SDL virtual key representation.
+   *
+   *  Values of this type are used to represent keyboard keys using the current
+   *  layout of the keyboard.  These values include Unicode values representing
+   *  the unmodified character that would be generated by pressing the key, or
+   *  an SDLK_* constant for those keys that do not generate characters.
+   *}
+  PSDL_KeyCode = ^TSDL_KeyCode;
+  TSDL_KeyCode = SInt32;
+
+const
+  SDLK_SCANCODE_MASK = 1 shl 30;
+
+  SDLK_UNKNOWN = 0;
+
+  SDLK_RETURN = SInt32(#13);   // C: '\r'
+  SDLK_ESCAPE = SInt32(#27);   // C: '\033'
+  SDLK_BACKSPACE = SInt32(#8); // C: '\b'
+  SDLK_TAB = SInt32(#9);       // C: '\t'
+  SDLK_SPACE = SInt32(' ');
+  SDLK_EXCLAIM = SInt32('!');
+  SDLK_QUOTEDBL = SInt32('"');
+  SDLK_HASH = SInt32('#');
+  SDLK_PERCENT = SInt32('%');
+  SDLK_DOLLAR = SInt32('$');
+  SDLK_AMPERSAND = SInt32('&');
+  SDLK_QUOTE = SInt32('\');
+  SDLK_LEFTPAREN = SInt32('(');
+  SDLK_RIGHTPAREN = SInt32(')');
+  SDLK_ASTERISK = SInt32('*');
+  SDLK_PLUS = SInt32('+');
+  SDLK_COMMA = SInt32(',');
+  SDLK_MINUS = SInt32('-');
+  SDLK_PERIOD = SInt32('.');
+  SDLK_SLASH = SInt32('/');
+  SDLK_0 = SInt32('0');
+  SDLK_1 = SInt32('1');
+  SDLK_2 = SInt32('2');
+  SDLK_3 = SInt32('3');
+  SDLK_4 = SInt32('4');
+  SDLK_5 = SInt32('5');
+  SDLK_6 = SInt32('6');
+  SDLK_7 = SInt32('7');
+  SDLK_8 = SInt32('8');
+  SDLK_9 = SInt32('9');
+  SDLK_COLON = SInt32(':');
+  SDLK_SEMICOLON = SInt32(';');
+  SDLK_LESS = SInt32('<');
+  SDLK_EQUALS = SInt32('=');
+  SDLK_GREATER = SInt32('>');
+  SDLK_QUESTION = SInt32('?');
+  SDLK_AT = SInt32('@');
+  {*
+     Skip uppercase letters
+   *}
+  SDLK_LEFTBRACKET = SInt32('[');
+  SDLK_BACKSLASH = SInt32('\');
+  SDLK_RIGHTBRACKET = SInt32(']');
+  SDLK_CARET = SInt32('^');
+  SDLK_UNDERSCORE = SInt32('_');
+  SDLK_BACKQUOTE = SInt32('`');
+  SDLK_a = SInt32('a');
+  SDLK_b = SInt32('b');
+  SDLK_c = SInt32('c');
+  SDLK_d = SInt32('d');
+  SDLK_e = SInt32('e');
+  SDLK_f = SInt32('f');
+  SDLK_g = SInt32('g');
+  SDLK_h = SInt32('h');
+  SDLK_i = SInt32('i');
+  SDLK_j = SInt32('j');
+  SDLK_k = SInt32('k');
+  SDLK_l = SInt32('l');
+  SDLK_m = SInt32('m');
+  SDLK_n = SInt32('n');
+  SDLK_o = SInt32('o');
+  SDLK_p = SInt32('p');
+  SDLK_q = SInt32('q');
+  SDLK_r = SInt32('r');
+  SDLK_s = SInt32('s');
+  SDLK_t = SInt32('t');
+  SDLK_u = SInt32('u');
+  SDLK_v = SInt32('v');
+  SDLK_w = SInt32('w');
+  SDLK_x = SInt32('x');
+  SDLK_y = SInt32('y');
+  SDLK_z = SInt32('z');
+
+  SDLK_CAPSLOCK = SDL_SCANCODE_CAPSLOCK or SDLK_SCANCODE_MASK;
+
+  SDLK_F1 = SDL_SCANCODE_F1 or SDLK_SCANCODE_MASK;
+  SDLK_F2 = SDL_SCANCODE_F2 or SDLK_SCANCODE_MASK;
+  SDLK_F3 = SDL_SCANCODE_F3 or SDLK_SCANCODE_MASK;
+  SDLK_F4 = SDL_SCANCODE_F4 or SDLK_SCANCODE_MASK;
+  SDLK_F5 = SDL_SCANCODE_F5 or SDLK_SCANCODE_MASK;
+  SDLK_F6 = SDL_SCANCODE_F6 or SDLK_SCANCODE_MASK;
+  SDLK_F7 = SDL_SCANCODE_F7 or SDLK_SCANCODE_MASK;
+  SDLK_F8 = SDL_SCANCODE_F8 or SDLK_SCANCODE_MASK;
+  SDLK_F9 = SDL_SCANCODE_F9 or SDLK_SCANCODE_MASK;
+  SDLK_F10 = SDL_SCANCODE_F10 or SDLK_SCANCODE_MASK;
+  SDLK_F11 = SDL_SCANCODE_F11 or SDLK_SCANCODE_MASK;
+  SDLK_F12 = SDL_SCANCODE_F12 or SDLK_SCANCODE_MASK;
+
+  SDLK_PRINTSCREEN = SDL_SCANCODE_PRINTSCREEN or SDLK_SCANCODE_MASK;
+  SDLK_SCROLLLOCK = SDL_SCANCODE_SCROLLLOCK or SDLK_SCANCODE_MASK;
+  SDLK_PAUSE = SDL_SCANCODE_PAUSE or SDLK_SCANCODE_MASK;
+  SDLK_INSERT = SDL_SCANCODE_INSERT or SDLK_SCANCODE_MASK;
+  SDLK_HOME = SDL_SCANCODE_HOME or SDLK_SCANCODE_MASK;
+  SDLK_PAGEUP = SDL_SCANCODE_PAGEUP or SDLK_SCANCODE_MASK;
+  SDLK_DELETE = SInt32(#127); // C: '\177'
+  SDLK_END = SDL_SCANCODE_END or SDLK_SCANCODE_MASK;
+  SDLK_PAGEDOWN = SDL_SCANCODE_PAGEDOWN or SDLK_SCANCODE_MASK;
+  SDLK_RIGHT = SDL_SCANCODE_RIGHT or SDLK_SCANCODE_MASK;
+  SDLK_LEFT = SDL_SCANCODE_LEFT or SDLK_SCANCODE_MASK;
+  SDLK_DOWN = SDL_SCANCODE_DOWN or SDLK_SCANCODE_MASK;
+  SDLK_UP = SDL_SCANCODE_UP or SDLK_SCANCODE_MASK;
+
+  SDLK_NUMLOCKCLEAR = SDL_SCANCODE_NUMLOCKCLEAR or SDLK_SCANCODE_MASK;
+  SDLK_KP_DIVIDE = SDL_SCANCODE_KP_DIVIDE or SDLK_SCANCODE_MASK;
+  SDLK_KP_MULTIPLY = SDL_SCANCODE_KP_MULTIPLY or SDLK_SCANCODE_MASK;
+  SDLK_KP_MINUS = SDL_SCANCODE_KP_MINUS or SDLK_SCANCODE_MASK;
+  SDLK_KP_PLUS = SDL_SCANCODE_KP_PLUS or SDLK_SCANCODE_MASK;
+  SDLK_KP_ENTER = SDL_SCANCODE_KP_ENTER or SDLK_SCANCODE_MASK;
+  SDLK_KP_1 = SDL_SCANCODE_KP_1 or SDLK_SCANCODE_MASK;
+  SDLK_KP_2 = SDL_SCANCODE_KP_2 or SDLK_SCANCODE_MASK;
+  SDLK_KP_3 = SDL_SCANCODE_KP_3 or SDLK_SCANCODE_MASK;
+  SDLK_KP_4 = SDL_SCANCODE_KP_4 or SDLK_SCANCODE_MASK;
+  SDLK_KP_5 = SDL_SCANCODE_KP_5 or SDLK_SCANCODE_MASK;
+  SDLK_KP_6 = SDL_SCANCODE_KP_6 or SDLK_SCANCODE_MASK;
+  SDLK_KP_7 = SDL_SCANCODE_KP_7 or SDLK_SCANCODE_MASK;
+  SDLK_KP_8 = SDL_SCANCODE_KP_8 or SDLK_SCANCODE_MASK;
+  SDLK_KP_9 = SDL_SCANCODE_KP_9 or SDLK_SCANCODE_MASK;
+  SDLK_KP_0 = SDL_SCANCODE_KP_0 or SDLK_SCANCODE_MASK;
+  SDLK_KP_PERIOD = SDL_SCANCODE_KP_PERIOD or SDLK_SCANCODE_MASK;
+
+  SDLK_APPLICATION = SDL_SCANCODE_APPLICATION or SDLK_SCANCODE_MASK;
+  SDLK_POWER = SDL_SCANCODE_POWER or SDLK_SCANCODE_MASK;
+  SDLK_KP_EQUALS = SDL_SCANCODE_KP_EQUALS or SDLK_SCANCODE_MASK;
+  SDLK_F13 = SDL_SCANCODE_F13 or SDLK_SCANCODE_MASK;
+  SDLK_F14 = SDL_SCANCODE_F14 or SDLK_SCANCODE_MASK;
+  SDLK_F15 = SDL_SCANCODE_F15 or SDLK_SCANCODE_MASK;
+  SDLK_F16 = SDL_SCANCODE_F16 or SDLK_SCANCODE_MASK;
+  SDLK_F17 = SDL_SCANCODE_F17 or SDLK_SCANCODE_MASK;
+  SDLK_F18 = SDL_SCANCODE_F18 or SDLK_SCANCODE_MASK;
+  SDLK_F19 = SDL_SCANCODE_F19 or SDLK_SCANCODE_MASK;
+  SDLK_F20 = SDL_SCANCODE_F20 or SDLK_SCANCODE_MASK;
+  SDLK_F21 = SDL_SCANCODE_F21 or SDLK_SCANCODE_MASK;
+  SDLK_F22 = SDL_SCANCODE_F22 or SDLK_SCANCODE_MASK;
+  SDLK_F23 = SDL_SCANCODE_F23 or SDLK_SCANCODE_MASK;
+  SDLK_F24 = SDL_SCANCODE_F24 or SDLK_SCANCODE_MASK;
+  SDLK_EXECUTE = SDL_SCANCODE_EXECUTE or SDLK_SCANCODE_MASK;
+  SDLK_HELP = SDL_SCANCODE_HELP or SDLK_SCANCODE_MASK;
+  SDLK_MENU = SDL_SCANCODE_MENU or SDLK_SCANCODE_MASK;
+  SDLK_SELECT = SDL_SCANCODE_SELECT or SDLK_SCANCODE_MASK;
+  SDLK_STOP = SDL_SCANCODE_STOP or SDLK_SCANCODE_MASK;
+  SDLK_AGAIN = SDL_SCANCODE_AGAIN or SDLK_SCANCODE_MASK;
+  SDLK_UNDO = SDL_SCANCODE_UNDO or SDLK_SCANCODE_MASK;
+  SDLK_CUT = SDL_SCANCODE_CUT or SDLK_SCANCODE_MASK;
+  SDLK_COPY = SDL_SCANCODE_COPY or SDLK_SCANCODE_MASK;
+  SDLK_PASTE = SDL_SCANCODE_PASTE or SDLK_SCANCODE_MASK;
+  SDLK_FIND = SDL_SCANCODE_FIND or SDLK_SCANCODE_MASK;
+  SDLK_MUTE = SDL_SCANCODE_MUTE or SDLK_SCANCODE_MASK;
+  SDLK_VOLUMEUP = SDL_SCANCODE_VOLUMEUP or SDLK_SCANCODE_MASK;
+  SDLK_VOLUMEDOWN = SDL_SCANCODE_VOLUMEDOWN or SDLK_SCANCODE_MASK;
+  SDLK_KP_COMMA = SDL_SCANCODE_KP_COMMA or SDLK_SCANCODE_MASK;
+  SDLK_KP_EQUALSAS400 = SDL_SCANCODE_KP_EQUALSAS400 or SDLK_SCANCODE_MASK;
+
+  SDLK_ALTERASE = SDL_SCANCODE_ALTERASE or SDLK_SCANCODE_MASK;
+  SDLK_SYSREQ = SDL_SCANCODE_SYSREQ or SDLK_SCANCODE_MASK;
+  SDLK_CANCEL = SDL_SCANCODE_CANCEL or SDLK_SCANCODE_MASK;
+  SDLK_CLEAR = SDL_SCANCODE_CLEAR or SDLK_SCANCODE_MASK;
+  SDLK_PRIOR = SDL_SCANCODE_PRIOR or SDLK_SCANCODE_MASK;
+  SDLK_RETURN2 = SDL_SCANCODE_RETURN2 or SDLK_SCANCODE_MASK;
+  SDLK_SEPARATOR = SDL_SCANCODE_SEPARATOR or SDLK_SCANCODE_MASK;
+  SDLK_OUT = SDL_SCANCODE_OUT or SDLK_SCANCODE_MASK;
+  SDLK_OPER = SDL_SCANCODE_OPER or SDLK_SCANCODE_MASK;
+  SDLK_CLEARAGAIN = SDL_SCANCODE_CLEARAGAIN or SDLK_SCANCODE_MASK;
+  SDLK_CRSEL = SDL_SCANCODE_CRSEL or SDLK_SCANCODE_MASK;
+  SDLK_EXSEL = SDL_SCANCODE_EXSEL or SDLK_SCANCODE_MASK;
+
+  SDLK_KP_00 = SDL_SCANCODE_KP_00 or SDLK_SCANCODE_MASK;
+  SDLK_KP_000 = SDL_SCANCODE_KP_000 or SDLK_SCANCODE_MASK;
+  SDLK_THOUSANDSSEPARATOR = SDL_SCANCODE_THOUSANDSSEPARATOR or SDLK_SCANCODE_MASK;
+  SDLK_DECIMALSEPARATOR = SDL_SCANCODE_DECIMALSEPARATOR or SDLK_SCANCODE_MASK;
+  SDLK_CURRENCYUNIT = SDL_SCANCODE_CURRENCYUNIT or SDLK_SCANCODE_MASK;
+  SDLK_CURRENCYSUBUNIT = SDL_SCANCODE_CURRENCYSUBUNIT or SDLK_SCANCODE_MASK;
+  SDLK_KP_LEFTPAREN = SDL_SCANCODE_KP_LEFTPAREN or SDLK_SCANCODE_MASK;
+  SDLK_KP_RIGHTPAREN = SDL_SCANCODE_KP_RIGHTPAREN or SDLK_SCANCODE_MASK;
+  SDLK_KP_LEFTBRACE = SDL_SCANCODE_KP_LEFTBRACE or SDLK_SCANCODE_MASK;
+  SDLK_KP_RIGHTBRACE = SDL_SCANCODE_KP_RIGHTBRACE or SDLK_SCANCODE_MASK;
+  SDLK_KP_TAB = SDL_SCANCODE_KP_TAB or SDLK_SCANCODE_MASK;
+  SDLK_KP_BACKSPACE = SDL_SCANCODE_KP_BACKSPACE or SDLK_SCANCODE_MASK;
+  SDLK_KP_A = SDL_SCANCODE_KP_A or SDLK_SCANCODE_MASK;
+  SDLK_KP_B = SDL_SCANCODE_KP_B or SDLK_SCANCODE_MASK;
+  SDLK_KP_C = SDL_SCANCODE_KP_C or SDLK_SCANCODE_MASK;
+  SDLK_KP_D = SDL_SCANCODE_KP_D or SDLK_SCANCODE_MASK;
+  SDLK_KP_E = SDL_SCANCODE_KP_E or SDLK_SCANCODE_MASK;
+  SDLK_KP_F = SDL_SCANCODE_KP_F or SDLK_SCANCODE_MASK;
+  SDLK_KP_XOR = SDL_SCANCODE_KP_XOR or SDLK_SCANCODE_MASK;
+  SDLK_KP_POWER = SDL_SCANCODE_KP_POWER or SDLK_SCANCODE_MASK;
+  SDLK_KP_PERCENT = SDL_SCANCODE_KP_PERCENT or SDLK_SCANCODE_MASK;
+  SDLK_KP_LESS = SDL_SCANCODE_KP_LESS or SDLK_SCANCODE_MASK;
+  SDLK_KP_GREATER = SDL_SCANCODE_KP_GREATER or SDLK_SCANCODE_MASK;
+  SDLK_KP_AMPERSAND = SDL_SCANCODE_KP_AMPERSAND or SDLK_SCANCODE_MASK;
+  SDLK_KP_DBLAMPERSAND = SDL_SCANCODE_KP_DBLAMPERSAND or SDLK_SCANCODE_MASK;
+  SDLK_KP_VERTICALBAR = SDL_SCANCODE_KP_VERTICALBAR or SDLK_SCANCODE_MASK;
+  SDLK_KP_DBLVERTICALBAR = SDL_SCANCODE_KP_DBLVERTICALBAR or SDLK_SCANCODE_MASK;
+  SDLK_KP_COLON = SDL_SCANCODE_KP_COLON or SDLK_SCANCODE_MASK;
+  SDLK_KP_HASH = SDL_SCANCODE_KP_HASH or SDLK_SCANCODE_MASK;
+  SDLK_KP_SPACE = SDL_SCANCODE_KP_SPACE or SDLK_SCANCODE_MASK;
+  SDLK_KP_AT = SDL_SCANCODE_KP_AT or SDLK_SCANCODE_MASK;
+  SDLK_KP_EXCLAM = SDL_SCANCODE_KP_EXCLAM or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMSTORE = SDL_SCANCODE_KP_MEMSTORE or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMRECALL = SDL_SCANCODE_KP_MEMRECALL or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMCLEAR = SDL_SCANCODE_KP_MEMCLEAR or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMADD = SDL_SCANCODE_KP_MEMADD or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMSUBTRACT = SDL_SCANCODE_KP_MEMSUBTRACT or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMMULTIPLY = SDL_SCANCODE_KP_MEMMULTIPLY or SDLK_SCANCODE_MASK;
+  SDLK_KP_MEMDIVIDE = SDL_SCANCODE_KP_MEMDIVIDE or SDLK_SCANCODE_MASK;
+  SDLK_KP_PLUSMINUS = SDL_SCANCODE_KP_PLUSMINUS or SDLK_SCANCODE_MASK;
+  SDLK_KP_CLEAR = SDL_SCANCODE_KP_CLEAR or SDLK_SCANCODE_MASK;
+  SDLK_KP_CLEARENTRY = SDL_SCANCODE_KP_CLEARENTRY or SDLK_SCANCODE_MASK;
+  SDLK_KP_BINARY = SDL_SCANCODE_KP_BINARY or SDLK_SCANCODE_MASK;
+  SDLK_KP_OCTAL = SDL_SCANCODE_KP_OCTAL or SDLK_SCANCODE_MASK;
+  SDLK_KP_DECIMAL = SDL_SCANCODE_KP_DECIMAL or SDLK_SCANCODE_MASK;
+  SDLK_KP_HEXADECIMAL = SDL_SCANCODE_KP_HEXADECIMAL or SDLK_SCANCODE_MASK;
+
+  SDLK_LCTRL = SDL_SCANCODE_LCTRL or SDLK_SCANCODE_MASK;
+  SDLK_LSHIFT = SDL_SCANCODE_LSHIFT or SDLK_SCANCODE_MASK;
+  SDLK_LALT = SDL_SCANCODE_LALT or SDLK_SCANCODE_MASK;
+  SDLK_LGUI = SDL_SCANCODE_LGUI or SDLK_SCANCODE_MASK;
+  SDLK_RCTRL = SDL_SCANCODE_RCTRL or SDLK_SCANCODE_MASK;
+  SDLK_RSHIFT = SDL_SCANCODE_RSHIFT or SDLK_SCANCODE_MASK;
+  SDLK_RALT = SDL_SCANCODE_RALT or SDLK_SCANCODE_MASK;
+  SDLK_RGUI = SDL_SCANCODE_RGUI or SDLK_SCANCODE_MASK;
+
+  SDLK_MODE = SDL_SCANCODE_MODE or SDLK_SCANCODE_MASK;
+
+  SDLK_AUDIONEXT = SDL_SCANCODE_AUDIONEXT or SDLK_SCANCODE_MASK;
+  SDLK_AUDIOPREV = SDL_SCANCODE_AUDIOPREV or SDLK_SCANCODE_MASK;
+  SDLK_AUDIOSTOP = SDL_SCANCODE_AUDIOSTOP or SDLK_SCANCODE_MASK;
+  SDLK_AUDIOPLAY = SDL_SCANCODE_AUDIOPLAY or SDLK_SCANCODE_MASK;
+  SDLK_AUDIOMUTE = SDL_SCANCODE_AUDIOMUTE or SDLK_SCANCODE_MASK;
+  SDLK_MEDIASELECT = SDL_SCANCODE_MEDIASELECT or SDLK_SCANCODE_MASK;
+  SDLK_WWW = SDL_SCANCODE_WWW or SDLK_SCANCODE_MASK;
+  SDLK_MAIL = SDL_SCANCODE_MAIL or SDLK_SCANCODE_MASK;
+  SDLK_CALCULATOR = SDL_SCANCODE_CALCULATOR or SDLK_SCANCODE_MASK;
+  SDLK_COMPUTER = SDL_SCANCODE_COMPUTER or SDLK_SCANCODE_MASK;
+  SDLK_AC_SEARCH = SDL_SCANCODE_AC_SEARCH or SDLK_SCANCODE_MASK;
+  SDLK_AC_HOME = SDL_SCANCODE_AC_HOME or SDLK_SCANCODE_MASK;
+  SDLK_AC_BACK = SDL_SCANCODE_AC_BACK or SDLK_SCANCODE_MASK;
+  SDLK_AC_FORWARD = SDL_SCANCODE_AC_FORWARD or SDLK_SCANCODE_MASK;
+  SDLK_AC_STOP = SDL_SCANCODE_AC_STOP or SDLK_SCANCODE_MASK;
+  SDLK_AC_REFRESH = SDL_SCANCODE_AC_REFRESH or SDLK_SCANCODE_MASK;
+  SDLK_AC_BOOKMARKS = SDL_SCANCODE_AC_BOOKMARKS or SDLK_SCANCODE_MASK;
+
+  SDLK_BRIGHTNESSDOWN = SDL_SCANCODE_BRIGHTNESSDOWN or SDLK_SCANCODE_MASK;
+  SDLK_BRIGHTNESSUP = SDL_SCANCODE_BRIGHTNESSUP or SDLK_SCANCODE_MASK;
+  SDLK_DISPLAYSWITCH = SDL_SCANCODE_DISPLAYSWITCH or SDLK_SCANCODE_MASK;
+  SDLK_KBDILLUMTOGGLE = SDL_SCANCODE_KBDILLUMTOGGLE or SDLK_SCANCODE_MASK;
+  SDLK_KBDILLUMDOWN = SDL_SCANCODE_KBDILLUMDOWN or SDLK_SCANCODE_MASK;
+  SDLK_KBDILLUMUP = SDL_SCANCODE_KBDILLUMUP or SDLK_SCANCODE_MASK;
+  SDLK_EJECT = SDL_SCANCODE_EJECT or SDLK_SCANCODE_MASK;
+  SDLK_SLEEP = SDL_SCANCODE_SLEEP or SDLK_SCANCODE_MASK;
+
+  {**
+   *  Enumeration of valid key mods (possibly OR'd together).
+   *}
+
+  KMOD_NONE = $0000;
+  KMOD_LSHIFT = $0001;
+  KMOD_RSHIFT = $0002;
+  KMOD_LCTRL = $0040;
+  KMOD_RCTRL = $0080;
+  KMOD_LALT = $0100;
+  KMOD_RALT = $0200;
+  KMOD_LGUI = $0400;
+  KMOD_RGUI = $0800;
+  KMOD_NUM = $1000;
+  KMOD_CAPS = $2000;
+  KMOD_MODE = $4000;
+  KMOD_RESERVED = $8000;
+
+type
+  PSDL_KeyMod = ^TSDL_KeyMod;
+  TSDL_KeyMod = Word;
+
+const
+  KMOD_CTRL  = KMOD_LCTRL  or KMOD_RCTRL;
+  KMOD_SHIFT = KMOD_LSHIFT or KMOD_RSHIFT;
+  KMOD_ALT   = KMOD_LALT   or KMOD_RALT;
+  KMOD_GUI   = KMOD_LGUI   or KMOD_RGUI;
diff --git a/src/lib/sdl2/sdlshape.inc b/src/lib/sdl2/sdlshape.inc
new file mode 100644 (file)
index 0000000..58ea469
--- /dev/null
@@ -0,0 +1,43 @@
+//from "sdl_shape.h"
+
+{**  SDL_shape.h
+ *
+ * Header file for the shaped window API.
+ *}
+const
+  SDL_NONSHAPEABLE_WINDOW = -1;
+  SDL_INVALID_SHAPE_ARGUMENT = -2;
+  SDL_WINDOW_LACKS_SHAPE = -3;
+
+type
+  PPSDL_Window = ^PSDL_Window;
+  PSDL_Window = ^TSDL_Window;
+
+  {** An enum denoting the specific type of contents present in an SDL_WindowShapeParams union. *}
+  TWindowShapeMode = ({** The default mode, a binarized alpha cutoff of 1. *}
+                      ShapeModeDefault,
+                      {** A binarized alpha cutoff with a given integer value. *}
+                      ShapeModeBinarizeAlpha,
+                      {** A binarized alpha cutoff with a given integer value, but with the opposite comparison. *}
+                      ShapeModeReverseBinarizeAlpha,
+                      {** A color key is applied. *}
+                      ShapeModeColorKey);
+
+//#define SDL_SHAPEMODEALPHA(mode) (mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha)
+
+  {** A union containing parameters for shaped windows. *}
+  TSDL_WindowShapeParams = record
+    case Integer of
+      {** a cutoff alpha value for binarization of the window shape's alpha channel. *}
+      0: (binarizationCutoff: UInt8;);
+      1: (colorKey: TSDL_Color;);
+  end;
+
+  {** A struct that tags the SDL_WindowShapeParams union with an enum describing the type of its contents. *}
+  PSDL_WindowShapeMode = ^TSDL_WindowShapeMode;
+  TSDL_WindowShapeMode = record
+    {** The mode of these window-shape parameters. *}
+    mode: TWindowShapeMode;
+    {** Window-shape parameters. *}
+    parameters: TSDL_WindowShapeParams;
+  end;
diff --git a/src/lib/sdl2/sdlsurface.inc b/src/lib/sdl2/sdlsurface.inc
new file mode 100644 (file)
index 0000000..05624f4
--- /dev/null
@@ -0,0 +1,439 @@
+//from "sdl_surface.h"
+
+const
+  {**
+   *  Surface flags
+   *
+   *  These are the currently supported flags for the ::SDL_surface.
+   *
+   *  Used internally (read-only).
+   *}
+
+  SDL_SWSURFACE = 0;          {**< Just here for compatibility *}
+  SDL_PREALLOC  = $00000001;  {**< Surface uses preallocated memory *}
+  SDL_RLEACCEL  = $00000002;  {**< Surface is RLE encoded *}
+  SDL_DONTFREE  = $00000004;  {**< Surface is referenced internally *}
+
+type
+  {**
+   *  A collection of pixels used in software blitting.
+   *
+   *  This structure should be treated as read-only, except for \c pixels,
+   *  which, if not NULL, contains the raw pixel data for the surface.
+   *}
+
+  PSDL_BlitMap = ^TSDL_BlitMap;
+  TSDL_BlitMap = record
+    map: Pointer;
+  end;
+
+  PSDL_Surface = ^TSDL_Surface;
+  TSDL_Surface = record
+    flags: UInt32;              {**< Read-only *}
+    format: PSDL_PixelFormat;   {**< Read-only *}
+    w, h: SInt32;               {**< Read-only *}
+    pitch: SInt32;              {**< Read-only *}
+    pixels: Pointer;            {**< Read-write *}
+
+    {** Application data associated with the surface *}
+    userdata: Pointer;          {**< Read-write *}
+
+    {** information needed for surfaces requiring locks *}
+    locked: SInt32;             {**< Read-only *}
+    lock_data: Pointer;         {**< Read-only *}
+
+    {** clipping information *}
+    clip_rect: PSDL_Rect;       {**< Read-only *}
+
+    {** info for fast blit mapping to other surfaces *}
+    map: Pointer;               {**< Private *} //SDL_BlitMap
+
+    {** Reference count -- used when freeing surface *}
+    refcount: SInt32;           {**< Read-mostly *}
+  end;
+
+  {**
+   *  The type of function used for surface blitting functions.
+   *}
+
+   TSDL_Blit = function(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32;
+
+// Evaluates to true if the surface needs to be locked before access.
+function SDL_MUSTLOCK(Const S:PSDL_Surface):Boolean;
+
+  {**
+   *  Allocate and free an RGB surface.
+   *
+   *  If the depth is 4 or 8 bits, an empty palette is allocated for the surface.
+   *  If the depth is greater than 8 bits, the pixel format is set using the
+   *  flags '[RGB]mask'.
+   *
+   *  If the function runs out of memory, it will return NULL.
+   *
+   *  flags The flags are obsolete and should be set to 0.
+   *}
+
+function SDL_CreateRGBSurface(flags: UInt32; width: SInt32; height: SInt32; depth: SInt32; Rmask: UInt32; Gmask: UInt32; Bmask: UInt32; Amask: UInt32): PSDL_Surface cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateRGBSurface' {$ENDIF} {$ENDIF};
+function SDL_CreateRGBSurfaceFrom(pixels: Pointer; width: SInt32; height: SInt32; depth: SInt32; pitch: SInt32; Rmask: UInt32; Gmask: UInt32; Bmask: UInt32; Amask: UInt32): PSDL_Surface cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateRGBSurfaceFrom' {$ENDIF} {$ENDIF};
+procedure SDL_FreeSurface(surface: PSDL_Surface) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FreeSurface' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the palette used by a surface.
+   *
+   *  0, or -1 if the surface format doesn't use a palette.
+   *
+   *  A single palette can be shared with many surfaces.
+   *}
+
+function SDL_SetSurfacePalette(surface: PSDL_Surface; palette: PSDL_Palette): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetSurfacePalette' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Sets up a surface for directly accessing the pixels.
+   *
+   *  Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write
+   *  to and read from surface.pixels, using the pixel format stored in
+   *  surface.format. Once you are done accessing the surface, you should
+   *  use SDL_UnlockSurface() to release it.
+   *
+   *  Not all surfaces require locking.  If SDL_MUSTLOCK(surface) evaluates
+   *  to 0, then you can read and write to the surface at any time, and the
+   *  pixel format of the surface will not change.
+   *
+   *  No operating system or library calls should be made between lock/unlock
+   *  pairs, as critical system locks may be held during this time.
+   *
+   *  SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked.
+   *
+   *  SDL_UnlockSurface()
+   *}
+
+function SDL_LockSurface(surface: PSDL_Surface): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LockSurface' {$ENDIF} {$ENDIF};
+
+  {** SDL_LockSurface() *}
+
+procedure SDL_UnlockSurface(surface: PSDL_Surface) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UnlockSurface' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Load a surface from a seekable SDL data stream (memory or file).
+   *
+   *  If freesrc is non-zero, the stream will be closed after being read.
+   *
+   *  The new surface should be freed with SDL_FreeSurface().
+   *
+   *  the new surface, or NULL if there was an error.
+   *}
+
+function SDL_LoadBMP_RW(src: PSDL_RWops; freesrc: SInt32): PSDL_Surface cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LoadBMP_RW' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Load a surface from a file.
+   *
+   *  Convenience macro.
+   *}
+
+function SDL_LoadBMP(_file: PAnsiChar): PSDL_Surface;
+
+  {**
+   *  Save a surface to a seekable SDL data stream (memory or file).
+   *
+   *  If freedst is non-zero, the stream will be closed after being written.
+   *
+   *  0 if successful or -1 if there was an error.
+   *}
+
+function SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LoadBMP_RW' {$ENDIF} {$ENDIF};
+
+    {**
+     *  Save a surface to a file.
+     *
+     *  Convenience macro.
+     *}
+function SDL_SaveBMP(Const surface:PSDL_Surface; Const filename:AnsiString):sInt32;
+
+  {**
+   *  Sets the RLE acceleration hint for a surface.
+   *
+   *  0 on success, or -1 if the surface is not valid
+   *  
+   *  If RLE is enabled, colorkey and alpha blending blits are much faster,
+   *  but the surface must be locked before directly accessing the pixels.
+   *}
+
+function SDL_SetSurfaceRLE(surface: PSDL_Surface; flag: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetSurfaceRLE' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Sets the color key (transparent pixel) in a blittable surface.
+   *
+   *  surface The surface to update
+   *  flag Non-zero to enable colorkey and 0 to disable colorkey
+   *  key The transparent pixel in the native surface format
+   *
+   *  0 on success, or -1 if the surface is not valid
+   *
+   *  You can pass SDL_RLEACCEL to enable RLE accelerated blits.
+   *}
+
+function SDL_SetColorKey(surface: PSDL_Surface; flag: SInt32; key: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetColorKey' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Gets the color key (transparent pixel) in a blittable surface.
+   *
+   *  surface The surface to update
+   *  key A pointer filled in with the transparent pixel in the native
+   *      surface format
+   *
+   *  0 on success, or -1 if the surface is not valid or colorkey is not
+   *  enabled.
+   *}
+
+function SDL_GetColorKey(surface: PSDL_Surface; key: PUInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetColorKey' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set an additional color value used in blit operations.
+   *
+   *  surface The surface to update.
+   *  r The red color value multiplied into blit operations.
+   *  g The green color value multiplied into blit operations.
+   *  b The blue color value multiplied into blit operations.
+   *
+   *  0 on success, or -1 if the surface is not valid.
+   *
+   *  SDL_GetSurfaceColorMod()
+   *}
+
+function SDL_SetSurfaceColorMod(surface: PSDL_Surface; r: UInt8; g: UInt8; b: UInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetSurfaceColorMod' {$ENDIF} {$ENDIF};
+
+ {**
+   *  Get the additional color value used in blit operations.
+   *
+   *  surface The surface to query.
+   *  r A pointer filled in with the current red color value.
+   *  g A pointer filled in with the current green color value.
+   *  b A pointer filled in with the current blue color value.
+   *
+   *  0 on success, or -1 if the surface is not valid.
+   *
+   *  SDL_SetSurfaceColorMod()
+   *}
+
+function SDL_GetSurfaceColorMod(surface: PSDL_Surface; r: PUInt8; g: PUInt8; b: PUInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetSurfaceColorMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set an additional alpha value used in blit operations.
+   *
+   *  surface The surface to update.
+   *  alpha The alpha value multiplied into blit operations.
+   *
+   *  0 on success, or -1 if the surface is not valid.
+   *
+   *  SDL_GetSurfaceAlphaMod()
+   *}
+
+function SDL_SetSurfaceAlphaMod(surface: PSDL_Surface; alpha: UInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetSurfaceAlphaMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the additional alpha value used in blit operations.
+   *
+   *  surface The surface to query.
+   *  alpha A pointer filled in with the current alpha value.
+   *
+   *  0 on success, or -1 if the surface is not valid.
+   *
+   *  SDL_SetSurfaceAlphaMod()
+   *}
+
+function SDL_GetSurfaceAlphaMod(surface: PSDL_Surface; alpha: PUInt8): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetSurfaceAlphaMod' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the blend mode used for blit operations.
+   *
+   *  surface The surface to update.
+   *  blendMode ::SDL_BlendMode to use for blit blending.
+   *
+   *  0 on success, or -1 if the parameters are not valid.
+   *
+   *  SDL_GetSurfaceBlendMode()
+   *}
+
+function SDL_SetSurfaceBlendMode(surface: PSDL_Surface; blendMode: TSDL_BlendMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetSurfaceBlendMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the blend mode used for blit operations.
+   *
+   *  surface   The surface to query.
+   *  blendMode A pointer filled in with the current blend mode.
+   *
+   *  0 on success, or -1 if the surface is not valid.
+   *
+   *  SDL_SetSurfaceBlendMode()
+   *}
+
+function SDL_GetSurfaceBlendMode(surface: PSDL_Surface; blendMode: PSDL_BlendMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetSurfaceBlendMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Sets the clipping rectangle for the destination surface in a blit.
+   *
+   *  If the clip rectangle is NULL, clipping will be disabled.
+   *
+   *  If the clip rectangle doesn't intersect the surface, the function will
+   *  return SDL_FALSE and blits will be completely clipped.  Otherwise the
+   *  function returns SDL_TRUE and blits to the surface will be clipped to
+   *  the intersection of the surface area and the clipping rectangle.
+   *
+   *  Note that blits are automatically clipped to the edges of the source
+   *  and destination surfaces.
+   *}
+
+function SDL_SetClipRect(surface: PSDL_Surface; const rect: PSDL_Rect): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetClipRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Gets the clipping rectangle for the destination surface in a blit.
+   *
+   *  rect must be a pointer to a valid rectangle which will be filled
+   *  with the correct values.
+   *}
+
+procedure SDL_GetClipRect(surface: PSDL_Surface; rect: PSDL_Rect) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetClipRect' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Creates a new surface of the specified format, and then copies and maps
+   *  the given surface to it so the blit of the converted surface will be as
+   *  fast as possible.  If this function fails, it returns NULL.
+   *
+   *  The flags parameter is passed to SDL_CreateRGBSurface() and has those
+   *  semantics.  You can also pass SDL_RLEACCEL in the flags parameter and
+   *  SDL will try to RLE accelerate colorkey and alpha blits in the resulting
+   *  surface.
+   *}
+
+function SDL_ConvertSurface(src: PSDL_Surface; fmt: PSDL_PixelFormat; flags: UInt32): PSDL_Surface cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ConvertSurface' {$ENDIF} {$ENDIF};
+function SDL_ConvertSurfaceFormat(src: PSDL_Surface; pixel_format: UInt32; flags: UInt32): PSDL_Surface cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ConvertSurfaceFormat' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Copy a block of pixels of one format to another format
+   *
+   *  0 on success, or -1 if there was an error
+   *}
+
+function SDL_ConvertPixels(width: SInt32; height: SInt32; src_format: UInt32; const src: Pointer; src_pitch: SInt32; dst_format: UInt32; dst: Pointer; dst_pitch: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ConvertPixels' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Performs a fast fill of the given rectangle with color.
+   *
+   *  If rect is NULL, the whole surface will be filled with color.
+   *
+   *  The color should be a pixel of the format used by the surface, and 
+   *  can be generated by the SDL_MapRGB() function.
+   *  
+   *  0 on success, or -1 on error.
+   *}
+
+function SDL_FillRect(dst: PSDL_Surface; const rect: PSDL_Rect; color: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FillRect' {$ENDIF} {$ENDIF};
+function SDL_FillRects(dst: PSDL_Surface; const rects: PSDL_Rect; count: SInt32; color: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_FillRects' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Performs a fast blit from the source surface to the destination surface.
+   *
+   *  This assumes that the source and destination rectangles are
+   *  the same size.  If either \c srcrect or \c dstrect are NULL, the entire
+   *  surface ( src or  dst) is copied.  The final blit rectangles are saved
+   *  in srcrect and dstrect after all clipping is performed.
+   *
+   *  If the blit is successful, it returns 0, otherwise it returns -1.
+   *
+   *  The blit function should not be called on a locked surface.
+   *
+   *  The blit semantics for surfaces with and without alpha and colorkey
+   *  are defined as follows:
+   *
+      RGBA->RGB:
+        SDL_SRCALPHA set:
+          alpha-blend (using alpha-channel).
+          SDL_SRCCOLORKEY ignored.
+        SDL_SRCALPHA not set:
+          copy RGB.
+          if SDL_SRCCOLORKEY set, only copy the pixels matching the
+          RGB values of the source colour key, ignoring alpha in the
+          comparison.
+
+      RGB->RGBA:
+        SDL_SRCALPHA set:
+          alpha-blend (using the source per-surface alpha value);
+          set destination alpha to opaque.
+        SDL_SRCALPHA not set:
+          copy RGB, set destination alpha to source per-surface alpha value.
+        both:
+          if SDL_SRCCOLORKEY set, only copy the pixels matching the
+          source colour key.
+
+      RGBA->RGBA:
+        SDL_SRCALPHA set:
+          alpha-blend (using the source alpha channel) the RGB values;
+          leave destination alpha untouched. [Note: is this correct?]
+          SDL_SRCCOLORKEY ignored.
+        SDL_SRCALPHA not set:
+          copy all of RGBA to the destination.
+          if SDL_SRCCOLORKEY set, only copy the pixels matching the
+          RGB values of the source colour key, ignoring alpha in the
+         comparison.
+
+      RGB->RGB:
+        SDL_SRCALPHA set:
+          alpha-blend (using the source per-surface alpha value).
+        SDL_SRCALPHA not set:
+          copy RGB.
+        both:
+          if SDL_SRCCOLORKEY set, only copy the pixels matching the
+          source colour key.r
+   *
+   *  You should call SDL_BlitSurface() unless you know exactly how SDL
+   *  blitting works internally and how to use the other blit functions.
+   *}
+
+(* SDL_surface.h uses #define to change all SDL_BlitSurface() calls into SDL_UpperBlit() calls.                         *
+ * Since Pascal macro support is very limited, we workaround by outright pointing SDL_BlitSurface() to SDL_UpperBlit(). *)
+function SDL_BlitSurface(src: PSDL_Surface; const srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32 cdecl; 
+   external SDL_LibName name {$IF DEFINED(DELPHI) AND DEFINED(MACOS)} '_SDL_UpperBlit' {$ELSE} 'SDL_UpperBlit' {$IFEND};
+
+
+  {**
+   *  This is the public blit function, SDL_BlitSurface(), and it performs
+   *  rectangle validation and clipping before passing it to SDL_LowerBlit()
+   *}
+
+function SDL_UpperBlit(src: PSDL_Surface; const srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UpperBlit' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This is a semi-private blit function and it performs low-level surface
+   *  blitting only.
+   *}
+
+function SDL_LowerBlit(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LowerBlit' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Perform a fast, low quality, stretch blit between two surfaces of the
+   *  same pixel format.
+   *
+   *  This function uses a static buffer, and is not thread-safe.
+   *}
+
+function SDL_SoftStretch(src: PSDL_Surface; const srcrect: PSDL_Rect; dst: PSDL_Surface; const dstrect: PSDL_Surface): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SoftStretch' {$ENDIF} {$ENDIF};
+
+(* SDL_surface.h uses #define to change all SDL_BlitSurfaceScaled() calls into SDL_UpperBlitScaled() calls.                         *
+ * Since Pascal macro support is very limited, we workaround by outright pointing SDL_BlitSurfaceScaled() to SDL_UpperBlitScaled(). *)
+function SDL_BlitSurfaceScaled(src: PSDL_Surface; const srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32 cdecl; 
+   external SDL_LibName name {$IF DEFINED(DELPHI) AND DEFINED(MACOS)} '_SDL_UpperBlitScaled' {$ELSE} 'SDL_UpperBlitScaled' {$IFEND};
+
+  {**
+   *  This is the public scaled blit function, SDL_BlitScaled(), and it performs
+   *  rectangle validation and clipping before passing it to SDL_LowerBlitScaled()
+   *}
+
+function SDL_UpperBlitScaled(src: PSDL_Surface; const srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UpperBlitScaled' {$ENDIF} {$ENDIF};
+
+  {**
+   *  This is a semi-private blit function and it performs low-level surface
+   *  scaled blitting only.
+   *}
+
+function SDL_LowerBlitScaled(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_LowerBlitScaled' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlsystem.inc b/src/lib/sdl2/sdlsystem.inc
new file mode 100644 (file)
index 0000000..9849bb0
--- /dev/null
@@ -0,0 +1,96 @@
+// from "SDL_system.h"
+
+(* Platform specific functions for Windows *)
+{$IF DEFINED(WIN32) OR DEFINED(WIN64)} 
+
+  {* Returns the D3D9 adapter index that matches the specified display index.
+   * This adapter index can be passed to IDirect3D9::CreateDevice and controls
+   * on which monitor a full screen application will appear.
+   *}
+Function SDL_Direct3D9GetAdapterIndex(displayIndex:SInt32):SInt32;
+   cdecl; external SDL_LibName;
+
+  {* Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer.
+   * Once you are done using the device, you should release it to avoid a resource leak.
+   *}
+Type PIDirect3DDevice9 = Pointer;
+Function SDL_RenderGetD3D9Device(renderer:PSDL_Renderer):PIDirect3DDevice9;
+   cdecl; external SDL_LibName;
+
+{* Returns the DXGI Adapter and Output indices for the specified display index. 
+ * These can be passed to EnumAdapters and EnumOutputs respectively to get the objects
+ *  required to create a DX10 or DX11 device and swap chain.
+ *}
+Procedure SDL_DXGIGetOutputInfo(displayIndex :SInt32; adapterIndex, outputIndex :PSInt32);
+   cdecl; external SDL_LibName;
+
+{$IFEND}
+
+
+(* Platform specific functions for WinRT *)
+{$IFDEF __WINRT__}
+
+  {**
+   *  \brief WinRT / Windows Phone path types
+   *}
+Type
+  TSDL_WinRT_Path = (
+
+    {** \brief The installed app's root directory.
+        Files here are likely to be read-only. *}
+    SDL_WINRT_PATH_INSTALLED_LOCATION = 0,
+
+    {** \brief The app's local data store.  Files may be written here *}
+    SDL_WINRT_PATH_LOCAL_FOLDER = 1,
+
+    {** \brief The app's roaming data store.  Unsupported on Windows Phone.
+        Files written here may be copied to other machines via a network
+        connection.
+    *}
+    SDL_WINRT_PATH_ROAMING_FOLDER = 2,
+
+    {** \brief The app's temporary data store.  Unsupported on Windows Phone.
+        Files written here may be deleted at any time. *}
+    SDL_WINRT_PATH_TEMP_FOLDER = 3
+
+  );
+
+
+  {**
+   *  \brief Retrieves a WinRT defined path on the local file system
+   *
+   *  \note Documentation on most app-specific path types on WinRT
+   *      can be found on MSDN, at the URL:
+   *      http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx
+   *
+   *  \param pathType The type of path to retrieve.
+   *  \ret A UCS-2 string (16-bit, wide-char) containing the path, or NULL
+   *      if the path is not available for any reason.  Not all paths are
+   *      available on all versions of Windows.  This is especially true on
+   *      Windows Phone.  Check the documentation for the given
+   *      SDL_WinRT_Path for more information on which path types are
+   *      supported where.
+   *}
+Function SDL_WinRTGetFSPathUNICODE(pathType :TSDL_WinRT_Path):PWideChar;
+   cdecl; external SDL_LibName;
+
+
+  {**
+   *  \brief Retrieves a WinRT defined path on the local file system
+   *
+   *  \note Documentation on most app-specific path types on WinRT
+   *      can be found on MSDN, at the URL:
+   *      http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx
+   *
+   *  \param pathType The type of path to retrieve.
+   *  \ret A UTF-8 string (8-bit, multi-byte) containing the path, or NULL
+   *      if the path is not available for any reason.  Not all paths are
+   *      available on all versions of Windows.  This is especially true on
+   *      Windows Phone.  Check the documentation for the given
+   *      SDL_WinRT_Path for more information on which path types are
+   *      supported where.
+   *}
+Function SDL_WinRTGetFSPathUTF8(pathType :TSDL_WinRT_Path):PChar;
+   cdecl; external SDL_LibName;
+
+{$ENDIF}
diff --git a/src/lib/sdl2/sdlsyswm.inc b/src/lib/sdl2/sdlsyswm.inc
new file mode 100644 (file)
index 0000000..13280f7
--- /dev/null
@@ -0,0 +1,202 @@
+// from sdl_syswm.h
+
+{$IFDEF WINDOWS}
+   {$DEFINE SDL_VIDEO_DRIVER_WINDOWS}
+{$ENDIF}
+
+{$IF DEFINED (LINUX) OR DEFINED(UNIX)}
+   {$DEFINE SDL_VIDEO_DRIVER_X11}
+{$IFEND}
+
+{$IFDEF DARWIN}
+   {$DEFINE SDL_VIDEO_DRIVER_COCOA}
+{$ENDIF}
+
+{**
+ *  These are the various supported windowing subsystems
+ *}
+Type
+   TSDL_SYSWM_TYPE = (
+      SDL_SYSWM_UNKNOWN,
+      SDL_SYSWM_WINDOWS,
+      SDL_SYSWM_X11,
+      SDL_SYSWM_DIRECTFB,
+      SDL_SYSWM_COCOA,
+      SDL_SYSWM_UIKIT,
+      SDL_SYSWM_WAYLAND, // Since SDL 2.0.2
+      SDL_SYSWM_MIR,     // Since SDL 2.0.2
+      SDL_SYSWM_WINRT,   // Since SDL 2.0.3
+      SDL_SYSWM_ANDROID  // Planned for SDL 2.0.4
+   );
+
+/// sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMmsg.
+/// Since Pascal does not allow this, we workaround by introducing named types
+/// before the proper TSDL_SysWMmsg definition.
+{$IFDEF SDL_VIDEO_DRIVER_WINDOWS}
+   __SYSWM_WINDOWS = record
+      hwnd:   HWND;   {**< The window for the message }
+      msg:     uInt;   {**< The type of message *}
+      wParam: WPARAM; {**< WORD message parameter *}
+      lParam: LPARAM; {**< WORD message parameter *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_X11}
+   __SYSWM_X11 = record
+      event: {$IFDEF FPC} TXEvent {$ELSE} XEvent {$ENDIF};
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_DIRECTFB}
+   __SYSWM_DIRECTFB = record
+      event: DFBEvent;
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_COCOA}
+   __SYSWM_COCOA = record
+      (* No Cocoa window events yet *)
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_UIKIT}
+   __SYSWM_UIKIT = record
+      (* No UIKit window events yet *)
+   end;
+{$ENDIF}
+
+{**
+ *  The custom event structure.
+ *}
+   PSDL_SysWMmsg = ^TSDL_SysWMmsg;
+   TSDL_SysWMmsg = record
+      version: TSDL_version;
+      Case subsystem: TSDL_SYSWM_TYPE of
+         (* Cannot have empty record case *)
+         SDL_SYSWM_UNKNOWN: (dummy: sInt32);
+         {$IFDEF SDL_VIDEO_DRIVER_WINDOWS}
+            SDL_SYSWM_WINDOWS: (win: __SYSWM_WINDOWS);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_X11}
+            SDL_SYSWM_X11: (x11: __SYSWM_X11);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB}  
+            SDL_SYSWM_DIRECTFB: (dfb: __SYSWM_DIRECTFB); 
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_COCOA}  
+            SDL_SYSWM_COCOA: (cocoa: __SYSWM_COCOA);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_UIKIT}
+            SDL_SYSWM_UIKIT: (uikit: __SYSWM_UIKIT);
+         {$ENDIF}
+   end;
+
+/// Once again, sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMinfo.
+/// We workaround by introducing named types before the proper TSDL_SysWMinfo definition.
+{$IFDEF SDL_VIDEO_DRIVER_WINDOWS}
+   __WMINFO_WINDOWS = record
+      window: HWND; {**< The window handle *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_WINRT} // Since SDL 2.0.3
+   __WMINFO_WINRT = record
+      window: IInspectable;      {**< The WinRT CoreWindow *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_X11}
+   __WMINFO_X11 = record
+      display: PDisplay;  {**< The X11 display *}
+      window: TWindow;     {**< The X11 window *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_DIRECTFB}
+   __WMINFO_DFB = record
+      dfb:     IDirectFB;         {**< The directfb main interface *}
+      window:  IDirectFBWindow;   {**< The directfb window handle *}
+      surface: IDirectFBSurface;  {**< The directfb client surface *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_COCOA}
+   __WMINFO_COCOA = record
+      window: NSWindow;           {* The Cocoa window *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_UIKIT}
+   __WMINFO_UIKIT = record
+      window: UIWindow;   {* The UIKit window *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_WAYLAND} // Since SDL 2.0.2
+   __WMINFO_WAYLAND = record
+      display: wl_display;             {**< Wayland display *}
+      surface: wl_surface;             {**< Wayland surface *}
+      shell_surface: wl_shell_surface; {**< Wayland shell_surface (window manager handle) *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_MIR} // Since SDL 2.0.2
+   __WMINFO_MIR = record
+      connection: PMirConnection; {**< Mir display server connection *}
+      surface: PMirSurface;       {**< Mir surface *}
+   end;
+{$ENDIF}
+{$IFDEF SDL_VIDEO_DRIVER_ANDROID} // Planned for SDL 2.0.4
+   __WMINFO_ANDROID = record
+      window : PANativeWindow;
+      surface: PEGLSurface;
+   end;
+{$ENDIF}
+
+{**
+ *  The custom window manager information structure.
+ *
+ *  When this structure is returned, it holds information about which
+ *  low level system it is using, and will be one of SDL_SYSWM_TYPE.
+ *}
+   PSDL_SysWMinfo = ^TSDL_SysWMinfo;
+   TSDL_SysWMinfo = record
+      version: TSDL_version;
+      Case subsystem: TSDL_SYSWM_TYPE of
+         (* Cannot have empty record case *)
+         SDL_SYSWM_UNKNOWN: (dummy: sInt32);
+         {$IFDEF SDL_VIDEO_DRIVER_WINDOWS}
+            SDL_SYSWM_WINDOWS: (win : __WMINFO_WINDOWS);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_WINRT}
+            SDL_SYSWM_WINRT: (winrt : __WMINFO_WINRT);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_X11}
+            SDL_SYSWM_X11: (x11 : __WMINFO_X11);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB}
+            SDL_SYSWM_DIRECTFB: (dfb : __WMINFO_DFB);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_COCOA}
+            SDL_SYSWM_COCOA: (cocoa : __WMINFO_COCOA);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_UIKIT}
+            SDL_SYSWM_UIKIT: (uikit : __WMINFO_UIKIT);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_WAYLAND}
+            SDL_SYSWM_WAYLAND: (wl : __WMINFO_WAYLAND);
+         {$ENDIF}
+         {$IFDEF SDL_VIDEO_DRIVER_MIR}
+            SDL_SYSWM_MIR: (mir : __WMINFO_MIR);
+         {$ENDIF}
+   end;
+
+{* Function prototypes *}
+(**
+ *  \brief This function allows access to driver-dependent window information.
+ *
+ *  \param window The window about which information is being requested
+ *  \param info This structure must be initialized with the SDL version, and is
+ *              then filled in with information about the given window.
+ *
+ *  \return SDL_TRUE if the function is implemented and the version member of
+ *          the \c info struct is valid, SDL_FALSE otherwise.
+ *
+ *  You typically use this function like this:
+ *  \code
+ *  SDL_SysWMinfo info;
+ *  SDL_VERSION(&info.version);
+ *  if ( SDL_GetWindowWMInfo(window, &info) ) { ... }
+ *  \endcode
+ *)
+Function SDL_GetWindowWMInfo(window:PSDL_Window; info : PSDL_SysWMinfo):TSDL_bool; cdecl;
+   external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowWMInfo' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlthread.inc b/src/lib/sdl2/sdlthread.inc
new file mode 100644 (file)
index 0000000..83299b7
--- /dev/null
@@ -0,0 +1,222 @@
+//from "sdl_thread.h"
+
+{* The SDL thread structure, defined in SDL_thread.c *}
+//todo!
+type
+  {* The SDL thread priority
+   *
+   * Note: On many systems you require special privileges to set high priority.
+   *}
+
+  TSDL_ThreadPriority = (SDL_THREAD_PRIORITY_LOW,
+                         SDL_THREAD_PRIORITY_NORMAL,
+                         SDL_THREAD_PRIORITY_HIGH);
+
+  {* The function passed to SDL_CreateThread()
+     It is passed a void* user context parameter and returns an int.
+   *}
+  PSDL_ThreadFunction = ^TSDL_ThreadFunction;
+  TSDL_ThreadFunction = function(data: Pointer): Integer; cdecl;
+
+  {* The SDL thread ID *}
+  TSDL_ThreadID = LongWord;
+   {
+  PSDL_Thread = Pointer;
+     }
+
+  PSDL_Thread = ^TSDL_Thread;
+  TSDL_Thread = record
+    threadid: TSDL_ThreadID;
+    handle: THandle;
+    status: SInt32;
+    errbuf: TSDL_Error;
+    name: PAnsiChar;
+    data: Pointer;
+  end;
+
+  TSDL_TLSID = Cardinal;
+
+{$IFDEF WINDOWS}
+  {**
+   *  SDL_thread.h
+   *
+   *  We compile SDL into a DLL. This means, that it's the DLL which
+   *  creates a new thread for the calling process with the SDL_CreateThread()
+   *  API. There is a problem with this, that only the RTL of the SDL.DLL will
+   *  be initialized for those threads, and not the RTL of the calling
+   *  application!
+   *
+   *  To solve this, we make a little hack here.
+   *
+   *  We'll always use the caller's _beginthread() and _endthread() APIs to
+   *  start a new thread. This way, if it's the SDL.DLL which uses this API,
+   *  then the RTL of SDL.DLL will be used to create the new thread, and if it's
+   *  the application, then the RTL of the application will be used.
+   *
+   *  So, in short:
+   *  Always use the _beginthread() and _endthread() of the calling runtime
+   *  library!
+   *}
+{$DEFINE SDL_PASSED_BEGINTHREAD_ENDTHREAD}
+
+type
+  {$IFNDEF DELPHI16UP}
+    TThreadID = Cardinal;
+  {$ENDIF}
+
+  TpfnSDL_CurrentBeginThread = function(SecurityAttributes: Pointer; StackSize: LongWord; ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord; var ThreadId: TThreadID): Integer;
+
+  TpfnSDL_CurrentEndThread = procedure(ExitCode: Integer);
+
+  {**
+   *  Create a thread.
+   *}
+function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer; pfnBeginThread: TpfnSDL_CurrentBeginThread; pfnEndThread: TpfnSDL_CurrentEndThread): PSDL_Thread; cdecl; overload; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateThread' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a thread.
+   *}
+function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer): PSDL_Thread; overload;
+
+{$ELSE}
+
+  {**
+   *  Create a thread.
+   *
+   *   Thread naming is a little complicated: Most systems have very small
+   *    limits for the string length (BeOS has 32 bytes, Linux currently has 16,
+   *    Visual C++ 6.0 has nine!), and possibly other arbitrary rules. You'll
+   *    have to see what happens with your system's debugger. The name should be
+   *    UTF-8 (but using the naming limits of C identifiers is a better bet).
+   *   There are no requirements for thread naming conventions, so long as the
+   *    string is null-terminated UTF-8, but these guidelines are helpful in
+   *    choosing a name:
+   *
+   *    http://stackoverflow.com/questions/149932/naming-conventions-for-threads
+   *
+   *   If a system imposes requirements, SDL will try to munge the string for
+   *    it (truncate, etc), but the original string contents will be available
+   *    from SDL_GetThreadName().
+   *}
+function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer): PSDL_Thread; cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateThread' {$ENDIF} {$ENDIF};
+
+{$ENDIF}
+
+  {**
+   * Get the thread name, as it was specified in SDL_CreateThread().
+   *  This function returns a pointer to a UTF-8 string that names the
+   *  specified thread, or NULL if it doesn't have a name. This is internal
+   *  memory, not to be free()'d by the caller, and remains valid until the
+   *  specified thread is cleaned up by SDL_WaitThread().
+   *}
+function SDL_GetThreadName(thread: PSDL_Thread): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetThreadName' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get the thread identifier for the current thread.
+   *}
+function SDL_ThreadID: TSDL_ThreadID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ThreadID' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Get the thread identifier for the specified thread.
+   *
+   *  Equivalent to SDL_ThreadID() if the specified thread is NULL.
+   *}
+function SDL_GetThreadID(thread: PSDL_Thread): TSDL_ThreadID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetThreadID' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Set the priority for the current thread
+   *}
+function SDL_SetThreadPriority(priority: TSDL_ThreadPriority): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetThreadPriority' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Wait for a thread to finish.
+   *
+   *  The return code for the thread function is placed in the area
+   *  pointed to by status, if status is not NULL.
+   *}
+procedure SDL_WaitThread(thread: PSDL_Thread; status: PInt) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_WaitThread' {$ENDIF}{$ENDIF};
+
+  {**
+   *  A thread may be "detached" to signify that it should not remain until
+   *  another thread has called SDL_WaitThread() on it. Detaching a thread
+   *  is useful for long-running threads that nothing needs to synchronize
+   *  with or further manage. When a detached thread is done, it simply
+   *  goes away.
+   *
+   *  There is no way to recover the return code of a detached thread. If you
+   *  need this, don't detach the thread and instead use SDL_WaitThread().
+   *
+   *  Once a thread is detached, you should usually assume the SDL_Thread isn't
+   *  safe to reference again, as it will become invalid immediately upon
+   *  the detached thread's exit, instead of remaining until someone has called
+   *  SDL_WaitThread() to finally clean it up. As such, don't detach the same
+   *  thread more than once.
+   *
+   *  If a thread has already exited when passed to SDL_DetachThread(), it will
+   *  stop waiting for a call to SDL_WaitThread() and clean up immediately.
+   *  It is not safe to detach a thread that might be used with SDL_WaitThread().
+   *
+   *  You may not call SDL_WaitThread() on a thread that has been detached.
+   *  Use either that function or this one, but not both, or behavior is
+   *  undefined.
+   *
+   *  It is safe to pass NIL to this function; it is a no-op.
+   *}
+procedure SDL_DetachThread(thread:TSDL_Thread); cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DetachThread' {$ENDIF}{$ENDIF};
+
+  {**
+   *  Create an identifier that is globally visible to all threads but refers to data that is thread-specific.
+   *
+   *   The newly created thread local storage identifier, or 0 on error
+   *
+   *  var tls_lock: TSDL_SpinLock;
+   *    thread_local_storage: TSDL_TLSID;
+   *
+   *  procedure SetMyThreadData(value: Pointer)
+   *
+   *      if not (thread_local_storage) then
+   *      begin
+   *        SDL_AtomicLock(@tls_lock);
+   *        if (!thread_local_storage)
+   *              thread_local_storage = SDL_TLSCreate();
+   *
+   *        SDL_AtomicUnLock(@tls_lock);
+   *
+   *        SDL_TLSSet(thread_local_storage, value);
+   *      end;
+   *
+   *  function GetMyThreadData(): Pointer;
+   *  begin
+   *     Result := SDL_TLSGet(thread_local_storage);
+   *  end;
+   *
+   *   SDL_TLSGet()
+   *   SDL_TLSSet()
+   *}
+function SDL_TLSCreate: TSDL_TLSID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_TLSCreate' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the value associated with a thread local storage ID for the current thread.
+   *
+   *   id The thread local storage ID
+   *
+   *   The value associated with the ID for the current thread, or NULL if no value has been set.
+   *
+   *   SDL_TLSCreate()
+   *   SDL_TLSSet()
+   *}
+function SDL_TLSGet(id: TSDL_TLSID): Pointer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_TLSGet' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the value associated with a thread local storage ID for the current thread.
+   *
+   *   id The thread local storage ID
+   *   value The value to associate with the ID for the current thread
+   *   destructor_ A function called when the thread exits, to free the value.
+   *
+   *   0 on success, -1 on error
+   *
+   *   SDL_TLSCreate()
+   *   SDL_TLSGet()
+   *}
+function SDL_TLSSet(id: TSDL_TLSID; value: Pointer; destructor_: Pointer): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_TLSSet' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdltimer.inc b/src/lib/sdl2/sdltimer.inc
new file mode 100644 (file)
index 0000000..bf08104
--- /dev/null
@@ -0,0 +1,61 @@
+//from "sdl_timer.h"
+
+  {**
+   *  Get the number of milliseconds since the SDL library initialization.
+   *
+   *  This value wraps if the program runs for more than ~49 days.
+   *}
+function SDL_GetTicks: UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetTicks' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the current value of the high resolution counter
+   *}
+function SDL_GetPerformanceCounter: UInt64 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetPerformanceCounter' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the count per second of the high resolution counter
+   *}
+function SDL_GetPerformanceFrequency: UInt64 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetPerformanceFrequency' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Wait a specified number of milliseconds before returning.
+   *}
+procedure SDL_Delay(ms: UInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_Delay' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Function prototype for the timer callback function.
+   *
+   *  The callback function is passed the current timer interval and returns
+   *  the next timer interval.  If the returned value is the same as the one
+   *  passed in, the periodic alarm continues, otherwise a new alarm is
+   *  scheduled.  If the callback returns 0, the periodic alarm is cancelled.
+   *}
+
+type
+  TSDL_TimerCallback = function(interval: UInt32; param: Pointer): UInt32; cdecl;
+
+  {**
+   * Definition of the timer ID type.
+   *}
+  TSDL_TimerID = SInt32;
+
+  {**
+   *  Add a new timer to the pool of timers already running.
+   *
+   *  A timer ID, or NULL when an error occurs.
+   *}
+function SDL_AddTimer(interval: UInt32; callback: TSDL_TimerCallback; param: Pointer): TSDL_TimerID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_AddTimer' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Remove a timer knowing its ID.
+   *
+   *  A boolean value indicating success or failure.
+   *
+   *  It is not safe to remove a timer multiple times.
+   *}
+function SDL_RemoveTimer(id: TSDL_TimerID): Boolean cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RemoveTimer' {$ENDIF} {$ENDIF};
+
+  {**
+  *   Compare SDL ticks values, and return true if A has passed B.
+  *}
+function SDL_TICKS_PASSED(Const A, B:UInt32):Boolean;
diff --git a/src/lib/sdl2/sdltouch.inc b/src/lib/sdl2/sdltouch.inc
new file mode 100644 (file)
index 0000000..92b6a68
--- /dev/null
@@ -0,0 +1,43 @@
+//from "sdl_touch.h"
+
+type
+  PSDL_TouchID  = ^TSDL_TouchID;
+  TSDL_TouchID  = SInt64;
+
+  PSDL_FingerID = ^TSDL_FingerID;
+  TSDL_FingerID = SInt64;
+
+  PSDL_Finger = ^TSDL_Finger;
+  TSDL_Finger = record
+    id: TSDL_FingerID;
+    x: Float;
+    y: Float;
+    pressure: Float;
+  end;
+
+{* Used as the device ID for mouse events simulated with touch input *}
+const
+  SDL_TOUCH_MOUSEID = UInt32(-1);
+
+  {* Function prototypes *}
+
+  {**
+   *  Get the number of registered touch devices.
+   *}
+function SDL_GetNumTouchDevices: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumTouchDevices' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the touch ID with the given index, or 0 if the index is invalid.
+   *}
+function SDL_GetTouchDevice(index: SInt32): TSDL_TouchID cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetTouchDevice' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the number of active fingers for a given touch device.
+   *}
+function SDL_GetNumTouchFingers(touchID: TSDL_TouchID): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumTouchFingers' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the finger object of the given touch, with the given index.
+   *}
+function SDL_GetTouchFinger(touchID: TSDL_TouchID; index: SInt32): PSDL_Finger cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetTouchFinger' {$ENDIF} {$ENDIF};
+
diff --git a/src/lib/sdl2/sdltype.inc b/src/lib/sdl2/sdltype.inc
new file mode 100644 (file)
index 0000000..7779cb7
--- /dev/null
@@ -0,0 +1,71 @@
+//types from SDLtype_s.h / SDL_stdinc.h
+type
+
+  TSDL_Bool = (SDL_FALSE,SDL_TRUE);
+
+  DWord = LongWord;
+
+  PUInt8Array = ^TUInt8Array;
+  PUInt8 = ^UInt8;    
+  PPUInt8 = ^PUInt8;
+  UInt8 = Byte;
+  {$EXTERNALSYM UInt8}
+  TUInt8Array = array [0..MAXINT shr 1] of UInt8;
+
+  PUInt16 = ^UInt16;
+  UInt16 = word;
+  {$EXTERNALSYM UInt16}
+
+  PSInt8 = ^SInt8;
+  SInt8 = Shortint;
+  {$EXTERNALSYM SInt8}
+
+  PSInt16 = ^SInt16;
+  SInt16 = smallint;
+  {$EXTERNALSYM SInt16}
+
+  PUInt32 = ^UInt32;
+  UInt32 = Cardinal;
+  {$EXTERNALSYM UInt32}
+
+  PSInt32 = ^SInt32;
+  SInt32 = LongInt;
+  {$EXTERNALSYM SInt32}
+
+  PFloat = ^Float;
+  PInt = ^LongInt;
+
+  PShortInt = ^ShortInt;
+
+  {$IFNDEF Has_Int64}
+  PUInt64 = ^UInt64;
+  UInt64 = record
+    hi: UInt32;
+    lo: UInt32;
+  end;
+  {$EXTERNALSYM UInt64}
+
+  PInt64 = ^Int64;
+  Int64 = record
+    hi: UInt32;
+    lo: UInt32;
+  end;
+  {$EXTERNALSYM Int64}
+
+  PSInt64 = ^SInt64;
+  SInt64 = Int64;
+  {$EXTERNALSYM SInt64}
+  {$ELSE}
+  PSInt64 = ^SInt64;
+  SInt64 = Int64;
+  {$ENDIF}
+
+  {$IFNDEF WIN64}
+    size_t = UInt32;
+  {$ELSE}
+    size_t = UInt64;
+  {$ENDIF}
+  {$EXTERNALSYM SIZE_T}
+
+  Float = Single;
+  {$EXTERNALSYM Float}
diff --git a/src/lib/sdl2/sdlversion.inc b/src/lib/sdl2/sdlversion.inc
new file mode 100644 (file)
index 0000000..520c575
--- /dev/null
@@ -0,0 +1,113 @@
+//from "sdl_version.h"
+
+  {**
+   *  Information the version of SDL in use.
+   *
+   *  Represents the library's version as three levels: major revision
+   *  (increments with massive changes, additions, and enhancements),
+   *  minor revision (increments with backwards-compatible changes to the
+   *  major revision), and patchlevel (increments with fixes to the minor
+   *  revision).
+   *
+   *  SDL_VERSION
+   *  SDL_GetVersion
+   *}
+type
+  PSDL_Version = ^TSDL_Version;
+  TSDL_Version = record
+    major,         {**< major version *}
+    minor,         {**< minor version *}
+    patch: UInt8;  {**< update version *}
+  end;
+
+{* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
+*}
+const
+  SDL_MAJOR_VERSION = 2;
+  SDL_MINOR_VERSION = 0;
+  SDL_PATCHLEVEL    = 0;
+
+{**
+ *  Macro to determine SDL version program was compiled against.
+ *
+ *  This macro fills in a SDL_version structure with the version of the
+ *  library you compiled against. This is determined by what header the
+ *  compiler uses. Note that if you dynamically linked the library, you might
+ *  have a slightly newer or older version at runtime. That version can be
+ *  determined with SDL_GetVersion(), which, unlike SDL_VERSION(),
+ *  is not a macro.
+ *
+ *  x   An instance on TSDL_Version to fill with version data.
+ *
+ *  SDL_version
+ *  SDL_GetVersion
+ *}
+procedure SDL_VERSION(Out x: TSDL_Version);
+
+{**
+ *  This macro turns the version numbers into a numeric value:
+ *
+ *  (1,2,3) -> (1203)
+ *
+ *
+ *  This assumes that there will never be more than 100 patchlevels.
+ *}
+function SDL_VERSIONNUM(X,Y,Z: UInt32): Cardinal;
+
+  {**
+   *  This is the version number macro for the current SDL version.
+   *}
+function SDL_COMPILEDVERSION: Cardinal;
+
+  {**
+   *  This macro will evaluate to true if compiled with SDL at least X.Y.Z.
+   *}
+function SDL_VERSION_ATLEAST(X,Y,Z: Cardinal): Boolean;
+
+  {**
+   *  Get the version of SDL that is linked against your program.
+   *
+   *  If you are linking to SDL dynamically, then it is possible that the
+   *  current version will be different than the version you compiled against.
+   *  This function returns the current version, while SDL_VERSION() is a
+   *  macro that tells you what version you compiled with.
+   *
+   *
+   *  compiled: TSDL_Version;
+   *  linked: TSDL_Version;
+   *
+   *  SDL_VERSION(@compiled);
+   *  SDL_GetVersion(@linked);
+   *  WriteLn('We compiled against SDL version: ' +
+   *           IntToStr(compiled.major) +
+   *           IntToStr(compiled.minor) +
+   *           IntToStr(compiled.patch));
+   *  WriteLn('But we linked against SDL version:' +
+   *           IntToStr(compiled.major) +
+   *           IntToStr(compiled.minor) +
+   *           IntToStr(compiled.patch));
+   *
+   *
+   *  This function may be called safely at any time, even before SDL_Init().
+   *
+   *  SDL_VERSION
+   *}
+procedure SDL_GetVersion(ver: PSDL_Version) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetVersion' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the code revision of SDL that is linked against your program.
+   *
+   *  Returns an arbitrary string (a hash value) uniquely identifying the
+   *  exact revision of the SDL library in use, and is only useful in comparing
+   *  against other revisions. It is NOT an incrementing number.
+   *}
+function SDL_GetRevision: PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRevision' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the revision number of SDL that is linked against your program.
+   *
+   *  Returns a number uniquely identifying the exact revision of the SDL
+   *  library in use. It is an incrementing number based on commits to
+   *  hg.libsdl.org.
+   *}
+function SDL_GetRevisionNumber: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetRevisionNumber' {$ENDIF} {$ENDIF};
diff --git a/src/lib/sdl2/sdlvideo.inc b/src/lib/sdl2/sdlvideo.inc
new file mode 100644 (file)
index 0000000..ddb72ca
--- /dev/null
@@ -0,0 +1,1052 @@
+//from "sdl_video.h"
+
+  {**
+   *  The structure that defines a display mode
+   *
+   *   SDL_GetNumDisplayModes()
+   *   SDL_GetDisplayMode()
+   *   SDL_GetDesktopDisplayMode()
+   *   SDL_GetCurrentDisplayMode()
+   *   SDL_GetClosestDisplayMode()
+   *   SDL_SetWindowDisplayMode()
+   *   SDL_GetWindowDisplayMode()
+   *}
+
+  PSDL_DisplayMode = ^TSDL_DisplayMode;
+  TSDL_DisplayMode = record
+    format: UInt32;              {**< pixel format *}
+    w: SInt32;                   {**< width *}
+    h: SInt32;                   {**< height *}
+    refresh_rate: SInt32;        {**< refresh rate (or zero for unspecified) *}
+    driverdata: Pointer;         {**< driver-specific data, initialize to 0 *}
+  end;
+
+  {* Define the SDL window-shaper structure *}
+  PSDL_WindowShaper = ^TSDL_WindowShaper;
+  TSDL_WindowShaper = record
+    {* The window associated with the shaper *}
+    window: PSDL_Window;
+
+    {* The user's specified coordinates for the window, for once we give it a shape. *}
+    userx,usery: UInt32;
+
+    {* The parameters for shape calculation. *}
+    mode: TSDL_WindowShapeMode;
+
+    {* Has this window been assigned a shape? *}
+    hasshape: TSDL_Bool;
+
+    driverdata: Pointer;
+  end;
+
+  PSDL_WindowUserData = ^TSDL_WindowUserData;
+  TSDL_WindowUserData = record
+    name: PAnsiChar;
+    data: Pointer;
+    next: PSDL_WindowUserData;
+  end;
+
+  {* Define the SDL window structure, corresponding to toplevel windows *}
+  TSDL_Window = record
+    magic: Pointer;
+    id: UInt32;
+    title: PAnsiChar;
+    icon: PSDL_Surface;
+    x,y: SInt32;
+    w,h: SInt32;
+    min_w, min_h: SInt32;
+    max_w, max_h: SInt32;
+    flags: UInt32;
+
+    {* Stored position and size for windowed mode * }
+    windowed: TSDL_Rect;
+
+    fullscreen_mode: TSDL_DisplayMode;
+
+    brightness: Float;
+    gamma: PUInt16;
+    saved_gamma: PUInt16;  {* (just offset into gamma) *}
+
+    surface: PSDL_Surface;
+    surface_valid: TSDL_Bool;
+
+    shaper: PSDL_WindowShaper;
+
+    data: PSDL_WindowUserData;
+
+    driverdata: Pointer;
+
+    prev: PSDL_Window;
+    next: PSDL_Window;
+  end;
+
+  {**
+   * Get the shape parameters of a shaped window.
+   *
+   *  window The shaped window whose parameters should be retrieved.
+   *  shape_mode An empty shape-mode structure to fill, or NULL to check whether the window has a shape.
+   *
+   *  0 if the window has a shape and, provided shape_mode was not NULL, shape_mode has been filled with the mode
+   *  data, SDL_NONSHAPEABLE_WINDOW if the SDL_Window given is not a shaped window, or SDL_WINDOW_LACKS_SHAPE if
+   *  the SDL_Window* given is a shapeable window currently lacking a shape.
+   *
+   *  SDL_WindowShapeMode
+   *  SDL_SetWindowShape
+   *}
+function SDL_GetShapedWindowMode(window: PSDL_Window; shape_mode: TSDL_WindowShapeMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetShapedWindowMode' {$ENDIF} {$ENDIF};
+
+  {**
+   * Set the shape and parameters of a shaped window.
+   *
+   *  window The shaped window whose parameters should be set.
+   *  shape A surface encoding the desired shape for the window.
+   *  shape_mode The parameters to set for the shaped window.
+   *
+   *  0 on success, SDL_INVALID_SHAPE_ARGUMENT on invalid an invalid shape argument, or SDL_NONSHAPEABLE_WINDOW
+   *  if the SDL_Window* given does not reference a valid shaped window.
+   *
+   *  SDL_WindowShapeMode
+   *  SDL_GetShapedWindowMode.
+   *}
+function SDL_SetWindowShape(window: PSDL_Window; shape: PSDL_Surface; shape_mode: PSDL_WindowShapeMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowShape' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a window that can be shaped with the specified position, dimensions, and flags.
+   *
+   *   title The title of the window, in UTF-8 encoding.
+   *   x     The x position of the window, ::SDL_WINDOWPOS_CENTERED, or
+   *               ::SDL_WINDOWPOS_UNDEFINED.
+   *   y     The y position of the window, ::SDL_WINDOWPOS_CENTERED, or
+   *               ::SDL_WINDOWPOS_UNDEFINED.
+   *   w     The width of the window.
+   *   h     The height of the window.
+   *   flags The flags for the window, a mask of SDL_WINDOW_BORDERLESS with any of the following:
+   *         SDL_WINDOW_OPENGL,     SDL_WINDOW_INPUT_GRABBED,
+   *         SDL_WINDOW_SHOWN,      SDL_WINDOW_RESIZABLE,
+   *         SDL_WINDOW_MAXIMIZED,  SDL_WINDOW_MINIMIZED,
+   *         SDL_WINDOW_BORDERLESS is always set, and SDL_WINDOW_FULLSCREEN is always unset.
+   *
+   *   The window created, or NULL if window creation failed.
+   *
+   *  SDL_DestroyWindow()
+   *}
+function SDL_CreateShapedWindow(title: PAnsiChar; x: UInt32; y: UInt32; w: UInt32; h: UInt32; flags: UInt32): PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateShapedWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   * Return whether the given window is a shaped window.
+   *
+   *  window The window to query for being shaped.
+   *
+   *  SDL_TRUE if the window is a window that can be shaped, SDL_FALSE if the window is unshaped or NULL.
+   *  SDL_CreateShapedWindow
+   *}
+function SDL_IsShapedWindow(window: PSDL_Window): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IsShapedWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  The type used to identify a window
+   *
+   *   SDL_CreateWindow()
+   *   SDL_CreateWindowFrom()
+   *   SDL_DestroyWindow()
+   *   SDL_GetWindowData()
+   *   SDL_GetWindowFlags()
+   *   SDL_GetWindowGrab()
+   *   SDL_GetWindowPosition()
+   *   SDL_GetWindowSize()
+   *   SDL_GetWindowTitle()
+   *   SDL_HideWindow()
+   *   SDL_MaximizeWindow()
+   *   SDL_MinimizeWindow()
+   *   SDL_RaiseWindow()
+   *   SDL_RestoreWindow()
+   *   SDL_SetWindowData()
+   *   SDL_SetWindowFullscreen()
+   *   SDL_SetWindowGrab()
+   *   SDL_SetWindowIcon()
+   *   SDL_SetWindowPosition()
+   *   SDL_SetWindowSize()
+   *   SDL_SetWindowBordered()
+   *   SDL_SetWindowTitle()
+   *   SDL_ShowWindow()
+   *}
+
+const
+  {**
+   *  The flags on a window
+   *
+   *   SDL_GetWindowFlags()
+   *}
+
+  SDL_WINDOW_FULLSCREEN = $00000001;         {**< fullscreen window *}
+  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 = $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 *}
+  SDL_WINDOW_FULLSCREEN_DESKTOP = SDL_WINDOW_FULLSCREEN or $00001000;
+  SDL_WINDOW_FOREIGN = $00000800;            {**< window not created by SDL *}
+  SDL_WINDOW_ALLOW_HIGHDPI = $00002000;      {**< window should be created in high-DPI mode if supported *}
+
+type
+  TSDL_WindowFlags = DWord;
+
+function SDL_WindowPos_IsUndefined(X: Variant): Variant;
+function SDL_WindowPos_IsCentered(X: Variant): Variant;
+
+const
+   {**
+   *  Used to indicate that you don't care what the window position is.
+   *}
+
+  SDL_WINDOWPOS_UNDEFINED_MASK = $1FFF0000;
+  SDL_WINDOWPOS_UNDEFINED = SDL_WINDOWPOS_UNDEFINED_MASK or 0;
+
+
+  {**
+   *  Used to indicate that the window position should be centered.
+   *}
+
+  SDL_WINDOWPOS_CENTERED_MASK = $2FFF0000;
+  SDL_WINDOWPOS_CENTERED = SDL_WINDOWPOS_CENTERED_MASK or 0;
+
+  {**
+   *  Event subtype for window events
+   *}
+
+  SDL_WINDOWEVENT_NONE = 0;           {**< Never used *}
+  SDL_WINDOWEVENT_SHOWN = 1;          {**< Window has been shown *}
+  SDL_WINDOWEVENT_HIDDEN = 2;         {**< Window has been hidden *}
+  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 has been resized to data1xdata2 *}
+  SDL_WINDOWEVENT_SIZE_CHANGED = 6;   {**< The window size has changed; either as a result of an API call or through the system or user changing the window size. *}
+  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 *}
+
+type
+  TSDL_WindowEventID = DWord;
+
+  {**
+   *  An opaque handle to an OpenGL context.
+   *}
+
+  TSDL_GLContext = Pointer;
+
+  {**
+   *  OpenGL configuration attributes
+   *}
+   
+const
+  SDL_GL_RED_SIZE = 0;
+  SDL_GL_GREEN_SIZE = 1;
+  SDL_GL_BLUE_SIZE = 2;
+  SDL_GL_ALPHA_SIZE = 3;
+  SDL_GL_BUFFER_SIZE = 4;
+  SDL_GL_DOUBLEBUFFER = 5;
+  SDL_GL_DEPTH_SIZE = 6;
+  SDL_GL_STENCIL_SIZE = 7;
+  SDL_GL_ACCUM_RED_SIZE = 8;
+  SDL_GL_ACCUM_GREEN_SIZE = 9;
+  SDL_GL_ACCUM_BLUE_SIZE = 10;
+  SDL_GL_ACCUM_ALPHA_SIZE = 11;
+  SDL_GL_STEREO = 12;
+  SDL_GL_MULTISAMPLEBUFFERS = 13;
+  SDL_GL_MULTISAMPLESAMPLES = 14;
+  SDL_GL_ACCELERATED_VISUAL = 15;
+  SDL_GL_RETAINED_BACKING = 16;
+  SDL_GL_CONTEXT_MAJOR_VERSION = 17;
+  SDL_GL_CONTEXT_MINOR_VERSION = 18;
+  SDL_GL_CONTEXT_EGL = 19;
+  SDL_GL_CONTEXT_FLAGS = 20;
+  SDL_GL_CONTEXT_PROFILE_MASK = 21;
+  SDL_GL_SHARE_WITH_CURRENT_CONTEXT = 22;
+  SDL_GL_FRAMEBUFFER_SRGB_CAPABLE = 23;
+
+type
+  TSDL_GLattr = DWord;
+
+const
+  SDL_GL_CONTEXT_PROFILE_CORE           = $0001;
+  SDL_GL_CONTEXT_PROFILE_COMPATIBILITY  = $0002;
+  SDL_GL_CONTEXT_PROFILE_ES             = $0004;
+
+type
+  TSDL_GLprofile = DWord;
+
+const
+  SDL_GL_CONTEXT_DEBUG_FLAG              = $0001;
+  SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = $0002;
+  SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG      = $0004;
+  SDL_GL_CONTEXT_RESET_ISOLATION_FLAG    = $0008;
+
+type
+  TSDL_GLcontextFlag = DWord;
+
+  {* Function prototypes *}
+
+  {**
+   *  Get the number of video drivers compiled into SDL
+   *
+   *  SDL_GetVideoDriver()
+   *}
+
+function SDL_GetNumVideoDrivers: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumVideoDrivers' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the name of a built in video driver.
+   *
+   *  The video drivers are presented in the order in which they are
+   *  normally checked during initialization.
+   *
+   *  SDL_GetNumVideoDrivers()
+   *}
+
+function SDL_GetVideoDriver(index: SInt32): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetVideoDriver' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Initialize the video subsystem, optionally specifying a video driver.
+   *
+   *  driver_name Initialize a specific driver by name, or nil for the
+   *  default video driver.
+   *
+   *  0 on success, -1 on error
+   *
+   *  This function initializes the video subsystem; setting up a connection
+   *  to the window manager, etc, and determines the available display modes
+   *  and pixel formats, but does not initialize a window or graphics mode.
+   *
+   *  SDL_VideoQuit()
+   *}
+
+function SDL_VideoInit(const driver_name: PAnsiChar): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_VideoInit' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Shuts down the video subsystem.
+   *
+   *  function closes all windows, and restores the original video mode.
+   *  
+   *  SDL_VideoInit()
+   *}
+procedure SDL_VideoQuit cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_VideoQuit' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns the name of the currently initialized video driver.
+   *
+   *  The name of the current video driver or nil if no driver
+   *  has been initialized
+   *
+   *  SDL_GetNumVideoDrivers()
+   *  SDL_GetVideoDriver()
+   *}
+
+function SDL_GetCurrentVideoDriver: PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetCurrentVideoDriver' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns the number of available video displays.
+   *  
+   *  SDL_GetDisplayBounds()
+   *}
+
+function SDL_GetNumVideoDisplays: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumVideoDisplays' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the name of a display in UTF-8 encoding
+   *
+   *  The name of a display, or nil for an invalid display index.
+   *  
+   *  SDL_GetNumVideoDisplays()
+   *}
+
+function SDL_GetDisplayName(displayIndex: SInt32): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetDisplayName' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the desktop area represented by a display, with the primary
+   *  display located at 0,0
+   *
+   *  0 on success, or -1 if the index is out of range.
+   *
+   *  SDL_GetNumVideoDisplays()
+   *}
+
+function SDL_GetDisplayBounds(displayIndex: SInt32; rect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetDisplayBounds' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns the number of available display modes.
+   *
+   *  SDL_GetDisplayMode()
+   *}
+
+function SDL_GetNumDisplayModes(displayIndex: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetNumDisplayModes' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Fill in information about a specific display mode.
+   *
+   *  The display modes are sorted in this priority:
+   *        bits per pixel -> more colors to fewer colors
+   *        width -> largest to smallest
+   *        height -> largest to smallest
+   *        refresh rate -> highest to lowest
+   *
+   *  SDL_GetNumDisplayModes()
+   *}
+
+function SDL_GetDisplayMode(displayIndex: SInt32; modeIndex: SInt32; mode: PSDL_DisplayMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetDisplayMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Fill in information about the desktop display mode.
+   *}
+
+function SDL_GetDesktopDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetDesktopDisplayMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Fill in information about the current display mode.
+   *}
+
+function SDL_GetCurrentDisplayMode(displayIndex: SInt32; mode: PSDL_DisplayMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetCurrentDisplayIndex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the closest match to the requested display mode.
+   *
+   *  mode The desired display mode
+   *  closest A pointer to a display mode to be filled in with the closest
+   *  match of the available display modes.
+   *
+   *  The passed in value closest, or nil if no matching video mode
+   *  was available.
+   *  
+   *  The available display modes are scanned, and closest is filled in with the
+   *  closest mode matching the requested mode and returned.  The mode format and 
+   *  refresh_rate default to the desktop mode if they are 0.  The modes are
+   *  scanned with size being first priority, format being second priority, and 
+   *  finally checking the refresh_rate.  If all the available modes are too
+   *  small, then nil is returned.
+   *
+   *  SDL_GetNumDisplayModes()
+   *  SDL_GetDisplayMode()
+   *}
+
+function SDL_GetClosestDisplayMode(displayIndex: SInt32; const mode: PSDL_DisplayMode; closest: PSDL_DisplayMode): PSDL_DisplayMode cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetClosestDisplayMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the display index associated with a window.
+   *  
+   *  the display index of the display containing the center of the
+   *  window, or -1 on error.
+   *}
+
+function SDL_GetWindowDisplayIndex(window: PSDL_Window): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowDisplayIndex' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the display mode used when a fullscreen window is visible.
+   *
+   *  By default the window's dimensions and the desktop format and refresh rate
+   *  are used.
+   *  
+   *  mode The mode to use, or nil for the default mode.
+   *  
+   *  0 on success, or -1 if setting the display mode failed.
+   *  
+   *  SDL_GetWindowDisplayMode()
+   *  SDL_SetWindowFullscreen()
+   *}
+
+function SDL_SetWindowDisplayMode(window: PSDL_Window; const mode: PSDL_DisplayMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowDisplayMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Fill in information about the display mode used when a fullscreen
+   *  window is visible.
+   *
+   *  SDL_SetWindowDisplayMode()
+   *  SDL_SetWindowFullscreen()
+   *}
+
+function SDL_GetWindowDisplayMode(window: PSDL_Window; mode: PSDL_DisplayMode): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowDisplayMode' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the pixel format associated with the window.
+   *}
+
+function SDL_GetWindowPixelFormat(window: PSDL_Window): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowPixelFormat' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create a window with the specified position, dimensions, and flags.
+   *
+   *  title The title of the window, in UTF-8 encoding.
+   *  x     The x position of the window, ::SDL_WINDOWPOS_CENTERED, or
+   *               ::SDL_WINDOWPOS_UNDEFINED.
+   *  y     The y position of the window, ::SDL_WINDOWPOS_CENTERED, or
+   *               ::SDL_WINDOWPOS_UNDEFINED.
+   *  w     The width of the window.
+   *  h     The height of the window.
+   *  flags The flags for the window, a mask of any of the following:
+   *               ::SDL_WINDOW_FULLSCREEN, ::SDL_WINDOW_OPENGL, 
+   *               ::SDL_WINDOW_SHOWN,      ::SDL_WINDOW_BORDERLESS,
+   *               ::SDL_WINDOW_RESIZABLE,  ::SDL_WINDOW_MAXIMIZED, 
+   *               ::SDL_WINDOW_MINIMIZED,  ::SDL_WINDOW_INPUT_GRABBED.
+   *
+   *  The id of the window created, or zero if window creation failed.
+   *
+   *  SDL_DestroyWindow()
+   *}
+
+function SDL_CreateWindow(const title: PAnsiChar; x: SInt32; y: SInt32; w: SInt32; h: SInt32; flags: UInt32): PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create an SDL window from an existing native window.
+   *  
+   *  data A pointer to driver-dependent window creation data
+   *  
+   *  The id of the window created, or zero if window creation failed.
+   *
+   *  SDL_DestroyWindow()
+   *}
+
+function SDL_CreateWindowFrom(const data: Pointer): PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_CreateWindowFrom' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the numeric ID of a window, for logging purposes.
+   *}
+
+function SDL_GetWindowID(window: PSDL_Window): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowID' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get a window from a stored ID, or nil if it doesn't exist.
+   *}
+
+function SDL_GetWindowFromID(id: UInt32): PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowFromID' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the window flags.
+   *}
+
+function SDL_GetWindowFlags(window: PSDL_Window): UInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowFlags' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the title of a window, in UTF-8 format.
+   *  
+   *  SDL_GetWindowTitle()
+   *}
+
+procedure SDL_SetWindowTitle(window: PSDL_Window; const title: PAnsiChar) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowTitle' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the title of a window, in UTF-8 format.
+   *
+   *  SDL_SetWindowTitle()
+   *}
+
+function SDL_GetWindowTitle(window: PSDL_Window): PAnsiChar cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowTitle' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the icon for a window.
+   *
+   *  icon The icon for the window.
+   *}
+
+procedure SDL_SetWindowIcon(window: PSDL_Window; icon: PSDL_Surface) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowIcon' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Associate an arbitrary named pointer with a window.
+   *  
+   *  window   The window to associate with the pointer.
+   *  name     The name of the pointer.
+   *  userdata The associated pointer.
+   *
+   *  The previous value associated with 'name'
+   *
+   *  The name is case-sensitive.
+   *
+   *  SDL_GetWindowData()
+   *}
+
+function SDL_SetWindowData(window: PSDL_Window; const name: PAnsiChar; userdata: Pointer): Pointer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowData' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Retrieve the data pointer associated with a window.
+   *
+   *  window   The window to query.
+   *  name     The name of the pointer.
+   *
+   *  The value associated with 'name'
+   *
+   *  SDL_SetWindowData()
+   *}
+
+function SDL_GetWindowData(window: PSDL_Window; const name: PAnsiChar): Pointer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowData' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the position of a window.
+   *
+   *  window   The window to reposition.
+   *  x        The x coordinate of the window, SDL_WINDOWPOS_CENTERED, or
+   *                  SDL_WINDOWPOS_UNDEFINED.
+   *  y        The y coordinate of the window, SDL_WINDOWPOS_CENTERED, or
+   *                  SDL_WINDOWPOS_UNDEFINED.
+   *
+   *  The window coordinate origin is the upper left of the display.
+   *
+   *  SDL_GetWindowPosition()
+   *}
+
+procedure SDL_SetWindowPosition(window: PSDL_Window; x: SInt32; y: SInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowPosition' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the position of a window.
+   *
+   *  x        Pointer to variable for storing the x position, may be nil
+   *  y        Pointer to variable for storing the y position, may be nil
+   *
+   *  SDL_SetWindowPosition()
+   *}
+
+procedure SDL_GetWindowPosition(window: PSDL_Window; x: PInt; y: PInt) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowPosition' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the size of a window's client area.
+   *
+   *  w        The width of the window, must be >0
+   *  h        The height of the window, must be >0
+   *
+   *  You can't change the size of a fullscreen window, it automatically
+   *  matches the size of the display mode.
+   *  
+   *  SDL_GetWindowSize()
+   *}
+
+procedure SDL_SetWindowSize(window: PSDL_Window; w: SInt32; h: SInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the size of a window's client area.
+   *  
+   *  w        Pointer to variable for storing the width, may be nil
+   *  h        Pointer to variable for storing the height, may be nil
+   *  
+   *  SDL_SetWindowSize()
+   *}
+
+procedure SDL_GetWindowSize(window: PSDL_Window; w: PInt; h: PInt) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowSize' {$ENDIF} {$ENDIF};
+    
+  {**
+   *  Set the minimum size of a window's client area.
+   *  
+   *  min_w     The minimum width of the window, must be >0
+   *  min_h     The minimum height of the window, must be >0
+   *
+   *  You can't change the minimum size of a fullscreen window, it
+   *  automatically matches the size of the display mode.
+   *
+   *  SDL_GetWindowMinimumSize()
+   *  SDL_SetWindowMaximumSize()
+   *}
+
+procedure SDL_SetWindowMinimumSize(window: PSDL_Window; min_w: SInt32; min_h: SInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowMinimumSize' {$ENDIF} {$ENDIF};
+    
+  {**
+   *  Get the minimum size of a window's client area.
+   *  
+   *  w        Pointer to variable for storing the minimum width, may be nil
+   *  h        Pointer to variable for storing the minimum height, may be nil
+   *
+   *  SDL_GetWindowMaximumSize()
+   *  SDL_SetWindowMinimumSize()
+   *}
+
+procedure SDL_GetWindowMinimumSize(window: PSDL_Window; w: PInt; h: PInt) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowMinimumSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the maximum size of a window's client area.
+   *
+   *  max_w     The maximum width of the window, must be >0
+   *  max_h     The maximum height of the window, must be >0
+   *
+   *  You can't change the maximum size of a fullscreen window, it
+   *  automatically matches the size of the display mode.
+   *
+   *  SDL_GetWindowMaximumSize()
+   *  SDL_SetWindowMinimumSize()
+   *}
+
+procedure SDL_SetWindowMaximumSize(window: PSDL_Window; max_w: SInt32; max_h: SInt32) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowMaximumSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the maximum size of a window's client area.
+   *  
+   *  w        Pointer to variable for storing the maximum width, may be nil
+   *  h        Pointer to variable for storing the maximum height, may be nil
+   *
+   *  SDL_GetWindowMinimumSize()
+   *  SDL_SetWindowMaximumSize()
+   *}
+
+procedure SDL_GetWindowMaximumSize(window: PSDL_Window; w: PInt; h: PInt) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowMaximumSize' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the border state of a window.
+   *
+   *  This will add or remove the window's SDL_WINDOW_BORDERLESS flag and
+   *  add or remove the border from the actual window. This is a no-op if the
+   *  window's border already matches the requested state.
+   *
+   *  window The window of which to change the border state.
+   *  bordered SDL_FALSE to remove border, SDL_TRUE to add border.
+   *
+   *  You can't change the border state of a fullscreen window.
+   *  
+   *  SDL_GetWindowFlags()
+   *}
+
+procedure SDL_SetWindowBordered(window: PSDL_Window; bordered: TSDL_Bool) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowBordered' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Show a window.
+   *  
+   *  SDL_HideWindow()
+   *}
+
+procedure SDL_ShowWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_ShowWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Hide a window.
+   *  
+   *  SDL_ShowWindow()
+   *}
+
+procedure SDL_HideWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_HideWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Raise a window above other windows and set the input focus.
+   *}
+
+procedure SDL_RaiseWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RaiseWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Make a window as large as possible.
+   *  
+   *  SDL_RestoreWindow()
+   *}
+
+procedure SDL_MaximizeWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MaximizeWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Minimize a window to an iconic representation.
+   *
+   *  SDL_RestoreWindow()
+   *}
+
+procedure SDL_MinimizeWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_MinimizeWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Restore the size and position of a minimized or maximized window.
+   *  
+   *  SDL_MaximizeWindow()
+   *  SDL_MinimizeWindow()
+   *}
+
+procedure SDL_RestoreWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RestoreWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set a window's fullscreen state.
+   *  
+   *  0 on success, or -1 if setting the display mode failed.
+   *  
+   *  SDL_SetWindowDisplayMode()
+   *  SDL_GetWindowDisplayMode()
+   *}
+
+function SDL_SetWindowFullscreen(window: PSDL_Window; flags: UInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowFullscreen' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the SDL surface associated with the window.
+   *
+   *  The window's framebuffer surface, or nil on error.
+   *
+   *  A new surface will be created with the optimal format for the window,
+   *  if necessary. This surface will be freed when the window is destroyed.
+   *
+   *  You may not combine this with 3D or the rendering API on this window.
+   *
+   *  SDL_UpdateWindowSurface()
+   *  SDL_UpdateWindowSurfaceRects()
+   *}
+
+function SDL_GetWindowSurface(window: PSDL_Window): PSDL_Surface cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowSurface' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Copy the window surface to the screen.
+   *
+   *  0 on success, or -1 on error.
+   *
+   *  SDL_GetWindowSurface()
+   *  SDL_UpdateWindowSurfaceRects()
+   *}
+
+function SDL_UpdateWindowSurface(window: PSDL_Window): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UpdateWindowSurface' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Copy a number of rectangles on the window surface to the screen.
+   *
+   *  0 on success, or -1 on error.
+   *
+   *  SDL_GetWindowSurface()
+   *  SDL_UpdateWindowSurfaceRect()
+   *}
+
+function SDL_UpdateWindowSurfaceRects(window: PSDL_Window; rects: PSDL_Rect; numrects: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_UpdateWindowSurfaceRects' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set a window's input grab mode.
+   *  
+   *  grabbed This is SDL_TRUE to grab input, and SDL_FALSE to release input.
+   *  
+   *  SDL_GetWindowGrab()
+   *}
+
+procedure SDL_SetWindowGrab(window: PSDL_Window; grabbed: TSDL_Bool) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowGrab' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get a window's input grab mode.
+   *  
+   *  This returns SDL_TRUE if input is grabbed, and SDL_FALSE otherwise.
+   *
+   *  SDL_SetWindowGrab()
+   *}
+
+function SDL_GetWindowGrab(window: PSDL_Window): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowGrab' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the brightness (gamma correction) for a window.
+   *
+   *  0 on success, or -1 if setting the brightness isn't supported.
+   *
+   *  SDL_GetWindowBrightness()
+   *  SDL_SetWindowGammaRamp()
+   *}
+
+function SDL_SetWindowBrightness(window: PSDL_Window; brightness: Float): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowBrightness' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the brightness (gamma correction) for a window.
+   *  
+   *  The last brightness value passed to SDL_SetWindowBrightness()
+   *
+   *  SDL_SetWindowBrightness()
+   *}
+
+function SDL_GetWindowBrightness(window: PSDL_Window): Float cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowBrightness' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the gamma ramp for a window.
+   *  
+   *  red The translation table for the red channel, or nil.
+   *  green The translation table for the green channel, or nil.
+   *  blue The translation table for the blue channel, or nil.
+   *
+   *  0 on success, or -1 if gamma ramps are unsupported.
+   *  
+   *  Set the gamma translation table for the red, green, and blue channels
+   *  of the video hardware.  Each table is an array of 256 16-bit quantities,
+   *  representing a mapping between the input and output for that channel.
+   *  The input is the index into the array, and the output is the 16-bit
+   *  gamma value at that index, scaled to the output color precision.
+   *
+   *  SDL_GetWindowGammaRamp()
+   *}
+
+function SDL_SetWindowGammaRamp(window: PSDL_Window; const red: PUInt16; const green: PUInt16; const blue: PUInt16): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_SetWindowGammaRamp' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the gamma ramp for a window.
+   *
+   *  red   A pointer to a 256 element array of 16-bit quantities to hold
+   *        the translation table for the red channel, or nil.
+   *  green A pointer to a 256 element array of 16-bit quantities to hold
+   *        the translation table for the green channel, or nil.
+   *  blue  A pointer to a 256 element array of 16-bit quantities to hold
+   *        the translation table for the blue channel, or nil.
+   *   
+   *  0 on success, or -1 if gamma ramps are unsupported.
+   *
+   *  SDL_SetWindowGammaRamp()
+   *}
+
+function SDL_GetWindowGammaRamp(window: PSDL_Window; red: PUInt16; green: PUInt16; blue: PUInt16): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GetWindowGammaRamp' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Destroy a window.
+   *}
+
+procedure SDL_DestroyWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DestroyWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Returns whether the screensaver is currently enabled (default on).
+   *  
+   *  SDL_EnableScreenSaver()
+   *  SDL_DisableScreenSaver()
+   *}
+
+function SDL_IsScreenSaverEnabled: TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_IsScreenSaverEnabled' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Allow the screen to be blanked by a screensaver
+   *
+   *  SDL_IsScreenSaverEnabled()
+   *  SDL_DisableScreenSaver()
+   *}
+
+procedure SDL_EnableScreenSaver cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_EnableScreenSaver' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Prevent the screen from being blanked by a screensaver
+   *
+   *  SDL_IsScreenSaverEnabled()
+   *  SDL_EnableScreenSaver()
+   *}
+
+procedure SDL_DisableScreenSaver cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_DisableScreenSaver' {$ENDIF} {$ENDIF};
+
+  {**
+   *  OpenGL support functions
+   *}
+
+  {**
+   *  Dynamically load an OpenGL library.
+   *
+   *  path The platform dependent OpenGL library name, or nil to open the
+   *              default OpenGL library.
+   *
+   *  0 on success, or -1 if the library couldn't be loaded.
+   *
+   *  This should be done after initializing the video driver, but before
+   *  creating any OpenGL windows.  If no OpenGL library is loaded, the default
+   *  library will be loaded upon creation of the first OpenGL window.
+   *
+   *  If you do this, you need to retrieve all of the GL functions used in
+   *  your program from the dynamic library using SDL_GL_GetProcAddress().
+   *
+   *  SDL_GL_GetProcAddress()
+   *  SDL_GL_UnloadLibrary()
+   *}
+
+function SDL_GL_LoadLibrary(const path: PAnsiChar): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_LoadLibrary' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the address of an OpenGL function.
+   *}
+
+function SDL_GL_GetProcAddress(const proc: PAnsiChar): Pointer cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_GetProcAddress' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary().
+   *
+   *  SDL_GL_LoadLibrary()
+   *}
+
+procedure SDL_GL_UnloadLibrary cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_UnloadLibrary' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Return true if an OpenGL extension is supported for the current
+   *  context.
+   *}
+
+function SDL_GL_ExtensionSupported(const extension: PAnsiChar): TSDL_Bool cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_ExtensionSupported' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Reset all previously set OpenGL context attributes to their default values
+   *}
+procedure SDL_GL_ResetAttributes(); cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_ResetAttributes' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set an OpenGL window attribute before window creation.
+   *}
+
+function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_SetAttribute' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the actual value for an attribute from the current context.
+   *}
+
+function SDL_GL_GetAttribute(attr: TSDL_GLattr; value: PInt): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_GetAttribute' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Create an OpenGL context for use with an OpenGL window, and make it
+   *  current.
+   *
+   *  SDL_GL_DeleteContext()
+   *}
+
+function SDL_GL_CreateContext(window: PSDL_Window): TSDL_GLContext cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_CreateContext' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set up an OpenGL context for rendering into an OpenGL window.
+   *
+   *  The context must have been created with a compatible window.
+   *}
+
+function SDL_GL_MakeCurrent(window: PSDL_Window; context: TSDL_GLContext): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_MakeCurrent' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the currently active OpenGL window.
+   *}
+function SDL_GL_GetCurrentWindow: PSDL_Window cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_GetCurrentWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the currently active OpenGL context.
+   *}
+function SDL_GL_GetCurrentContext: TSDL_GLContext cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_GetCurrentContext' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Set the swap interval for the current OpenGL context.
+   *  
+   *  interval 0 for immediate updates, 1 for updates synchronized with the
+   *  vertical retrace. If the system supports it, you may
+   *  specify -1 to allow late swaps to happen immediately
+   *  instead of waiting for the next retrace.
+   *
+   *  0 on success, or -1 if setting the swap interval is not supported.
+   *
+   *  SDL_GL_GetSwapInterval()
+   *}
+
+function SDL_GL_SetSwapInterval(interval: SInt32): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_SetSwapInterval' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Get the swap interval for the current OpenGL context.
+   *
+   *  0 if there is no vertical retrace synchronization, 1 if the buffer
+   *  swap is synchronized with the vertical retrace, and -1 if late
+   *  swaps happen immediately instead of waiting for the next retrace.
+   *  If the system can't determine the swap interval, or there isn't a
+   *  valid current context, this will return 0 as a safe default.
+   *  
+   *  SDL_GL_SetSwapInterval()
+   *}
+
+function SDL_GL_GetSwapInterval: SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_GetSwapInterval' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Swap the OpenGL buffers for a window, if double-buffering is
+   *  supported.
+   *}
+
+procedure SDL_GL_SwapWindow(window: PSDL_Window) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_SwapWindow' {$ENDIF} {$ENDIF};
+
+  {**
+   *  Delete an OpenGL context.
+   *  
+   *  SDL_GL_CreateContext()
+   *}
+
+procedure SDL_GL_DeleteContext(context: TSDL_GLContext) cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_GL_DeleteContext' {$ENDIF} {$ENDIF};
+
+  {*OpenGL support functions*}