diff options
Diffstat (limited to 'drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx')
-rw-r--r-- | drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx b/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx index 68f31cb4c67a..ea1b2a56942a 100644 --- a/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx @@ -21,6 +21,7 @@ #include <basegfx/polygon/b2dpolygon.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> #include <drawinglayer/primitive2d/PolyPolygonColorPrimitive2D.hxx> +#include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx> #include <drawinglayer/geometry/viewinformation2d.hxx> #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> @@ -30,13 +31,31 @@ using namespace com::sun::star; namespace drawinglayer::primitive2d { - void BackgroundColorPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const + Primitive2DReference BackgroundColorPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const { - if(!rViewInformation.getViewport().isEmpty()) + // transparency invalid or completely transparent, done + if(getTransparency() < 0.0 || getTransparency() >= 1.0) + return nullptr; + + // no viewport, not visible, done + if(rViewInformation.getViewport().isEmpty()) + return nullptr; + + // create decompose geometry + const basegfx::B2DPolygon aOutline(basegfx::utils::createPolygonFromRect(rViewInformation.getViewport())); + Primitive2DReference aDecompose(new PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aOutline), getBColor())); + + if(getTransparency() != 0.0) { - const basegfx::B2DPolygon aOutline(basegfx::utils::createPolygonFromRect(rViewInformation.getViewport())); - rContainer.push_back(new PolyPolygonColorPrimitive2D(basegfx::B2DPolyPolygon(aOutline), getBColor())); + // if used, embed decompose geometry to unified transparency + Primitive2DContainer aContent { aDecompose }; + aDecompose = + new UnifiedTransparencePrimitive2D( + std::move(aContent), + getTransparency()); } + + return aDecompose; } BackgroundColorPrimitive2D::BackgroundColorPrimitive2D( @@ -67,22 +86,19 @@ namespace drawinglayer::primitive2d void BackgroundColorPrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& rViewInformation) const { - std::unique_lock aGuard( m_aMutex ); - - if(!getBuffered2DDecomposition().empty() && (maLastViewport != rViewInformation.getViewport())) + if(getBuffered2DDecomposition() && (maLastViewport != rViewInformation.getViewport())) { // conditions of last local decomposition have changed, delete - const_cast< BackgroundColorPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer()); + const_cast< BackgroundColorPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr); } - if(getBuffered2DDecomposition().empty()) + if(!getBuffered2DDecomposition()) { // remember ViewRange const_cast< BackgroundColorPrimitive2D* >(this)->maLastViewport = rViewInformation.getViewport(); } // use parent implementation - aGuard.unlock(); BufferedDecompositionPrimitive2D::get2DDecomposition(rVisitor, rViewInformation); } |