diff --git a/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas b/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas index 9ef805a46..702d819dc 100644 --- a/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas +++ b/applications/fpvviewer/fpvectorialsrc/epsvectorialreader.pas @@ -14,7 +14,7 @@ unit epsvectorialreader; {$mode objfpc}{$H+} -{$define FPVECTORIALDEBUG_PATHS} +{.$define FPVECTORIALDEBUG_PATHS} {.$define FPVECTORIALDEBUG_COLORS} {.$define FPVECTORIALDEBUG_ROLL} {.$define FPVECTORIALDEBUG_CODEFLOW} @@ -159,8 +159,12 @@ begin Result.Color := Color; Result.TranslateX := TranslateX; Result.TranslateY := TranslateY; + Result.ScaleX := ScaleX; + Result.ScaleY := ScaleY; Result.ClipPath := ClipPath; + Result.ClipMode := ClipMode; Result.OverPrint := OverPrint; + Result.PenWidth := PenWidth; end; { TPSToken } @@ -1227,6 +1231,12 @@ begin {$ifdef FPVECTORIALDEBUG_PATHS} WriteLn('[TvEPSVectorialReader.ExecutePaintingOperator] stroke'); {$endif} + AData.SetPenStyle(psSolid); + AData.SetBrushStyle(bsClear); + AData.SetPenColor(CurrentGraphicState.Color); + AData.SetClipPath(CurrentGraphicState.ClipPath, CurrentGraphicState.ClipMode); + AData.SetPenWidth(CurrentGraphicState.PenWidth); + AData.EndPath(); Exit(True); end; @@ -1236,6 +1246,10 @@ begin WriteLn('[TvEPSVectorialReader.ExecutePaintingOperator] eofill'); {$endif} AData.SetBrushStyle(bsSolid); + AData.SetPenStyle(psSolid); + AData.SetClipPath(CurrentGraphicState.ClipPath, CurrentGraphicState.ClipMode); + AData.SetPenWidth(CurrentGraphicState.PenWidth); + AData.EndPath(); Exit(True); end; @@ -1581,13 +1595,17 @@ begin {$ifdef FPVECTORIALDEBUG_PATHS} WriteLn('[TvEPSVectorialReader.ExecutePathConstructionOperator] newpath'); {$endif} - AData.SetClipPath(CurrentGraphicState.ClipPath, CurrentGraphicState.ClipMode); - AData.SetPenWidth(CurrentGraphicState.PenWidth); +// AData.SetClipPath(CurrentGraphicState.ClipPath, CurrentGraphicState.ClipMode); +// AData.SetPenWidth(CurrentGraphicState.PenWidth); +// AData.SetClipPath(CurrentGraphicState.ClipPath, CurrentGraphicState.ClipMode); + AData.SetBrushStyle(bsClear); + AData.SetPenStyle(psClear); AData.EndPath(); AData.StartPath(); AData.SetPenColor(CurrentGraphicState.Color); AData.SetBrushColor(CurrentGraphicState.Color); + AData.SetPenStyle(psClear); Exit(True); end; @@ -1629,8 +1647,8 @@ begin Param2 := TPSToken(Stack.Pop); PostScriptCoordsToFPVectorialCoords(Param1, Param2, PosX, PosY); AData.GetCurrentPathPenPos(BaseX, BaseY); - PosX2 := PosX + BaseX;//CurrentGraphicState.TranslateX; - PosY2 := PosY + BaseY;//CurrentGraphicState.TranslateY; + PosX2 := PosX + BaseX; + PosY2 := PosY + BaseY; {$ifdef FPVECTORIALDEBUG_PATHS} WriteLn(Format('[TvEPSVectorialReader.ExecutePathConstructionOperator] rlineto %f, %f Base %f, %f Resulting %f, %f', [PosX, PosY, BaseX, BaseY, PosX2, PosY2])); @@ -1659,10 +1677,10 @@ begin PostScriptCoordsToFPVectorialCoords(Param1, Param2, PosX3, PosY3); AData.GetCurrentPathPenPos(BaseX, BaseY); // First move to the start of the arc - BaseX := BaseX + CurrentGraphicState.TranslateX; - BaseY := BaseY + CurrentGraphicState.TranslateY; +// BaseX := BaseX + CurrentGraphicState.TranslateX; +// BaseY := BaseY + CurrentGraphicState.TranslateY; {$ifdef FPVECTORIALDEBUG_PATHS} - WriteLn(Format('[TvEPSVectorialReader.ExecutePathConstructionOperator] translate %f, %f', + WriteLn(Format('[TvEPSVectorialReader.ExecutePathConstructionOperator] rcurveto translate %f, %f', [CurrentGraphicState.TranslateX, CurrentGraphicState.TranslateY])); WriteLn(Format('[TvEPSVectorialReader.ExecutePathConstructionOperator] rcurveto from %f, %f via %f, %f %f, %f to %f, %f', [BaseX, BaseY, BaseX + PosX, BaseY + PosY, BaseX + PosX2, BaseY + PosY2, BaseX + PosX3, BaseY + PosY3])); @@ -1747,6 +1765,7 @@ begin {$ifndef FPVECTORIALDEBUG_CLIP_REGION} AData.SetPenStyle(psClear); {$endif} + AData.SetBrushStyle(bsClear); AData.EndPath(); CurrentGraphicState.ClipPath := AData.GetPath(AData.GetPathCount()-1); CurrentGraphicState.ClipMode := vcmEvenOddRule; diff --git a/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas b/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas index abe053a55..3a085f6db 100644 --- a/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas +++ b/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas @@ -9,6 +9,9 @@ interface {$define USE_CANVAS_CLIP_REGION} {.$define DEBUG_CANVAS_CLIP_REGION} {$endif} +{$ifndef Windows} +{.$define FPVECTORIAL_TOCANVAS_DEBUG} +{$endif} uses Classes, SysUtils, Math, @@ -34,10 +37,6 @@ procedure DrawFPVTextToCanvas(ASource: TvVectorialDocument; CurText: TvText; implementation -{$ifndef Windows} -{$define FPVECTORIAL_TOCANVAS_DEBUG} -{$endif} - function Rotate2DPoint(P,Fix :TPoint; alpha:double): TPoint; var sinus, cosinus : Extended; @@ -259,9 +258,12 @@ begin begin ADest.Pen.FPColor := T2DSegmentWithPen(Cur2DSegment).Pen.Color; - CoordX := CoordToCanvasX(Cur2DSegment.X); - CoordY := CoordToCanvasY(Cur2DSegment.Y); - ADest.LineTo(CoordX, CoordY); + CoordX := CoordToCanvasX(PosX); + CoordY := CoordToCanvasY(PosY); + CoordX2 := CoordToCanvasX(Cur2DSegment.X); + CoordY2 := CoordToCanvasY(Cur2DSegment.Y); + ADest.Line(CoordX, CoordY, CoordX2, CoordY2); + PosX := Cur2DSegment.X; PosY := Cur2DSegment.Y; @@ -273,9 +275,11 @@ begin end; st2DLine, st3DLine: begin - CoordX := CoordToCanvasX(Cur2DSegment.X); - CoordY := CoordToCanvasY(Cur2DSegment.Y); - ADest.LineTo(CoordX, CoordY); + CoordX := CoordToCanvasX(PosX); + CoordY := CoordToCanvasY(PosY); + CoordX2 := CoordToCanvasX(Cur2DSegment.X); + CoordY2 := CoordToCanvasY(Cur2DSegment.Y); + ADest.Line(CoordX, CoordY, CoordX2, CoordY2); PosX := Cur2DSegment.X; PosY := Cur2DSegment.Y; {$ifdef FPVECTORIAL_TOCANVAS_DEBUG} @@ -304,7 +308,8 @@ begin ); ADest.Brush.Style := CurPath.Brush.Style; - ADest.Polygon(Points); + if Length(Points) >= 3 then + ADest.Polygon(Points); PosX := Cur2DSegment.X; PosY := Cur2DSegment.Y; diff --git a/applications/fpvviewer/fpvectorialsrc/fpvutils.pas b/applications/fpvviewer/fpvectorialsrc/fpvutils.pas index 340671e30..71fbd0561 100644 --- a/applications/fpvviewer/fpvectorialsrc/fpvutils.pas +++ b/applications/fpvviewer/fpvectorialsrc/fpvutils.pas @@ -12,6 +12,7 @@ AUTHORS: Felipe Monteiro de Carvalho unit fpvutils; {$define USE_LCL_CANVAS} +{.$define FPVECTORIAL_BEZIERTOPOINTS_DEBUG} {$ifdef fpc} {$mode delphi} @@ -196,6 +197,10 @@ var CurveLength, k, CurX, CurY, LastPoint: Integer; t: Double; begin + {$ifdef FPVECTORIAL_BEZIERTOPOINTS_DEBUG} + Write(Format('[AddBezierToPoints] P1=%f,%f P2=%f,%f P3=%f,%f P4=%f,%f =>', [P1.X, P1.Y, P2.X, P2.Y, P3.X, P3.Y, P4.X, P4.Y])); + {$endif} + 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))) + @@ -210,7 +215,13 @@ begin 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; + {$ifdef FPVECTORIAL_BEZIERTOPOINTS_DEBUG} + Write(Format(' P=%d,%d', [CurX, CurY])); + {$endif} end; + {$ifdef FPVECTORIAL_BEZIERTOPOINTS_DEBUG} + WriteLn(Format(' CurveLength=%d', [CurveLength])); + {$endif} end; procedure ConvertPathToPoints(APath: TPath; ADestX, ADestY: Integer; AMulX, AMulY: Double; var Points: TPointsArray);