fpvectorial: Fix svg reader bugs related with horizontal and vertical LinesTo commands

git-svn-id: trunk@50949 -
This commit is contained in:
wp 2015-12-19 19:36:12 +00:00
parent 60c487ef0f
commit 29e33e5bb1

View File

@ -1981,7 +1981,7 @@ procedure TvSVGVectorialReader.ReadNextPathCommand(ACurTokenType: TSVGTokenType;
var i: Integer; var CurX, CurY: Double; AData: TvVectorialPage; var i: Integer; var CurX, CurY: Double; AData: TvVectorialPage;
ADoc: TvVectorialDocument); ADoc: TvVectorialDocument);
var var
X, Y, X2, Y2, X3, Y3, XQ, YQ: Double; X, Y, X2, Y2, X3, Y3, XQ, YQ, tmp: Double;
LargeArcFlag, SweepFlag, LeftmostEllipse, ClockwiseArc: Boolean; LargeArcFlag, SweepFlag, LeftmostEllipse, ClockwiseArc: Boolean;
lCurTokenType: TSVGTokenType; lCurTokenType: TSVGTokenType;
lDebugStr: String; lDebugStr: String;
@ -2037,38 +2037,39 @@ begin
else if lCurTokenType in [sttLineTo, sttRelativeLineTo, sttHorzLineTo, else if lCurTokenType in [sttLineTo, sttRelativeLineTo, sttHorzLineTo,
sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo] then sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo] then
begin begin
X := FSVGPathTokenizer.Tokens.Items[i+1].Value; if lCurTokenType in [sttLineTo, sttRelativeLineTo] then
if not (lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo]) then begin
X := FSVGPathTokenizer.Tokens.Items[i+1].Value;
Y := FSVGPathTokenizer.Tokens.Items[i+2].Value; Y := FSVGPathTokenizer.Tokens.Items[i+2].Value;
if lCurTokenType = sttLineTo then
// "l" LineTo uses relative coordenates in SVG ConvertSVGCoordinatesToFPVCoordinates(AData, X,Y, CurX,CurY)
if lCurTokenType in [sttRelativeLineTo, sttRelativeHorzLineTo, sttRelativeVertLineTo] then else
begin
ConvertSVGDeltaToFPVDelta(AData, X,Y, X,Y);
CurX := CurX + X;
CurY := CurY + Y;
end;
inc(i, 3);
end else
if lCurTokenType in [sttHorzLineTo, sttVertLineTo] then
begin begin
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y); tmp := FSVGPathTokenizer.Tokens.Items[i+1].Value;
CurX := CurX + X; ConvertSVGCoordinatesToFPVCoordinates(AData, tmp, tmp, X, Y);
CurY := CurY + Y; if lCurTokenType = sttHorzLineTo then
end CurX := X else
else CurY := Y;
inc(i, 2);
end else
if lCurTokenType in [sttRelativeHorzLineTo, sttRelativeVertLineTo] then
begin begin
ConvertSVGCoordinatesToFPVCoordinates(AData, X, Y, X, Y); tmp := FSVGPathTokenizer.Tokens.Items[i+1].Value;
CurX := X; ConvertSVGDeltaToFPVDelta(AData, tmp, tmp, X, Y);
CurY := Y; if lCurTokenType = sttRelativeHorzLineTo then
CurX := CurX + X else
CurY := CurY + Y;
inc(i, 2);
end; end;
// horizontal and vertical line corrections
if lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo] then
Y := 0
else if lCurTokenType in [sttVertLineTo, sttRelativeVertLineTo] then
begin
Y := X;
X := 0;
end;
AData.AddLineToPath(CurX, CurY); AData.AddLineToPath(CurX, CurY);
if not (lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo]) then
Inc(i, 3)
else Inc(i, 2);
end end
// -------------- // --------------
// Cubic Bezier // Cubic Bezier