diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-09-23 16:55:19 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-09-23 17:48:59 +0200 |
commit | 00fa364a2403dc23a786d3f91fde06e10b3a4a9a (patch) | |
tree | cae255dd2a5e44fb6e9b41e2d32f2b3650e76c8d /drawinglayer | |
parent | c8d66a4d53acf1b0c0de45335015b72ee72cd0fd (diff) |
Related: tdf#144091 svx: fix interaction of transp cell fill and transp shadow
This is a follow-up to commit 37a52d30bbfcf1d073779b50139c4dafa507be4b
(tdf#144091 svx: fix unwanted blur of shadow from table cell fill,
2021-09-20), where it turned out that the original bugdoc was just a
special case of almost full transparency (80%), that's why avoiding the
blur fixed the problem.
A more general approach instead is to multiply the alpha or the cell
fill of table shapes and the alpha of the shadow itself. The end result
is the same (80% transparency) for the first bugdoc, but this gives back
the blur on the second bugdoc.
Change-Id: I63560e3a73473c70157ecee8365ec7154217f269
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122532
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'drawinglayer')
-rw-r--r-- | drawinglayer/source/primitive2d/shadowprimitive2d.cxx | 73 | ||||
-rw-r--r-- | drawinglayer/source/processor2d/vclpixelprocessor2d.cxx | 8 | ||||
-rw-r--r-- | drawinglayer/source/tools/primitive2dxmldump.cxx | 4 |
3 files changed, 19 insertions, 66 deletions
diff --git a/drawinglayer/source/primitive2d/shadowprimitive2d.cxx b/drawinglayer/source/primitive2d/shadowprimitive2d.cxx index 3d4bbdfecb92..6ea066b35754 100644 --- a/drawinglayer/source/primitive2d/shadowprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/shadowprimitive2d.cxx @@ -22,7 +22,6 @@ #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx> #include <drawinglayer/primitive2d/transformprimitive2d.hxx> #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> -#include <drawinglayer/primitive2d/BufferedDecompositionPrimitive2D.hxx> #include <memory> @@ -31,28 +30,6 @@ using namespace com::sun::star; namespace drawinglayer::primitive2d { -namespace -{ -void get2DDecompositionOfChildren(const ShadowPrimitive2D& rPrimitive, - Primitive2DDecompositionVisitor& rVisitor, - const Primitive2DContainer& rChildren) -{ - if (rChildren.empty()) - return; - - // create a modifiedColorPrimitive containing the shadow color and the content - const basegfx::BColorModifierSharedPtr aBColorModifier - = std::make_shared<basegfx::BColorModifier_replace>(rPrimitive.getShadowColor()); - const Primitive2DReference xRefA( - new ModifiedColorPrimitive2D(Primitive2DContainer(rChildren), aBColorModifier)); - Primitive2DContainer aSequenceB{ xRefA }; - - // build transformed primitiveVector with shadow offset and add to target - rVisitor.append( - new TransformPrimitive2D(rPrimitive.getShadowTransform(), std::move(aSequenceB))); -} -} - ShadowPrimitive2D::ShadowPrimitive2D( const basegfx::B2DHomMatrix& rShadowTransform, const basegfx::BColor& rShadowColor, @@ -89,41 +66,21 @@ void get2DDecompositionOfChildren(const ShadowPrimitive2D& rPrimitive, void ShadowPrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& /*rViewInformation*/) const { - get2DDecompositionOfChildren(*this, rVisitor, getChildren()); - } - - void ShadowPrimitive2D::get2DDecompositionWithoutBlur( - Primitive2DDecompositionVisitor& rVisitor, - const geometry::ViewInformation2D& /*rViewInformation*/) const - { - Primitive2DContainer aChildren; - // Only decompose children which are not blurred (they opted in for this). - std::copy_if(getChildren().begin(), getChildren().end(), std::back_inserter(aChildren), - [](const Primitive2DReference& xChild) { - auto pChild - = dynamic_cast<primitive2d::BufferedDecompositionPrimitive2D*>( - xChild.get()); - return pChild && pChild->getExcludeFromBlur(); - }); - - get2DDecompositionOfChildren(*this, rVisitor, aChildren); - } - - void ShadowPrimitive2D::get2DDecompositionWithBlur( - Primitive2DDecompositionVisitor& rVisitor, - const geometry::ViewInformation2D& /*rViewInformation*/) const - { - // Only decompose children which are blurred (which is the default). - Primitive2DContainer aChildren; - std::copy_if(getChildren().begin(), getChildren().end(), std::back_inserter(aChildren), - [](const Primitive2DReference& xChild) { - auto pChild - = dynamic_cast<primitive2d::BufferedDecompositionPrimitive2D*>( - xChild.get()); - return !pChild || !pChild->getExcludeFromBlur(); - }); - - get2DDecompositionOfChildren(*this, rVisitor, aChildren); + if(getChildren().empty()) + return; + + // create a modifiedColorPrimitive containing the shadow color and the content + const basegfx::BColorModifierSharedPtr aBColorModifier = + std::make_shared<basegfx::BColorModifier_replace>( + getShadowColor()); + const Primitive2DReference xRefA( + new ModifiedColorPrimitive2D( + Primitive2DContainer(getChildren()), + aBColorModifier)); + Primitive2DContainer aSequenceB { xRefA }; + + // build transformed primitiveVector with shadow offset and add to target + rVisitor.append(new TransformPrimitive2D(getShadowTransform(), std::move(aSequenceB))); } // provide unique ID diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx index be53d4712aa3..27dbd89f1d06 100644 --- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx @@ -1164,16 +1164,12 @@ void VclPixelProcessor2D::processShadowPrimitive2D(const primitive2d::ShadowPrim const double fBlurRadius = aBlurRadiusVector.getLength(); impBufferDevice aBufferDevice(*mpOutputDevice, aRange); - if (aBufferDevice.isVisible()) + if (aBufferDevice.isVisible() && !aRange.isEmpty()) { - // Process children which don't want blur. - rCandidate.get2DDecompositionWithoutBlur(*this, getViewInformation2D()); - - // Process children which want blur. OutputDevice* pLastOutputDevice = mpOutputDevice; mpOutputDevice = &aBufferDevice.getContent(); - rCandidate.get2DDecompositionWithBlur(*this, getViewInformation2D()); + process(rCandidate); const tools::Rectangle aRect(static_cast<tools::Long>(std::floor(aRange.getMinX())), static_cast<tools::Long>(std::floor(aRange.getMinY())), diff --git a/drawinglayer/source/tools/primitive2dxmldump.cxx b/drawinglayer/source/tools/primitive2dxmldump.cxx index d0496b482669..17bb707b666e 100644 --- a/drawinglayer/source/tools/primitive2dxmldump.cxx +++ b/drawinglayer/source/tools/primitive2dxmldump.cxx @@ -641,8 +641,8 @@ void Primitive2dXmlDump::decomposeAndWrite( if (pBufferedDecomposition) { rWriter.attribute( - "excludeFromBlur", - OString::boolean(pBufferedDecomposition->getExcludeFromBlur())); + "transparenceForShadow", + OString::number(pBufferedDecomposition->getTransparenceForShadow())); } drawinglayer::primitive2d::Primitive2DContainer aPrimitiveContainer; |