You've already forked lazarus-ccr
fpvectorial: Prepares for more debug info for clip regions
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1893 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -22,7 +22,7 @@ unit epsvectorialreader;
|
|||||||
{.$define FPVECTORIALDEBUG_DICTIONARY}
|
{.$define FPVECTORIALDEBUG_DICTIONARY}
|
||||||
{.$define FPVECTORIALDEBUG_CONTROL}
|
{.$define FPVECTORIALDEBUG_CONTROL}
|
||||||
{.$define FPVECTORIALDEBUG_ARITHMETIC}
|
{.$define FPVECTORIALDEBUG_ARITHMETIC}
|
||||||
{$define FPVECTORIALDEBUG_CLIP_REGION}
|
{.$define FPVECTORIALDEBUG_CLIP_REGION}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
|
@@ -7,6 +7,7 @@ interface
|
|||||||
{$define USE_LCL_CANVAS}
|
{$define USE_LCL_CANVAS}
|
||||||
{$ifdef USE_LCL_CANVAS}
|
{$ifdef USE_LCL_CANVAS}
|
||||||
{$define USE_CANVAS_CLIP_REGION}
|
{$define USE_CANVAS_CLIP_REGION}
|
||||||
|
{$define DEBUG_CANVAS_CLIP_REGION}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@@ -186,6 +187,11 @@ begin
|
|||||||
ClipRegion := ConvertPathToRegion(CurPath.ClipPath, ADestX, ADestY, AMulX, AMulY);
|
ClipRegion := ConvertPathToRegion(CurPath.ClipPath, ADestX, ADestY, AMulX, AMulY);
|
||||||
SelectClipRgn(ACanvas.Handle, ClipRegion);
|
SelectClipRgn(ACanvas.Handle, ClipRegion);
|
||||||
DeleteObject(ClipRegion);
|
DeleteObject(ClipRegion);
|
||||||
|
// debug info
|
||||||
|
{$ifdef DEBUG_CANVAS_CLIP_REGION}
|
||||||
|
ConvertPathToPoints(CurPath.ClipPath, ADestX, ADestY, AMulX, AMulY, Points);
|
||||||
|
ACanvas.Polygon(Points);
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
|
@@ -44,6 +44,7 @@ function SeparateString(AString: string; ASeparator: char): T10Strings;
|
|||||||
procedure EllipticalArcToBezier(Xc, Yc, Rx, Ry, startAngle, endAngle: Double; var P1, P2, P3, P4: T3DPoint);
|
procedure EllipticalArcToBezier(Xc, Yc, Rx, Ry, startAngle, endAngle: Double; var P1, P2, P3, P4: T3DPoint);
|
||||||
procedure CircularArcToBezier(Xc, Yc, R, startAngle, endAngle: Double; var P1, P2, P3, P4: T3DPoint);
|
procedure CircularArcToBezier(Xc, Yc, R, startAngle, endAngle: Double; var P1, P2, P3, P4: T3DPoint);
|
||||||
procedure AddBezierToPoints(P1, P2, P3, P4: T3DPoint; var Points: TPointsArray);
|
procedure AddBezierToPoints(P1, P2, P3, P4: T3DPoint; var Points: TPointsArray);
|
||||||
|
procedure ConvertPathToPoints(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double; var Points: TPointsArray);
|
||||||
// LCL-related routines
|
// LCL-related routines
|
||||||
{$ifdef USE_LCL_CANVAS}
|
{$ifdef USE_LCL_CANVAS}
|
||||||
function ConvertPathToRegion(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double): HRGN;
|
function ConvertPathToRegion(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double): HRGN;
|
||||||
@@ -212,20 +213,19 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ifdef USE_LCL_CANVAS}
|
procedure ConvertPathToPoints(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double; var Points: TPointsArray);
|
||||||
function ConvertPathToRegion(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double): HRGN;
|
|
||||||
var
|
var
|
||||||
i: Integer;
|
i, LastPoint: Integer;
|
||||||
WindingMode: Integer;
|
|
||||||
Points: array of TPoint;
|
|
||||||
CoordX, CoordY: Integer;
|
CoordX, CoordY: Integer;
|
||||||
|
CoordX2, CoordY2, CoordX3, CoordY3, CoordX4, CoordY4: Integer;
|
||||||
// Segments
|
// Segments
|
||||||
CurSegment: TPathSegment;
|
CurSegment: TPathSegment;
|
||||||
Cur2DSegment: T2DSegment absolute CurSegment;
|
Cur2DSegment: T2DSegment absolute CurSegment;
|
||||||
|
Cur2DBSegment: T2DBezierSegment absolute CurSegment;
|
||||||
begin
|
begin
|
||||||
APath.PrepareForSequentialReading;
|
APath.PrepareForSequentialReading;
|
||||||
|
|
||||||
SetLength(Points, APath.Len);
|
SetLength(Points, 0);
|
||||||
|
|
||||||
for i := 0 to APath.Len - 1 do
|
for i := 0 to APath.Len - 1 do
|
||||||
begin
|
begin
|
||||||
@@ -234,14 +234,49 @@ begin
|
|||||||
CoordX := CoordToCanvasX(Cur2DSegment.X, ADestX, AMulX);
|
CoordX := CoordToCanvasX(Cur2DSegment.X, ADestX, AMulX);
|
||||||
CoordY := CoordToCanvasY(Cur2DSegment.Y, ADestY, AMulY);
|
CoordY := CoordToCanvasY(Cur2DSegment.Y, ADestY, AMulY);
|
||||||
|
|
||||||
Points[i].X := CoordX;
|
case CurSegment.SegmentType of
|
||||||
Points[i].Y := CoordY;
|
st2DBezier, st3DBezier:
|
||||||
|
begin
|
||||||
|
LastPoint := Length(Points)-1;
|
||||||
|
CoordX4 := CoordX;
|
||||||
|
CoordY4 := CoordY;
|
||||||
|
CoordX := Points[LastPoint].X;
|
||||||
|
CoordY := Points[LastPoint].Y;
|
||||||
|
CoordX2 := CoordToCanvasX(Cur2DBSegment.X2, ADestX, AMulX);
|
||||||
|
CoordY2 := CoordToCanvasY(Cur2DBSegment.Y2, ADestY, AMulY);
|
||||||
|
CoordX3 := CoordToCanvasX(Cur2DBSegment.X3, ADestX, AMulX);
|
||||||
|
CoordY3 := CoordToCanvasY(Cur2DBSegment.Y3, ADestY, AMulY);
|
||||||
|
AddBezierToPoints(
|
||||||
|
Make2DPoint(CoordX, CoordY),
|
||||||
|
Make2DPoint(CoordX2, CoordY2),
|
||||||
|
Make2DPoint(CoordX3, CoordY3),
|
||||||
|
Make2DPoint(CoordX4, CoordY4),
|
||||||
|
Points);
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
LastPoint := Length(Points);
|
||||||
|
SetLength(Points, Length(Points)+1);
|
||||||
|
Points[LastPoint].X := CoordX;
|
||||||
|
Points[LastPoint].Y := CoordY;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ifdef USE_LCL_CANVAS}
|
||||||
|
function ConvertPathToRegion(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double): HRGN;
|
||||||
|
var
|
||||||
|
WindingMode: Integer;
|
||||||
|
Points: array of TPoint;
|
||||||
|
begin
|
||||||
|
APath.PrepareForSequentialReading;
|
||||||
|
|
||||||
|
SetLength(Points, 0);
|
||||||
|
ConvertPathToPoints(APath, ADestX, ADestY, AMulX, AMulY, Points);
|
||||||
|
|
||||||
if APath.ClipMode = vcmEvenOddRule then WindingMode := LCLType.ALTERNATE
|
if APath.ClipMode = vcmEvenOddRule then WindingMode := LCLType.ALTERNATE
|
||||||
else WindingMode := LCLType.WINDING;
|
else WindingMode := LCLType.WINDING;
|
||||||
|
|
||||||
Result := LCLIntf.CreatePolygonRgn(@Points[0], APath.Len, WindingMode);
|
Result := LCLIntf.CreatePolygonRgn(@Points[0], Length(Points), WindingMode);
|
||||||
end;
|
end;
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user