diff --git a/components/fpvectorial/odtvectorialwriter.pas b/components/fpvectorial/odtvectorialwriter.pas
index e3a392388e..e7ba026b63 100644
--- a/components/fpvectorial/odtvectorialwriter.pas
+++ b/components/fpvectorial/odtvectorialwriter.pas
@@ -95,6 +95,8 @@ type
FAutomaticStyleID : Integer;
FContentAutomaticStyles : string; // built during writedocument, used during writedocument
+ FRasterImageFileNames:TStringList;
+
FList_StyleCrossRef : TListStyle_StyleList;
FNewPageSequence : Boolean;
@@ -125,6 +127,10 @@ type
procedure WriteField(AEntity: TvField; AParagraph: TvParagraph;
ACurPage: TvTextPageSequence; AData: TvVectorialDocument);
procedure WriteList(AEntity: TvList; ACurPage: TvTextPageSequence; AData: TvVectorialDocument);
+
+ procedure WriteRasterImage(AEntity:TvRasterImage; AParagraph: TvParagraph;
+ ACurPage: TvTextPageSequence; AData: TvVectorialDocument);
+
// Routines to write parts of those files
function WriteStylesXMLAsString: string;
//
@@ -139,7 +145,7 @@ type
implementation
uses
- htmlelements;
+ htmlelements, FPWritePNG, Math;
const
{ OpenDocument general XML constants }
@@ -318,17 +324,28 @@ begin
end;
procedure TvODTVectorialWriter.WriteMetaInfManifest;
+var
+ i:integer;
begin
FMetaInfManifest :=
XML_HEADER + LineEnding +
'' + LineEnding +
- ' ' + LineEnding + // manifest:version="1.2"
+ ' ' + LineEnding; // manifest:version="1.2"
+
+ for i:= 0 to FRasterImageFileNames.Count-1 do
+ begin
+ FMetaInfManifest := FMetaInfManifest+
+ ' ' + LineEnding;
+ end;
+
+ FMetaInfManifest := FMetaInfManifest+
' ' + LineEnding +
' ' + LineEnding +
' ' + LineEnding +
' ' + LineEnding +
' ' + LineEnding +
'';
+
end;
procedure TvODTVectorialWriter.WriteManifestRDF;
@@ -1100,6 +1117,8 @@ begin
WriteTextSpan(TvText(lCurEntity), AEntity, ACurPage, AData)
else if (lCurEntity is TvField) then
WriteField(TvField(lCurEntity), AEntity, ACurPage, AData)
+ else if (lCurEntity is TvRasterImage) then
+ WriteRasterImage(TvRasterImage(lCurEntity), AEntity, ACurPage, AData)
else
raise exception.create('TvParagraph subentity '+lCurEntity.ClassName+' not handled');
end;
@@ -1680,6 +1699,34 @@ begin
' ' + LineEnding;
end;
+procedure TvODTVectorialWriter.WriteRasterImage(AEntity: TvRasterImage; AParagraph: TvParagraph;
+ ACurPage: TvTextPageSequence; AData: TvVectorialDocument);
+var
+ FRasterImageName:string;
+ FRasterImageHeight:double;
+ FRasterImageWidth:double;
+begin
+ if AEntity.RasterImage=nil then
+ Exit;
+
+ if IsZero(AEntity.Height) then
+ FRasterImageHeight:=RoundTo((AEntity.RasterImage.Height*2.54)/96,-3) // default 96 dpi of document, unit used cm
+ else
+ FRasterImageHeight:=AEntity.Height;
+
+ if IsZero(AEntity.Width) then
+ FRasterImageWidth:=RoundTo((AEntity.RasterImage.Width*2.54)/96,-3) // default 96 dpi of document, unit used cm
+ else
+ FRasterImageWidth:=AEntity.Width;
+
+ FRasterImageName:='Pictures/'+IntTostr(FRasterImageFileNames.Count+1)+'.png';
+ FContent:=FContent+'';
+ FContent:=FContent+'';
+ FContent:=FContent+'';
+
+ FRasterImageFileNames.AddObject(FRasterImageName,AEntity);
+end;
+
function TvODTVectorialWriter.WriteStylesXMLAsString: string;
begin
@@ -1700,10 +1747,13 @@ begin
FList_StyleCrossRef.Writer := Self;
FDateCount := 0;
+
+ FRasterImageFileNames:=TStringList.Create;
end;
destructor TvODTVectorialWriter.Destroy;
begin
+ FRasterImageFileNames.Free;
FList_StyleCrossRef.Free;
inherited Destroy;
@@ -1732,13 +1782,15 @@ var
// Streams with the contents of files
FSMeta, FSSettings, FSStyles, FSContent, FSMimetype: TStringStream;
FSMetaInfManifest, FSManifestRDF: TStringStream;
+ FSRasterImage:TMemoryStream;
+ i:integer;
+ WriterPNG:TFPWriterPNG;
+ FRasterImageStreamList:TFPList;
begin
FList_StyleCrossRef.Data := AData;
{ Fill the strings with the contents of the files }
-
WriteMimetype();
- WriteMetaInfManifest();
WriteManifestRDF();
WriteMeta();
WriteSettings();
@@ -1746,6 +1798,7 @@ begin
// built up during WriteDocument...
WriteDocument(AData);
WriteStyles(AData);
+ WriteMetaInfManifest();
{ Write the data to streams }
@@ -1757,8 +1810,13 @@ begin
FSMetaInfManifest := TStringStream.Create(FMetaInfManifest);
FSManifestRDF := TStringStream.Create(FManifestRDF);
- { Now compress the files }
+ FRasterImageStreamList:=nil;
+
+ WriterPNG:=TFPWriterPNG.Create;
+ WriterPNG.UseAlpha:=true;
+
+ { Now compress the files }
FZip := TZipper.Create;
try
// MimeType must be first file, and should be uncompressed
@@ -1773,8 +1831,25 @@ begin
FZip.Entries.AddFileEntry(FSMetaInfManifest, OPENDOC_PATH_METAINF_MANIFEST);
FZip.Entries.AddFileEntry(FSManifestRDF, OPENDOC_PATH_MANIFESTRDF);
+ FRasterImageStreamList:=TFPList.Create;
+
+ for i:=0 to FRasterImageFileNames.Count-1 do
+ begin
+ FSRasterImage:=TMemoryStream.Create;
+ TvRasterImage(FRasterImageFileNames.Objects[i]).RasterImage.SaveToStream(FSRasterImage,WriterPNG);
+ FRasterImageStreamList.Add(FSRasterImage);
+ FSRasterImage.Seek(0,soFromBeginning);
+ FZip.Entries.AddFileEntry(FSRasterImage, FRasterImageFileNames[i]);
+ end;
+
FZip.SaveToStream(AStream);
finally
+ if FRasterImageStreamList<> nil then
+ begin
+ for i:=0 to FRasterImageStreamList.Count-1 do
+ TvRasterImage(FRasterImageStreamList[i]).Free;
+ FRasterImageStreamList.Free;
+ end;
FZip.Free;
FSMeta.Free;
FSSettings.Free;
@@ -1783,6 +1858,7 @@ begin
FSMimetype.Free;
FSMetaInfManifest.Free;
FSManifestRDF.Free;
+ WriterPNG.Free;
end;
end;