diff --git a/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas b/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas index 72433c9f4..0757077a0 100644 --- a/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas +++ b/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas @@ -1741,8 +1741,10 @@ begin // if AToken.StrValue = 'eoclip' then begin - {$ifndef FPVECTORIALDEBUG_CLIP_REGION} + {$ifdef FPVECTORIALDEBUG_PATHS} WriteLn('[TvEPSVectorialReader.ExecutePathConstructionOperator] eoclip'); + {$endif} + {$ifndef FPVECTORIALDEBUG_CLIP_REGION} AData.SetPenStyle(psClear); {$endif} AData.EndPath(); diff --git a/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas b/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas index 3a9442b44..ddc0085a5 100644 --- a/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas +++ b/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas @@ -153,6 +153,7 @@ var Cur2DBSegment: T2DBezierSegment absolute CurSegment; // For bezier CurX, CurY: Integer; // Not modified by ADestX, etc + CoordX2, CoordY2, CoordX3, CoordY3, CoordX4, CoordY4: Integer; CurveLength: Integer; t: Double; // For polygons @@ -279,36 +280,25 @@ begin lines between this parts } st2DBezier, st3DBezier: begin - CurveLength := - Round(sqrt(sqr(Cur2DBSegment.X2 - PosX) + sqr(Cur2DBSegment.Y2 - PosY))) + - Round(sqrt(sqr(Cur2DBSegment.X3 - Cur2DBSegment.X2) + sqr(Cur2DBSegment.Y3 - Cur2DBSegment.Y2))) + - Round(sqrt(sqr(Cur2DBSegment.X - Cur2DBSegment.X3) + sqr(Cur2DBSegment.Y - Cur2DBSegment.Y3))); + CoordX := CoordToCanvasX(PosX); + CoordY := CoordToCanvasY(PosY); + CoordX2 := CoordToCanvasX(Cur2DBSegment.X2); + 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 - begin - 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); + ADest.Brush.Style := CurPath.Brush.Style; + ADest.Polygon(Points); PosX := Cur2DSegment.X; PosY := Cur2DSegment.Y; diff --git a/applications/fpvviewer/fpvectorialsrc/fpvutils.pas b/applications/fpvviewer/fpvectorialsrc/fpvutils.pas index 4e0a09da0..51f35289b 100644 --- a/applications/fpvviewer/fpvectorialsrc/fpvutils.pas +++ b/applications/fpvviewer/fpvectorialsrc/fpvutils.pas @@ -28,6 +28,7 @@ uses type T10Strings = array[0..9] of shortstring; + TPointsArray = array of TPoint; // Color Conversion routines function FPColorToRGBHexString(AColor: TFPColor): string; @@ -42,6 +43,7 @@ function SeparateString(AString: string; ASeparator: char): T10Strings; // Mathematical routines 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 AddBezierToPoints(P1, P2, P3, P4: T3DPoint; var Points: TPointsArray); // LCL-related routines {$ifdef USE_LCL_CANVAS} 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); 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} function ConvertPathToRegion(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double): HRGN; var