mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-28 12:37:23 +01:00
fpvectorial: Fix svg reader bugs related with horizontal and vertical LinesTo commands
git-svn-id: trunk@50949 -
This commit is contained in:
parent
60c487ef0f
commit
29e33e5bb1
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user