summaryrefslogtreecommitdiff
path: root/filter/source/svg/svgwriter.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-02-25 11:28:44 +0100
committerMiklos Vajna <vmiklos@collabora.com>2020-02-25 16:20:51 +0100
commitc7af36a6504a192f72fcd3a30712ca8c14e12fa5 (patch)
treea050d9364896cdb1604ba0e0411023dfb3bcda81 /filter/source/svg/svgwriter.cxx
parente0122fc683157b5f41724b9514e072f0ce5e5c15 (diff)
SVG export: try to reuse original bitmap data for JPG and PNG bitmaps
This has a number of benefits: 1) For a sample JPG photo, the SVG output is now 4,9MB, not 20MB. 2) Even the first export to SVG is fast, see commit 570be56b37e4ff105649e604ff4c8a6c368e2e79 (svx: cache PNG export of graphic shapes, 2020-02-25) for exact numbers. 3) Allow using less memory as the SdrGrafObj doesn't have to store a PNG result till the document is closed. We still require matching checksums, so in case anything problematic happens with the bitmap (grayscale filter applied, etc), then the optimization is meant to not help, but still produces correct output. Change-Id: Id3bc359a8dcc4c4d12d3b66ffb512cfa71939a26 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89419 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'filter/source/svg/svgwriter.cxx')
-rw-r--r--filter/source/svg/svgwriter.cxx45
1 files changed, 34 insertions, 11 deletions
diff --git a/filter/source/svg/svgwriter.cxx b/filter/source/svg/svgwriter.cxx
index 7706e2c26e44..9ccd18eaafee 100644
--- a/filter/source/svg/svgwriter.cxx
+++ b/filter/source/svg/svgwriter.cxx
@@ -2725,29 +2725,52 @@ void SVGActionWriter::ImplWriteBmp( const BitmapEx& rBmpEx,
bool bCached = false;
SdrGrafObj* pGrafObj = nullptr;
+ bool bPNG = false;
+ bool bJPG = false;
if (pShape)
{
pGrafObj = GetSdrGrafObjFromXShape(pShape);
- if (pGrafObj && pGrafObj->GetPNGPreviewChecksum() == rBmpEx.GetChecksum())
+ if (pGrafObj)
{
- const std::vector<sal_Int8>& rPreviewData = pGrafObj->GetPNGPreviewData();
- aOStm.WriteBytes(rPreviewData.data(), rPreviewData.size());
- bCached = true;
+ const Graphic& rGraphic = pGrafObj->GetGraphic();
+ if (rGraphic.GetType() == GraphicType::Bitmap)
+ {
+ const BitmapEx& rGraphicBitmap = rGraphic.GetBitmapExRef();
+ if (rGraphicBitmap.GetChecksum() == rBmpEx.GetChecksum())
+ {
+ GfxLink aGfxLink = rGraphic.GetGfxLink();
+ if (aGfxLink.GetType() == GfxLinkType::NativePng)
+ {
+ bPNG = true;
+ }
+ else if (aGfxLink.GetType() == GfxLinkType::NativeJpg)
+ {
+ bJPG = true;
+ }
+ if (bPNG || bJPG)
+ {
+ aOStm.WriteBytes(aGfxLink.GetData(), aGfxLink.GetDataSize());
+ bCached = true;
+ }
+ }
+ }
}
}
if( bCached || GraphicConverter::Export( aOStm, rBmpEx, ConvertDataFormat::PNG ) == ERRCODE_NONE )
{
- if (!bCached && pGrafObj)
- {
- pGrafObj->SetPNGPreviewChecksum(rBmpEx.GetChecksum());
- pGrafObj->SetPNGPreviewData(aOStm);
- }
-
Point aPt;
Size aSz;
Sequence< sal_Int8 > aSeq( static_cast<sal_Int8 const *>(aOStm.GetData()), aOStm.Tell() );
- OUStringBuffer aBuffer( "data:image/png;base64," );
+ OUStringBuffer aBuffer;
+ if (bJPG)
+ {
+ aBuffer.append("data:image/jpeg;base64,");
+ }
+ else
+ {
+ aBuffer.append("data:image/png;base64,");
+ }
::comphelper::Base64::encode( aBuffer, aSeq );
ImplMap( rPt, aPt );