summaryrefslogtreecommitdiff
path: root/drawinglayer
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-09-23 16:55:19 +0200
committerMiklos Vajna <vmiklos@collabora.com>2021-09-23 17:48:59 +0200
commit00fa364a2403dc23a786d3f91fde06e10b3a4a9a (patch)
treecae255dd2a5e44fb6e9b41e2d32f2b3650e76c8d /drawinglayer
parentc8d66a4d53acf1b0c0de45335015b72ee72cd0fd (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.cxx73
-rw-r--r--drawinglayer/source/processor2d/vclpixelprocessor2d.cxx8
-rw-r--r--drawinglayer/source/tools/primitive2dxmldump.cxx4
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;