include/svx/sdr/contact/viewobjectcontact.hxx            |    2 
 include/svx/sdr/contact/viewobjectcontactredirector.hxx  |    5 
 sd/source/ui/tools/PreviewRenderer.cxx                   |   25 
 sd/source/ui/unoidl/unomodel.cxx                         |   78 +-
 sd/source/ui/view/sdview.cxx                             |  449 +++++++--------
 svx/inc/sdr/contact/viewobjectcontactofe3d.hxx           |    2 
 svx/inc/sdr/contact/viewobjectcontactofe3dscene.hxx      |    2 
 svx/inc/sdr/contact/viewobjectcontactofgraphic.hxx       |    2 
 svx/inc/sdr/contact/viewobjectcontactofpageobj.hxx       |    5 
 svx/inc/sdr/contact/viewobjectcontactofsdrole2obj.hxx    |    5 
 svx/inc/sdr/contact/viewobjectcontactofsdrpage.hxx       |    8 
 svx/inc/sdr/contact/viewobjectcontactofunocontrol.hxx    |    4 
 svx/source/sdr/contact/viewobjectcontact.cxx             |    8 
 svx/source/sdr/contact/viewobjectcontactofe3d.cxx        |    4 
 svx/source/sdr/contact/viewobjectcontactofe3dscene.cxx   |    4 
 svx/source/sdr/contact/viewobjectcontactofgraphic.cxx    |   25 
 svx/source/sdr/contact/viewobjectcontactofpageobj.cxx    |   11 
 svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx |   11 
 svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx    |   36 -
 svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx |   17 
 svx/source/sdr/contact/viewobjectcontactredirector.cxx   |    8 
 svx/source/unodraw/UnoGraphicExporter.cxx                |   16 
 sw/source/core/doc/notxtfrm.cxx                          |   19 
 sw/source/core/draw/dcontact.cxx                         |    6 
 sw/source/core/layout/paintfrm.cxx                       |   11 
 25 files changed, 368 insertions(+), 395 deletions(-)

New commits:
commit 8206a8ef2fbf2de9cca6fb360707fb9b50e6a92c
Author:     Noel Grandin <[email protected]>
AuthorDate: Sat Dec 4 21:33:39 2021 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Sun Dec 5 08:40:52 2021 +0100

    use visitor in ViewObjectContact::createPrimitive2DSequence
    
    to reduce intermediate object creation
    
    Change-Id: I03d34d15e88f82027f865868aca08503e38fd6ec
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126372
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/include/svx/sdr/contact/viewobjectcontact.hxx 
b/include/svx/sdr/contact/viewobjectcontact.hxx
index de80fec63ef8..56deadd59afe 100644
--- a/include/svx/sdr/contact/viewobjectcontact.hxx
+++ b/include/svx/sdr/contact/viewobjectcontact.hxx
@@ -71,7 +71,7 @@ protected:
     // from the ViewContact using 
ViewContact::getViewIndependentPrimitive2DContainer(), takes care of
     // visibility, handles glue and ghosted.
     // This method will not handle included hierarchies and not check 
geometric visibility.
-    virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const;
+    virtual void createPrimitive2DSequence(const DisplayInfo& rDisplayInfo, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const;
 
 public:
     // basic constructor.
diff --git a/include/svx/sdr/contact/viewobjectcontactredirector.hxx 
b/include/svx/sdr/contact/viewobjectcontactredirector.hxx
index a07217ca64be..a61c6d5cc1c9 100644
--- a/include/svx/sdr/contact/viewobjectcontactredirector.hxx
+++ b/include/svx/sdr/contact/viewobjectcontactredirector.hxx
@@ -43,9 +43,10 @@ public:
 
     // all default implementations just call the same methods at the original. 
To do something
     // different, override the method and at least do what the method does.
-    virtual drawinglayer::primitive2d::Primitive2DContainer 
createRedirectedPrimitive2DSequence(
+    virtual void createRedirectedPrimitive2DSequence(
         const sdr::contact::ViewObjectContact& rOriginal,
-        const sdr::contact::DisplayInfo& rDisplayInfo);
+        const sdr::contact::DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor);
 };
 
 }
diff --git a/sd/source/ui/tools/PreviewRenderer.cxx 
b/sd/source/ui/tools/PreviewRenderer.cxx
index 3016d4b977e0..2d74c7679476 100644
--- a/sd/source/ui/tools/PreviewRenderer.cxx
+++ b/sd/source/ui/tools/PreviewRenderer.cxx
@@ -55,9 +55,10 @@ namespace {
     public:
         ViewRedirector();
 
-        virtual drawinglayer::primitive2d::Primitive2DContainer 
createRedirectedPrimitive2DSequence(
+        virtual void createRedirectedPrimitive2DSequence(
             const sdr::contact::ViewObjectContact& rOriginal,
-            const sdr::contact::DisplayInfo& rDisplayInfo) override;
+            const sdr::contact::DisplayInfo& rDisplayInfo,
+            drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) override;
     };
 }
 
@@ -490,18 +491,21 @@ ViewRedirector::ViewRedirector()
 {
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewRedirector::createRedirectedPrimitive2DSequence(
+void ViewRedirector::createRedirectedPrimitive2DSequence(
     const sdr::contact::ViewObjectContact& rOriginal,
-    const sdr::contact::DisplayInfo& rDisplayInfo)
+    const sdr::contact::DisplayInfo& rDisplayInfo,
+    drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
 {
     SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
 
     if (pObject==nullptr || pObject->getSdrPageFromSdrObject() == nullptr)
     {
         // not a SdrObject visualisation (maybe e.g. page) or no page
-        return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+        
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
             rOriginal,
-            rDisplayInfo);
+            rDisplayInfo,
+            rVisitor);
+        return;
     }
 
     const bool bDoCreateGeometry 
(pObject->getSdrPageFromSdrObject()->checkVisibility( rOriginal, rDisplayInfo, 
true));
@@ -509,15 +513,16 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewRedirector::createRedirected
     if ( ! bDoCreateGeometry
         && (pObject->GetObjInventor() != SdrInventor::Default || 
pObject->GetObjIdentifier() != OBJ_PAGE))
     {
-        return drawinglayer::primitive2d::Primitive2DContainer();
+        return;
     }
 
     if (pObject->IsEmptyPresObj())
-        return drawinglayer::primitive2d::Primitive2DContainer();
+        return;
 
-    return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+    
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
         rOriginal,
-        rDisplayInfo);
+        rDisplayInfo,
+        rVisitor);
 }
 
 } // end of anonymous namespace
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index e4b11eea33b5..0524d5406907 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -1519,9 +1519,10 @@ public:
 
     // all default implementations just call the same methods at the original. 
To do something
     // different, override the method and at least do what the method does.
-    virtual drawinglayer::primitive2d::Primitive2DContainer 
createRedirectedPrimitive2DSequence(
+    virtual void createRedirectedPrimitive2DSequence(
         const sdr::contact::ViewObjectContact& rOriginal,
-        const sdr::contact::DisplayInfo& rDisplayInfo) override;
+        const sdr::contact::DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
override;
 };
 
 }
