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:
sekelsenmat
2011-05-18 14:05:55 +00:00
parent f468c5435b
commit 3820f12b27

View File

@ -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;