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:
sekelsenmat
2011-09-04 09:39:57 +00:00
parent 2d0db03fad
commit ff31f3bc31
3 changed files with 51 additions and 10 deletions

View File

@@ -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

View File

@@ -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}

View File

@@ -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}