@@ -1752,56 +1753,51 @@ vcl::PDFWriter::StructElement 
ImplRenderPaintProc::ImplBegStructureTag( const Sd
     return eElement;
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ImplRenderPaintProc::createRedirectedPrimitive2DSequence(
+void ImplRenderPaintProc::createRedirectedPrimitive2DSequence(
     const sdr::contact::ViewObjectContact& rOriginal,
-    const sdr::contact::DisplayInfo& rDisplayInfo)
+    const sdr::contact::DisplayInfo& rDisplayInfo,
+    drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
 {
     SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
-
-    if(pObject)
+    if(!pObject)
     {
-        drawinglayer::primitive2d::Primitive2DContainer xRetval;
-
-        if(pObject->getSdrPageFromSdrObject())
-        {
-            if(pObject->getSdrPageFromSdrObject()->checkVisibility(rOriginal, 
rDisplayInfo, false))
-            {
-                if(IsVisible(pObject) && IsPrintable(pObject))
-                {
-                    const vcl::PDFWriter::StructElement 
eElement(ImplBegStructureTag( *pObject ));
-                    const bool bTagUsed(vcl::PDFWriter::NonStructElement != 
eElement);
+        // not an object, maybe a page
+        
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo, rVisitor);
+        return;
+    }
+    SdrPage* pSdrPage(pObject->getSdrPageFromSdrObject());
+    if(!pSdrPage)
+        return;
+    if(!pSdrPage->checkVisibility(rOriginal, rDisplayInfo, false))
+        return;
+    if(!IsVisible(pObject) || !IsPrintable(pObject))
+        return;
 
-                    xRetval = 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo);
+    const vcl::PDFWriter::StructElement eElement(ImplBegStructureTag( *pObject 
));
+    const bool bTagUsed(vcl::PDFWriter::NonStructElement != eElement);
 
-                    if(!xRetval.empty() && bTagUsed)
-                    {
-                        // embed Primitive2DSequence in a structure tag 
element for
-                        // exactly this purpose (StructureTagPrimitive2D)
+    drawinglayer::primitive2d::Primitive2DContainer xRetval;
+    
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo, xRetval);
 
-                        const SdrPage* 
pSdrPage(pObject->getSdrPageFromSdrObject());
-                        const bool bBackground(nullptr != pSdrPage && 
pSdrPage->IsMasterPage());
-                        const bool bImage(pObject->GetObjIdentifier() == 
OBJ_GRAF);
+    if(!xRetval.empty() && bTagUsed)
+    {
+        // embed Primitive2DSequence in a structure tag element for
+        // exactly this purpose (StructureTagPrimitive2D)
 
-                        drawinglayer::primitive2d::Primitive2DReference 
xReference(
-                            new 
drawinglayer::primitive2d::StructureTagPrimitive2D(
-                                eElement,
-                                bBackground,
-                                bImage,
-                                std::move(xRetval)));
+        const bool bBackground(pSdrPage->IsMasterPage());
+        const bool bImage(pObject->GetObjIdentifier() == OBJ_GRAF);
 
-                        xRetval = 
drawinglayer::primitive2d::Primitive2DContainer { xReference };
-                    }
-                }
-            }
-        }
+        drawinglayer::primitive2d::Primitive2DReference xReference(
+            new drawinglayer::primitive2d::StructureTagPrimitive2D(
+                eElement,
+                bBackground,
+                bImage,
+                std::move(xRetval)));
 
-        return xRetval;
-    }
-    else
-    {
-        // not an object, maybe a page
-        return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo);
+        xRetval = drawinglayer::primitive2d::Primitive2DContainer { xReference 
};
     }
+
+    rVisitor.visit(xRetval);
 }
 
 bool ImplRenderPaintProc::IsVisible( const SdrObject* pObj ) const
diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx
index bf7da9baf609..f558ab911f64 100644
--- a/sd/source/ui/view/sdview.cxx
+++ b/sd/source/ui/view/sdview.cxx
@@ -162,9 +162,10 @@ public:
 
     // all default implementations just call the same methods at the original. 
To do something
     // different, override the method and at least do what the method does.
-    virtual drawinglayer::primitive2d::Primitive2DContainer 
createRedirectedPrimitive2DSequence(
+    virtual void createRedirectedPrimitive2DSequence(
         const sdr::contact::ViewObjectContact& rOriginal,
-        const sdr::contact::DisplayInfo& rDisplayInfo) override;
+        const sdr::contact::DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
override;
 };
 
 }
@@ -173,270 +174,266 @@ ViewRedirector::ViewRedirector()
 {
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewRedirector::createRedirectedPrimitive2DSequence(
+void ViewRedirector::createRedirectedPrimitive2DSequence(
     const sdr::contact::ViewObjectContact& rOriginal,
-    const sdr::contact::DisplayInfo& rDisplayInfo)
+    const sdr::contact::DisplayInfo& rDisplayInfo,
+    drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
 {
     SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
+    SdrPage* pSdrPage = pObject ? pObject->getSdrPageFromSdrObject() : nullptr;
+    if(!pObject || !pSdrPage)
+    {
+        // not a SdrObject visualisation (maybe e.g. page) or no page
+        
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo, rVisitor);
+        return;
+    }
+
+    const bool bDoCreateGeometry(pSdrPage->checkVisibility( rOriginal, 
rDisplayInfo, true ));
 
-    if(pObject && pObject->getSdrPageFromSdrObject())
+    if(!bDoCreateGeometry &&
+        (( pObject->GetObjInventor() != SdrInventor::Default ) || ( 
pObject->GetObjIdentifier() != OBJ_PAGE )) )
+        return;
+
+    PresObjKind eKind(PresObjKind::NONE);
+    const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive());
+    const bool bIsMasterPageObject(pSdrPage->IsMasterPage());
+    const bool bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter());
+    const SdrPageView* pPageView = 
rOriginal.GetObjectContact().TryToGetSdrPageView();
+    const SdrPage* pVisualizedPage = 
GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage());
+    const SdPage* pObjectsSdPage = dynamic_cast< SdPage* >(pSdrPage);
+    const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != 
pVisualizedPage);
+
+    // check if we need to draw a placeholder border. Never do it for
+    // objects inside a SdrPageObj and never when printing
+    if(!bIsInsidePageObj && !bIsPrinting)
     {
-        const bool 
bDoCreateGeometry(pObject->getSdrPageFromSdrObject()->checkVisibility( 
rOriginal, rDisplayInfo, true ));
-
-        if(!bDoCreateGeometry &&
-            (( pObject->GetObjInventor() != SdrInventor::Default ) || ( 
pObject->GetObjIdentifier() != OBJ_PAGE )) )
-            return xRetval;
-
-        PresObjKind eKind(PresObjKind::NONE);
-        const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive());
-        const bool 
bIsMasterPageObject(pObject->getSdrPageFromSdrObject()->IsMasterPage());
-        const bool 
bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter());
-        const SdrPageView* pPageView = 
rOriginal.GetObjectContact().TryToGetSdrPageView();
-        const SdrPage* pVisualizedPage = 
GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage());
-        const SdPage* pObjectsSdPage = dynamic_cast< SdPage* 
>(pObject->getSdrPageFromSdrObject());
-        const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != 
pVisualizedPage);
-
-        // check if we need to draw a placeholder border. Never do it for
-        // objects inside a SdrPageObj and never when printing
-        if(!bIsInsidePageObj && !bIsPrinting)
-        {
-            bool bCreateOutline(false);
+        bool bCreateOutline(false);
 
-            if( pObject->IsEmptyPresObj() && dynamic_cast< SdrTextObj *>( 
pObject ) !=  nullptr )
+        if( pObject->IsEmptyPresObj() && dynamic_cast< SdrTextObj *>( pObject 
) !=  nullptr )
+        {
+            if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() )
             {
-                if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() 
)
-                {
-                    eKind = pObjectsSdPage ? 
pObjectsSdPage->GetPresObjKind(pObject) : PresObjKind::NONE;
-                    bCreateOutline = true;
-                }
+                eKind = pObjectsSdPage ? 
pObjectsSdPage->GetPresObjKind(pObject) : PresObjKind::NONE;
+                bCreateOutline = true;
             }
