hedgewars/SDLh.pas
author nemo
Tue, 08 Sep 2009 19:44:49 +0000
changeset 2357 babe1a55e284
parent 2254 bb68e5a5be56
child 2376 ece7b87f1334
permissions -rw-r--r--
Add an empty weapon to avoid selection of weapons which aren't yet ready. Might all be useful to switch to amNothing in certain situations, like after using up all ropes, instead of bazooka.

(*
 * Hedgewars, a free turn based strategy game
 * Copyright (c) 2004-2008 Andrey Korotaev <unC0Rr@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 *)

unit SDLh;
interface

{$IFDEF LINUX or FREEBSD}
{$DEFINE UNIX}
{$ENDIF}

{$IFDEF UNIX}
  {$IFNDEF DARWIN}
    {$linklib c}
  {$ENDIF}
  {$linklib pthread}
{$ENDIF}

{$PACKRECORDS C}

{$IFDEF DARWIN}
	{$PASCALMAINNAME SDL_main}
{$IFNDEF IPHONEOS}
	{$linkframework Cocoa}
	{$linkframework SDL}
	{$linkframework SDL_net}
	{$linkframework SDL_image}
	{$linkframework SDL_ttf}
	{$linklib openalbridge}
	{$linklib SDLmain}
	{$linklib gcc}
{$ENDIF}
{$ENDIF}

(*  SDL  *)
const {$IFDEF WIN32}
      SDLLibName = 'SDL.dll';
      {$ENDIF}
      {$IFDEF UNIX}
            {$IFDEF DARWIN}
            SDLLibName = 'SDL';
            {$ELSE}
            SDLLibName = 'libSDL.so';
            {$ENDIF}
      {$ENDIF}
      SDL_SWSURFACE   = $00000000;
      SDL_HWSURFACE   = $00000001;
      SDL_SRCALPHA    = $00010000;
      SDL_INIT_VIDEO  = $00000020;
      SDL_INIT_AUDIO  = $00000010;

{$IFDEF SDL13}
      SDL_ASYNCBLIT   = $08000000;
      SDL_ANYFORMAT   = $10000000;
      SDL_HWPALETTE   = $00200000;
      SDL_DOUBLEBUF   = $00400000;
      SDL_FULLSCREEN  = $00800000;
      SDL_HWACCEL     = $08000000;
      SDL_SRCCOLORKEY = $00020000;
      SDL_RLEACCEL    = $08000000;
      SDL_NOFRAME     = $02000000;
      SDL_OPENGL      = $04000000;
      SDL_RESIZABLE   = $01000000;
{$ELSE}
      SDL_ASYNCBLIT   = $00000004;
      SDL_ANYFORMAT   = $00100000;
      SDL_HWPALETTE   = $20000000;
      SDL_DOUBLEBUF   = $40000000;
      SDL_FULLSCREEN  = $80000000;
      SDL_HWACCEL     = $00000100;
      SDL_SRCCOLORKEY = $00001000;
      SDL_RLEACCEL    = $00004000;
      SDL_NOFRAME     = $00000020;
      SDL_OPENGL      = $00000002;
      SDL_RESIZABLE   = $00000010;
{$ENDIF}

      SDL_NOEVENT     = 0;
      SDL_ACTIVEEVENT = 1;
      SDL_KEYDOWN     = 2;
      SDL_KEYUP       = 3;
      SDL_QUITEV      = 12;
      SDL_VIDEORESIZE = 16;

{$IFDEF SDL13}
      SDL_MOUSEMOTION  = 5;
{$ENDIF}

      SDL_APPINPUTFOCUS = 2;

      RMask = $000000FF;
      GMask = $0000FF00;
      BMask = $00FF0000;
      AMask = $FF000000;

