Browse Source

* remove unneeded (not tested therefor not included) units

git-svn-id: trunk@7947 -
Almindor 18 years ago
parent
commit
fa6079cfb0

+ 0 - 20
.gitattributes

@@ -3393,34 +3393,14 @@ packages/extra/sdl/fpmake.pp svneol=native#text/plain
 packages/extra/sdl/jedi-sdl.inc svneol=native#text/plain
 packages/extra/sdl/jedi-sdl.inc svneol=native#text/plain
 packages/extra/sdl/libxmlparser.pas svneol=native#text/plain
 packages/extra/sdl/libxmlparser.pas svneol=native#text/plain
 packages/extra/sdl/logger.pas svneol=native#text/plain
 packages/extra/sdl/logger.pas svneol=native#text/plain
-packages/extra/sdl/moduleloader.pas svneol=native#text/plain
-packages/extra/sdl/registryuserpreferences.pas svneol=native#text/plain
 packages/extra/sdl/sdl.pas svneol=native#text/plain
 packages/extra/sdl/sdl.pas svneol=native#text/plain
-packages/extra/sdl/sdl_cpuinfo.pas svneol=native#text/plain
 packages/extra/sdl/sdl_gfx.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_gfx.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_image.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_image.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_mixer.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_mixer.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_mixer_nosmpeg.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_mixer_nosmpeg.pas -text svneol=unset#text/plain
 packages/extra/sdl/sdl_net.pas svneol=native#text/plain
 packages/extra/sdl/sdl_net.pas svneol=native#text/plain
-packages/extra/sdl/sdl_sound.pas svneol=native#text/plain
 packages/extra/sdl/sdl_ttf.pas svneol=native#text/plain
 packages/extra/sdl/sdl_ttf.pas svneol=native#text/plain
-packages/extra/sdl/sdlfilter.pas svneol=native#text/plain
-packages/extra/sdl/sdlgameinterface.pas svneol=native#text/plain
-packages/extra/sdl/sdli386utils.pas svneol=native#text/plain
-packages/extra/sdl/sdlinput.pas svneol=native#text/plain
-packages/extra/sdl/sdlmonofonts.pas svneol=native#text/plain
-packages/extra/sdl/sdlsprites.pas svneol=native#text/plain
-packages/extra/sdl/sdlstreams.pas svneol=native#text/plain
-packages/extra/sdl/sdlticks.pas svneol=native#text/plain
-packages/extra/sdl/sdltruetypefont.pas svneol=native#text/plain
-packages/extra/sdl/sdlutils.pas svneol=native#text/plain
-packages/extra/sdl/sdlweb.pas svneol=native#text/plain
-packages/extra/sdl/sdlwebftp.pas svneol=native#text/plain
-packages/extra/sdl/sdlwebhttp.pas svneol=native#text/plain
-packages/extra/sdl/sdlwindow.pas svneol=native#text/plain
-packages/extra/sdl/sfont.pas svneol=native#text/plain
 packages/extra/sdl/smpeg.pas svneol=native#text/plain
 packages/extra/sdl/smpeg.pas svneol=native#text/plain
-packages/extra/sdl/userpreferences.pas svneol=native#text/plain
 packages/extra/sndfile/Makefile svneol=native#text/plain
 packages/extra/sndfile/Makefile svneol=native#text/plain
 packages/extra/sndfile/Makefile.fpc svneol=native#text/plain
 packages/extra/sndfile/Makefile.fpc svneol=native#text/plain
 packages/extra/sndfile/README -text
 packages/extra/sndfile/README -text

+ 0 - 319
packages/extra/sdl/moduleloader.pas

@@ -1,319 +0,0 @@
-unit moduleloader;
-{
-  $Id: moduleloader.pas,v 1.4 2004/02/20 17:19:10 savage Exp $
-  
-}
-{******************************************************************}
-{                                                                  }
-{       Project JEDI                                               }
-{       OS independent Dynamic Loading Helpers                     }
-{                                                                  }
-{ The initial developer of the this code is                        }
-{ Robert Marquardt <[email protected])                       }
-{                                                                  }
-{ Copyright (C) 2000, 2001 Robert Marquardt.                       }
-{                                                                  }
-{ Obtained through:                                                }
-{ Joint Endeavour of Delphi Innovators (Project JEDI)              }
-{                                                                  }
-{ You may retrieve the latest version of this file at the Project  }
-{ JEDI home page, located at http://delphi-jedi.org                }
-{                                                                  }
-{ The contents of this file are used with permission, subject to   }
-{ the Mozilla Public License Version 1.1 (the "License"); you may  }
-{ not use this file except in compliance with the License. You may }
-{ obtain a copy of the License at                                  }
-{ http://www.mozilla.org/NPL/NPL-1_1Final.html                     }
-{                                                                  }
-{ Software distributed under the License is distributed on an      }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   }
-{ implied. See the License for the specific language governing     }
-{ rights and limitations under the License.                        }
-{                                                                  }
-{******************************************************************}
-{
-  $Log: moduleloader.pas,v $
-  Revision 1.4  2004/02/20 17:19:10  savage
-  Added Calling convention to Win32 functions just in case.
-
-  Revision 1.3  2004/02/14 22:36:29  savage
-  Fixed inconsistencies of using LoadLibrary and LoadModule.
-  Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
-
-  Revision 1.2  2004/02/14 00:23:39  savage
-  As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
-
-  Revision 1.1  2004/02/14 00:04:50  savage
-  dllfuncs conflicts with FreePascal so it has been renamed back to the moduleloader.pas
-
-  Revision 1.1  2004/02/05 00:08:19  savage
-  Module 1.0 release
-
-  
-}
-
-interface
-
-{$i jedi-sdl.inc}
-{$WEAKPACKAGEUNIT ON}
-
-// each OS gets its own IFDEFed complete code block to make reading easier
-
-{$IFDEF WIN32}
-uses
-  Windows;
-
-type
-  // Handle to a loaded DLL
-  TModuleHandle = HINST;
-
-const
-  // Value designating an unassigned TModuleHandle od a failed loading
-  INVALID_MODULEHANDLE_VALUE = TModuleHandle(0);
-
-function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean; stdcall;
-function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean; stdcall;
-procedure UnloadModule(var Module: TModuleHandle); stdcall;
-function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer; stdcall;
-function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer; stdcall;
-function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean; stdcall;
-function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean; stdcall;
-
-implementation
-
-// load the DLL file FileName
-// the rules for FileName are those of LoadLibrary
-// Returns: True = success, False = failure to load
-// Assigns: the handle of the loaded DLL to Module
-// Warning: if Module has any other value than INVALID_MODULEHANDLE_VALUE
-// on entry the function will do nothing but returning success.
-
-function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean;
-begin
-  if Module = INVALID_MODULEHANDLE_VALUE then
-    Module := LoadLibrary( FileName );
-  Result := Module <> INVALID_MODULEHANDLE_VALUE;
-end;
-
-// load the DLL file FileName
-// LoadLibraryEx is used to get better control of the loading
-// for the allowed values for flags see LoadLibraryEx documentation.
-
-function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean;
-begin
-  if Module = INVALID_MODULEHANDLE_VALUE then
-    Module := LoadLibraryEx( FileName, 0, Flags);
-  Result := Module <> INVALID_MODULEHANDLE_VALUE;
-end;
-
-// unload a DLL loaded with LoadModule or LoadModuleEx
-// The procedure will not try to unload a handle with
-// value INVALID_MODULEHANDLE_VALUE and assigns this value
-// to Module after unload.
-
-procedure UnloadModule(var Module: TModuleHandle);
-begin
-  if Module <> INVALID_MODULEHANDLE_VALUE then
-    FreeLibrary(Module);
-  Module := INVALID_MODULEHANDLE_VALUE;
-end;
-
-// returns the pointer to the symbol named SymbolName
-// if it is exported from the DLL Module
-// nil is returned if the symbol is not available
-
-function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer;
-begin
-  Result := nil;
-  if Module <> INVALID_MODULEHANDLE_VALUE then
-    Result := GetProcAddress(Module, SymbolName );
-end;
-
-// returns the pointer to the symbol named SymbolName
-// if it is exported from the DLL Module
-// nil is returned if the symbol is not available.
-// as an extra the boolean variable Accu is updated
-// by anding in the success of the function.
-// This is very handy for rendering a global result
-// when accessing a long list of symbols.
-
-function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer;
-begin
-  Result := nil;
-  if Module <> INVALID_MODULEHANDLE_VALUE then
-    Result := GetProcAddress(Module, SymbolName );
-  Accu := Accu and (Result <> nil);
-end;
-
-// get the value of variables exported from a DLL Module
-// Delphi cannot access variables in a DLL directly, so
-// this function allows to copy the data from the DLL.
-// Beware! You are accessing the DLL memory image directly.
-// Be sure to access a variable not a function and be sure
-// to read the correct amount of data.
-
-function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
-var
-  Sym: Pointer;
-begin
-  Result := True;
-  Sym := GetModuleSymbolEx(Module, SymbolName, Result);
-  if Result then
-    Move(Sym^, Buffer, Size);
-end;
-
-// set the value of variables exported from a DLL Module
-// Delphi cannot access variables in a DLL directly, so
-// this function allows to copy the data to the DLL!
-// BEWARE! You are accessing the DLL memory image directly.
-// Be sure to access a variable not a function and be sure
-// to write the correct amount of data.
-// The changes are not persistent. They get lost when the
-// DLL is unloaded.
-
-function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
-var
-  Sym: Pointer;
-begin
-  Result := True;
-  Sym := GetModuleSymbolEx(Module, SymbolName, Result);
-  if Result then
-    Move(Buffer, Sym^, Size);
-end;
-
-{$ENDIF}
-
-{$IFDEF Unix}
-uses
-{$ifdef Linux}
-  Types,
-  Libc;
-{$else}
-  dl,
-  Types,
-  Baseunix,
-  Unix;
-{$endif}
-type
-  // Handle to a loaded .so
-  TModuleHandle = Pointer;
-
-const
-  // Value designating an unassigned TModuleHandle od a failed loading
-  INVALID_MODULEHANDLE_VALUE = TModuleHandle(nil);
-
-function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean;
-function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean;
-procedure UnloadModule(var Module: TModuleHandle);
-function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer;
-function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer;
-function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
-function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
-
-implementation
-
-// load the .so file FileName
-// the rules for FileName are those of dlopen()
-// Returns: True = success, False = failure to load
-// Assigns: the handle of the loaded .so to Module
-// Warning: if Module has any other value than INVALID_MODULEHANDLE_VALUE
-// on entry the function will do nothing but returning success.
-
-function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean;
-begin
-  if Module = INVALID_MODULEHANDLE_VALUE then
-    Module := dlopen( FileName, RTLD_NOW);
-  Result := Module <> INVALID_MODULEHANDLE_VALUE;
-end;
-
-// load the .so file FileName
-// dlopen() with flags is used to get better control of the loading
-// for the allowed values for flags see "man dlopen".
-
-function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean;
-begin
-  if Module = INVALID_MODULEHANDLE_VALUE then
-    Module := dlopen( FileName, Flags);
-  Result := Module <> INVALID_MODULEHANDLE_VALUE;
-end;
-
-// unload a .so loaded with LoadModule or LoadModuleEx
-// The procedure will not try to unload a handle with
-// value INVALID_MODULEHANDLE_VALUE and assigns this value
-// to Module after unload.
-
-procedure UnloadModule(var Module: TModuleHandle);
-begin
-  if Module <> INVALID_MODULEHANDLE_VALUE then
-    dlclose(Module);
-  Module := INVALID_MODULEHANDLE_VALUE;
-end;
-
-// returns the pointer to the symbol named SymbolName
-// if it is exported from the .so Module
-// nil is returned if the symbol is not available
-
-function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer;
-begin
-  Result := nil;
-  if Module <> INVALID_MODULEHANDLE_VALUE then
-    Result := dlsym(Module, SymbolName );
-end;
-
-// returns the pointer to the symbol named SymbolName
-// if it is exported from the .so Module
-// nil is returned if the symbol is not available.
-// as an extra the boolean variable Accu is updated
-// by anding in the success of the function.
-// This is very handy for rendering a global result
-// when accessing a long list of symbols.
-
-function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer;
-begin
-  Result := nil;
-  if Module <> INVALID_MODULEHANDLE_VALUE then
-    Result := dlsym(Module, SymbolName );
-  Accu := Accu and (Result <> nil);
-end;
-
-// get the value of variables exported from a .so Module
-// Delphi cannot access variables in a .so directly, so
-// this function allows to copy the data from the .so.
-// Beware! You are accessing the .so memory image directly.
-// Be sure to access a variable not a function and be sure
-// to read the correct amount of data.
-
-function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
-var
-  Sym: Pointer;
-begin
-  Result := True;
-  Sym := GetModuleSymbolEx(Module, SymbolName, Result);
-  if Result then
-    Move(Sym^, Buffer, Size);
-end;
-
-// set the value of variables exported from a .so Module
-// Delphi cannot access variables in a .so directly, so
-// this function allows to copy the data to the .so!
-// BEWARE! You are accessing the .so memory image directly.
-// Be sure to access a variable not a function and be sure
-// to write the correct amount of data.
-// The changes are not persistent. They get lost when the
-// .so is unloaded.
-
-function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
-var
-  Sym: Pointer;
-begin
-  Result := True;
-  Sym := GetModuleSymbolEx(Module, SymbolName, Result);
-  if Result then
-    Move(Buffer, Sym^, Size);
-end;
-{$ENDIF}
-
-{$IFDEF __MACH__} // Mach definitions go here
-{$ENDIF}
-
-end.

+ 0 - 229
packages/extra/sdl/registryuserpreferences.pas

@@ -1,229 +0,0 @@
-unit registryuserpreferences;
-{
-  $Id: registryuserpreferences.pas,v 1.1 2004/09/30 22:35:47 savage Exp $
-  
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{             Wrapper class for Windows Register and INI Files                 }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominqiue Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominqiue Louis are                                      }
-{ Copyright (C) 2000 - 2001 Dominqiue Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   The SDL Runtime libraris on Win32  : SDL.dll on Linux : libSDL.so          }
-{   They are available from...                                                 }
-{   http://www.libsdl.org .                                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{   September   23 2004 - DL : Initial Creation                                }
-{
-  $Log: registryuserpreferences.pas,v $
-  Revision 1.1  2004/09/30 22:35:47  savage
-  Changes, enhancements and additions as required to get SoAoS working.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  {$IFDEF REG}
-  Registry,
-  {$ELSE}
-  IniFiles,
-  {$ENDIF}
-  Classes,
-  userpreferences;
-
-type
-  TRegistryUserPreferences = class( TUserPreferences )
-  private
-
-  protected
-    function GetSection( const Index : Integer ) : string; virtual; abstract;
-    function GetIdentifier( const Index : Integer ) : string; virtual; abstract;
-    function GetDefaultBoolean( const Index : Integer ) : Boolean; override;
-    function GetBoolean( const Index : Integer ) : Boolean; override;
-    procedure SetBoolean( const Index : Integer; const Value : Boolean ); override;
-    function GetDefaultDateTime( const Index : Integer ) : TDateTime; override;
-    function GetDateTime( const Index : Integer ) : TDateTime; override;
-    procedure SetDateTime( const Index : Integer; const Value : TDateTime ); override;
-    function GetDefaultInteger( const Index : Integer ) : Integer; override;
-    function GetInteger( const Index : Integer ) : Integer; override;
-    procedure SetInteger( const Index : Integer; const Value : Integer ); override;
-    function GetDefaultFloat( const Index : Integer ) : single; override;
-    function GetFloat( const Index : Integer ) : single; override;
-    procedure SetFloat( const Index : Integer; const Value : single ); override;
-    function GetDefaultString( const Index : Integer ) : string; override;
-    function GetString( const Index : Integer ) : string; override;
-    procedure SetString( const Index : Integer; const Value : string ); override;
-  public
-    Registry : {$IFDEF REG}TRegIniFile{$ELSE}TIniFile{$ENDIF};
-    constructor Create( const FileName : string = '' ); reintroduce;
-    destructor Destroy; override;
-    procedure Update; override;
-  end;
-
-implementation
-
-uses
-  SysUtils;
-
-{ TRegistryUserPreferences }
-constructor TRegistryUserPreferences.Create( const FileName : string );
-var
-  defFileName : string;
-begin
-  inherited Create;
-
-  if FileName <> '' then
-    defFileName := FileName
-  else
-    defFileName := ChangeFileExt( ParamStr( 0 ), '.ini' );
-
-  Registry := {$IFDEF REG}TRegIniFile{$ELSE}TIniFile{$ENDIF}.Create( defFileName );
-end;
-
-destructor TRegistryUserPreferences.Destroy;
-begin
-  Update;
-  Registry.Free;
-  Registry := nil;
-  inherited;
-end;
-
-function TRegistryUserPreferences.GetBoolean( const Index : Integer ) : Boolean;
-begin
-  Result := Registry.ReadBool( GetSection( Index ), GetIdentifier( Index ), GetDefaultBoolean( Index ) );
-end;
-
-function TRegistryUserPreferences.GetDateTime( const Index : Integer ): TDateTime;
-begin
-  Result := Registry.ReadDateTime( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ), GetDefaultDateTime( Index ){$ENDIF} );
-end;
-
-function TRegistryUserPreferences.GetDefaultBoolean( const Index : Integer ) : Boolean;
-begin
-  result := false;
-end;
-
-function TRegistryUserPreferences.GetDefaultDateTime( const Index: Integer ) : TDateTime;
-begin
-  result := Now;
-end;
-
-function TRegistryUserPreferences.GetDefaultFloat( const Index: Integer ) : single;
-begin
-  result := 0.0;
-end;
-
-function TRegistryUserPreferences.GetDefaultInteger(const Index : Integer ) : Integer;
-begin
-  result := 0;
-end;
-
-function TRegistryUserPreferences.GetDefaultString( const Index : Integer ) : string;
-begin
-  result := '';
-end;
-
-function TRegistryUserPreferences.GetFloat( const Index : Integer ): single;
-begin
-  Result := Registry.ReadFloat( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ), GetDefaultFloat( Index ){$ENDIF} );
-end;
-
-function TRegistryUserPreferences.GetInteger( const Index : Integer ) : Integer;
-begin
-  Result := Registry.ReadInteger( GetSection( Index ), GetIdentifier( Index ), GetDefaultInteger( Index )  );
-end;
-
-function TRegistryUserPreferences.GetString( const Index : Integer ): string;
-begin
-  Result := Registry.ReadString( GetSection( Index ), GetIdentifier( Index ), GetDefaultString( Index ) );
-end;
-
-procedure TRegistryUserPreferences.SetBoolean( const Index : Integer; const Value : Boolean );
-begin
-  Registry.WriteBool( GetSection( Index ), GetIdentifier( Index ), Value );
-  inherited;
-end;
-
-procedure TRegistryUserPreferences.SetDateTime( const Index: Integer; const Value: TDateTime );
-begin
-  Registry.WriteDateTime( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ){$ENDIF}, Value );
-  inherited;
-end;
-
-procedure TRegistryUserPreferences.SetFloat(const Index: Integer; const Value: single);
-begin
-  Registry.WriteFloat( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ){$ENDIF}, Value );
-  inherited;
-end;
-
-procedure TRegistryUserPreferences.SetInteger( const Index, Value : Integer );
-begin
-  Registry.WriteInteger( GetSection( Index ), GetIdentifier( Index ), Value );
-  inherited;
-end;
-
-procedure TRegistryUserPreferences.SetString( const Index : Integer; const Value : string );
-begin
-  Registry.WriteString( GetSection( Index ), GetIdentifier( Index ), Value );
-  inherited;
-end;
-
-procedure TRegistryUserPreferences.Update;
-begin
-  {$IFDEF REG}
-  Registry.CloseKey;
-  {$ELSE}
-  Registry.UpdateFile;
-  {$ENDIF}
-end;
-
-end.

+ 0 - 155
packages/extra/sdl/sdl_cpuinfo.pas

@@ -1,155 +0,0 @@
-unit sdl_cpuinfo;
-{
-  $Id: sdl_cpuinfo.pas,v 1.2 2004/02/18 22:52:53 savage Exp $
-
-}
-{******************************************************************************}
-{                                                                              }
-{       Borland Delphi SDL - Simple DirectMedia Layer                          }
-{       Conversion of the Simple DirectMedia Layer Headers                     }
-{                                                                              }
-{ Portions created by Sam Lantinga <[email protected]> are                }
-{ Copyright (C) 1997-2004  Sam Lantinga                                        }
-{ 5635-34 Springhouse Dr.                                                      }
-{ Pleasanton, CA 94588 (USA)                                                   }
-{                                                                              }
-{ All Rights Reserved.                                                         }
-{                                                                              }
-{ The original files are : SDL_cpuinfo.h                                       }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominqiue Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominqiue Louis are                                      }
-{ Copyright (C) 2000 - 2004 Dominqiue Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   The SDL Runtime libraris on Win32  : SDL.dll on Linux : libSDL.so          }
-{   They are available from...                                                 }
-{   http://www.libsdl.org .                                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{
-  $Log: sdl_cpuinfo.pas,v $
-  Revision 1.2  2004/02/18 22:52:53  savage
-  Forgot to add jedi-sdl.inc file. It's there now.
-
-  Revision 1.1  2004/02/18 22:35:54  savage
-  Brought sdl.pas up to 1.2.7 compatability
-  Thus...
-  Added SDL_GL_STEREO,
-      SDL_GL_MULTISAMPLEBUFFERS,
-      SDL_GL_MULTISAMPLESAMPLES
-
-  Add DLL/Shared object functions
-  function SDL_LoadObject( const sofile : PChar ) : Pointer;
-
-  function SDL_LoadFunction( handle : Pointer; const name : PChar ) : Pointer;
-
-  procedure SDL_UnloadObject( handle : Pointer );
-
-  Added function to create RWops from const memory: SDL_RWFromConstMem()
-  function SDL_RWFromConstMem(const mem: Pointer; size: Integer) : PSDL_RWops;
-
-  Ported SDL_cpuinfo.h so Now you can test for Specific CPU types.
-
-
-}
-{******************************************************************************}
-
-interface
-
-{$I jedi-sdl.inc}
-
-uses
-  sdl;
-
-{* This function returns true if the CPU has the RDTSC instruction
- *}
-function SDL_HasRDTSC : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_HasRDTSC'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_HasRDTSC}
-
-{* This function returns true if the CPU has MMX features
- *}
-function SDL_HasMMX : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_HasMMX'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_HasMMX}
-
-{* This function returns true if the CPU has MMX Ext. features
- *}
-function SDL_HasMMXExt : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_HasMMXExt'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_HasMMXExt}
-
-{* This function returns true if the CPU has 3DNow features
- *}
-function SDL_Has3DNow : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_Has3DNow'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_Has3DNow}
-
-{* This function returns true if the CPU has 3DNow! Ext. features
- *}
-function SDL_Has3DNowExt : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_Has3DNowExt'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_Has3DNowExt}
-
-{* This function returns true if the CPU has SSE features
- *}
-function SDL_HasSSE : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_HasSSE'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_HasSSE}
-
-{* This function returns true if the CPU has SSE2 features
- *}
-function SDL_HasSSE2 : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_HasSSE2'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_HasSSE2}
-
-{* This function returns true if the CPU has AltiVec features
- *}
-function SDL_HasAltiVec : SDL_Bool;
-cdecl; external {$IFDEF __GPC__}name 'SDL_HasAltiVec'{$ELSE} SDLLibName{$ENDIF __GPC__};
-{$EXTERNALSYM SDL_HasAltiVec}
-
-implementation
-
-end.
- 

+ 0 - 562
packages/extra/sdl/sdl_sound.pas

@@ -1,562 +0,0 @@
-unit sdl_sound;
-{
-  $Id: sdl_sound.pas,v 1.5 2004/12/23 23:38:40 savage Exp $
-  
-}
-(*
- * SDL_sound -- An abstract sound format decoding API.
- * Copyright (C) 2001  Ryan C. Gordon.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *)
-(**
- * @overview
- *
- * The basic gist of SDL_sound is that you use an SDL_RWops to get sound data
- *  into this library, and SDL_sound will take that data, in one of several
- *  popular formats, and decode it into raw waveform data in the format of
- *  your choice. This gives you a nice abstraction for getting sound into your
- *  game or application; just feed it to SDL_sound, and it will handle
- *  decoding and converting, so you can just pass it to your SDL audio
- *  callback (or whatever). Since it gets data from an SDL_RWops, you can get
- *  the initial sound data from any number of sources: file, memory buffer,
- *  network connection, etc.
- *
- * As the name implies, this library depends on SDL: Simple Directmedia Layer,
- *  which is a powerful, free, and cross-platform multimedia library. It can
- *  be found at http://www.libsdl.org/
- *
- * Support is in place or planned for the following sound formats:
- *   - .WAV  (Microsoft WAVfile RIFF data, internal.)
- *   - .VOC  (Creative Labs' Voice format, internal.)
- *   - .MP3  (MPEG-1 Layer 3 support, via the SMPEG library.)
- *   - .MID  (MIDI music converted to Waveform data, internal.)
- *   - .MOD  (MOD files, via MikMod and ModPlug.)
- *   - .OGG  (Ogg files, via Ogg Vorbis libraries.)
- *   - .SHN  (Shorten files, internal.)
- *   - .RAW  (Raw sound data in any format, internal.)
- *   - .AU   (Sun's Audio format, internal.)
- *   - .AIFF (Audio Interchange format, internal.)
- *   - .FLAC (Lossless audio compression, via libFLAC.)
- *
- *   (...and more to come...)
- *
- * Please see the file COPYING in the source's root directory.
- *
- *  This file written by Ryan C. Gordon. ([email protected])
- *)
-{   April   03 2003 - DL : Added jedi-sdl.inc include file to support more     }
-{                          Pascal compilers. Initial support is now included   }
-{                          for GnuPascal, VirtualPascal, TMT and obviously     }
-{                          continue support for Delphi Kylix and FreePascal.   }
-{                                                                              }
-{   May     03 2003 - DL : under instruction from David Mears AKA              }
-{                          Jason Siletto, I have added FPC Linux support.      }
-{                                                                              }
-{
-  $Log: sdl_sound.pas,v $
-  Revision 1.5  2004/12/23 23:38:40  savage
-  Applied Patches supplied by Michalis Kamburelis ( THANKS! ), for tidier code.
-
-  Revision 1.4  2004/08/14 22:54:30  savage
-  Updated so that Library name defines are correctly defined for MacOS X.
-
-  Revision 1.3  2004/05/10 14:10:04  savage
-  Initial MacOS X support. Fixed defines for MACOS ( Classic ) and DARWIN ( MacOS X ).
-
-  Revision 1.2  2004/03/30 20:23:28  savage
-  Tidied up use of UNIX compiler directive.
-
-  Revision 1.1  2004/02/16 22:16:40  savage
-  v1.0 changes
-
-  
-}
-{******************************************************************************}
-
-{$I jedi-sdl.inc}
-
-interface
-
-uses
-{$IFDEF windows}
-  Windows,
-{$ENDIF}
-  sdl;
-
-const
-{$IFDEF windows}
-  SDLSoundLibName = 'SDL_sound.dll';
-{$ENDIF}
-
-{$IFDEF UNIX}
-{$IFDEF DARWIN}
-  SDLSoundLibName = 'libSDL_sound.dylib';
-{$ELSE}
-  SDLSoundLibName = 'libSDL_sound.so';
-{$ENDIF}
-{$ENDIF}
-
-{$IFDEF MACOS}
-  SDLSoundLibName = 'SDL_sound';
-{$ENDIF}
-
-  SOUND_VER_MAJOR = 0;
-{$EXTERNALSYM SOUND_VER_MAJOR}
-  SOUND_VER_MINOR = 1;
-{$EXTERNALSYM SOUND_VER_MINOR}
-  SOUND_VER_PATCH = 5;
-{$EXTERNALSYM SOUND_VER_PATCH}
-
-  (**
-   * These are flags that are used in a Sound_Sample to show various states.
-   *
-   *   To use: 'if (sample.flags  and SOUND_SAMPLEFLAG_ERROR) begin dosomething; end;'
-   *
-   *  @param SOUND_SAMPLEFLAG_NONE     nil flag.
-   *  @param SOUND_SAMPLEFLAG_NEEDSEEK SDL_RWops must be able to seek.
-   *  @param SOUND_SAMPLEFLAG_EOF      end of input stream.
-   *  @param SOUND_SAMPLEFLAG_ERROR    unrecoverable error.
-   *  @param SOUND_SAMPLEFLAG_EAGAIN   function would block, or temp error.
-   *)
-  SOUND_SAMPLEFLAG_NONE = 0;
-{$EXTERNALSYM SOUND_SAMPLEFLAG_NONE}
-  (* these are set at sample creation time... *)
-  SOUND_SAMPLEFLAG_NEEDSEEK = 1;
-{$EXTERNALSYM SOUND_SAMPLEFLAG_NEEDSEEK}
-  (* these are set during decoding... *)
-  SOUND_SAMPLEFLAG_EOF = 1 shl 29;
-{$EXTERNALSYM SOUND_SAMPLEFLAG_EOF}
-  SOUND_SAMPLEFLAG_ERROR = 1 shl 30;
-{$EXTERNALSYM SOUND_SAMPLEFLAG_ERROR}
-  SOUND_SAMPLEFLAG_EAGAIN = 1 shl 31;
-{$EXTERNALSYM SOUND_SAMPLEFLAG_EAGAIN}
-
-  (**
-   * These are the basics of a decoded sample's data type = recordure: data format
-   *  (see AUDIO_U8 and friends in SDL_audio.h), number of channels, and sample
-   *  rate. If you need more explanation than that, you should stop developing
-   *  sound code right now.
-   *
-   *   @param format Equivalent of SDL_AudioSpec.format.
-   *   @param channels Number of sound channels. 1 = mono, 2 = stereo.
-   *   @param rate Sample rate; frequency of sample points per second (44100,
-   *                22050, 8000, etc.)
-   *)
-type
-  TSound_SampleFlags = Integer;
-
-  PSound_AudioInfo = ^Sound_AudioInfo;
-  Sound_AudioInfo = record
-    format: Uint16;
-    channels: Uint8;
-    rate: Uint32;
-  end;
-  TSound_AudioInfo = Sound_AudioInfo;
-{$EXTERNALSYM Sound_AudioInfo}
-
-  (**
-   * Each decoder sets up one of these type = records, which can be retrieved via
-   *  the Sound_AvailableDecoders function. EVERY FIELD IN THIS IS READ-ONLY.
-   *
-   *   @param extensions File extensions, list ends with nil. Read it like this:
-   *           const  : PChar *ext;
-   *           for (ext := info.extensions; *ext <> nil; ext++)
-   *                printf('   File extension \'%s\'', *ext);
-   *   @param description Human readable description of decoder.
-   *   @param author 'Name Of Author <[email protected]>'
-   *   @param url URL specific to this decoder.
-   *)
-  PSound_DecoderInfo = ^Sound_DecoderInfo;
-  Sound_DecoderInfo = record
-    extensions: PChar;
-    description: PChar;
-    author: PChar;
-    url: PChar;
-  end;
-  TSound_DecoderInfo = Sound_DecoderInfo;
-{$EXTERNALSYM Sound_DecoderInfo}
-
-  (**
-   * The Sound_Sample type = recordure is the heart of SDL_sound. This holds
-   *  information about a source of sound data as it is being decoded.
-   *  EVERY FIELD IN THIS IS READ-ONLY. Please use the API functions to
-   *  change them.
-   *
-   *  @param opaque Internal use only. Don't touch.
-   *  @param decoder Decoder used for this sample.
-   *  @param desired Desired audio format for conversion.
-   *  @param actual Actual audio format of sample.
-   *  @param buffer Decoded sound data lands in here.
-   *  @param buffer_size Current size of (buffer), in bytes (Uint8).
-   *  @param flags Flags relating to this sample.
-   *)
-  PSound_Sample = ^Sound_Sample;
-  Sound_Sample = record
-    opaque: Pointer;
-    decoder: PSound_DecoderInfo;
-    desired: Sound_AudioInfo;
-    actual: Sound_AudioInfo;
-    buffer: Pointer;
-    buffer_size: Uint32;
-    flags: TSound_SampleFlags;
-  end;
-  TSound_Sample = Sound_Sample;
-{$EXTERNALSYM Sound_Sample}
-
-  (**
-   * Just what it says: a major.minor.patch style version number...
-   *
-   *   @param major The major version number.
-   *   @param minor The minor version number.
-   *   @param patch The patchlevel version number.
-   *)
-  PSound_Version = ^Sound_Version;
-  Sound_Version = record
-    major: integer;
-    minor: integer;
-    patch: integer;
-  end;
-  TSound_Version = Sound_Version;
-{$EXTERNALSYM Sound_Version}
-
-  (* functions and macros... *)
-
-procedure SOUND_GETVERSION(var x: TSound_Version);
-
-(**
- * Get the version of SDL_sound that is linked against your program. If you
- *  are using a shared library (DLL) version of SDL_sound, then it is possible
- *  that it will be different than the version you compiled against.
- *
- * This is a real function; the macro SOUND_VERSION tells you what version
- *  of SDL_sound you compiled against:
- *
- * Sound_Version compiled;
- * Sound_Version linked;
- *
- * SOUND_VERSION(@compiled);
- * Sound_GetLinkedVersion(@linked);
- * printf('We compiled against SDL_sound version %d.%d.%d ...',
- *           compiled.major, compiled.minor, compiled.patch);
- * printf('But we linked against SDL_sound version %d.%d.%d.',
- *           linked.major, linked.minor, linked.patch);
- *
- * This function may be called safely at any time, even before Sound_Init.
- *
- * @param ver Sound_Version type = recordure to fill with shared library's version.
- *)
-procedure Sound_GetLinkedVersion(ver: PSound_Version);
-cdecl; external {$IFDEF __GPC__}name 'Sound_GetLinkedVersion'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_GetLinkedVersion}
-
-(**
- * Initialize SDL_sound. This must be called before any other SDL_sound
- *  function (except perhaps Sound_GetLinkedVersion). You should call
- *  SDL_Init before calling this. Sound_Init will attempt to call
- *  SDL_Init(SDL_INIT_AUDIO), just in . This is a safe behaviour, but it
- *  may not configure SDL to your liking by itself.
- *
- *  @returns nonzero on success, zero on error. Specifics of the
- *           error can be gleaned from Sound_GetError.
- *)
-function Sound_Init: integer;
-cdecl; external {$IFDEF __GPC__}name 'Sound_Init'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_Init}
-
-(**
- * Shutdown SDL_sound. This closes any SDL_RWops that were being used as
- *  sound sources, and frees any resources in use by SDL_sound.
- *
- * All Sound_Sample pointers you had prior to this call are INVALIDATED.
- *
- * Once successfully deinitialized, Sound_Init can be called again to
- *  restart the subsystem. All default API states are restored at this
- *  point.
- *
- * You should call this BEFORE SDL_Quit. This will NOT call SDL_Quit
- *  for younot
- *
- *  @returns nonzero on success, zero on error. Specifics of the error
- *           can be gleaned from Sound_GetError. If failure, state of
- *           SDL_sound is undefined, and probably badly screwed up.
- *)
-function Sound_Quit: integer;
-cdecl; external {$IFDEF __GPC__}name 'Sound_Quit'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_Quit}
-
-(**
- * Get a list of sound formats supported by this implementation of SDL_sound.
- *  This is for informational purposes only. Note that the extension listed is
- *  merely convention: if we list 'MP3', you can open an MPEG-1 Layer 3 audio
- *  file with an extension of 'XYZ', if you like. The file extensions are
- *  informational, and only required as a h : integer to choosing the correct
- *  decoder, since the sound data may not be coming from a file at all, thanks
- *  to the abstraction that an SDL_RWops provides.
- *
- * The result value is an array of pointers to Sound_DecoderInfo type = recordures,
- *  with a nil entry to signify the end of the list:
- *
- * Sound_DecoderInfo **i;
- *
- * for (i := Sound_AvailableDecoders; *i <> nil; i++)
- * begin
- *     printf('Supported sound format:  : array[ 0..%s- 1 ] of , which is  : array[ 0..%s- 1 ] of .',
- *              i.extension, i.description);
- *     // ...and other fields...
- * end;
- *
- * The return values are pointers to static internal memory, and should
- *  be considered READ ONLY, and never freed.
- *
- *  @returns READ ONLY nil-terminated array of READ ONLY type = recordures.
- *)
-function Sound_AvailableDecoders: PSound_DecoderInfo;
-cdecl; external {$IFDEF __GPC__}name 'Sound_AvailableDecoders'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_AvailableDecoders}
-
-(**
- * Get the last SDL_sound error message as a nil-terminated string.
- *  This will be nil if there's been no error since the last call to this
- *  function. The pointer returned by this call points to an internal buffer.
- *  Each thread has a unique error state associated with it, but each time
- *  a new error message is set, it will overwrite the previous one associated
- *  with that thread. It is safe to call this function at anytime, even
- *  before Sound_Init.
- *
- *  @returns READ ONLY string of last error message.
- *)
-function Sound_GetError: PChar;
-cdecl; external {$IFDEF __GPC__}name 'Sound_GetError'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_GetError}
-
-(**
- * Clear the current error message, so the next call to Sound_GetError will
- *  return nil.
- *)
-procedure Sound_ClearError;
-cdecl; external {$IFDEF __GPC__}name 'Sound_ClearError'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_ClearError}
-
-(**
- * Start decoding a new sound sample. The data is read via an SDL_RWops
- *  type = recordure (see SDL_rwops.h in the SDL include directory), so it may be
- *  coming from memory, disk, network stream, etc. The (ext) parameter is
- *  merely a h : integer to determining the correct decoder; if you specify, for
- *  example, 'mp3' for an extension, and one of the decoders lists that
- *  as a handled extension, then that decoder is given first shot at trying
- *  to claim the data for decoding. If none of the extensions match (or the
- *  extension is nil), then every decoder examines the data to determine if
- *  it can handle it, until one accepts it. In such a  your SDL_RWops will
- *  need to be capable of rewinding to the start of the stream.
- * If no decoders can handle the data, a nil value is returned, and a human
- *  readable error message can be fetched from Sound_GetError.
- * Optionally, a desired audio format can be specified. If the incoming data
- *  is in a different format, SDL_sound will convert it to the desired format
- *  on the fly. Note that this can be an expensive operation, so it may be
- *  wise to convert data before you need to play it back, if possible, or
- *  make sure your data is initially in the format that you need it in.
- *  If you don't want to convert the data, you can specify nil for a desired
- *  format. The incoming format of the data, preconversion, can be found
- *  in the Sound_Sample type = recordure.
- * Note that the raw sound data 'decoder' needs you to specify both the
- *  extension 'RAW' and a 'desired' format, or it will refuse to handle
- *  the data. This is to prevent it from catching all formats unsupported
- *  by the other decoders.
- * Finally, specify an initial buffer size; this is the number of bytes that
- *  will be allocated to store each read from the sound buffer. The more you
- *  can safely allocate, the more decoding can be done in one block, but the
- *  more resources you have to use up, and the longer each decoding call will
- *  take. Note that different data formats require more or less space to
- *  store. This buffer can be resized via Sound_SetBufferSize ...
- * The buffer size specified must be a multiple of the size of a single
- *  sample point. So, if you want 16-bit, stereo samples, then your sample
- *  po : integer size is (2 channels * 16 bits), or 32 bits per sample, which is four
- *  bytes. In such a , you could specify 128 or 132 bytes for a buffer,
- *  but not 129, 130, or 131 (although in reality, you'll want to specify a
- *  MUCH larger buffer).
- * When you are done with this Sound_Sample pointer, you can dispose of it
- *  via Sound_FreeSample.
- * You do not have to keep a reference to (rw) around. If this function
- *  suceeds, it stores (rw) internally (and disposes of it during the call
- *  to Sound_FreeSample). If this function fails, it will dispose of the
- *  SDL_RWops for you.
- *
- *    @param rw SDL_RWops with sound data.
- *    @param ext File extension normally associated with a data format.
- *               Can usually be nil.
- *    @param desired Format to convert sound data into. Can usually be nil,
- *                   if you don't need conversion.
- *   @returns Sound_Sample pointer, which is used as a handle to several other
- *            SDL_sound APIs. nil on error. If error, use
- *            Sound_GetError to see what went wrong.
- *)
-function Sound_NewSample(rw: PSDL_RWops; const ext: PChar;
-  desired: PSound_AudioInfo; bufferSize: Uint32): PSound_Sample;
-cdecl; external {$IFDEF __GPC__}name 'Sound_NewSample'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_NewSample}
-
-(**
- * This is identical to Sound_NewSample, but it creates an SDL_RWops for you
- *  from the file located in (filename). Note that (filename) is specified in
- *  platform-dependent notation. ('C:\\music\\mysong.mp3' on windows, and
- *  '/home/icculus/music/mysong.mp3' or whatever on Unix, etc.)
- * Sound_NewSample's 'ext' parameter is gleaned from the contents of
- *  (filename).
- *
- *    @param filename file containing sound data.
- *    @param desired Format to convert sound data into. Can usually be nil,
- *                   if you don't need conversion.
- *    @param bufferSize size, in bytes, of initial read buffer.
- *   @returns Sound_Sample pointer, which is used as a handle to several other
- *            SDL_sound APIs. nil on error. If error, use
- *            Sound_GetError to see what went wrong.
- *)
-function Sound_NewSampleFromFile(const filename: PChar; desired:
-  PSound_AudioInfo; bufferSize: Uint32): PSound_Sample;
-cdecl; external {$IFDEF __GPC__}name 'Sound_NewSampleFromFile'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_NewSampleFromFile}
-
-(**
- * Dispose of a Sound_Sample pointer that was returned from Sound_NewSample.
- *  This will also close/dispose of the SDL_RWops that was used at creation
- *  time, so there's no need to keep a reference to that around.
- * The Sound_Sample pointer is invalid after this call, and will almost
- *  certainly result in a crash if you attempt to keep using it.
- *
- *    @param sample The Sound_Sample to delete.
- *)
-procedure Sound_FreeSample(sample: PSound_Sample);
-cdecl; external {$IFDEF __GPC__}name 'Sound_FreeSample'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_FreeSample}
-
-(**
- * Change the current buffer size for a sample. If the buffer size could
- *  be changed, then the sample.buffer and sample.buffer_size fields will
- *  reflect that. If they could not be changed, then your original sample
- *  state is preserved. If the buffer is shrinking, the data at the end of
- *  buffer is truncated. If the buffer is growing, the contents of the new
- *  space at the end is undefined until you decode more into it or initialize
- *  it yourself.
- *
- * The buffer size specified must be a multiple of the size of a single
- *  sample point. So, if you want 16-bit, stereo samples, then your sample
- *  po : integer size is (2 channels * 16 bits), or 32 bits per sample, which is four
- *  bytes. In such a , you could specify 128 or 132 bytes for a buffer,
- *  but not 129, 130, or 131 (although in reality, you'll want to specify a
- *  MUCH larger buffer).
- *
- *    @param sample The Sound_Sample whose buffer to modify.
- *    @param new_size The desired size, in bytes, of the new buffer.
- *  @returns non-zero if buffer size changed, zero on failure.
- *)
-function Sound_SetBufferSize(sample: PSound_Sample; new_size: Uint32): integer;
-cdecl; external {$IFDEF __GPC__}name 'Sound_SetBufferSize'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_SetBufferSize}
-
-(**
- * Decode more of the sound data in a Sound_Sample. It will decode at most
- *  sample.buffer_size bytes into sample.buffer in the desired format, and
- *  return the number of decoded bytes.
- * If sample.buffer_size bytes could not be decoded, then please refer to
- *  sample.flags to determine if this was an End-of-stream or error condition.
- *
- *    @param sample Do more decoding to this Sound_Sample.
- *  @returns number of bytes decoded into sample.buffer. If it is less than
- *           sample.buffer_size, then you should check sample.flags to see
- *           what the current state of the sample is (EOF, error, read again).
- *)
-function Sound_Decode(sample: PSound_Sample): Uint32;
-cdecl; external {$IFDEF __GPC__}name 'Sound_Decode'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_Decode}
-
-(**
- * Decode the remainder of the sound data in a Sound_Sample. This will
- *  dynamically allocate memory for the ENTIRE remaining sample.
- *  sample.buffer_size and sample.buffer will be updated to reflect the
- *  new buffer. Please refer to sample.flags to determine if the decoding
- *  finished due to an End-of-stream or error condition.
- *
- * Be aware that sound data can take a large amount of memory, and that
- *  this function may block for quite awhile while processing. Also note
- *  that a streaming source (for example, from a SDL_RWops that is getting
- *  fed from an Internet radio feed that doesn't end) may fill all available
- *  memory before giving up...be sure to use this on finite sound sources
- *  onlynot
- *
- * When decoding the sample in its entirety, the work is done one buffer at a
- *  time. That is, sound is decoded in sample.buffer_size blocks, and
- *  appended to a continually-growing buffer until the decoding completes.
- *  That means that this function will need enough RAM to hold approximately
- *  sample.buffer_size bytes plus the complete decoded sample at most. The
- *  larger your buffer size, the less overhead this function needs, but beware
- *  the possibility of paging to disk. Best to make this user-configurable if
- *  the sample isn't specific and small.
- *
- *    @param sample Do all decoding for this Sound_Sample.
- *   @returns number of bytes decoded into sample.buffer. You should check
- *           sample.flags to see what the current state of the sample is
- *           (EOF, error, read again).
- *)
-function Sound_DecodeAll(sample: PSound_Sample): Uint32;
-cdecl; external {$IFDEF __GPC__}name 'Sound_DecodeAll'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_DecodeAll}
-
-(**
- * Restart a sample at the start of its waveform data, as if newly
- *  created with Sound_NewSample. If successful, the next call to
- *  Sound_Decode : array[ 0..All- 1 ] of  will give audio data from the earliest point
- *  in the stream.
- *
- * Beware that this function will fail if the SDL_RWops that feeds the
- *  decoder can not be rewound via it's seek method, but this can
- *  theoretically be aprocedure ed by wrapping it in some sort of buffering
- *  SDL_RWops.
- *
- * This function should ONLY fail if the RWops is not seekable, or
- *  SDL_sound is not initialized. Both can be controlled by the application,
- *  and thus, it is up to the developer's paranoia to dictate whether this
- *  function's return value need be checked at all.
- *
- * If this function fails, the state of the sample is undefined, but it
- *  is still safe to call Sound_FreeSample to dispose of it.
- *
- * On success, ERROR, EOF, and EAGAIN are cleared from sample.flags. The
- *  ERROR flag is set on error.
- *
- *    @param sample The Sound_Sample to rewind.
- *   @return nonzero on success, zero on error. Specifics of the
- *           error can be gleaned from Sound_GetError.
- *)
-function Sound_Rewind(sample: PSound_Sample): integer;
-cdecl; external {$IFDEF __GPC__}name 'Sound_Rewind'{$ELSE} SDLSoundLibName{$ENDIF __GPC__};
-{$EXTERNALSYM Sound_Rewind}
-
-implementation
-
-{$IFDEF __GPC__}
-  {$L sdl_sound}  { link sdl.dll.a or libsdl.so or libsdl.a }
-{$ELSE}
-{$ENDIF}
-
-procedure SOUND_GETVERSION(var x: TSound_Version);
-begin
-  x.major := SOUND_VER_MAJOR;
-  x.minor := SOUND_VER_MINOR;
-  x.patch := SOUND_VER_PATCH;
-end;
-
-end.
-

+ 0 - 640
packages/extra/sdl/sdlfilter.pas

@@ -1,640 +0,0 @@
-unit sdlfilter;
-{******************************************************************************}
-{
-  $Id: sdlfilter.pas,v 1.2 2004/03/31 09:04:30 savage Exp $
-}
-{                                                                              }
-{       Borland Delphi SDL_Image - An image processing and effects library for }
-{                                  use with SDL Surfaces                       }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Jason Farmer <[email protected]>                                  }
-{                                                                              }
-
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{   A simple library to manipulate SDL surfaces.                               }
-{   Applies Image Kernel Filters and procedural effects to images              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   SDL.pas in your search path.                                               }
-{   SDL_Image in your search path                                              }
-{   SDL_Utils in your search path                                              }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{   The Kernels must be built prior to application. Use the BuildXxX Kernel    }
-{   functions provided to use predefined effects or supply your own.           }
-{                                                                              }
-{   Effect Functions always output to another surface. Do not use the source   }
-{   Surface for the results, strange things will happen if you do.             }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{   Sept      30 2001 - JF : First Written                                     }
-{   Oct       01 2001 - DL : Made Kylix Friendly                               }
-{   Oct       03 2001 - RK : Fixed a bug in OutLine effect + minor speed up    }
-{
-  $Log: sdlfilter.pas,v $
-  Revision 1.2  2004/03/31 09:04:30  savage
-  Added jedi-sdl.inc files for better FreePascal/multi compiler support.
-
-  Revision 1.1  2004/03/28 13:52:14  savage
-  Filtering unit and demo
-
-}
-{******************************************************************************}
-
-{$I jedi-sdl.inc}
-
-interface
-
-uses
-  SysUtils,
-  sdl,
-  sdlutils;
-
-Type
-
-TKernelTypes = (  HighPassVeryWeak,
-                  HighPassVeryStrong,
-                  HighPassStrong,
-                  HighPassWeak,
-                  LowPassUniform,
-                  LowPassPeaked,
-                  LowPassStronglyPeaked,
-                  PrewittEdge_NW_SE,
-                  PrewittEdge_N_S,
-                  PrewittEdge_NE_SW,
-                  PrewittEdge_E_W,
-                  PrewittEdge_SE_NW,
-                  PrewittEdge_S_N,
-                  PrewittEdge_SW_NE,
-                  PrewittEdge_W_E,
-                  LapiacianEdgeWeak,
-                  LapiacianEdgeStrong,
-                  LapiacianEdgeVeryStrong);
-
-T3x3Kernel = array[1..3,1..3] of double; // Just work with 3x3 Kernels
-//T5x5Kernel = array[1..5,1..5] of double; // Not implemented yet
-//T7x7Kernel = array[1..7,1..7] of double;
-P3x3Kernel = ^T3x3Kernel;
-
-
-procedure ApplyFilter( SourceSurface : PSDL_Surface; SourceRect : PSDL_Rect; DestinationSurface : PSDL_Surface; DestinationRect : PSDL_Rect; KernelToApply: P3x3Kernel);Overload;
-//procedure ApplyFilter( SourceSurface : PSDL_Surface; SourceRect : PSDL_Rect; DestinationSurface : PSDL_Surface; DestinationRect : PSDL_Rect; KernelToApply: T5x5Kernel);overload;
-//procedure ApplyFilter( SourceSurface : PSDL_Surface; SourceRect : PSDL_Rect; DestinationSurface : PSDL_Surface; DestinationRect : PSDL_Rect; KernelToApply: T7x7Kernel);overload;
-
-// 3X3 kernel construction functions
-
-procedure Build3x3Kernel( KernelType : TKernelTypes; FilterKernel: P3x3Kernel); Overload;
-
-procedure ApplyImageOutline( SourceSurface : PSDL_Surface; SourceRect : PSDL_Rect; DestinationSurface : PSDL_Surface; DestinationRect : PSDL_Rect; OutlineColour : Cardinal);Overload;
-
-function PixelMatch( TestSurface : PSDL_Surface;X : Integer;Y:Integer;TransparentColour:cardinal) : Boolean;
-
-implementation
-
-procedure ApplyImageOutline( SourceSurface : PSDL_Surface; SourceRect : PSDL_Rect; DestinationSurface : PSDL_Surface; DestinationRect : PSDL_Rect; OutlineColour : Cardinal);Overload;
-// This procedure traces the outline of a sprite based on its transparent value.
-// It draws the outline in the supplied colour.
-var
-  Red,Green,Blue : UInt8;
-  TempRed,TempGreen,TempBlue : integer;
-  X,Y,MaxX,MaxY,SOX,SOY,DOX,DOY,KX,KY,LeftX,RightX,TopY,BottomY:Integer;
-  Srect,DRect : SDL_Rect;
-  SourcePixel, DestinationPixel: cardinal;
-  WorkRed,WorkGreen,WorkBlue : double;
-  SourceTransparentPixel,DestinationTransparentPixel : cardinal;
-  FoundAPixel : Boolean;
-begin
-
-// Make sure we have rects and make sure they are within the bounds of the surface
-  if SourceRect = nil then
-  begin
-    Srect.x := 0;
-    Srect.y := 0;
-    Srect.w := Sourcesurface.w ;
-    Srect.h := sourcesurface.h ;
-  end
-  else
-  begin
-    Srect.x := SourceRect.x;
-    Srect.y := SourceRect.y;
-    if (SourceRect.x + sourcerect.w)> SourceSurface.w then
-    begin
-      Srect.w := SourceSurface.w - SourceRect.x;
-    end
-    else
-    begin
-      Srect.w := SourceRect.w;
-    end;
-
-    if (SourceRect.y + sourcerect.h)> SourceSurface.h then
-    begin
-      Srect.h := SourceSurface.h - SourceRect.y;
-    end
-    else
-    begin
-      Srect.h := SourceRect.h;
-    end;
-  end;
-
-  if DestinationRect = nil then
-  begin
-    DRect.x := 0;
-    DRect.y := 0;
-    DRect.w := DestinationSurface.w;
-    DRect.h := DestinationSurface.h;
-  end
-  else
-  begin
-    DRect.x :=DestinationRect.x;
-    DRect.y :=DestinationRect.y;
-    if (DestinationRect.x + DestinationRect.w)> SourceSurface.w then
-    begin
-      DRect.w := DestinationSurface.w - DestinationRect.x;
-    end
-    else
-    begin
-      DRect.w := DestinationRect.w;
-    end;
-
-    if (DestinationRect.y + DestinationRect.h)> DestinationSurface.h then
-    begin
-      DRect.h := DestinationSurface.h - DestinationRect.y;
-    end
-    else
-    begin
-      DRect.h := DestinationRect.h;
-    end;
-  end;
-
-  // Now we're happy that the rects are within valid areas,
-  // We need to find the lowest extents for the rects
-
-  // Get pixel RGB
-
-  if srect.w>DRect.w then
-  begin
-    MaxX := DRect.w - 1;
-  end
-  else
-  begin
-    MaxX := SRect.w - 1;
-  end;
-
-  if srect.h>DRect.h then
-  begin
-    MaxY := DRect.h - 1;
-  end
-  else
-  begin
-    MaxY := SRect.h - 1;
-  end;
-
-  // Now we know the lowest width and height, we can get on with the work
-  // Set the Source Offsets and Dest Offsets
-
-  SOX := SRect.x;
-  SOY := Srect.y;
-  DOX := DRect.X;
-  DOY := DRect.y;
-
-  // Do the test
-
-  // Lock both surfaces
-
-  SourceTransparentPixel := sourcesurface.format.colorkey;
-  DestinationTransparentPixel := DestinationSurface.format.colorkey;
-
-  SDL_FillRect(DestinationSurface, @DRect, DestinationTransparentPixel);
-
-  SDL_LockSurface(SourceSurface);
-  SDL_LockSurface(DestinationSurface);
-  for Y := 0 to maxy do
-  begin
-    for X := 0 to maxx do
-    begin
-
-      sourcepixel := SDL_GetPixel(SourceSurface, X, Y);
-
-      if sourcepixel = SourceTransparentPixel then
-      begin
-        KX := x + sox;
-        KY := y + soy;
-
-        LeftX := kx - 1;
-        if LeftX < sox then LeftX := sox;
-
-        RightX := kx + 1;
-        if RightX > maxx + sox then RightX := Maxx+sox;
-
-        TopY := ky - 1;
-        if TopY < soy then TopY := soy;
-
-        BottomY := ky + 1;
-        if BottomY > maxy + soy then BottomY := Maxy + soy;
-
-//        sourcepixel := SDL_GetPixel(SourceSurface, KX, KY);
-
-        // Check pixels around current pixel for non transparent values
-
-        FoundAPixel := not PixelMatch(SourceSurface,LeftX,TopY,SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, LeftX, KY, SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, LeftX, BottomY, SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, KX, TopY, SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, KX, BottomY, SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, RightX, TopY, SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, RightX, KY, SourceTransparentPixel);
-        if (FoundAPixel=False) then FoundAPixel := not PixelMatch(SourceSurface, RightX, BottomY, SourceTransparentPixel);;
-
-        if FoundAPixel = true then
-        begin
-          // A non transparent pixel is next to our transpa
-          SDL_PutPixel(DestinationSurface,dox+x,doy+y,OutlineColour);
-        end;
-      end;
-    end;
-  end;
-  SDL_UnlockSurface(SourceSurface);
-  SDL_UnlockSurface(DestinationSurface);
-
-end;
-
-function PixelMatch( TestSurface : PSDL_Surface;X : Integer;Y:Integer;TransparentColour:cardinal) : Boolean;
-begin
-result := (SDL_GetPixel(TestSurface,x,y)=TransparentColour);
-
-end;
-
-procedure ApplyFilter( SourceSurface : PSDL_Surface; SourceRect : PSDL_Rect; DestinationSurface : PSDL_Surface; DestinationRect : PSDL_Rect; KernelToApply: P3x3Kernel);Overload;
-var
-  Red,Green,Blue : UInt8;
-  TempRed,TempGreen,TempBlue : integer;
-  X,Y,MaxX,MaxY,SOX,SOY,DOX,DOY,KX,KY:Integer;
-  Srect,DRect : SDL_Rect;
-  SourcePixel, DestinationPixel: cardinal;
-  WorkRed,WorkGreen,WorkBlue : double;
-begin
-
-  // Make sure we have rects and make sure they are within the bounds of the surface
-  if SourceRect = nil then
-  begin
-    Srect.x := 0;
-    Srect.y := 0;
-    Srect.w := Sourcesurface.w ;
-    Srect.h := sourcesurface.h ;
-  end
-  else
-  begin
-    Srect.x := SourceRect.x;
-    Srect.y := SourceRect.y;
-    if (SourceRect.x + sourcerect.w)> SourceSurface.w then
-    begin
-      Srect.w := SourceSurface.w - SourceRect.x;
-    end
-    else
-    begin
-      Srect.w := SourceRect.w;
-    end;
-
-    if (SourceRect.y + sourcerect.h)> SourceSurface.h then
-    begin
-      Srect.h := SourceSurface.h - SourceRect.y;
-    end
-    else
-    begin
-      Srect.h := SourceRect.h;
-    end;
-  end;
-
-  if DestinationRect = nil then
-  begin
-    DRect.x := 0;
-    DRect.y := 0;
-    DRect.w := DestinationSurface.w;
-    DRect.h := DestinationSurface.h;
-  end
-  else
-  begin
-    DRect.x :=DestinationRect.x;
-    DRect.y :=DestinationRect.y;
-    if (DestinationRect.x + DestinationRect.w)> SourceSurface.w then
-    begin
-      DRect.w := DestinationSurface.w - DestinationRect.x;
-    end
-    else
-    begin
-      DRect.w := DestinationRect.w;
-    end;
-
-    if (DestinationRect.y + DestinationRect.h)> DestinationSurface.h then
-    begin
-      DRect.h := DestinationSurface.h - DestinationRect.y;
-    end
-    else
-    begin
-      DRect.h := DestinationRect.h;
-    end;
-  end;
-
-  // Now we're happy that the rects are within valid areas,
-  // We need to find the lowest extents for the rects
-
-  // Get pixel RGB
-
-  if srect.w>DRect.w then
-  begin
-    MaxX := DRect.w;
-  end
-  else
-  begin
-    MaxX := SRect.w;
-  end;
-
-  if srect.h>DRect.h then
-  begin
-    MaxY := DRect.h;
-  end
-  else
-  begin
-    MaxY := SRect.h;
-  end;
-
-  // Now we know the lowest width and height, we can get on with the work
-  // Set the Source Offsets and Dest Offsets
-
-  SOX := SRect.x;
-  SOY := Srect.y;
-  DOX := DRect.X;
-  DOY := DRect.y;
-
-  // Alter the values to allow for a 1 pixel border
-  if SOX = 0 then SOX := 1;
-  if SOY = 0 then SOY := 1;
-  if DOX = 0 then DOX := 1;
-  if DOY = 0 then DOY := 1;
-
-  If Maxx+Sox >= SourceSurface.w then
-  begin
-    dec(maxx);
-  end;
-
-  If Maxy+Soy >= SourceSurface.h then
-  begin
-    dec(maxy);
-  end;
-
-  If Maxx+dox >= DestinationSurface.w then
-  begin
-    dec(maxx);
-  end;
-
-  If Maxy+doy >= DestinationSurface.h then
-  begin
-    dec(maxy);
-  end;
-
-  // Do the filter
-
-  // Lock both surfaces
-
-  SDL_LockSurface(SourceSurface);
-  SDL_LockSurface(DestinationSurface);
-  for Y:=0 to maxy-1 do
-  begin
-    for X := 0 to maxx-1 do
-    begin
-      TempRed := 0;
-      TempGreen := 0;
-      TempBlue := 0;
-      for KX := 1 to 3 do
-        begin
-          for KY := 1 to 3 do
-            begin
-
-            sourcepixel := SDL_GetPixel(SourceSurface,x+sox+(KY-2),y+soy+(KX-2));
-
-            SDL_GetRGB(sourcepixel,SourceSurface.format,@Red,@Green,@Blue);
-
-            workred := red;
-            workgreen := green;
-            workblue := blue;
-
-            TempRed := round( TempRed + workred  *  KernelToApply[KY, KX]);
-            TempGreen := round(TempGreen +workgreen *  KernelToApply[KY, KX]);
-            TempBlue := round( TempBlue + workblue *  KernelToApply[KY, KX]);
-          end;
-
-        end;
-
-        // Make sure we can put the values back into bytes
-
-        If TempRed < 0 Then TempRed := 0;
-        If TempRed > 255 Then TempRed := 255 ;
-        If TempGreen < 0 Then TempGreen := 0;
-        If TempGreen > 255 Then TempGreen := 255;
-        If TempBlue < 0 Then TempBlue := 0;
-        If TempBlue > 255 Then TempBlue := 255;
-
-        // Put the pixel back into the destination
-
-        DestinationPixel := SDL_MapRGB(destinationsurface.format,byte(tempred),byte(tempgreen),byte(tempblue));
-        try
-        SDL_PutPixel(DestinationSurface,dox+x,doy+y,destinationpixel);
-        except
-          on E: Exception do e.CreateFmt('Error occurred X=%d,Y=%d,dox=%d,doy=%d',[x,y,dox,doy]);
-
-        end;
-
-    end;
-  end;
-  SDL_UnlockSurface(SourceSurface);
-  SDL_UnlockSurface(DestinationSurface);
-
-end;
-
-procedure Build3x3Kernel( KernelType : TKernelTypes; FilterKernel: P3x3Kernel); Overload;
-var
-  X,Y : integer;
-begin
-  // Depending on the type of known kernel that we want to build,
-  // Populate the kernel array
-  case KernelType of
-    HighPassVeryWeak :
-      begin
-
-        FilterKernel[1,1] := -1 / 12; FilterKernel[1,2] := -1 / 12; FilterKernel[1,3] :=  -1 / 12;
-        FilterKernel[2,1] := -1 / 12; FilterKernel[2,2] := 20 / 12; FilterKernel[2,3] := -1 / 12;
-        FilterKernel[3,1] := -1 / 12; FilterKernel[3,2] := -1 / 12; FilterKernel[3,3] :=  -1 / 12;
-
-      end;
-    HighPassVeryStrong :
-      begin
-
-        FilterKernel[1,1] := -1 ; FilterKernel[1,2] := -1 ; FilterKernel[1,3] :=  -1 ;
-        FilterKernel[2,1] := -1 ; FilterKernel[2,2] := 9; FilterKernel[2,3] := -1 ;
-        FilterKernel[3,1] := -1 ; FilterKernel[3,2] := -1 ; FilterKernel[3,3] :=  -1 ;
-
-      end;
-    HighPassStrong :
-      begin
-
-        FilterKernel[1,1] :=  0; FilterKernel[1,2] := -1; FilterKernel[1,3] :=  0;
-        FilterKernel[2,1] := -1; FilterKernel[2,2] :=  5; FilterKernel[2,3] := -1;
-        FilterKernel[3,1] :=  0; FilterKernel[3,2] := -1; FilterKernel[3,3] :=  0;
-
-      end;
-    HighPassWeak :
-      begin
-
-        FilterKernel[1,1] := -1 / 4; FilterKernel[1,2] := -1 / 4; FilterKernel[1,3] :=  -1 / 4;
-        FilterKernel[2,1] := -1 / 4; FilterKernel[2,2] := 12 / 4; FilterKernel[2,3] := -1 / 4;
-        FilterKernel[3,1] := -1 / 4; FilterKernel[3,2] := -1 / 4; FilterKernel[3,3] :=  -1 / 4;
-
-      end;
-    LowPassUniform :
-      begin
-        For X := 1 To 3 do
-          begin
-            For Y := 1 To 3 do
-              begin
-                FilterKernel[X, Y] := 0.1 ;
-              end;
-          end;
-
-      end;
-    LowPassPeaked :
-      begin
-      
-        FilterKernel[1,1] := 0.0666; FilterKernel[1,2] := 0.1333; FilterKernel[1,3] :=  0.0666;
-        FilterKernel[2,1] := 0.1333; FilterKernel[2,2] := 0.2; FilterKernel[2,3] := 0.1333;
-        FilterKernel[3,1] := 0.0666; FilterKernel[3,2] := 0.1333; FilterKernel[3,3] :=  0.0666;
-
-      end;
-    LowPassStronglyPeaked :
-      begin
-
-        FilterKernel[1,1] := 0.05; FilterKernel[1,2] := 0.05; FilterKernel[1,3] :=  0.05;
-        FilterKernel[2,1] := 0.05; FilterKernel[2,2] := 0.6; FilterKernel[2,3] := 0.05;
-        FilterKernel[3,1] := 0.05; FilterKernel[3,2] := 0.05; FilterKernel[3,3] :=  0.05;
-
-      end;
-    PrewittEdge_NW_SE :
-      begin
-
-        FilterKernel[1,1] := 1; FilterKernel[1,2] :=  1; FilterKernel[1,3] :=  1;
-        FilterKernel[2,1] := 1; FilterKernel[2,2] := -2; FilterKernel[2,3] := -1;
-        FilterKernel[3,1] := 1; FilterKernel[3,2] := -1; FilterKernel[3,3] := -1;
-
-      end;
-    PrewittEdge_N_S :
-      begin
-
-        FilterKernel[1,1] := 1; FilterKernel[1,2] :=  1; FilterKernel[1,3] :=  1;
-        FilterKernel[2,1] := 1; FilterKernel[2,2] := -2; FilterKernel[2,3] :=  1;
-        FilterKernel[3,1] :=-1; FilterKernel[3,2] := -1; FilterKernel[3,3] := -1;
-
-      end;
-    PrewittEdge_NE_SW :
-      begin
-
-        FilterKernel[1,1] := 1; FilterKernel[1,2] :=  1; FilterKernel[1,3] :=  1;
-        FilterKernel[2,1] :=-1; FilterKernel[2,2] := -2; FilterKernel[2,3] :=  1;
-        FilterKernel[3,1] :=-1; FilterKernel[3,2] := -1; FilterKernel[3,3] :=  1;
-
-      end;
-    PrewittEdge_E_W :
-      begin
-
-        FilterKernel[1,1] :=-1; FilterKernel[1,2] :=  1; FilterKernel[1,3] :=  1;
-        FilterKernel[2,1] :=-1; FilterKernel[2,2] := -2; FilterKernel[2,3] :=  1;
-        FilterKernel[3,1] :=-1; FilterKernel[3,2] :=  1; FilterKernel[3,3] :=  1;
-
-      end;
-    PrewittEdge_SE_NW :
-      begin
-
-        FilterKernel[1,1] :=-1; FilterKernel[1,2] := -1; FilterKernel[1,3] :=  1;
-        FilterKernel[2,1] :=-1; FilterKernel[2,2] := -2; FilterKernel[2,3] :=  1;
-        FilterKernel[3,1] := 1; FilterKernel[3,2] :=  1; FilterKernel[3,3] :=  1;
-
-      end;
-    PrewittEdge_S_N :
-      begin
-
-        FilterKernel[1,1] :=-1; FilterKernel[1,2] := -1; FilterKernel[1,3] := -1;
-        FilterKernel[2,1] := 1; FilterKernel[2,2] := -2; FilterKernel[2,3] :=  1;
-        FilterKernel[3,1] := 1; FilterKernel[3,2] :=  1; FilterKernel[3,3] :=  1;
-
-      end;
-    PrewittEdge_SW_NE :
-      begin
-
-        FilterKernel[1,1] := 1; FilterKernel[1,2] := -1; FilterKernel[1,3] := -1;
-        FilterKernel[2,1] := 1; FilterKernel[2,2] := -2; FilterKernel[2,3] := -1;
-        FilterKernel[3,1] := 1; FilterKernel[3,2] :=  1; FilterKernel[3,3] :=  1;
-
-      end;
-    PrewittEdge_W_E :
-      begin
-
-        FilterKernel[1,1] := 1; FilterKernel[1,2] :=  1; FilterKernel[1,3] := -1;
-        FilterKernel[2,1] := 1; FilterKernel[2,2] := -2; FilterKernel[2,3] := -1;
-        FilterKernel[3,1] := 1; FilterKernel[3,2] :=  1; FilterKernel[3,3] := -1;
-
-      end;
-    LapiacianEdgeWeak :
-      begin
-
-        FilterKernel[1,1] := 0; FilterKernel[1,2] := -1; FilterKernel[1,3] :=  0;
-        FilterKernel[2,1] :=-1; FilterKernel[2,2] :=  4; FilterKernel[2,3] := -1;
-        FilterKernel[3,1] := 0; FilterKernel[3,2] := -1; FilterKernel[3,3] := 0;
-
-      end;
-    LapiacianEdgeStrong :
-      begin
-
-        FilterKernel[1,1] :=-1; FilterKernel[1,2] := -1; FilterKernel[1,3] := -1;
-        FilterKernel[2,1] :=-1; FilterKernel[2,2] :=  8; FilterKernel[2,3] := -1;
-        FilterKernel[3,1] :=-1; FilterKernel[3,2] := -1; FilterKernel[3,3] := -1;
-
-      end;
-    LapiacianEdgeVeryStrong :
-      begin
-
-        FilterKernel[1,1] :=-1; FilterKernel[1,2] := -2; FilterKernel[1,3] := -1;
-        FilterKernel[2,1] :=-2; FilterKernel[2,2] := 12; FilterKernel[2,3] := -2;
-        FilterKernel[3,1] :=-1; FilterKernel[3,2] := -2; FilterKernel[3,3] := -1;
-
-      end;
-  end;
-end;
-
-
-end.

+ 0 - 202
packages/extra/sdl/sdlgameinterface.pas

@@ -1,202 +0,0 @@
-unit sdlgameinterface;
-{
-  $Id: sdlgameinterface.pas,v 1.4 2005/08/03 18:57:31 savage Exp $
-  
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{                    Game Interface Base class                                 }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominqiue Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominqiue Louis are                                      }
-{ Copyright (C) 2000 - 2001 Dominqiue Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   The SDL Runtime libraris on Win32  : SDL.dll on Linux : libSDL.so          }
-{   They are available from...                                                 }
-{   http://www.libsdl.org .                                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{   September   23 2004 - DL : Initial Creation                                }
-{
-  $Log: sdlgameinterface.pas,v $
-  Revision 1.4  2005/08/03 18:57:31  savage
-  Various updates and additions. Mainly to handle OpenGL 3D Window support and better cursor support for the mouse class
-
-  Revision 1.3  2004/10/17 18:41:49  savage
-  Slight Change to allow Reseting of Input Event handlers
-
-  Revision 1.2  2004/09/30 22:35:47  savage
-  Changes, enhancements and additions as required to get SoAoS working.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  sdl,
-  sdlwindow;
-
-type
-  TGameInterfaceClass = class of TGameInterface;
-
-  TGameInterface = class( TObject )
-  private
-    FNextGameInterface : TGameInterfaceClass;
-  protected
-    Dragging : Boolean;
-    Loaded : Boolean;
-    procedure FreeSurfaces; virtual;
-    procedure Render; virtual; abstract;
-    procedure Close; virtual;
-    procedure Update( aElapsedTime : single ); virtual; 
-    procedure MouseDown( Button : Integer; Shift: TSDLMod; MousePos : TPoint ); virtual;
-    procedure MouseMove( Shift: TSDLMod; CurrentPos : TPoint; RelativePos : TPoint ); virtual;
-    procedure MouseUp( Button : Integer; Shift: TSDLMod; MousePos : TPoint ); virtual;
-    procedure MouseWheelScroll( WheelDelta : Integer; Shift: TSDLMod; MousePos : TPoint ); virtual;
-    procedure KeyDown( var Key: TSDLKey; Shift: TSDLMod; unicode : UInt16 ); virtual;
-  public
-    MainWindow : TSDLCustomWindow;
-    procedure ResetInputManager;
-    procedure LoadSurfaces; virtual;
-    function PointIsInRect( Point : TPoint; x, y, x1, y1 : integer ) : Boolean;
-    constructor Create( const aMainWindow : TSDLCustomWindow );
-    destructor Destroy; override;
-    property NextGameInterface : TGameInterfaceClass read FNextGameInterface write FNextGameInterface;
-  end;
-
-implementation
-
-{ TGameInterface }
-procedure TGameInterface.Close;
-begin
-  FNextGameInterface := nil;
-end;
-
-constructor TGameInterface.Create( const aMainWindow : TSDLCustomWindow );
-begin
-  inherited Create;
-  MainWindow := aMainWindow;
-  FNextGameInterface := TGameInterface;
-  ResetInputManager;
-end;
-
-destructor TGameInterface.Destroy;
-begin
-  if Loaded then
-    FreeSurfaces;
-  inherited;
-end;
-
-procedure TGameInterface.FreeSurfaces;
-begin
-  Loaded := False;
-end;
-
-procedure TGameInterface.KeyDown(var Key: TSDLKey; Shift: TSDLMod; unicode: UInt16);
-begin
-
-end;
-
-procedure TGameInterface.LoadSurfaces;
-begin
-  Loaded := True;
-end;
-
-procedure TGameInterface.MouseDown(Button: Integer; Shift: TSDLMod; MousePos: TPoint);
-begin
-  Dragging := True;
-end;
-
-procedure TGameInterface.MouseMove(Shift: TSDLMod; CurrentPos, RelativePos: TPoint);
-begin
-
-end;
-
-procedure TGameInterface.MouseUp(Button: Integer; Shift: TSDLMod; MousePos: TPoint);
-begin
-  Dragging := True;
-end;
-
-procedure TGameInterface.MouseWheelScroll(WheelDelta: Integer; Shift: TSDLMod; MousePos: TPoint);
-begin
-
-end;
-
-function TGameInterface.PointIsInRect( Point : TPoint; x, y, x1, y1: integer ): Boolean;
-begin
-  if ( Point.x >= x )
-  and ( Point.y >= y )
-  and ( Point.x <= x1 )
-  and ( Point.y <= y1 ) then
-    result := true
-  else
-    result := false;
-end;
-
-procedure TGameInterface.ResetInputManager;
-var
-  temp : TSDLNotifyEvent;
-begin
-  MainWindow.InputManager.Mouse.OnMouseDown := MouseDown;
-  MainWindow.InputManager.Mouse.OnMouseMove := MouseMove;
-  MainWindow.InputManager.Mouse.OnMouseUp := MouseUp;
-  MainWindow.InputManager.Mouse.OnMouseWheel := MouseWheelScroll;
-  MainWindow.InputManager.KeyBoard.OnKeyDown := KeyDown;
-  temp := Render;
-  MainWindow.OnRender := temp;
-  temp := Close;
-  MainWindow.OnClose := temp;
-  MainWindow.OnUpdate := Update;
-end;
-
-procedure TGameInterface.Update(aElapsedTime: single);
-begin
-
-end;
-
-end.

+ 0 - 5236
packages/extra/sdl/sdli386utils.pas

@@ -1,5236 +0,0 @@
-unit sdli386utils;
-{
-  $Id: sdli386utils.pas,v 1.5 2004/06/02 19:38:53 savage Exp $
-  
-}
-{******************************************************************************}
-{                                                                              }
-{       Borland Delphi SDL - Simple DirectMedia Layer                          }
-{                SDL Utility functions                                         }
-{                                                                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Tom Jones <[email protected]>                                             }
-{                                                                              }
-{ Portions created by Tom Jones are                                            }
-{ Copyright (C) 2000 - 2001 Tom Jones.                                         }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Dominique Louis <[email protected]>                            }
-{ Róbert Kisnémeth <[email protected]>                                       }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{   Helper functions...                                                        }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   SDL.dll on Windows platforms                                               }
-{   libSDL-1.1.so.0 on Linux platform                                          }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{               2000 - TJ : Initial creation                                   }
-{                                                                              }
-{   July   13   2001 - DL : Added PutPixel and GetPixel routines.              }
-{                                                                              }
-{   Sept   14   2001 - RK : Added flipping routines.                           }
-{                                                                              }
-{   Sept   19   2001 - RK : Added PutPixel & line drawing & blitting with ADD  }
-{                           effect. Fixed a bug in SDL_PutPixel & SDL_GetPixel }
-{                           Added PSDLRect()                                   }
-{   Sept   22   2001 - DL : Removed need for Windows.pas by defining types here}
-{                           Also removed by poor attempt or a dialog box       }
-{                                                                              }
-{   Sept   25   2001 - RK : Added PixelTest, NewPutPixel, SubPixel, SubLine,   }
-{                           SubSurface, MonoSurface & TexturedSurface          }
-{                                                                              }
-{   Sept   26   2001 - DL : Made change so that it refers to native Pascal     }
-{                           types rather that Windows types. This makes it more}
-{                           portable to Linix.                                 }
-{                                                                              }
-{   Sept   27   2001 - RK : SDLUtils now can be compiled with FreePascal       }
-{                                                                              }
-{   Oct    27   2001 - JF : Added ScrollY function                             }
-{                                                                              }
-{   Jan    21   2002 - RK : Added SDL_ZoomSurface and SDL_WarpSurface          }
-{                                                                              }
-{   Mar    28   2002 - JF : Added SDL_RotateSurface                            }
-{                                                                              }
-{   May    13   2002 - RK : Improved SDL_FillRectAdd & SDL_FillRectSub         }
-{                                                                              }
-{   May    27   2002 - YS : GradientFillRect function                          }
-{                                                                              }
-{   May    30   2002 - RK : Added SDL_2xBlit, SDL_Scanline2xBlit               }
-{                           & SDL_50Scanline2xBlit                             }
-{                                                                              }
-{  June    12   2002 - RK : Added SDL_PixelTestSurfaceVsRect                   }
-{                                                                              }
-{  June    12   2002 - JF : Updated SDL_PixelTestSurfaceVsRect                 }
-{                                                                              }
-{ November  9   2002 - JF : Added Jason's boolean Surface functions            }
-{                                                                              }
-{ December 10   2002 - DE : Added Dean's SDL_ClipLine function                 }
-{                                                                              }
-{******************************************************************************}
-{
-  $Log: sdli386utils.pas,v $
-  Revision 1.5  2004/06/02 19:38:53  savage
-  Changes to SDL_GradientFillRect as suggested by
-  Ángel Eduardo García Hernández.  Many thanks.
-
-  Revision 1.4  2004/05/29 23:11:53  savage
-  Changes to SDL_ScaleSurfaceRect as suggested by
-  Ángel Eduardo García Hernández to fix a colour issue with the function. Many thanks.
-
-  Revision 1.3  2004/02/20 22:04:11  savage
-  Added Changes as mentioned by Rodrigo "Rui" R. (1/2 RRC2Soft) to facilitate FPC compilation and it also works in Delphi. Also syncronized the funcitons so that they are identical to sdlutils.pas, when no assembly version is available.
-
-  Revision 1.2  2004/02/14 00:23:39  savage
-  As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
-
-  Revision 1.1  2004/02/05 00:08:20  savage
-  Module 1.0 release
-
-  
-}
-
-interface
-
-{$i jedi-sdl.inc}
-
-uses
-{$IFDEF UNIX}
-  Types,
-  Xlib,
-{$ENDIF}
-  SysUtils,
-  sdl;
-
-type
-  TGradientStyle = ( gsHorizontal, gsVertical );
-
-  // Pixel procedures
-function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
-  PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : Boolean;
-  
-function SDL_GetPixel( SrcSurface : PSDL_Surface; x : cardinal; y : cardinal ) : Uint32;
-
-procedure SDL_PutPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
-  cardinal );
-
-procedure SDL_AddPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
-  cardinal );
-
-procedure SDL_SubPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
-  cardinal );
-
-// Line procedures
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );overload;
-
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal ; DashLength, DashSpace : byte );  overload;  
-
-procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-
-procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-
-// Surface procedures
-procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
-
-procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
-  TextureRect : PSDL_Rect );
-
-procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
-
-procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
-
-// Flip procedures
-procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-
-procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-
-function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
-
-function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect; overload;
-
-function SDLRect( aRect : TRect ) : TSDL_Rect; overload;
-
-function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
-  Width, Height : integer ) : PSDL_Surface;
-
-procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
-
-procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
-
-procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
-
-procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
-
-function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
-
-// Fill Rect routine
-procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-
-procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-
-procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
-
-// NOTE for All SDL_2xblit... function : the dest surface must be 2x of the source surface!
-procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
-
-procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
-
-procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
-
-function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 :
-PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
-boolean;
-
-// Jason's boolean Surface functions
-procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-function SDL_ClipLine(var x1,y1,x2,y2: Integer; ClipRect: PSDL_Rect) : boolean;
-
-implementation
-
-uses
-  Math;
-
-function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
-  PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : boolean;
-var
-  Src_Rect1, Src_Rect2 : TSDL_Rect;
-  right1, bottom1 : integer;
-  right2, bottom2 : integer;
-  Scan1Start, Scan2Start, ScanWidth, ScanHeight : cardinal;
-  Mod1, Mod2 : cardinal;
-  Addr1, Addr2 : cardinal;
-  BPP : cardinal;
-  Pitch1, Pitch2 : cardinal;
-  TransparentColor1, TransparentColor2 : cardinal;
-  tx, ty : cardinal;
-  StartTick : cardinal;
-  Color1, Color2 : cardinal;
-begin
-  Result := false;
-  if SrcRect1 = nil then
-  begin
-    with Src_Rect1 do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface1.w;
-      h := SrcSurface1.h;
-    end;
-  end
-  else
-    Src_Rect1 := SrcRect1^;
-  if SrcRect2 = nil then
-  begin
-    with Src_Rect2 do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface2.w;
-      h := SrcSurface2.h;
-    end;
-  end
-  else
-    Src_Rect2 := SrcRect2^;
-  with Src_Rect1 do
-  begin
-    Right1 := Left1 + w;
-    Bottom1 := Top1 + h;
-  end;
-  with Src_Rect2 do
-  begin
-    Right2 := Left2 + w;
-    Bottom2 := Top2 + h;
-  end;
-  if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( Bottom1 <=
-    Top2 ) then
-    exit;
-  if Left1 <= Left2 then
-  begin
-    // 1. left, 2. right
-    Scan1Start := Src_Rect1.x + Left2 - Left1;
-    Scan2Start := Src_Rect2.x;
-    ScanWidth := Right1 - Left2;
-    with Src_Rect2 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end
-  else
-  begin
-    // 1. right, 2. left
-    Scan1Start := Src_Rect1.x;
-    Scan2Start := Src_Rect2.x + Left1 - Left2;
-    ScanWidth := Right2 - Left1;
-    with Src_Rect1 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end;
-  with SrcSurface1^ do
-  begin
-    Pitch1 := Pitch;
-    Addr1 := cardinal( Pixels );
-    inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
-    with format^ do
-    begin
-      BPP := BytesPerPixel;
-      TransparentColor1 := colorkey;
-    end;
-  end;
-  with SrcSurface2^ do
-  begin
-    TransparentColor2 := format.colorkey;
-    Pitch2 := Pitch;
-    Addr2 := cardinal( Pixels );
-    inc( Addr2, Pitch2 * UInt32( Src_Rect2.y ) );
-  end;
-  Mod1 := Pitch1 - ( ScanWidth * BPP );
-  Mod2 := Pitch2 - ( ScanWidth * BPP );
-  inc( Addr1, BPP * Scan1Start );
-  inc( Addr2, BPP * Scan2Start );
-  if Top1 <= Top2 then
-  begin
-    // 1. up, 2. down
-    ScanHeight := Bottom1 - Top2;
-    if ScanHeight > Src_Rect2.h then
-      ScanHeight := Src_Rect2.h;
-    inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
-  end
-  else
-  begin
-    // 1. down, 2. up
-    ScanHeight := Bottom2 - Top1;
-    if ScanHeight > Src_Rect1.h then
-      ScanHeight := Src_Rect1.h;
-    inc( Addr2, Pitch2 * UInt32( Top1 - Top2 ) );
-  end;
-  case BPP of
-    1 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PByte( Addr1 )^ <> TransparentColor1 ) and ( PByte( Addr2 )^ <>
-            TransparentColor2 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1 );
-          inc( Addr2 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-    2 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PWord( Addr1 )^ <> TransparentColor1 ) and ( PWord( Addr2 )^ <>
-            TransparentColor2 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 2 );
-          inc( Addr2, 2 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-    3 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
-          Color2 := PLongWord( Addr2 )^ and $00FFFFFF;
-          if ( Color1 <> TransparentColor1 ) and ( Color2 <> TransparentColor2 )
-            then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 3 );
-          inc( Addr2, 3 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-    4 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PLongWord( Addr1 )^ <> TransparentColor1 ) and ( PLongWord( Addr2 )^ <>
-            TransparentColor2 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 4 );
-          inc( Addr2, 4 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-  end;
-end;
-
-function SDL_GetPixel( SrcSurface : PSDL_Surface; x : cardinal; y : cardinal ) : Uint32;
-var
-  bpp : UInt32;
-  p : PInteger;
-begin
-  bpp := SrcSurface.format.BytesPerPixel;
-  // Here p is the address to the pixel we want to retrieve
-  p := Pointer( Uint32( SrcSurface.pixels ) + UInt32( y ) * SrcSurface.pitch + UInt32( x ) *
-    bpp );
-  case bpp of
-    1 : result := PUint8( p )^;
-    2 : result := PUint16( p )^;
-    3 :
-      if ( SDL_BYTEORDER = SDL_BIG_ENDIAN ) then
-        result := PUInt8Array( p )[ 0 ] shl 16 or PUInt8Array( p )[ 1 ] shl 8 or
-          PUInt8Array( p )[ 2 ]
-      else
-        result := PUInt8Array( p )[ 0 ] or PUInt8Array( p )[ 1 ] shl 8 or
-          PUInt8Array( p )[ 2 ] shl 16;
-    4 : result := PUint32( p )^;
-  else
-    result := 0; // shouldn't happen, but avoids warnings
-  end;
-end;
-
-procedure SDL_PutPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
-  cardinal );
-var
-  Addr, Pitch, BPP : cardinal;
-begin
-  Addr := cardinal( SrcSurface.Pixels );
-  Pitch := SrcSurface.Pitch;
-  BPP := SrcSurface.format.BytesPerPixel;
-  asm
-    mov eax, y
-    mul Pitch      // EAX := y * Pitch
-    add Addr, eax  // Addr:= Addr + (y * Pitch)
-    mov eax, x
-    mov ecx, Color
-    cmp BPP, 1
-    jne @Not1BPP
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x
-    mov [eax], cl
-    jmp @Quit
-   @Not1BPP:
-    cmp BPP, 2
-    jne @Not2BPP
-    mul BPP   // EAX := x * BPP
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x * BPP
-    mov [eax], cx
-    jmp @Quit
-   @Not2BPP:
-    cmp BPP, 3
-    jne @Not3BPP
-    mul BPP   // EAX := x * BPP
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x * BPP
-    mov edx, [eax]
-    and edx, $ff000000
-    or edx, ecx
-    mov [eax], edx
-    jmp @Quit
-   @Not3BPP:
-    mul BPP   // EAX := x * BPP
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x * BPP
-    mov [eax], ecx
-   @Quit:
-  end;
-end;
-
-procedure SDL_AddPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
-  cardinal );
-var
-  SrcColor, FinalColor : cardinal;
-  Addr, Pitch, Bits : cardinal;
-begin
-  if Color = 0 then
-    exit;
-  Addr := cardinal( SrcSurface.Pixels );
-  Pitch := SrcSurface.Pitch;
-  Bits := SrcSurface.format.BitsPerPixel;
-  asm
-    mov eax, y
-    mul Pitch      // EAX := y * Pitch
-    add Addr, eax  // Addr:= Addr + (y * Pitch)
-    mov eax, x
-    cmp Bits, 8
-    jne @Not8bit
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x
-    mov cl, [eax]
-    movzx ecx, cl
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, 3
-    and edx, 3
-    add ecx, edx
-    cmp ecx, 3
-    jbe @Skip1_8bit
-    mov ecx, 3
-   @Skip1_8bit:
-    mov FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $1c
-    and edx, $1c
-    add ecx, edx
-    cmp ecx, $1c
-    jbe @Skip2_8bit
-    mov ecx, $1c
-   @Skip2_8bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $e0
-    and edx, $e0
-    add ecx, edx
-    cmp ecx, $e0
-    jbe @Skip3_8bit
-    mov ecx, $e0
-   @Skip3_8bit:
-    or ecx, FinalColor
-    mov [eax], cl
-    jmp @Quit
-   @Not8bit:
-    cmp Bits, 15
-    jne @Not15bit
-    shl eax, 1
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x * 2
-    mov ecx, [eax]
-    and ecx, $00007fff
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, $1f
-    and edx, $1f
-    add ecx, edx
-    cmp ecx, $1f
-    jbe @Skip1_15bit
-    mov ecx, $1f
-   @Skip1_15bit:
-    mov FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $03e0
-    and edx, $03e0
-    add ecx, edx
-    cmp ecx, $03e0
-    jbe @Skip2_15bit
-    mov ecx, $03e0
-   @Skip2_15bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $7c00
-    and edx, $7c00
-    add ecx, edx
-    cmp ecx, $7c00
-    jbe @Skip3_15bit
-    mov ecx, $7c00
-   @Skip3_15bit:
-    or ecx, FinalColor
-    mov [eax], cx
-    jmp @Quit
-   @Not15Bit:
-    cmp Bits, 16
-    jne @Not16bit
-    shl eax, 1
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x * 2
-    mov ecx, [eax]
-    and ecx, $0000ffff
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, $1f
-    and edx, $1f
-    add ecx, edx
-    cmp ecx, $1f
-    jbe @Skip1_16bit
-    mov ecx, $1f
-   @Skip1_16bit:
-    mov FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $07e0
-    and edx, $07e0
-    add ecx, edx
-    cmp ecx, $07e0
-    jbe @Skip2_16bit
-    mov ecx, $07e0
-   @Skip2_16bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $f800
-    and edx, $f800
-    add ecx, edx
-    cmp ecx, $f800
-    jbe @Skip3_16bit
-    mov ecx, $f800
-   @Skip3_16bit:
-    or ecx, FinalColor
-    mov [eax], cx
-    jmp @Quit
-   @Not16Bit:
-    cmp Bits, 24
-    jne @Not24bit
-    mov ecx, 0
-    add ecx, eax
-    shl ecx, 1
-    add ecx, eax
-    mov eax, ecx
-    jmp @32bit
-   @Not24bit:
-    shl eax, 2
-   @32bit:
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x * 2
-    mov ecx, [eax]
-    mov FinalColor, ecx
-    and FinalColor, $ff000000
-    and ecx, $00ffffff
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, $000000ff
-    and edx, $000000ff
-    add ecx, edx
-    cmp ecx, $000000ff
-    jbe @Skip1_32bit
-    mov ecx, $000000ff
-   @Skip1_32bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $0000ff00
-    and edx, $0000ff00
-    add ecx, edx
-    cmp ecx, $0000ff00
-    jbe @Skip2_32bit
-    mov ecx, $0000ff00
-   @Skip2_32bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $00ff0000
-    and edx, $00ff0000
-    add ecx, edx
-    cmp ecx, $00ff0000
-    jbe @Skip3_32bit
-    mov ecx, $00ff0000
-   @Skip3_32bit:
-    or ecx, FinalColor
-    mov [eax], ecx
-   @Quit:
-  end;
-end;
-
-procedure SDL_SubPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
-  cardinal );
-var
-  SrcColor, FinalColor : cardinal;
-  Addr, Pitch, Bits : cardinal;
-begin
-  if Color = 0 then
-    exit;
-  Addr := cardinal( SrcSurface.Pixels );
-  Pitch := SrcSurface.Pitch;
-  Bits := SrcSurface.format.BitsPerPixel;
-  asm
-    mov eax, y
-    mul Pitch      // EAX := y * Pitch
-    add Addr, eax  // Addr:= Addr + (y * Pitch)
-    mov eax, x
-    cmp Bits, 8
-    jne @Not8bit
-    add eax, Addr  // Now:   EAX:= Addr + (y * Pitch) + x
-    mov cl, [eax]
-    movzx ecx, cl
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, 3
-    and edx, 3
-    sub ecx, edx
-    jns @Skip1_8bit
-    mov ecx, 0
-   @Skip1_8bit:
-    mov FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $1c
-    and edx, $1c
-    sub ecx, edx
-    jns @Skip2_8bit
-    mov ecx, 0
-   @Skip2_8bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $e0
-    and edx, $e0
-    sub ecx, edx
-    jns @Skip3_8bit
-    mov ecx, 0
-   @Skip3_8bit:
-    or ecx, FinalColor
-    mov [eax], cl
-    jmp @Quit
-   @Not8bit:
-    cmp Bits, 15
-    jne @Not15bit
-    shl eax, 1
-    add eax, Addr
-    mov ecx, [eax]
-    and ecx, $00007fff
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, $1f
-    and edx, $1f
-    sub ecx, edx
-    jns @Skip1_15bit
-    mov ecx, 0
-   @Skip1_15bit:
-    mov FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $03e0
-    and edx, $03e0
-    sub ecx, edx
-    jns @Skip2_15bit
-    mov ecx, 0
-   @Skip2_15bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $7c00
-    and edx, $7c00
-    sub ecx, edx
-    jns @Skip3_15bit
-    mov ecx, 0
-   @Skip3_15bit:
-    or ecx, FinalColor
-    mov [eax], cx
-    jmp @Quit
-   @Not15Bit:
-    cmp Bits, 16
-    jne @Not16bit
-    shl eax, 1
-    add eax, Addr
-    mov ecx, [eax]
-    and ecx, $0000ffff
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, $1f
-    and edx, $1f
-    sub ecx, edx
-    jns @Skip1_16bit
-    mov ecx, 0
-   @Skip1_16bit:
-    mov FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $07e0
-    and edx, $07e0
-    sub ecx, edx
-    jns @Skip2_16bit
-    mov ecx, 0
-   @Skip2_16bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $f800
-    and edx, $f800
-    sub ecx, edx
-    jns @Skip3_16bit
-    mov ecx, 0
-   @Skip3_16bit:
-    or ecx, FinalColor
-    mov [eax], cx
-    jmp @Quit
-   @Not16Bit:
-    cmp Bits, 24
-    jne @Not24bit
-    mov ecx, 0
-    add ecx, eax
-    shl ecx, 1
-    add ecx, eax
-    mov eax, ecx
-    jmp @32bit
-   @Not24bit:
-    shl eax, 2
-   @32bit:
-    add eax, Addr
-    mov ecx, [eax]
-    mov FinalColor, ecx
-    and FinalColor, $ff000000
-    and ecx, $00ffffff
-    mov SrcColor, ecx
-    mov edx, Color
-    and ecx, $000000ff
-    and edx, $000000ff
-    sub ecx, edx
-    jns @Skip1_32bit
-    mov ecx, 0
-   @Skip1_32bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $0000ff00
-    and edx, $0000ff00
-    sub ecx, edx
-    jns @Skip2_32bit
-    mov ecx, 0
-   @Skip2_32bit:
-    or FinalColor, ecx
-    mov ecx, SrcColor
-    mov edx, Color
-    and ecx, $00ff0000
-    and edx, $00ff0000
-    sub ecx, edx
-    jns @Skip3_32bit
-    mov ecx, 0
-   @Skip3_32bit:
-    or ecx, FinalColor
-    mov [eax], ecx
-   @Quit:
-  end;
-end;
-
-// Draw a line between x1,y1 and x2,y2 to the given surface
-// NOTE: The surface must be locked before calling this!
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-var
-  dx, dy, sdx, sdy, x, y, px, py : integer;
-begin
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-      SDL_PutPixel( DstSurface, px, py, Color );
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-      SDL_PutPixel( DstSurface, px, py, Color );
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-// Draw a dashed line between x1,y1 and x2,y2 to the given surface
-// NOTE: The surface must be locked before calling this!
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal ; DashLength, DashSpace : byte );  overload;
-var
-  dx, dy, sdx, sdy, x, y, px, py, counter : integer; drawdash : boolean;
-begin
-  counter := 0;
-  drawdash := true; //begin line drawing with dash
-
-  //Avoid invalid user-passed dash parameters
-  if (DashLength < 1)
-  then DashLength := 1;
-  if (DashSpace < 1)
-  then DashSpace := 0;
-
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-      begin
-
-      //Alternate drawing dashes, or leaving spaces
-      if drawdash then
-        begin
-          SDL_PutPixel( DstSurface, px, py, Color );
-          inc(counter);
-          if (counter > DashLength-1) and (DashSpace > 0) then
-            begin
-              drawdash := false;
-              counter := 0;
-            end;
-        end
-      else //space
-        begin
-          inc(counter);
-          if counter > DashSpace-1 then
-            begin
-              drawdash := true;
-              counter := 0;
-            end;
-        end;
-
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-
-      //Alternate drawing dashes, or leaving spaces
-      if drawdash then
-        begin
-          SDL_PutPixel( DstSurface, px, py, Color );
-          inc(counter);
-          if (counter > DashLength-1) and (DashSpace > 0) then
-            begin
-              drawdash := false;
-              counter := 0;
-            end;
-        end
-      else //space
-        begin
-          inc(counter);
-          if counter > DashSpace-1 then
-            begin
-              drawdash := true;
-              counter := 0;
-            end;
-        end;
-
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-var
-  dx, dy, sdx, sdy, x, y, px, py : integer;
-begin
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-      SDL_AddPixel( DstSurface, px, py, Color );
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-      SDL_AddPixel( DstSurface, px, py, Color );
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-var
-  dx, dy, sdx, sdy, x, y, px, py : integer;
-begin
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-      SDL_SubPixel( DstSurface, px, py, Color );
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-      SDL_SubPixel( DstSurface, px, py, Color );
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-// This procedure works on 8, 15, 16, 24 and 32 bits color depth surfaces.
-// In 8 bit color depth mode the procedure works with the default packed
-//  palette (RRRGGGBB). It handles all clipping.
-procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr : cardinal;
-  // TransparentColor: cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DstSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DstSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    //    TransparentColor := format.ColorKey;
-  end;
-  with DstSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DstSurface );
-  case bits of
-    8 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        cmp al, 0
-        je @SkipColor         // if AL=0 or AL=transparent color then skip everything
-        mov esp, eax          // ESP - source color
-        mov bl, [edi]         // BL := destination color
-        mov dl, bl            // DL := destination color
-        and ax, $03           // Adding BLUE
-        and bl, $03
-        add al, bl
-        cmp al, $03
-        jbe @Skip1
-        mov al, $03
-       @Skip1:
-        mov cl, al
-        mov eax, esp          // Adding GREEN
-        mov bl, dl
-        and al, $1c
-        and bl, $1c
-        add al, bl
-        cmp al, $1c
-        jbe @Skip2
-        mov al, $1c
-       @Skip2:
-        or cl, al
-        mov eax, esp          // Adding RED
-        mov bl, dl
-        and ax, $e0
-        and bx, $e0
-        add ax, bx
-        cmp ax, $e0
-        jbe @Skip3
-        mov al, $e0
-       @Skip3:
-        or cl, al
-        mov [edi], cl
-       @SkipColor:
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    15 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax          // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        mov esp, eax          // ESP - source color
-        mov bx, [edi]         // BX := destination color
-        mov dx, bx            // DX := destination color
-        and ax, $001F         // Adding BLUE
-        and bx, $001F
-        add ax, bx
-        cmp ax, $001F
-        jbe @Skip1
-        mov ax, $001F
-       @Skip1:
-        mov cx, ax
-        mov eax, esp          // Adding GREEN
-        mov bx, dx
-        and ax, $3E0
-        and bx, $3E0
-        add ax, bx
-        cmp ax, $3E0
-        jbe @Skip2
-        mov ax, $3E0
-       @Skip2:
-        or cx, ax
-        mov eax, esp          // Adding RED
-        mov bx, dx
-        and ax, $7C00
-        and bx, $7C00
-        add ax, bx
-        cmp ax, $7C00
-        jbe @Skip3
-        mov ax, $7C00
-       @Skip3:
-        or cx, ax
-        mov [edi], cx
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    16 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        mov esp, eax          // ESP - source color
-        mov bx, [edi]         // BX := destination color
-        mov dx, bx            // DX := destination color
-        and ax, $1F           // Adding BLUE
-        and bx, $1F
-        add ax, bx
-        cmp ax, $1F
-        jbe @Skip1
-        mov ax, $1F
-       @Skip1:
-        mov cx, ax
-        mov eax, esp          // Adding GREEN
-        mov bx, dx
-        and ax, $7E0
-        and bx, $7E0
-        add ax, bx
-        cmp ax, $7E0
-        jbe @Skip2
-        mov ax, $7E0
-       @Skip2:
-        or cx, ax
-        mov eax, esp          // Adding RED
-        mov bx, dx
-        and eax, $F800
-        and ebx, $F800
-        add eax, ebx
-        cmp eax, $F800
-        jbe @Skip3
-        mov ax, $F800
-       @Skip3:
-        or cx, ax
-        mov [edi], cx
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    24 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       add WorkX, ax         // WorkX := Src.w * 2
-       add WorkX, ax         // WorkX := Src.w * 3
-       @Loopx:
-        mov bl, [edi]         // BX := destination color
-        mov al, [esi]         // AX := source color
-        cmp al, 0
-        je @Skip              // if AL=0 then skip COMPONENT
-        mov ah, 0             // AX := COLOR COMPONENT
-        mov bh, 0
-        add bx, ax
-        cmp bx, $00ff
-        jb @Skip
-        mov bl, $ff
-       @Skip:
-        mov [edi], bl
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    32 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       shl ax, 2
-       mov WorkX, ax         // WorkX := Src.w * 4
-       @Loopx:
-        mov bl, [edi]         // BX := destination color
-        mov al, [esi]         // AX := source color
-        cmp al, 0
-        je @Skip              // if AL=0 then skip COMPONENT
-        mov ah, 0             // AX := COLOR COMPONENT
-        mov bh, 0
-        add bx, ax
-        cmp bx, $00ff
-        jb @Skip
-        mov bl, $ff
-       @Skip:
-        mov [edi], bl
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DstSurface );
-end;
-
-procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr : cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DstSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DstSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-  end;
-  with DstSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := DstSurface.Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DstSurface );
-  case bits of
-    8 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        cmp al, 0
-        je @SkipColor         // if AL=0 then skip everything
-        mov esp, eax          // ESP - source color
-        mov bl, [edi]         // BL := destination color
-        mov dl, bl            // DL := destination color
-        and al, $03           // Subtract BLUE
-        and bl, $03
-        sub bl, al
-        jns @Skip1
-        mov bl, 0
-       @Skip1:
-        mov cl, bl
-        mov eax, esp          // Subtract GREEN
-        mov bl, dl
-        and al, $1c
-        and bl, $1c
-        sub bl, al
-        jns @Skip2
-        mov bl, 0
-       @Skip2:
-        or cl, bl
-        mov eax, esp          // Subtract RED
-        mov bl, dl
-        and ax, $e0
-        and bx, $e0
-        sub bx, ax
-        jns @Skip3
-        mov bl, 0
-       @Skip3:
-        or cl, bl
-        mov [edi], cl
-       @SkipColor:
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    15 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax          // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        mov esp, eax          // ESP - source color
-        mov bx, [edi]         // BX := destination color
-        mov dx, bx            // DX := destination color
-        and ax, $001F         // Subtract BLUE
-        and bx, $001F
-        sub bx, ax
-        jns @Skip1
-        mov bx, 0
-       @Skip1:
-        mov cx, bx
-        mov eax, esp          // Subtract GREEN
-        mov bx, dx
-        and ax, $3E0
-        and bx, $3E0
-        sub bx, ax
-        jns @Skip2
-        mov bx, 0
-       @Skip2:
-        or cx, bx
-        mov eax, esp          // Subtract RED
-        mov bx, dx
-        and ax, $7C00
-        and bx, $7C00
-        sub bx, ax
-        jns @Skip3
-        mov bx, 0
-       @Skip3:
-        or cx, bx
-        mov [edi], cx
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    16 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        mov esp, eax          // ESP - source color
-        mov bx, [edi]         // BX := destination color
-        mov dx, bx            // DX := destination color
-        and ax, $1F           // Subtracting BLUE
-        and bx, $1F
-        sub bx, ax
-        jns @Skip1
-        mov bx, 0
-       @Skip1:
-        mov cx, bx
-        mov eax, esp          // Adding GREEN
-        mov bx, dx
-        and ax, $7E0
-        and bx, $7E0
-        sub bx, ax
-        jns @Skip2
-        mov bx, 0
-       @Skip2:
-        or cx, bx
-        mov eax, esp          // Adding RED
-        mov bx, dx
-        and eax, $F800
-        and ebx, $F800
-        sub ebx, eax
-        jns @Skip3
-        mov bx, 0
-       @Skip3:
-        or cx, bx
-        mov [edi], cx
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    24 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       add WorkX, ax         // WorkX := Src.w * 2
-       add WorkX, ax         // WorkX := Src.w * 3
-       @Loopx:
-        mov bl, [edi]         // BX := destination color
-        mov al, [esi]         // AX := source color
-        cmp al, 0
-        je @Skip              // if AL=0 then skip COMPONENT
-        mov ah, 0             // AX := COLOR COMPONENT
-        mov bh, 0
-        sub bx, ax
-        jns @Skip
-        mov bl, 0
-       @Skip:
-        mov [edi], bl
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    32 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       shl ax, 2
-       mov WorkX, ax         // WorkX := Src.w * 4
-       @Loopx:
-        mov bl, [edi]         // BX := destination color
-        mov al, [esi]         // AX := source color
-        cmp al, 0
-        je @Skip              // if AL=0 then skip COMPONENT
-        mov ah, 0             // AX := COLOR COMPONENT
-        mov bh, 0
-        sub bx, ax
-        jns @Skip
-        mov bl, 0
-       @Skip:
-        mov [edi], bl
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DstSurface );
-end;
-
-procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
-var
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr : cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  SrcTransparentColor : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DstSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DstSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    SrcTransparentColor := format.colorkey;
-  end;
-  with DstSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := DstSurface.Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DstSurface );
-  case bits of
-    8 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      mov ecx, Color
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        movzx eax, al
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if AL=Transparent color then skip everything
-        mov [edi], cl
-       @SkipColor:
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      end;
-    15, 16 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      mov ecx, Color
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        movzx eax, ax
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if AX=Transparent color then skip everything
-        mov [edi], cx
-       @SkipColor:
-        inc esi
-        inc esi
-        inc edi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      end;
-    24 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov _ebx, ebx
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      mov ecx, Color
-      and ecx, $00ffffff
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov eax, [esi]         // EAX := source color
-        and eax, $00ffffff
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if EAX=Transparent color then skip everything
-        mov ebx, [edi]
-        and ebx, $ff000000
-        or ebx, ecx
-        mov [edi], ecx
-       @SkipColor:
-        add esi, 3
-        add edi, 3
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp, _esp
-      mov edi, _edi
-      mov esi, _esi
-      mov ebx, _ebx
-      end;
-    32 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      mov ecx, Color
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov eax, [esi]         // EAX := source color
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if EAX=Transparent color then skip everything
-        mov [edi], ecx
-       @SkipColor:
-        add esi, 4
-        add edi, 4
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp, _esp
-      mov edi, _edi
-      mov esi, _esi
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DstSurface );
-end;
-// TextureRect.w and TextureRect.h are not used.
-// The TextureSurface's size MUST larger than the drawing rectangle!!!
-
-procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
-  TextureRect : PSDL_Rect );
-var
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr, TextAddr : cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod, TextMod : cardinal;
-  SrcTransparentColor : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DstSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DstSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    SrcTransparentColor := format.colorkey;
-  end;
-  with DstSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := DstSurface.Format.BitsPerPixel;
-  end;
-  with Texture^ do
-  begin
-    TextAddr := cardinal( Pixels ) + UInt32( TextureRect.y ) * Pitch +
-      UInt32( TextureRect.x ) * Format.BytesPerPixel;
-    TextMod := Pitch - Src.w * Format.BytesPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DstSurface );
-  SDL_LockSurface( Texture );
-  case bits of
-    8 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov _ebx, ebx
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ebx, TextAddr
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        movzx eax, al
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if AL=Transparent color then skip everything
-        mov al, [ebx]
-        mov [edi], al
-       @SkipColor:
-        inc esi
-        inc edi
-        inc ebx
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       add ebx, TextMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx, _ebx
-      end;
-    15, 16 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ecx, TextAddr
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AL := source color
-        movzx eax, ax
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if AL=Transparent color then skip everything
-        mov ax, [ecx]
-        mov [edi], ax
-       @SkipColor:
-        inc esi
-        inc esi
-        inc edi
-        inc edi
-        inc ecx
-        inc ecx
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       add ecx, TextMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      end;
-    24 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov _ebx, ebx
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ebx, TextAddr
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov eax, [esi]         // AL := source color
-        and eax, $00ffffff
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if AL=Transparent color then skip everything
-        mov eax, [ebx]
-        and eax, $00ffffff
-        mov ecx, [edi]
-        and ecx, $ff000000
-        or ecx, eax
-        mov [edi], eax
-       @SkipColor:
-        add esi, 3
-        add edi, 3
-        add ebx, 3
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       add ebx, TextMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx, _ebx
-      end;
-    32 :
-      asm
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ecx, TextAddr
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov eax, [esi]         // AL := source color
-        cmp eax, SrcTransparentColor
-        je @SkipColor         // if AL=Transparent color then skip everything
-        mov eax, [ecx]
-        mov [edi], eax
-       @SkipColor:
-        add esi, 4
-        add edi, 4
-        add ecx, 4
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       add ecx, TextMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DstSurface );
-  SDL_UnlockSurface( Texture );
-end;
-
-procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
-var
-  xc, yc : cardinal;
-  rx, wx, ry, wy, ry16 : cardinal;
-  color : cardinal;
-  modx, mody : cardinal;
-begin
-  // Warning! No checks for surface pointers!!!
-  if srcrect = nil then
-    srcrect := @SrcSurface.clip_rect;
-  if dstrect = nil then
-    dstrect := @DstSurface.clip_rect;
-  if SDL_MustLock( SrcSurface ) then
-    SDL_LockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_LockSurface( DstSurface );
-  modx := trunc( ( srcrect.w / dstrect.w ) * 65536 );
-  mody := trunc( ( srcrect.h / dstrect.h ) * 65536 );
-  //rx := srcrect.x * 65536;
-  ry := srcrect.y * 65536;
-  wy := dstrect.y;
-  for yc := 0 to dstrect.h - 1 do
-  begin
-    rx := srcrect.x * 65536;
-    wx := dstrect.x;
-    ry16 := ry shr 16;
-    for xc := 0 to dstrect.w - 1 do
-    begin
-      color := SDL_GetPixel( SrcSurface, rx shr 16, ry16 );
-      SDL_PutPixel( DstSurface, wx, wy, color );
-      rx := rx + modx;
-      inc( wx );
-    end;
-    ry := ry + mody;
-    inc( wy );
-  end;
-  if SDL_MustLock( SrcSurface ) then
-    SDL_UnlockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_UnlockSurface( DstSurface );
-end;
-// Re-map a rectangular area into an area defined by four vertices
-// Converted from C to Pascal by KiCHY
-
-procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
-const
-  SHIFTS = 15; // Extend ints to limit round-off error (try 2 - 20)
-  THRESH = 1 shl SHIFTS; // Threshold for pixel size value
-  procedure CopySourceToDest( UL, UR, LR, LL : TPoint; x1, y1, x2, y2 : cardinal );
-  var
-    tm, lm, rm, bm, m : TPoint;
-    mx, my : cardinal;
-    cr : cardinal;
-  begin
-    // Does the destination area specify a single pixel?
-    if ( ( abs( ul.x - ur.x ) < THRESH ) and
-      ( abs( ul.x - lr.x ) < THRESH ) and
-      ( abs( ul.x - ll.x ) < THRESH ) and
-      ( abs( ul.y - ur.y ) < THRESH ) and
-      ( abs( ul.y - lr.y ) < THRESH ) and
-      ( abs( ul.y - ll.y ) < THRESH ) ) then
-    begin // Yes
-      cr := SDL_GetPixel( SrcSurface, ( x1 shr SHIFTS ), ( y1 shr SHIFTS ) );
-      SDL_PutPixel( DstSurface, ( ul.x shr SHIFTS ), ( ul.y shr SHIFTS ), cr );
-    end
-    else
-    begin // No
-      // Quarter the source and the destination, and then recurse
-      tm.x := ( ul.x + ur.x ) shr 1;
-      tm.y := ( ul.y + ur.y ) shr 1;
-      bm.x := ( ll.x + lr.x ) shr 1;
-      bm.y := ( ll.y + lr.y ) shr 1;
-      lm.x := ( ul.x + ll.x ) shr 1;
-      lm.y := ( ul.y + ll.y ) shr 1;
-      rm.x := ( ur.x + lr.x ) shr 1;
-      rm.y := ( ur.y + lr.y ) shr 1;
-      m.x := ( tm.x + bm.x ) shr 1;
-      m.y := ( tm.y + bm.y ) shr 1;
-      mx := ( x1 + x2 ) shr 1;
-      my := ( y1 + y2 ) shr 1;
-      CopySourceToDest( ul, tm, m, lm, x1, y1, mx, my );
-      CopySourceToDest( tm, ur, rm, m, mx, y1, x2, my );
-      CopySourceToDest( m, rm, lr, bm, mx, my, x2, y2 );
-      CopySourceToDest( lm, m, bm, ll, x1, my, mx, y2 );
-    end;
-  end;
-var
-  _UL, _UR, _LR, _LL : TPoint;
-  Rect_x, Rect_y, Rect_w, Rect_h : integer;
-begin
-  if SDL_MustLock( SrcSurface ) then
-    SDL_LockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_LockSurface( DstSurface );
-  if SrcRect = nil then
-  begin
-    Rect_x := 0;
-    Rect_y := 0;
-    Rect_w := ( SrcSurface.w - 1 ) shl SHIFTS;
-    Rect_h := ( SrcSurface.h - 1 ) shl SHIFTS;
-  end
-  else
-  begin
-    Rect_x := SrcRect.x;
-    Rect_y := SrcRect.y;
-    Rect_w := ( SrcRect.w - 1 ) shl SHIFTS;
-    Rect_h := ( SrcRect.h - 1 ) shl SHIFTS;
-  end;
-  // Shift all values to help reduce round-off error.
-  _ul.x := ul.x shl SHIFTS;
-  _ul.y := ul.y shl SHIFTS;
-  _ur.x := ur.x shl SHIFTS;
-  _ur.y := ur.y shl SHIFTS;
-  _lr.x := lr.x shl SHIFTS;
-  _lr.y := lr.y shl SHIFTS;
-  _ll.x := ll.x shl SHIFTS;
-  _ll.y := ll.y shl SHIFTS;
-  CopySourceToDest( _ul, _ur, _lr, _ll, Rect_x, Rect_y, Rect_w, Rect_h );
-  if SDL_MustLock( SrcSurface ) then
-    SDL_UnlockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_UnlockSurface( DstSurface );
-end;
-
-// flips a rectangle vertically on given surface
-procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-var
-  TmpRect : TSDL_Rect;
-  Locked : boolean;
-  y, FlipLength, RowLength : integer;
-  Row1, Row2 : Pointer;
-  OneRow : TByteArray; // Optimize it if you wish
-begin
-  if DstSurface <> nil then
-  begin
-    if Rect = nil then
-    begin // if Rect=nil then we flip the whole surface
-      TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
-      Rect := @TmpRect;
-    end;
-    FlipLength := Rect^.h shr 1 - 1;
-    RowLength := Rect^.w * DstSurface^.format.BytesPerPixel;
-    if SDL_MustLock( DstSurface ) then
-    begin
-      Locked := true;
-      SDL_LockSurface( DstSurface );
-    end
-    else
-      Locked := false;
-    Row1 := pointer( cardinal( DstSurface^.Pixels ) + UInt32( Rect^.y ) *
-      DstSurface^.Pitch );
-    Row2 := pointer( cardinal( DstSurface^.Pixels ) + ( UInt32( Rect^.y ) + Rect^.h - 1 )
-      * DstSurface^.Pitch );
-    for y := 0 to FlipLength do
-    begin
-      Move( Row1^, OneRow, RowLength );
-      Move( Row2^, Row1^, RowLength );
-      Move( OneRow, Row2^, RowLength );
-      inc( cardinal( Row1 ), DstSurface^.Pitch );
-      dec( cardinal( Row2 ), DstSurface^.Pitch );
-    end;
-    if Locked then
-      SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-// flips a rectangle horizontally on given surface
-procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-type
-  T24bit = packed array[ 0..2 ] of byte;
-  T24bitArray = packed array[ 0..8191 ] of T24bit;
-  P24bitArray = ^T24bitArray;
-  TLongWordArray = array[ 0..8191 ] of LongWord;
-  PLongWordArray = ^TLongWordArray;
-var
-  TmpRect : TSDL_Rect;
-  Row8bit : PByteArray;
-  Row16bit : PWordArray;
-  Row24bit : P24bitArray;
-  Row32bit : PLongWordArray;
-  y, x, RightSide, FlipLength : integer;
-  Pixel : cardinal;
-  Pixel24 : T24bit;
-  Locked : boolean;
-begin
-  if DstSurface <> nil then
-  begin
-    if Rect = nil then
-    begin
-      TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
-      Rect := @TmpRect;
-    end;
-    FlipLength := Rect^.w shr 1 - 1;
-    if SDL_MustLock( DstSurface ) then
-    begin
-      Locked := true;
-      SDL_LockSurface( DstSurface );
-    end
-    else
-      Locked := false;
-    case DstSurface^.format.BytesPerPixel of
-      1 :
-        begin
-          Row8Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel := Row8Bit^[ x ];
-              Row8Bit^[ x ] := Row8Bit^[ RightSide ];
-              Row8Bit^[ RightSide ] := Pixel;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row8Bit ), DstSurface^.pitch );
-          end;
-        end;
-      2 :
-        begin
-          Row16Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel := Row16Bit^[ x ];
-              Row16Bit^[ x ] := Row16Bit^[ RightSide ];
-              Row16Bit^[ RightSide ] := Pixel;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row16Bit ), DstSurface^.pitch );
-          end;
-        end;
-      3 :
-        begin
-          Row24Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel24 := Row24Bit^[ x ];
-              Row24Bit^[ x ] := Row24Bit^[ RightSide ];
-              Row24Bit^[ RightSide ] := Pixel24;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row24Bit ), DstSurface^.pitch );
-          end;
-        end;
-      4 :
-        begin
-          Row32Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel := Row32Bit^[ x ];
-              Row32Bit^[ x ] := Row32Bit^[ RightSide ];
-              Row32Bit^[ RightSide ] := Pixel;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row32Bit ), DstSurface^.pitch );
-          end;
-        end;
-    end;
-    if Locked then
-      SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-// Use with caution! The procedure allocates memory for TSDL_Rect and return with its pointer.
-// But you MUST free it after you don't need it anymore!!!
-function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
-var
-  Rect : PSDL_Rect;
-begin
-  New( Rect );
-  with Rect^ do
-  begin
-    x := aLeft;
-    y := aTop;
-    w := aWidth;
-    h := aHeight;
-  end;
-  Result := Rect;
-end;
-
-function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect;
-begin
-  with result do
-  begin
-    x := aLeft;
-    y := aTop;
-    w := aWidth;
-    h := aHeight;
-  end;
-end;
-
-function SDLRect( aRect : TRect ) : TSDL_Rect;
-begin
-  with aRect do
-    result := SDLRect( Left, Top, Right - Left, Bottom - Top );
-end;
-
-procedure SDL_Stretch8( Surface, Dst_Surface : PSDL_Surface; x1, x2, y1, y2, yr, yw,
-  depth : integer );
-var
-  dx, dy, e, d, dx2 : integer;
-  src_pitch, dst_pitch : uint16;
-  src_pixels, dst_pixels : PUint8;
-begin
-  if ( yw >= dst_surface^.h ) then
-    exit;
-  dx := ( x2 - x1 );
-  dy := ( y2 - y1 );
-  dy := dy shl 1;
-  e := dy - dx;
-  dx2 := dx shl 1;
-  src_pitch := Surface^.pitch;
-  dst_pitch := dst_surface^.pitch;
-  src_pixels := PUint8( integer( Surface^.pixels ) + yr * src_pitch + y1 * depth );
-  dst_pixels := PUint8( integer( dst_surface^.pixels ) + yw * dst_pitch + x1 *
-    depth );
-  for d := 0 to dx - 1 do
-  begin
-    move( src_pixels^, dst_pixels^, depth );
-    while ( e >= 0 ) do
-    begin
-      inc( src_pixels, depth );
-      e := e - dx2;
-    end;
-    inc( dst_pixels, depth );
-    e := e + dy;
-  end;
-end;
-
-function sign( x : integer ) : integer;
-begin
-  if x > 0 then
-    result := 1
-  else
-    result := -1;
-end;
-
-// Stretches a part of a surface
-function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
-  Width, Height : integer ) : PSDL_Surface;
-var
-  dst_surface : PSDL_Surface;
-  dx, dy, e, d, dx2, srcx2, srcy2 : integer;
-  destx1, desty1 : integer;
-begin
-  srcx2 := srcx1 + SrcW;
-  srcy2 := srcy1 + SrcH;
-  result := nil;
-  destx1 := 0;
-  desty1 := 0;
-  dx := abs( integer( Height - desty1 ) );
-  dy := abs( integer( SrcY2 - SrcY1 ) );
-  e := ( dy shl 1 ) - dx;
-  dx2 := dx shl 1;
-  dy := dy shl 1;
-  dst_surface := SDL_CreateRGBSurface( SDL_HWPALETTE, width - destx1, Height -
-      desty1,
-      SrcSurface^.Format^.BitsPerPixel,
-      SrcSurface^.Format^.RMask,
-      SrcSurface^.Format^.GMask,
-      SrcSurface^.Format^.BMask,
-      SrcSurface^.Format^.AMask );
-  if ( dst_surface^.format^.BytesPerPixel = 1 ) then
-    SDL_SetColors( dst_surface, @SrcSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
-  SDL_SetColorKey( dst_surface, sdl_srccolorkey, SrcSurface^.format^.colorkey );
-  if ( SDL_MustLock( dst_surface ) ) then
-    if ( SDL_LockSurface( dst_surface ) < 0 ) then
-      exit;
-  for d := 0 to dx - 1 do
-  begin
-    SDL_Stretch8( SrcSurface, dst_surface, destx1, Width, SrcX1, SrcX2, SrcY1, desty1,
-      SrcSurface^.format^.BytesPerPixel );
-    while e >= 0 do
-    begin
-      inc( SrcY1 );
-      e := e - dx2;
-    end;
-    inc( desty1 );
-    e := e + dy;
-  end;
-  if SDL_MUSTLOCK( dst_surface ) then
-    SDL_UnlockSurface( dst_surface );
-  result := dst_surface;
-end;
-
-procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
-var
-  r1, r2 : TSDL_Rect;
-  //buffer: PSDL_Surface;
-  YPos : Integer;
-begin
-  if ( DstSurface <> nil ) and ( DifY <> 0 ) then
-  begin
-    //if DifY > 0 then // going up
-    //begin
-    ypos := 0;
-    r1.x := 0;
-    r2.x := 0;
-    r1.w := DstSurface.w;
-    r2.w := DstSurface.w;
-    r1.h := DifY;
-    r2.h := DifY;
-    while ypos < DstSurface.h do
-    begin
-      r1.y := ypos;
-      r2.y := ypos + DifY;
-      SDL_BlitSurface( DstSurface, @r2, DstSurface, @r1 );
-      ypos := ypos + DifY;
-    end;
-    //end
-    //else
-    //begin // Going Down
-    //end;
-  end;
-end;
-
-procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
-var
-  r1, r2 : TSDL_Rect;
-  buffer : PSDL_Surface;
-begin
-  if ( DstSurface <> nil ) and ( DifX <> 0 ) then
-  begin
-    buffer := SDL_CreateRGBSurface( SDL_HWSURFACE, ( DstSurface^.w - DifX ) * 2,
-      DstSurface^.h * 2,
-      DstSurface^.Format^.BitsPerPixel,
-      DstSurface^.Format^.RMask,
-      DstSurface^.Format^.GMask,
-      DstSurface^.Format^.BMask,
-      DstSurface^.Format^.AMask );
-    if buffer <> nil then
-    begin
-      if ( buffer^.format^.BytesPerPixel = 1 ) then
-        SDL_SetColors( buffer, @DstSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
-      r1 := SDLRect( DifX, 0, buffer^.w, buffer^.h );
-      r2 := SDLRect( 0, 0, buffer^.w, buffer^.h );
-      SDL_BlitSurface( DstSurface, @r1, buffer, @r2 );
-      SDL_BlitSurface( buffer, @r2, DstSurface, @r2 );
-      SDL_FreeSurface( buffer );
-    end;
-  end;
-end;
-
-procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
-var
-  aSin, aCos : Single;
-  MX, MY, DX, DY, NX, NY, SX, SY, OX, OY, Width, Height, TX, TY, RX, RY, ROX, ROY : Integer;
-  Colour, TempTransparentColour : UInt32;
-  MAXX, MAXY : Integer;
-begin
-  // Rotate the surface to the target surface.
-  TempTransparentColour := SrcSurface.format.colorkey;
-  if srcRect.w > srcRect.h then
-  begin
-    Width := srcRect.w;
-    Height := srcRect.w;
-  end
-  else
-  begin
-    Width := srcRect.h;
-    Height := srcRect.h;
-  end;
-
-  maxx := DstSurface.w;
-  maxy := DstSurface.h;
-  aCos := cos( Angle );
-  aSin := sin( Angle );
-
-  Width := round( abs( srcrect.h * acos ) + abs( srcrect.w * asin ) );
-  Height := round( abs( srcrect.h * asin ) + abs( srcrect.w * acos ) );
-
-  OX := Width div 2;
-  OY := Height div 2; ;
-  MX := ( srcRect.x + ( srcRect.x + srcRect.w ) ) div 2;
-  MY := ( srcRect.y + ( srcRect.y + srcRect.h ) ) div 2;
-  ROX := ( -( srcRect.w div 2 ) ) + Offsetx;
-  ROY := ( -( srcRect.h div 2 ) ) + OffsetY;
-  Tx := ox + round( ROX * aSin - ROY * aCos );
-  Ty := oy + round( ROY * aSin + ROX * aCos );
-  SX := 0;
-  for DX := DestX - TX to DestX - TX + ( width ) do
-  begin
-    Inc( SX );
-    SY := 0;
-    for DY := DestY - TY to DestY - TY + ( Height ) do
-    begin
-      RX := SX - OX;
-      RY := SY - OY;
-      NX := round( mx + RX * aSin + RY * aCos ); //
-      NY := round( my + RY * aSin - RX * aCos ); //
-      // Used for testing only
-     //SDL_PutPixel(DstSurface.SDLSurfacePointer,DX,DY,0);
-      if ( ( DX > 0 ) and ( DX < MAXX ) ) and ( ( DY > 0 ) and ( DY < MAXY ) ) then
-      begin
-        if ( NX >= srcRect.x ) and ( NX <= srcRect.x + srcRect.w ) then
-        begin
-          if ( NY >= srcRect.y ) and ( NY <= srcRect.y + srcRect.h ) then
-          begin
-            Colour := SDL_GetPixel( SrcSurface, NX, NY );
-            if Colour <> TempTransparentColour then
-            begin
-              SDL_PutPixel( DstSurface, DX, DY, Colour );
-            end;
-          end;
-        end;
-      end;
-      inc( SY );
-    end;
-  end;
-end;
-
-procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
-begin
-  SDL_RotateRad( DstSurface, SrcSurface, SrcRect, DestX, DestY, OffsetX, OffsetY, DegToRad( Angle ) );
-end;
-
-function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
-var
-  RealRect : TSDL_Rect;
-  OutOfRange : Boolean;
-begin
-  OutOfRange := false;
-  if dstrect = nil then
-  begin
-    RealRect.x := 0;
-    RealRect.y := 0;
-    RealRect.w := DstSurface.w;
-    RealRect.h := DstSurface.h;
-  end
-  else
-  begin
-    if dstrect.x < DstSurface.w then
-    begin
-      RealRect.x := dstrect.x;
-    end
-    else if dstrect.x < 0 then
-    begin
-      realrect.x := 0;
-    end
-    else
-    begin
-      OutOfRange := True;
-    end;
-    if dstrect.y < DstSurface.h then
-    begin
-      RealRect.y := dstrect.y;
-    end
-    else if dstrect.y < 0 then
-    begin
-      realrect.y := 0;
-    end
-    else
-    begin
-      OutOfRange := True;
-    end;
-    if OutOfRange = False then
-    begin
-      if realrect.x + dstrect.w <= DstSurface.w then
-      begin
-        RealRect.w := dstrect.w;
-      end
-      else
-      begin
-        RealRect.w := dstrect.w - realrect.x;
-      end;
-      if realrect.y + dstrect.h <= DstSurface.h then
-      begin
-        RealRect.h := dstrect.h;
-      end
-      else
-      begin
-        RealRect.h := dstrect.h - realrect.y;
-      end;
-    end;
-  end;
-  if OutOfRange = False then
-  begin
-    result := realrect;
-  end
-  else
-  begin
-    realrect.w := 0;
-    realrect.h := 0;
-    realrect.x := 0;
-    realrect.y := 0;
-    result := realrect;
-  end;
-end;
-
-procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-var
-  RealRect : TSDL_Rect;
-  Addr : pointer;
-  ModX, BPP : cardinal;
-  x, y, R, G, B, SrcColor : cardinal;
-begin
-  RealRect := ValidateSurfaceRect( DstSurface, DstRect );
-  if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
-  begin
-    SDL_LockSurface( DstSurface );
-    BPP := DstSurface.format.BytesPerPixel;
-    with DstSurface^ do
-    begin
-      Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
-      ModX := Pitch - UInt32( RealRect.w ) * BPP;
-    end;
-    case DstSurface.format.BitsPerPixel of
-      8 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $E0 + Color and $E0;
-              G := SrcColor and $1C + Color and $1C;
-              B := SrcColor and $03 + Color and $03;
-              if R > $E0 then
-                R := $E0;
-              if G > $1C then
-                G := $1C;
-              if B > $03 then
-                B := $03;
-              PUInt8( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      15 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $7C00 + Color and $7C00;
-              G := SrcColor and $03E0 + Color and $03E0;
-              B := SrcColor and $001F + Color and $001F;
-              if R > $7C00 then
-                R := $7C00;
-              if G > $03E0 then
-                G := $03E0;
-              if B > $001F then
-                B := $001F;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      16 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $F800 + Color and $F800;
-              G := SrcColor and $07C0 + Color and $07C0;
-              B := SrcColor and $001F + Color and $001F;
-              if R > $F800 then
-                R := $F800;
-              if G > $07C0 then
-                G := $07C0;
-              if B > $001F then
-                B := $001F;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      24 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 + Color and $00FF0000;
-              G := SrcColor and $0000FF00 + Color and $0000FF00;
-              B := SrcColor and $000000FF + Color and $000000FF;
-              if R > $FF0000 then
-                R := $FF0000;
-              if G > $00FF00 then
-                G := $00FF00;
-              if B > $0000FF then
-                B := $0000FF;
-              PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      32 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 + Color and $00FF0000;
-              G := SrcColor and $0000FF00 + Color and $0000FF00;
-              B := SrcColor and $000000FF + Color and $000000FF;
-              if R > $FF0000 then
-                R := $FF0000;
-              if G > $00FF00 then
-                G := $00FF00;
-              if B > $0000FF then
-                B := $0000FF;
-              PUInt32( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-    end;
-    SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-var
-  RealRect : TSDL_Rect;
-  Addr : pointer;
-  ModX, BPP : cardinal;
-  x, y, R, G, B, SrcColor : cardinal;
-begin
-  RealRect := ValidateSurfaceRect( DstSurface, DstRect );
-  if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
-  begin
-    SDL_LockSurface( DstSurface );
-    BPP := DstSurface.format.BytesPerPixel;
-    with DstSurface^ do
-    begin
-      Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
-      ModX := Pitch - UInt32( RealRect.w ) * BPP;
-    end;
-    case DstSurface.format.BitsPerPixel of
-      8 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $E0 - Color and $E0;
-              G := SrcColor and $1C - Color and $1C;
-              B := SrcColor and $03 - Color and $03;
-              if R > $E0 then
-                R := 0;
-              if G > $1C then
-                G := 0;
-              if B > $03 then
-                B := 0;
-              PUInt8( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      15 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $7C00 - Color and $7C00;
-              G := SrcColor and $03E0 - Color and $03E0;
-              B := SrcColor and $001F - Color and $001F;
-              if R > $7C00 then
-                R := 0;
-              if G > $03E0 then
-                G := 0;
-              if B > $001F then
-                B := 0;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      16 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $F800 - Color and $F800;
-              G := SrcColor and $07C0 - Color and $07C0;
-              B := SrcColor and $001F - Color and $001F;
-              if R > $F800 then
-                R := 0;
-              if G > $07C0 then
-                G := 0;
-              if B > $001F then
-                B := 0;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      24 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 - Color and $00FF0000;
-              G := SrcColor and $0000FF00 - Color and $0000FF00;
-              B := SrcColor and $000000FF - Color and $000000FF;
-              if R > $FF0000 then
-                R := 0;
-              if G > $00FF00 then
-                G := 0;
-              if B > $0000FF then
-                B := 0;
-              PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      32 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 - Color and $00FF0000;
-              G := SrcColor and $0000FF00 - Color and $0000FF00;
-              B := SrcColor and $000000FF - Color and $000000FF;
-              if R > $FF0000 then
-                R := 0;
-              if G > $00FF00 then
-                G := 0;
-              if B > $0000FF then
-                B := 0;
-              PUInt32( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-    end;
-    SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
-var
-  FBC : array[ 0..255 ] of Cardinal;
-  // temp vars
-  i, YR, YG, YB, SR, SG, SB, DR, DG, DB : Integer;
-
-  TempStepV, TempStepH : Single;
-  TempLeft, TempTop, TempHeight, TempWidth : integer;
-  TempRect : TSDL_Rect;
-
-begin
-  // calc FBC
-  YR := StartColor.r;
-  YG := StartColor.g;
-  YB := StartColor.b;
-  SR := YR;
-  SG := YG;
-  SB := YB;
-  DR := EndColor.r - SR;
-  DG := EndColor.g - SG;
-  DB := EndColor.b - SB;
-
-  for i := 0 to 255 do
-  begin
-    FBC[ i ] := SDL_MapRGB( DstSurface.format, YR, YG, YB );
-    YR := SR + round( DR / 255 * i );
-    YG := SG + round( DG / 255 * i );
-    YB := SB + round( DB / 255 * i );
-  end;
-
-  //  if aStyle = 1 then begin
-  TempStepH := Rect.w / 255;
-  TempStepV := Rect.h / 255;
-  TempHeight := Trunc( TempStepV + 1 );
-  TempWidth := Trunc( TempStepH + 1 );
-  TempTop := 0;
-  TempLeft := 0;
-  TempRect.x := Rect.x;
-  TempRect.y := Rect.y;
-  TempRect.h := Rect.h;
-  TempRect.w := Rect.w;
-
-  case Style of
-    gsHorizontal :
-      begin
-        TempRect.h := TempHeight;
-        for i := 0 to 255 do
-        begin
-          TempRect.y := Rect.y + TempTop;
-          SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
-          TempTop := Trunc( TempStepV * i );
-        end;
-      end;
-    gsVertical :
-      begin
-        TempRect.w := TempWidth;
-        for i := 0 to 255 do
-        begin
-          TempRect.x := Rect.x + TempLeft;
-          SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
-          TempLeft := Trunc( TempStepH * i );
-        end;
-      end;
-  end;
-end;
-
-procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
-var
-  ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
-  SrcPitch, DestPitch, x, y, w, h : UInt32;
-begin
-  if ( Src = nil ) or ( Dest = nil ) then
-    exit;
-  if ( Src.w shl 1 ) < Dest.w then
-    exit;
-  if ( Src.h shl 1 ) < Dest.h then
-    exit;
-
-  if SDL_MustLock( Src ) then
-    SDL_LockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_LockSurface( Dest );
-
-  ReadRow := UInt32( Src.Pixels );
-  WriteRow := UInt32( Dest.Pixels );
-
-  SrcPitch := Src.pitch;
-  DestPitch := Dest.pitch;
-
-  w := Src.w;
-  h := Src.h;
-
-  case Src.format.BytesPerPixel of
-    1 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov al, [ecx] // PUInt8(WriteAddr)^ := PUInt8(ReadAddr)^;
-             mov [edx], al
-             mov [edx + 1], al // PUInt8(WriteAddr + 1)^ := PUInt8(ReadAddr)^;
-             mov [edx + ebx], al // PUInt8(WriteAddr + DestPitch)^ := PUInt8(ReadAddr)^;
-             mov [edx + ebx + 1], al // PUInt8(WriteAddr + DestPitch + 1)^ := PUInt8(ReadAddr)^;
-
-             inc ecx // inc(ReadAddr);
-             add edx, 2 // inc(WriteAddr, 2);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    2 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
-             mov [edx], ax
-             mov [edx + 2], ax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
-             mov [edx + ebx], ax // PUInt16(WriteAddr + DestPitch)^ := PUInt16(ReadAddr)^;
-             mov [edx + ebx + 2], ax // PUInt16(WriteAddr + DestPitch + 2)^ := PUInt16(ReadAddr)^;
-
-             add ecx, 2 // inc(ReadAddr, 2);
-             add edx, 4 // inc(WriteAddr, 4);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    3 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov eax, [ecx] // (PUInt32(WriteAddr)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             and eax, $00ffffff
-             and dword ptr [edx], $ff000000
-             or [edx], eax
-             and dword ptr [edx + 3], $00ffffff // (PUInt32(WriteAddr + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + 3], eax
-             and dword ptr [edx + ebx], $00ffffff // (PUInt32(WriteAddr + DestPitch)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + ebx], eax
-             and dword ptr [edx + ebx + 3], $00ffffff // (PUInt32(WriteAddr + DestPitch + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + ebx + 3], eax
-
-             add ecx, 3 // inc(ReadAddr, 3);
-             add edx, 6 // inc(WriteAddr, 6);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    4 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov eax, [ecx] // PUInt32(WriteAddr)^ := PUInt32(ReadAddr)^;
-             mov [edx], eax
-             mov [edx + 4], eax // PUInt32(WriteAddr + 4)^ := PUInt32(ReadAddr)^;
-             mov [edx + ebx], eax // PUInt32(WriteAddr + DestPitch)^ := PUInt32(ReadAddr)^;
-             mov [edx + ebx + 4], eax // PUInt32(WriteAddr + DestPitch + 4)^ := PUInt32(ReadAddr)^;
-
-             add ecx, 4 // inc(ReadAddr, 4);
-             add edx, 8 // inc(WriteAddr, 8);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-  end;
-
-  if SDL_MustLock( Src ) then
-    SDL_UnlockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_UnlockSurface( Dest );
-end;
-
-procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
-var
-  ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
-  SrcPitch, DestPitch, x, y, w, h : UInt32;
-begin
-  if ( Src = nil ) or ( Dest = nil ) then
-    exit;
-  if ( Src.w shl 1 ) < Dest.w then
-    exit;
-  if ( Src.h shl 1 ) < Dest.h then
-    exit;
-
-  if SDL_MustLock( Src ) then
-    SDL_LockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_LockSurface( Dest );
-
-  ReadRow := UInt32( Src.Pixels );
-  WriteRow := UInt32( Dest.Pixels );
-
-  SrcPitch := Src.pitch;
-  DestPitch := Dest.pitch;
-
-  w := Src.w;
-  h := Src.h;
-
-  case Src.format.BytesPerPixel of
-    1 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-
-           @LoopX:
-             mov al, [ecx] // PUInt8(WriteAddr)^ := PUInt8(ReadAddr)^;
-             mov [edx], al
-             mov [edx + 1], al // PUInt8(WriteAddr + 1)^ := PUInt8(ReadAddr)^;
-
-             inc ecx // inc(ReadAddr);
-             add edx, 2 // inc(WriteAddr, 2);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    2 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-
-           @LoopX:
-             mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
-             mov [edx], ax
-             mov [edx + 2], eax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
-
-             add ecx, 2 // inc(ReadAddr, 2);
-             add edx, 4 // inc(WriteAddr, 4);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    3 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-
-           @LoopX:
-             mov eax, [ecx] // (PUInt32(WriteAddr)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             and eax, $00ffffff
-             and dword ptr [edx], $ff000000
-             or [edx], eax
-             and dword ptr [edx + 3], $00ffffff // (PUInt32(WriteAddr + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + 3], eax
-
-             add ecx, 3 // inc(ReadAddr, 3);
-             add edx, 6 // inc(WriteAddr, 6);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    4 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-
-           @LoopX:
-             mov eax, [ecx] // PUInt32(WriteAddr)^ := PUInt32(ReadAddr)^;
-             mov [edx], eax
-             mov [edx + 4], eax // PUInt32(WriteAddr + 4)^ := PUInt32(ReadAddr)^;
-
-             add ecx, 4 // inc(ReadAddr, 4);
-             add edx, 8 // inc(WriteAddr, 8);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-  end;
-
-  if SDL_MustLock( Src ) then
-    SDL_UnlockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_UnlockSurface( Dest );
-end;
-
-procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
-var
-  ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
-  SrcPitch, DestPitch, x, y, w, h : UInt32;
-begin
-  if ( Src = nil ) or ( Dest = nil ) then
-    exit;
-  if ( Src.w shl 1 ) < Dest.w then
-    exit;
-  if ( Src.h shl 1 ) < Dest.h then
-    exit;
-
-  if SDL_MustLock( Src ) then
-    SDL_LockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_LockSurface( Dest );
-
-  ReadRow := UInt32( Src.Pixels );
-  WriteRow := UInt32( Dest.Pixels );
-
-  SrcPitch := Src.pitch;
-  DestPitch := Dest.pitch;
-
-  w := Src.w;
-  h := Src.h;
-
-  case Src.format.BitsPerPixel of
-    8 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov al, [ecx] // PUInt8(WriteAddr)^ := PUInt8(ReadAddr)^;
-             mov [edx], al
-             mov [edx + 1], al // PUInt8(WriteAddr + 1)^ := PUInt8(ReadAddr)^;
-             shr al, 1
-             and al, $6d
-             mov [edx + ebx], al // PUInt8(WriteAddr + DestPitch)^ := PUInt8(ReadAddr)^;
-             mov [edx + ebx + 1], al // PUInt8(WriteAddr + DestPitch + 1)^ := PUInt8(ReadAddr)^;
-
-             inc ecx // inc(ReadAddr);
-             add edx, 2 // inc(WriteAddr, 2);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    15 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
-             mov [edx], ax
-             mov [edx + 2], ax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
-             shr ax, 1
-             and ax, $3def
-             mov [edx + ebx], ax // PUInt16(WriteAddr + DestPitch)^ := PUInt16(ReadAddr)^;
-             mov [edx + ebx + 2], ax // PUInt16(WriteAddr + DestPitch + 2)^ := PUInt16(ReadAddr)^;
-
-             add ecx, 2 // inc(ReadAddr, 2);
-             add edx, 4 // inc(WriteAddr, 4);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    16 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
-             mov [edx], ax
-             mov [edx + 2], ax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
-             shr ax, 1
-             and ax, $7bef
-             mov [edx + ebx], ax // PUInt16(WriteAddr + DestPitch)^ := PUInt16(ReadAddr)^;
-             mov [edx + ebx + 2], ax // PUInt16(WriteAddr + DestPitch + 2)^ := PUInt16(ReadAddr)^;
-
-             add ecx, 2 // inc(ReadAddr, 2);
-             add edx, 4 // inc(WriteAddr, 4);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    24 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov eax, [ecx] // (PUInt32(WriteAddr)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             and eax, $00ffffff
-             and dword ptr [edx], $ff000000
-             or [edx], eax
-             and dword ptr [edx + 3], $00ffffff // (PUInt32(WriteAddr + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + 3], eax
-             shr eax, 1
-             and eax, $007f7f7f
-             and dword ptr [edx + ebx], $00ffffff // (PUInt32(WriteAddr + DestPitch)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + ebx], eax
-             and dword ptr [edx + ebx + 3], $00ffffff // (PUInt32(WriteAddr + DestPitch + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
-             or [edx + ebx + 3], eax
-
-             add ecx, 3 // inc(ReadAddr, 3);
-             add edx, 6 // inc(WriteAddr, 6);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-    32 :
-      asm
-         push ebx
-         mov eax, h // for y := 1 to Src.h do
-         mov y, eax
-         @LoopY:
-           mov eax, ReadRow // ReadAddr := ReadRow;
-           mov ReadAddr, eax
-
-           mov eax, WriteRow // WriteAddr := WriteRow;
-           mov WriteAddr, eax
-
-           mov eax, w // for x := 1 to Src.w do
-           mov x, eax
-
-           mov ecx, ReadAddr
-           mov edx, WriteAddr
-           mov ebx, DestPitch
-
-           @LoopX:
-             mov eax, [ecx] // PUInt32(WriteAddr)^ := PUInt32(ReadAddr)^;
-             mov [edx], eax
-             mov [edx + 4], eax // PUInt32(WriteAddr + 4)^ := PUInt32(ReadAddr)^;
-             shr eax, 1
-             and eax, $7f7f7f7f
-             mov [edx + ebx], eax // PUInt32(WriteAddr + DestPitch)^ := PUInt32(ReadAddr)^;
-             mov [edx + ebx + 4], eax // PUInt32(WriteAddr + DestPitch + 4)^ := PUInt32(ReadAddr)^;
-
-             add ecx, 4 // inc(ReadAddr, 4);
-             add edx, 8 // inc(WriteAddr, 8);
-
-             dec x
-           jnz @LoopX
-
-           mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
-           add ReadRow, eax
-
-           mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
-           add WriteRow, eax
-           add WriteRow, eax
-
-           dec y
-         jnz @LoopY
-         pop ebx
-      end;
-  end;
-
-  if SDL_MustLock( Src ) then
-    SDL_UnlockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_UnlockSurface( Dest );
-end;
-
-function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
-boolean;
-var
-  Src_Rect1, Src_Rect2 : TSDL_Rect;
-  right1, bottom1 : integer;
-  right2, bottom2 : integer;
-  Scan1Start, Scan2Start, ScanWidth, ScanHeight : cardinal;
-  Mod1: cardinal;
-  Addr1 : cardinal;
-  BPP : cardinal;
-  Pitch1 : cardinal;
-  TransparentColor1 : cardinal;
-  tx, ty : cardinal;
-  StartTick : cardinal;
-  Color1 : cardinal;
-begin
-  Result := false;
-  if SrcRect1 = nil then
-  begin
-    with Src_Rect1 do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface1.w;
-      h := SrcSurface1.h;
-    end;
-  end
-  else
-    Src_Rect1 := SrcRect1^;
-
-    Src_Rect2 := SrcRect2^;
-  with Src_Rect1 do
-  begin
-    Right1 := Left1 + w;
-    Bottom1 := Top1 + h;
-  end;
-  with Src_Rect2 do
-  begin
-    Right2 := Left2 + w;
-    Bottom2 := Top2 + h;
-  end;
-  if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( 
-Bottom1 <=
-    Top2 ) then
-    exit;
-  if Left1 <= Left2 then
-  begin
-    // 1. left, 2. right
-    Scan1Start := Src_Rect1.x + Left2 - Left1;
-    Scan2Start := Src_Rect2.x;
-    ScanWidth := Right1 - Left2;
-    with Src_Rect2 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end
-  else
-  begin
-    // 1. right, 2. left
-    Scan1Start := Src_Rect1.x;
-    Scan2Start := Src_Rect2.x + Left1 - Left2;
-    ScanWidth := Right2 - Left1;
-    with Src_Rect1 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end;
-  with SrcSurface1^ do
-  begin
-    Pitch1 := Pitch;
-    Addr1 := cardinal( Pixels );
-    inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
-    with format^ do
-    begin
-      BPP := BytesPerPixel;
-      TransparentColor1 := colorkey;
-    end;
-  end;
-
-  Mod1 := Pitch1 - ( ScanWidth * BPP );
-
-  inc( Addr1, BPP * Scan1Start );
-
-  if Top1 <= Top2 then
-  begin
-    // 1. up, 2. down
-    ScanHeight := Bottom1 - Top2;
-    if ScanHeight > Src_Rect2.h then
-      ScanHeight := Src_Rect2.h;
-    inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
-  end
-  else
-  begin
-    // 1. down, 2. up
-    ScanHeight := Bottom2 - Top1;
-    if ScanHeight > Src_Rect1.h then
-      ScanHeight := Src_Rect1.h;
-
-  end;
-  case BPP of
-    1 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PByte( Addr1 )^ <> TransparentColor1 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-    2 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PWord( Addr1 )^ <> TransparentColor1 )  then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 2 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-    3 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
-
-          if ( Color1 <> TransparentColor1 )
-            then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 3 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-    4 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PLongWord( Addr1 )^ <> TransparentColor1 )  then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 4 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-  end;
-end;
-
-procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr, TransparentColor : cardinal;
-  // TransparentColor: cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        cmp al, 0
-        je @SkipColor         // if AL=0 or AL=transparent color then skip everything
-        cmp al, byte ptr TransparentColor
-        je @SkipColor
-        or al, [edi]
-        mov [edi], al
-       @SkipColor:
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    15 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax          // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        cmp ax, word ptr TransparentColor
-        je @SkipColor
-        or ax, [edi]
-        mov [edi], ax
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    16 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        cmp ax, word ptr TransparentColor
-        je @SkipColor
-        or ax, [edi]
-        mov [edi], ax
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    24 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       add WorkX, ax         // WorkX := Src.w * 2
-       add WorkX, ax         // WorkX := Src.w * 3
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        or al, [edi]
-        mov [edi], al
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    32 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       shl ax, 2
-       mov WorkX, ax         // WorkX := Src.w * 4
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        or al, [edi]
-        mov [edi], al
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr, TransparentColor : cardinal;
-  // TransparentColor: cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        cmp al, 0
-        je @SkipColor         // if AL=0 or AL=transparent color then skip everything
-        cmp al, byte ptr TransparentColor
-        je @SkipColor
-        and al, [edi]
-        mov [edi], al
-       @SkipColor:
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    15 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax          // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        cmp ax, word ptr TransparentColor
-        je @SkipColor
-        and ax, [edi]
-        mov [edi], ax
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    16 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       @Loopx:
-        mov ax, [esi]         // AX := source color
-        cmp ax, 0
-        je @SkipColor         // if AX=0 then skip everything
-        cmp ax, word ptr TransparentColor
-        je @SkipColor
-        and ax, [edi]
-        mov [edi], ax
-       @SkipColor:
-        add esi, 2
-        add edi, 2
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    24 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       mov WorkX, ax         // WorkX := Src.w
-       add WorkX, ax         // WorkX := Src.w * 2
-       add WorkX, ax         // WorkX := Src.w * 3
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        and al, [edi]
-        mov [edi], al
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-    32 :
-      asm
-      mov _ebx, ebx
-      mov _esi, esi
-      mov _edi, edi
-      mov _esp, esp
-      mov esi, SrcAddr      // ESI - Source Offset
-      mov edi, DestAddr     // EDI - Destination Offset
-      mov ax, Src.h         //  WorkY := Src.h
-      mov WorkY, ax
-      @LoopY:
-       mov ax, Src.w
-       shl ax, 2
-       mov WorkX, ax         // WorkX := Src.w * 4
-       @Loopx:
-        mov al, [esi]         // AL := source color
-        and al, [edi]
-        mov [edi], al
-        inc esi
-        inc edi
-        dec WorkX
-       jnz @LoopX
-       add esi, SrcMod
-       add edi, DestMod
-       dec WorkY
-      jnz @LoopY
-      mov esp,_esp
-      mov edi,_edi
-      mov esi,_esi
-      mov ebx,_ebx
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-
-procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                if Pixel2 and $E0 > Pixel1 and $E0 then R := Pixel2 and $E0 else R := Pixel1 and $E0;
-                if Pixel2 and $1C > Pixel1 and $1C then G := Pixel2 and $1C else G := Pixel1 and $1C;
-                if Pixel2 and $03 > Pixel1 and $03 then B := Pixel2 and $03 else B := Pixel1 and $03;
-
-                if R > $E0 then
-                  R := $E0;
-                if G > $1C then
-                  G := $1C;
-                if B > $03 then
-                  B := $03;
-                PUInt8( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt8( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $7C00 > Pixel1 and $7C00 then R := Pixel2 and $7C00 else R := Pixel1 and $7C00;
-              if Pixel2 and $03E0 > Pixel1 and $03E0 then G := Pixel2 and $03E0 else G := Pixel1 and $03E0;
-              if Pixel2 and $001F > Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $F800 > Pixel1 and $F800 then R := Pixel2 and $F800 else R := Pixel1 and $F800;
-              if Pixel2 and $07E0 > Pixel1 and $07E0 then G := Pixel2 and $07E0 else G := Pixel1 and $07E0;
-              if Pixel2 and $001F > Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $FF0000 > Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
-              if Pixel2 and $00FF00 > Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
-              if Pixel2 and $0000FF > Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
-              end
-              else
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $FF0000 > Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
-              if Pixel2 and $00FF00 > Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
-              if Pixel2 and $0000FF > Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt32( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-
-procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest : TSDL_Rect;
-  Diff : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                if Pixel2 and $E0 < Pixel1 and $E0 then R := Pixel2 and $E0 else R := Pixel1 and $E0;
-                if Pixel2 and $1C < Pixel1 and $1C then G := Pixel2 and $1C else G := Pixel1 and $1C;
-                if Pixel2 and $03 < Pixel1 and $03 then B := Pixel2 and $03 else B := Pixel1 and $03;
-
-                if R > $E0 then
-                  R := $E0;
-                if G > $1C then
-                  G := $1C;
-                if B > $03 then
-                  B := $03;
-                PUInt8( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt8( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $7C00 < Pixel1 and $7C00 then R := Pixel2 and $7C00 else R := Pixel1 and $7C00;
-              if Pixel2 and $03E0 < Pixel1 and $03E0 then G := Pixel2 and $03E0 else G := Pixel1 and $03E0;
-              if Pixel2 and $001F < Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $F800 < Pixel1 and $F800 then R := Pixel2 and $F800 else R := Pixel1 and $F800;
-              if Pixel2 and $07E0 < Pixel1 and $07E0 then G := Pixel2 and $07E0 else G := Pixel1 and $07E0;
-              if Pixel2 and $001F < Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $FF0000 < Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
-              if Pixel2 and $00FF00 < Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
-              if Pixel2 and $0000FF < Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
-              end
-              else
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-              if Pixel2 and $FF0000 < Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
-              if Pixel2 and $00FF00 < Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
-              if Pixel2 and $0000FF < Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt32( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-function SDL_ClipLine(var x1,y1,x2,y2: Integer; ClipRect: PSDL_Rect) : boolean;
-var tflag, flag1, flag2: word;
-    txy, xedge, yedge: Integer;
-    slope: single;
-
-  function ClipCode(x,y: Integer): word;
-  begin
-    Result := 0;
-    if x < ClipRect.x then Result := 1;
-    if x >= ClipRect.w + ClipRect.x then Result := Result or 2;
-    if y < ClipRect.y then Result := Result or 4;
-    if y >= ClipRect.h + ClipRect.y then Result := Result or 8;
-  end;
-
-begin
-  flag1 := ClipCode(x1,y1);
-  flag2 := ClipCode(x2,y2);
-  result := true;
-
-  while true do
-  begin
-    if (flag1 or flag2) = 0 then Exit; // all in
-
-    if (flag1 and flag2) <> 0 then
-      begin
-        result := false;
-        Exit; // all out
-      end;
-
-    if flag2 = 0 then
-      begin
-        txy := x1; x1 := x2; x2 := txy;
-        txy := y1; y1 := y2; y2 := txy;
-        tflag := flag1; flag1 := flag2; flag2 := tflag;
-      end;
-
-    if (flag2 and 3) <> 0 then
-      begin
-        if (flag2 and 1) <> 0 then
-          xedge := ClipRect.x
-        else
-          xedge := ClipRect.w + ClipRect.x -1; // back 1 pixel otherwise we end up in a loop
-
-        slope := (y2 - y1) / (x2 - x1);
-        y2 := y1 + Round(slope * (xedge - x1));
-        x2 := xedge;
-      end
-    else
-      begin
-        if (flag2 and 4) <> 0 then
-          yedge := ClipRect.y
-        else
-          yedge := ClipRect.h + ClipRect.y -1; // up 1 pixel otherwise we end up in a loop
-
-        slope := (x2 - x1) / (y2 - y1);
-        x2 := x1 + Round(slope * (yedge - y1));
-        y2 := yedge;
-      end;
-
-    flag2 := ClipCode(x2, y2);
-  end;
-end;
-
-end.
-
-

+ 0 - 911
packages/extra/sdl/sdlinput.pas

@@ -1,911 +0,0 @@
-unit sdlinput;
-{
-  $Id: sdlinput.pas,v 1.8 2005/08/03 18:57:32 savage Exp $
-  
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{                     SDL Input Wrapper                                        }
-{                                                                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominique Louis are                                      }
-{ Copyright (C) 2003 - 2100 Dominique Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{   SDL Mouse, Keyboard and Joystick wrapper                                   }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   SDL.dll on Windows platforms                                               }
-{   libSDL-1.1.so.0 on Linux platform                                          }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{ March      12     2003 - DL : Initial creation                               }
-{                                                                              }
-{ February   02     2004 - DL : Added Custom Cursor Support to the Mouse class }
-{
-  $Log: sdlinput.pas,v $
-  Revision 1.8  2005/08/03 18:57:32  savage
-  Various updates and additions. Mainly to handle OpenGL 3D Window support and better cursor support for the mouse class
-
-  Revision 1.7  2004/09/30 22:32:04  savage
-  Updated with slightly different header comments
-
-  Revision 1.6  2004/09/12 21:52:58  savage
-  Slight changes to fix some issues with the sdl classes.
-
-  Revision 1.5  2004/05/10 21:11:49  savage
-  changes required to help get SoAoS off the ground.
-
-  Revision 1.4  2004/05/03 22:38:40  savage
-  Added the ability to enable or disable certain inputs @ runtime. Basically it just does not call UpdateInput if Enabled = false.
-  Can also disable and enable input devices via the InputManager.
-
-  Revision 1.3  2004/04/28 21:27:01  savage
-  Updated Joystick code and event handlers. Needs testing...
-
-  Revision 1.2  2004/02/14 22:36:29  savage
-  Fixed inconsistencies of using LoadLibrary and LoadModule.
-  Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
-
-  Revision 1.1  2004/02/05 00:08:20  savage
-  Module 1.0 release
-
-
-}
-{******************************************************************************}
-
-interface
-
-{$i jedi-sdl.inc}
-
-uses
-  Classes,
-  sdl;
-
-type
-  TSDLInputType = ( itJoystick , itKeyBoard, itMouse );
-  TSDLInputTypes = set of TSDLInputType;
-
-  TSDLCustomInput = class( TObject )
-  private
-    FEnabled: Boolean;
-  public
-    constructor Create;
-    function UpdateInput( event: TSDL_EVENT ) : Boolean; virtual; abstract;
-    property Enabled : Boolean read FEnabled write FEnabled;
-  end;
-
-  TSDLJoyAxisMoveEvent =  procedure ( Which: UInt8; Axis: UInt8; Value: SInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLJoyBallMoveEvent =  procedure ( Which: UInt8; Ball: UInt8; RelativePos: TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLJoyHatMoveEvent =  procedure ( Which: UInt8; Hat: UInt8; Value: SInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLJoyButtonEvent =  procedure ( Which: UInt8; Button: UInt8; State: SInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
-
-
-  TSDLJoyStick = class( TSDLCustomInput )
-  private
-    FJoystick : PSDL_Joystick;
-    FJoystickIndex : Integer;
-    FJoyAxisMoveEvent : TSDLJoyAxisMoveEvent;
-    FJoyBallMoveEvent : TSDLJoyBallMoveEvent;
-    FJoyHatMoveEvent : TSDLJoyHatMoveEvent;
-    FJoyButtonDownEvent : TSDLJoyButtonEvent;
-    FJoyButtonUpEvent : TSDLJoyButtonEvent;
-    procedure DoAxisMove( Event : TSDL_Event );
-    procedure DoBallMove( Event : TSDL_Event );
-    procedure DoHatMove( Event : TSDL_Event );
-    procedure DoButtonDown( Event : TSDL_Event );
-    procedure DoButtonUp( Event : TSDL_Event );
-    function GetName: PChar;
-    function GetNumAxes: integer;
-    function GetNumBalls: integer;
-    function GetNumButtons: integer;
-    function GetNumHats: integer;
-  public
-    constructor Create( Index : Integer );
-    destructor Destroy; override;
-    procedure Open;
-    procedure Close;
-    function UpdateInput( Event: TSDL_EVENT ) : Boolean; override;
-    property Name : PChar read GetName;
-    property NumAxes : integer read GetNumAxes;
-    property NumBalls : integer read GetNumBalls;
-    property NumButtons : integer read GetNumButtons;
-    property NumHats : integer read GetNumHats;
-    property OnAxisMove : TSDLJoyAxisMoveEvent read FJoyAxisMoveEvent write FJoyAxisMoveEvent;
-    property OnBallMove : TSDLJoyBallMoveEvent read FJoyBallMoveEvent write FJoyBallMoveEvent;
-    property OnHatMove : TSDLJoyHatMoveEvent read FJoyHatMoveEvent write FJoyHatMoveEvent;
-    property OnButtonDown : TSDLJoyButtonEvent read FJoyButtonDownEvent write FJoyButtonDownEvent;
-    property OnButtonUp : TSDLJoyButtonEvent read FJoyButtonUpEvent write FJoyButtonUpEvent;
-  end;
-
-  TSDLJoySticks = class( TObject )
-  private
-    FNumOfJoySticks: Integer;
-    FJoyStickList : TList;
-    function GetJoyStick(Index: integer): TSDLJoyStick;
-    procedure SetJoyStick(Index: integer; const Value: TSDLJoyStick);
-  public
-    constructor Create;
-    destructor Destroy; override;
-    function UpdateInput( event: TSDL_EVENT ) : Boolean;
-    property NumOfJoySticks : Integer read FNumOfJoySticks write FNumOfJoySticks;
-    property JoySticks[ Index : integer ] : TSDLJoyStick read GetJoyStick write SetJoyStick;
-  end;
-
-  TSDLKeyBoardEvent =  procedure ( var Key: TSDLKey; Shift: TSDLMod; unicode : UInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
-
-  TSDLKeyBoard = class( TSDLCustomInput )
-  private
-    FKeys : PKeyStateArr;
-    FOnKeyUp: TSDLKeyBoardEvent;
-    FOnKeyDown: TSDLKeyBoardEvent;
-    procedure DoKeyDown( keysym : PSDL_keysym );
-    procedure DoKeyUp( keysym : PSDL_keysym );
-  public
-    function IsKeyDown( Key : TSDLKey ) : Boolean;
-    function IsKeyUp( Key : TSDLKey ) : Boolean;
-    function UpdateInput( event: TSDL_EVENT ) : Boolean; override;
-    property Keys : PKeyStateArr read FKeys write FKeys;
-    property OnKeyDown : TSDLKeyBoardEvent read FOnKeyDown write FOnKeyDown;
-    property OnKeyUp : TSDLKeyBoardEvent read FOnKeyUp write FOnKeyUp;
-  end;
-
-  TSDLMouseButtonEvent =  procedure ( Button : Integer; Shift: TSDLMod; MousePos : TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLMouseMoveEvent =  procedure ( Shift: TSDLMod; CurrentPos : TPoint; RelativePos : TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLMouseWheelEvent =  procedure ( WheelDelta : Integer; Shift: TSDLMod; MousePos : TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
-
-  TSDLCustomCursor = class( TObject )
-  private
-    FFileName : string;
-    FHotPoint: TPoint;
-    procedure SetFileName(const aValue: string );
-    function ScanForChar( str : string; ch : Char; startPos : Integer; lookFor : Boolean ) : Integer;
-  public
-    constructor Create( const aFileName : string; aHotPoint: TPoint );
-    procedure LoadFromFile( const aFileName : string ); virtual; abstract;
-    procedure LoadFromStream( aStream : TStream ); virtual; abstract;
-    procedure Show; virtual; abstract;
-    property FileName : string read FFileName write SetFileName;
-    property HotPoint : TPoint read FHotPoint write FHotPoint;
-  end;
-
-  TSDLXPMCursor = class( TSDLCustomCursor )
-  private
-    FCursor : PSDL_Cursor;
-    procedure FreeCursor;
-  public
-    destructor Destroy; override;
-    procedure LoadFromFile( const aFileName : string ); override;
-    procedure LoadFromStream( aStream : TStream ); override;
-    procedure Show; override;
-  end;
-
-  TSDLCursorList = class( TStringList )
-  protected
-    function GetObject( aIndex : Integer ): TSDLCustomCursor; reintroduce;
-    procedure PutObject( aIndex : Integer; AObject : TSDLCustomCursor); reintroduce;
-  public
-    constructor Create;
-   function AddCursor(const aName : string; aObject : TSDLCustomCursor): Integer; virtual;
-  end;
-
-  TSDLMouse = class( TSDLCustomInput )
-  private
-    FDragging : Boolean;
-    FMousePos : TPoint;
-    FOnMouseUp: TSDLMouseButtonEvent;
-    FOnMouseDown: TSDLMouseButtonEvent;
-    FOnMouseMove: TSDLMouseMoveEvent;
-    FOnMouseWheel: TSDLMouseWheelEvent;
-    FCursorList : TSDLCursorList; // Cursor Pointer
-    procedure DoMouseMove( Event: TSDL_Event );
-    procedure DoMouseDown( Event: TSDL_Event );
-    procedure DoMouseUp( Event: TSDL_Event );
-    procedure DoMouseWheelScroll( Event: TSDL_Event );
-    function GetMousePosition: TPoint;
-    procedure SetMousePosition(const Value: TPoint);
-  public
-    destructor Destroy; override;
-    function UpdateInput( event: TSDL_EVENT ) : Boolean; override;
-    function MouseIsDown( Button : Integer ) : Boolean;
-    function MouseIsUp( Button : Integer ) : Boolean;
-    procedure ShowCursor;
-    procedure HideCursor;
-    property OnMouseDown : TSDLMouseButtonEvent read FOnMouseDown write FOnMouseDown;
-    property OnMouseUp : TSDLMouseButtonEvent read FOnMouseUp write FOnMouseUp;
-    property OnMouseMove : TSDLMouseMoveEvent read FOnMouseMove write FOnMouseMove;
-    property OnMouseWheel : TSDLMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
-    property MousePosition : TPoint read GetMousePosition write SetMousePosition;
-    property Cursors : TSDLCursorList read FCursorList write FCursorList;
-  end;
-
-  TSDLInputManager = class( TObject )
-  private
-    FKeyBoard : TSDLKeyBoard;
-    FMouse : TSDLMouse;
-    FJoystick : TSDLJoysticks;
-  public
-    constructor Create( InitInputs : TSDLInputTypes );
-    destructor Destroy; override;
-    procedure Disable( InitInputs : TSDLInputTypes; JoyStickNumber : Integer = 0 );
-    procedure Enable( InitInputs : TSDLInputTypes; JoyStickNumber : Integer = 0 );
-    function UpdateInputs( event: TSDL_EVENT ) : Boolean;
-    property KeyBoard : TSDLKeyBoard read FKeyBoard write FKeyBoard;
-    property Mouse : TSDLMouse read FMouse write FMouse;
-    property JoyStick : TSDLJoysticks read FJoyStick write FJoyStick;
-  end;
-
-implementation
-
-uses
-  SysUtils;
-
-{ TSDLCustomInput }
-constructor TSDLCustomInput.Create;
-begin
-  inherited;
-  FEnabled := true;
-end;
-
-{ TSDLJoysticks }
-constructor TSDLJoysticks.Create;
-var
-  i : integer;
-begin
-  inherited;
-  if ( SDL_WasInit( SDL_INIT_JOYSTICK ) = 0 ) then
-    SDL_InitSubSystem( SDL_INIT_JOYSTICK );
-  FNumOfJoySticks := SDL_NumJoysticks;
-  FJoyStickList := TList.Create;
-  for i := 0 to FNumOfJoySticks - 1 do
-  begin
-    FJoyStickList.Add( TSDLJoyStick.Create( i )  );
-  end;
-end;
-
-destructor TSDLJoysticks.Destroy;
-var
-  i : integer;
-begin
-  if FJoyStickList.Count > 0 then
-  begin
-    for i := 0 to FJoyStickList.Count - 1 do
-    begin
-      TSDLJoyStick( FJoyStickList.Items[i] ).Free;
-    end;
-  end;
-  SDL_QuitSubSystem( SDL_INIT_JOYSTICK );
-  inherited;
-end;
-
-function TSDLJoySticks.GetJoyStick(Index: integer): TSDLJoyStick;
-begin
-  Result := TSDLJoyStick( FJoyStickList[ Index ] );
-end;
-
-procedure TSDLJoySticks.SetJoyStick(Index: integer;
-  const Value: TSDLJoyStick);
-begin
-  FJoyStickList[ Index ] :=  @Value;
-end;
-
-function TSDLJoysticks.UpdateInput(event: TSDL_EVENT): Boolean;
-var
-  i : integer;
-begin
-  result := false;
-  if FJoyStickList.Count > 0 then
-  begin
-    for i := 0 to FJoyStickList.Count - 1 do
-    begin
-      TSDLJoyStick( FJoyStickList.Items[i] ).UpdateInput( event );
-    end;
-  end;
-end;
-
-{ TSDLKeyBoard }
-procedure TSDLKeyBoard.DoKeyDown(keysym: PSDL_keysym);
-begin
-  if Assigned( FOnKeyDown ) then
-    FOnKeyDown( keysym.sym , keysym.modifier, keysym.unicode );
-end;
-
-procedure TSDLKeyBoard.DoKeyUp(keysym: PSDL_keysym);
-begin
-  if Assigned( FOnKeyUp ) then
-    FOnKeyUp( keysym.sym , keysym.modifier, keysym.unicode );
-end;
-
-function TSDLKeyBoard.IsKeyDown( Key: TSDLKey ): Boolean;
-begin
-  SDL_PumpEvents;
-
-  // Populate Keys array
-  FKeys := PKeyStateArr( SDL_GetKeyState( nil ) );
-  Result := ( FKeys[Key] = SDL_PRESSED );
-end;
-
-function TSDLKeyBoard.IsKeyUp( Key: TSDLKey ): Boolean;
-begin
-  SDL_PumpEvents;
-
-  // Populate Keys array
-  FKeys := PKeyStateArr( SDL_GetKeyState( nil ) );
-  Result := ( FKeys[Key] = SDL_RELEASED );
-end;
-
-function TSDLKeyBoard.UpdateInput(event: TSDL_EVENT): Boolean;
-begin
-  result := false;
-  if ( FEnabled ) then
-  begin
-    case event.type_ of
-      SDL_KEYDOWN :
-      begin
-        // handle key presses
-        DoKeyDown( @event.key.keysym );
-        result := true;
-      end;
-
-      SDL_KEYUP :
-      begin
-        // handle key releases
-        DoKeyUp( @event.key.keysym );
-        result := true;
-      end;
-    end;
-  end;
-end;
-
-{ TSDLMouse }
-destructor TSDLMouse.Destroy;
-begin
-
-  inherited;
-end;
-
-procedure TSDLMouse.DoMouseDown( Event: TSDL_Event );
-var
-  CurrentPos : TPoint;
-begin
-  FDragging := true;
-  if Assigned( FOnMouseDown ) then
-  begin
-    CurrentPos.x := event.button.x;
-    CurrentPos.y := event.button.y;
-    FOnMouseDown( event.button.button, SDL_GetModState, CurrentPos );
-  end;
-end;
-
-procedure TSDLMouse.DoMouseMove( Event: TSDL_Event );
-var
-  CurrentPos, RelativePos : TPoint;
-begin
-  if Assigned( FOnMouseMove ) then
-  begin
-    CurrentPos.x := event.motion.x;
-    CurrentPos.y := event.motion.y;
-    RelativePos.x := event.motion.xrel;
-    RelativePos.y := event.motion.yrel;
-    FOnMouseMove( SDL_GetModState, CurrentPos, RelativePos );
-  end;
-end;
-
-procedure TSDLMouse.DoMouseUp( event: TSDL_EVENT );
-var
-  Point : TPoint;
-begin
-  FDragging := false;
-  if Assigned( FOnMouseUp ) then
-  begin
-    Point.x := event.button.x;
-    Point.y := event.button.y;
-    FOnMouseUp( event.button.button, SDL_GetModState, Point );
-  end;
-end;
-
-procedure TSDLMouse.DoMouseWheelScroll( event: TSDL_EVENT );
-var
-  Point : TPoint;
-begin
-  if Assigned( FOnMouseWheel ) then
-  begin
-    Point.x := event.button.x;
-    Point.y := event.button.y;
-    if ( event.button.button = SDL_BUTTON_WHEELUP ) then
-      FOnMouseWheel( SDL_BUTTON_WHEELUP, SDL_GetModState, Point )
-    else
-      FOnMouseWheel( SDL_BUTTON_WHEELDOWN, SDL_GetModState, Point );
-  end;
-end;
-
-function TSDLMouse.GetMousePosition: TPoint;
-begin
-  SDL_PumpEvents;
-
-  SDL_GetMouseState( FMousePos.X, FMousePos.Y );
-  Result := FMousePos;
-end;
-
-procedure TSDLMouse.HideCursor;
-begin
-  SDL_ShowCursor( SDL_DISABLE  );
-end;
-
-function TSDLMouse.MouseIsDown(Button: Integer): Boolean;
-begin
-  SDL_PumpEvents;
-
-  Result := ( SDL_GetMouseState( FMousePos.X, FMousePos.Y ) and SDL_BUTTON( Button ) = 0 );
-end;
-
-function TSDLMouse.MouseIsUp(Button: Integer): Boolean;
-begin
-  SDL_PumpEvents;
-
-  Result := not ( SDL_GetMouseState( FMousePos.X, FMousePos.Y ) and SDL_BUTTON( Button ) = 0 );
-end;
-
-procedure TSDLMouse.SetMousePosition(const Value: TPoint);
-begin
-  SDL_WarpMouse( Value.x, Value.y );
-end;
-
-procedure TSDLMouse.ShowCursor;
-begin
-  SDL_ShowCursor( SDL_ENABLE  );
-end;
-
-function TSDLMouse.UpdateInput(event: TSDL_EVENT): Boolean;
-begin
-  result := false;
-  if ( FEnabled ) then
-  begin
-    case event.type_ of
-      SDL_MOUSEMOTION :
-      begin
-        // handle Mouse Move
-        DoMouseMove( event );
-      end;
-
-      SDL_MOUSEBUTTONDOWN :
-      begin
-        // handle Mouse Down
-        if ( event.button.button = SDL_BUTTON_WHEELUP )
-        or ( event.button.button = SDL_BUTTON_WHEELDOWN ) then
-          DoMouseWheelScroll( event )
-        else
-          DoMouseDown( event );
-      end;
-
-      SDL_MOUSEBUTTONUP :
-      begin
-        // handle Mouse Up
-        if ( event.button.button = SDL_BUTTON_WHEELUP )
-        or ( event.button.button = SDL_BUTTON_WHEELDOWN ) then
-          DoMouseWheelScroll( event )
-        else
-          DoMouseUp( event );
-      end;
-    end;
-  end;
-end;
-
-{ TSDLInputManager }
-constructor TSDLInputManager.Create(InitInputs: TSDLInputTypes);
-begin
-  inherited Create;
-  if itJoystick in InitInputs then
-    FJoystick := TSDLJoysticks.Create;
-
-  if itKeyBoard in InitInputs then
-    FKeyBoard := TSDLKeyBoard.Create;
-    
-  if itMouse in InitInputs then
-    FMouse := TSDLMouse.Create;
-end;
-
-destructor TSDLInputManager.Destroy;
-begin
-  if FJoystick <> nil then
-    FreeAndNil( FJoystick );
-  if FKeyBoard <> nil then
-    FreeAndNil( FKeyBoard );
-  if FMouse <> nil then
-    FreeAndNil( FMouse );
-  inherited;
-end;
-
-procedure TSDLInputManager.Disable( InitInputs : TSDLInputTypes;  JoyStickNumber : Integer );
-begin
-  if itJoystick in InitInputs then
-    FJoystick.JoySticks[ JoyStickNumber ].Enabled := false;
-
-  if itKeyBoard in InitInputs then
-    FKeyBoard.Enabled := false;
-
-  if itMouse in InitInputs then
-    FMouse.Enabled := false;
-end;
-
-procedure TSDLInputManager.Enable( InitInputs: TSDLInputTypes; JoyStickNumber: Integer );
-begin
-  if itJoystick in InitInputs then
-    FJoystick.JoySticks[ JoyStickNumber ].Enabled := true;
-
-  if itKeyBoard in InitInputs then
-    FKeyBoard.Enabled := true;
-    
-  if itMouse in InitInputs then
-    FMouse.Enabled := true;
-end;
-
-function TSDLInputManager.UpdateInputs( event: TSDL_EVENT ): Boolean;
-begin
-  Result := false;
-  if ( FJoystick <> nil ) then
-   Result := FJoystick.UpdateInput( event );
-  if ( FKeyBoard <> nil ) then
-   Result := FKeyBoard.UpdateInput( event );
-  if ( FMouse <> nil ) then
-   Result := FMouse.UpdateInput( event );
-end;
-
-{ TSDLJoyStick }
-procedure TSDLJoyStick.Close;
-begin
-  SDL_JoystickClose( @FJoystick );
-end;
-
-constructor TSDLJoyStick.Create( Index : Integer );
-begin
-  inherited Create;
-  FJoystick := nil;
-  FJoystickIndex := Index;
-end;
-
-destructor TSDLJoyStick.Destroy;
-begin
-  if FJoystick <> nil then
-    Close;
-  inherited;
-end;
-
-procedure TSDLJoyStick.DoAxisMove(Event: TSDL_Event);
-begin
-  if Assigned( FJoyAxisMoveEvent ) then
-  begin
-    FJoyAxisMoveEvent( Event.jaxis.which, Event.jaxis.axis, Event.jaxis.value );
-  end
-end;
-
-procedure TSDLJoyStick.DoBallMove(Event: TSDL_Event);
-var
-  BallPoint : TPoint;
-begin
-  if Assigned( FJoyBallMoveEvent ) then
-  begin
-    BallPoint.x := Event.jball.xrel;
-    BallPoint.y := Event.jball.yrel;
-    FJoyBallMoveEvent( Event.jball.which, Event.jball.ball, BallPoint );
-  end;
-end;
-
-procedure TSDLJoyStick.DoButtonDown(Event: TSDL_Event);
-begin
-  if Assigned( FJoyButtonDownEvent ) then
-  begin
-    if ( Event.jbutton.state = SDL_PRESSED ) then
-      FJoyButtonDownEvent( Event.jbutton.which, Event.jbutton.button, Event.jbutton.state );
-  end;
-end;
-
-procedure TSDLJoyStick.DoButtonUp(Event: TSDL_Event);
-begin
-  if Assigned( FJoyButtonUpEvent ) then
-  begin
-    if ( Event.jbutton.state = SDL_RELEASED ) then
-      FJoyButtonUpEvent( Event.jbutton.which, Event.jbutton.button, Event.jbutton.state );
-  end
-end;
-
-procedure TSDLJoyStick.DoHatMove(Event: TSDL_Event);
-begin
-  if Assigned( FJoyHatMoveEvent ) then
-  begin
-    FJoyHatMoveEvent( Event.jhat.which, Event.jhat.hat, Event.jhat.value );
-  end;
-end;
-
-function TSDLJoyStick.GetName: PChar;
-begin
-  result := FJoystick.name;
-end;
-
-function TSDLJoyStick.GetNumAxes: integer;
-begin
-  result := FJoystick.naxes;
-end;
-
-function TSDLJoyStick.GetNumBalls: integer;
-begin
-  result := FJoystick.nballs;
-end;
-
-function TSDLJoyStick.GetNumButtons: integer;
-begin
-  result := FJoystick.nbuttons;
-end;
-
-function TSDLJoyStick.GetNumHats: integer;
-begin
-  result := FJoystick.nhats;
-end;
-
-procedure TSDLJoyStick.Open;
-begin
-  FJoystick := SDL_JoyStickOpen( FJoystickIndex );
-end;
-
-function TSDLJoyStick.UpdateInput(Event: TSDL_EVENT): Boolean;
-begin
-  Result := false;
-  
-  if ( FEnabled ) then
-  begin
-    case event.type_ of
-      SDL_JOYAXISMOTION :
-      begin
-        DoAxisMove( Event );
-      end;
-
-      SDL_JOYBALLMOTION :
-      begin
-        DoBallMove( Event );
-      end;
-
-      SDL_JOYHATMOTION :
-      begin
-        DoHatMove( Event );
-      end;
-
-      SDL_JOYBUTTONDOWN :
-      begin
-        DoButtonDown( Event );
-      end;
-
-      SDL_JOYBUTTONUP :
-      begin
-        DoButtonUp( Event );
-      end;
-    end;
-  end;
-end;
-
-{ TSDLCustomCursor }
-
-constructor TSDLCustomCursor.Create(const aFileName: string;  aHotPoint: TPoint);
-begin
-  inherited Create;
-  FHotPoint := aHotPoint;
-  LoadFromFile( aFileName );
-end;
-
-function TSDLCustomCursor.ScanForChar(str: string; ch: Char;
-  startPos: Integer; lookFor: Boolean): Integer;
-begin
-  Result := -1;
-  while ( ( ( str[ startPos ] = ch ) <> lookFor ) and ( startPos < Length( str ) ) ) do
-    inc( startPos );
-  if startPos <> Length( str ) then
-    Result := startPos;
-end;
-
-procedure TSDLCustomCursor.SetFileName(const aValue: string);
-begin
-  LoadFromFile( aValue );
-end;
-
-{ TSDLXPMCursor }
-
-destructor TSDLXPMCursor.Destroy;
-begin
-  FreeCursor;
-  inherited;
-end;
-
-procedure TSDLXPMCursor.FreeCursor;
-begin
-  if FCursor <> nil then
-  begin
-    SDL_FreeCursor( FCursor );
-    FFileName := ''; 
-  end;
-end;
-
-procedure TSDLXPMCursor.LoadFromFile(const aFileName: string);
-var
-  xpmFile : Textfile;
-  step : Integer;
-  holdPos : Integer;
-  counter : Integer;
-  dimensions : array[ 1..3 ] of Integer;
-  clr, clrNone, clrBlack, clrWhite : Char;
-  data, mask : array of UInt8;
-  i, col : Integer;
-  LineString : string;
-begin
-  FreeCursor;
-  AssignFile( xpmFile, aFileName );
-  Reset( xpmFile );
-  step := 0;
-  i := -1;
-  clrBlack := 'X';
-  clrWhite := ',';
-  clrNone := ' ';
-  counter := 0;
-  while not ( eof( xpmFile ) ) do
-  begin
-    Readln( xpmFile, LineString );
-    // scan for strings
-    if LineString[ 1 ] = '"' then
-    begin
-      case step of
-        0 : // Get dimensions  (should be width height number-of-colors ???)
-          begin
-            HoldPos := 2;
-            counter := ScanForChar( LineString, ' ', HoldPos, False );
-            counter := ScanForChar( LineString, ' ', counter, True );
-            dimensions[ 1 ] := StrToInt( Copy( LineString, HoldPos, counter - HoldPos ) );
-            counter := ScanForChar( LineString, ' ', counter, False );
-            holdPos := counter;
-            counter := ScanForChar( LineString, ' ', counter, True );
-            dimensions[ 2 ] := StrToInt( Copy( LineString, holdPos, counter - HoldPos ) );
-            counter := ScanForChar( LineString, ' ', counter, False );
-            holdPos := counter;
-            counter := ScanForChar( LineString, ' ', counter, True );
-            dimensions[ 3 ] := StrToInt( Copy( LineString, holdPos, counter - HoldPos ) );
-            step := 1;
-            SetLength( data, ( dimensions[ 1 ] * dimensions[ 2 ] ) div 8 );
-            SetLength( mask, ( dimensions[ 1 ] * dimensions[ 2 ] ) div 8 );
-            //Log.LogStatus( 'Length = ' + IntToStr( ( dimensions[ 1 ] * dimensions[ 2 ] ) div 8 ), 'LoadCursorFromFile' );
-          end;
-        1 : // get the symbols for transparent, black and white
-          begin
-            // get the symbol for the color
-            clr := LineString[ 2 ];
-            // look for the 'c' symbol
-            counter := ScanForChar( LineString, 'c', 3, True );
-            inc( counter );
-            counter := ScanForChar( LineString, ' ', counter, False );
-            if LowerCase( Copy( LineString, counter, 4 ) ) = 'none' then
-            begin
-              clrNone := clr;
-            end;
-            if LowerCase( Copy( LineString, counter, 7 ) ) = '#ffffff' then
-            begin
-              clrWhite := clr;
-            end;
-            if LowerCase( Copy( LineString, counter, 7 ) ) = '#000000' then
-            begin
-              clrBlack := clr;
-            end;
-            dec( dimensions[ 3 ] );
-            if dimensions[ 3 ] = 0 then
-            begin
-              step := 2;
-              counter := 0;
-            end;
-          end;
-        2 : // get cursor information -- modified from the SDL
-          // documentation of SDL_CreateCursor.
-          begin
-            for col := 1 to dimensions[1] do
-            begin
-              if ( ( col mod 8 ) <> 1 ) then
-              begin
-                data[ i ] := data[ i ] shl 1;
-                mask[ i ] := mask[ i ] shl 1;
-              end
-              else
-              begin
-                inc( i );
-                data[ i ] := 0;
-                mask[ i ] := 0;
-              end;
-              if LineString[ col ] = clrWhite then
-              begin
-                mask[ i ] := mask[ i ] or $01;
-              end
-              else if LineString[ col ] = clrBlack then
-              begin
-                data[ i ] := data[ i ] or $01;
-                mask[ i ] := mask[ i ] or $01;
-              end
-              else if LineString[ col + 1 ] = clrNone then
-              begin
-                //
-              end;
-            end;
-            inc(counter);
-            if counter = dimensions[2] then
-              step := 4;
-          end;
-      end;
-    end;
-  end;
-  CloseFile( xpmFile );
-  FCursor := SDL_CreateCursor( PUInt8( data ), PUInt8( mask ), dimensions[ 1 ], dimensions[ 2 ], FHotPoint.x, FHotPoint.y );
-end;
-
-procedure TSDLXPMCursor.LoadFromStream(aStream: TStream);
-begin
-  inherited;
-
-end;
-
-procedure TSDLXPMCursor.Show;
-begin
-  inherited;
-  SDL_SetCursor( FCursor );
-end;
-
-{ TSDLCursorList }
-function TSDLCursorList.AddCursor(const aName : string; aObject : TSDLCustomCursor): Integer;
-begin
-  result := inherited AddObject( aName, aObject );
-end;
-
-constructor TSDLCursorList.Create;
-begin
-  inherited;
-  Duplicates := dupIgnore;
-end;
-
-function TSDLCursorList.GetObject(aIndex: Integer): TSDLCustomCursor;
-begin
-  result := TSDLCustomCursor( inherited GetObject( aIndex ) );
-end;
-
-procedure TSDLCursorList.PutObject(aIndex: Integer; aObject: TSDLCustomCursor);
-begin
-  inherited PutObject( aIndex, aObject );
-end;
-
-end.

+ 0 - 297
packages/extra/sdl/sdlmonofonts.pas

@@ -1,297 +0,0 @@
-unit sdlmonofonts;
-{******************************************************************}
-{                                                                  }
-{ SDL_MonoFonts unit by Róbert Kisnémeth (KiCHY)                   }
-{ This unit is part of SDLGui by Róbert Kisnémeth, but works       }
-{ without it. Use and distribute it freely in its unaltered state. }
-{                                                                  }
-{ If you wish supporting languages other than English & Hungarian  }
-{ send me a letter and I try to implement it (but not Cyrillic or  }
-{ Chinese or something exotic charset, please. Only a few letters.)}
-{ I know p.e. the French or Spanish (or Finnish) have special      }
-{ characters like us, Hungarians, but I'm very lazy...             }
-{                                                                  }
-{ E-mail: [email protected]                                      }
-{                                                                  }
-{ Revision History                                                 }
-{ ----------------                                                 }
-{ September 21 2001 - RK : Initial v1.0 version                    }
-{ October   28 2001 - RK : v1.01 Fixed a bug which found by        }
-{                          Wojciech ([email protected])           }
-{                                                                  }
-{******************************************************************}
-
-{$I jedi-sdl.inc}
-
-interface
-
-uses
-  Classes,
-  SysUtils,
-  sdl,
-  sdl_image,
-  sdlutils;
-
-const
- CharSet = ' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~áéíóöõúüûÁÉÍÓÖÕÚÜÛ';
-
-type
-  TAlignment = (taLeftJustify, taRightJustify, taCenter);
-  
-  PFont = ^TFont;
-  TFont = object
-  private
-   Image: PSDL_Surface;
-   Rects: array[0..112] of PSDL_Rect;
-   procedure WriteText2(x, y: integer; Txt: Pchar; TextLength: cardinal);
-  public
-   TransparentColor, TextColor: cardinal;
-   Surface: PSDL_Surface;
-   function Height: integer;
-   constructor Initialize(const Filename: string);
-   destructor Finalize;
-   procedure LoadFont(const Fontfile: string);
-   procedure FreeUpAll;
-   procedure WriteText(x, y: integer; Txt: PChar; Align: TAlignment);
-   procedure WriteTextWrapped(Rect: PSDL_Rect; Txt: PChar; Align: TAlignment);
-   function TextWidth: integer;
-   function WidthOf(Txt: PChar; Len: cardinal): integer; overload;
-   function WidthOf(Txt: PChar): integer; overload;
-  end;
-
-implementation
-
-constructor TFont.Initialize(const Filename: string);
-begin
- LoadFont(Filename);
-end;
-
-procedure TFont.LoadFont(const Fontfile: string);
-var
- i, x , width: integer;
- Separator: Cardinal;
-begin
- FreeUpAll;
- if not fileexists(Fontfile) then exit;
- Image:=IMG_Load(pchar(Fontfile));
- if Image = nil then exit;
- Separator:=SDL_MapRGB(Image.format, 255, 0, 255);
- x:=0; i:=0;
- repeat
-  // Search first/next separator
-  while SDL_GetPixel(Image, x, 0)<>Separator do inc(x);
-  // Determine character's width
-  if x>=Image.w then break;
-  Width:=1;
-  while SDL_GetPixel(Image, x + Width, 0) = Separator do
-    inc(Width);
-  Rects[i]:=PSDLRect(x, 1, Width, Image.h-1);
-  inc(i);
-  inc(x, Width+1);
- until x>=Image.w;
- // Determine the transparent color
- TransparentColor:=SDL_GetPixel(Image, Rects[0].x+Rects[0].w, 0);
- SDL_SetColorKey(Image, SDL_SRCCOLORKEY, TransparentColor);
- TextColor:=SDL_MapRGB(Image.format, 0, 0, 0);
-end;
-
-procedure TFont.FreeUpAll;
-var
- i: integer;
-begin
- for i:=0 to 112 do
-  if Rects[i]<>nil then Dispose(Rects[i]);
- if Image<>nil then SDL_FreeSurface(Image);
-end;
-
-destructor TFont.Finalize;
-begin
- FreeUpAll;
-end;
-
-// Read a word from a string until its end or CRLF
-procedure ReadWord(Txt: PChar; StartPos: cardinal; var FoundWord: PChar; var ItsLength: cardinal);
-var
- WasLetter: boolean;
- ReadPos, TextLength: integer;
-begin
- TextLength:=length(Txt);
- WasLetter:=false;
- ReadPos:=StartPos;
- repeat
-  case Txt[ReadPos] of
-   ' ': if WasLetter=true then break;
-   #13: begin
-         inc(ReadPos,1);
-         break;
-        end; 
-   else WasLetter:=true
-  end;
-  inc(ReadPos);
- until ReadPos>=TextLength;
- FoundWord:=pointer(cardinal(Txt)+StartPos);
- ItsLength:=ReadPos-StartPos;
-end;
-
-function ContainsCR(Txt: PChar; Len: cardinal):boolean;
-var
- i: integer;
-begin
- result:=false;
- for i:=0 to Len-1 do
-  if Txt[i]=#13 then begin
-   Result:=true;
-   exit;
-  end;
-end;
-
-procedure TFont.WriteTextWrapped(Rect: PSDL_Rect; Txt: PChar; Align: TAlignment);
-var
- Original_Clip_Rect: TSDL_Rect; // Store the original clipping rectangle
- ReadFrom: cardinal; // Reading position
- TextLength: cardinal; // The whole text's length
- FoundWord: PChar; //  The word we found
- WordLen: cardinal; // Length of the word we found
- Area: TSDL_Rect; // The rectangle we draw in
- RowLengthInPixels: cardinal; // Stores a row's length in pixels
- RowLengthInChars: cardinal; // Stores a row's length in chars
- FoundRow: PChar; // The row we will write out
- x, y: integer; // Drawing position
- NextWordsLengthInPixels: cardinal;
-begin
- if (Surface=nil) or (Image=nil) or (Txt=nil) or (Txt='') then exit;
- Original_Clip_Rect:=Surface.Clip_Rect;
- if Rect=nil then Area:=Surface.Clip_Rect
-  else Area:=Rect^;
- Surface.Clip_Rect:=Area;
- ReadFrom:=0;
- x:=Area.x;
- y:=Area.y;
- TextLength:=length(Txt);
- repeat
-  // Collect words until it don't fit in Area's width
-  // A row always contains minimum one word
-  ReadWord(Txt, ReadFrom, FoundRow, WordLen); // Read a whole word from text
-  RowLengthInPixels:=WidthOf(FoundRow, WordLen);
-  RowLengthInChars:=WordLen;
-  ReadFrom:=ReadFrom+WordLen+1; // Advance to next word
-  // Read more words if it fits in Area's width
-  repeat
-   if ContainsCR(FoundRow, RowLengthInChars) then break; // We found a CR so break the line
-   ReadWord(Txt, ReadFrom, FoundWord, WordLen); // Read a whole word from text
-   NextWordsLengthInPixels:=WidthOf(FoundWord, WordLen);
-   if RowLengthInPixels+Rects[0].w+1+NextWordsLengthInPixels<Area.w then begin
-    RowLengthInPixels:=RowLengthInPixels+Rects[0].w+1+NextWordsLengthInPixels;
-    RowLengthInChars:=RowLengthInChars+1+WordLen;
-    ReadFrom:=ReadFrom+WordLen+1; // Advance to next word
-   end else break;
-  until (RowLengthInPixels>=Area.w) or (ReadFrom>=TextLength);
-  // calculate alignment
-  case Align of
-   taLeftJustify:  x:=Area.x;
-   taCenter:       x:=(Area.x+Area.w shr 1)-(WidthOf(FoundRow, RowLengthInChars)-1) shr 1;
-   taRightJustify: x:=Area.x+Area.w-WidthOf(FoundRow, RowLengthInChars)+1;
-  end;
-  WriteText2(x, y, FoundRow, RowLengthInChars);
-  y:=y+Rects[0].h;
- until (y>=Area.y+Area.h) or (ReadFrom>=TextLength);
- Surface.Clip_Rect:=Original_Clip_Rect;
-end;
-
-// Draw a text in a single line with clipping x & y
-procedure TFont.WriteText(x, y: integer; Txt: Pchar; Align: TAlignment);
-var
- i, len, ch, px, py: integer;
- TargetX: integer; // writing position after aligning
-begin
- if (Surface=nil) or (Image=nil) or (Txt=nil) or (Txt='') then exit;
- SDL_LockSurface(Surface);
- SDL_LockSurface(Image);
- i:=0;
- len:=length(txt);
- case Align of
-  taLeftJustify:  TargetX:=x;
-  taCenter:       TargetX:=x-(WidthOf(Txt)-1) shr 1;
-  taRightJustify: TargetX:=x-WidthOf(Txt)+1;
- end;
- while i<len do begin
-  if x>=Surface.Clip_Rect.x+Surface.Clip_Rect.w then break; // We reached the right side
-  ch:=pos(Txt[i], Charset)-1;
-  if (ch>=0) and (ch<113) then begin
-   for px:=0 to Rects[ch]^.w-1 do
-    if (TargetX+px >= Surface.Clip_Rect.x) and // Clip from left
-       (TargetX+px<Surface.Clip_Rect.x+Surface.Clip_Rect.w) then // Clip from right
-     for py:=0 to Rects[ch]^.h-1 do
-      if y+py<Surface.Clip_Rect.y+Surface.Clip_Rect.h then // if we don't reach the bottom border
-       if SDL_GetPixel(Image, Rects[ch]^.x+px, Rects[ch]^.y+py)<>TransparentColor then
-        SDL_PutPixel(Surface, TargetX+px, y+py, TextColor);
-   TargetX:=TargetX+Rects[ch].w+1;
-  end;
-  inc(i);
- end;
- SDL_UnlockSurface(Surface);
- SDL_UnlockSurface(Image);
-end;
-
-// Draw a partial text in a single line without clipping x
-procedure TFont.WriteText2(x, y: integer; Txt: Pchar; TextLength: cardinal);
-var
- i, ch, px, py: integer;
-begin
- if (Surface=nil) or (Image=nil) or (Txt=nil) or (Txt='') then exit;
- SDL_LockSurface(Surface);
- SDL_LockSurface(Image);
- i:=0;
- while i<TextLength do begin
-  ch:=pos(Txt[i], CharSet)-1;
-  if (ch>=0) and (ch<113) then begin
-   for px:=0 to Rects[ch]^.w-1 do
-    for py:=0 to Rects[ch]^.h-1 do
-     if y+py<Surface.Clip_Rect.y+Surface.Clip_Rect.h then
-      if SDL_GetPixel(Image, Rects[ch]^.x+px, Rects[ch]^.y+py)<>TransparentColor then
-       SDL_PutPixel(Surface, x+px, y+py, TextColor);
-   x:=x+Rects[ch].w+1;
-  end;
-  inc(i);
- end;
- SDL_UnlockSurface(Surface);
- SDL_UnlockSurface(Image);
-end;
-
-function TFont.TextWidth: integer;
-begin
- Result:=0;
-end;
-
-function TFont.WidthOf(Txt: PChar; Len: cardinal): integer;
-var
- i: cardinal;
- p: integer;
-begin
- Result:=0;
- for i:=0 to Len-1 do begin
-  p:=pos(Txt[i], CharSet)-1;
-  if p>=0 then Result:=Result+Rects[p].w+1;
- end; 
-end;
-
-function TFont.WidthOf(Txt: PChar): integer;
-var
- i, len: cardinal;
- p: integer;
-begin
- Result:=0;
- Len:=Length(Txt);
- for i:=0 to Len-1 do begin
-  p:=pos(Txt[i], CharSet)-1;
-  if p>=0 then Result:=Result+Rects[p].w+1;
- end;
-end;
-
-function TFont.Height: integer;
-begin
- if Image<>nil then Result:=Image.h else Result:=0;
-end;
-
-end.
-

+ 0 - 346
packages/extra/sdl/sdlsprites.pas

@@ -1,346 +0,0 @@
-unit sdlsprites;
-{************************************************************************
-(*
-  $Id: sdlsprites.pas,v 1.3 2004/03/31 09:04:31 savage Exp $
-
- *)
- * SDLSprites.pas for JEDI-SDL                                          *
- * Written by KiCHY                                                     *
- * Version 1.04 (04 june 2001)                                          *
- * This unit is freeware, use at your own risk!                         *
- * E-mail: [email protected]                                          *
- * Please send me your opinions, ideas, bugreports, etc.                *
- * History:                                                             *
- * 08 aug  2001 RK: v1.0  Initial version                               *
- * 10 sept 2001 RK: v1.01 Added "SDL_DisplayFormat" for fast blitting   *
- * 02 oct  2001 RK: v1.02 Added SDL_Image, so now can load PNG, PCX...  *
- * 28 oct  2001 RK: v1.03 Added NumberOfFrames                          *
- * 02 nov  2001 RK: v1.04 Modifed Draw method (hint by Logan)           *
- * 04 june 2002 RK: v1.05 Fixed memory leaks                            *
- * 19 Jan  2004 DL: v1.06 Changed ReallocMem Call to SetLength and      *
- *                  Moved CompareZ function                             *
-(*
-  $Log: sdlsprites.pas,v $
-  Revision 1.3  2004/03/31 09:04:31  savage
-  Added jedi-sdl.inc files for better FreePascal/multi compiler support.
-
-  Revision 1.2  2004/03/30 22:21:34  savage
-  After some prodding by Marco Van de Voort, I have made TSprite more OO by adding private and public scopes.
-
-  Revision 1.1  2004/02/26 00:06:25  savage
-  Sprite Engine first commit.
-
-
- *)
- ************************************************************************}
-
-{$I jedi-sdl.inc}
-
-interface
-
-uses
-{$IFDEF windows}
-  Windows,
-{$ENDIF}
-  Classes,
-  SysUtils,
-  sdl_image,
-  sdl;
-
-type
-  TSpriteList = class;
-
-  TSprite = class
-  private
-    Flags : cardinal; // for SDL_BlitSurface
-    isDead : boolean; // need to destroy ?
-    function Remove : integer; // remove sprite from screen, result=-2 then background surface is lost
-  public
-    ID : byte; // we can easily determine the sprite's type
-    ParentList : TSpriteList;
-    AnimPhase : integer; // which image we draw
-    NumberOfFrames : integer; // count of frames [by brombs]
-    x, y, z : integer; // x, y coords for screen, z for sorting
-    w, h : integer; // Width & Height of sprite
-    Surface, Background, Image : PSDL_Surface; // Screen, Background and sprite images
-    SrcRect : TSDL_Rect; // source rectangle what contains the image-data
-    PrevRect : TSDL_Rect; // rectangle of previous position in the screen 
-    constructor Create( const _Image : string; Width, Height : integer );
-    procedure GetCollisionRect( Rect : PSDL_Rect ); virtual;
-    procedure Draw; virtual; // draw sprite on screen
-    procedure Move; virtual; // move a sprite
-    procedure Kill; // we will need to destroy this sprite
-    procedure Free; virtual; // destroy sprite
-  end;
-
-  TSpriteList = class( TList )
-  protected
-    function Get( Index : Integer ) : TSprite;
-    procedure Put( Index : Integer; Item : TSprite );
-  public
-    property Items[ Index : Integer ] : TSprite read Get write Put; default;
-  end;
-
-  TSpriteEngine = class
-  private
-    NeedSort : boolean; // do we need to resort sprites by Z?
-    FSurface, FBackground : PSDL_Surface; // screen and background surface
-    procedure SetSurface( _Surface : PSDL_Surface );
-    procedure SetBackground( _Surface : PSDL_Surface );
-  public
-    Sprites : TSpriteList; // all sprites
-    NumberOfRects : integer;
-    UpdateRects : array of TSDL_Rect;
-    NeedRedrawBackground : boolean; // background surface is lost?
-    procedure Clear; // destroy all sprites from list
-    procedure SortSprites; // that is
-    procedure AddSprite( Item : TSprite ); // add a sprite to list
-    procedure RemoveSprite( Item : TSprite ); // remove a sprite from list and from memory
-    procedure Free;
-    procedure Move; // move all sprites in the list
-    procedure Draw; // draw all sprites in the list
-    property Surface : PSDL_Surface read FSurface write SetSurface; // screen surface
-    property BackgroundSurface : PSDL_Surface read FBackground write SetBackground; // background surface
-    constructor Create( _Surface : PSDL_Surface );
-  end;
-
-  function isCollideRects( Rect1, Rect2 : PSDL_Rect ) : boolean;
-
-implementation
-
-function CompareZ( Item1, Item2 : TSprite ) : Integer;
-begin
-  if Item1.z < Item2.z then
-    Result := -1
-  else if Item1.z > Item2.z then
-    Result := 1
-  else
-    Result := 0;
-end;
-
-function isCollideRects( Rect1, Rect2 : PSDL_Rect ) : boolean;
-begin
-  Result := true;
-  if ( Rect1.x + Rect1.w < Rect2.x ) or
-    ( Rect1.x > Rect2.x + Rect2.w ) or
-    ( Rect1.y + Rect1.h < Rect2.y ) or
-    ( Rect1.y > Rect2.y + Rect2.h ) then
-    Result := false;
-end;
-
-// Create a sprite. Transparent color is $00ff00ff
-constructor TSprite.Create( const _Image : string; Width, Height : integer );
-var
-  Temp : PSDL_Surface;
-begin
-  inherited Create;
-  ID := 0;
-  if fileexists( _Image ) then
-  begin
-    Temp := IMG_Load( PChar( _Image ) );
-    Image := SDL_DisplayFormat( Temp );
-    SDL_FreeSurface( Temp );
-    Flags := SDL_SRCCOLORKEY or SDL_RLEACCEL or SDL_HWACCEL;
-    SDL_SetColorKey( Image, Flags, SDL_MapRGB( Image.format, 255, 0, 255 ) );
-    NumberOfFrames := Image.w div Width;
-  end
-  else
-    NumberOfFrames := 0;
-  AnimPhase := 0;
-  isDead := false;
-  x := 0;
-  y := 0;
-  z := 0;
-  w := Width;
-  h := Height;
-  SrcRect.y := 0;
-  SrcRect.w := w;
-  SrcRect.h := h;
-end;
-
-// we can separately determine the collision rectangle
-procedure TSprite.GetCollisionRect( Rect : PSDL_Rect );
-begin
-  Rect.x := x;
-  Rect.y := y;
-  Rect.w := w;
-  Rect.h := h;
-end;
-
-procedure TSprite.Free;
-begin
-  if Image <> nil then
-    SDL_FreeSurface( Image );
-  inherited Free;
-end;
-
-procedure TSprite.Move;
-begin
-end;
-
-procedure TSprite.Kill;
-begin
-  isDead := true;
-end;
-
-function TSprite.Remove : integer;
-begin
-  PrevRect.w := w;
-  PrevRect.h := h;
-  Result := SDL_BlitSurface( Background, @PrevRect, Surface, @PrevRect );
-end;
-
-procedure TSprite.Draw;
-var
-  DestRect : TSDL_Rect;
-begin
-  SrcRect.x := AnimPhase * w; // which animation phase need to draw?
-  DestRect.x := x; // set screen positions
-  DestRect.y := y;
-  SDL_BlitSurface( Image, @SrcRect, Surface, @DestRect );
-  PrevRect := DestRect;
-end;
-
-// TSpriteList ---------------------------------------
-function TSpriteList.Get( Index : Integer ) : TSprite;
-begin
-  Result := inherited Get( Index );
-end;
-
-procedure TSpriteList.Put( Index : Integer; Item : TSprite );
-begin
-  inherited Put( Index, Item );
-end;
-
-// TSpriteEngine ----------------------------------------
-constructor TSpriteEngine.Create( _Surface : PSDL_Surface );
-begin
-  inherited Create;
-  NeedSort := false;
-  Sprites := TSpriteList.Create;
-  FSurface := _Surface;
-  NeedRedrawBackground := false;
-  NumberOfRects := 0;
-  UpdateRects := nil;
-end;
-
-procedure TSpriteEngine.Free;
-begin
-  Clear;
-  Sprites.Free;
-  inherited Free;
-end;
-
-procedure TSpriteEngine.AddSprite( Item : TSprite );
-begin
-  Item.Surface := Surface; // setting new sprite's surfaces
-  Item.Background := FBackground;
-  Item.ParentList := Sprites;
-  Sprites.Add( Item );
-  NeedSort := true;
-  SetLength( UpdateRects, Sprites.Count * 2 * sizeof( TSDL_Rect ) );
-end;
-
-procedure TSpriteEngine.RemoveSprite( Item : TSprite );
-begin
-  Sprites.Remove( Item );
-  SetLength( UpdateRects, Sprites.Count * 2 * sizeof( TSDL_Rect ) );
-end;
-
-procedure TSpriteEngine.Move;
-var
-  i, max : integer;
-  TempSpr : TSprite;
-begin
-  if Sprites.Count > 0 then
-  begin
-    NeedRedrawBackground := false;
-    i := 0; max := Sprites.Count;
-    repeat
-      if Sprites[ i ].Remove = -2 then
-        NeedRedrawBackground := true;
-      if Sprites[ i ].isDead then
-      begin
-        TempSpr := Sprites[ i ];
-        RemoveSprite( TempSpr );
-        TempSpr.Free;
-        dec( Max );
-      end
-      else
-      begin
-        Sprites[ i ].Move;
-        inc( i );
-      end;
-    until i >= Max;
-  end;
-  if NeedSort then
-  begin
-    SortSprites;
-    NeedSort := false;
-  end;
-end;
-
-procedure TSpriteEngine.Draw;
-var
-  i, j, num : integer;
-begin
-  num := Sprites.Count;
-  j := 0;
-  if num > 0 then
-  begin
-    for i := 0 to num - 1 do
-    begin
-      UpdateRects[ j ] := Sprites[ i ].PrevRect;
-      Sprites[ i ].Draw;
-      inc( j );
-      if not Sprites[ i ].isDead then
-      begin
-        UpdateRects[ j ] := Sprites[ i ].PrevRect;
-        inc( j );
-      end;
-    end;
-  end;
-  NumberOfRects := j;
-end;
-
-// set all sprites' Surface to _Surface 
-procedure TSpriteEngine.SetSurface( _Surface : PSDL_Surface );
-var
-  i : integer;
-begin
-  FSurface := _Surface;
-  if Sprites.Count > 0 then
-    for i := 0 to Sprites.Count - 1 do
-      Sprites[ i ].Surface := _Surface;
-end;
-
-// set all sprites' Background surface to _Surface 
-procedure TSpriteEngine.SetBackground( _Surface : PSDL_Surface );
-var
-  i : integer;
-begin
-  FBackground := _Surface;
-  if Sprites.Count > 0 then
-    for i := 0 to Sprites.Count - 1 do
-      Sprites[ i ].Background := _Surface;
-end;
-
-procedure TSpriteEngine.Clear;
-var
-  TempSpr : TSprite;
-begin
-  while Sprites.Count > 0 do
-  begin // destroy all sprites
-    TempSpr := Sprites[ 0 ];
-    RemoveSprite( TempSpr );
-    TempSpr.Free;
-  end;
-  Sprites.Clear;
-end;
-
-procedure TSpriteEngine.SortSprites;
-begin
-  Sprites.Sort( @CompareZ );
-end;
-
-end.

+ 0 - 216
packages/extra/sdl/sdlstreams.pas

@@ -1,216 +0,0 @@
-unit sdlstreams;
-{
-  $Id: sdlstreams.pas,v 1.1 2004/02/05 00:08:20 savage Exp $
-  
-}
-{******************************************************************}
-{                                                                  }
-{       SDL - Simple DirectMedia Layer                             }
-{    Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga      }
-{                                                                  }
-{ Portions created by Chris Bruner are                             }
-{ Copyright (C) 2002 Chris Bruner.                                 }
-{                                                                  }
-{ Contributor(s)                                                   }
-{ --------------                                                   }
-{                                                                  }
-{                                                                  }
-{ Obtained through:                                                }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )            }
-{                                                                  }
-{ You may retrieve the latest version of this file at the Project  }
-{ JEDI home page, located at http://delphi-jedi.org                }
-{                                                                  }
-{ The contents of this file are used with permission, subject to   }
-{ the Mozilla Public License Version 1.1 (the "License"); you may  }
-{ not use this file except in compliance with the License. You may }
-{ obtain a copy of the License at                                  }
-{ http://www.mozilla.org/NPL/NPL-1_1Final.html                     }
-{                                                                  }
-{ Software distributed under the License is distributed on an      }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   }
-{ implied. See the License for the specific language governing     }
-{ rights and limitations under the License.                        }
-{                                                                  }
-{ Description                                                      }
-{ -----------                                                      }
-{  Shows how to use OpenGL to do 2D and 3D with the SDL libraries  }
-{                                                                  }
-{                                                                  }
-{ Requires                                                         }
-{ --------                                                         }
-{   SDL runtime libary somewhere in your path                      }
-{   The Latest SDL runtime can be found on http://www.libsdl.org   }
-{                                                                  }
-{ Programming Notes                                                }
-{ -----------------                                                }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{ Revision History                                                 }
-{ ----------------                                                 }
-{   January  11 2002 - CB : Software embraced and extended by      }
-{                           Chris Bruner of Crystal Software       }
-{                           (Canada) Inc.                          }
-{                                                                  }
-{  February  11 2002 - DL : Added FreePascal support as suggested  }
-{                        by "QuePasha Pepe" <[email protected]> }
-{                                                                  }
-{******************************************************************}
-{
-  $Log: sdlstreams.pas,v $
-  Revision 1.1  2004/02/05 00:08:20  savage
-  Module 1.0 release
-
-  
-}
-
-{$i jedi-sdl.inc}
-
-interface
-
-uses
-  Classes,
-  SysUtils,
-  sdl,
-  sdlutils;
-
-{$IFDEF FPC}
-type
-  EinvalidContainer=class(Exception); 
- {$ENDIF}
-  
-function LoadSDLBMPFromStream( Stream : TStream ) : PSDL_Surface;
-procedure SaveSDLBMPToStream( SDL_Surface : PSDL_Surface; stream : TStream );
-function SDL_Swap16( D : UInt16 ) : Uint16;
-function SDL_Swap32( D : UInt32 ) : Uint32;
-function SDLStreamSetup( stream : TStream ) : PSDL_RWops;
-// this only closes the SDL_RWops part of the stream, not the stream itself
-procedure SDLStreamCloseRWops( SDL_RWops : PSDL_RWops );
-
-implementation
-
-function SDL_Swap16( D : UInt16 ) : Uint16;
-begin
-  Result := ( D shl 8 ) or ( D shr 8 );
-end;
-
-function SDL_Swap32( D : UInt32 ) : Uint32;
-begin
-  Result := ( ( D shl 24 ) or ( ( D shl 8 ) and $00FF0000 ) or ( ( D shr 8 ) and $0000FF00 ) or ( D shr 24 ) );
-end;
-
-(*function SDL_Swap64(D : UInt64) : Uint64;
-var hi,lo : Uint32;
-begin
-        // Separate into high and low 32-bit resultues and swap them
-        lo := Uint32(D and $0FFFFFFFF); // bloody pascal is too tight in it's type checking!
-        D := D shr 32;
-        hi = Uint32((D and $FFFFFFFF));
-        result = SDL_Swap32(lo);
-        result := result shl 32;
-        result := result or SDL_Swap32(hi);
-end;
-*)
-
-function SdlStreamSeek( context : PSDL_RWops; offset : Integer; whence : Integer ) : integer; cdecl;
-var
-  stream : TStream;
-  origin : Word;
-begin
-  stream := TStream( context.unknown );
-  if ( stream = nil ) then
-    raise EInvalidContainer.Create( 'SDLStreamSeek on nil' );
-  case whence of
-    0 : origin := soFromBeginning; //	Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0.
-    1 : origin := soFromCurrent; //	Offset is from the current position in the resource. Seek moves to Position + Offset.
-    2 : origin := soFromEnd;
-  else
-    origin := soFromBeginning; // just in case
-  end;
-  Result := stream.Seek( offset, origin );
-end;
-
-function SDLStreamWrite( context : PSDL_RWops; Ptr : Pointer;
-  size : Integer; num : Integer ) : Integer; cdecl;
-var
-  stream : TStream;
-begin
-  stream := TStream( context.unknown );
-  if ( stream = nil ) then
-    raise EInvalidContainer.Create( 'SDLStreamWrite on nil' );
-  try
-    Result := stream.Write( Ptr^, Size * num ) div size;
-  except
-    Result := -1;
-  end;
-end;
-
-function SdlStreamRead( context : PSDL_RWops; Ptr : Pointer; size : Integer; maxnum
-  : Integer ) : Integer; cdecl;
-var
-  stream : TStream;
-begin
-  stream := TStream( context.unknown );
-  if ( stream = nil ) then
-    raise EInvalidContainer.Create( 'SDLStreamRead on nil' );
-  try
-    Result := stream.read( Ptr^, Size * maxnum ) div size;
-  except
-    Result := -1;
-  end;
-end;
-
-function SDLStreamClose( context : PSDL_RWops ) : Integer; cdecl;
-var
-  stream : TStream;
-begin
-  stream := TStream( context.unknown );
-  if ( stream = nil ) then
-    raise EInvalidContainer.Create( 'SDLStreamClose on nil' );
-  stream.Free;
-  Result := 1;
-end;
-
-function SDLStreamSetup( stream : TStream ) : PSDL_RWops;
-begin
-  result := SDL_AllocRW;
-  if ( result = nil ) then
-    raise EInvalidContainer.Create( 'could not create SDLStream on nil' );
-  result.unknown := TUnknown( stream );
-  result.seek := SDLStreamSeek;
-  result.read := SDLStreamRead;
-  result.write := SDLStreamWrite;
-  result.close := SDLStreamClose;
-  Result.type_ := 2; // TUnknown
-end;
-
-// this only closes the SDL part of the stream, not the context
-
-procedure SDLStreamCloseRWops( SDL_RWops : PSDL_RWops );
-begin
-  SDL_FreeRW( SDL_RWops );
-end;
-
-function LoadSDLBMPFromStream( stream : TStream ) : PSDL_Surface;
-var
-  SDL_RWops : PSDL_RWops;
-begin
-  SDL_RWops := SDLStreamSetup( stream );
-  result := SDL_LoadBMP_RW( SDL_RWops, 0 );
-  SDLStreamCloseRWops( SDL_RWops );
-end;
-
-procedure SaveSDLBMPToStream( SDL_Surface : PSDL_Surface; stream : TStream );
-var
-  SDL_RWops : PSDL_RWops;
-begin
-  SDL_RWops := SDLStreamSetup( stream );
-  SDL_SaveBMP_RW( SDL_Surface, SDL_RWops, 0 );
-  SDLStreamCloseRWops( SDL_RWops );
-end;
-
-end.
-

+ 0 - 197
packages/extra/sdl/sdlticks.pas

@@ -1,197 +0,0 @@
-unit sdlticks;
-{
-  $Id: sdlticks.pas,v 1.2 2006/11/08 08:22:48 savage Exp $
-
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{                   SDL GetTicks Class Wrapper                                 }
-{                                                                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominique Louis are                                      }
-{ Copyright (C) 2004 - 2100 Dominique Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{   SDL Window Wrapper                                                         }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   SDL.dll on Windows platforms                                               }
-{   libSDL-1.1.so.0 on Linux platform                                          }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{                                                                              }
-{   September   23 2004 - DL : Initial Creation                                }
-{
-  $Log: sdlticks.pas,v $
-  Revision 1.2  2006/11/08 08:22:48  savage
-  updates tp sdlgameinterface and sdlticks functions.
-
-  Revision 1.1  2004/09/30 22:35:47  savage
-  Changes, enhancements and additions as required to get SoAoS working.
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  sdl;
-
-type
-  TSDLTicks = class
-  private
-    FStartTime : UInt32;
-    FTicksPerSecond : UInt32;
-    FElapsedLastTime : UInt32;
-    FFPSLastTime : UInt32;
-    FLockFPSLastTime : UInt32;
-  public
-    constructor Create;
-    destructor Destroy; override; // destructor
-
-    {*****************************************************************************
-     Init
-     If the hi-res timer is present, the tick rate is stored and the function
-     returns true. Otherwise, the function returns false, and the timer should
-     not be used.
-    *****************************************************************************}
-    function Init : boolean;
-
-    {***************************************************************************
-     GetGetElapsedSeconds
-     Returns the Elapsed time, since the function was last called.
-    ***************************************************************************}
-    function GetElapsedSeconds : Single;
-
-    {***************************************************************************
-     GetFPS
-     Returns the average frames per second.
-     If this is not called every frame, the client should track the number
-     of frames itself, and reset the value after this is called.
-    ***************************************************************************}
-    function GetFPS : single;
-
-    {***************************************************************************
-     LockFPS
-     Used to lock the frame rate to a set amount. This will block until enough
-     time has passed to ensure that the fps won't go over the requested amount.
-     Note that this can only keep the fps from going above the specified level;
-     it can still drop below it. It is assumed that if used, this function will
-     be called every frame. The value returned is the instantaneous fps, which
-     will be less than or equal to the targetFPS.
-    ***************************************************************************}
-    procedure LockFPS( targetFPS : Byte );
-  end;
-
-implementation
-
-{ TSDLTicks }
-constructor TSDLTicks.Create;
-begin
-  inherited;
-  FTicksPerSecond := 1000;
-end;
-
-destructor TSDLTicks.Destroy;
-begin
-  inherited;
-end;
-
-function TSDLTicks.GetElapsedSeconds : Single;
-var
-  currentTime       : Cardinal;
-begin
-  currentTime := SDL_GetTicks;
-
-  result := ( currentTime - FElapsedLastTime ) / FTicksPerSecond;
-
-  // reset the timer
-  FElapsedLastTime := currentTime;
-end;
-
-function TSDLTicks.GetFPS : Single;
-var
-  currentTime, FrameTime : UInt32;
-  fps               : single;
-begin
-  currentTime := SDL_GetTicks;
-
-  FrameTime := ( currentTime - FFPSLastTime );
-
-  if FrameTime = 0 then
-    FrameTime := 1;
-
-  fps := FTicksPerSecond / FrameTime;
-
-  // reset the timer
-  FFPSLastTime := currentTime;
-  result := fps;
-end;
-
-function TSDLTicks.Init : boolean;
-begin
-  FStartTime := SDL_GetTicks;
-  FElapsedLastTime := FStartTime;
-  FFPSLastTime := FStartTime;
-  FLockFPSLastTime := FStartTime;
-  result := true;
-end;
-
-procedure TSDLTicks.LockFPS( targetFPS : Byte );
-var
-  currentTime       : UInt32;
-  targetTime        : single;
-begin
-  if ( targetFPS = 0 ) then
-    targetFPS := 1;
-
-  targetTime := FTicksPerSecond / targetFPS;
-
-  // delay to maintain a constant frame rate
-  repeat
-    currentTime := SDL_GetTicks;
-  until ( ( currentTime - FLockFPSLastTime ) > targetTime );
-
-  // reset the timer
-  FLockFPSLastTime := currentTime;
-end;
-
-end.
-
- 

+ 0 - 565
packages/extra/sdl/sdltruetypefont.pas

@@ -1,565 +0,0 @@
-unit sdltruetypefont;
-{
-  $Id: sdltruetypefont.pas,v 1.5 2005/05/26 21:22:28 savage Exp $
-
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{                Wrapper class for SDL_ttf                                     }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominqiue Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominqiue Louis are                                      }
-{ Copyright (C) 2000 - 2001 Dominqiue Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   The SDL Runtime libraris on Win32  : SDL.dll on Linux : libSDL.so          }
-{   They are available from...                                                 }
-{   http://www.libsdl.org .                                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{   September   23 2004 - DL : Initial Creation                                }
-{
-  $Log: sdltruetypefont.pas,v $
-  Revision 1.5  2005/05/26 21:22:28  savage
-  Update to Input code.
-
-  Revision 1.1  2005/05/25 23:15:42  savage
-  Latest Changes
-
-  Revision 1.4  2005/05/25 22:55:01  savage
-  Added InputRect support.
-
-  Revision 1.3  2005/05/13 14:02:49  savage
-  Made it use UniCode rendering by default.
-
-  Revision 1.2  2005/05/13 11:37:52  savage
-  Improved wordwrapping algorithm
-
-  Revision 1.1  2004/09/30 22:39:50  savage
-  Added a true type font class which contains a wrap text function.
-  Changed the sdl_ttf.pas header to reflect the future of jedi-sdl.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  sdl,
-  sdl_ttf;
-
-type
-  TRenderType = ( rtLatin1, rtUTF8, rtUnicode );
-  TSDLFontStyle = ( fsBold, fsItalic, fsUnderline, fsStrikeOut );
-
-  TSDLFontStyles = set of TSDLFontStyle;
-
-  TTrueTypeFont = class( TObject )
-  private
-    FFont : PTTF_Font;
-    FSolid : Boolean;
-    FBackGroundColour : TSDL_Color;
-    FForeGroundColour : TSDL_Color;
-    FRenderType : TRenderType;
-    FStyle : TSDLFontStyles;
-    FFontFile : string;
-    FFontSize : integer;
-    procedure PrepareFont;
-
-  protected
-
-  public
-    constructor Create( aFontFile : string; aRenderStyle : TSDLFontStyles = [ ]; aFontSize : integer = 14 );
-    destructor Destroy; override;
-    function DrawText( aText : WideString ) : PSDL_Surface; overload;
-    function DrawText( aText : WideString; aWidth, aHeight : Integer ) : PSDL_Surface; overload;
-    function Input(aDestination: PSDL_Surface; aX, aY, aWidth, aHeight: integer; var aText: string; aMaxChars: integer = 10 ): PSDL_Surface;
-    property BackGroundColour : TSDL_Color read FBackGroundColour write FBackGroundColour;
-    property ForeGroundColour : TSDL_Color read FForeGroundColour write FForeGroundColour;
-    property FontFile : string read FFontFile write FFontFile;
-    property RenderType : TRenderType read FRenderType write FRenderType;
-    property Solid : Boolean read FSolid write FSolid;
-    property Style : TSDLFontStyles read FStyle write FStyle;
-    property FontSize : integer read FFontSize write FFontSize;
-  end;
-
-
-implementation
-
-uses
-  SysUtils;
-
-{ TTrueTypeFont }
-
-constructor TTrueTypeFont.Create( aFontFile : string; aRenderStyle : TSDLFontStyles; aFontSize : integer );
-begin
-  inherited Create;
-  if FileExists( aFontFile ) then
-  begin
-    FStyle := aRenderStyle;
-    FFontSize := aFontSize;
-    FSolid := false;
-    FBackGroundColour.r := 255;
-    FBackGroundColour.g := 255;
-    FBackGroundColour.b := 255;
-    FForeGroundColour.r := 0;
-    FForeGroundColour.g := 0;
-    FForeGroundColour.b := 0;
-    FRenderType := rtUnicode;
-    if ( TTF_Init >= 0 ) then
-    begin
-      FFontFile := aFontFile;
-    end
-    else
-      raise Exception.Create( 'Failed to Initialiase SDL_TTF' );
-  end
-  else
-    raise Exception.Create( 'Font File does not exist' );
-end;
-
-destructor TTrueTypeFont.Destroy;
-begin
-  if FFont <> nil then
-    TTF_CloseFont( FFont );
-  TTF_Quit;
-  inherited;
-end;
-
-function TTrueTypeFont.DrawText( aText : WideString ) : PSDL_Surface;
-begin
-  PrepareFont;
-
-  result := nil;
-
-  case FRenderType of
-    rtLatin1 :
-      begin
-        if ( FSolid ) then
-        begin
-          result := TTF_RenderText_Solid( FFont, PChar( string( aText ) ), FForeGroundColour );
-        end
-        else
-        begin
-          result := TTF_RenderText_Shaded( FFont, PChar( string( aText ) ), FForeGroundColour, FBackGroundColour );
-        end;
-      end;
-
-    rtUTF8 :
-      begin
-        if ( FSolid ) then
-        begin
-          result := TTF_RenderUTF8_Solid( FFont, PChar( string( aText ) ), FForeGroundColour );
-        end
-        else
-        begin
-          result := TTF_RenderUTF8_Shaded( FFont, PChar( string( aText ) ), FForeGroundColour, FBackGroundColour );
-        end;
-      end;
-
-    rtUnicode :
-      begin
-        if ( FSolid ) then
-        begin
-          result := TTF_RenderUNICODE_Solid( FFont, PUInt16( aText ), FForeGroundColour );
-        end
-        else
-        begin
-          result := TTF_RenderUNICODE_Shaded( FFont, PUInt16( aText ), FForeGroundColour, FBackGroundColour );
-        end;
-      end;
-  end;
-end;
-
-function TTrueTypeFont.DrawText( aText : WideString; aWidth, aHeight : Integer ) : PSDL_Surface;
-var
-  textw, texth, i, yPos : integer;
-  strChopped : WideString;
-  SurfaceList : array of PSDL_Surface;
-  strlist : array of WideString;
-  ReturnedSurface : PSDL_Surface;
-  BltRect : TSDL_Rect;
-begin
-  PrepareFont;
-
-  // Do an initial check to see if it already fits
-  case FRenderType of
-    rtLatin1 :
-    begin
-      if TTF_SizeText( FFont, PChar( string( aText ) ), textw, texth ) = 0 then
-      begin
-        if ( textw < aWidth )
-          and ( texth < aHeight ) then
-        begin
-          result := DrawText( aText );
-          exit;
-        end
-      end;
-    end;
-
-    rtUTF8 :
-    begin
-      if TTF_SizeUTF8( FFont, PChar( string( aText ) ), textw, texth ) = 0 then
-      begin
-        if ( textw < aWidth )
-          and ( texth < aHeight ) then
-        begin
-          result := DrawText( aText );
-          exit;
-        end
-      end;
-    end;
-
-    rtUnicode :
-    begin
-      if TTF_SizeUNICODE( FFont, PUInt16( aText ), textw, texth ) = 0 then
-      begin
-        if ( textw < aWidth )
-          and ( texth < aHeight ) then
-        begin
-          result := DrawText( aText );
-          exit;
-        end
-      end;
-    end;
-  end;
-
-  // Create the Surface we will be returning
-  ReturnedSurface := SDL_DisplayFormat( SDL_CreateRGBSurface( SDL_SRCCOLORKEY or SDL_RLEACCEL or SDL_HWACCEL, aWidth, aHeight, 16, 0, 0, 0, 0 ) );
-
-  // If we are still here there is some serious parsing to do
-  case FRenderType of
-    rtLatin1 :
-    begin
-      strChopped := aText;
-      i := Length( strChopped );
-      while ( i <> 0 ) do
-      begin
-        if ( string( strChopped[ i ] ) <> ' ' ) and ( Integer( string( strChopped[ i ] ) ) <> 13 ) then
-          dec( i )
-        else
-        begin
-          dec( i );
-          if TTF_SizeText( FFont, PChar( string( Copy( strChopped, 0, i ) ) ), textw, texth ) = 0 then
-          begin
-            if ( textw < aWidth )
-            and ( texth < aHeight ) then
-            begin
-              SetLength( strlist, Length( strlist ) + 1 );
-              strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
-              strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
-              i := Length( strChopped );
-              if TTF_SizeText( FFont, PChar( string( strChopped ) ), textw, texth ) = 0 then
-              begin
-                if ( textw < aWidth )
-                and ( texth < aHeight ) then
-                begin
-                  SetLength( strlist, Length( strlist ) + 1 );
-                  strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
-                  strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
-                  i := Length( strChopped );
-                end;
-              end;
-            end;
-          end;
-        end;
-      end;
-      
-      SetLength( SurfaceList, Length( strlist ) );
-      for i := Low( strlist ) to High( strlist ) do
-      begin
-        if ( FSolid ) then
-        begin
-          SurfaceList[ i ] := TTF_RenderText_Solid( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour );
-        end
-        else
-        begin
-          SurfaceList[ i ] := TTF_RenderText_Shaded( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour, FBackGroundColour );
-        end;
-      end;
-    end;
-
-    rtUTF8 :
-    begin
-      strChopped := aText;
-      i := Length( strChopped );
-      while ( i <> 0 ) do
-      begin
-        if ( string( strChopped[ i ] ) <> ' ' ) and ( Integer( string( strChopped[ i ] ) ) <> 13 ) then
-          dec( i )
-        else
-        begin
-          dec( i );
-          if TTF_SizeUTF8( FFont, PChar( string( Copy( strChopped, 0, i ) ) ), textw, texth ) = 0 then
-          begin
-            if ( textw < aWidth )
-            and ( texth < aHeight ) then
-            begin
-              SetLength( strlist, Length( strlist ) + 1 );
-              strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
-              strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
-              i := Length( strChopped );
-              if TTF_SizeUTF8( FFont, PChar( string( strChopped ) ), textw, texth ) = 0 then
-              begin
-                if ( textw < aWidth )
-                and ( texth < aHeight ) then
-                begin
-                  SetLength( strlist, Length( strlist ) + 1 );
-                  strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
-                  strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
-                  i := Length( strChopped );
-                end;
-              end;
-            end;
-          end;
-        end;
-      end;
-
-      SetLength( SurfaceList, Length( strlist ) );
-      for i := Low( strlist ) to High( strlist ) do
-      begin
-        if ( FSolid ) then
-        begin
-          SurfaceList[ i ] := TTF_RenderUTF8_Solid( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour );
-        end
-        else
-        begin
-          SurfaceList[ i ] := TTF_RenderUTF8_Shaded( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour, FBackGroundColour );
-        end;
-      end;
-    end;
-
-    rtUnicode :
-    begin
-      strChopped := aText;
-      i := Length( strChopped );
-      while ( i <> 0 ) do
-      begin
-        if ( string( strChopped[ i ] ) <> ' ' ) and ( Integer( string( strChopped[ i ] ) ) <> 13 ) then
-          dec( i )
-        else
-        begin
-          dec( i );
-          if TTF_SizeUNICODE( FFont, PUInt16( Copy( strChopped, 0, i ) ), textw, texth ) = 0 then
-          begin
-            if ( textw < aWidth )
-            and ( texth < aHeight ) then
-            begin
-              SetLength( strlist, Length( strlist ) + 1 );
-              strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
-              strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
-              i := Length( strChopped );
-              if TTF_SizeUNICODE( FFont, PUInt16( strChopped ), textw, texth ) = 0 then
-              begin
-                if ( textw < aWidth )
-                and ( texth < aHeight ) then
-                begin
-                  SetLength( strlist, Length( strlist ) + 1 );
-                  strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
-                  strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
-                  i := Length( strChopped );
-                end;
-              end;
-            end;
-          end;
-        end;
-      end;
-      SetLength( SurfaceList, Length( strlist ) );
-      for i := Low( strlist ) to High( strlist ) do
-      begin
-        if ( FSolid ) then
-        begin
-          SurfaceList[ i ] := TTF_RenderUNICODE_Solid( FFont, PUInt16( strlist[ i ] ), FForeGroundColour );
-        end
-        else
-        begin
-          SurfaceList[ i ] := TTF_RenderUNICODE_Shaded( FFont, PUInt16( strlist[ i ] ), FForeGroundColour, FBackGroundColour );
-        end;
-      end;
-    end;
-  end;
-
-  // Now Draw the SurfaceList onto the resulting Surface
-  yPos := 6;
-  for i := Low( SurfaceList ) to High( SurfaceList ) do
-  begin
-    BltRect.x := 6;
-    BltRect.y := yPos;
-    BltRect.w := SurfaceList[ i ].w;
-    BltRect.h := SurfaceList[ i ].h;
-    SDL_BlitSurface( SurfaceList[ i ], nil, ReturnedSurface, @BltRect );
-    yPos := yPos + TTF_FontHeight( FFont );
-  end;
-  result :=  ReturnedSurface;
-
-  for i := Low( SurfaceList ) to High( SurfaceList ) do
-  begin
-    SDL_FreeSurface( SurfaceList[ i ] );
-  end;
-  SetLength( SurfaceList, 0 );
-  SetLength( strlist, 0 );
-end;
-
-function TTrueTypeFont.Input(aDestination: PSDL_Surface; aX, aY, aWidth: integer; aHeight : integer; var aText : string; aMaxChars: integer): PSDL_Surface;
-var
-  event : TSDL_Event;
-  ch : integer;
-
-  BackSurface, TextSurface : PSDL_Surface;
-  rect : SDL_Rect;
-  textw, texth : integer;
-  Done : boolean;
-  PassedInText : string; 
-begin
-  PassedInText := aText;
-
-  BackSurface := SDL_AllocSurface( aDestination.flags,
-    aDestination.w,
-    aDestination.h,
-    aDestination.format.BitsPerPixel,
-    aDestination.format.Rmask,
-    aDestination.format.Gmask,
-    aDestination.format.Bmask, 0 );
-
-  rect.x := aX;
-  rect.y := aY;
-  rect.w := aWidth;
-  rect.h := aHeight;
-
-  SDL_BlitSurface( aDestination, nil, BackSurface, nil );
-  SDL_FillRect( BackSurface, @rect, SDL_MapRGB( aDestination.format, 0, 0, 0 ) );
-
-  TextSurface := DrawText( aText + '|' );
-
-  // start input
-  SDL_EnableUNICODE( 1 );
-  Done := false;
-  while ( not Done ) and ( SDL_WaitEvent( @event ) > 0 ) do
-  begin
-    if event.type_ = SDL_KEYDOWN then
-    begin
-      ch := event.key.keysym.unicode;
-      case ch of
-        SDLK_RETURN :
-        begin
-          Done := true;
-        end;
-
-        SDLK_ESCAPE :
-        begin
-          aText := PassedInText;
-          Done := true;
-        end;
-
-        SDLK_BACKSPACE :
-        begin
-          if ( Length( aText ) > 0 ) then
-          begin
-            aText := Copy( aText, 0, Length( aText ) - 1 );
-            if TextSurface <> nil then
-                SDL_FreeSurface( TextSurface );
-            TextSurface := DrawText( aText + '|' );
-          end;
-        end;
-      else
-        begin
-          if Length( aText ) < aMaxChars then
-          begin
-            if ( chr( ch ) <> '' ) then
-            begin
-              aText := aText + chr( ch );
-
-              if ( aText <> '' )
-              and ( TTF_SizeUNICODE( FFont, PUInt16( aText ), textw, texth ) = 0 ) then
-              begin
-                if ( textw > aWidth ) then
-                  aText := Copy( aText, 0, Length( aText ) - 1 );
-              end;
-
-              if TextSurface <> nil then
-                SDL_FreeSurface( TextSurface );
-              TextSurface := DrawText( aText + '|' );
-            end;
-          end;
-        end;
-      end;
-    end;
-    SDL_BlitSurface( BackSurface, nil, aDestination, nil );
-    SDL_BlitSurface( TextSurface, nil, aDestination, @rect );
-    SDL_Flip( aDestination );
-  end;
-  
-  if TextSurface <> nil then
-    SDL_FreeSurface( TextSurface );
-  if aText <> '' then
-    TextSurface := DrawText( aText );
-  SDL_FreeSurface( BackSurface );
-  result := TextSurface;
-end;
-
-procedure TTrueTypeFont.PrepareFont;
-var
-  renderstyle : integer;
-begin
-  if FFont <> nil then
-    TTF_CloseFont( FFont );
-
-  FFont := TTF_OpenFont( PChar( FFontFile ), FFontSize );
-
-  renderstyle := TTF_STYLE_NORMAL;
-  if ( fsBold in FStyle ) then
-    renderstyle := renderstyle or TTF_STYLE_BOLD;
-
-  if ( fsItalic in FStyle ) then
-    renderstyle := renderstyle or TTF_STYLE_ITALIC;
-
-  if ( fsUnderline in FStyle ) then
-    renderstyle := renderstyle or TTF_STYLE_UNDERLINE;
-
-  TTF_SetFontStyle( FFont, renderstyle );
-end;
-
-end.
-

+ 0 - 4361
packages/extra/sdl/sdlutils.pas

@@ -1,4361 +0,0 @@
-unit sdlutils;
-{
-  $Id: sdlutils.pas,v 1.5 2006/11/19 18:56:44 savage Exp $
-
-}
-{******************************************************************************}
-{                                                                              }
-{       Borland Delphi SDL - Simple DirectMedia Layer                          }
-{                SDL Utility functions                                         }
-{                                                                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Tom Jones <[email protected]>                                             }
-{                                                                              }
-{ Portions created by Tom Jones are                                            }
-{ Copyright (C) 2000 - 2001 Tom Jones.                                         }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Dominique Louis <[email protected]>                            }
-{ Róbert Kisnémeth <[email protected]>                                       }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{   Helper functions...                                                        }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   SDL.dll on Windows platforms                                               }
-{   libSDL-1.1.so.0 on Linux platform                                          }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{               2000 - TJ : Initial creation                                   }
-{                                                                              }
-{   July   13   2001 - DL : Added PutPixel and GetPixel routines.              }
-{                                                                              }
-{   Sept   14   2001 - RK : Added flipping routines.                           }
-{                                                                              }
-{   Sept   19   2001 - RK : Added PutPixel & line drawing & blitting with ADD  }
-{                           effect. Fixed a bug in SDL_PutPixel & SDL_GetPixel }
-{                           Added PSDLRect()                                   }
-{   Sept   22   2001 - DL : Removed need for Windows.pas by defining types here}
-{                           Also removed by poor attempt or a dialog box       }
-{                                                                              }
-{   Sept   25   2001 - RK : Added PixelTest, NewPutPixel, SubPixel, SubLine,   }
-{                           SubSurface, MonoSurface & TexturedSurface          }
-{                                                                              }
-{   Sept   26   2001 - DL : Made change so that it refers to native Pascal     }
-{                           types rather that Windows types. This makes it more}
-{                           portable to Linix.                                 }
-{                                                                              }
-{   Sept   27   2001 - RK : SDLUtils now can be compiled with FreePascal       }
-{                                                                              }
-{   Oct    27   2001 - JF : Added ScrollY function                             }
-{                                                                              }
-{   Jan    21   2002 - RK : Added SDL_ZoomSurface and SDL_WarpSurface          }
-{                                                                              }
-{   Mar    28   2002 - JF : Added SDL_RotateSurface                            }
-{                                                                              }
-{   May    13   2002 - RK : Improved SDL_FillRectAdd & SDL_FillRectSub         }
-{                                                                              }
-{   May    27   2002 - YS : GradientFillRect function                          }
-{                                                                              }
-{   May    30   2002 - RK : Added SDL_2xBlit, SDL_Scanline2xBlit               }
-{                           & SDL_50Scanline2xBlit                             }
-{                                                                              }
-{  June    12   2002 - RK : Added SDL_PixelTestSurfaceVsRect                   }
-{                                                                              }
-{  June    12   2002 - JF : Updated SDL_PixelTestSurfaceVsRect                 }
-{                                                                              }
-{ November  9   2002 - JF : Added Jason's boolean Surface functions            }
-{                                                                              }
-{ December 10   2002 - DE : Added Dean's SDL_ClipLine function                 }
-{                                                                              }
-{    April 26   2003 - SS : Incorporated JF's changes to SDL_ClipLine          }
-{                           Fixed SDL_ClipLine bug for non-zero cliprect x, y  }
-{                           Added overloaded SDL_DrawLine for dashed lines     }
-{                                                                              }
-{******************************************************************************}
-{
-  $Log: sdlutils.pas,v $
-  Revision 1.5  2006/11/19 18:56:44  savage
-  Removed Hints and Warnings.
-
-  Revision 1.4  2004/06/02 19:38:53  savage
-  Changes to SDL_GradientFillRect as suggested by
-  Ángel Eduardo García Hernández.  Many thanks.
-
-  Revision 1.3  2004/05/29 23:11:54  savage
-  Changes to SDL_ScaleSurfaceRect as suggested by
-  Ángel Eduardo García Hernández to fix a colour issue with the function. Many thanks.
-
-  Revision 1.2  2004/02/14 00:23:39  savage
-  As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
-
-  Revision 1.1  2004/02/05 00:08:20  savage
-  Module 1.0 release
-
-
-}
-
-interface
-
-{$I jedi-sdl.inc}
-
-uses
-{$IFDEF UNIX}
-  Types,
-  Xlib,
-{$ENDIF}
-  SysUtils,
-  sdl;
-
-type
-  TGradientStyle = ( gsHorizontal, gsVertical );
-
-// Pixel procedures
-function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
-  PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : Boolean;
-
-function SDL_GetPixel( SrcSurface : PSDL_Surface; x : integer; y : integer ) : Uint32;
-
-procedure SDL_PutPixel( DstSurface : PSDL_Surface; x : integer; y : integer; pixel :
-  Uint32 );
-
-procedure SDL_AddPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
-  cardinal );
-
-procedure SDL_SubPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
-  cardinal );
-
-// Line procedures
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal ); overload;
-
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal; DashLength, DashSpace : byte ); overload;
-
-procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-
-procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-
-// Surface procedures
-procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
-
-procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
-  TextureRect : PSDL_Rect );
-
-procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
-
-procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
-
-// Flip procedures
-procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-
-procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-
-function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
-
-function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect; overload;
-
-function SDLRect( aRect : TRect ) : TSDL_Rect; overload;
-
-function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
-  Width, Height : integer ) : PSDL_Surface;
-
-procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
-
-procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
-
-procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
-
-procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
-
-function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
-
-// Fill Rect routine
-procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-
-procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-
-procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
-
-// NOTE for All SDL_2xblit... function : the dest surface must be 2x of the source surface!
-procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
-
-procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
-
-procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
-
-//
-function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 :
-  PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
-  boolean;
-
-// Jason's boolean Surface functions
-procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-
-procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-
-function SDL_ClipLine( var x1, y1, x2, y2 : Integer; ClipRect : PSDL_Rect ) : boolean;
-
-implementation
-
-uses
-  Math;
-
-function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
-  PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : boolean;
-var
-  Src_Rect1, Src_Rect2 : TSDL_Rect;
-  right1, bottom1 : integer;
-  right2, bottom2 : integer;
-  Scan1Start, Scan2Start, ScanWidth, ScanHeight : cardinal;
-  Mod1, Mod2   : cardinal;
-  Addr1, Addr2 : cardinal;
-  BPP          : cardinal;
-  Pitch1, Pitch2 : cardinal;
-  TransparentColor1, TransparentColor2 : cardinal;
-  tx, ty       : cardinal;
-  StartTick    : cardinal;
-  Color1, Color2 : cardinal;
-begin
-  Result := false;
-  if SrcRect1 = nil then
-  begin
-    with Src_Rect1 do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface1.w;
-      h := SrcSurface1.h;
-    end;
-  end
-  else
-    Src_Rect1 := SrcRect1^;
-  if SrcRect2 = nil then
-  begin
-    with Src_Rect2 do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface2.w;
-      h := SrcSurface2.h;
-    end;
-  end
-  else
-    Src_Rect2 := SrcRect2^;
-  with Src_Rect1 do
-  begin
-    Right1 := Left1 + w;
-    Bottom1 := Top1 + h;
-  end;
-  with Src_Rect2 do
-  begin
-    Right2 := Left2 + w;
-    Bottom2 := Top2 + h;
-  end;
-  if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( Bottom1 <=
-    Top2 ) then
-    exit;
-  if Left1 <= Left2 then
-  begin
-    // 1. left, 2. right
-    Scan1Start := Src_Rect1.x + Left2 - Left1;
-    Scan2Start := Src_Rect2.x;
-    ScanWidth := Right1 - Left2;
-    with Src_Rect2 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end
-  else
-  begin
-    // 1. right, 2. left
-    Scan1Start := Src_Rect1.x;
-    Scan2Start := Src_Rect2.x + Left1 - Left2;
-    ScanWidth := Right2 - Left1;
-    with Src_Rect1 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end;
-  with SrcSurface1^ do
-  begin
-    Pitch1 := Pitch;
-    Addr1 := cardinal( Pixels );
-    inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
-    with format^ do
-    begin
-      BPP := BytesPerPixel;
-      TransparentColor1 := colorkey;
-    end;
-  end;
-  with SrcSurface2^ do
-  begin
-    TransparentColor2 := format.colorkey;
-    Pitch2 := Pitch;
-    Addr2 := cardinal( Pixels );
-    inc( Addr2, Pitch2 * UInt32( Src_Rect2.y ) );
-  end;
-  Mod1 := Pitch1 - ( ScanWidth * BPP );
-  Mod2 := Pitch2 - ( ScanWidth * BPP );
-  inc( Addr1, BPP * Scan1Start );
-  inc( Addr2, BPP * Scan2Start );
-  if Top1 <= Top2 then
-  begin
-    // 1. up, 2. down
-    ScanHeight := Bottom1 - Top2;
-    if ScanHeight > Src_Rect2.h then
-      ScanHeight := Src_Rect2.h;
-    inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
-  end
-  else
-  begin
-    // 1. down, 2. up
-    ScanHeight := Bottom2 - Top1;
-    if ScanHeight > Src_Rect1.h then
-      ScanHeight := Src_Rect1.h;
-    inc( Addr2, Pitch2 * UInt32( Top1 - Top2 ) );
-  end;
-  case BPP of
-    1 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PByte( Addr1 )^ <> TransparentColor1 ) and ( PByte( Addr2 )^ <>
-            TransparentColor2 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1 );
-          inc( Addr2 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-    2 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PWord( Addr1 )^ <> TransparentColor1 ) and ( PWord( Addr2 )^ <>
-            TransparentColor2 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 2 );
-          inc( Addr2, 2 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-    3 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
-          Color2 := PLongWord( Addr2 )^ and $00FFFFFF;
-          if ( Color1 <> TransparentColor1 ) and ( Color2 <> TransparentColor2 )
-            then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 3 );
-          inc( Addr2, 3 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-    4 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PLongWord( Addr1 )^ <> TransparentColor1 ) and ( PLongWord( Addr2 )^ <>
-            TransparentColor2 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 4 );
-          inc( Addr2, 4 );
-        end;
-        inc( Addr1, Mod1 );
-        inc( Addr2, Mod2 );
-      end;
-  end;
-end;
-
-procedure SDL_AddPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
-  cardinal );
-var
-  SrcColor     : cardinal;
-  Addr         : cardinal;
-  R, G, B      : cardinal;
-begin
-  if Color = 0 then
-    exit;
-  with DstSurface^ do
-  begin
-    Addr := cardinal( Pixels ) + y * Pitch + x * format.BytesPerPixel;
-    SrcColor := PUInt32( Addr )^;
-    case format.BitsPerPixel of
-      8 :
-        begin
-          R := SrcColor and $E0 + Color and $E0;
-          G := SrcColor and $1C + Color and $1C;
-          B := SrcColor and $03 + Color and $03;
-          if R > $E0 then
-            R := $E0;
-          if G > $1C then
-            G := $1C;
-          if B > $03 then
-            B := $03;
-          PUInt8( Addr )^ := R or G or B;
-        end;
-      15 :
-        begin
-          R := SrcColor and $7C00 + Color and $7C00;
-          G := SrcColor and $03E0 + Color and $03E0;
-          B := SrcColor and $001F + Color and $001F;
-          if R > $7C00 then
-            R := $7C00;
-          if G > $03E0 then
-            G := $03E0;
-          if B > $001F then
-            B := $001F;
-          PUInt16( Addr )^ := R or G or B;
-        end;
-      16 :
-        begin
-          R := SrcColor and $F800 + Color and $F800;
-          G := SrcColor and $07C0 + Color and $07C0;
-          B := SrcColor and $001F + Color and $001F;
-          if R > $F800 then
-            R := $F800;
-          if G > $07C0 then
-            G := $07C0;
-          if B > $001F then
-            B := $001F;
-          PUInt16( Addr )^ := R or G or B;
-        end;
-      24 :
-        begin
-          R := SrcColor and $00FF0000 + Color and $00FF0000;
-          G := SrcColor and $0000FF00 + Color and $0000FF00;
-          B := SrcColor and $000000FF + Color and $000000FF;
-          if R > $FF0000 then
-            R := $FF0000;
-          if G > $00FF00 then
-            G := $00FF00;
-          if B > $0000FF then
-            B := $0000FF;
-          PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
-        end;
-      32 :
-        begin
-          R := SrcColor and $00FF0000 + Color and $00FF0000;
-          G := SrcColor and $0000FF00 + Color and $0000FF00;
-          B := SrcColor and $000000FF + Color and $000000FF;
-          if R > $FF0000 then
-            R := $FF0000;
-          if G > $00FF00 then
-            G := $00FF00;
-          if B > $0000FF then
-            B := $0000FF;
-          PUInt32( Addr )^ := R or G or B;
-        end;
-    end;
-  end;
-end;
-
-procedure SDL_SubPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
-  cardinal );
-var
-  SrcColor     : cardinal;
-  Addr         : cardinal;
-  R, G, B      : cardinal;
-begin
-  if Color = 0 then
-    exit;
-  with DstSurface^ do
-  begin
-    Addr := cardinal( Pixels ) + y * Pitch + x * format.BytesPerPixel;
-    SrcColor := PUInt32( Addr )^;
-    case format.BitsPerPixel of
-      8 :
-        begin
-          R := SrcColor and $E0 - Color and $E0;
-          G := SrcColor and $1C - Color and $1C;
-          B := SrcColor and $03 - Color and $03;
-          if R > $E0 then
-            R := 0;
-          if G > $1C then
-            G := 0;
-          if B > $03 then
-            B := 0;
-          PUInt8( Addr )^ := R or G or B;
-        end;
-      15 :
-        begin
-          R := SrcColor and $7C00 - Color and $7C00;
-          G := SrcColor and $03E0 - Color and $03E0;
-          B := SrcColor and $001F - Color and $001F;
-          if R > $7C00 then
-            R := 0;
-          if G > $03E0 then
-            G := 0;
-          if B > $001F then
-            B := 0;
-          PUInt16( Addr )^ := R or G or B;
-        end;
-      16 :
-        begin
-          R := SrcColor and $F800 - Color and $F800;
-          G := SrcColor and $07C0 - Color and $07C0;
-          B := SrcColor and $001F - Color and $001F;
-          if R > $F800 then
-            R := 0;
-          if G > $07C0 then
-            G := 0;
-          if B > $001F then
-            B := 0;
-          PUInt16( Addr )^ := R or G or B;
-        end;
-      24 :
-        begin
-          R := SrcColor and $00FF0000 - Color and $00FF0000;
-          G := SrcColor and $0000FF00 - Color and $0000FF00;
-          B := SrcColor and $000000FF - Color and $000000FF;
-          if R > $FF0000 then
-            R := 0;
-          if G > $00FF00 then
-            G := 0;
-          if B > $0000FF then
-            B := 0;
-          PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
-        end;
-      32 :
-        begin
-          R := SrcColor and $00FF0000 - Color and $00FF0000;
-          G := SrcColor and $0000FF00 - Color and $0000FF00;
-          B := SrcColor and $000000FF - Color and $000000FF;
-          if R > $FF0000 then
-            R := 0;
-          if G > $00FF00 then
-            G := 0;
-          if B > $0000FF then
-            B := 0;
-          PUInt32( Addr )^ := R or G or B;
-        end;
-    end;
-  end;
-end;
-// This procedure works on 8, 15, 16, 24 and 32 bits color depth surfaces.
-// In 8 bit color depth mode the procedure works with the default packed
-//  palette (RRRGGGBB). It handles all clipping.
-
-procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits         : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel1 and $E0 + Pixel2 and $E0;
-                G := Pixel1 and $1C + Pixel2 and $1C;
-                B := Pixel1 and $03 + Pixel2 and $03;
-                if R > $E0 then
-                  R := $E0;
-                if G > $1C then
-                  G := $1C;
-                if B > $03 then
-                  B := $03;
-                PUInt8( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt8( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel1 and $7C00 + Pixel2 and $7C00;
-                G := Pixel1 and $03E0 + Pixel2 and $03E0;
-                B := Pixel1 and $001F + Pixel2 and $001F;
-                if R > $7C00 then
-                  R := $7C00;
-                if G > $03E0 then
-                  G := $03E0;
-                if B > $001F then
-                  B := $001F;
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel1 and $F800 + Pixel2 and $F800;
-                G := Pixel1 and $07E0 + Pixel2 and $07E0;
-                B := Pixel1 and $001F + Pixel2 and $001F;
-                if R > $F800 then
-                  R := $F800;
-                if G > $07E0 then
-                  G := $07E0;
-                if B > $001F then
-                  B := $001F;
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel1 and $FF0000 + Pixel2 and $FF0000;
-                G := Pixel1 and $00FF00 + Pixel2 and $00FF00;
-                B := Pixel1 and $0000FF + Pixel2 and $0000FF;
-                if R > $FF0000 then
-                  R := $FF0000;
-                if G > $00FF00 then
-                  G := $00FF00;
-                if B > $0000FF then
-                  B := $0000FF;
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
-              end
-              else
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel1 and $FF0000 + Pixel2 and $FF0000;
-                G := Pixel1 and $00FF00 + Pixel2 and $00FF00;
-                B := Pixel1 and $0000FF + Pixel2 and $0000FF;
-                if R > $FF0000 then
-                  R := $FF0000;
-                if G > $00FF00 then
-                  G := $00FF00;
-                if B > $0000FF then
-                  B := $0000FF;
-                PUInt32( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt32( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits         : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := DestSurface.Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel2 and $E0 - Pixel1 and $E0;
-                G := Pixel2 and $1C - Pixel1 and $1C;
-                B := Pixel2 and $03 - Pixel1 and $03;
-                if R > $E0 then
-                  R := 0;
-                if G > $1C then
-                  G := 0;
-                if B > $03 then
-                  B := 0;
-                PUInt8( DestAddr )^ := R or G or B;
-              end;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel2 and $7C00 - Pixel1 and $7C00;
-                G := Pixel2 and $03E0 - Pixel1 and $03E0;
-                B := Pixel2 and $001F - Pixel1 and $001F;
-                if R > $7C00 then
-                  R := 0;
-                if G > $03E0 then
-                  G := 0;
-                if B > $001F then
-                  B := 0;
-                PUInt16( DestAddr )^ := R or G or B;
-              end;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel2 and $F800 - Pixel1 and $F800;
-                G := Pixel2 and $07E0 - Pixel1 and $07E0;
-                B := Pixel2 and $001F - Pixel1 and $001F;
-                if R > $F800 then
-                  R := 0;
-                if G > $07E0 then
-                  G := 0;
-                if B > $001F then
-                  B := 0;
-                PUInt16( DestAddr )^ := R or G or B;
-              end;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel2 and $FF0000 - Pixel1 and $FF0000;
-                G := Pixel2 and $00FF00 - Pixel1 and $00FF00;
-                B := Pixel2 and $0000FF - Pixel1 and $0000FF;
-                if R > $FF0000 then
-                  R := 0;
-                if G > $00FF00 then
-                  G := 0;
-                if B > $0000FF then
-                  B := 0;
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
-              end;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                R := Pixel2 and $FF0000 - Pixel1 and $FF0000;
-                G := Pixel2 and $00FF00 - Pixel1 and $00FF00;
-                B := Pixel2 and $0000FF - Pixel1 and $0000FF;
-                if R > $FF0000 then
-                  R := 0;
-                if G > $00FF00 then
-                  G := 0;
-                if B > $0000FF then
-                  B := 0;
-                PUInt32( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt32( DestAddr )^ := Pixel2;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
-var
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  TransparentColor, SrcColor : cardinal;
-  BPP          : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    BPP := DestSurface.Format.BytesPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case BPP of
-    1 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt8( SrcAddr )^;
-            if SrcColor <> TransparentColor then
-              PUInt8( DestAddr )^ := SrcColor;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    2 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt16( SrcAddr )^;
-            if SrcColor <> TransparentColor then
-              PUInt16( DestAddr )^ := SrcColor;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    3 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt32( SrcAddr )^ and $FFFFFF;
-            if SrcColor <> TransparentColor then
-              PUInt32( DestAddr )^ := ( PUInt32( DestAddr )^ and $FFFFFF ) or SrcColor;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    4 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt32( SrcAddr )^;
-            if SrcColor <> TransparentColor then
-              PUInt32( DestAddr )^ := SrcColor;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-// TextureRect.w and TextureRect.h are not used.
-// The TextureSurface's size MUST larger than the drawing rectangle!!!
-
-procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
-  TextureRect : PSDL_Rect );
-var
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr, TextAddr : cardinal;
-  _ebx, _esi, _edi, _esp : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod, TextMod : cardinal;
-  SrcColor, TransparentColor, TextureColor : cardinal;
-  BPP          : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    BPP := DestSurface.Format.BitsPerPixel;
-  end;
-  with Texture^ do
-  begin
-    TextAddr := cardinal( Pixels ) + UInt32( TextureRect.y ) * Pitch +
-      UInt32( TextureRect.x ) * Format.BytesPerPixel;
-    TextMod := Pitch - Src.w * Format.BytesPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  SDL_LockSurface( Texture );
-  WorkY := Src.h;
-  case BPP of
-    1 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt8( SrcAddr )^;
-            if SrcColor <> TransparentColor then
-              PUInt8( DestAddr )^ := PUint8( TextAddr )^;
-            inc( SrcAddr );
-            inc( DestAddr );
-            inc( TextAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          inc( TextAddr, TextMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    2 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt16( SrcAddr )^;
-            if SrcColor <> TransparentColor then
-              PUInt16( DestAddr )^ := PUInt16( TextAddr )^;
-            inc( SrcAddr );
-            inc( DestAddr );
-            inc( TextAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          inc( TextAddr, TextMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    3 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt32( SrcAddr )^ and $FFFFFF;
-            if SrcColor <> TransparentColor then
-              PUInt32( DestAddr )^ := ( PUInt32( DestAddr )^ and $FFFFFF ) or ( PUInt32( TextAddr )^ and $FFFFFF );
-            inc( SrcAddr );
-            inc( DestAddr );
-            inc( TextAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          inc( TextAddr, TextMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    4 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            SrcColor := PUInt32( SrcAddr )^;
-            if SrcColor <> TransparentColor then
-              PUInt32( DestAddr )^ := PUInt32( TextAddr )^;
-            inc( SrcAddr );
-            inc( DestAddr );
-            inc( TextAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          inc( TextAddr, TextMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-  SDL_UnlockSurface( Texture );
-end;
-
-procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
-var
-  xc, yc       : cardinal;
-  rx, wx, ry, wy, ry16 : cardinal;
-  color        : cardinal;
-  modx, mody   : cardinal;
-begin
-  // Warning! No checks for surface pointers!!!
-  if srcrect = nil then
-    srcrect := @SrcSurface.clip_rect;
-  if dstrect = nil then
-    dstrect := @DstSurface.clip_rect;
-  if SDL_MustLock( SrcSurface ) then
-    SDL_LockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_LockSurface( DstSurface );
-  modx := trunc( ( srcrect.w / dstrect.w ) * 65536 );
-  mody := trunc( ( srcrect.h / dstrect.h ) * 65536 );
-  //rx := srcrect.x * 65536;
-  ry := srcrect.y * 65536;
-  wy := dstrect.y;
-  for yc := 0 to dstrect.h - 1 do
-  begin
-    rx := srcrect.x * 65536;
-    wx := dstrect.x;
-    ry16 := ry shr 16;
-    for xc := 0 to dstrect.w - 1 do
-    begin
-      color := SDL_GetPixel( SrcSurface, rx shr 16, ry16 );
-      SDL_PutPixel( DstSurface, wx, wy, color );
-      rx := rx + modx;
-      inc( wx );
-    end;
-    ry := ry + mody;
-    inc( wy );
-  end;
-  if SDL_MustLock( SrcSurface ) then
-    SDL_UnlockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_UnlockSurface( DstSurface );
-end;
-// Re-map a rectangular area into an area defined by four vertices
-// Converted from C to Pascal by KiCHY
-
-procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
-const
-  SHIFTS       = 15; // Extend ints to limit round-off error (try 2 - 20)
-  THRESH       = 1 shl SHIFTS; // Threshold for pixel size value
-  procedure CopySourceToDest( UL, UR, LR, LL : TPoint; x1, y1, x2, y2 : cardinal );
-  var
-    tm, lm, rm, bm, m : TPoint;
-    mx, my     : cardinal;
-    cr         : cardinal;
-  begin
-    // Does the destination area specify a single pixel?
-    if ( ( abs( ul.x - ur.x ) < THRESH ) and
-      ( abs( ul.x - lr.x ) < THRESH ) and
-      ( abs( ul.x - ll.x ) < THRESH ) and
-      ( abs( ul.y - ur.y ) < THRESH ) and
-      ( abs( ul.y - lr.y ) < THRESH ) and
-      ( abs( ul.y - ll.y ) < THRESH ) ) then
-    begin // Yes
-      cr := SDL_GetPixel( SrcSurface, ( x1 shr SHIFTS ), ( y1 shr SHIFTS ) );
-      SDL_PutPixel( DstSurface, ( ul.x shr SHIFTS ), ( ul.y shr SHIFTS ), cr );
-    end
-    else
-    begin // No
-      // Quarter the source and the destination, and then recurse
-      tm.x := ( ul.x + ur.x ) shr 1;
-      tm.y := ( ul.y + ur.y ) shr 1;
-      bm.x := ( ll.x + lr.x ) shr 1;
-      bm.y := ( ll.y + lr.y ) shr 1;
-      lm.x := ( ul.x + ll.x ) shr 1;
-      lm.y := ( ul.y + ll.y ) shr 1;
-      rm.x := ( ur.x + lr.x ) shr 1;
-      rm.y := ( ur.y + lr.y ) shr 1;
-      m.x := ( tm.x + bm.x ) shr 1;
-      m.y := ( tm.y + bm.y ) shr 1;
-      mx := ( x1 + x2 ) shr 1;
-      my := ( y1 + y2 ) shr 1;
-      CopySourceToDest( ul, tm, m, lm, x1, y1, mx, my );
-      CopySourceToDest( tm, ur, rm, m, mx, y1, x2, my );
-      CopySourceToDest( m, rm, lr, bm, mx, my, x2, y2 );
-      CopySourceToDest( lm, m, bm, ll, x1, my, mx, y2 );
-    end;
-  end;
-var
-  _UL, _UR, _LR, _LL : TPoint;
-  Rect_x, Rect_y, Rect_w, Rect_h : integer;
-begin
-  if SDL_MustLock( SrcSurface ) then
-    SDL_LockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_LockSurface( DstSurface );
-  if SrcRect = nil then
-  begin
-    Rect_x := 0;
-    Rect_y := 0;
-    Rect_w := ( SrcSurface.w - 1 ) shl SHIFTS;
-    Rect_h := ( SrcSurface.h - 1 ) shl SHIFTS;
-  end
-  else
-  begin
-    Rect_x := SrcRect.x;
-    Rect_y := SrcRect.y;
-    Rect_w := ( SrcRect.w - 1 ) shl SHIFTS;
-    Rect_h := ( SrcRect.h - 1 ) shl SHIFTS;
-  end;
-  // Shift all values to help reduce round-off error.
-  _ul.x := ul.x shl SHIFTS;
-  _ul.y := ul.y shl SHIFTS;
-  _ur.x := ur.x shl SHIFTS;
-  _ur.y := ur.y shl SHIFTS;
-  _lr.x := lr.x shl SHIFTS;
-  _lr.y := lr.y shl SHIFTS;
-  _ll.x := ll.x shl SHIFTS;
-  _ll.y := ll.y shl SHIFTS;
-  CopySourceToDest( _ul, _ur, _lr, _ll, Rect_x, Rect_y, Rect_w, Rect_h );
-  if SDL_MustLock( SrcSurface ) then
-    SDL_UnlockSurface( SrcSurface );
-  if SDL_MustLock( DstSurface ) then
-    SDL_UnlockSurface( DstSurface );
-end;
-
-// Draw a line between x1,y1 and x2,y2 to the given surface
-// NOTE: The surface must be locked before calling this!
-
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-var
-  dx, dy, sdx, sdy, x, y, px, py : integer;
-begin
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-      SDL_PutPixel( DstSurface, px, py, Color );
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-      SDL_PutPixel( DstSurface, px, py, Color );
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-// Draw a dashed line between x1,y1 and x2,y2 to the given surface
-// NOTE: The surface must be locked before calling this!
-
-procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal; DashLength, DashSpace : byte ); overload;
-var
-  dx, dy, sdx, sdy, x, y, px, py, counter : integer; drawdash : boolean;
-begin
-  counter := 0;
-  drawdash := true; //begin line drawing with dash
-
-  //Avoid invalid user-passed dash parameters
-  if ( DashLength < 1 )
-    then
-    DashLength := 1;
-  if ( DashSpace < 1 )
-    then
-    DashSpace := 0;
-
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-
-      //Alternate drawing dashes, or leaving spaces
-      if drawdash then
-      begin
-        SDL_PutPixel( DstSurface, px, py, Color );
-        inc( counter );
-        if ( counter > DashLength - 1 ) and ( DashSpace > 0 ) then
-        begin
-          drawdash := false;
-          counter := 0;
-        end;
-      end
-      else //space
-      begin
-        inc( counter );
-        if counter > DashSpace - 1 then
-        begin
-          drawdash := true;
-          counter := 0;
-        end;
-      end;
-
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-
-      //Alternate drawing dashes, or leaving spaces
-      if drawdash then
-      begin
-        SDL_PutPixel( DstSurface, px, py, Color );
-        inc( counter );
-        if ( counter > DashLength - 1 ) and ( DashSpace > 0 ) then
-        begin
-          drawdash := false;
-          counter := 0;
-        end;
-      end
-      else //space
-      begin
-        inc( counter );
-        if counter > DashSpace - 1 then
-        begin
-          drawdash := true;
-          counter := 0;
-        end;
-      end;
-
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-var
-  dx, dy, sdx, sdy, x, y, px, py : integer;
-begin
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-      SDL_AddPixel( DstSurface, px, py, Color );
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-      SDL_AddPixel( DstSurface, px, py, Color );
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
-  cardinal );
-var
-  dx, dy, sdx, sdy, x, y, px, py : integer;
-begin
-  dx := x2 - x1;
-  dy := y2 - y1;
-  if dx < 0 then
-    sdx := -1
-  else
-    sdx := 1;
-  if dy < 0 then
-    sdy := -1
-  else
-    sdy := 1;
-  dx := sdx * dx + 1;
-  dy := sdy * dy + 1;
-  x := 0;
-  y := 0;
-  px := x1;
-  py := y1;
-  if dx >= dy then
-  begin
-    for x := 0 to dx - 1 do
-    begin
-      SDL_SubPixel( DstSurface, px, py, Color );
-      y := y + dy;
-      if y >= dx then
-      begin
-        y := y - dx;
-        py := py + sdy;
-      end;
-      px := px + sdx;
-    end;
-  end
-  else
-  begin
-    for y := 0 to dy - 1 do
-    begin
-      SDL_SubPixel( DstSurface, px, py, Color );
-      x := x + dx;
-      if x >= dy then
-      begin
-        x := x - dy;
-        px := px + sdx;
-      end;
-      py := py + sdy;
-    end;
-  end;
-end;
-
-// flips a rectangle vertically on given surface
-
-procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-var
-  TmpRect      : TSDL_Rect;
-  Locked       : boolean;
-  y, FlipLength, RowLength : integer;
-  Row1, Row2   : Pointer;
-  OneRow       : TByteArray; // Optimize it if you wish
-begin
-  if DstSurface <> nil then
-  begin
-    if Rect = nil then
-    begin // if Rect=nil then we flip the whole surface
-      TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
-      Rect := @TmpRect;
-    end;
-    FlipLength := Rect^.h shr 1 - 1;
-    RowLength := Rect^.w * DstSurface^.format.BytesPerPixel;
-    if SDL_MustLock( DstSurface ) then
-    begin
-      Locked := true;
-      SDL_LockSurface( DstSurface );
-    end
-    else
-      Locked := false;
-    Row1 := pointer( cardinal( DstSurface^.Pixels ) + UInt32( Rect^.y ) *
-      DstSurface^.Pitch );
-    Row2 := pointer( cardinal( DstSurface^.Pixels ) + ( UInt32( Rect^.y ) + Rect^.h - 1 )
-      * DstSurface^.Pitch );
-    for y := 0 to FlipLength do
-    begin
-      Move( Row1^, OneRow, RowLength );
-      Move( Row2^, Row1^, RowLength );
-      Move( OneRow, Row2^, RowLength );
-      inc( cardinal( Row1 ), DstSurface^.Pitch );
-      dec( cardinal( Row2 ), DstSurface^.Pitch );
-    end;
-    if Locked then
-      SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-// flips a rectangle horizontally on given surface
-
-procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
-type
-  T24bit = packed array[ 0..2 ] of byte;
-  T24bitArray = packed array[ 0..8191 ] of T24bit;
-  P24bitArray = ^T24bitArray;
-  TLongWordArray = array[ 0..8191 ] of LongWord;
-  PLongWordArray = ^TLongWordArray;
-var
-  TmpRect      : TSDL_Rect;
-  Row8bit      : PByteArray;
-  Row16bit     : PWordArray;
-  Row24bit     : P24bitArray;
-  Row32bit     : PLongWordArray;
-  y, x, RightSide, FlipLength : integer;
-  Pixel        : cardinal;
-  Pixel24      : T24bit;
-  Locked       : boolean;
-begin
-  if DstSurface <> nil then
-  begin
-    if Rect = nil then
-    begin
-      TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
-      Rect := @TmpRect;
-    end;
-    FlipLength := Rect^.w shr 1 - 1;
-    if SDL_MustLock( DstSurface ) then
-    begin
-      Locked := true;
-      SDL_LockSurface( DstSurface );
-    end
-    else
-      Locked := false;
-    case DstSurface^.format.BytesPerPixel of
-      1 :
-        begin
-          Row8Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel := Row8Bit^[ x ];
-              Row8Bit^[ x ] := Row8Bit^[ RightSide ];
-              Row8Bit^[ RightSide ] := Pixel;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row8Bit ), DstSurface^.pitch );
-          end;
-        end;
-      2 :
-        begin
-          Row16Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel := Row16Bit^[ x ];
-              Row16Bit^[ x ] := Row16Bit^[ RightSide ];
-              Row16Bit^[ RightSide ] := Pixel;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row16Bit ), DstSurface^.pitch );
-          end;
-        end;
-      3 :
-        begin
-          Row24Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel24 := Row24Bit^[ x ];
-              Row24Bit^[ x ] := Row24Bit^[ RightSide ];
-              Row24Bit^[ RightSide ] := Pixel24;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row24Bit ), DstSurface^.pitch );
-          end;
-        end;
-      4 :
-        begin
-          Row32Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
-            DstSurface^.pitch );
-          for y := 1 to Rect^.h do
-          begin
-            RightSide := Rect^.w - 1;
-            for x := 0 to FlipLength do
-            begin
-              Pixel := Row32Bit^[ x ];
-              Row32Bit^[ x ] := Row32Bit^[ RightSide ];
-              Row32Bit^[ RightSide ] := Pixel;
-              dec( RightSide );
-            end;
-            inc( cardinal( Row32Bit ), DstSurface^.pitch );
-          end;
-        end;
-    end;
-    if Locked then
-      SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-// Use with caution! The procedure allocates memory for TSDL_Rect and return with its pointer.
-// But you MUST free it after you don't need it anymore!!!
-
-function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
-var
-  Rect         : PSDL_Rect;
-begin
-  New( Rect );
-  with Rect^ do
-  begin
-    x := aLeft;
-    y := aTop;
-    w := aWidth;
-    h := aHeight;
-  end;
-  Result := Rect;
-end;
-
-function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect;
-begin
-  with result do
-  begin
-    x := aLeft;
-    y := aTop;
-    w := aWidth;
-    h := aHeight;
-  end;
-end;
-
-function SDLRect( aRect : TRect ) : TSDL_Rect;
-begin
-  with aRect do
-    result := SDLRect( Left, Top, Right - Left, Bottom - Top );
-end;
-
-procedure SDL_Stretch8( Surface, Dst_Surface : PSDL_Surface; x1, x2, y1, y2, yr, yw,
-  depth : integer );
-var
-  dx, dy, e, d, dx2 : integer;
-  src_pitch, dst_pitch : uint16;
-  src_pixels, dst_pixels : PUint8;
-begin
-  if ( yw >= dst_surface^.h ) then
-    exit;
-  dx := ( x2 - x1 );
-  dy := ( y2 - y1 );
-  dy := dy shl 1;
-  e := dy - dx;
-  dx2 := dx shl 1;
-  src_pitch := Surface^.pitch;
-  dst_pitch := dst_surface^.pitch;
-  src_pixels := PUint8( integer( Surface^.pixels ) + yr * src_pitch + y1 * depth );
-  dst_pixels := PUint8( integer( dst_surface^.pixels ) + yw * dst_pitch + x1 *
-    depth );
-  for d := 0 to dx - 1 do
-  begin
-    move( src_pixels^, dst_pixels^, depth );
-    while ( e >= 0 ) do
-    begin
-      inc( src_pixels, depth );
-      e := e - dx2;
-    end;
-    inc( dst_pixels, depth );
-    e := e + dy;
-  end;
-end;
-
-function sign( x : integer ) : integer;
-begin
-  if x > 0 then
-    result := 1
-  else
-    result := -1;
-end;
-
-// Stretches a part of a surface
-
-function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
-  Width, Height : integer ) : PSDL_Surface;
-var
-  dst_surface  : PSDL_Surface;
-  dx, dy, e, d, dx2, srcx2, srcy2 : integer;
-  destx1, desty1 : integer;
-begin
-  srcx2 := srcx1 + SrcW;
-  srcy2 := srcy1 + SrcH;
-  result := nil;
-  destx1 := 0;
-  desty1 := 0;
-  dx := abs( integer( Height - desty1 ) );
-  dy := abs( integer( SrcY2 - SrcY1 ) );
-  e := ( dy shl 1 ) - dx;
-  dx2 := dx shl 1;
-  dy := dy shl 1;
-  dst_surface := SDL_CreateRGBSurface( SDL_HWPALETTE, width - destx1, Height -
-    desty1,
-    SrcSurface^.Format^.BitsPerPixel,
-    SrcSurface^.Format^.RMask,
-    SrcSurface^.Format^.GMask,
-    SrcSurface^.Format^.BMask,
-    SrcSurface^.Format^.AMask );
-  if ( dst_surface^.format^.BytesPerPixel = 1 ) then
-    SDL_SetColors( dst_surface, @SrcSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
-  SDL_SetColorKey( dst_surface, sdl_srccolorkey, SrcSurface^.format^.colorkey );
-  if ( SDL_MustLock( dst_surface ) ) then
-    if ( SDL_LockSurface( dst_surface ) < 0 ) then
-      exit;
-  for d := 0 to dx - 1 do
-  begin
-    SDL_Stretch8( SrcSurface, dst_surface, destx1, Width, SrcX1, SrcX2, SrcY1, desty1,
-      SrcSurface^.format^.BytesPerPixel );
-    while e >= 0 do
-    begin
-      inc( SrcY1 );
-      e := e - dx2;
-    end;
-    inc( desty1 );
-    e := e + dy;
-  end;
-  if SDL_MUSTLOCK( dst_surface ) then
-    SDL_UnlockSurface( dst_surface );
-  result := dst_surface;
-end;
-
-procedure SDL_MoveLine( Surface : PSDL_Surface; x1, x2, y1, xofs, depth : integer );
-var
-  src_pixels, dst_pixels : PUint8;
-  i            : integer;
-begin
-  src_pixels := PUint8( integer( Surface^.pixels ) + Surface^.w * y1 * depth + x2 *
-    depth );
-  dst_pixels := PUint8( integer( Surface^.pixels ) + Surface^.w * y1 * depth + ( x2
-    + xofs ) * depth );
-  for i := x2 downto x1 do
-  begin
-    move( src_pixels^, dst_pixels^, depth );
-    dec( src_pixels );
-    dec( dst_pixels );
-  end;
-end;
-{ Return the pixel value at (x, y)
-NOTE: The surface must be locked before calling this! }
-
-function SDL_GetPixel( SrcSurface : PSDL_Surface; x : integer; y : integer ) : Uint32;
-var
-  bpp          : UInt32;
-  p            : PInteger;
-begin
-  bpp := SrcSurface.format.BytesPerPixel;
-  // Here p is the address to the pixel we want to retrieve
-  p := Pointer( Uint32( SrcSurface.pixels ) + UInt32( y ) * SrcSurface.pitch + UInt32( x ) *
-    bpp );
-  case bpp of
-    1 : result := PUint8( p )^;
-    2 : result := PUint16( p )^;
-    3 :
-      if ( SDL_BYTEORDER = SDL_BIG_ENDIAN ) then
-        result := PUInt8Array( p )[ 0 ] shl 16 or PUInt8Array( p )[ 1 ] shl 8 or
-          PUInt8Array( p )[ 2 ]
-      else
-        result := PUInt8Array( p )[ 0 ] or PUInt8Array( p )[ 1 ] shl 8 or
-          PUInt8Array( p )[ 2 ] shl 16;
-    4 : result := PUint32( p )^;
-  else
-    result := 0; // shouldn't happen, but avoids warnings
-  end;
-end;
-{ Set the pixel at (x, y) to the given value
-  NOTE: The surface must be locked before calling this! }
-
-procedure SDL_PutPixel( DstSurface : PSDL_Surface; x : integer; y : integer; pixel :
-  Uint32 );
-var
-  bpp          : UInt32;
-  p            : PInteger;
-begin
-  bpp := DstSurface.format.BytesPerPixel;
-  p := Pointer( Uint32( DstSurface.pixels ) + UInt32( y ) * DstSurface.pitch + UInt32( x )
-    * bpp );
-  case bpp of
-    1 : PUint8( p )^ := pixel;
-    2 : PUint16( p )^ := pixel;
-    3 :
-      if ( SDL_BYTEORDER = SDL_BIG_ENDIAN ) then
-      begin
-        PUInt8Array( p )[ 0 ] := ( pixel shr 16 ) and $FF;
-        PUInt8Array( p )[ 1 ] := ( pixel shr 8 ) and $FF;
-        PUInt8Array( p )[ 2 ] := pixel and $FF;
-      end
-      else
-      begin
-        PUInt8Array( p )[ 0 ] := pixel and $FF;
-        PUInt8Array( p )[ 1 ] := ( pixel shr 8 ) and $FF;
-        PUInt8Array( p )[ 2 ] := ( pixel shr 16 ) and $FF;
-      end;
-    4 :
-      PUint32( p )^ := pixel;
-  end;
-end;
-
-procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
-var
-  r1, r2       : TSDL_Rect;
-  //buffer: PSDL_Surface;
-  YPos         : Integer;
-begin
-  if ( DstSurface <> nil ) and ( DifY <> 0 ) then
-  begin
-    //if DifY > 0 then // going up
-    //begin
-    ypos := 0;
-    r1.x := 0;
-    r2.x := 0;
-    r1.w := DstSurface.w;
-    r2.w := DstSurface.w;
-    r1.h := DifY;
-    r2.h := DifY;
-    while ypos < DstSurface.h do
-    begin
-      r1.y := ypos;
-      r2.y := ypos + DifY;
-      SDL_BlitSurface( DstSurface, @r2, DstSurface, @r1 );
-      ypos := ypos + DifY;
-    end;
-    //end
-    //else
-    //begin // Going Down
-    //end;
-  end;
-end;
-
-{procedure SDL_ScrollY(Surface: PSDL_Surface; DifY: integer);
-var
-  r1, r2: TSDL_Rect;
-  buffer: PSDL_Surface;
-begin
-  if (Surface <> nil) and (Dify <> 0) then
-  begin
-    buffer := SDL_CreateRGBSurface(SDL_HWSURFACE, (Surface^.w - DifY) * 2,
-      Surface^.h * 2,
-      Surface^.Format^.BitsPerPixel, 0, 0, 0, 0);
-    if buffer <> nil then
-    begin
-      if (buffer^.format^.BytesPerPixel = 1) then
-        SDL_SetColors(buffer, @Surface^.format^.palette^.colors^[0], 0, 256);
-      r1 := SDLRect(0, DifY, buffer^.w, buffer^.h);
-      r2 := SDLRect(0, 0, buffer^.w, buffer^.h);
-      SDL_BlitSurface(Surface, @r1, buffer, @r2);
-      SDL_BlitSurface(buffer, @r2, Surface, @r2);
-      SDL_FreeSurface(buffer);
-    end;
-  end;
-end;}
-
-procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
-var
-  r1, r2       : TSDL_Rect;
-  buffer       : PSDL_Surface;
-begin
-  if ( DstSurface <> nil ) and ( DifX <> 0 ) then
-  begin
-    buffer := SDL_CreateRGBSurface( SDL_HWSURFACE, ( DstSurface^.w - DifX ) * 2,
-      DstSurface^.h * 2,
-      DstSurface^.Format^.BitsPerPixel,
-      DstSurface^.Format^.RMask,
-      DstSurface^.Format^.GMask,
-      DstSurface^.Format^.BMask,
-      DstSurface^.Format^.AMask );
-    if buffer <> nil then
-    begin
-      if ( buffer^.format^.BytesPerPixel = 1 ) then
-        SDL_SetColors( buffer, @DstSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
-      r1 := SDLRect( DifX, 0, buffer^.w, buffer^.h );
-      r2 := SDLRect( 0, 0, buffer^.w, buffer^.h );
-      SDL_BlitSurface( DstSurface, @r1, buffer, @r2 );
-      SDL_BlitSurface( buffer, @r2, DstSurface, @r2 );
-      SDL_FreeSurface( buffer );
-    end;
-  end;
-end;
-
-procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
-var
-  aSin, aCos   : Single;
-  MX, MY, DX, DY, NX, NY, SX, SY, OX, OY, Width, Height, TX, TY, RX, RY, ROX, ROY : Integer;
-  Colour, TempTransparentColour : UInt32;
-  MAXX, MAXY   : Integer;
-begin
-  // Rotate the surface to the target surface.
-  TempTransparentColour := SrcSurface.format.colorkey;
-  {if srcRect.w > srcRect.h then
-  begin
-    Width := srcRect.w;
-    Height := srcRect.w;
-  end
-  else
-  begin
-    Width := srcRect.h;
-    Height := srcRect.h;
-  end; }
-
-  maxx := DstSurface.w;
-  maxy := DstSurface.h;
-  aCos := cos( Angle );
-  aSin := sin( Angle );
-
-  Width := round( abs( srcrect.h * acos ) + abs( srcrect.w * asin ) );
-  Height := round( abs( srcrect.h * asin ) + abs( srcrect.w * acos ) );
-
-  OX := Width div 2;
-  OY := Height div 2; ;
-  MX := ( srcRect.x + ( srcRect.x + srcRect.w ) ) div 2;
-  MY := ( srcRect.y + ( srcRect.y + srcRect.h ) ) div 2;
-  ROX := ( -( srcRect.w div 2 ) ) + Offsetx;
-  ROY := ( -( srcRect.h div 2 ) ) + OffsetY;
-  Tx := ox + round( ROX * aSin - ROY * aCos );
-  Ty := oy + round( ROY * aSin + ROX * aCos );
-  SX := 0;
-  for DX := DestX - TX to DestX - TX + ( width ) do
-  begin
-    Inc( SX );
-    SY := 0;
-    for DY := DestY - TY to DestY - TY + ( Height ) do
-    begin
-      RX := SX - OX;
-      RY := SY - OY;
-      NX := round( mx + RX * aSin + RY * aCos ); //
-      NY := round( my + RY * aSin - RX * aCos ); //
-      // Used for testing only
-     //SDL_PutPixel(DestSurface.SDLSurfacePointer,DX,DY,0);
-      if ( ( DX > 0 ) and ( DX < MAXX ) ) and ( ( DY > 0 ) and ( DY < MAXY ) ) then
-      begin
-        if ( NX >= srcRect.x ) and ( NX <= srcRect.x + srcRect.w ) then
-        begin
-          if ( NY >= srcRect.y ) and ( NY <= srcRect.y + srcRect.h ) then
-          begin
-            Colour := SDL_GetPixel( SrcSurface, NX, NY );
-            if Colour <> TempTransparentColour then
-            begin
-              SDL_PutPixel( DstSurface, DX, DY, Colour );
-            end;
-          end;
-        end;
-      end;
-      inc( SY );
-    end;
-  end;
-end;
-
-procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
-  PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
-begin
-  SDL_RotateRad( DstSurface, SrcSurface, SrcRect, DestX, DestY, OffsetX, OffsetY, DegToRad( Angle ) );
-end;
-
-function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
-var
-  RealRect     : TSDL_Rect;
-  OutOfRange   : Boolean;
-begin
-  OutOfRange := false;
-  if dstrect = nil then
-  begin
-    RealRect.x := 0;
-    RealRect.y := 0;
-    RealRect.w := DstSurface.w;
-    RealRect.h := DstSurface.h;
-  end
-  else
-  begin
-    if dstrect.x < DstSurface.w then
-    begin
-      RealRect.x := dstrect.x;
-    end
-    else if dstrect.x < 0 then
-    begin
-      realrect.x := 0;
-    end
-    else
-    begin
-      OutOfRange := True;
-    end;
-    if dstrect.y < DstSurface.h then
-    begin
-      RealRect.y := dstrect.y;
-    end
-    else if dstrect.y < 0 then
-    begin
-      realrect.y := 0;
-    end
-    else
-    begin
-      OutOfRange := True;
-    end;
-    if OutOfRange = False then
-    begin
-      if realrect.x + dstrect.w <= DstSurface.w then
-      begin
-        RealRect.w := dstrect.w;
-      end
-      else
-      begin
-        RealRect.w := dstrect.w - realrect.x;
-      end;
-      if realrect.y + dstrect.h <= DstSurface.h then
-      begin
-        RealRect.h := dstrect.h;
-      end
-      else
-      begin
-        RealRect.h := dstrect.h - realrect.y;
-      end;
-    end;
-  end;
-  if OutOfRange = False then
-  begin
-    result := realrect;
-  end
-  else
-  begin
-    realrect.w := 0;
-    realrect.h := 0;
-    realrect.x := 0;
-    realrect.y := 0;
-    result := realrect;
-  end;
-end;
-
-procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-var
-  RealRect     : TSDL_Rect;
-  Addr         : pointer;
-  ModX, BPP    : cardinal;
-  x, y, R, G, B, SrcColor : cardinal;
-begin
-  RealRect := ValidateSurfaceRect( DstSurface, DstRect );
-  if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
-  begin
-    SDL_LockSurface( DstSurface );
-    BPP := DstSurface.format.BytesPerPixel;
-    with DstSurface^ do
-    begin
-      Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
-      ModX := Pitch - UInt32( RealRect.w ) * BPP;
-    end;
-    case DstSurface.format.BitsPerPixel of
-      8 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $E0 + Color and $E0;
-              G := SrcColor and $1C + Color and $1C;
-              B := SrcColor and $03 + Color and $03;
-              if R > $E0 then
-                R := $E0;
-              if G > $1C then
-                G := $1C;
-              if B > $03 then
-                B := $03;
-              PUInt8( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      15 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $7C00 + Color and $7C00;
-              G := SrcColor and $03E0 + Color and $03E0;
-              B := SrcColor and $001F + Color and $001F;
-              if R > $7C00 then
-                R := $7C00;
-              if G > $03E0 then
-                G := $03E0;
-              if B > $001F then
-                B := $001F;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      16 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $F800 + Color and $F800;
-              G := SrcColor and $07C0 + Color and $07C0;
-              B := SrcColor and $001F + Color and $001F;
-              if R > $F800 then
-                R := $F800;
-              if G > $07C0 then
-                G := $07C0;
-              if B > $001F then
-                B := $001F;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      24 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 + Color and $00FF0000;
-              G := SrcColor and $0000FF00 + Color and $0000FF00;
-              B := SrcColor and $000000FF + Color and $000000FF;
-              if R > $FF0000 then
-                R := $FF0000;
-              if G > $00FF00 then
-                G := $00FF00;
-              if B > $0000FF then
-                B := $0000FF;
-              PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      32 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 + Color and $00FF0000;
-              G := SrcColor and $0000FF00 + Color and $0000FF00;
-              B := SrcColor and $000000FF + Color and $000000FF;
-              if R > $FF0000 then
-                R := $FF0000;
-              if G > $00FF00 then
-                G := $00FF00;
-              if B > $0000FF then
-                B := $0000FF;
-              PUInt32( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-    end;
-    SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
-var
-  RealRect     : TSDL_Rect;
-  Addr         : pointer;
-  ModX, BPP    : cardinal;
-  x, y, R, G, B, SrcColor : cardinal;
-begin
-  RealRect := ValidateSurfaceRect( DstSurface, DstRect );
-  if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
-  begin
-    SDL_LockSurface( DstSurface );
-    BPP := DstSurface.format.BytesPerPixel;
-    with DstSurface^ do
-    begin
-      Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
-      ModX := Pitch - UInt32( RealRect.w ) * BPP;
-    end;
-    case DstSurface.format.BitsPerPixel of
-      8 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $E0 - Color and $E0;
-              G := SrcColor and $1C - Color and $1C;
-              B := SrcColor and $03 - Color and $03;
-              if R > $E0 then
-                R := 0;
-              if G > $1C then
-                G := 0;
-              if B > $03 then
-                B := 0;
-              PUInt8( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      15 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $7C00 - Color and $7C00;
-              G := SrcColor and $03E0 - Color and $03E0;
-              B := SrcColor and $001F - Color and $001F;
-              if R > $7C00 then
-                R := 0;
-              if G > $03E0 then
-                G := 0;
-              if B > $001F then
-                B := 0;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      16 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $F800 - Color and $F800;
-              G := SrcColor and $07C0 - Color and $07C0;
-              B := SrcColor and $001F - Color and $001F;
-              if R > $F800 then
-                R := 0;
-              if G > $07C0 then
-                G := 0;
-              if B > $001F then
-                B := 0;
-              PUInt16( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      24 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 - Color and $00FF0000;
-              G := SrcColor and $0000FF00 - Color and $0000FF00;
-              B := SrcColor and $000000FF - Color and $000000FF;
-              if R > $FF0000 then
-                R := 0;
-              if G > $00FF00 then
-                G := 0;
-              if B > $0000FF then
-                B := 0;
-              PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-      32 :
-        begin
-          for y := 0 to RealRect.h - 1 do
-          begin
-            for x := 0 to RealRect.w - 1 do
-            begin
-              SrcColor := PUInt32( Addr )^;
-              R := SrcColor and $00FF0000 - Color and $00FF0000;
-              G := SrcColor and $0000FF00 - Color and $0000FF00;
-              B := SrcColor and $000000FF - Color and $000000FF;
-              if R > $FF0000 then
-                R := 0;
-              if G > $00FF00 then
-                G := 0;
-              if B > $0000FF then
-                B := 0;
-              PUInt32( Addr )^ := R or G or B;
-              inc( UInt32( Addr ), BPP );
-            end;
-            inc( UInt32( Addr ), ModX );
-          end;
-        end;
-    end;
-    SDL_UnlockSurface( DstSurface );
-  end;
-end;
-
-procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
-var
-  FBC          : array[ 0..255 ] of Cardinal;
-  // temp vars
-  i, YR, YG, YB, SR, SG, SB, DR, DG, DB : Integer;
-
-  TempStepV, TempStepH : Single;
-  TempLeft, TempTop, TempHeight, TempWidth : integer;
-  TempRect     : TSDL_Rect;
-
-begin
-  // calc FBC
-  YR := StartColor.r;
-  YG := StartColor.g;
-  YB := StartColor.b;
-  SR := YR;
-  SG := YG;
-  SB := YB;
-  DR := EndColor.r - SR;
-  DG := EndColor.g - SG;
-  DB := EndColor.b - SB;
-
-  for i := 0 to 255 do
-  begin
-    FBC[ i ] := SDL_MapRGB( DstSurface.format, YR, YG, YB );
-    YR := SR + round( DR / 255 * i );
-    YG := SG + round( DG / 255 * i );
-    YB := SB + round( DB / 255 * i );
-  end;
-
-  //  if aStyle = 1 then begin
-  TempStepH := Rect.w / 255;
-  TempStepV := Rect.h / 255;
-  TempHeight := Trunc( TempStepV + 1 );
-  TempWidth := Trunc( TempStepH + 1 );
-  TempTop := 0;
-  TempLeft := 0;
-  TempRect.x := Rect.x;
-  TempRect.y := Rect.y;
-  TempRect.h := Rect.h;
-  TempRect.w := Rect.w;
-
-  case Style of
-    gsHorizontal :
-      begin
-        TempRect.h := TempHeight;
-        for i := 0 to 255 do
-        begin
-          TempRect.y := Rect.y + TempTop;
-          SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
-          TempTop := Trunc( TempStepV * i );
-        end;
-      end;
-    gsVertical :
-      begin
-        TempRect.w := TempWidth;
-        for i := 0 to 255 do
-        begin
-          TempRect.x := Rect.x + TempLeft;
-          SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
-          TempLeft := Trunc( TempStepH * i );
-        end;
-      end;
-  end;
-end;
-
-procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
-var
-  ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
-  SrcPitch, DestPitch, x, y : UInt32;
-begin
-  if ( Src = nil ) or ( Dest = nil ) then
-    exit;
-  if ( Src.w shl 1 ) < Dest.w then
-    exit;
-  if ( Src.h shl 1 ) < Dest.h then
-    exit;
-
-  if SDL_MustLock( Src ) then
-    SDL_LockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_LockSurface( Dest );
-
-  ReadRow := UInt32( Src.Pixels );
-  WriteRow := UInt32( Dest.Pixels );
-
-  SrcPitch := Src.pitch;
-  DestPitch := Dest.pitch;
-
-  case Src.format.BytesPerPixel of
-    1 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt8( WriteAddr )^ := PUInt8( ReadAddr )^;
-          PUInt8( WriteAddr + 1 )^ := PUInt8( ReadAddr )^;
-          PUInt8( WriteAddr + DestPitch )^ := PUInt8( ReadAddr )^;
-          PUInt8( WriteAddr + DestPitch + 1 )^ := PUInt8( ReadAddr )^;
-          inc( ReadAddr );
-          inc( WriteAddr, 2 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    2 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt16( WriteAddr )^ := PUInt16( ReadAddr )^;
-          PUInt16( WriteAddr + 2 )^ := PUInt16( ReadAddr )^;
-          PUInt16( WriteAddr + DestPitch )^ := PUInt16( ReadAddr )^;
-          PUInt16( WriteAddr + DestPitch + 2 )^ := PUInt16( ReadAddr )^;
-          inc( ReadAddr, 2 );
-          inc( WriteAddr, 4 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    3 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt32( WriteAddr )^ := ( PUInt32( WriteAddr )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          PUInt32( WriteAddr + 3 )^ := ( PUInt32( WriteAddr + 3 )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          PUInt32( WriteAddr + DestPitch )^ := ( PUInt32( WriteAddr + DestPitch )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          PUInt32( WriteAddr + DestPitch + 3 )^ := ( PUInt32( WriteAddr + DestPitch + 3 )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          inc( ReadAddr, 3 );
-          inc( WriteAddr, 6 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    4 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt32( WriteAddr )^ := PUInt32( ReadAddr )^;
-          PUInt32( WriteAddr + 4 )^ := PUInt32( ReadAddr )^;
-          PUInt32( WriteAddr + DestPitch )^ := PUInt32( ReadAddr )^;
-          PUInt32( WriteAddr + DestPitch + 4 )^ := PUInt32( ReadAddr )^;
-          inc( ReadAddr, 4 );
-          inc( WriteAddr, 8 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-  end;
-
-  if SDL_MustLock( Src ) then
-    SDL_UnlockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_UnlockSurface( Dest );
-end;
-
-procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
-var
-  ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
-  SrcPitch, DestPitch, x, y : UInt32;
-begin
-  if ( Src = nil ) or ( Dest = nil ) then
-    exit;
-  if ( Src.w shl 1 ) < Dest.w then
-    exit;
-  if ( Src.h shl 1 ) < Dest.h then
-    exit;
-
-  if SDL_MustLock( Src ) then
-    SDL_LockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_LockSurface( Dest );
-
-  ReadRow := UInt32( Src.Pixels );
-  WriteRow := UInt32( Dest.Pixels );
-
-  SrcPitch := Src.pitch;
-  DestPitch := Dest.pitch;
-
-  case Src.format.BytesPerPixel of
-    1 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt8( WriteAddr )^ := PUInt8( ReadAddr )^;
-          PUInt8( WriteAddr + 1 )^ := PUInt8( ReadAddr )^;
-          inc( ReadAddr );
-          inc( WriteAddr, 2 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    2 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt16( WriteAddr )^ := PUInt16( ReadAddr )^;
-          PUInt16( WriteAddr + 2 )^ := PUInt16( ReadAddr )^;
-          inc( ReadAddr, 2 );
-          inc( WriteAddr, 4 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    3 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt32( WriteAddr )^ := ( PUInt32( WriteAddr )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          PUInt32( WriteAddr + 3 )^ := ( PUInt32( WriteAddr + 3 )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          inc( ReadAddr, 3 );
-          inc( WriteAddr, 6 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    4 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          PUInt32( WriteAddr )^ := PUInt32( ReadAddr )^;
-          PUInt32( WriteAddr + 4 )^ := PUInt32( ReadAddr )^;
-          inc( ReadAddr, 4 );
-          inc( WriteAddr, 8 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-  end;
-
-  if SDL_MustLock( Src ) then
-    SDL_UnlockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_UnlockSurface( Dest );
-end;
-
-procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
-var
-  ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
-  SrcPitch, DestPitch, x, y, Color : UInt32;
-begin
-  if ( Src = nil ) or ( Dest = nil ) then
-    exit;
-  if ( Src.w shl 1 ) < Dest.w then
-    exit;
-  if ( Src.h shl 1 ) < Dest.h then
-    exit;
-
-  if SDL_MustLock( Src ) then
-    SDL_LockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_LockSurface( Dest );
-
-  ReadRow := UInt32( Src.Pixels );
-  WriteRow := UInt32( Dest.Pixels );
-
-  SrcPitch := Src.pitch;
-  DestPitch := Dest.pitch;
-
-  case Src.format.BitsPerPixel of
-    8 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          Color := PUInt8( ReadAddr )^;
-          PUInt8( WriteAddr )^ := Color;
-          PUInt8( WriteAddr + 1 )^ := Color;
-          Color := ( Color shr 1 ) and $6D; {%01101101}
-          PUInt8( WriteAddr + DestPitch )^ := Color;
-          PUInt8( WriteAddr + DestPitch + 1 )^ := Color;
-          inc( ReadAddr );
-          inc( WriteAddr, 2 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    15 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          Color := PUInt16( ReadAddr )^;
-          PUInt16( WriteAddr )^ := Color;
-          PUInt16( WriteAddr + 2 )^ := Color;
-          Color := ( Color shr 1 ) and $3DEF; {%0011110111101111}
-          PUInt16( WriteAddr + DestPitch )^ := Color;
-          PUInt16( WriteAddr + DestPitch + 2 )^ := Color;
-          inc( ReadAddr, 2 );
-          inc( WriteAddr, 4 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    16 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          Color := PUInt16( ReadAddr )^;
-          PUInt16( WriteAddr )^ := Color;
-          PUInt16( WriteAddr + 2 )^ := Color;
-          Color := ( Color shr 1 ) and $7BEF; {%0111101111101111}
-          PUInt16( WriteAddr + DestPitch )^ := Color;
-          PUInt16( WriteAddr + DestPitch + 2 )^ := Color;
-          inc( ReadAddr, 2 );
-          inc( WriteAddr, 4 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    24 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          Color := ( PUInt32( WriteAddr )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
-          PUInt32( WriteAddr )^ := Color;
-          PUInt32( WriteAddr + 3 )^ := Color;
-          Color := ( Color shr 1 ) and $007F7F7F; {%011111110111111101111111}
-          PUInt32( WriteAddr + DestPitch )^ := Color;
-          PUInt32( WriteAddr + DestPitch + 3 )^ := Color;
-          inc( ReadAddr, 3 );
-          inc( WriteAddr, 6 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-    32 : for y := 1 to Src.h do
-      begin
-        ReadAddr := ReadRow;
-        WriteAddr := WriteRow;
-        for x := 1 to Src.w do
-        begin
-          Color := PUInt32( ReadAddr )^;
-          PUInt32( WriteAddr )^ := Color;
-          PUInt32( WriteAddr + 4 )^ := Color;
-          Color := ( Color shr 1 ) and $7F7F7F7F;
-          PUInt32( WriteAddr + DestPitch )^ := Color;
-          PUInt32( WriteAddr + DestPitch + 4 )^ := Color;
-          inc( ReadAddr, 4 );
-          inc( WriteAddr, 8 );
-        end;
-        inc( UInt32( ReadRow ), SrcPitch );
-        inc( UInt32( WriteRow ), DestPitch * 2 );
-      end;
-  end;
-
-  if SDL_MustLock( Src ) then
-    SDL_UnlockSurface( Src );
-  if SDL_MustLock( Dest ) then
-    SDL_UnlockSurface( Dest );
-end;
-
-function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 :
-  PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
-  boolean;
-var
-  Src_Rect1, Src_Rect2 : TSDL_Rect;
-  right1, bottom1 : integer;
-  right2, bottom2 : integer;
-  Scan1Start, {Scan2Start,} ScanWidth, ScanHeight : cardinal;
-  Mod1         : cardinal;
-  Addr1        : cardinal;
-  BPP          : cardinal;
-  Pitch1       : cardinal;
-  TransparentColor1 : cardinal;
-  tx, ty       : cardinal;
-  StartTick    : cardinal;
-  Color1       : cardinal;
-begin
-  Result := false;
-  if SrcRect1 = nil then
-  begin
-    with Src_Rect1 do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface1.w;
-      h := SrcSurface1.h;
-    end;
-  end
-  else
-    Src_Rect1 := SrcRect1^;
-
-  Src_Rect2 := SrcRect2^;
-  with Src_Rect1 do
-  begin
-    Right1 := Left1 + w;
-    Bottom1 := Top1 + h;
-  end;
-  with Src_Rect2 do
-  begin
-    Right2 := Left2 + w;
-    Bottom2 := Top2 + h;
-  end;
-  if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( Bottom1 <= Top2 ) then
-    exit;
-  if Left1 <= Left2 then
-  begin
-    // 1. left, 2. right
-    Scan1Start := Src_Rect1.x + Left2 - Left1;
-    //Scan2Start := Src_Rect2.x;
-    ScanWidth := Right1 - Left2;
-    with Src_Rect2 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end
-  else
-  begin
-    // 1. right, 2. left
-    Scan1Start := Src_Rect1.x;
-    //Scan2Start := Src_Rect2.x + Left1 - Left2;
-    ScanWidth := Right2 - Left1;
-    with Src_Rect1 do
-      if ScanWidth > w then
-        ScanWidth := w;
-  end;
-  with SrcSurface1^ do
-  begin
-    Pitch1 := Pitch;
-    Addr1 := cardinal( Pixels );
-    inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
-    with format^ do
-    begin
-      BPP := BytesPerPixel;
-      TransparentColor1 := colorkey;
-    end;
-  end;
-
-  Mod1 := Pitch1 - ( ScanWidth * BPP );
-
-  inc( Addr1, BPP * Scan1Start );
-
-  if Top1 <= Top2 then
-  begin
-    // 1. up, 2. down
-    ScanHeight := Bottom1 - Top2;
-    if ScanHeight > Src_Rect2.h then
-      ScanHeight := Src_Rect2.h;
-    inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
-  end
-  else
-  begin
-    // 1. down, 2. up
-    ScanHeight := Bottom2 - Top1;
-    if ScanHeight > Src_Rect1.h then
-      ScanHeight := Src_Rect1.h;
-
-  end;
-  case BPP of
-    1 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PByte( Addr1 )^ <> TransparentColor1 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-    2 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PWord( Addr1 )^ <> TransparentColor1 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 2 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-    3 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
-
-          if ( Color1 <> TransparentColor1 )
-            then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 3 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-    4 :
-      for ty := 1 to ScanHeight do
-      begin
-        for tx := 1 to ScanWidth do
-        begin
-          if ( PLongWord( Addr1 )^ <> TransparentColor1 ) then
-          begin
-            Result := true;
-            exit;
-          end;
-          inc( Addr1, 4 );
-
-        end;
-        inc( Addr1, Mod1 );
-
-      end;
-  end;
-end;
-
-procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits         : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              PUInt8( DestAddr )^ := Pixel2 or Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-
-              PUInt16( DestAddr )^ := Pixel2 or Pixel1;
-
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-
-              PUInt16( DestAddr )^ := Pixel2 or Pixel1;
-
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-
-              PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel2 or Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-
-              PUInt32( DestAddr )^ := Pixel2 or Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits         : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              PUInt8( DestAddr )^ := Pixel2 and Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-
-              PUInt16( DestAddr )^ := Pixel2 and Pixel1;
-
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-
-              PUInt16( DestAddr )^ := Pixel2 and Pixel1;
-
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-
-              PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel2 and Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-
-              PUInt32( DestAddr )^ := Pixel2 and Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-
-
-procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits         : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                if Pixel2 and $E0 > Pixel1 and $E0 then
-                  R := Pixel2 and $E0
-                else
-                  R := Pixel1 and $E0;
-                if Pixel2 and $1C > Pixel1 and $1C then
-                  G := Pixel2 and $1C
-                else
-                  G := Pixel1 and $1C;
-                if Pixel2 and $03 > Pixel1 and $03 then
-                  B := Pixel2 and $03
-                else
-                  B := Pixel1 and $03;
-
-                if R > $E0 then
-                  R := $E0;
-                if G > $1C then
-                  G := $1C;
-                if B > $03 then
-                  B := $03;
-                PUInt8( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt8( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $7C00 > Pixel1 and $7C00 then
-                  R := Pixel2 and $7C00
-                else
-                  R := Pixel1 and $7C00;
-                if Pixel2 and $03E0 > Pixel1 and $03E0 then
-                  G := Pixel2 and $03E0
-                else
-                  G := Pixel1 and $03E0;
-                if Pixel2 and $001F > Pixel1 and $001F then
-                  B := Pixel2 and $001F
-                else
-                  B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $F800 > Pixel1 and $F800 then
-                  R := Pixel2 and $F800
-                else
-                  R := Pixel1 and $F800;
-                if Pixel2 and $07E0 > Pixel1 and $07E0 then
-                  G := Pixel2 and $07E0
-                else
-                  G := Pixel1 and $07E0;
-                if Pixel2 and $001F > Pixel1 and $001F then
-                  B := Pixel2 and $001F
-                else
-                  B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $FF0000 > Pixel1 and $FF0000 then
-                  R := Pixel2 and $FF0000
-                else
-                  R := Pixel1 and $FF0000;
-                if Pixel2 and $00FF00 > Pixel1 and $00FF00 then
-                  G := Pixel2 and $00FF00
-                else
-                  G := Pixel1 and $00FF00;
-                if Pixel2 and $0000FF > Pixel1 and $0000FF then
-                  B := Pixel2 and $0000FF
-                else
-                  B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
-              end
-              else
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $FF0000 > Pixel1 and $FF0000 then
-                  R := Pixel2 and $FF0000
-                else
-                  R := Pixel1 and $FF0000;
-                if Pixel2 and $00FF00 > Pixel1 and $00FF00 then
-                  G := Pixel2 and $00FF00
-                else
-                  G := Pixel1 and $00FF00;
-                if Pixel2 and $0000FF > Pixel1 and $0000FF then
-                  B := Pixel2 and $0000FF
-                else
-                  B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt32( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-
-procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
-  DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
-var
-  R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
-  Src, Dest    : TSDL_Rect;
-  Diff         : integer;
-  SrcAddr, DestAddr : cardinal;
-  WorkX, WorkY : word;
-  SrcMod, DestMod : cardinal;
-  Bits         : cardinal;
-begin
-  if ( SrcSurface = nil ) or ( DestSurface = nil ) then
-    exit; // Remove this to make it faster
-  if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
-    exit; // Remove this to make it faster
-  if SrcRect = nil then
-  begin
-    with Src do
-    begin
-      x := 0;
-      y := 0;
-      w := SrcSurface.w;
-      h := SrcSurface.h;
-    end;
-  end
-  else
-    Src := SrcRect^;
-  if DestRect = nil then
-  begin
-    Dest.x := 0;
-    Dest.y := 0;
-  end
-  else
-    Dest := DestRect^;
-  Dest.w := Src.w;
-  Dest.h := Src.h;
-  with DestSurface.Clip_Rect do
-  begin
-    // Source's right side is greater than the dest.cliprect
-    if Dest.x + Src.w > x + w then
-    begin
-      smallint( Src.w ) := x + w - Dest.x;
-      smallint( Dest.w ) := x + w - Dest.x;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's bottom side is greater than the dest.clip
-    if Dest.y + Src.h > y + h then
-    begin
-      smallint( Src.h ) := y + h - Dest.y;
-      smallint( Dest.h ) := y + h - Dest.y;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-    // Source's left side is less than the dest.clip
-    if Dest.x < x then
-    begin
-      Diff := x - Dest.x;
-      Src.x := Src.x + Diff;
-      smallint( Src.w ) := smallint( Src.w ) - Diff;
-      Dest.x := x;
-      smallint( Dest.w ) := smallint( Dest.w ) - Diff;
-      if smallint( Dest.w ) < 1 then
-        exit;
-    end;
-    // Source's Top side is less than the dest.clip
-    if Dest.y < y then
-    begin
-      Diff := y - Dest.y;
-      Src.y := Src.y + Diff;
-      smallint( Src.h ) := smallint( Src.h ) - Diff;
-      Dest.y := y;
-      smallint( Dest.h ) := smallint( Dest.h ) - Diff;
-      if smallint( Dest.h ) < 1 then
-        exit;
-    end;
-  end;
-  with SrcSurface^ do
-  begin
-    SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
-      Format.BytesPerPixel;
-    SrcMod := Pitch - Src.w * Format.BytesPerPixel;
-    TransparentColor := Format.colorkey;
-  end;
-  with DestSurface^ do
-  begin
-    DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
-      Format.BytesPerPixel;
-    DestMod := Pitch - Dest.w * Format.BytesPerPixel;
-    Bits := Format.BitsPerPixel;
-  end;
-  SDL_LockSurface( SrcSurface );
-  SDL_LockSurface( DestSurface );
-  WorkY := Src.h;
-  case bits of
-    8 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt8( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt8( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-                if Pixel2 and $E0 < Pixel1 and $E0 then
-                  R := Pixel2 and $E0
-                else
-                  R := Pixel1 and $E0;
-                if Pixel2 and $1C < Pixel1 and $1C then
-                  G := Pixel2 and $1C
-                else
-                  G := Pixel1 and $1C;
-                if Pixel2 and $03 < Pixel1 and $03 then
-                  B := Pixel2 and $03
-                else
-                  B := Pixel1 and $03;
-
-                if R > $E0 then
-                  R := $E0;
-                if G > $1C then
-                  G := $1C;
-                if B > $03 then
-                  B := $03;
-                PUInt8( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt8( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr );
-            inc( DestAddr );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    15 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $7C00 < Pixel1 and $7C00 then
-                  R := Pixel2 and $7C00
-                else
-                  R := Pixel1 and $7C00;
-                if Pixel2 and $03E0 < Pixel1 and $03E0 then
-                  G := Pixel2 and $03E0
-                else
-                  G := Pixel1 and $03E0;
-                if Pixel2 and $001F < Pixel1 and $001F then
-                  B := Pixel2 and $001F
-                else
-                  B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    16 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt16( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt16( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $F800 < Pixel1 and $F800 then
-                  R := Pixel2 and $F800
-                else
-                  R := Pixel1 and $F800;
-                if Pixel2 and $07E0 < Pixel1 and $07E0 then
-                  G := Pixel2 and $07E0
-                else
-                  G := Pixel1 and $07E0;
-                if Pixel2 and $001F < Pixel1 and $001F then
-                  B := Pixel2 and $001F
-                else
-                  B := Pixel1 and $001F;
-
-                PUInt16( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt16( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 2 );
-            inc( DestAddr, 2 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    24 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $FF0000 < Pixel1 and $FF0000 then
-                  R := Pixel2 and $FF0000
-                else
-                  R := Pixel1 and $FF0000;
-                if Pixel2 and $00FF00 < Pixel1 and $00FF00 then
-                  G := Pixel2 and $00FF00
-                else
-                  G := Pixel1 and $00FF00;
-                if Pixel2 and $0000FF < Pixel1 and $0000FF then
-                  B := Pixel2 and $0000FF
-                else
-                  B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
-              end
-              else
-                PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
-            end;
-            inc( SrcAddr, 3 );
-            inc( DestAddr, 3 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-    32 :
-      begin
-        repeat
-          WorkX := Src.w;
-          repeat
-            Pixel1 := PUInt32( SrcAddr )^;
-            if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
-            begin
-              Pixel2 := PUInt32( DestAddr )^;
-              if Pixel2 > 0 then
-              begin
-
-                if Pixel2 and $FF0000 < Pixel1 and $FF0000 then
-                  R := Pixel2 and $FF0000
-                else
-                  R := Pixel1 and $FF0000;
-                if Pixel2 and $00FF00 < Pixel1 and $00FF00 then
-                  G := Pixel2 and $00FF00
-                else
-                  G := Pixel1 and $00FF00;
-                if Pixel2 and $0000FF < Pixel1 and $0000FF then
-                  B := Pixel2 and $0000FF
-                else
-                  B := Pixel1 and $0000FF;
-
-                PUInt32( DestAddr )^ := R or G or B;
-              end
-              else
-                PUInt32( DestAddr )^ := Pixel1;
-            end;
-            inc( SrcAddr, 4 );
-            inc( DestAddr, 4 );
-            dec( WorkX );
-          until WorkX = 0;
-          inc( SrcAddr, SrcMod );
-          inc( DestAddr, DestMod );
-          dec( WorkY );
-        until WorkY = 0;
-      end;
-  end;
-  SDL_UnlockSurface( SrcSurface );
-  SDL_UnlockSurface( DestSurface );
-end;
-
-// Will clip the x1,x2,y1,x2 params to the ClipRect provided
-
-function SDL_ClipLine( var x1, y1, x2, y2 : Integer; ClipRect : PSDL_Rect ) : boolean;
-var
-  tflag, flag1, flag2 : word;
-  txy, xedge, yedge : Integer;
-  slope        : single;
-
-  function ClipCode( x, y : Integer ) : word;
-  begin
-    Result := 0;
-    if x < ClipRect.x then
-      Result := 1;
-    if x >= ClipRect.w + ClipRect.x then
-      Result := Result or 2;
-    if y < ClipRect.y then
-      Result := Result or 4;
-    if y >= ClipRect.h + ClipRect.y then
-      Result := Result or 8;
-  end;
-
-begin
-  flag1 := ClipCode( x1, y1 );
-  flag2 := ClipCode( x2, y2 );
-  result := true;
-
-  while true do
-  begin
-    if ( flag1 or flag2 ) = 0 then
-      Exit; // all in
-
-    if ( flag1 and flag2 ) <> 0 then
-    begin
-      result := false;
-      Exit; // all out
-    end;
-
-    if flag2 = 0 then
-    begin
-      txy := x1; x1 := x2; x2 := txy;
-      txy := y1; y1 := y2; y2 := txy;
-      tflag := flag1; flag1 := flag2; flag2 := tflag;
-    end;
-
-    if ( flag2 and 3 ) <> 0 then
-    begin
-      if ( flag2 and 1 ) <> 0 then
-        xedge := ClipRect.x
-      else
-        xedge := ClipRect.w + ClipRect.x - 1; // back 1 pixel otherwise we end up in a loop
-
-      slope := ( y2 - y1 ) / ( x2 - x1 );
-      y2 := y1 + Round( slope * ( xedge - x1 ) );
-      x2 := xedge;
-    end
-    else
-    begin
-      if ( flag2 and 4 ) <> 0 then
-        yedge := ClipRect.y
-      else
-        yedge := ClipRect.h + ClipRect.y - 1; // up 1 pixel otherwise we end up in a loop
-
-      slope := ( x2 - x1 ) / ( y2 - y1 );
-      x2 := x1 + Round( slope * ( yedge - y1 ) );
-      y2 := yedge;
-    end;
-
-    flag2 := ClipCode( x2, y2 );
-  end;
-end;
-
-end.
-

+ 0 - 487
packages/extra/sdl/sdlweb.pas

@@ -1,487 +0,0 @@
-unit sdlweb;
-{******************************************************************************}
-{
-  $Id: sdlweb.pas,v 1.2 2005/01/02 19:03:15 savage Exp $
-  
-}
-{                                                                              }
-{       Borland Delphi SDL_Net - A x-platform network library for use with SDL.}
-{       Conversion of the Simple DirectMedia Layer Network Headers             }
-{                                                                              }
-{ Portions created by Sam Lantinga <[email protected]> are                }
-{ Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga                     }
-{ 5635-34 Springhouse Dr.                                                      }
-{ Pleasanton, CA 94588 (USA)                                                   }
-{                                                                              }
-{ All Rights Reserved.                                                         }
-{                                                                              }
-{ The original files are : SDL_net.h                                           }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dean Ellis <[email protected]>                                      }
-{                                                                              }
-{ Portions created by Dean Ellis are                                           }
-{ Copyright (C) 2000 - 2001 Dean Ellis.                                        }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   sdl.pas and sdl_net.pas somehere in your search path                       }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }                                                                       
-{
-  $Log: sdlweb.pas,v $
-  Revision 1.2  2005/01/02 19:03:15  savage
-  Slight Bug fix due to stray closed comment ( Thanks Michalis Kamburelis )
-
-  Revision 1.1  2004/12/31 00:30:12  savage
-  Initial release of Dean's excellent SDL Web classes. Demo coming soon.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  SysUtils,
-  sdl,
-  sdl_net;
-
-const
-  MAX_TIMEOUT = 5000;
-
-type
-
-  TWebConnection = ( wcDefault, wcHTTP, wcFTP );
-  TWebProgressEvent = procedure( Progress, Total : UInt32 ); cdecl;
-
-  TSDLWebConnection = record
-    Host : TIPAddress;
-    HostName, Proxy : string;
-    Port : UInt32;
-    Socket : PTCPSocket;
-    Type_ : TWebConnection;
-    IsProxy : Boolean;
-    ProxyUser, ProxyPassword : string;
-  end;
-
-procedure SDLWeb_Init;
-procedure SDLWeb_Quit;
-  // Connection Functions
-function SDLWeb_ConnectToSite( URL : string; AType : TWebConnection;
-  var Connection : TSDLWebConnection ) : Boolean;
-function SDLWeb_ConnectToSiteViaProxy( URL, Proxy, Username, Password : string; AType : TWebConnection;
-  var Connection : TSDLWebConnection ) : Boolean;
-function SDLWeb_Connected( var Connection : TSDLWebConnection ) : Boolean;
-procedure SDLWeb_Disconnect( var Connection : TSDLWebConnection );
-function SDLWeb_SendRequest( var Connection : TSDLWebConnection;
-  Request : string ) : Boolean;
-function SDLWeb_ReadResponse( var Connection : TSDLWebConnection;
-  var Response : string ) : UInt32;
-
-  // Utility Functions
-function SDLWeb_IPToString( ip : TIPAddress ) : string;
-function SDLWeb_StringToIP( ip : string ) : TIPAddress;
-function SDLWeb_Pos( const SubString, Source : string; Count : SInt32 ) : SInt32;
-procedure SDLWeb_ParseURL( const url : string; var proto, user, pass, host, port, path : string );
-
-function SDLWeb_EncodeBase64( Value : string ) : string;
-function SDLWeb_DecodeBase64( Value : string ) : string;
-
-implementation
-
-const
-  DefaultPorts : array[ TWebConnection ] of UInt32 = ( 80, 80, 21 );
-
-procedure SDLWeb_Init;
-begin
-  SDLNet_Init;
-end;
-
-procedure SDLWeb_Quit;
-begin
-  SDLNet_Quit;
-end;
-
-function SDLWeb_ConnectToSite( URL : string; AType : TWebConnection;
-  var Connection : TSDLWebConnection ) : Boolean;
-var
-  Protocol, User, Password, Host, Port, Path : string;
-begin
-  Result := False;
-  SDLWeb_ParseURL( URL, Protocol, User, Password, Host, Port, Path );
-  Connection.IsProxy := False;
-  Connection.HostName := Host;
-  if SDLNet_ResolveHost( Connection.Host, PChar( Host ), DefaultPorts[ AType ] ) = 0 then
-  begin
-    Connection.Socket := SDLNet_TCP_Open( Connection.Host );
-    Connection.Port := DefaultPorts[ AType ];
-    if AType = wcDefault then
-    begin
-      if UpperCase( Protocol ) = 'HTTP' then
-        Connection.Type_ := wcHTTP;
-      if UpperCase( Protocol ) = 'FTP' then
-        Connection.Type_ := wcFTP;
-    end
-    else
-      Connection.Type_ := AType;
-    Result := SDLWeb_Connected( Connection );
-  end;
-end;
-
-function SDLWeb_ConnectToSiteViaProxy( URL, Proxy, Username, Password : string; AType : TWebConnection;
-  var Connection : TSDLWebConnection ) : Boolean;
-begin
-  Result := SDLWeb_ConnectToSite( Proxy, AType, Connection );
-  if Result then
-  begin
-    Connection.Proxy := Proxy;
-    Connection.HostName := URL;
-    Connection.ProxyUser := Username;
-    Connection.ProxyPassword := Password;
-    Connection.IsProxy := True;
-  end;
-end;
-
-function SDLWeb_Connected( var Connection : TSDLWebConnection ) : Boolean;
-begin
-  Result := Connection.Socket <> nil;
-end;
-
-procedure SDLWeb_Disconnect( var Connection : TSDLWebConnection );
-begin
-  SDLNet_TCP_Close( Connection.Socket );
-  Connection.Socket := nil;
-end;
-
-function SDLWeb_SendRequest( var Connection : TSDLWebConnection;
-  Request : string ) : Boolean;
-var
-  Error, Len : UInt32;
-  cdata : array[ 0..255 ] of char;
-begin
-  StrPCopy( cdata, Request + #13#10 );
-  Len := StrLen( cdata );
-  Error := SDLNet_TCP_Send( Connection.Socket, @cdata, Len );
-  Result := Error = Len;
-end;
-
-function SDLWeb_ReadResponse( var Connection : TSDLWebConnection;
-  var Response : string ) : UInt32;
-
-var
-  SocketSet : PSDLNet_SocketSet;
-
-  function ReadLine : string;
-  var
-    Done : Boolean;
-    C : Char;
-    Error, SocketResult : Sint32;
-  begin
-    Result := EmptyStr;
-    Done := False;
-    SDLNet_TCP_AddSocket( SocketSet, Connection.Socket );
-    while not Done do
-    begin
-      SocketResult := SDLNet_CheckSockets( SocketSet, MAX_TIMEOUT );
-      if ( SocketResult <= 0 ) then
-      begin
-        Result := 'HTTP/1.1 400 Socket Timeout';
-        Exit;
-      end;
-      if SDLNet_SocketReady( PSDLNet_GenericSocket( Connection.Socket ) ) then
-      begin
-        Error := SDLNet_TCP_Recv( Connection.Socket, @C, 1 );
-        Done := ( Error < 1 );
-        if C = #13 then
-        else if C = #10 then
-          Done := True
-        else
-          Result := Result + C;
-      end;
-    end;
-  end;
-
-begin
-  SocketSet := SDLNet_AllocSocketSet( 1 );
-  try
-    Response := ReadLine;
-    Result := Length( Response );
-  finally
-    SDLNet_FreeSocketSet( SocketSet );
-  end;
-end;
-
-function SDLWeb_IPToString( ip : TIPAddress ) : string;
-var
-  IpAddress : UInt32;
-begin
-  IpAddress := SDL_Swap32( ip.host );
-  // output the IP address nicely
-  Result := format( '%d.%d.%d.%d', [ IpAddress shr 24, ( IpAddress shr 16 ) and $000000FF,
-    ( IpAddress shr 8 ) and $000000FF, IpAddress and $000000FF ] );
-end;
-
-function SDLWeb_StringToIP( ip : string ) : TIPAddress;
-begin
-  SDLNet_ResolveHost( Result, PChar( ip ), 0 );
-end;
-
-function SDLWeb_Pos( const SubString, Source : string; Count : SInt32 ) : SInt32;
-var
-  i, h, last : integer;
-  u : string;
-begin
-  u := Source;
-  if count > 0 then
-  begin
-    result := length( Source );
-    for i := 1 to count do
-    begin
-      h := pos( SubString, u );
-      if h > 0 then
-        u := copy( u, pos( SubString, u ) + 1, length( u ) )
-      else
-      begin
-        u := '';
-        inc( result );
-      end;
-    end;
-    result := result - length( u );
-  end
-  else if count < 0 then
-  begin
-    last := 0;
-    for i := length( Source ) downto 1 do
-    begin
-      u := copy( Source, i, length( Source ) );
-      h := pos( SubString, u );
-      if ( h <> 0 ) and ( h + i <> last ) then
-      begin
-        last := h + i - 1;
-        inc( count );
-        if count = 0 then
-          BREAK;
-      end;
-    end;
-    if count = 0 then
-      result := last
-    else
-      result := 0;
-  end
-  else
-    result := 0;
-end;
-
-procedure SDLWeb_ParseURL( const url : string; var proto, user, pass, host, port, path : string );
-var
-  p, p2 : integer;
-  s : string;
-begin
-  host := '';
-  path := '';
-  proto := 'http';
-  port := '80';
-  p := Pos( '://', url );
-  if p > 0 then
-  begin
-    // get protocol
-    proto := Copy( url, 1, p - 1 );
-    inc( p, 2 );
-    s := copy( url, p + 1, length( url ) );
-    // get path
-    p := pos( '/', s );
-    if p = 0 then
-      p := length( s ) + 1;
-    path := copy( s, p, length( s ) );
-    s := copy( s, 1, p - 1 );
-    // get host
-    p := pos( ':', s );
-    if p > Length( s ) then
-      p := 0;
-    p2 := SDLWeb_Pos( '@', s, -1 );
-    if p2 > length( s ) then
-      p2 := 0;
-    if ( p = 0 ) and ( p2 = 0 ) then
-    begin (* no user, password or port *)
-      host := s;
-      exit;
-    end
-    else if p2 < p then
-    begin (* a port given *)
-      port := copy( s, p + 1, length( s ) );
-      host := copy( s, p2 + 1, p - p2 - 1 );
-      if p2 = 0 then
-        exit; (* no user, password *)
-      s := copy( s, 1, p2 - 1 );
-    end
-    else
-    begin
-      host := copy( s, p2 + 1, length( s ) );
-      s := copy( s, 1, p2 - 1 );
-    end;
-    p := pos( ':', s );
-    if p = 0 then
-      user := s
-    else
-    begin
-      user := copy( s, 1, p - 1 );
-      pass := copy( s, p + 1, length( s ) );
-    end;
-  end;
-end;
-
-
-function SDLWeb_EncodeBase64( Value : string ) : string;
-var
-  Position, Total, Remaining : Integer;
-  InBlock : array[ 0..2 ] of Byte;
-  OutBlock : array[ 0..3 ] of Char;
-const
-  Base64Chars : array[ 0..63 ] of Char = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
-    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
-    'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
-    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0',
-    '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' );
-begin
-  Result := '';
-
-  Total := Length( Value );
-
-  Position := 1;
-
-  while True do
-  begin
-    Remaining := Total - Position + 1;
-
-    if Remaining <= 0 then
-      Break;
-
-    FillChar( InBlock, SizeOf( InBlock ), #0 );
-
-    InBlock[ 0 ] := Ord( Value[ Position + 0 ] );
-    if Remaining >= 2 then
-      InBlock[ 1 ] := Ord( Value[ Position + 1 ] );
-    if Remaining >= 3 then
-      InBlock[ 2 ] := Ord( Value[ Position + 2 ] );
-    Inc( Position, 3 );
-
-    FillChar( OutBlock, SizeOf( OutBlock ), '=' );
-
-    OutBlock[ 0 ] := Base64Chars[ ( InBlock[ 0 ] and $FC ) shr 2 ];
-    OutBlock[ 1 ] := Base64Chars[ ( ( InBlock[ 0 ] and $03 ) shl 4 ) or
-      ( ( InBlock[ 1 ] and $F0 ) shr 4 ) ];
-    if Remaining >= 2 then
-      OutBlock[ 2 ] := Base64Chars[ ( ( InBlock[ 1 ] and $0F ) shl 2 ) or
-        ( ( InBlock[ 2 ] and $C0 ) shr 6 ) ];
-    if Remaining >= 3 then
-      OutBlock[ 3 ] := Base64Chars[ InBlock[ 2 ] and $3F ];
-
-    Result := Result + OutBlock;
-  end;
-end;
-
-function SDLWeb_DecodeBase64( Value : string ) : string;
-var
-  Position, Total, Remaining : Integer;
-  InBlock : array[ 0..3 ] of Byte;
-  OutBlock : array[ 0..2 ] of Char;
-
-  function Base64Ord( Value : Char ) : Byte;
-  const
-    BASE64_FIRST_UPPER = 0;
-    BASE64_FIRST_LOWER = 26;
-    BASE64_FIRST_NUMBER = 52;
-    BASE64_PLUS = 62;
-    BASE64_SLASH = 63;
-  begin
-    if ( Ord( Value ) >= Ord( 'A' ) ) and ( Ord( Value ) <= Ord( 'Z' ) ) then
-      Result := Ord( Value ) - Ord( 'A' ) + BASE64_FIRST_UPPER
-    else if ( Ord( Value ) >= Ord( 'a' ) ) and ( Ord( Value ) <= Ord( 'z' ) ) then
-      Result := Ord( Value ) - Ord( 'a' ) + BASE64_FIRST_LOWER
-    else if ( Ord( Value ) >= Ord( '0' ) ) and ( Ord( Value ) <= Ord( '9' ) ) then
-      Result := Ord( Value ) - Ord( '0' ) + BASE64_FIRST_NUMBER
-    else if Ord( Value ) = Ord( '+' ) then
-      Result := BASE64_PLUS
-    else if Ord( Value ) = Ord( '/' ) then
-      Result := BASE64_SLASH
-    else
-      Result := 0;
-  end;
-
-begin
-  Result := '';
-
-  Total := Length( Value );
-
-  Position := 1;
-
-  while True do
-  begin
-    Remaining := Total - Position + 1;
-
-    if Remaining <= 0 then
-      Break;
-
-    FillChar( InBlock, SizeOf( InBlock ), #0 );
-
-    InBlock[ 0 ] := Base64Ord( Value[ Position + 0 ] );
-    if Remaining >= 2 then
-      InBlock[ 1 ] := Base64Ord( Value[ Position + 1 ] );
-    if Remaining >= 3 then
-      InBlock[ 2 ] := Base64Ord( Value[ Position + 2 ] );
-    if Remaining >= 4 then
-      InBlock[ 3 ] := Base64Ord( Value[ Position + 3 ] );
-    Inc( Position, 4 );
-
-    OutBlock[ 0 ] := Chr( ( ( InBlock[ 0 ] and $3F ) shl 2 ) or
-      ( ( InBlock[ 1 ] and $30 ) shr 4 ) );
-    OutBlock[ 1 ] := Chr( ( ( InBlock[ 1 ] and $0F ) shl 4 ) or
-      ( ( InBlock[ 2 ] and $3C ) shr 2 ) );
-    OutBlock[ 2 ] := Chr( ( ( InBlock[ 2 ] and $03 ) shl 6 ) or
-      ( InBlock[ 3 ] and $3F ) );
-
-    Result := Result + OutBlock;
-  end;
-end;
-
-end.
-

+ 0 - 333
packages/extra/sdl/sdlwebftp.pas

@@ -1,333 +0,0 @@
-unit sdlwebftp;
-{******************************************************************************}
-{
-  $Id: sdlwebftp.pas,v 1.2 2005/01/02 19:03:15 savage Exp $
-  
-}
-{                                                                              }
-{       Borland Delphi SDL_Net - A x-platform network library for use with SDL.}
-{       Conversion of the Simple DirectMedia Layer Network Headers             }
-{                                                                              }
-{ Portions created by Sam Lantinga <[email protected]> are                }
-{ Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga                     }
-{ 5635-34 Springhouse Dr.                                                      }
-{ Pleasanton, CA 94588 (USA)                                                   }
-{                                                                              }
-{ All Rights Reserved.                                                         }
-{                                                                              }
-{ The original files are : SDL_net.h                                           }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dean Ellis <[email protected]>                                      }
-{                                                                              }
-{ Portions created by Dean Ellis are                                           }
-{ Copyright (C) 2000 - 2001 Dean Ellis.                                        }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   sdlweb.pas somehere in your search path                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }                                                                              
-{
-  $Log: sdlwebftp.pas,v $
-  Revision 1.2  2005/01/02 19:03:15  savage
-  Slight Bug fix due to stray closed comment ( Thanks Michalis Kamburelis )
-
-  Revision 1.1  2004/12/31 00:30:14  savage
-  Initial release of Dean's excellent SDL Web classes. Demo coming soon.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  Classes,
-  sdlweb;
-
-type
-  TFTPFiletype = ( ftNone, ftDir, ftFile, ftLink );
-  TFTPRemoteFile = record
-    Type_ : TFTPFiletype;
-    Size : integer;
-    Name : string;
-    Datetime : TDateTime;
-  end;
-
-  TFTPRemoteDirectory = TStringList;
-//  TFTPRemoteDirectory = record
-//    Files:array of TFTPRemoteFile;
-//    DirectoryName: string;
-//  end;
-
-  TFTPDownloadProgress = procedure( Position, Max : Integer );
-
-function SDLWeb_FTP_Login( var Connection : TSDLWebConnection;
-  Username, Password : string; DirectoryInfo : TFTPRemoteDirectory ) : Boolean;
-function SDLWeb_FTP_Logout( var Connection : TSDLWebConnection ) : Boolean;
-function SDLWeb_FTP_GetDirectory( var Connection : TSDLWebConnection;
-  ADirectory : string; DirectoryInfo : TFTPRemoteDirectory ) : Boolean;
-function SDLWeb_FTP_ChangeDirectory( var Connection : TSDLWebConnection;
-  ADirectory : string ) : Boolean;
-function SDLWeb_FTP_DownloadToStream( var Connection : TSDLWebConnection;
-  AFilename : string; var Download : TStream; Progress : TFTPDownloadProgress = nil ) : Boolean;
-
-implementation
-
-uses
-  SysUtils,
-  sdl_net;
-
-function ReadFTPStatus( var Connection : TSDLWebConnection; var Status : Integer; var Data : string ) : Boolean;
-var
-  S : string;
-begin
-  SDLWeb_ReadResponse( Connection, S );
-  Status := StrToInt( Copy( S, 1, 3 ) );
-  Data := Copy( S, 5, Length( S ) );
-  Result := Status <= 400;
-end;
-
-{------------------------------------------------------------------------------}
-{Extracts Port and IP data from the string provided usially in
- <text> (128,0,0,0,7,534) }
-{------------------------------------------------------------------------------}
-
-procedure ExtractIPAndPort( Data : string; var IP : string; var Port : integer );
-var
-  s : string;
-  po : integer;
-begin
-  s := copy( Data, pos( '(', Data ) + 1, length( Data ) );
-  s := copy( s, 1, pos( ')', s ) - 1 );
-  // get the 4th , this is the end of the IP address
-  po := SDLWeb_Pos( ',', s, 4 );
-  IP := copy( s, 1, po - 1 );
-  IP := StringReplace( IP, ',', '.', [ rfReplaceAll ] );
-  s := copy( s, po + 1, length( s ) );
-  Port := strtoint( copy( s, 1, pos( ',', s ) - 1 ) ) * 256
-    + strtoint( copy( s, pos( ',', s ) + 1, length( s ) ) );
-end;
-
-function GetFTPDataSocket( var Connection : TSDLWebConnection ) : PTCPSocket;
-var
-  Status, Port : Integer;
-  Data, IP : string;
-  DataIP : TIPAddress;
-begin
-  Result := nil;
-  SDLWeb_SendRequest( Connection, 'PASV' );
-  if ReadFTPStatus( Connection, Status, Data ) then
-  begin
-    ExtractIPAndPort( Data, IP, Port );
-    if SDLNet_ResolveHost( DataIP, PChar( IP ), Port ) = 0 then
-      Result := SDLNet_TCP_Open( DataIP );
-  end;
-end;
-
-function SDLWeb_FTP_Login( var Connection : TSDLWebConnection;
-  Username, Password : string; DirectoryInfo : TFTPRemoteDirectory ) : Boolean;
-var
-  Status : Integer;
-  Data : string;
-begin
-  Result := False;
-  if Connection.Type_ <> wcFTP then
-    Exit;
-  if not ReadFTPStatus( Connection, Status, Data ) then
-    Exit;
-  SDLWeb_SendRequest( Connection, 'USER ftp' );
-  if not ReadFTPStatus( Connection, Status, Data ) then
-    Exit;
-  SDLWeb_SendRequest( Connection, 'PASS ' );
-  if ReadFTPStatus( Connection, Status, Data ) then
-  begin
-    SDLWeb_SendRequest( Connection, 'TYPE I' );
-    if not ReadFTPStatus( Connection, Status, Data ) then
-      Exit;
-    if DirectoryInfo <> nil then
-      Result := SDLWeb_FTP_GetDirectory( Connection, '.', DirectoryInfo )
-    else
-      Result := True;
-  end;
-end;
-
-function SDLWeb_FTP_Logout( var Connection : TSDLWebConnection ) : Boolean;
-var
-  Status : Integer;
-  Data : string;
-begin
-  SDLWeb_SendRequest( Connection, 'QUIT' );
-  Result := ReadFTPStatus( Connection, Status, Data );
-end;
-
-function ReadFTPData( var Socket : PTCPSocket; var Dest : TStream; var Buffer : Pointer ) : Boolean;
-var
-  i, l : integer;
-  lp : Pointer;
-begin
-  l := SDLNet_TCP_Recv( Socket, Buffer, 1024 );
-  Result := l > 0;
-  lp := Buffer;
-  if Result then
-  begin
-    while l > 0 do
-    begin
-       //i := 0;
-      i := Dest.Write( lp^, l );
-      dec( l, i );
-      lp := pointer( longint( lp ) + i );
-    end;
-  end;
-end;
-
-function SDLWeb_FTP_GetDirectory( var Connection : TSDLWebConnection;
-  ADirectory : string; DirectoryInfo : TFTPRemoteDirectory ) : Boolean;
-var
-  Status : Integer;
-  Data : string;
-  Buffer : Pointer;
-  DirectoryStream : TStream;
-  DataSocket : PTCPSocket;
-
-begin
-  Result := False;
-  if ADirectory = EmptyStr then
-    Exit;
-
-  DataSocket := GetFTPDataSocket( Connection );
-  if DataSocket = nil then
-    Exit;
-  try
-    SDLWeb_SendRequest( Connection, 'TYPE A' );
-    if ReadFTPStatus( Connection, Status, Data ) then
-    begin
-      SDLWeb_SendRequest( Connection, 'LIST ' + ADirectory );
-      if ReadFTPStatus( Connection, Status, Data ) then
-      begin
-        GetMem( Buffer, 1024 );
-        DirectoryStream := TMemoryStream.Create;
-        try
-          while ReadFTPData( DataSocket, DirectoryStream, Buffer ) do
-            ;
-          if ReadFTPStatus( Connection, Status, Data ) then
-          begin
-            SDLWeb_SendRequest( Connection, 'TYPE I' );
-            Result := ReadFTPStatus( Connection, Status, Data );
-            DirectoryStream.Position := 0;
-            DirectoryInfo.Clear;
-            DirectoryInfo.LoadFromStream( DirectoryStream );
-          end;
-        finally
-          DirectoryStream.Free;
-          FreeMem( Buffer );
-        end;
-      end;
-    end;
-  finally
-    SDLNet_TCP_Close( DataSocket );
-  end;
-end;
-
-function SDLWeb_FTP_ChangeDirectory( var Connection : TSDLWebConnection;
-  ADirectory : string ) : Boolean;
-var
-  Status : Integer;
-  Data : string;
-begin
-  SDLWeb_SendRequest( Connection, 'CWD ' + ADirectory );
-  Result := ReadFTPStatus( Connection, Status, Data );
-end;
-
-function SDLWeb_FTP_DownloadToStream( var Connection : TSDLWebConnection;
-  AFilename : string; var Download : TStream; Progress : TFTPDownloadProgress = nil ) : Boolean;
-var
-  Status, FileSize : Integer;
-  Data : string;
-  DataSocket : PTCPSocket;
-  Buffer : Pointer;
-
-  procedure DoProgress;
-  begin
-    if Assigned( Progress ) then
-      Progress( Download.Position, FileSize );
-  end;
-
-begin
-// Download a file to a stream
-  Result := False;
-  SDLWeb_SendRequest( Connection, 'SIZE ' + AFilename );
-  if ReadFTPStatus( Connection, Status, Data ) then
-  begin
-    FileSize := StrToInt( Data );
-    DataSocket := GetFTPDataSocket( Connection );
-    if DataSocket = nil then
-      Exit;
-    try
-      SDLWeb_SendRequest( Connection, 'RETR ' + AFilename );
-      if ReadFTPStatus( Connection, Status, Data ) then
-      begin
-        GetMem( Buffer, 1024 );
-        if Download = nil then
-          Download := TMemoryStream.Create;
-        try
-          DoProgress;
-          while ReadFTPData( DataSocket, Download, Buffer ) do
-            DoProgress;
-          if ReadFTPStatus( Connection, Status, Data ) then
-          begin
-            SDLWeb_SendRequest( Connection, 'TYPE I' );
-            Result := ReadFTPStatus( Connection, Status, Data );
-            DoProgress;
-            Download.Position := 0;
-          end;
-        finally
-          FreeMem( Buffer );
-        end;
-      end;
-    finally
-      SDLNet_TCP_Close( DataSocket );
-    end;
-  end;
-end;
-
-end.

+ 0 - 624
packages/extra/sdl/sdlwebhttp.pas

@@ -1,624 +0,0 @@
-unit sdlwebhttp;
-{******************************************************************************}
-{
-  $Id: sdlwebhttp.pas,v 1.2 2005/01/02 19:03:15 savage Exp $
-  
-}
-{                                                                              }
-{       Borland Delphi SDL_Net - A x-platform network library for use with SDL.}
-{       Conversion of the Simple DirectMedia Layer Network Headers             }
-{                                                                              }
-{ Portions created by Sam Lantinga <[email protected]> are                }
-{ Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga                     }
-{ 5635-34 Springhouse Dr.                                                      }
-{ Pleasanton, CA 94588 (USA)                                                   }
-{                                                                              }
-{ All Rights Reserved.                                                         }
-{                                                                              }
-{ The original files are : SDL_net.h                                           }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dean Ellis <[email protected]>                                      }
-{                                                                              }
-{ Portions created by Dean Ellis are                                           }
-{ Copyright (C) 2000 - 2001 Dean Ellis.                                        }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   sdlweb.pas somehere in your search path                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }                                                                          
-{
-  $Log: sdlwebhttp.pas,v $
-  Revision 1.2  2005/01/02 19:03:15  savage
-  Slight Bug fix due to stray closed comment ( Thanks Michalis Kamburelis )
-
-  Revision 1.1  2004/12/31 00:30:14  savage
-  Initial release of Dean's excellent SDL Web classes. Demo coming soon.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  Classes,
-  sdlweb;
-
-
-type
-  TContentEncoding = ( ceNone, cegzip, cedeflate, ceform, cexml );
-  TContentEncodings = set of TContentEncoding;
-  TTransferEncoding = ( teNone, teChunked );
-  TResponseResult = ( rsOK, rsError, rsProxyAutheticate );
-
-function SDL_Web_HTTP_GetPageToString( var Connection : TSDLWebConnection;
-  Page : string; var Response : string; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceNone ) : Boolean;
-function SDL_Web_HTTP_GetPageToStream( var Connection : TSDLWebConnection;
-  Page : string; var AResponse : TStream; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceNone ) : Boolean;
-function SDL_Web_HTTP_PostString( var Connection : TSDLWebConnection;
-  TargetPage : string; Post : string; var Response : string; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceform ) : Boolean;
-function SDL_Web_HTTP_PostStream( var Connection : TSDLWebConnection;
-  TargetPage : string; APost : TStream; var AResponse : TStream; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceform ) : Boolean;
-
-implementation
-
-uses
-  SysUtils,
-  sdl_net;
-
-const
-  MAX_BUFFER_SIZE = 1024;
-  HTTP_VER = '1.1';
-
-type
-  THTTPResponse = record
-    Status : Integer;
-    ServerType : string;
-    ContentLength : Integer;
-    ContentType : string;
-    ContentEncoding : TContentEncoding;
-    TransferEncoding : TTransferEncoding;
-    Closed : Boolean;
-  end;
-
-  THTTPRequest = record
-    Host : string;
-    Username : string;
-    Password : string;
-    Length : Integer;
-  end;
-
-var
-  Response : THTTPResponse;
-  Request : THTTPRequest;
-
-{------------------------------------------------------------------------------}
-{Sends a HTTP Request to the Connection}
-{------------------------------------------------------------------------------}
-
-procedure SendHTTPRequest( var Connection : TSDLWebConnection; Method, Version, Page : string; Encoding : TContentEncoding = ceNone );
-const
-  ContentEncoding : array[ TContentEncoding ] of string = ( '', 'gzip', 'deflate', 'application/x-www-form-urlencoded', 'text/xml' );
-begin
-  if SDLWeb_Connected( Connection ) then
-  begin
-    if not Connection.IsProxy then
-      SDLWeb_SendRequest( Connection, Method + ' ' + Page + ' HTTP/' + Version );
-    if Version = '1.1' then
-    begin
-      if not Connection.IsProxy then
-        SDLWeb_SendRequest( Connection, 'Host: ' + Connection.HostName )
-      else
-      begin
-        SDLWeb_SendRequest( Connection, Method + ' http://' + Connection.HostName + Page + ' HTTP/' + Version );
-        SDLWeb_SendRequest( Connection, 'Host: ' + Connection.Proxy );
-      end;
-
-      if Method = 'GET' then
-      begin
-        SDLWeb_SendRequest( Connection, 'Accept: text/html, text/xml, text/txt, application/zip, application/x-zip-compressed, */*' );
-        SDLWeb_SendRequest( Connection, 'Accept-CharSet: *' );
-        SDLWeb_SendRequest( Connection, 'Accept-Language: en' );
-        SDLWeb_SendRequest( Connection, 'User-Agent: SDLWeb/1.0' );
-        SDLWeb_SendRequest( Connection, 'Cache-Control: no-store, no-cache' );
-        SDLWeb_SendRequest( Connection, 'Pragma: no-cache' );
-      end;
-      if Encoding <> ceNone then
-        SDLWeb_SendRequest( Connection, 'Accept-Encoding: ' + ContentEncoding[ Encoding ] );
-      if Connection.IsProxy then
-      begin
-
-        SDLWeb_SendRequest( Connection, 'Proxy-Authorization: Basic ' +
-          SDLWeb_EncodeBase64( Connection.ProxyUser + ':' + Connection.ProxyPassword ) );
-      end;
-    end;
-    if Method = 'POST' then
-    begin
-      SDLWeb_SendRequest( Connection, 'Content-Encoding: ' + ContentEncoding[ Encoding ] );
-      SDLWeb_SendRequest( Connection, 'Content-Length:' + IntToStr( Request.Length ) );
-    end;
-    SDLWeb_SendRequest( Connection, EmptyStr );
-  end;
-end;
-
-{------------------------------------------------------------------------------}
-{Reads a HTTP Response from the Connection}
-{------------------------------------------------------------------------------}
-
-function ReadHTTPResponse( var Connection : TSDLWebConnection; var Error : string ) : TResponseResult;
-var
-  s, text : string;
-  status : integer;
-begin
-  Result := rsOK;
-  //status := 0;
-  Response.Status := 0;
-  Response.ServerType := EmptyStr;
-  Response.ContentType := EmptyStr;
-  Response.ContentLength := -1;
-  Response.ContentEncoding := ceNone;
-  Response.TransferEncoding := teNone;
-  repeat
-    SDLWeb_ReadResponse( Connection, S );
-    if ( CompareText( copy( s, 1, 8 ), 'HTTP/1.1' ) = 0 ) or
-      ( CompareText( copy( s, 1, 8 ), 'HTTP/1.0' ) = 0 ) then
-    begin
-      status := StrToInt( copy( s, 10, 3 ) );
-      text := copy( s, 14, length( s ) );
-      Response.Status := status;
-      if status >= 400 then
-      begin
-        Result := rsError;
-        if not Connection.IsProxy then
-          Break;
-        if CompareText( copy( s, 1, 19 ), 'Proxy-Authenticate:' ) = 0 then
-        begin
-            // get the proxy authenticate method BASIC and resend the request.
-          Result := rsProxyAutheticate;
-        end;
-      end;
-    end;
-    if CompareText( copy( s, 1, 7 ), 'Server:' ) = 0 then
-    begin
-      Response.ServerType := copy( s, 8, 255 );
-    end;
-    if CompareText( copy( s, 1, 11 ), 'Connection:' ) = 0 then
-    begin
-      Response.Closed := CompareText( copy( s, 13, 255 ), 'Close' ) = 0;
-    end;
-    if CompareText( copy( s, 1, 15 ), 'Content-Length:' ) = 0 then
-    begin
-      Response.ContentLength := StrToInt( copy( s, 16, 255 ) );
-    end;
-    if CompareText( copy( s, 1, 13 ), 'Content-Type:' ) = 0 then
-    begin
-      Response.ContentType := copy( s, 14, 255 );
-    end;
-    if CompareText( copy( s, 1, 17 ), 'Content-Encoding:' ) = 0 then
-    begin
-      if Pos( 'gzip', copy( s, 18, 255 ) ) > 0 then
-        Response.ContentEncoding := cegzip;
-      if Pos( 'deflate', copy( s, 18, 255 ) ) > 0 then
-        Response.ContentEncoding := cedeflate;
-    end;
-    if CompareText( copy( s, 1, 18 ), 'Transfer-Encoding:' ) = 0 then
-    begin
-      if Pos( 'chunked', copy( s, 19, 255 ) ) > 0 then
-        Response.TransferEncoding := teChunked;
-    end;
-  until S = EmptyStr;
-  Error := Text;
-end;
-
-{------------------------------------------------------------------------------}
-{Reads a file from the HTTP Server into a string}
-{------------------------------------------------------------------------------}
-
-function SDL_Web_HTTP_GetPageToString( var Connection : TSDLWebConnection;
-  Page : string; var Response : string; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceNone ) : Boolean;
-var
-  Stream : TStream;
-begin
-  Response := EmptyStr;
-  Stream := TStringStream.Create( Response );
-  try
-    Result := SDL_Web_HTTP_GetPageToStream( Connection, Page, Stream, Progress, Encoding );
-    //if Result then
-    Response := TStringStream( Stream ).DataString;
-  finally
-    Stream.Free;
-  end;
-end;
-
-{------------------------------------------------------------------------------}
-{Reads a file from the HTTP Server into a Stream}
-{------------------------------------------------------------------------------}
-
-function SDL_Web_HTTP_GetPageToStream( var Connection : TSDLWebConnection;
-  Page : string; var AResponse : TStream; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceNone ) : Boolean;
-var
-  Protocol, User, Password, Host, Port, Path, Error : string;
-  Buffer : array[ 0..MAX_BUFFER_SIZE ] of Byte;
-  BufferStream : TMemoryStream;
-
-  function HexToInt( HexNum : string ) : LongInt;
-  begin
-    Result := StrToInt( '$' + HexNum );
-  end;
-
-  function ReadHTTPChunkData : Boolean;
-  var
-    i, l, error : integer;
-    lp : Pointer;
-    SocketSet : PSDLNet_SocketSet;
-    sResponse : string;
-    c : char;
-  begin
-    Result := False;
- { DONE 1 -oDRE -cHTTP : Implement Transfer encoding support }
-    SocketSet := SDLNet_AllocSocketSet( 1 );
-    try
-      SDLNet_TCP_AddSocket( SocketSet, Connection.Socket );
-      if ( Response.ContentLength = -1 ) or ( BufferStream.Size < Response.ContentLength ) then
-      begin
-        if SDLNet_CheckSockets( SocketSet, MAX_TIMEOUT ) > 0 then
-        begin
-          if SDLNet_SocketReady( PSDLNet_GenericSocket( Connection.Socket ) ) then
-          begin
-           // read the chunk data
-            sResponse := EmptyStr;
-            while true do
-            begin
-              Error := SDLNet_TCP_Recv( Connection.Socket, @C, 1 );
-              if error <> 1 then
-                Break;
-              if C = #13 then
-              else if C = #10 then
-                Break
-              else
-              begin
-                sResponse := sResponse + C;
-              end;
-            end;
-            l := MAX_BUFFER_SIZE;
-            if sResponse <> EmptyStr then
-              l := HexToInt( sResponse ) + 2;
-            l := SDLNet_TCP_Recv( Connection.Socket, @Buffer, l );
-            Result := l > 0;
-            lp := @Buffer;
-            if Result then
-            begin
-              while l > 0 do
-              begin
-                i := BufferStream.Write( lp^, l );
-                dec( l, i );
-                lp := pointer( longint( lp ) + i );
-              end;
-              BufferStream.Position := BufferStream.Position - 2; // take off #13#10
-              if Assigned( Progress ) then
-                Progress( BufferStream.Size, Response.ContentLength )
-            end;
-          end;
-        end;
-      end;
-    finally
-      SDLNet_FreeSocketSet( SocketSet );
-    end;
-  end;
-
-{--------------------------------------------}
-{Reads Data from the Socket}
-{--------------------------------------------}
-
-  function ReadHTTPData : Boolean;
-  var
-    i, l : integer;
-    lp : Pointer;
-    SocketSet : PSDLNet_SocketSet;
-  begin
-    Result := False;
-    if Response.TransferEncoding = teChunked then
-    begin
-      Result := ReadHTTPChunkData;
-      Exit;
-    end;
- { DONE 1 -oDRE -cHTTP : Implement Transfer encoding support }
-    SocketSet := SDLNet_AllocSocketSet( 1 );
-    try
-      SDLNet_TCP_AddSocket( SocketSet, Connection.Socket );
-      if ( Response.ContentLength = -1 ) or ( BufferStream.Size < Response.ContentLength ) then
-      begin
-        if SDLNet_CheckSockets( SocketSet, MAX_TIMEOUT ) > 0 then
-        begin
-          if SDLNet_SocketReady( PSDLNet_GenericSocket( Connection.Socket ) ) then
-          begin
-            l := SDLNet_TCP_Recv( Connection.Socket, @Buffer, MAX_BUFFER_SIZE );
-            Result := l > 0;
-            lp := @Buffer;
-            if Result then
-            begin
-              while l > 0 do
-              begin
-                i := BufferStream.Write( lp^, l );
-                dec( l, i );
-                lp := pointer( longint( lp ) + i );
-              end;
-              if Assigned( Progress ) then
-                Progress( BufferStream.Size, Response.ContentLength )
-            end;
-          end;
-        end;
-      end;
-    finally
-      SDLNet_FreeSocketSet( SocketSet );
-    end;
-  end;
-
-
-begin
-  Result := False;
-  if Connection.Type_ <> wcHTTP then
-    Exit;
-  SDLWeb_ParseURL( Page, Protocol, User, Password, Host, Port, Path );
-  if Path = EmptyStr then
-    Path := Page;
-  Request.Host := Host;
-  if Request.Host = EmptyStr then
-    Request.Host := Connection.HostName;
-  Request.Host := Request.Host + ':' + Port;
-  Request.Username := User;
-  Request.Password := Password;
-  SendHTTPRequest( Connection, 'GET', HTTP_VER, Path, Encoding );
-  if ReadHTTPResponse( Connection, Error ) in [ rsError ] then
-  begin
-    AResponse.WriteBuffer( PChar( Error )^, Length( Error ) );
-    Exit;
-  end;
-  // put this in another thread????
-  BufferStream := TMemoryStream.Create;
-  try
-    while ReadHTTPData do
-      ;
-    BufferStream.Position := 0;
-    case Response.ContentEncoding of
-      ceNone : AResponse.CopyFrom( BufferStream, 0 );
-    else
-      Exit;
-    end;
-    Result := True;
-  finally
-    BufferStream.Free;
-  end;
-end;
-
-function SDL_Web_HTTP_PostString( var Connection : TSDLWebConnection;
-  TargetPage : string; Post : string; var Response : string; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceform ) : Boolean;
-var
-  Stream, AResponse : TStream;
-begin
-  Response := EmptyStr;
-  Stream := TStringStream.Create( Post );
-  AResponse := TStringStream.Create( Post );
-  try
-    Result := SDL_Web_HTTP_PostStream( Connection, TargetPage, Stream, AResponse, Progress, Encoding );
-    //if Result then
-    Response := TStringStream( AResponse ).DataString;
-  finally
-    AResponse.Free;
-    Stream.Free;
-  end;
-end;
-
-function SDL_Web_HTTP_PostStream( var Connection : TSDLWebConnection;
-  TargetPage : string; APost : TStream; var AResponse : TStream; Progress : TWebProgressEvent = nil; Encoding : TContentEncoding = ceform ) : Boolean;
-var
-  Protocol, User, Password, Host, Port, Path, Error : string;
-  Buffer : array[ 0..MAX_BUFFER_SIZE ] of Byte;
-  BytesSent, Bytes : Integer;
-  BufferStream, PostStream : TStream;
-
-  function HexToInt( HexNum : string ) : LongInt;
-  begin
-    Result := StrToInt( '$' + HexNum );
-  end;
-
-  function ReadHTTPChunkData : Boolean;
-  var
-    i, l, error : integer;
-    lp : Pointer;
-    SocketSet : PSDLNet_SocketSet;
-    sResponse : string;
-    c : char;
-  begin
-    Result := False;
- { TODO 1 -oDRE -cHTTP : Implement Transfer encoding support }
-    SocketSet := SDLNet_AllocSocketSet( 1 );
-    SDLNet_TCP_AddSocket( SocketSet, Connection.Socket );
-    if ( Response.ContentLength = -1 ) or ( BufferStream.Size < Response.ContentLength ) then
-    begin
-      if SDLNet_CheckSockets( SocketSet, MAX_TIMEOUT ) > 0 then
-      begin
-        if SDLNet_SocketReady( PSDLNet_GenericSocket( Connection.Socket ) ) then
-        begin
-         // read the chunk data
-         //
-          sResponse := EmptyStr;
-          while true do
-          begin
-            Error := SDLNet_TCP_Recv( Connection.Socket, @C, 1 );
-            if error <> 1 then
-              Break;
-            if C = #13 then
-            else if C = #10 then
-              Break
-            else
-            begin
-              sResponse := sResponse + C;
-            end;
-          end;
-          l := MAX_BUFFER_SIZE;
-          if sResponse <> EmptyStr then
-            l := HexToInt( sResponse ) + 2;
-          l := SDLNet_TCP_Recv( Connection.Socket, @Buffer, l );
-          Result := l > 0;
-          lp := @Buffer;
-          if Result then
-          begin
-            while l > 0 do
-            begin
-              i := BufferStream.Write( lp^, l );
-              dec( l, i );
-              lp := pointer( longint( lp ) + i );
-            end;
-            BufferStream.Position := BufferStream.Position - 2; // take off #13#10
-            if Assigned( Progress ) then
-              Progress( BufferStream.Size, Response.ContentLength )
-          end;
-        end;
-      end;
-    end;
-    SDLNet_FreeSocketSet( SocketSet );
-  end;
-
-{--------------------------------------------}
-{Reads Data from the Socket}
-{--------------------------------------------}
-
-  function ReadHTTPData : Boolean;
-  var
-    i, l : integer;
-    lp : Pointer;
-    SocketSet : PSDLNet_SocketSet;
-  begin
-    Result := False;
-    if Response.TransferEncoding = teChunked then
-    begin
-      Result := ReadHTTPChunkData;
-      Exit;
-    end;
- { DONE 1 -oDRE -cHTTP : Implement Transfer encoding support }
-    SocketSet := SDLNet_AllocSocketSet( 1 );
-    SDLNet_TCP_AddSocket( SocketSet, Connection.Socket );
-    if ( Response.ContentLength = -1 ) or ( BufferStream.Size < Response.ContentLength ) then
-    begin
-      if SDLNet_CheckSockets( SocketSet, MAX_TIMEOUT ) > 0 then
-      begin
-        if SDLNet_SocketReady( PSDLNet_GenericSocket( Connection.Socket ) ) then
-        begin
-          l := SDLNet_TCP_Recv( Connection.Socket, @Buffer, MAX_BUFFER_SIZE );
-          Result := l > 0;
-          lp := @Buffer;
-          if Result then
-          begin
-            while l > 0 do
-            begin
-              i := BufferStream.Write( lp^, l );
-              dec( l, i );
-              lp := pointer( longint( lp ) + i );
-            end;
-            if Assigned( Progress ) then
-              Progress( BufferStream.Size, Response.ContentLength )
-          end;
-        end;
-      end;
-    end;
-    SDLNet_FreeSocketSet( SocketSet );
-  end;
-
-begin
-  Result := False;
-  if Connection.Type_ <> wcHTTP then
-    Exit;
-  SDLWeb_ParseURL( TargetPage, Protocol, User, Password, Host, Port, Path );
-  if Path = EmptyStr then
-    Path := TargetPage;
-  Request.Host := Host;
-  if Request.Host = EmptyStr then
-    Request.Host := Connection.HostName;
-  Request.Username := User;
-  Request.Password := Password;
-  PostStream := TMemoryStream.Create;
-  try
-    PostStream.CopyFrom( APost, APost.Size );
-    PostStream.Position := 0;
-    Request.Length := PostStream.Size;
-    SendHTTPRequest( Connection, 'POST', HTTP_VER, Path, Encoding );
-    if ReadHTTPResponse( Connection, Error ) in [ rsError ] then
-    begin
-      AResponse.WriteBuffer( PChar( Error )^, Length( Error ) );
-      Exit;
-    end;
-  // send the data in the stream
-    BytesSent := 0;
-    while BytesSent < PostStream.Size do
-    begin
-      Bytes := PostStream.Read( Buffer, MAX_BUFFER_SIZE );
-      if SDLNet_TCP_Send( Connection.Socket, @Buffer, Bytes ) = Bytes then
-        inc( BytesSent, Bytes );
-    end;
-  finally
-    PostStream.Free;
-  end;
-  if ReadHTTPResponse( Connection, Error ) in [ rsError ] then
-  begin
-    AResponse.WriteBuffer( PChar( Error )^, Length( Error ) );
-    Exit;
-  end;
-  BufferStream := TMemoryStream.Create;
-  try
-    while ReadHTTPData do
-      ;
-    BufferStream.Position := 0;
-    case Response.ContentEncoding of
-      ceNone : AResponse.CopyFrom( BufferStream, 0 );
-    else
-      Exit;
-    end;
-    Result := True;
-  finally
-    BufferStream.Free;
-  end;
-end;
-
-end.
-

+ 0 - 566
packages/extra/sdl/sdlwindow.pas

@@ -1,566 +0,0 @@
-unit sdlwindow;
-{
-  $Id: sdlwindow.pas,v 1.9 2006/10/22 18:55:25 savage Exp $
-  
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{                SDL Window Wrapper                                            }
-{                                                                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominique Louis are                                      }
-{ Copyright (C) 2004 - 2100 Dominique Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{ Dominique Louis <[email protected]>                            }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{   SDL Window Wrapper                                                         }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   SDL.dll on Windows platforms                                               }
-{   libSDL-1.1.so.0 on Linux platform                                          }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{ January    31     2003 - DL : Initial creation                               }
-{                                                                              }
-{
-  $Log: sdlwindow.pas,v $
-  Revision 1.9  2006/10/22 18:55:25  savage
-  Slight Change to handle OpenGL context
-
-  Revision 1.8  2005/08/03 18:57:32  savage
-  Various updates and additions. Mainly to handle OpenGL 3D Window support and better cursor support for the mouse class
-
-  Revision 1.7  2004/09/30 22:35:47  savage
-  Changes, enhancements and additions as required to get SoAoS working.
-
-  Revision 1.6  2004/09/12 21:52:58  savage
-  Slight changes to fix some issues with the sdl classes.
-
-  Revision 1.5  2004/05/10 21:11:49  savage
-  changes required to help get SoAoS off the ground.
-
-  Revision 1.4  2004/05/01 14:59:27  savage
-  Updated code
-
-  Revision 1.3  2004/04/23 10:45:28  savage
-  Changes made by Dean Ellis to work more modularly.
-
-  Revision 1.2  2004/03/31 10:06:41  savage
-  Changed so that it now compiles, but is untested.
-
-  Revision 1.1  2004/02/05 00:08:20  savage
-  Module 1.0 release
-  
-}
-{******************************************************************************}
-
-interface
-
-{$i jedi-sdl.inc}
-
-uses
-  Classes,
-  sdl,
-  sdlinput,
-  sdlticks;
-
-type
-  TSDLNotifyEvent =  procedure {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLUpdateEvent =  procedure( aElapsedTime : single ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLResizeEvent =  procedure( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLUserEvent =  procedure( aType : UInt8; aCode : integer; aData1 : Pointer; aData2 : Pointer ) {$IFNDEF NOT_OO}of object{$ENDIF};
-  TSDLActiveEvent = procedure( aGain: UInt8; aState: UInt8 ) {$IFNDEF NOT_OO}of object{$ENDIF};
-
-  TSDLBaseWindow = class( TObject )
-  private
-    FDisplaySurface : PSDL_Surface;
-    FVideoFlags : Uint32;
-    FOnDestroy: TSDLNotifyEvent;
-    FOnCreate: TSDLNotifyEvent;
-    FOnShow: TSDLNotifyEvent;
-    FOnResize: TSDLResizeEvent;
-    FOnUpdate: TSDLUpdateEvent;
-    FOnRender: TSDLNotifyEvent;
-    FOnClose: TSDLNotifyEvent;
-    FLoaded: Boolean;
-    FRendering: Boolean;
-    FHeight: integer;
-    FBitDepth: integer;
-    FWidth: integer;
-    FInputManager: TSDLInputManager;
-    FCaptionText : PChar;
-    FIconName : PChar;
-    FOnActive: TSDLActiveEvent;
-    FOnQuit: TSDLNotifyEvent;
-    FOnExpose: TSDLNotifyEvent;
-    FOnUser: TSDLUserEvent;
-    FTimer : TSDLTicks;
-  protected
-    procedure DoActive( aGain: UInt8; aState: UInt8 );
-    procedure DoCreate;
-    procedure DoClose;
-    procedure DoDestroy;
-    procedure DoUpdate( aElapsedTime : single );
-    procedure DoQuit;
-    procedure DoRender;
-    procedure DoResize( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 );
-    procedure DoShow;
-    procedure DoUser( aType : UInt8; aCode : integer; aData1 : Pointer; aData2 : Pointer );
-    procedure DoExpose;
-    procedure Render; virtual;
-    procedure Update( aElapsedTime : single ); virtual;
-    procedure InitialiseObjects; virtual;
-    procedure RestoreObjects; virtual;
-    procedure DeleteObjects; virtual;
-    function Flip : integer; virtual;
-    property OnActive : TSDLActiveEvent read FOnActive write FOnActive;
-    property OnClose: TSDLNotifyEvent read FOnClose write FOnClose;
-    property OnDestroy : TSDLNotifyEvent read FOnDestroy write FOnDestroy;
-    property OnCreate : TSDLNotifyEvent read FOnCreate write FOnCreate;
-    property OnUpdate: TSDLUpdateEvent read FOnUpdate write FOnUpdate;
-    property OnQuit : TSDLNotifyEvent read FOnQuit write FOnQuit;
-    property OnResize : TSDLResizeEvent read FOnResize write FOnResize;
-    property OnRender: TSDLNotifyEvent read FOnRender write FOnRender;
-    property OnShow : TSDLNotifyEvent read FOnShow write FOnShow;
-    property OnUser : TSDLUserEvent read FOnUser write FOnUser;
-    property OnExpose : TSDLNotifyEvent read FOnExpose write FOnExpose;
-    property DisplaySurface: PSDL_Surface read FDisplaySurface;
-  public
-    property InputManager : TSDLInputManager read FInputManager;
-    property Loaded : Boolean read FLoaded;
-    property Width : integer read FWidth;
-    property Height : integer read FHeight;
-    property BitDepth : integer read FBitDepth;
-    property Rendering : Boolean read FRendering write FRendering;
-    procedure SetCaption( const aCaptionText : string; const aIconName : string );
-    procedure GetCaption( var aCaptionText : string; var aIconName : string );
-    procedure SetIcon( aIcon : PSDL_Surface; aMask: UInt8 );
-    procedure ActivateVideoMode;
-    constructor Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 ); virtual;
-    destructor Destroy; override;
-    procedure InitialiseEnvironment;
-    function Show : Boolean; virtual;
-  end;
-
-  TSDLCustomWindow = class( TSDLBaseWindow )
-  public
-    property OnCreate;
-    property OnDestroy;
-    property OnClose;
-    property OnShow;
-    property OnResize;
-    property OnRender;
-    property OnUpdate;
-    property DisplaySurface;
-  end;
-
-  TSDL2DWindow = class( TSDLCustomWindow )
-  public
-    constructor Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 = SDL_DOUBLEBUF or SDL_SWSURFACE); override;
-    procedure Render; override;
-    procedure Update( aElapsedTime : single ); override;
-    procedure InitialiseObjects; override;
-    procedure RestoreObjects; override;
-    procedure DeleteObjects; override;
-    function Flip : integer; override;
-  end;
-
-  TSDL3DWindow = class( TSDLCustomWindow )
-  public
-    constructor Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 = SDL_OPENGL or SDL_DOUBLEBUF); override;
-    function Flip : integer; override;
-    procedure Render; override;
-    procedure Update( aElapsedTime : single ); override;
-    procedure InitialiseObjects; override;
-    procedure RestoreObjects; override;
-    procedure DeleteObjects; override;
-  end;
-
-
-
-implementation
-
-uses
-  logger,
-  SysUtils;
-
-{ TSDLBaseWindow }
-procedure TSDLBaseWindow.ActivateVideoMode;
-begin
-  FDisplaySurface := SDL_SetVideoMode( FWidth, FHeight, FBitDepth, FVideoFlags);
-  if (FDisplaySurface = nil) then
-  begin
-    Log.LogError( Format('Could not set video mode: %s', [SDL_GetError]), 'Main');
-    exit;
-  end;
-
-  SetCaption( 'Made with JEDI-SDL', 'JEDI-SDL Icon' );
-end;
-
-constructor TSDLBaseWindow.Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 );
-begin
-  inherited Create;
-  SDL_Init(SDL_INIT_EVERYTHING);
-  FInputManager := TSDLInputManager.Create( [ itJoystick, itKeyBoard, itMouse ]);
-  FTimer := TSDLTicks.Create;
-
-  FWidth := aWidth;
-  FHeight := aHeight;
-  FBitDepth := aBitDepth;
-  FVideoFlags := aVideoFlags;
-
-  DoCreate;
-end;
-
-procedure TSDLBaseWindow.DeleteObjects;
-begin
-  FLoaded := False;
-end;
-
-destructor TSDLBaseWindow.Destroy;
-begin
-  DoDestroy;
-  if FLoaded then
-    DeleteObjects;
-  if FInputManager <> nil then
-    FreeAndNil( FInputManager );
-  if FTimer <> nil then
-    FreeAndNil( FTimer );
-  if FDisplaySurface <> nil then
-    SDL_FreeSurface( FDisplaySurface );
-  inherited Destroy;
-  SDL_Quit;
-end;
-
-procedure TSDLBaseWindow.DoActive(aGain, aState: UInt8);
-begin
-  if Assigned( FOnActive ) then
-  begin
-    FOnActive( aGain, aState );
-  end;
-end;
-
-procedure TSDLBaseWindow.DoClose;
-begin
-  if Assigned( FOnClose ) then
-  begin
-    FOnClose;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoCreate;
-begin
-  if Assigned( FOnCreate ) then
-  begin
-    FOnCreate;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoDestroy;
-begin
-  if Assigned( FOnDestroy ) then
-  begin
-    FOnDestroy;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoExpose;
-begin
-  if Assigned( FOnExpose ) then
-  begin
-    FOnExpose;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoUpdate( aElapsedTime : single );
-begin
-  if Assigned( FOnUpdate ) then
-  begin
-    FOnUpdate( aElapsedTime );
-  end;
-end;
-
-procedure TSDLBaseWindow.DoQuit;
-begin
-  FRendering := false;
-  if Assigned( FOnQuit ) then
-  begin
-    FOnQuit;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoRender;
-begin
-  if Assigned(  FOnRender ) then
-  begin
-    FOnRender;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoResize( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 );
-begin
-  // resize to the new size
-  SDL_FreeSurface(FDisplaySurface);
-  FWidth := aWidth;
-  FHeight := aHeight;
-  FBitDepth := aBitDepth;
-  FVideoFlags := aVideoFlags;
-  FDisplaySurface := SDL_SetVideoMode(aWidth, aHeight, aBitDepth, aVideoFlags);
-  if Assigned( FOnResize ) then
-  begin
-    FOnResize( aWidth, aHeight, aBitDepth, aVideoFlags );
-  end;
-end;
-
-procedure TSDLBaseWindow.DoShow;
-begin
-  if Assigned( FOnShow ) then
-  begin
-    FOnShow;
-  end;
-end;
-
-procedure TSDLBaseWindow.DoUser(aType: UInt8; aCode: integer; aData1, aData2: Pointer);
-begin
-  if Assigned(  FOnUser ) then
-  begin
-    FOnUser( aType, aCode, aData1, aData2 );
-  end;
-end;
-
-function TSDLBaseWindow.Flip : integer;
-begin
-  result := 0;
-end;
-
-procedure TSDLBaseWindow.GetCaption( var aCaptionText : string; var aIconName : string );
-begin
-  aCaptionText := string( FCaptionText );
-  aIconName := string( FIconName );
-end;
-
-procedure TSDLBaseWindow.InitialiseEnvironment;
-begin
-  InitialiseObjects;
-  RestoreObjects;
-end;
-
-procedure TSDLBaseWindow.InitialiseObjects;
-begin
-  FLoaded := True;
-end;
-
-procedure TSDLBaseWindow.Update( aElapsedTime : single );
-begin
-  DoUpdate( aElapsedTime );
-end;
-
-procedure TSDLBaseWindow.Render;
-begin
-  DoRender;
-end;
-
-procedure TSDLBaseWindow.RestoreObjects;
-begin
-  FLoaded := false;
-end;
-
-procedure TSDLBaseWindow.SetCaption( const aCaptionText : string; const aIconName : string );
-begin
-  if FCaptionText <> aCaptionText then
-  begin
-    FCaptionText := PChar( aCaptionText );
-    FIconName := PChar( aIconName );
-    SDL_WM_SetCaption( FCaptionText, FIconName );
-  end;
-end;
-
-procedure TSDLBaseWindow.SetIcon(aIcon: PSDL_Surface; aMask: UInt8);
-begin
-  SDL_WM_SetIcon( aIcon, aMask );
-end;
-
-function TSDLBaseWindow.Show : Boolean;
-var
-  eBaseWindowEvent : TSDL_Event;
-begin
-  DoShow;
-
-  FTimer.Init;
-
-  FRendering := true;
-  // repeat until we are told not to render
-  while FRendering do
-  begin
-    // wait for an event
-    while SDL_PollEvent( @eBaseWindowEvent ) > 0 do
-    begin
-
-      // check for a quit event
-      case eBaseWindowEvent.type_ of
-        SDL_ACTIVEEVENT :
-        begin
-          DoActive( eBaseWindowEvent.active.gain, eBaseWindowEvent.active.state );
-        end;
-
-        SDL_QUITEV :
-        begin
-          DoQuit;
-          DoClose;
-        end;
-
-        SDL_USEREVENT :
-        begin
-          DoUser( eBaseWindowEvent.user.type_, eBaseWindowEvent.user.code, eBaseWindowEvent.user.data1, eBaseWindowEvent.user.data2 );
-        end;
-
-        SDL_VIDEOEXPOSE :
-        begin
-          DoExpose;
-        end;
-
-        SDL_VIDEORESIZE :
-        begin
-          DoResize( eBaseWindowEvent.resize.w, eBaseWindowEvent.resize.h, FDisplaySurface.format.BitsPerPixel, FVideoflags );
-        end;
-
-
-      end;
-      InputManager.UpdateInputs( eBaseWindowEvent );
-    end;
-    // Prepare the Next Frame
-    Update( FTimer.GetElapsedSeconds );
-    // Display the Next Frame
-    Render;
-    // Flip the surfaces
-    Flip;
-  end;
-
-  Result := FRendering;
-end;
-
-{ TSDL2DWindow }
-
-constructor TSDL2DWindow.Create(aWidth, aHeight, aBitDepth: integer; aVideoFlags: Uint32);
-begin
-  // make sure double buffer is always included in the video flags
-  inherited Create(aWidth,aHeight, aBitDepth, aVideoFlags or SDL_DOUBLEBUF);
-end;
-
-procedure TSDL2DWindow.DeleteObjects;
-begin
-  inherited;
-
-end;
-
-function TSDL2DWindow.Flip: integer;
-begin
-  // let's show the back buffer
-  result := SDL_Flip( FDisplaySurface );
-end;
-
-procedure TSDL2DWindow.InitialiseObjects;
-begin
-  inherited;
-
-end;
-
-procedure TSDL2DWindow.Update( aElapsedTime : single );
-begin
-  inherited;
-
-end;
-
-procedure TSDL2DWindow.Render;
-begin
-  inherited;
-
-end;
-
-procedure TSDL2DWindow.RestoreObjects;
-begin
-  inherited;
-
-end;
-
-{ TSDL3DWindow }
-
-constructor TSDL3DWindow.Create(aWidth,
-  aHeight, aBitDepth: integer; aVideoFlags: Uint32);
-begin
-  // make sure opengl is always included in the video flags
-  inherited Create(aWidth,aHeight, aBitDepth, aVideoFlags or SDL_OPENGL or SDL_DOUBLEBUF);
-end;
-
-procedure TSDL3DWindow.DeleteObjects;
-begin
-  inherited;
-
-end;
-
-function TSDL3DWindow.Flip : integer;
-begin
-  SDL_GL_SwapBuffers;
-  result := 0;
-end;
-
-procedure TSDL3DWindow.InitialiseObjects;
-begin
-  inherited;
-
-end;
-
-procedure TSDL3DWindow.Update( aElapsedTime : single );
-begin
-  inherited;
-
-end;
-
-procedure TSDL3DWindow.Render;
-begin
-  inherited;
-  
-end;
-
-procedure TSDL3DWindow.RestoreObjects;
-begin
-  inherited;
-
-end;
-
-end.

+ 0 - 492
packages/extra/sdl/sfont.pas

@@ -1,492 +0,0 @@
-unit sfont;
-{******************************************************************}
-{
-  $Id: sfont.pas,v 1.2 2004/03/31 09:04:31 savage Exp $
-
-}
-{                                                                  }
-{       Borland Delphi SFont                                       }
-{       Conversion of the Linux Games- SFont Library for SDL       }
-{                                                                  }
-{ Original work created by Karl Bartel  <[email protected]>            }
-{ Copyright (C) 2003 Karl Bartel.                                  }
-{ All Rights Reserved.                                             }
-{                                                                  }
-{ The original files are : sfont.c                                 }
-{                                                                  }
-{ The original Pascal code is : SFont.pas                          }
-{ The initial developer of the Pascal code is :                    }
-{ Jason Farmer <[email protected]>                      }
-{                                                                  }
-{                                                                  }
-{ Contributor(s)                                                   }
-{ --------------                                                   }
-{ Dominique Louis <[email protected]>                }
-{                                                                  }
-{ Obtained through:                                                }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )            }
-{                                                                  }
-{ You may retrieve the latest version of this file at the Project  }
-{ JEDI home page, located at http://delphi-jedi.org                }
-{                                                                  }
-{ The contents of this file are used with permission, subject to   }
-{ the Mozilla Public License Version 1.1 (the "License"); you may  }
-{ not use this file except in compliance with the License. You may }
-{ obtain a copy of the License at                                  }
-{ http://www.mozilla.org/NPL/NPL-1_1Final.html                     }
-{                                                                  }
-{ Software distributed under the License is distributed on an      }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   }
-{ implied. See the License for the specific language governing     }
-{ rights and limitations under the License.                        }
-{                                                                  }
-{ Description                                                      }
-{ -----------                                                      }
-{                                                                  }
-{    SFONT - SDL Font Library by Karl Bartel <[email protected]>	   }
-{                                                                  }
-{  All functions are explained below.                              }
-{  There are two versions of each                                  }
-{  funtction. The first is the normal one,                         }
-{  the function with the 2 at the end can be used when you         }
-{  want to handle more than one font                               }
-{  in your program.                                                }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{ Requires                                                         }
-{ --------                                                         }
-{   SDL runtime libary somewhere in your path                      }
-{   The Latest SDL runtime can be found on http://www.libsdl.org   }
-{                                                                  }
-{ Programming Notes                                                }
-{ -----------------                                                }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{                                                                  }
-{ Revision History                                                 }
-{ ----------------                                                 }
-{   July    04 2001 - JF : Initial translation.                    }
-{   Sept    29 2001 - JF : Added Róbert Surface Adding and         }
-{                          Subtraction functions                   }
-{                                                                  }
-{
-  $Log: sfont.pas,v $
-  Revision 1.2  2004/03/31 09:04:31  savage
-  Added jedi-sdl.inc files for better FreePascal/multi compiler support.
-
-  Revision 1.1  2004/03/28 10:45:16  savage
-  Standardised SFont Functions so that they are prefixed with SFont_ and more in line with Karl's v2.02 release. Demos have been updated appropriately.
-
-
-}
-{******************************************************************}
-
-{$I jedi-sdl.inc}
-
-interface
-
-uses
-  SysUtils,
-  sdl,
-  sdlutils;
-
-// Delcare one variable of this type for each font you are using.
-// To load the fonts, load the font image into YourFont->Surface
-// and call InitFont( YourFont );
-type
-  TSfont_FontInfo = record
-    Surface : PSDL_Surface; //SDL_Surface *Surface;
-    CharPos : array[ 0..511 ] of integer; //int CharPos[512];
-    MaxPos : integer; //int h;
-  end;
-  PSFont_FontInfo = ^TSfont_FontInfo;
-
-  // Initializes the font
-  // Font: this contains the suface with the font.
-  //       The font must be loaded before using this function.
-procedure SFont_InitFont( Font : PSDL_Surface );
-procedure SFont_InitFont2( Font : PSFont_FontInfo );
-
-// Blits a string to a surface
-// Destination: the suface you want to blit to
-// text: a string containing the text you want to blit.
-procedure SFont_Write( Surface_ : PSDL_Surface; x : Integer; y : Integer; text :
-  pchar );
-procedure SFont_WriteAdd( Surface_ : PSDL_Surface; x : Integer; y : Integer; text :
-  pchar );
-procedure SFont_WriteSub( Surface_ : PSDL_Surface; x : Integer; y : Integer; text :
-  pchar );
-
-procedure SFont_Write2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; x : integer;
-  y : integer; text : pchar );
-procedure SFont_WriteAdd2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; x : integer;
-  y : integer; text : pchar );
-procedure SFont_WriteSub2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; x : integer;
-  y : integer; text : pchar );
-
-// Returns the width of "text" in pixels
-function SFont_TextWidth( Text : pchar ) : integer;
-function SFont_TextWidth2( Font : PSFont_FontInfo; Text : pchar ) : integer;
-
-// Blits a string to with centered x position
-procedure SFont_WriteCentered( Surface_ : PSDL_Surface; y : Integer; text : pchar );
-procedure SFont_WriteCentered2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; y :
-  integer; text : pchar );
-
-// Allows the user to enter text
-// Width: What is the maximum width of the text (in pixels)
-// text: This string contains the text which was entered by the user
-procedure SFont_Input( Destination : PSDL_Surface; x : Integer; y : integer; Width :
-  integer; text : pchar );
-procedure SFont_Input2( Destination : PSDL_Surface; Font : PSFont_FontInfo; x :
-  integer; y : integer; Width : integer; text : pchar );
-// Not part of the original implementation, but We really shouldn't be falling for the C Scanf problem...
-// This version requires a maximum length for the amount of text to input.
-procedure SFont_Input3( Destination : PSDL_Surface; Font : PSFont_FontInfo; x :
-  integer; y : integer; Width : integer; text : pchar; MaxChars : Cardinal );
-
-{ We'll use SDL for reporting errors }
-procedure SFont_SetError( fmt : PChar );
-
-function SFont_GetError : PChar;
-
-var
-  InternalFont : TSFont_FontInfo;
-
-implementation
-
-procedure SFont_SetError( fmt : PChar );
-begin
-  SDL_SetError( fmt );
-end;
-
-function SFont_GetError : PChar;
-begin
-  result := SDL_GetError;
-end;
-
-
-procedure SFont_InitFont2( Font : PSFont_FontInfo );
-var
-  X : Integer;
-  I : Integer;
-begin
-
-  x := 0;
-  i := 0;
-
-  if Font.Surface = nil then
-  begin
-    //Font_SetError ("The font has not been loaded!");
- //printf("The font has not been loaded!\n");
-
- //exit(1);
-    exit;
-  end;
-
-  while x < Font.Surface.w do
-  begin
-
-    if SDL_GetPixel( Font.Surface, x, 0 ) = SDL_MapRGB( Font.Surface.format, 255, 0,
-      255 ) then
-    begin
-      Font.CharPos[ i ] := x;
-      inc( i );
-      while ( ( x < Font.Surface.w - 1 ) and ( SDL_GetPixel( Font.Surface, x, 0 ) =
-        SDL_MapRGB( Font.Surface.format, 255, 0, 255 ) ) ) do
-      begin
-        inc( x );
-      end;
-      Font.CharPos[ i ] := x;
-      inc( i );
-    end;
-    inc( x );
-  end;
-
-  Font.MaxPos := Font.Surface.h;
-  SDL_SetColorKey( Font.Surface, SDL_SRCCOLORKEY, SDL_GetPixel( Font.Surface, 0,
-    Font.Surface.h - 1 ) );
-end;
-
-procedure SFont_InitFont( Font : PSDL_Surface );
-begin
-  InternalFont.Surface := Font;
-  SFont_InitFont2( @InternalFont );
-end;
-
-procedure SFont_WriteAdd2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; x : integer;
-  y : integer; text : pchar );
-var
-  ofs : Integer;
-  i : Integer;
-  srcrect, dstrect : SDL_Rect;
-
-begin
-  i := 0;
-
-  while text[ i ] <> chr( 0 ) do
-  begin
-    if text[ i ] = ' ' then
-    begin
-      x := x + Font.CharPos[ 2 ] - Font.CharPos[ 1 ];
-      inc( i );
-
-    end
-    else
-    begin
-      ofs := ( ( integer( text[ i ] ) - 33 ) * 2 ) + 1;
-
-      srcrect.w := ( Font.CharPos[ ofs + 2 ] + Font.CharPos[ ofs + 1 ] ) div 2 -
-        ( Font.CharPos[ ofs ] + Font.CharPos[ ofs - 1 ] ) div 2;
-      dstrect.w := srcrect.w;
-      srcrect.h := Font.Surface.h - 1;
-      dstrect.h := srcrect.h;
-      srcrect.x := ( Font.CharPos[ ofs ] + Font.CharPos[ ofs - 1 ] ) div 2;
-      srcrect.y := 1;
-      dstrect.x := x - ( Font.CharPos[ ofs ] - Font.CharPos[ ofs - 1 ] ) div 2;
-      dstrect.y := y;
-
-      SDL_AddSurface( Font.Surface, @srcrect, Surface_, @dstrect );
-
-      x := x + Font.CharPos[ ofs + 1 ] - Font.CharPos[ ofs ];
-      inc( i );
-    end;
-  end;
-end;
-
-procedure SFont_WriteSub2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; x : integer;
-  y : integer; text : pchar );
-var
-  ofs : Integer;
-  i : Integer;
-  srcrect, dstrect : SDL_Rect;
-
-begin
-  i := 0;
-
-  while text[ i ] <> chr( 0 ) do
-  begin
-    if text[ i ] = ' ' then
-    begin
-      x := x + Font.CharPos[ 2 ] - Font.CharPos[ 1 ];
-      inc( i );
-
-    end
-    else
-    begin
-      ofs := ( ( integer( text[ i ] ) - 33 ) * 2 ) + 1;
-
-      srcrect.w := ( Font.CharPos[ ofs + 2 ] + Font.CharPos[ ofs + 1 ] ) div 2 -
-        ( Font.CharPos[ ofs ] + Font.CharPos[ ofs - 1 ] ) div 2;
-      dstrect.w := srcrect.w;
-      srcrect.h := Font.Surface.h - 1;
-      dstrect.h := srcrect.h;
-      srcrect.x := ( Font.CharPos[ ofs ] + Font.CharPos[ ofs - 1 ] ) div 2;
-      srcrect.y := 1;
-      dstrect.x := x - ( Font.CharPos[ ofs ] - Font.CharPos[ ofs - 1 ] ) div 2;
-      dstrect.y := y;
-
-      SDL_SubSurface( Font.Surface, @srcrect, Surface_, @dstrect );
-
-      x := x + Font.CharPos[ ofs + 1 ] - Font.CharPos[ ofs ];
-      inc( i );
-    end;
-  end;
-end;
-
-procedure SFont_Write2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; x : integer;
-  y : integer; text : pchar );
-var
-  ofs : Integer;
-  i : Integer;
-  srcrect, dstrect : SDL_Rect;
-
-begin
-  i := 0;
-
-  while text[ i ] <> chr( 0 ) do
-  begin
-    if text[ i ] = ' ' then
-    begin
-      x := x + Font.CharPos[ 2 ] - Font.CharPos[ 1 ];
-      inc( i );
-
-    end
-    else
-    begin
-      ofs := ( ( integer( text[ i ] ) - 33 ) * 2 ) + 1;
-
-      srcrect.w := ( Font.CharPos[ ofs + 2 ] + Font.CharPos[ ofs + 1 ] ) div 2 -
-        ( Font.CharPos[ ofs ] + Font.CharPos[ ofs - 1 ] ) div 2;
-      dstrect.w := srcrect.w;
-      srcrect.h := Font.Surface.h - 1;
-      dstrect.h := srcrect.h;
-      srcrect.x := ( Font.CharPos[ ofs ] + Font.CharPos[ ofs - 1 ] ) div 2;
-      srcrect.y := 1;
-      dstrect.x := x - ( Font.CharPos[ ofs ] - Font.CharPos[ ofs - 1 ] ) div 2;
-      dstrect.y := y;
-
-      SDL_BlitSurface( Font.Surface, @srcrect, Surface_, @dstrect );
-
-      x := x + Font.CharPos[ ofs + 1 ] - Font.CharPos[ ofs ];
-      inc( i );
-    end;
-  end;
-end;
-
-procedure SFont_Write( Surface_ : PSDL_Surface; x : Integer; y : Integer; text :
-  pchar );
-begin
-  SFont_Write2( Surface_, @InternalFont, x, y, text );
-end;
-
-procedure SFont_WriteAdd( Surface_ : PSDL_Surface; x : Integer; y : Integer; text :
-  pchar );
-begin
-
-  SFont_WriteAdd2( Surface_, @InternalFont, x, y, text );
-end;
-
-procedure SFont_WriteSub( Surface_ : PSDL_Surface; x : Integer; y : Integer; text :
-  pchar );
-begin
-
-  SFont_WriteSub2( Surface_, @InternalFont, x, y, text );
-end;
-
-
-
-function SFont_TextWidth2( Font : PSFont_FontInfo; Text : pchar ) : integer;
-var
-  x, i, ofs : integer;
-
-begin
-  x := 0;
-  i := 0;
-  ofs := 0;
-  while text[ i ] <> chr( 0 ) do
-  begin
-    if text[ i ] = ' ' then
-    begin
-      x := x + Font.CharPos[ 2 ] - Font.CharPos[ 1 ];
-      inc( i );
-    end
-    else
-    begin
-      ofs := ( integer( text[ i ] ) - 33 ) * 2 + 1;
-      x := x + Font.CharPos[ ofs + 1 ] - Font.CharPos[ ofs ];
-      inc( i );
-    end;
-  end;
-  result := ( x + Font.CharPos[ ofs + 2 ] - Font.CharPos[ ofs + 1 ] );
-end;
-
-function SFont_TextWidth( Text : pchar ) : integer;
-begin
-  result := SFont_TextWidth2( @InternalFont, Text );
-end;
-
-procedure SFont_WriteCentered2( Surface_ : PSDL_Surface; Font : PSFont_FontInfo; y :
-  integer; text : pchar );
-begin
-  SFont_Write2( Surface_, @InternalFont, Surface_.w div 2 - SFont_TextWidth( text ) div 2,
-    y, text );
-end;
-
-procedure SFont_WriteCentered( Surface_ : PSDL_Surface; y : Integer; text : pchar );
-begin
-  SFont_WriteCentered2( Surface_, @InternalFont, y, text );
-end;
-
-procedure SFont_Input3( Destination : PSDL_Surface; Font : PSFont_FontInfo; x :
-  integer; y : integer; Width : integer; text : pchar; MaxChars : Cardinal );
-var
-  event : TSDL_Event;
-  ch, ofs, leftshift : integer;
-
-  Back : PSDL_Surface;
-  rect : SDL_Rect;
-begin
-  ch := 0; //Just to shut the compiler up
-  ofs := ( integer( text[ 0 ] ) - 33 ) * 2 + 1;
-  leftshift := ( Font.CharPos[ ofs ] - Font.CharPos[ ofs - 1 ] ) div 2;
-
-  Back := SDL_AllocSurface( Destination.flags,
-    Width,
-    Font.MaxPos,
-    Destination.format.BitsPerPixel,
-    Destination.format.Rmask,
-    Destination.format.Gmask,
-    Destination.format.Bmask, 0 );
-
-  rect.x := x - leftshift;
-  rect.y := y;
-  rect.w := Width;
-  rect.h := Font.Surface.h;
-  SDL_BlitSurface( Destination, @rect, Back, nil );
-  SFont_Write2( Destination, Font, x, y, text );
-  SDL_UpdateRect( Destination, x - leftshift, y, Width, Font.MaxPos );
-
-  // start input
-  SDL_EnableUNICODE( 1 );
-  while ( ( ch <> SDLK_RETURN ) and ( SDL_WaitEvent( @event ) > 0 ) ) do
-  begin
-    if event.type_ = SDL_KEYDOWN then
-    begin
-
-      ch := event.key.keysym.unicode;
-      if ( ch = SDLK_BACKSPACE ) and ( strlen( text ) > 0 ) then
-      begin
-        text[ strlen( text ) - 1 ] := chr( 0 );
-      end
-      else
-      begin
-        if strlen( text ) < MaxChars then
-        begin
-          if ch <> SDLK_BACKSPACE then
-          begin
-            text[ strlen( text ) ] := chr( ch );
-            text[ strlen( text ) ] := chr( 0 );
-          end;
-          if ( SFont_TextWidth2( Font, text ) > Width ) then
-            text[ strlen( text ) ] := chr( 0 );
-
-        end;
-      end;
-      SDL_BlitSurface( Back, nil, Destination, @rect );
-      SFont_Write2( Destination, Font, x, y, text );
-      SDL_UpdateRect( Destination, x - ( Font.CharPos[ ofs ] - Font.CharPos[ ofs - 1 ] )
-        div 2, y, Width, Font.Surface.h );
-
-    end;
-  end;
-  text[ strlen( text ) ] := chr( 0 );
-  SDL_FreeSurface( Back );
-end;
-
-procedure SFont_Input2( Destination : PSDL_Surface; Font : PSFont_FontInfo; x :
-  integer; y : integer; Width : integer; text : pchar );
-var
-  MaxChars : Cardinal;
-begin
-  MaxChars := length( text ); // Just to make sure that we don't spill into
-  // memory that doesn't belong to us.
-  // We can't test the array as we use it
-  // Because we're putting the 0 at the current
-  // position.
-
-  SFont_Input3( Destination, Font, x, y, Width, Text, MaxChars );
-end;
-
-procedure SFont_Input( Destination : PSDL_Surface; x : Integer; y : integer; Width :
-  integer; text : pchar );
-begin
-  SFont_Input2( Destination, @InternalFont, x, y, Width, text );
-end;
-
-end.
-

+ 0 - 159
packages/extra/sdl/userpreferences.pas

@@ -1,159 +0,0 @@
-unit userpreferences;
-{
-  $Id: userpreferences.pas,v 1.1 2004/09/30 22:35:47 savage Exp $
-  
-}
-{******************************************************************************}
-{                                                                              }
-{          JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer          }
-{                 Base Class for User Preferences                              }
-{                                                                              }
-{ The initial developer of this Pascal code was :                              }
-{ Dominqiue Louis <[email protected]>                            }
-{                                                                              }
-{ Portions created by Dominqiue Louis are                                      }
-{ Copyright (C) 2000 - 2001 Dominqiue Louis.                                   }
-{                                                                              }
-{                                                                              }
-{ Contributor(s)                                                               }
-{ --------------                                                               }
-{                                                                              }
-{                                                                              }
-{ Obtained through:                                                            }
-{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
-{                                                                              }
-{ You may retrieve the latest version of this file at the Project              }
-{ JEDI home page, located at http://delphi-jedi.org                            }
-{                                                                              }
-{ The contents of this file are used with permission, subject to               }
-{ the Mozilla Public License Version 1.1 (the "License"); you may              }
-{ not use this file except in compliance with the License. You may             }
-{ obtain a copy of the License at                                              }
-{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
-{                                                                              }
-{ Software distributed under the License is distributed on an                  }
-{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
-{ implied. See the License for the specific language governing                 }
-{ rights and limitations under the License.                                    }
-{                                                                              }
-{ Description                                                                  }
-{ -----------                                                                  }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Requires                                                                     }
-{ --------                                                                     }
-{   The SDL Runtime libraris on Win32  : SDL.dll on Linux : libSDL.so          }
-{   They are available from...                                                 }
-{   http://www.libsdl.org .                                                    }
-{                                                                              }
-{ Programming Notes                                                            }
-{ -----------------                                                            }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{                                                                              }
-{ Revision History                                                             }
-{ ----------------                                                             }
-{   September   23 2004 - DL : Initial Creation                                }
-{
-  $Log: userpreferences.pas,v $
-  Revision 1.1  2004/09/30 22:35:47  savage
-  Changes, enhancements and additions as required to get SoAoS working.
-
-
-}
-{******************************************************************************}
-
-interface
-
-uses
-  Classes;
-
-type
-  TUserPreferences = class
-  private
-    FAutoSave: Boolean;
-    procedure CheckAutoSave;
-  protected
-    function GetDefaultBoolean( const Index : Integer ) : Boolean; virtual; abstract;
-    function GetBoolean( const Index : Integer ) : Boolean; virtual; abstract;
-    procedure SetBoolean( const Index : Integer; const Value : Boolean ); virtual;
-    function GetDefaultDateTime( const Index : Integer ) : TDateTime; virtual; abstract;
-    function GetDateTime( const Index : Integer ) : TDateTime; virtual; abstract;
-    procedure SetDateTime( const Index : Integer; const Value : TDateTime ); virtual;
-    function GetDefaultInteger( const Index : Integer ) : Integer; virtual; abstract;
-    function GetInteger( const Index : Integer ) : Integer; virtual; abstract;
-    procedure SetInteger( const Index : Integer; const Value : Integer ); virtual;
-    function GetDefaultFloat( const Index : Integer ) : single; virtual; abstract;
-    function GetFloat( const Index : Integer ) : single; virtual; abstract;
-    procedure SetFloat( const Index : Integer; const Value : single ); virtual;
-    function GetDefaultString( const Index : Integer ) : string; virtual; abstract;
-    function GetString( const Index : Integer ) : string; virtual; abstract;
-    procedure SetString( const Index : Integer; const Value : string ); virtual;
-    function GetDefaultBinaryStream( const Index : Integer ) : TStream; virtual; abstract;
-    function GetBinaryStream( const Index : Integer ) : TStream; virtual; abstract;
-    procedure SetBinaryStream( const Index : Integer; const Value : TStream ); virtual;
-  public
-    procedure Update; virtual; abstract;
-    constructor Create; virtual;
-    destructor Destroy; override;
-    property AutoSave : Boolean read FAutoSave write FAutoSave;
-  end;
-
-implementation
-
-{ TUserPreferences }
-procedure TUserPreferences.CheckAutoSave;
-begin
-  if FAutoSave then
-    Update;
-end;
-
-constructor TUserPreferences.Create;
-begin
-  inherited;
-  FAutoSave := false;
-end;
-
-destructor TUserPreferences.Destroy;
-begin
-
-  inherited;
-end;
-
-procedure TUserPreferences.SetBinaryStream( const Index : Integer; const Value : TStream );
-begin
-  CheckAutoSave;
-end;
-
-procedure TUserPreferences.SetBoolean(const Index: Integer; const Value: Boolean);
-begin
-  CheckAutoSave;
-end;
-
-procedure TUserPreferences.SetDateTime(const Index: Integer; const Value: TDateTime);
-begin
-  CheckAutoSave;
-end;
-
-procedure TUserPreferences.SetFloat(const Index: Integer; const Value: single);
-begin
-  CheckAutoSave;
-end;
-
-procedure TUserPreferences.SetInteger(const Index, Value: Integer);
-begin
-  CheckAutoSave;
-end;
-
-procedure TUserPreferences.SetString(const Index: Integer; const Value: string);
-begin
-  CheckAutoSave;
-end;
-
-end.