-            else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && 
( pObject->GetObjIdentifier() == OBJ_TEXT ) )
+        }
+        else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && ( 
pObject->GetObjIdentifier() == OBJ_TEXT ) )
+        {
+            if( pObjectsSdPage )
             {
-                if( pObjectsSdPage )
-                {
-                    eKind = pObjectsSdPage->GetPresObjKind(pObject);
+                eKind = pObjectsSdPage->GetPresObjKind(pObject);
 
-                    if((eKind == PresObjKind::Footer) || (eKind == 
PresObjKind::Header) || (eKind == PresObjKind::DateTime) || (eKind == 
PresObjKind::SlideNumber) )
+                if((eKind == PresObjKind::Footer) || (eKind == 
PresObjKind::Header) || (eKind == PresObjKind::DateTime) || (eKind == 
PresObjKind::SlideNumber) )
+                {
+                    if( !bSubContentProcessing )
                     {
-                        if( !bSubContentProcessing )
-                        {
-                            // only draw a boundary for header&footer objects 
on the masterpage itself
-                            bCreateOutline = true;
-                        }
+                        // only draw a boundary for header&footer objects on 
the masterpage itself
+                        bCreateOutline = true;
                     }
                 }
             }
-            else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && 
( pObject->GetObjIdentifier() == OBJ_PAGE ) )
+        }
+        else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && ( 
pObject->GetObjIdentifier() == OBJ_PAGE ) )
+        {
+            // only for handout page, else this frame will be created for each
+            // page preview object in SlideSorter and PagePane
+            if(pObjectsSdPage && PageKind::Handout == 
pObjectsSdPage->GetPageKind())
             {
-                // only for handout page, else this frame will be created for 
each
-                // page preview object in SlideSorter and PagePane
-                if(pObjectsSdPage && PageKind::Handout == 
pObjectsSdPage->GetPageKind())
-                {
-                    bCreateOutline = true;
-                }
+                bCreateOutline = true;
             }
+        }
 
-            if(bCreateOutline)
+        if(bCreateOutline)
+        {
+            // empty presentation objects get a gray frame
+            const svtools::ColorConfig aColorConfig;
+            const svtools::ColorConfigValue aColor( 
aColorConfig.GetColorValue( svtools::OBJECTBOUNDARIES ) );
+
+            if( aColor.bIsVisible )
             {
-                // empty presentation objects get a gray frame
-                const svtools::ColorConfig aColorConfig;
-                const svtools::ColorConfigValue aColor( 
aColorConfig.GetColorValue( svtools::OBJECTBOUNDARIES ) );
+                // get basic object transformation
+                const basegfx::BColor aRGBColor(aColor.nColor.getBColor());
+                basegfx::B2DHomMatrix aObjectMatrix;
+                basegfx::B2DPolyPolygon aObjectPolyPolygon;
+                pObject->TRGetBaseGeometry(aObjectMatrix, aObjectPolyPolygon);
 
-                if( aColor.bIsVisible )
+                // create dashed border
                 {
-                    // get basic object transformation
-                    const basegfx::BColor aRGBColor(aColor.nColor.getBColor());
-                    basegfx::B2DHomMatrix aObjectMatrix;
-                    basegfx::B2DPolyPolygon aObjectPolyPolygon;
-                    pObject->TRGetBaseGeometry(aObjectMatrix, 
aObjectPolyPolygon);
-
-                    // create dashed border
-                    {
-                        // create object polygon
-                        basegfx::B2DPolygon 
aPolygon(basegfx::utils::createUnitPolygon());
-                        aPolygon.transform(aObjectMatrix);
-
-                        // create line and stroke attribute
-                        ::std::vector< double > aDotDashArray { 160.0, 80.0 };
-
-                        const double 
fFullDotDashLen(::std::accumulate(aDotDashArray.begin(), aDotDashArray.end(), 
0.0));
-                        const drawinglayer::attribute::LineAttribute 
aLine(aRGBColor);
-                        const drawinglayer::attribute::StrokeAttribute 
aStroke(std::move(aDotDashArray), fFullDotDashLen);
+                    // create object polygon
+                    basegfx::B2DPolygon 
aPolygon(basegfx::utils::createUnitPolygon());
+                    aPolygon.transform(aObjectMatrix);
+
+                    // create line and stroke attribute
+                    ::std::vector< double > aDotDashArray { 160.0, 80.0 };
+
+                    const double 
fFullDotDashLen(::std::accumulate(aDotDashArray.begin(), aDotDashArray.end(), 
0.0));
+                    const drawinglayer::attribute::LineAttribute 
aLine(aRGBColor);
+                    const drawinglayer::attribute::StrokeAttribute 
aStroke(std::move(aDotDashArray), fFullDotDashLen);
+
+                    // create primitive and add
+                    const drawinglayer::primitive2d::Primitive2DReference 
xRef(new drawinglayer::primitive2d::PolygonStrokePrimitive2D(
+                        aPolygon,
+                        aLine,
+                        aStroke));
+                    rVisitor.visit(xRef);
+                }
 
-                        // create primitive and add
-                        const drawinglayer::primitive2d::Primitive2DReference 
xRef(new drawinglayer::primitive2d::PolygonStrokePrimitive2D(
-                            aPolygon,
-                            aLine,
-                            aStroke));
-                        xRetval.push_back(xRef);
-                    }
+                // now paint the placeholder description, but only when 
masterpage
+                // is displayed as page directly (MasterPage view)
+                if(!bSubContentProcessing && bIsMasterPageObject)
+                {
+                    OUString aObjectString;
 
-                    // now paint the placeholder description, but only when 
masterpage
-                    // is displayed as page directly (MasterPage view)
-                    if(!bSubContentProcessing && bIsMasterPageObject)
+                    switch( eKind )
                     {
-                        OUString aObjectString;
-
-                        switch( eKind )
+                        case PresObjKind::Title:
                         {
-                            case PresObjKind::Title:
-                            {
-                                if(pObjectsSdPage && 
pObjectsSdPage->GetPageKind() == PageKind::Standard)
-                                {
-                                    static OUString 
aTitleAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_TITLE));
-                                    aObjectString = aTitleAreaStr;
-                                }
-
-                                break;
-                            }
-                            case PresObjKind::Outline:
-                            {
-                                static OUString 
aOutlineAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_OUTLINE));
-                                aObjectString = aOutlineAreaStr;
-                                break;
-                            }
-                            case PresObjKind::Footer:
-                            {
-                                static OUString 
aFooterAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_FOOTER));
-                                aObjectString = aFooterAreaStr;
-                                break;
-                            }
-                            case PresObjKind::Header:
-                            {
-                                static OUString 
aHeaderAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_HEADER));
-                                aObjectString = aHeaderAreaStr;
-                                break;
-                            }
-                            case PresObjKind::DateTime:
-                            {
-                                static OUString 
aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_DATETIME));
-                                aObjectString = aDateTimeStr;
-                                break;
-                            }
-                            case PresObjKind::Notes:
+                            if(pObjectsSdPage && pObjectsSdPage->GetPageKind() 
== PageKind::Standard)
                             {
-                                static OUString 
aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NOTES));
-                                aObjectString = aDateTimeStr;
-                                break;
+                                static OUString 
aTitleAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_TITLE));
+                                aObjectString = aTitleAreaStr;
                             }
-                            case PresObjKind::SlideNumber:
+
+                            break;
+                        }
+                        case PresObjKind::Outline:
+                        {
+                            static OUString 
aOutlineAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_OUTLINE));
+                            aObjectString = aOutlineAreaStr;
+                            break;
+                        }
+                        case PresObjKind::Footer:
+                        {
+                            static OUString 
aFooterAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_FOOTER));
+                            aObjectString = aFooterAreaStr;
+                            break;
+                        }
+                        case PresObjKind::Header:
+                        {
+                            static OUString 
aHeaderAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_HEADER));
+                            aObjectString = aHeaderAreaStr;
+                            break;
+                        }
+                        case PresObjKind::DateTime:
+                        {
+                            static OUString 
aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_DATETIME));
+                            aObjectString = aDateTimeStr;
+                            break;
+                        }
+                        case PresObjKind::Notes:
+                        {
+                            static OUString 
aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NOTES));
+                            aObjectString = aDateTimeStr;
+                            break;
+                        }
+                        case PresObjKind::SlideNumber:
+                        {
+                            if(pObjectsSdPage && pObjectsSdPage->GetPageKind() 
== PageKind::Standard)
                             {
-                                if(pObjectsSdPage && 
pObjectsSdPage->GetPageKind() == PageKind::Standard)
-                                {
-                                    static OUString 
aSlideAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_SLIDE));
-                                    aObjectString = aSlideAreaStr;
-                                }
-                                else
-                                {
-                                    static OUString 
aNumberAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NUMBER));
-                                    aObjectString = aNumberAreaStr;
-                                }
-                                break;
+                                static OUString 
aSlideAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_SLIDE));
+                                aObjectString = aSlideAreaStr;
                             }