type PSDL_Rect = ^TSDL_Rect;
     TSDL_Rect = record
		    {$IFDEF SDL13}
                 x, y, w, h: LongInt;
		    {$ELSE}
                 x, y: SmallInt;
                 w, h: Word;
            {$ENDIF}
                 end;

     TPoint = record
              X: LongInt;
              Y: LongInt;
              end;

     PSDL_PixelFormat = ^TSDL_PixelFormat;
     TSDL_PixelFormat = record
                        palette: Pointer;
                        BitsPerPixel : Byte;
                        BytesPerPixel: Byte;
                        Rloss : Byte;
                        Gloss : Byte;
                        Bloss : Byte;
                        Aloss : Byte;
                        Rshift: Byte;
                        Gshift: Byte;
                        Bshift: Byte;
                        Ashift: Byte;
                        RMask : Longword;
                        GMask : Longword;
                        BMask : Longword;
                        AMask : Longword;
                        colorkey: Longword;
                        alpha : Byte;
                        end;


     PSDL_Surface = ^TSDL_Surface;
     TSDL_Surface = record
                    flags : Longword;
                    format: PSDL_PixelFormat;
                    w, h  : LongInt;
                    pitch : Word;
                    pixels: Pointer;
                    offset: LongInt;
                    end;


     PSDL_Color = ^TSDL_Color;
     TSDL_Color = record
                  case byte of
                       0: (r: Byte;
                           g: Byte;
                           b: Byte;
                           unused: Byte;
                          );
                       1: (value: Longword);
                  end;


     PSDL_RWops = ^TSDL_RWops;
     TSeek = function( context: PSDL_RWops; offset: LongInt; whence: LongInt ): LongInt; cdecl;
     TRead = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; maxnum : LongInt ): LongInt;  cdecl;
     TWrite = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; num: LongInt ): LongInt; cdecl;
     TClose = function( context: PSDL_RWops ): LongInt; cdecl;

     TStdio = record
              autoclose: LongInt;
              fp: pointer;
              end;

     TMem = record
            base: PByte;
            here: PByte;
            stop: PByte;
            end;

     TUnknown = record
                data1: Pointer;
                end;

     TSDL_RWops = record
                  seek: TSeek;
                  read: TRead;
                  write: TWrite;
                  close: TClose;
                  type_: Longword;
                  case Byte of
                       0: (stdio: TStdio);
                       1: (mem: TMem);
                       2: (unknown: TUnknown);
                       end;

     TSDL_KeySym = record
                   scancode: Byte;
                   sym: Longword;
                   modifier: Longword;
                   unicode: Word;
                   end;

     TSDL_ActiveEvent = record
	                type_: byte;
                    gain: byte;
                    state: byte;
                    end;

     TSDL_KeyboardEvent = record
                          type_: Byte;
                          which: Byte;
                          state: Byte;
                          keysym: TSDL_KeySym;
                          end;
                          
     TSDL_GLattr = ( SDL_GL_RED_SIZE,
                     SDL_GL_GREEN_SIZE,
                     SDL_GL_BLUE_SIZE,
                     SDL_GL_ALPHA_SIZE,
                     SDL_GL_BUFFER_SIZE,
                     SDL_GL_DOUBLEBUFFER,
                     SDL_GL_DEPTH_SIZE,
                     SDL_GL_STENCIL_SIZE,
                     SDL_GL_ACCUM_RED_SIZE,
                     SDL_GL_ACCUM_GREEN_SIZE,
                     SDL_GL_ACCUM_BLUE_SIZE,
                     SDL_GL_ACCUM_ALPHA_SIZE,
                     SDL_GL_STEREO,
                     SDL_GL_MULTISAMPLEBUFFERS,
                     SDL_GL_MULTISAMPLESAMPLES,
                     SDL_GL_ACCELERATED_VISUAL,
                     SDL_GL_RETAINED_BACKING,
                     SDL_GL_CONTEXT_MAJOR_VERSION,
                     SDL_GL_CONTEXT_MINOR_VERSION );
	  
