mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 09:18:02 +02:00
217 lines
5.7 KiB
PHP
217 lines
5.7 KiB
PHP
{%MainUnit ../graphics.pp}
|
|
|
|
{******************************************************************************
|
|
TREGION
|
|
******************************************************************************
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.Create
|
|
Params: none
|
|
Returns: Nothing
|
|
|
|
Constructor for the class.
|
|
------------------------------------------------------------------------------}
|
|
constructor TRegion.Create;
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.Destroy
|
|
Params: None
|
|
Returns: Nothing
|
|
|
|
Destructor for the class.
|
|
------------------------------------------------------------------------------}
|
|
destructor TRegion.Destroy;
|
|
begin
|
|
FreeReference;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.Assign
|
|
Params: Source: Another brush
|
|
Returns: nothing
|
|
|
|
Copies the source brush to itself
|
|
------------------------------------------------------------------------------}
|
|
procedure TRegion.Assign(Source : Tpersistent);
|
|
begin
|
|
if Source is TRegion then
|
|
begin
|
|
Exit;
|
|
end;
|
|
|
|
inherited Assign(Source);
|
|
end;
|
|
|
|
procedure TRegion.AddRectangle(X1, Y1, X2, Y2: Integer);
|
|
var
|
|
lRGN: HRGN;
|
|
begin
|
|
ReferenceNeeded();
|
|
lRGN := CreateRectRgn(X1, Y1, X2, Y2);
|
|
CombineRgn(FReference.Handle, FReference.Handle, lRGN, RGN_OR);
|
|
DeleteObject(lRGN);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.SetHandle
|
|
Params: a region handle
|
|
Returns: nothing
|
|
|
|
sets the region to an external created region
|
|
------------------------------------------------------------------------------}
|
|
procedure TRegion.SetHandle(const Value: HRGN);
|
|
begin
|
|
if HRGN(FReference.Handle) = Value then Exit;
|
|
|
|
FreeReference;
|
|
FReference._lclHandle := TLCLHandle(Value);
|
|
//TODO: query region description data
|
|
Changed;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Function: TRegion.GetHandle
|
|
Params: none
|
|
Returns: a handle to a Region gdiobject
|
|
|
|
Creates a region if needed
|
|
------------------------------------------------------------------------------}
|
|
function TRegion.GetHandle: HRGN;
|
|
begin
|
|
Result := HRGN(Reference.Handle);
|
|
end;
|
|
|
|
function TRegion.GetReference: TWSRegionReference;
|
|
begin
|
|
ReferenceNeeded;
|
|
Result := FReference;
|
|
end;
|
|
|
|
procedure TRegion.ReferenceNeeded;
|
|
// var
|
|
// i: Integer;
|
|
// lSource1, lSource2, lDest: HRGN;
|
|
begin
|
|
if FReference.Allocated then Exit;
|
|
|
|
FReference._lclHandle := TLCLHandle(CreateRectRgn(0, 0, 0, 0));
|
|
|
|
{ At the moment all operations are executed on a live handle, so not yet used
|
|
|
|
for i := 0 to Length(RegionOperations) - 1 do
|
|
begin
|
|
// TRegionCombineMode = (rgnAnd, rgnCopy, rgnDiff, rgnOr, rgnXOR);
|
|
case RegionOperations[i].ROType of
|
|
rgnNewRect:
|
|
begin
|
|
lDest := LCLIntf.CreateRectRgn(
|
|
RegionOperations[i].Rect.Left, RegionOperations[i].Rect.Top,
|
|
RegionOperations[i].Rect.Left + RegionOperations[i].Rect.Width,
|
|
RegionOperations[i].Rect.Top + RegionOperations[i].Rect.Height);
|
|
AddSubRegion(lDest);
|
|
end;
|
|
rgnCombine:
|
|
begin
|
|
RegionOperations[i].CombineMode:=;
|
|
|
|
CombineRgn(lDest, lSource1, lSource2);
|
|
end;
|
|
end;
|
|
Source1, Source2, Dest: Integer; // Index to the list of sub-regions, -1 indicates the main region
|
|
CombineMode: TRegionCombineMode; // Used only if ROType=rgnCombine
|
|
Rect: TRect; // Used for ROType=rgnNewRect
|
|
end;}
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.FreeReference
|
|
Params: none
|
|
Returns: Nothing
|
|
|
|
Frees a region handle if needed
|
|
------------------------------------------------------------------------------}
|
|
|
|
procedure TRegion.AddOperation(AOp: TRegionOperation);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TRegion.ClearSubRegions();
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TRegion.AddSubRegion(AHandle: HRGN);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TRegion.FreeReference;
|
|
begin
|
|
if not FReference.Allocated then Exit;
|
|
|
|
DeleteObject(HGDIOBJ(FReference.Handle));
|
|
FReference._lclHandle := 0;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.SetClipRect
|
|
Params: Value: the new value
|
|
Returns: nothing
|
|
|
|
Sets/clips the region to a rectangle value
|
|
------------------------------------------------------------------------------}
|
|
procedure TRegion.SetClipRect(Value : TRect);
|
|
begin
|
|
// if ClipRect = Value then Exit;
|
|
|
|
// FreeReference;
|
|
// ClipRect := Value;
|
|
|
|
// Changed;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TRegion.GetClipRect
|
|
Params: none
|
|
Returns: current rect
|
|
|
|
Gets the regions current clip rect
|
|
------------------------------------------------------------------------------}
|
|
function TRegion.GetClipRect : TRect;
|
|
begin
|
|
Result := Rect(0, 0, 0, 0);
|
|
// Result := ClipRect;
|
|
{ if FRegionData.Reference.Allocated
|
|
then begin
|
|
GetRgnBox(HRGN(FRegionData.Reference.Handle), @Result);
|
|
end
|
|
else begin
|
|
if FRegionData.Polygon <> nil
|
|
then begin
|
|
ReferenceNeeded;
|
|
if FRegionData.Reference.Allocated
|
|
then Result := GetClipRect
|
|
else Result := FRegionData.Rect;
|
|
//FreeReference; // ??? why free (mwe)
|
|
end
|
|
else
|
|
Result := FRegionData.Rect;
|
|
end;}
|
|
end;
|
|
|
|
// included by graphics.pp
|
|
|