From b11188835d3b87cd9d2a8cdb3da204cfda5d3e6e Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Fri, 20 Apr 2018 17:58:09 +0200 Subject: [PATCH] DOC import: lazy-read images At least JPEG files are now only loaded when the user scrolls to the relevant page. Also fix the root cause of the EMF lazy-read problem and remove the previous workarounds. Change-Id: I9699927282b99bcb71a0d271a20bbfd56a361ee8 Reviewed-on: https://gerrit.libreoffice.org/53219 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- filter/source/msfilter/msdffimp.cxx | 9 ++++++++- oox/source/helper/graphichelper.cxx | 7 +------ sw/CppunitTest_sw_ww8import.mk | 1 + sw/qa/extras/ww8import/data/image-lazy-read.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8import/ww8import.cxx | 8 ++++++++ vcl/source/filter/graphicfilter.cxx | 1 + vcl/source/graphic/UnoGraphicProvider.cxx | 6 +++--- 7 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 sw/qa/extras/ww8import/data/image-lazy-read.doc diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index f2fbc026c16d..3e80858d9275 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -6545,7 +6545,14 @@ bool SvxMSDffManager::GetBLIPDirect( SvStream& rBLIPStream, Graphic& rData, tool else { // and unleash our filter GraphicFilter& rGF = GraphicFilter::GetGraphicFilter(); - nRes = rGF.ImportGraphic( rData, "", *pGrStream ); + Graphic aGraphic = rGF.ImportUnloadedGraphic(*pGrStream); + if (aGraphic) + { + rData = aGraphic; + nRes = ERRCODE_NONE; + } + else + nRes = rGF.ImportGraphic( rData, "", *pGrStream ); // SJ: I40472, sometimes the aspect ratio (aMtfSize100) does not match and we get scaling problems, // then it is better to use the prefsize that is stored within the metafile. Bug #72846# for what the diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx index 002d54b946b5..073cfe6d694f 100644 --- a/oox/source/helper/graphichelper.cxx +++ b/oox/source/helper/graphichelper.cxx @@ -244,7 +244,7 @@ Reference< XGraphic > GraphicHelper::importGraphic( const Reference< XInputStrea aArgs[ 1 ].Name = "LazyRead"; aArgs[ 1 ].Value <<= true; - if ( pExtHeader ) + if ( pExtHeader && pExtHeader->mapMode > 0 ) { aArgs.realloc( aArgs.getLength() + 1 ); Sequence< PropertyValue > aFilterData( 3 ); @@ -341,11 +341,6 @@ Reference< XGraphic > GraphicHelper::importEmbeddedGraphic( const OUString& rStr EmbeddedGraphicMap::const_iterator aIt = maEmbeddedGraphics.find( rStreamName ); if( aIt == maEmbeddedGraphics.end() ) { - // TODO make lazy-load work for EMF as well. - WmfExternal aHeader; - if (rStreamName.endsWith(".emf") && !pExtHeader) - pExtHeader = &aHeader; - xGraphic = importGraphic(mxStorage->openInputStream(rStreamName), pExtHeader); if( xGraphic.is() ) maEmbeddedGraphics[ rStreamName ] = xGraphic; diff --git a/sw/CppunitTest_sw_ww8import.mk b/sw/CppunitTest_sw_ww8import.mk index 7e40c058e722..b7102196a27f 100644 --- a/sw/CppunitTest_sw_ww8import.mk +++ b/sw/CppunitTest_sw_ww8import.mk @@ -22,6 +22,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_ww8import, \ sal \ test \ unotest \ + vcl \ sfx \ sw \ utl \ diff --git a/sw/qa/extras/ww8import/data/image-lazy-read.doc b/sw/qa/extras/ww8import/data/image-lazy-read.doc new file mode 100644 index 0000000000000000000000000000000000000000..95017d2ac80ec10e7c70da4d3179f559624485d6 GIT binary patch literal 26624 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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx index 907fe47ebcff..de16cfe253e6 100644 --- a/sw/qa/extras/ww8import/ww8import.cxx +++ b/sw/qa/extras/ww8import/ww8import.cxx @@ -116,6 +116,14 @@ DECLARE_WW8IMPORT_TEST( testTdf105570, "tdf105570.doc" ) CPPUNIT_ASSERT_EQUAL( sal_uInt16(0), pTableNd->GetTable().GetRowsToRepeat() ); } +DECLARE_OOXMLIMPORT_TEST(testImageLazyRead, "image-lazy-read.doc") +{ + auto xGraphic = getProperty>(getShape(1), "Graphic"); + Graphic aGraphic(xGraphic); + // This failed, import loaded the graphic, it wasn't lazy-read. + CPPUNIT_ASSERT(!aGraphic.isAvailable()); +} + DECLARE_WW8IMPORT_TEST(testTdf106799, "tdf106799.doc") { sal_Int32 const nCellWidths[3][4] = { { 9530, 0, 0, 0 },{ 2382, 2382, 2382, 2384 },{ 2382, 2382, 2382, 2384 } }; diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 023c07ecb9a2..43feef35e5e2 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1572,6 +1572,7 @@ Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream) nGraphicContentSize = nStreamLength; pGraphicContent.reset(new sal_uInt8[nGraphicContentSize]); + rIStream.Seek(nStreamBegin); rIStream.ReadBytes(pGraphicContent.get(), nStreamLength); if (!rIStream.GetError()) diff --git a/vcl/source/graphic/UnoGraphicProvider.cxx b/vcl/source/graphic/UnoGraphicProvider.cxx index 8b9ccb93bf94..7adb183f5aa8 100644 --- a/vcl/source/graphic/UnoGraphicProvider.cxx +++ b/vcl/source/graphic/UnoGraphicProvider.cxx @@ -355,9 +355,6 @@ uno::Reference< ::graphic::XGraphic > SAL_CALL GraphicProvider::queryGraphic( co } } - if (bLazyRead && aFilterData.hasElements()) - bLazyRead = false; - SolarMutexGuard g; if( xIStm.is() ) @@ -396,7 +393,10 @@ uno::Reference< ::graphic::XGraphic > SAL_CALL GraphicProvider::queryGraphic( co aExtHeader.mapMode = nExtMapMode; WmfExternal *pExtHeader = nullptr; if ( nExtMapMode > 0 ) + { pExtHeader = &aExtHeader; + bLazyRead = false; + } ErrCode error = ERRCODE_NONE; if (bLazyRead)