{$IFDEF SDL13}
     TSDL_MouseMotionEvent = record
                             type_: byte;
                             which: byte;
                             state: byte;
                             x    : LongInt;
                             y    : LongInt;
                             xrel : LongInt;
                             yrel : LongInt;
                             end;
{$ENDIF}

     TSDL_QuitEvent = record
                      type_: Byte;
                      end;
     TSDL_ResizeEvent = record
			type_: Byte;
			w, h: LongInt;
			end;

     PSDL_Event = ^TSDL_Event;
     TSDL_Event = record
                  case Byte of
                       SDL_NOEVENT: (type_: byte);
                       SDL_ACTIVEEVENT: (active: TSDL_ActiveEvent);
                       SDL_KEYDOWN, SDL_KEYUP: (key: TSDL_KeyboardEvent);
                       SDL_QUITEV: (quit: TSDL_QuitEvent);
                       SDL_VIDEORESIZE: (resize: TSDL_ResizeEvent);
{$IFDEF SDL13}
                       SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
{$ENDIF}
     end;

     PByteArray = ^TByteArray;
     TByteArray = array[0..65535] of Byte;
     PLongWordArray = ^TLongWordArray;
     TLongWordArray = array[0..16383] of LongWord;

     PSDL_Thread = Pointer;
     PSDL_mutex = Pointer;

function  SDL_Init(flags: Longword): LongInt; cdecl; external SDLLibName;
procedure SDL_Quit; cdecl; external SDLLibName;
function  SDL_VideoDriverName(var namebuf; maxlen: LongInt): PChar; cdecl; external SDLLibName;
procedure SDL_EnableUNICODE(enable: LongInt); cdecl; external SDLLibName;

procedure SDL_Delay(msec: Longword); cdecl; external SDLLibName;
function  SDL_GetTicks: Longword; cdecl; external SDLLibName;

function  SDL_MustLock(Surface: PSDL_Surface): Boolean;
function  SDL_LockSurface(Surface: PSDL_Surface): LongInt; cdecl; external SDLLibName;
procedure SDL_UnlockSurface(Surface: PSDL_Surface); cdecl; external SDLLibName;

function  SDL_GetError: PChar; cdecl; external SDLLibName;

function  SDL_SetVideoMode(width, height, bpp: LongInt; flags: Longword): PSDL_Surface; cdecl; external SDLLibName;
function  SDL_CreateRGBSurface(flags: Longword; Width, Height, Depth: LongInt; RMask, GMask, BMask, AMask: Longword): PSDL_Surface; cdecl; external SDLLibName;
function  SDL_CreateRGBSurfaceFrom(pixels: Pointer; width, height, depth, pitch: LongInt; RMask, GMask, BMask, AMask: Longword): PSDL_Surface; cdecl; external SDLLibName;
procedure SDL_FreeSurface(Surface: PSDL_Surface); cdecl; external SDLLibName;
function  SDL_SetColorKey(surface: PSDL_Surface; flag, key: Longword): LongInt; cdecl; external SDLLibName;
function  SDL_SetAlpha(surface: PSDL_Surface; flag, key: Longword): LongInt; cdecl; external SDLLibName;
function  SDL_ConvertSurface(src: PSDL_Surface; fmt: PSDL_PixelFormat; flags: LongInt): PSDL_Surface; cdecl; external SDLLibName;

function  SDL_UpperBlit(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): LongInt; cdecl; external SDLLibName;
function  SDL_FillRect(dst: PSDL_Surface; dstrect: PSDL_Rect; color: Longword): LongInt; cdecl; external SDLLibName;
procedure SDL_UpdateRect(Screen: PSDL_Surface; x, y: LongInt; w, h: Longword); cdecl; external SDLLibName;
function  SDL_Flip(Screen: PSDL_Surface): LongInt; cdecl; external SDLLibName;

procedure SDL_GetRGB(pixel: Longword; fmt: PSDL_PixelFormat; r, g, b: PByte); cdecl; external SDLLibName;
function  SDL_MapRGB(format: PSDL_PixelFormat; r, g, b: Byte): Longword; cdecl; external SDLLibName;

function  SDL_DisplayFormat(Surface: PSDL_Surface): PSDL_Surface; cdecl; external SDLLibName;
function  SDL_DisplayFormatAlpha(Surface: PSDL_Surface): PSDL_Surface; cdecl; external SDLLibName;

function  SDL_RWFromFile(filename, mode: PChar): PSDL_RWops; cdecl; external SDLLibName;
function  SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: LongInt): LongInt; cdecl; external SDLLibName;