-                            default:
+                            else
                             {
-                                break;
+                                static OUString 
aNumberAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NUMBER));
+                                aObjectString = aNumberAreaStr;
                             }
+                            break;
                         }
-
-                        if( !aObjectString.isEmpty() )
+                        default:
                         {
-                            // decompose object matrix to be able to place 
text correctly
-                            basegfx::B2DTuple aScale;
-                            basegfx::B2DTuple aTranslate;
-                            double fRotate, fShearX;
-                            aObjectMatrix.decompose(aScale, aTranslate, 
fRotate, fShearX);
-
-                            // create font
-                            SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* 
>( pObject );
-                            const SdrTextVertAdjust eTVA(pTextObj ? 
pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER);
-                            vcl::Font aScaledVclFont;
-
-                            // use a text size factor to get more reliable 
text sizes from the text layouter
-                            // (and from vcl), tipp from HDU
-                            static const sal_uInt32 nTextSizeFactor(100);
-
-                            // use a factor to get more linear text size 
calculations
-                            aScaledVclFont.SetFontHeight( 500 * 
nTextSizeFactor );
-
-                            // get basic geometry and get text size
-                            drawinglayer::primitive2d::TextLayouterDevice 
aTextLayouter;
-                            aTextLayouter.setFont(aScaledVclFont);
-                            const sal_Int32 
nTextLength(aObjectString.getLength());
-
-                            // do not forget to use the factor again to get 
the width for the 500
-                            const double 
fTextWidth(aTextLayouter.getTextWidth(aObjectString, 0, nTextLength) * (1.0 / 
nTextSizeFactor));
-                            const double 
fTextHeight(aTextLayouter.getTextHeight() * (1.0 / nTextSizeFactor));
-
-                            // calculate text primitive position. If text is 
at bottom, use top for
-                            // the extra text and vice versa
-                            const double fHorDist(125);
-                            const double fVerDist(125);
-                            const double fPosX((aTranslate.getX() + 
aScale.getX()) - fTextWidth - fHorDist);
-                            const double fPosY((SDRTEXTVERTADJUST_BOTTOM == 
eTVA)
-                                ? aTranslate.getY() - fVerDist + fTextHeight
-                                : (aTranslate.getY() + aScale.getY()) - 
fVerDist);
-
-                            // get font attributes; use normally scaled font
-                            vcl::Font aVclFont;
-                            basegfx::B2DVector aTextSizeAttribute;
-
-                            aVclFont.SetFontHeight( 500 );
-
-                            const drawinglayer::attribute::FontAttribute 
aFontAttribute(
-                                
drawinglayer::primitive2d::getFontAttributeFromVclFont(
-                                    aTextSizeAttribute,
-                                    aVclFont,
-                                    false,
-                                    false));
-
-                            // fill text matrix
-                            const basegfx::B2DHomMatrix 
aTextMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
-                                aTextSizeAttribute.getX(), 
aTextSizeAttribute.getY(),
-                                fShearX,
-                                fRotate,
-                                fPosX, fPosY));
-
-                            // create DXTextArray (can be empty one)
-                            ::std::vector< double > aDXArray{};
-
-                            // create locale; this may need some more 
information in the future
-                            const css::lang::Locale aLocale;
-
-                            // create primitive and add
-                            const 
drawinglayer::primitive2d::Primitive2DReference xRef(
-                                new 
drawinglayer::primitive2d::TextSimplePortionPrimitive2D(
-                                    aTextMatrix,
-                                    aObjectString,
-                                    0,
-                                    nTextLength,
-                                    std::move(aDXArray),
-                                    aFontAttribute,
-                                    aLocale,
-                                    aRGBColor));
-                            xRetval.push_back(xRef);
+                            break;
                         }
                     }
+
+                    if( !aObjectString.isEmpty() )
+                    {
+                        // decompose object matrix to be able to place text 
correctly
+                        basegfx::B2DTuple aScale;
+                        basegfx::B2DTuple aTranslate;
+                        double fRotate, fShearX;
+                        aObjectMatrix.decompose(aScale, aTranslate, fRotate, 
fShearX);
+
+                        // create font
+                        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObject );
+                        const SdrTextVertAdjust eTVA(pTextObj ? 
pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER);
+                        vcl::Font aScaledVclFont;
+
+                        // use a text size factor to get more reliable text 
sizes from the text layouter
+                        // (and from vcl), tipp from HDU
+                        static const sal_uInt32 nTextSizeFactor(100);
+
+                        // use a factor to get more linear text size 
calculations
+                        aScaledVclFont.SetFontHeight( 500 * nTextSizeFactor );
+
+                        // get basic geometry and get text size
+                        drawinglayer::primitive2d::TextLayouterDevice 
aTextLayouter;
+                        aTextLayouter.setFont(aScaledVclFont);
+                        const sal_Int32 nTextLength(aObjectString.getLength());
+
+                        // do not forget to use the factor again to get the 
width for the 500
+                        const double 
fTextWidth(aTextLayouter.getTextWidth(aObjectString, 0, nTextLength) * (1.0 / 
nTextSizeFactor));
+                        const double fTextHeight(aTextLayouter.getTextHeight() 
* (1.0 / nTextSizeFactor));
+
+                        // calculate text primitive position. If text is at 
bottom, use top for
+                        // the extra text and vice versa
+                        const double fHorDist(125);
+                        const double fVerDist(125);
+                        const double fPosX((aTranslate.getX() + aScale.getX()) 
- fTextWidth - fHorDist);
+                        const double fPosY((SDRTEXTVERTADJUST_BOTTOM == eTVA)
+                            ? aTranslate.getY() - fVerDist + fTextHeight
+                            : (aTranslate.getY() + aScale.getY()) - fVerDist);
+
+                        // get font attributes; use normally scaled font
+                        vcl::Font aVclFont;
+                        basegfx::B2DVector aTextSizeAttribute;
+
+                        aVclFont.SetFontHeight( 500 );
+
+                        const drawinglayer::attribute::FontAttribute 
aFontAttribute(
+                            
drawinglayer::primitive2d::getFontAttributeFromVclFont(
+                                aTextSizeAttribute,
+                                aVclFont,
+                                false,
+                                false));
+
+                        // fill text matrix
+                        const basegfx::B2DHomMatrix 
aTextMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
+                            aTextSizeAttribute.getX(), 
aTextSizeAttribute.getY(),
+                            fShearX,
+                            fRotate,
+                            fPosX, fPosY));
+
+                        // create DXTextArray (can be empty one)
+                        ::std::vector< double > aDXArray{};
+
+                        // create locale; this may need some more information 
in the future
+                        const css::lang::Locale aLocale;
+
+                        // create primitive and add
+                        const drawinglayer::primitive2d::Primitive2DReference 
xRef(
+                            new 
drawinglayer::primitive2d::TextSimplePortionPrimitive2D(
+                                aTextMatrix,
+                                aObjectString,
+                                0,
+                                nTextLength,
+                                std::move(aDXArray),
+                                aFontAttribute,
+                                aLocale,
+                                aRGBColor));
+                        rVisitor.visit(xRef);
+                    }
                 }
             }
         }
-
-        if(bDoCreateGeometry)
-        {
-            xRetval.append(
-                
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
-                    rOriginal,
-                    rDisplayInfo));
-        }
     }
-    else
+
+    if(bDoCreateGeometry)
     {
-        // not a SdrObject visualisation (maybe e.g. page) or no page
-        xRetval = 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo);
+        
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+            rOriginal,
+            rDisplayInfo, rVisitor);
     }
