You've already forked lazarus-ccr
fpvectorial: Isolates the bezier to polygon conversion in a dedicated routine
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1892 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -1741,8 +1741,10 @@ begin
|
|||||||
//
|
//
|
||||||
if AToken.StrValue = 'eoclip' then
|
if AToken.StrValue = 'eoclip' then
|
||||||
begin
|
begin
|
||||||
{$ifndef FPVECTORIALDEBUG_CLIP_REGION}
|
{$ifdef FPVECTORIALDEBUG_PATHS}
|
||||||
WriteLn('[TvEPSVectorialReader.ExecutePathConstructionOperator] eoclip');
|
WriteLn('[TvEPSVectorialReader.ExecutePathConstructionOperator] eoclip');
|
||||||
|
{$endif}
|
||||||
|
{$ifndef FPVECTORIALDEBUG_CLIP_REGION}
|
||||||
AData.SetPenStyle(psClear);
|
AData.SetPenStyle(psClear);
|
||||||
{$endif}
|
{$endif}
|
||||||
AData.EndPath();
|
AData.EndPath();
|
||||||
|
@@ -153,6 +153,7 @@ var
|
|||||||
Cur2DBSegment: T2DBezierSegment absolute CurSegment;
|
Cur2DBSegment: T2DBezierSegment absolute CurSegment;
|
||||||
// For bezier
|
// For bezier
|
||||||
CurX, CurY: Integer; // Not modified by ADestX, etc
|
CurX, CurY: Integer; // Not modified by ADestX, etc
|
||||||
|
CoordX2, CoordY2, CoordX3, CoordY3, CoordX4, CoordY4: Integer;
|
||||||
CurveLength: Integer;
|
CurveLength: Integer;
|
||||||
t: Double;
|
t: Double;
|
||||||
// For polygons
|
// For polygons
|
||||||
@@ -279,36 +280,25 @@ begin
|
|||||||
lines between this parts }
|
lines between this parts }
|
||||||
st2DBezier, st3DBezier:
|
st2DBezier, st3DBezier:
|
||||||
begin
|
begin
|
||||||
CurveLength :=
|
CoordX := CoordToCanvasX(PosX);
|
||||||
Round(sqrt(sqr(Cur2DBSegment.X2 - PosX) + sqr(Cur2DBSegment.Y2 - PosY))) +
|
CoordY := CoordToCanvasY(PosY);
|
||||||
Round(sqrt(sqr(Cur2DBSegment.X3 - Cur2DBSegment.X2) + sqr(Cur2DBSegment.Y3 - Cur2DBSegment.Y2))) +
|
CoordX2 := CoordToCanvasX(Cur2DBSegment.X2);
|
||||||
Round(sqrt(sqr(Cur2DBSegment.X - Cur2DBSegment.X3) + sqr(Cur2DBSegment.Y - Cur2DBSegment.Y3)));
|
CoordY2 := CoordToCanvasY(Cur2DBSegment.Y2);
|
||||||
|
CoordX3 := CoordToCanvasX(Cur2DBSegment.X3);
|
||||||
|
CoordY3 := CoordToCanvasY(Cur2DBSegment.Y3);
|
||||||
|
CoordX4 := CoordToCanvasX(Cur2DBSegment.X);
|
||||||
|
CoordY4 := CoordToCanvasY(Cur2DBSegment.Y);
|
||||||
|
SetLength(Points, 0);
|
||||||
|
AddBezierToPoints(
|
||||||
|
Make2DPoint(CoordX, CoordY),
|
||||||
|
Make2DPoint(CoordX2, CoordY2),
|
||||||
|
Make2DPoint(CoordX3, CoordY3),
|
||||||
|
Make2DPoint(CoordX4, CoordY4),
|
||||||
|
Points
|
||||||
|
);
|
||||||
|
|
||||||
if (CurPath.Brush.Style <> bsClear) then
|
ADest.Brush.Style := CurPath.Brush.Style;
|
||||||
begin
|
ADest.Polygon(Points);
|
||||||
ADest.Brush.Style := CurPath.Brush.Style;
|
|
||||||
SetLength(Points, CurveLength);
|
|
||||||
end;
|
|
||||||
|
|
||||||
for k := 1 to CurveLength do
|
|
||||||
begin
|
|
||||||
t := k / CurveLength;
|
|
||||||
CurX := Round(sqr(1 - t) * (1 - t) * PosX + 3 * t * sqr(1 - t) * Cur2DBSegment.X2 + 3 * t * t * (1 - t) * Cur2DBSegment.X3 + t * t * t * Cur2DBSegment.X);
|
|
||||||
CurY := Round(sqr(1 - t) * (1 - t) * PosY + 3 * t * sqr(1 - t) * Cur2DBSegment.Y2 + 3 * t * t * (1 - t) * Cur2DBSegment.Y3 + t * t * t * Cur2DBSegment.Y);
|
|
||||||
CoordX := CoordToCanvasX(CurX);
|
|
||||||
CoordY := CoordToCanvasY(CurY);
|
|
||||||
ADest.LineTo(CoordX, CoordY);
|
|
||||||
|
|
||||||
if (CurPath.Brush.Style = bsSolid) then
|
|
||||||
begin
|
|
||||||
Points[k-1].X := CoordX;
|
|
||||||
Points[k-1].Y := CoordY;
|
|
||||||
end;
|
|
||||||
// {$ifdef FPVECTORIAL_TOCANVAS_DEBUG}
|
|
||||||
// Write(Format(' CL%d,%d', [CoordX, CoordY]));
|
|
||||||
// {$endif}
|
|
||||||
end;
|
|
||||||
if (CurPath.Brush.Style = bsSolid) then ADest.Polygon(Points);
|
|
||||||
|
|
||||||
PosX := Cur2DSegment.X;
|
PosX := Cur2DSegment.X;
|
||||||
PosY := Cur2DSegment.Y;
|
PosY := Cur2DSegment.Y;
|
||||||
|
@@ -28,6 +28,7 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
T10Strings = array[0..9] of shortstring;
|
T10Strings = array[0..9] of shortstring;
|
||||||
|
TPointsArray = array of TPoint;
|
||||||
|
|
||||||
// Color Conversion routines
|
// Color Conversion routines
|
||||||
function FPColorToRGBHexString(AColor: TFPColor): string;
|
function FPColorToRGBHexString(AColor: TFPColor): string;
|
||||||
@@ -42,6 +43,7 @@ function SeparateString(AString: string; ASeparator: char): T10Strings;
|
|||||||
// Mathematical routines
|
// Mathematical routines
|
||||||
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);
|
||||||
// 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;
|
||||||
@@ -186,6 +188,30 @@ begin
|
|||||||
EllipticalArcToBezier(Xc, Yc, R, R, startAngle, endAngle, P1, P2, P3, P4);
|
EllipticalArcToBezier(Xc, Yc, R, R, startAngle, endAngle, P1, P2, P3, P4);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ This routine converts a Bezier to a Polygon and adds the points of this poligon
|
||||||
|
to the end of the provided Points output variables }
|
||||||
|
procedure AddBezierToPoints(P1, P2, P3, P4: T3DPoint; var Points: TPointsArray);
|
||||||
|
var
|
||||||
|
CurveLength, k, CurX, CurY, LastPoint: Integer;
|
||||||
|
t: Double;
|
||||||
|
begin
|
||||||
|
CurveLength :=
|
||||||
|
Round(sqrt(sqr(P2.X - P1.X) + sqr(P2.Y - P1.Y))) +
|
||||||
|
Round(sqrt(sqr(P3.X - P2.X) + sqr(P3.Y - P2.Y))) +
|
||||||
|
Round(sqrt(sqr(P4.X - P4.X) + sqr(P4.Y - P3.Y)));
|
||||||
|
|
||||||
|
LastPoint := Length(Points)-1;
|
||||||
|
SetLength(Points, Length(Points)+CurveLength);
|
||||||
|
for k := 1 to CurveLength do
|
||||||
|
begin
|
||||||
|
t := k / CurveLength;
|
||||||
|
CurX := Round(sqr(1 - t) * (1 - t) * P1.X + 3 * t * sqr(1 - t) * P2.X + 3 * t * t * (1 - t) * P3.X + t * t * t * P4.X);
|
||||||
|
CurY := Round(sqr(1 - t) * (1 - t) * P1.Y + 3 * t * sqr(1 - t) * P2.Y + 3 * t * t * (1 - t) * P3.Y + t * t * t * P4.Y);
|
||||||
|
Points[LastPoint+k].X := CurX;
|
||||||
|
Points[LastPoint+k].Y := CurY;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{$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;
|
||||||
var
|
var
|
||||||
|
Reference in New Issue
Block a user