{$IFDEF SDL13}
function  SDL_GetKeyboardState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName;
function  SDL_GetMouseState(index: LongInt; x, y: PLongInt): Byte; cdecl; external SDLLibName;
function  SDL_SelectMouse(index: LongInt): LongInt; cdecl; external SDLLibName;
function  SDL_GetRelativeMouseState(index: LongInt; x, y: PLongInt): Byte; cdecl; external SDLLibName;
function  SDL_GetNumMice : LongInt; cdecl; external SDLLibName;
{$ELSE}
function  SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName;
function  SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
{$ENDIF}
function  SDL_GetKeyName(key: Longword): PChar; cdecl; external SDLLibName;
procedure SDL_WarpMouse(x, y: Word); cdecl; external SDLLibName;

function  SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;

function  SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName;

procedure SDL_WM_SetCaption(title: PChar; icon: PChar); cdecl; external SDLLibName;

function  SDL_CreateMutex: PSDL_mutex; cdecl; external SDLLibName;
procedure SDL_DestroyMutex(mutex: PSDL_mutex); cdecl; external SDLLibName;
function  SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName name 'SDL_mutexP';
function  SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName name 'SDL_mutexV';

function  SDL_GL_SetAttribute(attr: TSDL_GLattr; value: LongInt): LongInt; cdecl; external SDLLibName;
procedure SDL_GL_SwapBuffers(); cdecl; external SDLLibName;

{$IFDEF SDL13}
{$IFDEF IPHONEOS}
function  SDL_iPhoneKeyboardShow(windowID: LongInt): LongInt; cdecl; external SDLLibName;
function  SDL_iPhoneKeyboardHide(windowID: LongInt): LongInt; cdecl; external SDLLibName;
function  SDL_iPhoneKeyboardIsShown(windowID: LongInt): boolean; cdecl; external SDLLibName;
function  SDL_iPhoneKeyboardToggle(windowID: LongInt): LongInt; cdecl; external SDLLibName;
{$ENDIF}
{$ENDIF}

(*  TTF  *)

const {$IFDEF WIN32}
      SDL_TTFLibName = 'SDL_ttf.dll';
      {$ENDIF}
      {$IFDEF UNIX}
            {$IFDEF DARWIN}
            SDL_TTFLibName = 'SDL_ttf';
            {$ELSE}
            SDL_TTFLibName = 'libSDL_ttf.so';
            {$ENDIF}
      {$ENDIF}
      TTF_STYLE_NORMAL = 0;
      TTF_STYLE_BOLD   = 1;
      TTF_STYLE_ITALIC = 2;

type PTTF_Font = ^TTTF_font;
     TTTF_Font = record
                 end;

function  TTF_Init: LongInt; cdecl; external SDL_TTFLibName;
procedure TTF_Quit; cdecl; external SDL_TTFLibName;


