You've already forked lazarus-ccr
fpvectorial: Merges svgreader fixes from fpc trunk
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1634 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -47,6 +47,13 @@ type
|
|||||||
FSVGPathTokenizer: TSVGPathTokenizer;
|
FSVGPathTokenizer: TSVGPathTokenizer;
|
||||||
procedure ReadPathFromNode(APath: TDOMNode; AData: TvVectorialDocument);
|
procedure ReadPathFromNode(APath: TDOMNode; AData: TvVectorialDocument);
|
||||||
procedure ReadPathFromString(AStr: string; AData: TvVectorialDocument);
|
procedure ReadPathFromString(AStr: string; AData: TvVectorialDocument);
|
||||||
|
function StringWithUnitToFloat(AStr: string): Single;
|
||||||
|
procedure ConvertSVGCoordinatesToFPVCoordinates(
|
||||||
|
const AData: TvVectorialDocument;
|
||||||
|
const ASrcX, ASrcY: Float; var ADestX, ADestY: Float);
|
||||||
|
procedure ConvertSVGDeltaToFPVDelta(
|
||||||
|
const AData: TvVectorialDocument;
|
||||||
|
const ASrcX, ASrcY: Float; var ADestX, ADestY: Float);
|
||||||
public
|
public
|
||||||
{ General reading methods }
|
{ General reading methods }
|
||||||
constructor Create; override;
|
constructor Create; override;
|
||||||
@ -101,7 +108,6 @@ begin
|
|||||||
begin
|
begin
|
||||||
lToken.TokenType := sttFloatValue;
|
lToken.TokenType := sttFloatValue;
|
||||||
lToken.Value := StrToFloat(AStr, FPointSeparator);
|
lToken.Value := StrToFloat(AStr, FPointSeparator);
|
||||||
lToken.Value := lToken.Value * FLOAT_MILIMETERS_PER_PIXEL;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Tokens.Add(lToken);
|
Tokens.Add(lToken);
|
||||||
@ -211,7 +217,8 @@ procedure TvSVGVectorialReader.ReadPathFromString(AStr: string;
|
|||||||
AData: TvVectorialDocument);
|
AData: TvVectorialDocument);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
X, Y, CurX, CurY: Float;
|
X, Y, X2, Y2, X3, Y3: Float;
|
||||||
|
CurX, CurY: Float;
|
||||||
begin
|
begin
|
||||||
FSVGPathTokenizer.Tokens.Clear;
|
FSVGPathTokenizer.Tokens.Clear;
|
||||||
FSVGPathTokenizer.TokenizePathString(AStr);
|
FSVGPathTokenizer.TokenizePathString(AStr);
|
||||||
@ -225,6 +232,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
CurX := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
CurX := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
||||||
CurY := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
CurY := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
||||||
|
ConvertSVGCoordinatesToFPVCoordinates(AData, CurX, CurY, CurX, CurY);
|
||||||
|
|
||||||
AData.AddMoveToPath(CurX, CurY);
|
AData.AddMoveToPath(CurX, CurY);
|
||||||
|
|
||||||
@ -234,6 +242,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
X := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
X := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
||||||
Y := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
Y := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
||||||
|
|
||||||
// LineTo uses relative coordenates in SVG
|
// LineTo uses relative coordenates in SVG
|
||||||
CurX := CurX + X;
|
CurX := CurX + X;
|
||||||
@ -243,6 +252,27 @@ begin
|
|||||||
|
|
||||||
Inc(i, 3);
|
Inc(i, 3);
|
||||||
end
|
end
|
||||||
|
else if FSVGPathTokenizer.Tokens.Items[i].TokenType = sttBezierTo then
|
||||||
|
begin
|
||||||
|
X2 := FSVGPathTokenizer.Tokens.Items[i+1].Value;
|
||||||
|
Y2 := FSVGPathTokenizer.Tokens.Items[i+2].Value;
|
||||||
|
X3 := FSVGPathTokenizer.Tokens.Items[i+3].Value;
|
||||||
|
Y3 := FSVGPathTokenizer.Tokens.Items[i+4].Value;
|
||||||
|
X := FSVGPathTokenizer.Tokens.Items[i+5].Value;
|
||||||
|
Y := FSVGPathTokenizer.Tokens.Items[i+6].Value;
|
||||||
|
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X2, Y2, X2, Y2);
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X3, Y3, X3, Y3);
|
||||||
|
ConvertSVGDeltaToFPVDelta(AData, X, Y, X, Y);
|
||||||
|
|
||||||
|
AData.AddBezierToPath(X2 + CurX, Y2 + CurY, X3 + CurX, Y3 + CurY, X + CurX, Y + CurY);
|
||||||
|
|
||||||
|
// BezierTo uses relative coordenates in SVG
|
||||||
|
CurX := CurX + X;
|
||||||
|
CurY := CurY + Y;
|
||||||
|
|
||||||
|
Inc(i, 7);
|
||||||
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
Inc(i);
|
Inc(i);
|
||||||
@ -250,6 +280,37 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TvSVGVectorialReader.StringWithUnitToFloat(AStr: string): Single;
|
||||||
|
var
|
||||||
|
UnitStr, ValueStr: string;
|
||||||
|
Len: Integer;
|
||||||
|
begin
|
||||||
|
// Check the unit
|
||||||
|
Len := Length(AStr);
|
||||||
|
UnitStr := Copy(AStr, Len-1, 2);
|
||||||
|
if UnitStr = 'mm' then
|
||||||
|
begin
|
||||||
|
ValueStr := Copy(AStr, 1, Len-2);
|
||||||
|
Result := StrToInt(ValueStr);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TvSVGVectorialReader.ConvertSVGCoordinatesToFPVCoordinates(
|
||||||
|
const AData: TvVectorialDocument; const ASrcX, ASrcY: Float;
|
||||||
|
var ADestX,ADestY: Float);
|
||||||
|
begin
|
||||||
|
ADestX := ASrcX * FLOAT_MILIMETERS_PER_PIXEL;
|
||||||
|
ADestY := AData.Height - ASrcY * FLOAT_MILIMETERS_PER_PIXEL;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TvSVGVectorialReader.ConvertSVGDeltaToFPVDelta(
|
||||||
|
const AData: TvVectorialDocument; const ASrcX, ASrcY: Float; var ADestX,
|
||||||
|
ADestY: Float);
|
||||||
|
begin
|
||||||
|
ADestX := ASrcX * FLOAT_MILIMETERS_PER_PIXEL;
|
||||||
|
ADestY := - ASrcY * FLOAT_MILIMETERS_PER_PIXEL;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TvSVGVectorialReader.Create;
|
constructor TvSVGVectorialReader.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -278,6 +339,10 @@ begin
|
|||||||
// Read in xml file from the stream
|
// Read in xml file from the stream
|
||||||
ReadXMLFile(Doc, AStream);
|
ReadXMLFile(Doc, AStream);
|
||||||
|
|
||||||
|
// Read the properties of the <svg> tag
|
||||||
|
AData.Width := StringWithUnitToFloat(Doc.DocumentElement.GetAttribute('width'));
|
||||||
|
AData.Height := StringWithUnitToFloat(Doc.DocumentElement.GetAttribute('height'));
|
||||||
|
|
||||||
// Now process the elements inside the first layer
|
// Now process the elements inside the first layer
|
||||||
lFirstLayer := Doc.DocumentElement.FirstChild;
|
lFirstLayer := Doc.DocumentElement.FirstChild;
|
||||||
lCurNode := lFirstLayer.FirstChild;
|
lCurNode := lFirstLayer.FirstChild;
|
||||||
|
Reference in New Issue
Block a user