mirror of
https://github.com/Laex/Delphi-OpenCV.git
synced 2024-11-15 15:55:53 +01:00
217 lines
7.9 KiB
ObjectPascal
217 lines
7.9 KiB
ObjectPascal
|
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" <mrkroket@hotmail.com> }
|
||
|
{ }
|
||
|
{******************************************************************}
|
||
|
{
|
||
|
$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.
|
||
|
|