fpvectorial: Initial support of raster images in html

git-svn-id: trunk@48296 -
This commit is contained in:
sekelsenmat 2015-03-12 12:31:05 +00:00
parent 0769a21e22
commit ff5035be40
2 changed files with 144 additions and 16 deletions

View File

@ -718,6 +718,7 @@ type
Width, Height: Double;
destructor Destroy; override;
procedure CreateRGB888Image(AWidth, AHeight: Cardinal);
procedure CreateImageFromFile(AFilename: string);
procedure InitializeWithConvertionOf3DPointsToHeightMap(APage: TvVectorialPage; AWidth, AHeight: Integer);
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
@ -965,6 +966,7 @@ type
destructor Destroy; override;
function AddText(AText: string): TvText;
function AddField(AKind : TvFieldKind): TvField;
function AddRasterImage: TvRasterImage;
procedure CalculateBoundingBox(ADest: TFPCustomCanvas; var ALeft, ATop, ARight, ABottom: Double); override;
function TryToSelect(APos: TPoint; var ASubpart: Cardinal): TvFindEntityResult; override;
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
@ -1224,7 +1226,7 @@ type
procedure ReadFromStream(AStream: TStream; AFormat: TvVectorialFormat);
procedure ReadFromStrings(AStrings: TStrings; AFormat: TvVectorialFormat);
procedure ReadFromXML(ADoc: TXMLDocument; AFormat: TvVectorialFormat);
class function GetFormatFromExtension(AFileName: string): TvVectorialFormat;
class function GetFormatFromExtension(AFileName: string; ARaiseException: Boolean = True): TvVectorialFormat;
function GetDetailedFileFormat(): string;
procedure GuessDocumentSize();
procedure GuessGoodZoomLevel(AScreenSize: Integer = 500);
@ -1432,6 +1434,7 @@ type
TvCustomVectorialReader = class
protected
FFilename: string;
class function GetTextContentsFromNode(ANode: TDOMNode): DOMString;
public
{ General reading methods }
@ -4528,6 +4531,25 @@ begin
{$endif}
end;
procedure TvRasterImage.CreateImageFromFile(AFilename: string);
{$ifdef USE_LCL_CANVAS}
var
AImage: TLazIntfImage;
lRawImage: TRawImage;
{$endif}
begin
{$ifdef USE_LCL_CANVAS}
lRawImage.Init;
lRawImage.Description.Init_BPP32_A8R8G8B8_BIO_TTB(0,0);
lRawImage.CreateData(false);
AImage := TLazIntfImage.Create(0,0);
AImage.SetRawImage(lRawImage);
AImage.LoadFromFile(AFilename);
RasterImage := AImage;
{$endif}
end;
procedure TvRasterImage.InitializeWithConvertionOf3DPointsToHeightMap(APage: TvVectorialPage; AWidth, AHeight: Integer);
var
lEntity: TvEntity;
@ -4636,6 +4658,9 @@ begin
end;
{$endif}
CalcEntityCanvasMinMaxXY(ARenderInfo, lFinalX, lFinalY);
CalcEntityCanvasMinMaxXY(ARenderInfo, lFinalX+lFinalW, lFinalY+lFinalH);
//ADest.Draw(lFinalX, lFinalY, RasterImage); doesnt work
end;
@ -5773,6 +5798,12 @@ begin
AddEntity(Result);
end;
function TvParagraph.AddRasterImage: TvRasterImage;
begin
Result := TvRasterImage.Create(FPage);
AddEntity(Result);
end;
procedure TvParagraph.CalculateBoundingBox(ADest: TFPCustomCanvas; var ALeft,
ATop, ARight, ABottom: Double);
var
@ -5880,6 +5911,18 @@ begin
lText.Y := OldTextY;
if lResetOldStyle then
TvText(lEntity).Style := nil;
end
else
begin
OldTextX := lText.X;
OldTextY := lText.Y;
lEntity.X := CoordToCanvasX(lEntity.X + X + lCurWidth);
lEntity.Y := lEntity.Y + Y;
lEntity.Render(ADest, lEntityRenderInfo, ADestX, ADestY, AMulX, AMuly);
lEntity.X := OldTextX;
lEntity.Y := OldTextY;
end;
MergeRenderInfo(lEntityRenderInfo, ARenderInfo);
@ -7262,8 +7305,8 @@ begin
end;
end;
class function TvVectorialDocument.GetFormatFromExtension(AFileName: string
): TvVectorialFormat;
class function TvVectorialDocument.GetFormatFromExtension(AFileName: string;
ARaiseException: Boolean = True): TvVectorialFormat;
var
lExt: string;
begin
@ -7283,8 +7326,10 @@ begin
else if AnsiCompareText(lExt, STR_ODG_EXTENSION) = 0 then Result := vfODG
else if AnsiCompareText(lExt, STR_DOCX_EXTENSION) = 0 then Result := vfDOCX
else if AnsiCompareText(lExt, STR_HTML_EXTENSION) = 0 then Result := vfHTML
else if ARaiseException then
raise Exception.Create('TvVectorialDocument.GetFormatFromExtension: The extension (' + lExt + ') doesn''t match any supported formats.')
else
raise Exception.Create('TvVectorialDocument.GetFormatFromExtension: The extension (' + lExt + ') doesn''t match any supported formats.');
Result := vfUnknown;
end;
function TvVectorialDocument.GetDetailedFileFormat(): string;
@ -7739,6 +7784,7 @@ procedure TvCustomVectorialReader.ReadFromFile(AFileName: string; AData: TvVecto
var
FileStream: TFileStream;
begin
FFilename := AFilename;
FileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
try
ReadFromStream(FileStream, AData);

View File

@ -32,7 +32,7 @@ type
//
function ReadEntityFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadHeaderFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadParagraphFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
procedure ReadParagraphFromNode(ADest: TvParagraph; ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument);
function ReadSVGFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadMathFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadTableFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
@ -77,12 +77,18 @@ function TvHTMLVectorialReader.ReadEntityFromNode(ANode: TDOMNode;
AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
var
lEntityName: DOMString;
lPara: TvParagraph;
begin
Result := nil;
lEntityName := LowerCase(ANode.NodeName);
case lEntityName of
'h1', 'h2', 'h3', 'h4', 'h5', 'h6': Result := ReadHeaderFromNode(ANode, AData, ADoc);
'p': Result := ReadParagraphFromNode(ANode, AData, ADoc);
'p':
begin
lPara := AData.AddParagraph();
ReadParagraphFromNode(lPara, ANode, AData, ADoc);
Result := nil;
end;
'svg': Result := ReadSVGFromNode(ANode, AData, ADoc);
'math': Result := ReadMathFromNode(ANode, AData, ADoc);
'table': Result := ReadTableFromNode(ANode, AData, ADoc);
@ -114,18 +120,93 @@ begin
end;
end;
function TvHTMLVectorialReader.ReadParagraphFromNode(ANode: TDOMNode;
AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
procedure TvHTMLVectorialReader.ReadParagraphFromNode(ADest: TvParagraph; ANode: TDOMNode;
AData: TvTextPageSequence; ADoc: TvVectorialDocument);
var
CurParagraph: TvParagraph;
lText: TvText;
lTextStr: string;
lCurNode: TDOMNode;
lNodeName, lNodeValue, lAttrName, lAttrValue: DOMString;
lCurAttr: TDOMNode;
lRasterImage: TvRasterImage;
i: Integer;
lWidth, lHeight: Double;
begin
Result := nil;
CurParagraph := AData.AddParagraph();
CurParagraph.Style := ADoc.StyleTextBody;
lTextStr := ANode.FirstChild.NodeValue;
lText := CurParagraph.AddText(lTextStr);
ADest.Style := ADoc.StyleTextBody;
lCurNode := ANode.FirstChild;
while Assigned(lCurNode) do
begin
lNodeName := lCurNode.NodeName;
lNodeValue := lCurNode.NodeValue;
if lCurNode is TDOMText then
begin
lTextStr := lNodeValue;
lText := ADest.AddText(lTextStr);
lCurNode := lCurNode.NextSibling;
Continue;
end;
case lNodeName of
// <image width="100" height="100" xlink:href="data:image/png;base64,UgAAA....QSK5CYII="/>
// <img src="images/noimage.gif" width="100" height="100" alt="No image" />
'img', 'image':
begin
for i := 0 to lCurNode.Attributes.Length - 1 do
begin
lRasterImage := nil;
lAttrName := lCurNode.Attributes.Item[i].NodeName;
lAttrValue := lCurNode.Attributes.Item[i].NodeValue;
case lAttrName of
'src':
begin
lAttrValue := lCurAttr.NodeValue;
lAttrValue := ExtractFilePath(FFilename) + lAttrValue;
if TvVectorialDocument.GetFormatFromExtension(lAttrValue, False) = vfUnknown then
begin
if not FileExists(lAttrValue) then Continue;
lRasterImage := ADest.AddRasterImage();
lRasterImage.CreateImageFromFile(lAttrValue);
end
else
begin
{lRasterImage := ADest.AddRasterImage()
lRasterImage.CreateImageFromFile(lAttrValue);}
end;
end;
'xlink:href':
begin
{lAttrValue := lCurAttr.NodeValue;
lRasterImage := ADest.AddRasterImage();
lAttrValue := ExtractFilePath(FFilename) + lAttrValue;
lRasterImage.CreateImageFromFile(lAttrValue);}
end;
'width':
begin
lWidth := StrToInt(lAttrValue);
end;
'height':
begin
lHeight := StrToInt(lAttrValue);
end;
end;
end;
if lRasterImage <> nil then
begin
lRasterImage.Width := lWidth;
lRasterImage.Height := lHeight;
end;
end;
end;
lCurNode := lCurNode.NextSibling;
end;
end;
function TvHTMLVectorialReader.ReadSVGFromNode(ANode: TDOMNode;
@ -217,7 +298,7 @@ end;
function TvHTMLVectorialReader.ReadTableRowNode(ATable: TvTable; ANode: TDOMNode;
AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
var
lCurNode, lCurSubnode: TDOMNode;
lCurNode: TDOMNode;
lNodeName, lNodeValue: DOMString;
CurRow: TvTableRow;
CurCell: TvTableCell;
@ -242,8 +323,9 @@ begin
'td':
begin
CurCell := CurRow.AddCell();
CurCellPara := CurCell.AddParagraph();
CurCellPara.AddText(GetTextContentFromNode(lCurNode));
Self.ReadParagraphFromNode(CurCellPara, lCurNode, AData, ADoc);
end;
end;