tdf#149650 avoid potential recursion with SdrPage content hierarchy
Change-Id: I27e064eeedfb45a2fe96892f1d31da94b9976c50
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136303
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand@me.com>
diff --git a/svx/source/sdr/primitive2d/sdrdecompositiontools.cxx b/svx/source/sdr/primitive2d/sdrdecompositiontools.cxx
index f05c0c9..04b6a16 100644
--- a/svx/source/sdr/primitive2d/sdrdecompositiontools.cxx
+++ b/svx/source/sdr/primitive2d/sdrdecompositiontools.cxx
@@ -60,6 +60,7 @@
#include <svx/sdr/contact/viewobjectcontact.hxx>
#include <svx/sdr/contact/displayinfo.hxx>
#include <basegfx/polygon/b2dpolygonclipper.hxx>
#include <set>
using namespace com::sun::star;
@@ -330,8 +331,35 @@ void SlideBackgroundFillPrimitive2D::get2DDecomposition(
const_cast< SlideBackgroundFillPrimitive2D* >(this)->mpLastVC = pViewContact;
}
// tdf#149650 allow remember/detect of potential recursion for content creation.
// use a std::set association - instead of a single bool or adress - due to the
// possibility of multiple SlideBackgroundFillPrimitive2D's being used at the same
// refresh. Also possible would be a local member (bool), but that just makes the
// class more complicated. Working wth the adress is not a problem here since below
// it reliably gets added/removed while being incarnated only.
static std::set<const SlideBackgroundFillPrimitive2D*> potentiallyActiveRecursion;
if(potentiallyActiveRecursion.end() != potentiallyActiveRecursion.find(this))
{
// The method getPrimitive2DSequenceSubHierarchy used in create2DDecomposition
// above has the potential to create a recursion, e.g. when the content of a page
// contains a SdrPageObj that again displays the page content (and potentially so
// on).
// This is valid, but works like a fractal, showing page content
// smaller and smaller inside a page. This needs to be controlled here to avoid
// the recursion. In this case just allow one single step since
// we are mainly interested in the page's BG fill anyways
return;
}
// remember that we enter a potential recursion
potentiallyActiveRecursion.insert(this);
// use parent implementation
BufferedDecompositionPrimitive2D::get2DDecomposition(rVisitor, rViewInformation);
// forget about potential recursion
potentiallyActiveRecursion.extract(this);
}
bool SlideBackgroundFillPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const