1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-11 03:45:06 -05:00

Added the first initial code of Freeze/Unfreeze.

Added more comments in window.pas.
Added several exception-raises where required.



git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@66 3f818213-9676-44b0-a9b4-5e4c4e03d09d
This commit is contained in:
Wizzup? 2009-09-16 07:34:06 +00:00
parent ae5d0e9d5b
commit 13c2103030
2 changed files with 95 additions and 12 deletions

View File

@ -110,16 +110,25 @@ begin
if y1 > y2 then
Swap(y1,y2);}
if x1 < 0 then
x1 := 0;
// x1 := 0;
raise Exception.createFMT('Any FindColor Function, you did not pass a ' +
'correct x1: %d.', [x1]);
if y1 < 0 then
y1 := 0;
// y1 := 0;
raise Exception.createFMT('Any FindColor Function, you did not pass a ' +
'correct y1: %d.', [y1]);
TClient(Self.Client).MWindow.GetDimensions(w,h);
if (w <> CachedWidth) or (h <> CachedHeight) then
UpdateCachedValues(w,h);
if x2 >= w then
x2 := w-1;
// x2 := w-1;
raise Exception.createFMT('Any FindColor Function, you did not pass a ' +
'correct x2: %d.', [x2]);
if y2 >= h then
y2 := h-1;
// y2 := h-1;
raise Exception.createFMT('Any FindColor Function, you did not pass a ' +
'correct y2: %d.', [y2]);
end;
function TMFinder.FindColor(var x, y: Integer; Color, x1, y1, x2, y2: Integer): Boolean;
@ -287,8 +296,7 @@ begin
SetLength(TPA, I);
Move(ClientTPA[0], TPA[0], i * SizeOf(TPoint));
{ for xx := 0 to I - 1 do
TPA[xx] := ClientTPA[xx];}
Result := I > 0;
TClient(Client).MWindow.FreeReturnData;

View File

@ -35,8 +35,22 @@ type
function SetTarget(Window: THandle; NewType: TTargetWindowMode): integer; overload;
function SetTarget(ArrPtr: PRGB32; Size: TPoint): integer; overload;
{
Freeze Client Feature.
This will force the MWindow unit to Store the current Client's
data in whatever internal structure it will use, and returndata /
copyclienttobitmap will not renew this data until Unfreeze() is
called.
}
function Freeze: boolean;
function Unfreeze: boolean;
constructor Create(Client: TObject);
destructor Destroy; override;
private
FreezeState: Boolean;
public
// Client
Client: TObject;
@ -95,6 +109,8 @@ type
ArrayPtr: PRGB32;
ArraySize: TPoint;
property Frozen: boolean read FreezeState;
end;
@ -113,6 +129,9 @@ begin
Self.Client := Client;
Self.FreezeState :=False;
Self.ArrayPtr := nil;
Self.ArraySize := Classes.Point(-1, -1);
@ -202,12 +221,17 @@ begin
XSetErrorHandler(Old_Handler);
{$ELSE}
WriteLn('Windows doesn''t support XImage');
raise Exception.createFMT('ReturnData: You cannot use ' +
'the XImage mode on Windows.', []);
{$ENDIF}
end;
w_ArrayPtr:
begin
// Copy the pointer as we will perform operations on it.
TmpData := Self.ArrayPtr;
// Increase the pointer to the specified start of the data.
Inc(TmpData, ys * Height + xs);
Result.Ptr := TmpData;
Result.IncPtrWith:= Self.ArraySize.x - width;
@ -220,7 +244,13 @@ procedure TMWindow.FreeReturnData;
begin
if Self.TargetMode <> w_XWindow then
begin
// throw exception.
raise Exception.createFMT('FreeReturnData - Image data must only ' +
' be freed with XGetImage', []);
exit;
end;
if FreezeState then
begin
raise Exception.createFMT('FreeReturnData called when Freeze = True', []);
exit;
end;
{$IFDEF LINUX}
@ -235,11 +265,41 @@ begin
{$ENDIF}
end;
// This will draw the ENTIRE client to a bitmap.
// And ReturnData / CopyClientToBitmap will always use this bitmap.
// They must NEVER update, unless Unfreeze is called.
// I am not entirely sure how to do this, yet.
// Best option for now seems to copy the entire data to a PRGB32,
// and use it like the ArrPtr mode.
// I currently added "Frozen", "FreezeState", "Freeze" and "Unfreeze".
// We will have to either "abuse" the current system, and set the client to
// PtrArray mode, or edit in some extra variables.
// (We will still need extra variables to remember the old mode,
// to which we will switch back with Unfreeze.)
// Several ways to do it, what's the best way?
// Also, should a box be passed to Freeze, or should we just copy the entire
// client?
function TMWindow.Freeze: Boolean;
begin
Self.FreezeState:=True;
raise Exception.createFMT('Freeze: Not yet implemented.', []);
end;
function TMWindow.Unfreeze: Boolean;
begin
Self.FreezeState:=False;
raise Exception.createFMT('Unfreeze: Not yet implemented.', []);
end;
// Bugged. For params other than 0, 0, ClientWidth, ClientHeight
// if other type than w_XImage
// Also thread bugged
// Also possibly thread bugged
function TMWindow.CopyClientToBitmap(xs, ys, xe, ye: integer): TBitmap;
var
w,h: Integer;
@ -297,11 +357,25 @@ begin
XDestroyImage(Img);
XSetErrorHandler(Old_Handler);
{$ELSE}
writeln('Windows and tXWindow');
raise Exception.createFMT('CopyClientToBitmap: You cannot use ' +
'the XImage mode on Windows.', []);
{$ENDIF}
end;
w_ArrayPtr:
begin
// Will only work if the coords are 0, 0, w, h.
// Otherwise, we will need to perform mem copy/move operations.
// Copy it to a XImage-alike structure,
// then pass it to ArrDataToRawImage.
// Basically, Copy the data slices from the array into a XImage,
// where the data IS aligned.
raise Exception.createFMT('Array Data to Bitmap not yet fully ' +
'implemented', []);
Result := nil;
exit;
ArrDataToRawImage(Self.ArrayPtr, Self.ArraySize, Raw);
@ -378,7 +452,8 @@ begin
end;
XSetErrorHandler(Old_Handler);
{$ELSE}
WriteLn('You dummy! How are you going to use w_XWindow on non Linux systems?');
raise Exception.createFMT('GetDimensions: You cannot use ' +
'the XImage mode on Windows.', []);
{$ENDIF}
end;
w_ArrayPtr:
@ -405,7 +480,7 @@ function TMWindow.SetTarget(Window: THandle; NewType: TTargetWindowMode): intege
begin
if NewType in [ w_XWindow, w_ArrayPtr ] then
begin
// throw exception
raise Exception.createFMT('SetTarget: Invalid new type.', []);
Exit;
end;
case NewType of