-
-    return xRetval;
 }
 
 /**
diff --git a/svx/inc/sdr/contact/viewobjectcontactofe3d.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofe3d.hxx
index 9c0e09e4c036..591ed6504155 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofe3d.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofe3d.hxx
@@ -33,7 +33,7 @@ namespace sdr::contact
         {
             // also override the 2d method to deliver a 2d object with 
embedded 3d and the 3d transformation which is able to
             // answer the get2DRange question accordingly
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             ViewObjectContactOfE3d(ObjectContact& rObjectContact, ViewContact& 
rViewContact);
diff --git a/svx/inc/sdr/contact/viewobjectcontactofe3dscene.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofe3dscene.hxx
index 27ddbd21842f..cc1b2e7c345e 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofe3dscene.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofe3dscene.hxx
@@ -28,7 +28,7 @@ namespace sdr::contact
         class ViewObjectContactOfE3dScene final : public 
ViewObjectContactOfSdrObj
         {
             // 2d primitive creator
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             // basic constructor.
diff --git a/svx/inc/sdr/contact/viewobjectcontactofgraphic.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofgraphic.hxx
index b2286568c93f..74e616a45bc1 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofgraphic.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofgraphic.hxx
@@ -29,7 +29,7 @@ namespace sdr::contact
         class ViewObjectContactOfGraphic final : public 
ViewObjectContactOfSdrObj
         {
             // This method is responsible for creating the graphical 
visualisation data
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             ViewObjectContactOfGraphic(ObjectContact& rObjectContact, 
ViewContact& rViewContact);
diff --git a/svx/inc/sdr/contact/viewobjectcontactofpageobj.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofpageobj.hxx
index 16e168c41235..b651e083ec3c 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofpageobj.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofpageobj.hxx
@@ -37,8 +37,9 @@ private:
     // This method is responsible for creating the graphical visualisation 
data which is
     // stored/cached in the local primitive.
     // This method will not handle included hierarchies and not check 
geometric visibility.
-    virtual drawinglayer::primitive2d::Primitive2DContainer
-    createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+    virtual void createPrimitive2DSequence(
+        const DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
const override;
 
 public:
     ViewObjectContactOfPageObj(ObjectContact& rObjectContact, ViewContact& 
rViewContact);
diff --git a/svx/inc/sdr/contact/viewobjectcontactofsdrole2obj.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofsdrole2obj.hxx
index 8afd0c2cc76d..2279f9b45954 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofsdrole2obj.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofsdrole2obj.hxx
@@ -29,8 +29,9 @@ namespace sdr::contact
 class ViewObjectContactOfSdrOle2Obj final : public ViewObjectContactOfSdrObj
 {
     // This method is responsible for creating the graphical visualisation data
-    virtual drawinglayer::primitive2d::Primitive2DContainer
-    createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+    virtual void createPrimitive2DSequence(
+        const DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
const override;
 
 public:
     ViewObjectContactOfSdrOle2Obj(ObjectContact& rObjectContact, ViewContact& 
rViewContact);
diff --git a/svx/inc/sdr/contact/viewobjectcontactofsdrpage.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofsdrpage.hxx
index 7e04604f7328..a6fa46d43072 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofsdrpage.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofsdrpage.hxx
@@ -45,7 +45,7 @@ namespace sdr::contact
     {
         class ViewObjectContactOfPageBackground final : public 
ViewObjectContactOfPageSubObject
         {
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             ViewObjectContactOfPageBackground(ObjectContact& rObjectContact, 
ViewContact& rViewContact);
@@ -73,7 +73,7 @@ namespace sdr::contact
     {
         class ViewObjectContactOfPageFill final : public 
ViewObjectContactOfPageSubObject
         {
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             ViewObjectContactOfPageFill(ObjectContact& rObjectContact, 
ViewContact& rViewContact);
@@ -135,7 +135,7 @@ namespace sdr::contact
     {
         class ViewObjectContactOfPageGrid final : public 
ViewObjectContactOfPageSubObject
         {
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             ViewObjectContactOfPageGrid(ObjectContact& rObjectContact, 
ViewContact& rViewContact);
@@ -149,7 +149,7 @@ namespace sdr::contact
     {
         class ViewObjectContactOfPageHelplines final : public 
ViewObjectContactOfPageSubObject
         {
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             ViewObjectContactOfPageHelplines(ObjectContact& rObjectContact, 
ViewContact& rViewContact);
diff --git a/svx/inc/sdr/contact/viewobjectcontactofunocontrol.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofunocontrol.hxx
index 2c708ec733c7..d7dc8ffdda03 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofunocontrol.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofunocontrol.hxx
@@ -91,7 +91,7 @@ namespace sdr::contact {
         virtual ~ViewObjectContactOfUnoControl() override;
 
         // support for Primitive2D
-        virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+        virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         // visibility check
         virtual bool isPrimitiveVisible( const DisplayInfo& _rDisplayInfo ) 
const override;
@@ -113,7 +113,7 @@ namespace sdr::contact {
         UnoControlPrintOrPreviewContact( const 
UnoControlPrintOrPreviewContact& ) = delete;
         UnoControlPrintOrPreviewContact& operator=( const 
UnoControlPrintOrPreviewContact& ) = delete;
 
-        virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo ) const override;
+        virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
     };
 
 
diff --git a/svx/source/sdr/contact/viewobjectcontact.cxx 
b/svx/source/sdr/contact/viewobjectcontact.cxx
index d6dae7b3d119..c72c34dfaccb 100644
--- a/svx/source/sdr/contact/viewobjectcontact.cxx
+++ b/svx/source/sdr/contact/viewobjectcontact.cxx
@@ -289,7 +289,7 @@ void ViewObjectContact::checkForPrimitive2DAnimations(const 
drawinglayer::primit
     }
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContact::createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) 
const
+void ViewObjectContact::createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const
 {
     // get the view-independent Primitive from the viewContact
     drawinglayer::primitive2d::Primitive2DContainer xRetval;
@@ -325,7 +325,7 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContact::createPrimiti
         }
     }
 
-    return xRetval;
+    rVisitor.visit(xRetval);
 }
 
 drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContact::getPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const
@@ -337,11 +337,11 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContact::getPrimitive2
 
     if(pRedirector)
     {
-        xNewPrimitiveSequence = 
pRedirector->createRedirectedPrimitive2DSequence(*this, rDisplayInfo);
+        pRedirector->createRedirectedPrimitive2DSequence(*this, rDisplayInfo, 
xNewPrimitiveSequence);
     }
     else
     {
-        xNewPrimitiveSequence = createPrimitive2DSequence(rDisplayInfo);
+        createPrimitive2DSequence(rDisplayInfo, xNewPrimitiveSequence);
     }
 
     // check for animated stuff
diff --git a/svx/source/sdr/contact/viewobjectcontactofe3d.cxx 
b/svx/source/sdr/contact/viewobjectcontactofe3d.cxx
index 1d6bbe061614..c6d41bdc9533 100644
--- a/svx/source/sdr/contact/viewobjectcontactofe3d.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofe3d.cxx
@@ -58,12 +58,12 @@ namespace sdr::contact
             return xRetval;
         }
 
-        drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfE3d::createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo) const
+        void ViewObjectContactOfE3d::createPrimitive2DSequence(const 
DisplayInfo& rDisplayInfo, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
         {
             const ViewContactOfE3d& rViewContact = static_cast< const 
ViewContactOfE3d& >(GetViewContact());
 
             // get 3d primitive vector, isPrimitiveVisible() is done in 3d 
creator
-            return 
rViewContact.impCreateWithGivenPrimitive3DContainer(getPrimitive3DContainer(rDisplayInfo));
+            
rVisitor.visit(rViewContact.impCreateWithGivenPrimitive3DContainer(getPrimitive3DContainer(rDisplayInfo)));
         }
 
 
diff --git a/svx/source/sdr/contact/viewobjectcontactofe3dscene.cxx 
b/svx/source/sdr/contact/viewobjectcontactofe3dscene.cxx
index 52dd5c30fdab..86fc1cab13f2 100644
--- a/svx/source/sdr/contact/viewobjectcontactofe3dscene.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofe3dscene.cxx
@@ -59,7 +59,7 @@ namespace sdr::contact
         {
         }
 
-        drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfE3dScene::createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo) const
+        void ViewObjectContactOfE3dScene::createPrimitive2DSequence(const 
DisplayInfo& rDisplayInfo, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
         {
             // handle ghosted, else the whole 3d group will be encapsulated to 
a ghosted primitive set (see below)
             const bool 
bHandleGhostedDisplay(GetObjectContact().DoVisualizeEnteredGroup() && 
!GetObjectContact().isOutputToPrinter() && 
rDisplayInfo.IsGhostedDrawModeActive());
@@ -118,7 +118,7 @@ namespace sdr::contact
                 const_cast< DisplayInfo& >(rDisplayInfo).SetGhostedDrawMode();
             }
 
-            return xRetval;
+            rVisitor.visit(xRetval);
         }
 
         void 
ViewObjectContactOfE3dScene::getPrimitive2DSequenceHierarchy(DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const
diff --git a/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx 
b/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx
index 98ce62c8ee1d..601ec28df1cd 100644
--- a/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx
@@ -23,29 +23,24 @@
 
 namespace sdr::contact
 {
-        drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfGraphic::createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo) const
+        void ViewObjectContactOfGraphic::createPrimitive2DSequence(const 
DisplayInfo& rDisplayInfo, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
         {
-            // get return value by calling parent
-            drawinglayer::primitive2d::Primitive2DContainer xRetval = 
ViewObjectContactOfSdrObj::createPrimitive2DSequence(rDisplayInfo);
+            // #i103255# suppress when graphic needs draft visualisation and 
output
+            // is for PDF export/Printer
+            const ViewContactOfGraphic& rVCOfGraphic = static_cast< const 
ViewContactOfGraphic& >(GetViewContact());
 
-            if(!xRetval.empty())
+            if(rVCOfGraphic.visualisationUsesDraft())
             {
-                // #i103255# suppress when graphic needs draft visualisation 
and output
-                // is for PDF export/Printer
-                const ViewContactOfGraphic& rVCOfGraphic = static_cast< const 
ViewContactOfGraphic& >(GetViewContact());
+                const ObjectContact& rObjectContact = GetObjectContact();
 
-                if(rVCOfGraphic.visualisationUsesDraft())
+                if(rObjectContact.isOutputToPDFFile() || 
rObjectContact.isOutputToPrinter())
                 {
-                    const ObjectContact& rObjectContact = GetObjectContact();
-
-                    if(rObjectContact.isOutputToPDFFile() || 
rObjectContact.isOutputToPrinter())
-                    {
-                        xRetval = 
drawinglayer::primitive2d::Primitive2DContainer();
-                    }
+                    return;
                 }
             }
 
-            return xRetval;
+            // get return value by calling parent
+            ViewObjectContactOfSdrObj::createPrimitive2DSequence(rDisplayInfo, 
rVisitor);
         }
 
         ViewObjectContactOfGraphic::ViewObjectContactOfGraphic(ObjectContact& 
rObjectContact, ViewContact& rViewContact)
diff --git a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx 
b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
index d9e9909e8ff7..9c9ff3bf8c96 100644
--- a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
@@ -181,9 +181,8 @@ bool PagePrimitiveExtractor::isDrawModeHighContrast() const 
{ return mrViewObjec
 SdrPageView* PagePrimitiveExtractor::TryToGetSdrPageView() const { return 
mrViewObjectContactOfPageObj.GetObjectContact().TryToGetSdrPageView(); }
 OutputDevice* PagePrimitiveExtractor::TryToGetOutputDevice() const { return 
mrViewObjectContactOfPageObj.GetObjectContact().TryToGetOutputDevice(); }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageObj::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/) const
+void ViewObjectContactOfPageObj::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const
 {
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
     const SdrPageObj& rPageObject(static_cast< ViewContactOfPageObj& 
>(GetViewContact()).GetPageObj());
     const SdrPage* pPage = rPageObject.GetReferencedPage();
     const svtools::ColorConfig aColorConfig;
@@ -263,7 +262,7 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageObj::crea
             const uno::Reference< drawing::XDrawPage > 
xDrawPage(GetXDrawPageForSdrPage(const_cast< SdrPage*>(pPage)));
             const drawinglayer::primitive2d::Primitive2DReference 
xPagePreview(new drawinglayer::primitive2d::PagePreviewPrimitive2D(
                 xDrawPage, aPageObjectTransform, fPageWidth, fPageHeight, 
std::move(xPageContent)));
-            xRetval = drawinglayer::primitive2d::Primitive2DContainer { 
xPagePreview };
+            rVisitor.visit(xPagePreview);
         }
     }
     else if(bCreateGrayFrame)
@@ -273,7 +272,7 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageObj::crea
         const drawinglayer::primitive2d::Primitive2DReference xFrameHit(
             drawinglayer::primitive2d::createHiddenGeometryPrimitives2D(
                 aPageObjectTransform));
-        xRetval = drawinglayer::primitive2d::Primitive2DContainer { xFrameHit 
};
+        rVisitor.visit(xFrameHit);
     }
 
     // add a gray outline frame, except not when printing
@@ -286,10 +285,8 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageObj::crea
         const drawinglayer::primitive2d::Primitive2DReference xGrayFrame(
             new 
drawinglayer::primitive2d::PolygonHairlinePrimitive2D(aOwnOutline, 
aFrameColor.getBColor()));
 
-        xRetval.push_back(xGrayFrame);
+        rVisitor.visit(xGrayFrame);
     }
-
-    return xRetval;
 }
 
 ViewObjectContactOfPageObj::ViewObjectContactOfPageObj(ObjectContact& 
rObjectContact, ViewContact& rViewContact)
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx 
b/svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx
index d5a8fe4befc1..66d1a6fb4c7d 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx
@@ -37,13 +37,12 @@ using namespace com::sun::star;
 
 namespace sdr::contact {
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfSdrOle2Obj::createPrimitive2DSequence(
-    const DisplayInfo& /*rDisplayInfo*/) const
+void ViewObjectContactOfSdrOle2Obj::createPrimitive2DSequence(
+    const DisplayInfo& /*rDisplayInfo*/, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
 {
     // override this method to do some things the old 
SdrOle2Obj::DoPaintObject did.
     // In the future, some of these may be solved different, but ATM try to 
stay compatible
     // with the old behaviour
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
     const SdrOle2Obj& rSdrOle2 = static_cast< ViewContactOfSdrOle2Obj& 
>(GetViewContact()).GetOle2Obj();
     sal_Int32 nState(-1);
 
@@ -99,7 +98,7 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfSdrOle2Obj::c
 
         // create OLE primitive stuff directly at VC with HC as parameter
         const ViewContactOfSdrOle2Obj& rVC = static_cast< const 
ViewContactOfSdrOle2Obj& >(GetViewContact());
-        rVC.createPrimitive2DSequenceWithParameters(xRetval);
+        rVC.createPrimitive2DSequenceWithParameters(rVisitor);
 
         if(bIsOutplaceActive)
         {
@@ -127,13 +126,11 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfSdrOle2Obj::c
                     COL_BLACK.getBColor(),
                     aFillHatch));
 
-                xRetval.push_back(xReference);
+                rVisitor.visit(xReference);
             }
         }
 
     }