function  TTF_SizeUTF8(font: PTTF_Font; const text: PChar; var w, h: LongInt): LongInt; cdecl; external SDL_TTFLibName;
(* TSDL_Color -> Longword conversion is workaround over freepascal bug.
   See http://www.freepascal.org/mantis/view.php?id=7613 for details *)
function  TTF_RenderUTF8_Solid(font: PTTF_Font; const text: PChar; fg: Longword): PSDL_Surface; cdecl; external SDL_TTFLibName;
function  TTF_RenderUTF8_Blended(font: PTTF_Font; const text: PChar; fg: Longword): PSDL_Surface; cdecl; external SDL_TTFLibName;
function  TTF_RenderUTF8_Shaded(font: PTTF_Font; const text: PChar; fg, bg: Longword): PSDL_Surface; cdecl; external SDL_TTFLibName;

function  TTF_OpenFont(const filename: PChar; size: LongInt): PTTF_Font; cdecl; external SDL_TTFLibName;
procedure TTF_SetFontStyle(font: PTTF_Font; style: LongInt); cdecl; external SDL_TTFLibName;


(*  SDL_image  *)

const {$IFDEF WIN32}
      SDL_ImageLibName = 'SDL_image.dll';
      {$ENDIF}
      {$IFDEF UNIX}
            {$IFDEF DARWIN}
            SDL_ImageLibName = 'SDL_image';
            {$ELSE}
            SDL_ImageLibName = 'libSDL_image.so';
            {$ENDIF}
      {$ENDIF}

function IMG_Load(const _file: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName;

(*  SDL_net  *)

const {$IFDEF WIN32}
      SDL_NetLibName = 'SDL_net.dll';
      {$ENDIF}
      {$IFDEF UNIX}
            {$IFDEF DARWIN}
	        SDL_NetLibName = 'SDL_net';
            {$ELSE}
            SDL_NetLibName = 'libSDL_net.so';
            {$ENDIF}
      {$ENDIF}

type TIPAddress = record
                  host: Longword;
                  port: Word;
                  end;

     PTCPSocket = ^TTCPSocket;
     TTCPSocket = record
                  ready: LongInt;
                  channel: LongInt;
                  remoteAddress: TIPaddress;
                  localAddress: TIPaddress;
                  sflag: LongInt;
                  end;
     PSDLNet_SocketSet = ^TSDLNet_SocketSet;
     TSDLNet_SocketSet = record
                         numsockets,
                         maxsockets: LongInt;
                         sockets: PTCPSocket;
                         end;

function  SDLNet_Init: LongInt; cdecl; external SDL_NetLibName;
procedure SDLNet_Quit; cdecl; external SDL_NetLibName;

function  SDLNet_AllocSocketSet(maxsockets: LongInt): PSDLNet_SocketSet; cdecl; external SDL_NetLibName;
function  SDLNet_ResolveHost(var address: TIPaddress; host: PCHar; port: Word): LongInt; cdecl; external SDL_NetLibName;
function  SDLNet_TCP_Accept(server: PTCPsocket): PTCPSocket; cdecl; external SDL_NetLibName;
function  SDLNet_TCP_Open(var ip: TIPaddress): PTCPSocket; cdecl; external SDL_NetLibName;
function  SDLNet_TCP_Send(sock: PTCPsocket; data: Pointer; len: LongInt): LongInt; cdecl; external SDL_NetLibName;
function  SDLNet_TCP_Recv(sock: PTCPsocket; data: Pointer; len: LongInt): LongInt; cdecl; external SDL_NetLibName;
procedure SDLNet_TCP_Close(sock: PTCPsocket); cdecl; external SDL_NetLibName;
procedure SDLNet_FreeSocketSet(_set: PSDLNet_SocketSet); cdecl; external SDL_NetLibName;
function  SDLNet_AddSocket(_set: PSDLNet_SocketSet; sock: PTCPSocket): LongInt; cdecl; external SDL_NetLibName;
function  SDLNet_CheckSockets(_set: PSDLNet_SocketSet; timeout: LongInt): LongInt; cdecl; external SDL_NetLibName;

procedure SDLNet_Write16(value: Word; buf: pointer);
procedure SDLNet_Write32(value: LongWord; buf: pointer);
function  SDLNet_Read16(buf: pointer): Word;
function  SDLNet_Read32(buf: pointer): LongWord;

implementation

function SDL_MustLock(Surface: PSDL_Surface): Boolean;
begin
SDL_MustLock:= ( surface^.offset <> 0 )
       or(( surface^.flags and (SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL)) <> 0)
end;

procedure SDLNet_Write16(value: Word; buf: pointer);
begin
  PByteArray(buf)^[1]:= value;
  PByteArray(buf)^[0]:= value shr 8
end;

procedure SDLNet_Write32(value: LongWord; buf: pointer);
begin
  PByteArray(buf)^[3]:= value;
  PByteArray(buf)^[2]:= value shr  8;
  PByteArray(buf)^[1]:= value shr 16;
  PByteArray(buf)^[0]:= value shr 24
end;

function SDLNet_Read16(buf: pointer): Word;
begin
  SDLNet_Read16:= PByteArray(buf)^[1] or
                 (PByteArray(buf)^[0] shl 8)
end;

function SDLNet_Read32(buf: pointer): LongWord;
begin
  SDLNet_Read32:=  PByteArray(buf)^[3] or
                  (PByteArray(buf)^[2] shl  8) or
                  (PByteArray(buf)^[1] shl 16) or
                  (PByteArray(buf)^[0] shl 24)
end;

end.