sd/source/ui/inc/SlideshowLayerRenderer.hxx   |    4 ++
 sd/source/ui/tools/SlideshowLayerRenderer.cxx |   42 +++++++++++++++++++-------
 2 files changed, 35 insertions(+), 11 deletions(-)

New commits:
commit cf6e23681e54ce9472a9c1d44450beadce2144ce
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Mon Dec 9 16:53:26 2024 +0900
Commit:     Marco Cecchetti <marco.cecche...@collabora.com>
CommitDate: Mon Dec 9 12:51:27 2024 +0100

    slideshow: reset visibility of primitives after rendering
    
    If the visible flag is not reset to true, it may be used outside
    of slideshow rendering.
    
    Change-Id: I42589b75c85d6e24af65a4d910bec4ac0c1a45e4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178128
    Reviewed-by: Marco Cecchetti <marco.cecche...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sd/source/ui/inc/SlideshowLayerRenderer.hxx 
b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
index f6c3c6534564..21962d1ee5b4 100644
--- a/sd/source/ui/inc/SlideshowLayerRenderer.hxx
+++ b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
@@ -23,6 +23,7 @@
 #include <optional>
 #include <unordered_map>
 #include <unordered_set>
+#include <drawinglayer/primitive2d/CommonTypes.hxx>
 
 #include <frozen/bits/defines.h>
 #include <frozen/bits/elsa_std.h>
@@ -111,6 +112,8 @@ struct RenderState
 
     std::array<sal_Int32, 4> maIndices = { 0, 0, 0, 0 };
 
+    std::vector<drawinglayer::primitive2d::Primitive2DReference> 
maPrimitivesToUnhide;
+
     SdrObject* mpCurrentTarget = nullptr;
     sal_Int32 mnCurrentTargetParagraph = -1;
 
@@ -175,6 +178,7 @@ private:
     void setupAnimations();
     void setupMasterPageFields();
     void resolveEffect(CustomAnimationEffectPtr const& rEffect);
+    void cleanup();
 
 public:
     SlideshowLayerRenderer(SdrPage& rPage, bool bRenderBackground, bool 
bRenderMasterPage);
diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx 
b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
index bf15654013b0..d17b4beaedf7 100644
--- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx
+++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
@@ -161,8 +161,9 @@ OUString getMasterTextFieldType(SdrObject* pObject)
 bool isGroup(SdrObject* pObject) { return pObject->getChildrenOfSdrObject() != 
nullptr; }
 
 /// Sets visible for all kinds of polypolys in the container
-void changePolyPolys(drawinglayer::primitive2d::Primitive2DContainer& 
rContainer,
-                     bool bRenderObject)
+void changePolyPolys(
+    drawinglayer::primitive2d::Primitive2DContainer& rContainer, bool 
bRenderObject,
+    std::vector<drawinglayer::primitive2d::Primitive2DReference>& 
rPrimitivesToUnhide)
 {
     for (auto& pBasePrimitive : rContainer)
     {
@@ -173,13 +174,16 @@ void 
changePolyPolys(drawinglayer::primitive2d::Primitive2DContainer& rContainer
             || pBasePrimitive->getPrimitive2DID() == 
PRIMITIVE2D_ID_POLYPOLYGONHAIRLINEPRIMITIVE2D)
         {
             pBasePrimitive->setVisible(bRenderObject);
+            if (!bRenderObject)
+                rPrimitivesToUnhide.push_back(pBasePrimitive);
         }
     }
 }
 
 /// Searches for rectangle primitive and changes if the background should be 
rendered
-void changeBackground(drawinglayer::primitive2d::Primitive2DContainer const& 
rContainer,
-                      bool bRenderObject)
+void changeBackground(
+    drawinglayer::primitive2d::Primitive2DContainer const& rContainer, bool 
bRenderObject,
+    std::vector<drawinglayer::primitive2d::Primitive2DReference>& 
rPrimitivesToUnhide)
 {
     for (size_t i = 0; i < rContainer.size(); i++)
     {
@@ -189,7 +193,7 @@ void 
changeBackground(drawinglayer::primitive2d::Primitive2DContainer const& rCo
             drawinglayer::primitive2d::Primitive2DContainer 
aPrimitiveContainer;
             pBasePrimitive->get2DDecomposition(aPrimitiveContainer,
                                                
drawinglayer::geometry::ViewInformation2D());
-            changePolyPolys(aPrimitiveContainer, bRenderObject);
+            changePolyPolys(aPrimitiveContainer, bRenderObject, 
rPrimitivesToUnhide);
         }
     }
 }
@@ -252,9 +256,11 @@ 
findTextBlock(drawinglayer::primitive2d::Primitive2DContainer const& rContainer,
 }
 
 /// show/hide paragraphs in the container
-void modifyParagraphs(drawinglayer::primitive2d::Primitive2DContainer& 
rContainer,
-                      drawinglayer::geometry::ViewInformation2D const& 
rViewInformation2D,
-                      std::deque<sal_Int32> const& rPreserveIndices, bool 
bRenderObject)
+void modifyParagraphs(
+    drawinglayer::primitive2d::Primitive2DContainer& rContainer,
+    drawinglayer::geometry::ViewInformation2D const& rViewInformation2D,
+    std::deque<sal_Int32> const& rPreserveIndices, bool bRenderObject,
+    std::vector<drawinglayer::primitive2d::Primitive2DReference>& 
rPrimitivesToUnhide)
 {
     auto* pTextBlock = findTextBlock(rContainer, rViewInformation2D);
 
@@ -279,11 +285,13 @@ void 
modifyParagraphs(drawinglayer::primitive2d::Primitive2DContainer& rContaine
                 bool bHideIndex = aIterator == rPreserveIndices.end();
 
                 pParagraphPrimitive2d.setVisible(!bHideIndex);
+                if (bHideIndex)
+                    rPrimitivesToUnhide.push_back(pPrimitive);
             }
             nIndex++;
         }
 
-        changeBackground(rContainer, bRenderObject);
+        changeBackground(rContainer, bRenderObject, rPrimitivesToUnhide);
     }
 }
 
@@ -560,8 +568,10 @@ public:
             auto const& rViewInformation2D = 
rOriginal.GetObjectContact().getViewInformation2D();
             auto rContainer
                 = 
static_cast<drawinglayer::primitive2d::Primitive2DContainer&>(rVisitor);
+
             modifyParagraphs(rContainer, rViewInformation2D, rParagraphs,
-                             mrRenderPass.mbRenderObjectBackground);
+                             mrRenderPass.mbRenderObjectBackground,
+                             mrRenderState.maPrimitivesToUnhide);
         }
     }
 };
@@ -1001,8 +1011,10 @@ bool SlideshowLayerRenderer::render(unsigned char* 
pBuffer, bool& bIsBitmapLayer
     else
     {
         if (maRenderState.maRenderPasses.empty())
+        {
+            cleanup();
             return false;
-
+        }
         auto const& rRenderPass = maRenderState.maRenderPasses.front();
         maRenderState.meStage = rRenderPass.meStage;
 
@@ -1021,6 +1033,14 @@ bool SlideshowLayerRenderer::render(unsigned char* 
pBuffer, bool& bIsBitmapLayer
     return true;
 }
 
+void SlideshowLayerRenderer::cleanup()
+{
+    for (auto& pPrimitive : maRenderState.maPrimitivesToUnhide)
+    {
+        pPrimitive->setVisible(true);
+    }
+}
+
 } // end of namespace sd
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to