-
-    return xRetval;
 }
 
 ViewObjectContactOfSdrOle2Obj::ViewObjectContactOfSdrOle2Obj(ObjectContact& 
rObjectContact, ViewContact& rViewContact)
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx 
b/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
index 8945277720ea..fe9855f4cdd3 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
@@ -112,13 +112,12 @@ bool 
ViewObjectContactOfPageBackground::isPrimitiveVisible(const DisplayInfo& rD
     return true;
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageBackground::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/) const
+void ViewObjectContactOfPageBackground::createPrimitive2DSequence(const 
DisplayInfo& /*rDisplayInfo*/, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
 {
     // Initialize background. Dependent of IsPageVisible, use 
ApplicationBackgroundColor or ApplicationDocumentColor. Most
     // old renderers for export (html, pdf, gallery, ...) set the page to not 
visible (SetPageVisible(false)). They expect the
     // given OutputDevice to be initialized with the ApplicationDocumentColor 
then.
     const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
 
     if(pPageView)
     {
@@ -141,12 +140,9 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageBackgroun
         }
 
         // init background with InitColor
-        xRetval.resize(1);
         const basegfx::BColor aRGBColor(aInitColor.getBColor());
-        xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new 
drawinglayer::primitive2d::BackgroundColorPrimitive2D(aRGBColor, (255 - 
aInitColor.GetAlpha()) / 255.0));
+        rVisitor.visit(new 
drawinglayer::primitive2d::BackgroundColorPrimitive2D(aRGBColor, (255 - 
aInitColor.GetAlpha()) / 255.0));
     }
