mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-02 15:32:46 +02:00
fpvectorial: Initial support of raster images in html
git-svn-id: trunk@48296 -
This commit is contained in:
parent
0769a21e22
commit
ff5035be40
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user