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/+/183611
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
This commit is contained in:
Tomaž Vajngerl
2025-04-02 11:25:40 +02:00
committed by Miklos Vajna
parent 412da215c1
commit 726099e511
2 changed files with 35 additions and 11 deletions
@@ -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;
@@ -160,6 +163,7 @@ private:
void setupAnimations();
void setupMasterPageFields();
void resolveEffect(CustomAnimationEffectPtr const& rEffect);
void cleanup();
public:
SlideshowLayerRenderer(SdrPage& rPage, bool bRenderBackground, bool bRenderMasterPage);
+31 -11
View File
@@ -160,8 +160,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)
{
@@ -172,13 +173,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++)
{
@@ -188,7 +192,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);
}
}
}
@@ -251,9 +255,11 @@ findTextBlock(drawinglayer::primitive2d::Primitive2DContainer const& rContainer,
}
/// show/hide paragraphs in the container
void modifyParagraphs(const drawinglayer::primitive2d::Primitive2DContainer& rContainer,
drawinglayer::geometry::ViewInformation2D const& rViewInformation2D,
std::deque<sal_Int32> const& rPreserveIndices, bool bRenderObject)
void modifyParagraphs(
const 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);
@@ -278,11 +284,13 @@ void modifyParagraphs(const drawinglayer::primitive2d::Primitive2DContainer& rCo
bool bHideIndex = aIterator == rPreserveIndices.end();
pParagraphPrimitive2d.setVisible(!bHideIndex);
if (bHideIndex)
rPrimitivesToUnhide.push_back(pPrimitive);
}
nIndex++;
}
changeBackground(rContainer, bRenderObject);
changeBackground(rContainer, bRenderObject, rPrimitivesToUnhide);
}
}
@@ -559,8 +567,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: */