-
-    return xRetval;
 }
 
 ViewObjectContactOfMasterPage::ViewObjectContactOfMasterPage(ObjectContact& 
rObjectContact, ViewContact& rViewContact)
@@ -207,10 +203,9 @@ bool ViewObjectContactOfPageFill::isPrimitiveVisible(const 
DisplayInfo& rDisplay
     return true;
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageFill::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/) const
+void ViewObjectContactOfPageFill::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const
 {
     const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
 
     if(pPageView)
     {
@@ -231,12 +226,9 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageFill::cre
         }
 
         // create and add primitive
-        xRetval.resize(1);
         const basegfx::BColor aRGBColor(aPageFillColor.getBColor());
-        xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new 
drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aPageFillPolygon),
 aRGBColor));
+        rVisitor.visit(new 
drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aPageFillPolygon),
 aRGBColor));
     }
-
-    return xRetval;
 }
 
 ViewObjectContactOfPageShadow::ViewObjectContactOfPageShadow(ObjectContact& 
rObjectContact, ViewContact& rViewContact)
@@ -423,10 +415,9 @@ bool ViewObjectContactOfPageGrid::isPrimitiveVisible(const 
DisplayInfo& rDisplay
     return true;
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageGrid::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/) const
+void ViewObjectContactOfPageGrid::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const
 {
     const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
 
     if(pPageView)
     {
@@ -448,13 +439,10 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageGrid::cre
         const sal_uInt32 nSubdivisionsX(aFine.getWidth() ? aRaw.getWidth() / 
aFine.getWidth() : 0);
         const sal_uInt32 nSubdivisionsY(aFine.getHeight() ? aRaw.getHeight() / 
aFine.getHeight() : 0);
 
-        xRetval.resize(1);
-        xRetval[0] = drawinglayer::primitive2d::Primitive2DReference(new 
drawinglayer::primitive2d::GridPrimitive2D(
+        rVisitor.visit(new drawinglayer::primitive2d::GridPrimitive2D(
             aGridMatrix, fWidthX, fWidthY, 10.0, 3.0, nSubdivisionsX, 
nSubdivisionsY, aRGBGridColor,
             drawinglayer::primitive2d::createDefaultCross_3x3(aRGBGridColor)));
     }
-
-    return xRetval;
 }
 
 
ViewObjectContactOfPageHelplines::ViewObjectContactOfPageHelplines(ObjectContact&
 rObjectContact, ViewContact& rViewContact)
@@ -501,9 +489,8 @@ bool 
ViewObjectContactOfPageHelplines::isPrimitiveVisible(const DisplayInfo& rDi
     return true;
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageHelplines::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/) const
+void ViewObjectContactOfPageHelplines::createPrimitive2DSequence(const 
DisplayInfo& /*rDisplayInfo*/, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
 {
-    drawinglayer::primitive2d::Primitive2DContainer xRetval;
     const SdrPageView* pPageView = GetObjectContact().TryToGetSdrPageView();
 
     if(pPageView)
@@ -515,7 +502,6 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageHelplines
         {
             const basegfx::BColor aRGBColorA(1.0, 1.0, 1.0);
             const basegfx::BColor aRGBColorB(0.0, 0.0, 0.0);
-            xRetval.resize(nCount);
 
             for(sal_uInt32 a(0); a < nCount; a++)
             {
@@ -527,21 +513,21 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageHelplines
                 {
                     default : // SdrHelpLineKind::Point
                     {
-                        xRetval[a] = 
drawinglayer::primitive2d::Primitive2DReference(new 
drawinglayer::primitive2d::HelplinePrimitive2D(
+                        rVisitor.visit(new 
drawinglayer::primitive2d::HelplinePrimitive2D(
                             aPosition, basegfx::B2DVector(1.0, 0.0), 
drawinglayer::primitive2d::HelplineStyle2D::Point,
                             aRGBColorA, aRGBColorB, fDiscreteDashLength));
                         break;
                     }
                     case SdrHelpLineKind::Vertical :
                     {
-                        xRetval[a] = 
drawinglayer::primitive2d::Primitive2DReference(new 
drawinglayer::primitive2d::HelplinePrimitive2D(
+                        rVisitor.visit(new 
drawinglayer::primitive2d::HelplinePrimitive2D(
                             aPosition, basegfx::B2DVector(0.0, 1.0), 
drawinglayer::primitive2d::HelplineStyle2D::Line,
                             aRGBColorA, aRGBColorB, fDiscreteDashLength));
                         break;
                     }
                     case SdrHelpLineKind::Horizontal :
                     {
-                        xRetval[a] = 
drawinglayer::primitive2d::Primitive2DReference(new 
drawinglayer::primitive2d::HelplinePrimitive2D(
+                        rVisitor.visit(new 
drawinglayer::primitive2d::HelplinePrimitive2D(
                             aPosition, basegfx::B2DVector(1.0, 0.0), 
drawinglayer::primitive2d::HelplineStyle2D::Line,
                             aRGBColorA, aRGBColorB, fDiscreteDashLength));
                         break;
@@ -550,8 +536,6 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfPageHelplines
             }
         }
     }
-
-    return xRetval;
 }
 
 ViewObjectContactOfSdrPage::ViewObjectContactOfSdrPage(ObjectContact& 
rObjectContact, ViewContact& rViewContact)
diff --git a/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx 
b/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx
index 042d1f9516e3..4881954b2eb1 100644
--- a/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx
@@ -1646,25 +1646,24 @@ namespace sdr::contact {
     }
 
 
-    drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfUnoControl::createPrimitive2DSequence(const DisplayInfo& 
/*rDisplayInfo*/) const
+    void ViewObjectContactOfUnoControl::createPrimitive2DSequence(const 
DisplayInfo& /*rDisplayInfo*/, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
     {
         if ( m_pImpl->isDisposed() )
             // our control already died.
             // TODO: Is it worth re-creating the control? Finally, this is a 
pathological situation, it means some instance
             // disposed the control though it doesn't own it. So, /me thinks 
we should not bother here.
-            return drawinglayer::primitive2d::Primitive2DContainer();
+            return;
 
         if ( 
GetObjectContact().getViewInformation2D().getViewTransformation().isIdentity() )
             // remove this when #i115754# is fixed
-            return drawinglayer::primitive2d::Primitive2DContainer();
+            return;
 
         // ignore existing controls which are in alive mode and manually 
switched to "invisible" #i102090#
         const ControlHolder& rControl( m_pImpl->getExistentControl() );
         if ( rControl.is() && !rControl.isDesignMode() && 
!rControl.isVisible() )
-            return drawinglayer::primitive2d::Primitive2DContainer();
+            return;
 
-        ::drawinglayer::primitive2d::Primitive2DReference xPrimitive( new 
LazyControlCreationPrimitive2D( m_pImpl ) );
-        return ::drawinglayer::primitive2d::Primitive2DContainer { xPrimitive 
};
+        rVisitor.visit( new LazyControlCreationPrimitive2D( m_pImpl ) );
     }
 
 
@@ -1761,11 +1760,11 @@ namespace sdr::contact {
     }
 
 
-    drawinglayer::primitive2d::Primitive2DContainer 
UnoControlPrintOrPreviewContact::createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo ) const
+    void UnoControlPrintOrPreviewContact::createPrimitive2DSequence(const 
DisplayInfo& rDisplayInfo, 
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor ) const
     {
         if ( !m_pImpl->isPrintableControl() )
-            return drawinglayer::primitive2d::Primitive2DContainer();
-        return ViewObjectContactOfUnoControl::createPrimitive2DSequence( 
rDisplayInfo );
+            return;
+        ViewObjectContactOfUnoControl::createPrimitive2DSequence( 
rDisplayInfo, rVisitor );
     }
 
 
diff --git a/svx/source/sdr/contact/viewobjectcontactredirector.cxx 
b/svx/source/sdr/contact/viewobjectcontactredirector.cxx
index fa3b52933f68..c49909327019 100644
--- a/svx/source/sdr/contact/viewobjectcontactredirector.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactredirector.cxx
@@ -28,11 +28,11 @@ ViewObjectContactRedirector::ViewObjectContactRedirector() 
{}
 // The destructor.
 ViewObjectContactRedirector::~ViewObjectContactRedirector() {}
 
-drawinglayer::primitive2d::Primitive2DContainer
-ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
-    const sdr::contact::ViewObjectContact& rOriginal, const 
sdr::contact::DisplayInfo& rDisplayInfo)
+void ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+    const sdr::contact::ViewObjectContact& rOriginal, const 
sdr::contact::DisplayInfo& rDisplayInfo,
+    drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
 {
-    return rOriginal.createPrimitive2DSequence(rDisplayInfo);
+    return rOriginal.createPrimitive2DSequence(rDisplayInfo, rVisitor);
 }
 }
 
diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx 
b/svx/source/unodraw/UnoGraphicExporter.cxx
index 73d77cb54ea8..ed6978f106d1 100644
--- a/svx/source/unodraw/UnoGraphicExporter.cxx
+++ b/svx/source/unodraw/UnoGraphicExporter.cxx
@@ -276,9 +276,10 @@ class ImplExportCheckVisisbilityRedirector : public 
sdr::contact::ViewObjectCont
 public:
     explicit ImplExportCheckVisisbilityRedirector( SdrPage* pCurrentPage );
 
-    virtual drawinglayer::primitive2d::Primitive2DContainer 
createRedirectedPrimitive2DSequence(
+    virtual void createRedirectedPrimitive2DSequence(
         const sdr::contact::ViewObjectContact& rOriginal,
-        const sdr::contact::DisplayInfo& rDisplayInfo) override;
+        const sdr::contact::DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
override;
 
 private:
     SdrPage*    mpCurrentPage;
@@ -289,9 +290,10 @@ 
ImplExportCheckVisisbilityRedirector::ImplExportCheckVisisbilityRedirector( SdrP
 {
 }
 
-drawinglayer::primitive2d::Primitive2DContainer 
ImplExportCheckVisisbilityRedirector::createRedirectedPrimitive2DSequence(
+void ImplExportCheckVisisbilityRedirector::createRedirectedPrimitive2DSequence(
     const sdr::contact::ViewObjectContact& rOriginal,
-    const sdr::contact::DisplayInfo& rDisplayInfo)
+    const sdr::contact::DisplayInfo& rDisplayInfo,
+    drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
 {
     SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
 
@@ -306,15 +308,15 @@ drawinglayer::primitive2d::Primitive2DContainer 
ImplExportCheckVisisbilityRedire
 
         if( (pPage == nullptr) || pPage->checkVisibility(rOriginal, 
rDisplayInfo, false) )
         {
-            return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo);
+            return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo, rVisitor);
         }
 
-        return drawinglayer::primitive2d::Primitive2DContainer();
+        return;
     }
     else
     {
         // not an object, maybe a page
-        return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo);
+        
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal,
 rDisplayInfo, rVisitor);
     }
 }
 
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 958033d0d6a3..c6659bf4dfdb 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -1003,8 +1003,9 @@ namespace { // anonymous namespace
 class ViewObjectContactOfSwNoTextFrame : public sdr::contact::ViewObjectContact
 {
 protected:
-    virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(
-        const sdr::contact::DisplayInfo& rDisplayInfo) const override;
+    virtual void createPrimitive2DSequence(
+        const sdr::contact::DisplayInfo& rDisplayInfo,
+        drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
const override;
 
 public:
     ViewObjectContactOfSwNoTextFrame(
@@ -1032,8 +1033,9 @@ public:
     explicit ViewContactOfSwNoTextFrame(const SwNoTextFrame& rSwNoTextFrame);
 };
 
-drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfSwNoTextFrame::createPrimitive2DSequence(
-    const sdr::contact::DisplayInfo& /*rDisplayInfo*/) const
+void ViewObjectContactOfSwNoTextFrame::createPrimitive2DSequence(
+    const sdr::contact::DisplayInfo& /*rDisplayInfo*/,
+    drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
 {
     // MM02 get all the parameters formally used in 
paintGraphicUsingPrimitivesHelper
     ViewContactOfSwNoTextFrame& 
rVCOfNTF(static_cast<ViewContactOfSwNoTextFrame&>(GetViewContact()));
@@ -1052,16 +1054,11 @@ drawinglayer::primitive2d::Primitive2DContainer 
ViewObjectContactOfSwNoTextFrame
         // MM02 this is the right place in the VOC-Mechanism to create
         // the primitives for visualization - these will be automatically
         // buffered and reused
-        drawinglayer::primitive2d::Primitive2DContainer aContent(1);
-        aContent[0] = new drawinglayer::primitive2d::GraphicPrimitive2D(
+        rVisitor.visit(new drawinglayer::primitive2d::GraphicPrimitive2D(
             aGraphicTransform,
             rGrfObj,
-            aGraphicAttr);
-
-        return aContent;
+            aGraphicAttr));
     }
-
-    return drawinglayer::primitive2d::Primitive2DContainer();
 }
 
 ViewObjectContactOfSwNoTextFrame::ViewObjectContactOfSwNoTextFrame(
diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx
index 409287f7521d..984cacf4298a 100644
--- a/sw/source/core/draw/dcontact.cxx
+++ b/sw/source/core/draw/dcontact.cxx
@@ -2078,7 +2078,7 @@ namespace sdr::contact
              *
              * This method will not handle included hierarchies and not check 
geometric visibility.
              */
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const override;
+            virtual void createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const override;
 
         public:
             VOCOfDrawVirtObj(ObjectContact& rObjectContact, ViewContact& 
rViewContact)
@@ -2164,7 +2164,7 @@ namespace sdr::contact
             }
         }
 
-        drawinglayer::primitive2d::Primitive2DContainer 
VOCOfDrawVirtObj::createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) 
const
+        void VOCOfDrawVirtObj::createPrimitive2DSequence(const DisplayInfo& 
rDisplayInfo, drawinglayer::primitive2d::Primitive2DDecompositionVisitor& 
rVisitor) const
         {
             // tdf#91260 have already checked top-level one is on the right 
page
             assert(isPrimitiveVisible(rDisplayInfo));
@@ -2212,7 +2212,7 @@ namespace sdr::contact
                 xRetval = drawinglayer::primitive2d::Primitive2DContainer { 
xReference };
             }
 
-            return xRetval;
+            rVisitor.visit(xRetval);
         }
 
         ViewObjectContact& 
VCOfDrawVirtObj::CreateObjectSpecificViewObjectContact(ObjectContact& 
rObjectContact)
diff --git a/sw/source/core/layout/paintfrm.cxx 
b/sw/source/core/layout/paintfrm.cxx
index 9abc517a2a4f..d50869ebc7cb 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -2970,9 +2970,10 @@ namespace
                 : mrViewShell( rSh )
             {};
 
-            virtual drawinglayer::primitive2d::Primitive2DContainer 
createRedirectedPrimitive2DSequence(
+            virtual void createRedirectedPrimitive2DSequence(
                                     const sdr::contact::ViewObjectContact& 
rOriginal,
-                                    const sdr::contact::DisplayInfo& 
rDisplayInfo) override
+                                    const sdr::contact::DisplayInfo& 
rDisplayInfo,
+                                    
drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override
             {
                 bool bPaint( true );
 
@@ -2984,11 +2985,11 @@ namespace
 
                 if ( !bPaint )
                 {
-                    return drawinglayer::primitive2d::Primitive2DContainer();
+                    return;
                 }
 
-                return 
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
-                                                        rOriginal, 
rDisplayInfo );
+                
sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+                                                        rOriginal, 
rDisplayInfo, rVisitor );
             }
     };
 

Reply via email to