From cb5895ad7bb193272bc8a4abc0db8d7c9ee6fec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 29 May 2026 21:58:30 +0100 Subject: [PATCH] create the fill bitmap link tracker in SdrModel::SetLinkManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit merge this common setup Signed-off-by: Caolán McNamara Change-Id: I9efdc64155ed45580fb0ccc122a723fe10f4322c Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3551 Reviewed-by: Miklos Vajna Tested-by: Jenkins CPCI (cherry picked from commit edecf78ffe05453017d3d7b9fef5dcd145fbf56b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208577 Tested-by: Xisco Fauli Reviewed-by: Xisco Fauli --- include/svx/svdmodel.hxx | 10 +++++----- sc/source/core/data/documen9.cxx | 12 +++--------- sd/source/core/drawdoc.cxx | 7 +++---- svx/source/svdraw/svdmodel.cxx | 6 ++++-- sw/source/core/doc/DocumentDrawModelManager.cxx | 9 +++------ 5 files changed, 18 insertions(+), 26 deletions(-) diff --git a/include/svx/svdmodel.hxx b/include/svx/svdmodel.hxx index 5f880138d8e0..06c61a9a942c 100644 --- a/include/svx/svdmodel.hxx +++ b/include/svx/svdmodel.hxx @@ -358,13 +358,13 @@ public: void SetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(SfxStyleSheet* pDefSS) { mpDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj = pDefSS; } sfx2::LinkManager* GetLinkManager() { return m_pLinkManager; } - void SetLinkManager( sfx2::LinkManager* pLinkMgr ) { m_pLinkManager = pLinkMgr; } + // Setting a LinkManager also creates the per-host fill bitmap link tracker, + // so any drawing model with a LinkManager tracks deferred remote fill + // bitmaps (registered as the item is set via AttributeProperties::ItemChange + // / SdrPageProperties::PutItem) rather than by a later pool scan. + void SetLinkManager( sfx2::LinkManager* pLinkMgr ); - // Opt-in per-host tracking of deferred remote fill bitmap links. When set, - // AttributeProperties::ItemChange routes XATTR_FILLBITMAP changes here so a - // link is registered as the item is set rather than by a later pool scan. sdr::FillBitmapLinkTracker* GetFillBitmapLinkTracker() const { return m_pFillBitmapLinkTracker.get(); } - void SetFillBitmapLinkTracker( std::unique_ptr pTracker ); ::comphelper::IEmbeddedHelper* GetPersist() const { return m_pEmbeddedHelper; } void SetPersist( ::comphelper::IEmbeddedHelper *p ) { m_pEmbeddedHelper = p; } diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx index 202c1e165a0e..162ccc658bde 100644 --- a/sc/source/core/data/documen9.cxx +++ b/sc/source/core/data/documen9.cxx @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -133,15 +132,10 @@ void ScDocument::InitDrawLayer( ScDocShell* pDocShell ) mpDrawLayer.reset(new ScDrawLayer( this, aName )); // Create the LinkManager up front (not gated on bAutoCalc) so the draw - // layer can register per-object fill bitmap links as shapes are imported, - // and install the tracker that AttributeProperties::ItemChange feeds. - sfx2::LinkManager* pMgr = GetDocLinkManager().getLinkManager(true); - if (pMgr) - { + // layer can register fill bitmap links as shapes are imported. Setting it + // also installs SdrModel's fill bitmap link tracker. + if (sfx2::LinkManager* pMgr = GetDocLinkManager().getLinkManager(true)) mpDrawLayer->SetLinkManager(pMgr); - mpDrawLayer->SetFillBitmapLinkTracker( - std::make_unique(*mpDrawLayer)); - } // set DrawingLayer's SfxItemPool at Calc's SfxItemPool as // secondary pool to support DrawingLayer FillStyle ranges (and similar) diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx index a02365913d1f..d3f7e398fdaf 100644 --- a/sd/source/core/drawdoc.cxx +++ b/sd/source/core/drawdoc.cxx @@ -280,11 +280,10 @@ SdDrawDocument::SdDrawDocument(DocumentType eType, SfxObjectShell* pDrDocSh) if (mpDocSh) { + // Setting the LinkManager also installs the fill bitmap link tracker, + // so deferred remote fills on shapes, page backgrounds and the + // Background style are registered per host as they are set. SetLinkManager( new sfx2::LinkManager(mpDocSh) ); - // Track deferred remote fill bitmaps on shapes and page backgrounds as - // they are set, registering one SvBaseLink per host in place of a pool - // scan. - SetFillBitmapLinkTracker(std::make_unique(*this)); } EEControlBits nCntrl = rOutliner.GetControlWord(); diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 652240374baa..53e36b15a40d 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -226,9 +226,11 @@ void SdrModel::implDtorClearModel() ClearModel(true); } -void SdrModel::SetFillBitmapLinkTracker(std::unique_ptr pTracker) +void SdrModel::SetLinkManager(sfx2::LinkManager* pLinkMgr) { - m_pFillBitmapLinkTracker = std::move(pTracker); + m_pLinkManager = pLinkMgr; + if (pLinkMgr && !m_pFillBitmapLinkTracker) + m_pFillBitmapLinkTracker.reset(new sdr::FillBitmapLinkTracker(*this)); } SdrModel::~SdrModel() diff --git a/sw/source/core/doc/DocumentDrawModelManager.cxx b/sw/source/core/doc/DocumentDrawModelManager.cxx index b23bc4210118..1905ec7f50f0 100644 --- a/sw/source/core/doc/DocumentDrawModelManager.cxx +++ b/sw/source/core/doc/DocumentDrawModelManager.cxx @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -128,12 +127,10 @@ void DocumentDrawModelManager::InitDrawModel() // Set the LinkManager in the model so that linked graphics can be inserted. // The WinWord import needs it too. + // Setting it also installs the draw model's fill bitmap link tracker, so + // deferred remote fills on draw-layer shapes are registered per SdrObject + // as they are set. mpDrawModel->SetLinkManager( & m_rDoc.getIDocumentLinksAdministration().GetLinkManager() ); - - // Track deferred remote fill bitmaps on draw-layer shapes as they are set, - // registering one SvBaseLink per SdrObject in place of a pool scan. - mpDrawModel->SetFillBitmapLinkTracker( - std::make_unique(*mpDrawModel)); mpDrawModel->SetAddExtLeading( m_rDoc.getIDocumentSettingAccess().get(DocumentSettingId::ADD_EXT_LEADING) ); OutputDevice* pRefDev = m_rDoc.getIDocumentDeviceAccess().getReferenceDevice( false );