mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 06:19:32 +02:00
fpvectorial: Fixes a mistake in the reading of absolute coordinates of path elements in the SVG reader
git-svn-id: trunk@40760 -
This commit is contained in:
parent
8e6a62b3d6
commit
2075f09486
@ -1111,7 +1111,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
X := FSVGPathTokenizer.Tokens.Items[i].Value;
|
X := FSVGPathTokenizer.Tokens.Items[i].Value;
|
||||||
Y := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
Y := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X, Y, X, Y);
|
||||||
|
|
||||||
CurX := X;
|
CurX := X;
|
||||||
CurY := Y;
|
CurY := Y;
|
||||||
@ -1143,7 +1143,20 @@ begin
|
|||||||
X := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
X := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
||||||
if not (lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo]) then
|
if not (lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo]) then
|
||||||
Y := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
Y := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
|
||||||
|
// "l" LineTo uses relative coordenates in SVG
|
||||||
|
if lCurTokenType in [sttRelativeLineTo, sttRelativeHorzLineTo, sttRelativeVertLineTo] then
|
||||||
|
begin
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
||||||
|
CurX := CurX + X;
|
||||||
|
CurY := CurY + Y;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X, Y, X, Y);
|
||||||
|
CurX := X;
|
||||||
|
CurY := Y;
|
||||||
|
end;
|
||||||
|
|
||||||
// horizontal and vertical line corrections
|
// horizontal and vertical line corrections
|
||||||
if lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo] then
|
if lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo] then
|
||||||
@ -1154,17 +1167,6 @@ begin
|
|||||||
X := 0;
|
X := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// "l" LineTo uses relative coordenates in SVG
|
|
||||||
if lCurTokenType in [sttRelativeLineTo, sttRelativeHorzLineTo, sttRelativeVertLineTo] then
|
|
||||||
begin
|
|
||||||
CurX := CurX + X;
|
|
||||||
CurY := CurY + Y;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
CurX := X;
|
|
||||||
CurY := Y;
|
|
||||||
end;
|
|
||||||
AData.AddLineToPath(CurX, CurY);
|
AData.AddLineToPath(CurX, CurY);
|
||||||
|
|
||||||
if not (lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo]) then
|
if not (lCurTokenType in [sttHorzLineTo, sttRelativeHorzLineTo, sttVertLineTo, sttRelativeVertLineTo]) then
|
||||||
@ -1196,9 +1198,19 @@ begin
|
|||||||
Y := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
Y := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
// Careful that absolute coordinates require using ConvertSVGCoordinatesToFPVCoordinates
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X3, Y3, X3, Y3);
|
if lCurTokenType in [sttRelativeBezierTo, sttRelativeSmoothBezierTo] then
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
begin
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X3, Y3, X3, Y3);
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X3, Y3, X3, Y3);
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X, Y, X, Y);
|
||||||
|
end;
|
||||||
|
|
||||||
if lCurTokenType = sttRelativeBezierTo then
|
if lCurTokenType = sttRelativeBezierTo then
|
||||||
begin
|
begin
|
||||||
@ -1227,8 +1239,17 @@ begin
|
|||||||
X := FSVGPathTokenizer.Tokens.Items[i+3].Value;
|
X := FSVGPathTokenizer.Tokens.Items[i+3].Value;
|
||||||
Y := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
Y := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
||||||
|
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
// Careful that absolute coordinates require using ConvertSVGCoordinatesToFPVCoordinates
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
if lCurTokenType in [sttRelativeQuadraticBezierTo] then
|
||||||
|
begin
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X, Y, X, Y);
|
||||||
|
end;
|
||||||
|
|
||||||
if lCurTokenType = sttRelativeQuadraticBezierTo then
|
if lCurTokenType = sttRelativeQuadraticBezierTo then
|
||||||
begin
|
begin
|
||||||
@ -1255,8 +1276,17 @@ begin
|
|||||||
X := FSVGPathTokenizer.Tokens.Items[i+3].Value;
|
X := FSVGPathTokenizer.Tokens.Items[i+3].Value;
|
||||||
Y := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
Y := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
||||||
|
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
// Careful that absolute coordinates require using ConvertSVGCoordinatesToFPVCoordinates
|
||||||
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
if lCurTokenType in [sttRelativeQuadraticBezierTo] then
|
||||||
|
begin
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, X, Y, X, Y);
|
||||||
|
end;
|
||||||
|
|
||||||
if lCurTokenType = sttRelativeQuadraticBezierTo then
|
if lCurTokenType = sttRelativeQuadraticBezierTo then
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user