From 9fb7aaf570c03c8a26d763f1205fb8c890e8211a Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Fri, 13 Apr 2018 16:58:49 +0900 Subject: Make linked graphic register into LinkedManager again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I16b162f86d6221d120f6355f9a52c1abfcd0ac73 Reviewed-on: https://gerrit.libreoffice.org/52911 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- include/vcl/GraphicLoader.hxx | 3 + include/vcl/graph.hxx | 2 + oox/source/drawingml/misccontexts.cxx | 4 +- sfx2/source/appl/fileobj.cxx | 100 ++-------------------------------- sfx2/source/appl/linkmgr2.cxx | 27 +++++++-- svx/source/svdraw/svdograf.cxx | 43 ++++++++++----- sw/source/core/graphic/ndgrf.cxx | 57 ++++++++++++++++++- sw/source/uibase/uiview/view2.cxx | 2 +- vcl/inc/graphic/Manager.hxx | 2 + vcl/source/gdi/graph.cxx | 7 +++ vcl/source/gdi/impgraph.cxx | 10 ++++ vcl/source/graphic/GraphicLoader.cxx | 53 +++++++++--------- vcl/source/graphic/Manager.cxx | 7 +++ xmloff/source/core/xmlimp.cxx | 16 ++---- 14 files changed, 174 insertions(+), 159 deletions(-) diff --git a/include/vcl/GraphicLoader.hxx b/include/vcl/GraphicLoader.hxx index 9b96ec13b8a2..780de02e741b 100644 --- a/include/vcl/GraphicLoader.hxx +++ b/include/vcl/GraphicLoader.hxx @@ -16,6 +16,9 @@ namespace vcl { namespace graphic { +Graphic VCL_DLLPUBLIC loadFromURL(OUString const& rURL, sal_Int16 nExtWidth, sal_Int16 nExtHeight, + sal_Int16 nExtMapMode); + Graphic VCL_DLLPUBLIC loadFromURL(OUString const& rURL); } } // end vcl::graphic diff --git a/include/vcl/graph.hxx b/include/vcl/graph.hxx index c088e6484661..d69b9e8538b0 100644 --- a/include/vcl/graph.hxx +++ b/include/vcl/graph.hxx @@ -33,6 +33,7 @@ #include #include #include +#include enum class GraphicType @@ -114,6 +115,7 @@ public: public: Graphic(); + Graphic( const GraphicExternalLink& rGraphicLink ); Graphic( const Graphic& rGraphic ); Graphic( Graphic&& rGraphic ); Graphic( const Bitmap& rBmp ); diff --git a/oox/source/drawingml/misccontexts.cxx b/oox/source/drawingml/misccontexts.cxx index 583c9d7c35d6..ec321fb62712 100644 --- a/oox/source/drawingml/misccontexts.cxx +++ b/oox/source/drawingml/misccontexts.cxx @@ -27,6 +27,7 @@ #include #include #include +#include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -161,7 +162,8 @@ BlipContext::BlipContext( ContextHandler2Helper const & rParent, // code rework. OUString aRelId = rAttribs.getString( R_TOKEN( link ), OUString() ); OUString aTargetLink = getFilter().getAbsoluteUrl( getRelations().getExternalTargetFromRelId( aRelId ) ); - Graphic aGraphic = vcl::graphic::loadFromURL(aTargetLink); + GraphicExternalLink aLink(aTargetLink); + Graphic aGraphic(aLink); mrBlipProps.mxFillGraphic = aGraphic.GetXGraphic(); } } diff --git a/sfx2/source/appl/fileobj.cxx b/sfx2/source/appl/fileobj.cxx index f19e7f9acc72..371d8839f75a 100644 --- a/sfx2/source/appl/fileobj.cxx +++ b/sfx2/source/appl/fileobj.cxx @@ -76,7 +76,7 @@ SvFileObject::~SvFileObject() bool SvFileObject::GetData( css::uno::Any & rData, const OUString & rMimeType, - bool bGetSynchron ) + bool /*bGetSynchron*/ ) { SotClipboardFormatId nFmt = SotExchange::RegisterFormatMimeType( rMimeType ); switch( nType ) @@ -92,101 +92,11 @@ bool SvFileObject::GetData( css::uno::Any & rData, break; case FILETYPE_GRF: - if( !bLoadError ) + if (SotClipboardFormatId::GDIMETAFILE == nFmt + || SotClipboardFormatId::BITMAP == nFmt + || SotClipboardFormatId::SVXB == nFmt) { - tools::SvRef xTmpMed; - - if( SotClipboardFormatId::GDIMETAFILE == nFmt || SotClipboardFormatId::BITMAP == nFmt || - SotClipboardFormatId::SVXB == nFmt ) - { - Graphic aGrf; - - // If the native format is requested, has to be reset at the - // end of the flag. Is solely in the sw/ndgrf.cxx used when - // the link is removed form GraphicNode. - bool bOldNativFormat = bNativFormat; - - // If about to print, waiting for the data to be available - if( bGetSynchron ) - { - // call a LoadFile every second time to test the loading - if( !xMed.is() ) - LoadFile_Impl(); - - if( !bInCallDownload ) - { - xTmpMed = xMed; - while( bWaitForData ) - Application::Reschedule(); - - xMed = xTmpMed; - bClearMedium = true; - } - } - - if( !bWaitForData && ( xMed.is() || // was loaded as URL - ( bSynchron && LoadFile_Impl() && xMed.is() ) ) ) - { - // If it was loaded from the Internet, do not retry - if( !bGetSynchron ) - bLoadAgain = !xMed->IsRemote(); - bLoadError = !GetGraphic_Impl( aGrf, xMed->GetInStream() ); - } - else if( !LoadFile_Impl() || - !GetGraphic_Impl( aGrf, xMed.is() ? xMed->GetInStream() : nullptr )) - { - if( !xMed.is() ) - break; - aGrf.SetDefaultType(); - } - - if( SotClipboardFormatId::SVXB != nFmt ) - nFmt = (bLoadError || GraphicType::Bitmap == aGrf.GetType()) - ? SotClipboardFormatId::BITMAP - : SotClipboardFormatId::GDIMETAFILE; - - SvMemoryStream aMemStm( 0, 65535 ); - switch ( nFmt ) - { - case SotClipboardFormatId::SVXB: - if( GraphicType::NONE != aGrf.GetType() ) - { - aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); - WriteGraphic( aMemStm, aGrf ); - } - break; - - case SotClipboardFormatId::BITMAP: - { - const Bitmap aBitmap(aGrf.GetBitmap()); - - if(!aBitmap.IsEmpty()) - { - WriteDIB(aBitmap, aMemStm, false, true); - } - - break; - } - - default: - if( aGrf.GetGDIMetaFile().GetActionSize() ) - { - GDIMetaFile aMeta( aGrf.GetGDIMetaFile() ); - aMeta.Write( aMemStm ); - } - } - rData <<= css::uno::Sequence< sal_Int8 >( static_cast(aMemStm.GetData()), - aMemStm.Seek( STREAM_SEEK_TO_END ) ); - - bNativFormat = bOldNativFormat; - - // Everything ready? - if( xMed.is() && !bSynchron && bClearMedium ) - { - xMed.clear(); - bClearMedium = false; - } - } + rData <<= sFileNm; } break; case FILETYPE_OBJECT: diff --git a/sfx2/source/appl/linkmgr2.cxx b/sfx2/source/appl/linkmgr2.cxx index 9ca22e8256e1..64e89a927f12 100644 --- a/sfx2/source/appl/linkmgr2.cxx +++ b/sfx2/source/appl/linkmgr2.cxx @@ -40,6 +40,7 @@ #include #include #include +#include #include "fileobj.hxx" #include "impldde.hxx" @@ -498,12 +499,26 @@ SotClipboardFormatId LinkManager::RegisterStatusInfoId() bool LinkManager::GetGraphicFromAny( const OUString& rMimeType, const css::uno::Any & rValue, - Graphic& rGrf ) + Graphic& rGraphic ) { bool bRet = false; - css::uno::Sequence< sal_Int8 > aSeq; - if( rValue.hasValue() && ( rValue >>= aSeq ) ) + + if (!rValue.hasValue()) + return bRet; + + if (rValue.has()) { + OUString sURL = rValue.get(); + rGraphic = vcl::graphic::loadFromURL(sURL); + if (!rGraphic) + rGraphic.SetDefaultType(); + rGraphic.setOriginURL(sURL); + return true; + } + else if (rValue.has>()) + { + auto aSeq = rValue.get>(); + SvMemoryStream aMemStm( const_cast(aSeq.getConstArray()), aSeq.getLength(), StreamMode::READ ); aMemStm.Seek( 0 ); @@ -512,7 +527,7 @@ bool LinkManager::GetGraphicFromAny( const OUString& rMimeType, { case SotClipboardFormatId::SVXB: { - ReadGraphic( aMemStm, rGrf ); + ReadGraphic( aMemStm, rGraphic ); bRet = true; } break; @@ -520,7 +535,7 @@ bool LinkManager::GetGraphicFromAny( const OUString& rMimeType, { GDIMetaFile aMtf; aMtf.Read( aMemStm ); - rGrf = aMtf; + rGraphic = aMtf; bRet = true; } break; @@ -528,7 +543,7 @@ bool LinkManager::GetGraphicFromAny( const OUString& rMimeType, { Bitmap aBmp; ReadDIB(aBmp, aMemStm, true); - rGrf = aBmp; + rGraphic = aBmp; bRet = true; } break; diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx index 21412a222451..930569cc7832 100644 --- a/svx/source/svdraw/svdograf.cxx +++ b/svx/source/svdraw/svdograf.cxx @@ -102,6 +102,7 @@ const Graphic ImpLoadLinkedGraphic( const OUString& aFileName, const OUString& a // that it is a SVG graphic, but only because no one yet tried to interpret it. rGF.ImportGraphic( aGraphic, aFileName, *pInStrm, nFilter, nullptr, GraphicFilterImportFlags::NONE, &aFilterData ); } + aGraphic.setOriginURL(aFileName); return aGraphic; } @@ -227,8 +228,7 @@ void SdrGraphicLink::RemoveGraphicUpdater() Graphic aGraphic; if( sfx2::LinkManager::GetGraphicFromAny( rMimeType, rValue, aGraphic )) { - rGrafObj.NbcSetGraphic( aGraphic ); - rGrafObj.ActionChanged(); + rGrafObj.ImpSetLinkedGraphic(aGraphic); } else if( SotExchange::GetFormatIdFromMimeType( rMimeType ) != sfx2::LinkManager::RegisterStatusInfoId() ) { @@ -278,7 +278,6 @@ sdr::contact::ViewContact* SdrGrafObj::CreateObjectSpecificViewContact() return new sdr::contact::ViewContactOfGraphic(*this); } - // check if SVG and if try to get ObjectInfoPrimitive2D and extract info void SdrGrafObj::onGraphicChanged() @@ -426,7 +425,6 @@ const GraphicObject& SdrGrafObj::GetGraphicObject(bool bForceSwapIn) const { if (bForceSwapIn) ForceSwapIn(); - return *mpGraphicObject.get(); } @@ -460,15 +458,29 @@ void SdrGrafObj::NbcSetGraphic(const Graphic& rGraphic) onGraphicChanged(); } -void SdrGrafObj::SetGraphic( const Graphic& rGrf ) +void SdrGrafObj::SetGraphic( const Graphic& rGraphic ) { - NbcSetGraphic(rGrf); + if (!rGraphic.getOriginURL().isEmpty()) + { + ImpDeregisterLink(); + aFileName = rGraphic.getOriginURL(); + aReferer = ""; + aFilterName = ""; + } + NbcSetGraphic(rGraphic); + if (!rGraphic.getOriginURL().isEmpty()) + { + ImpRegisterLink(); + mpGraphicObject->SetUserData(); + } SetChanged(); BroadcastObjectChange(); + ForceSwapIn(); } const Graphic& SdrGrafObj::GetGraphic() const { + ForceSwapIn(); return mpGraphicObject->GetGraphic(); } @@ -597,9 +609,13 @@ Size SdrGrafObj::getOriginalSize() const return aSize; } -// TODO Remove void SdrGrafObj::ForceSwapIn() const { + if (pGraphicLink && (mpGraphicObject->GetType() == GraphicType::NONE || + mpGraphicObject->GetType() == GraphicType::Default) ) + { + pGraphicLink->Update(); + } } void SdrGrafObj::ImpRegisterLink() @@ -630,15 +646,11 @@ void SdrGrafObj::ImpDeregisterLink() } } -void SdrGrafObj::SetGraphicLink(const OUString& rFileName, const OUString& rReferer, const OUString& rFilterName) +void SdrGrafObj::SetGraphicLink(const OUString& rFileName, const OUString& /*rReferer*/, const OUString& /*rFilterName*/) { - ImpDeregisterLink(); - aFileName = rFileName; - aReferer = rReferer; - aFilterName = rFilterName; - ImpRegisterLink(); - mpGraphicObject->SetUserData(); - SetGraphic(vcl::graphic::loadFromURL(aFileName)); + Graphic aGraphic; + aGraphic.setOriginURL(rFileName); + SetGraphic(aGraphic); } void SdrGrafObj::ReleaseGraphicLink() @@ -862,6 +874,7 @@ SdrObject* SdrGrafObj::getFullDragClone() const // temporary interaction object and load graphic if(pRetval && IsLinkedGraphic()) { + pRetval->ForceSwapIn(); pRetval->ReleaseGraphicLink(); } diff --git a/sw/source/core/graphic/ndgrf.cxx b/sw/source/core/graphic/ndgrf.cxx index d9adeb0bc922..a046085bb3d9 100644 --- a/sw/source/core/graphic/ndgrf.cxx +++ b/sw/source/core/graphic/ndgrf.cxx @@ -73,11 +73,19 @@ SwGrfNode::SwGrfNode( mbLinkedInputStreamReady( false ), mbIsStreamReadOnly( false ) { + OUString sURLLink(pGraphic->getOriginURL()); + if (sURLLink.isEmpty() && !rGrfName.isEmpty()) + { + sURLLink = rGrfName; + Graphic aGraphic(*pGraphic); + aGraphic.setOriginURL(sURLLink); + } + bInSwapIn = bChgTwipSize = bFrameInPaint = bScaleImageMap = false; bGraphicArrived = true; - ReRead(rGrfName, rFltName, pGraphic, nullptr, false); + ReRead(sURLLink, rFltName, pGraphic, nullptr, false); } SwGrfNode::SwGrfNode( const SwNodeIndex & rWhere, @@ -472,9 +480,52 @@ bool SwGrfNode::ImportGraphic( SvStream& rStrm ) * @return true if ReRead or reading successful, * false if not loaded */ -bool SwGrfNode::SwapIn( bool /*bWaitForData*/ ) +bool SwGrfNode::SwapIn(bool bWaitForData) { - return true; + if(bInSwapIn) // not recursively! + return true; + + bool bRet = false; + bInSwapIn = true; + SwBaseLink* pLink = static_cast( refLink.get() ); + + if( pLink ) + { + if( GraphicType::NONE == maGrfObj.GetType() || + GraphicType::Default == maGrfObj.GetType() ) + { + // link was not loaded yet + if( pLink->SwapIn( bWaitForData ) ) + { + bRet = true; + } + else if( GraphicType::Default == maGrfObj.GetType() ) + { + // no default bitmap anymore, thus re-paint + delete mpReplacementGraphic; + mpReplacementGraphic = nullptr; + + maGrfObj.SetGraphic( Graphic() ); + onGraphicChanged(); + SwMsgPoolItem aMsgHint( RES_GRAPHIC_PIECE_ARRIVED ); + ModifyNotification( &aMsgHint, &aMsgHint ); + } + } + else + { + bRet = true; + } + } + else + bRet = true; + + if (bRet) + { + if( !nGrfSize.Width() && !nGrfSize.Height() ) + SetTwipSize( ::GetGraphicSizeTwip( maGrfObj.GetGraphic(), nullptr ) ); + } + bInSwapIn = false; + return bRet; } bool SwGrfNode::SwapOut() diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx index c5c071790170..119f1761d2e2 100644 --- a/sw/source/uibase/uiview/view2.cxx +++ b/sw/source/uibase/uiview/view2.cxx @@ -265,7 +265,7 @@ ErrCode SwView::InsertGraphic( const OUString &rPath, const OUString &rFilter, OUString sURL = URIHelper::SmartRel2Abs( aTemp, rPath, URIHelper::GetMaybeFileHdl() ); - + aGraphic.setOriginURL(sURL); rShell.Insert( sURL, rFilter, aGraphic, &aFrameManager ); } else diff --git a/vcl/inc/graphic/Manager.hxx b/vcl/inc/graphic/Manager.hxx index ec3761534493..4b4585203639 100644 --- a/vcl/inc/graphic/Manager.hxx +++ b/vcl/inc/graphic/Manager.hxx @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -62,6 +63,7 @@ public: std::shared_ptr newInstance(const VectorGraphicDataPtr& rVectorGraphicDataPtr); std::shared_ptr newInstance(const Animation& rAnimation); std::shared_ptr newInstance(const GDIMetaFile& rMtf); + std::shared_ptr newInstance(const GraphicExternalLink& rGraphicLink); }; } } // end namespace vcl::graphic diff --git a/vcl/source/gdi/graph.cxx b/vcl/source/gdi/graph.cxx index cdc747eae019..91dcad7e4ae5 100644 --- a/vcl/source/gdi/graph.cxx +++ b/vcl/source/gdi/graph.cxx @@ -31,6 +31,8 @@ #include #include #include +#include + using namespace ::com::sun::star; @@ -199,6 +201,11 @@ Graphic::Graphic(Graphic&& rGraphic) { } +Graphic::Graphic(GraphicExternalLink const & rGraphicExternalLink) + : mxImpGraphic(vcl::graphic::Manager::get().newInstance(rGraphicExternalLink)) +{ +} + Graphic::Graphic(const Bitmap& rBmp) : mxImpGraphic(vcl::graphic::Manager::get().newInstance(rBmp)) { diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx index 13f09ee2bb9c..0f1e849183de 100644 --- a/vcl/source/gdi/impgraph.cxx +++ b/vcl/source/gdi/impgraph.cxx @@ -226,6 +226,16 @@ ImpGraphic::ImpGraphic(ImpGraphic&& rImpGraphic) rImpGraphic.mbDummyContext = false; } +ImpGraphic::ImpGraphic(GraphicExternalLink const & rGraphicExternalLink) : + meType ( GraphicType::Default ), + mnSizeBytes ( 0 ), + mbSwapOut ( false ), + mbDummyContext ( false ), + maGraphicExternalLink(rGraphicExternalLink), + maLastUsed (std::chrono::high_resolution_clock::now()) +{ +} + ImpGraphic::ImpGraphic( const Bitmap& rBitmap ) : maEx ( rBitmap ), meType ( !rBitmap.IsEmpty() ? GraphicType::Bitmap : GraphicType::NONE ), diff --git a/vcl/source/graphic/GraphicLoader.cxx b/vcl/source/graphic/GraphicLoader.cxx index b07b345cb982..9c453acf0864 100644 --- a/vcl/source/graphic/GraphicLoader.cxx +++ b/vcl/source/graphic/GraphicLoader.cxx @@ -10,11 +10,9 @@ #include -#include -#include -#include -#include -#include +#include +#include +#include using namespace css; @@ -22,35 +20,38 @@ namespace vcl { namespace graphic { -Graphic loadFromURL(OUString const& rURL) +Graphic loadFromURL(OUString const& rURL, sal_Int16 nExtWidth, sal_Int16 nExtHeight, + sal_Int16 nExtMapMode) { + // Define APM Header if goal height and width are defined + WmfExternal aExtHeader; + aExtHeader.xExt = nExtWidth; + aExtHeader.yExt = nExtHeight; + aExtHeader.mapMode = nExtMapMode; + WmfExternal* pExtHeader = nullptr; + if (nExtMapMode > 0) + pExtHeader = &aExtHeader; + Graphic aGraphic; - try - { - uno::Reference xGraphic; - uno::Reference xContext(comphelper::getProcessComponentContext()); - uno::Reference xProvider; - xProvider.set(css::graphic::GraphicProvider::create(xContext)); - - uno::Sequence aLoadProps(1); - aLoadProps[0].Name = "URL"; - aLoadProps[0].Value <<= rURL; - - xGraphic = xProvider->queryGraphic(aLoadProps); - - if (xGraphic.is()) - aGraphic = Graphic(xGraphic); - else - aGraphic.SetDefaultType(); - aGraphic.setOriginURL(rURL); - } - catch (uno::Exception const&) + std::unique_ptr pInputStream; + pInputStream.reset(utl::UcbStreamHelper::CreateStream(rURL, StreamMode::READ)); + + if (pInputStream) { + GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter(); + + ErrCode nError + = rFilter.ImportGraphic(aGraphic, rURL, *pInputStream, GRFILTER_FORMAT_DONTKNOW, + nullptr, GraphicFilterImportFlags::NONE, pExtHeader); + if (nError != ERRCODE_NONE || aGraphic.GetType() == GraphicType::NONE) + return Graphic(); } return aGraphic; } + +Graphic loadFromURL(OUString const& rURL) { return loadFromURL(rURL, 0, 0, 0); } } } // end vcl::graphic diff --git a/vcl/source/graphic/Manager.cxx b/vcl/source/graphic/Manager.cxx index ee161c23d878..549b9c6d6add 100644 --- a/vcl/source/graphic/Manager.cxx +++ b/vcl/source/graphic/Manager.cxx @@ -179,6 +179,13 @@ std::shared_ptr Manager::newInstance(const GDIMetaFile& rMetaFile) return pReturn; } +std::shared_ptr Manager::newInstance(const GraphicExternalLink& rGraphicLink) +{ + auto pReturn = std::make_shared(rGraphicLink); + registerGraphic(pReturn, "GraphicExternalLink"); + return pReturn; +} + void Manager::swappedIn(const ImpGraphic* pImpGraphic) { mnUsedSize += pImpGraphic->ImplGetSizeBytes(); diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index 6adabad9bb6e..7a08b5656030 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -62,6 +62,7 @@ #include #include #include +#include #include #include @@ -1370,19 +1371,10 @@ uno::Reference SvXMLImport::loadGraphicByURL(OUString const & } else { - uno::Reference xProvider(graphic::GraphicProvider::create(GetComponentContext())); OUString const & rAbsoluteURL = GetAbsoluteReference(rURL); - uno::Sequence aLoadProperties(comphelper::InitPropertySequence( - { - { "URL", uno::makeAny(rAbsoluteURL) } - })); - - xGraphic = xProvider->queryGraphic(aLoadProperties); - if (xGraphic.is()) - { - Graphic aGraphic(xGraphic); - aGraphic.setOriginURL(rAbsoluteURL); - } + GraphicExternalLink aExternalLink(rAbsoluteURL); + Graphic aGraphic(aExternalLink); + xGraphic = aGraphic.GetXGraphic(); } } -- cgit v1.2.3