basegfx/source/color/bcolormodifier.cxx          |   19 ++++++++++++++++
 basegfx/test/BColorModifierTest.cxx              |   27 +++++++++++++++++++++++
 include/basegfx/color/bcolormodifier.hxx         |   20 +++++++++++++++++
 svgio/inc/svgfecolormatrixnode.hxx               |    2 +
 svgio/inc/svgfegaussianblurnode.hxx              |   14 -----------
 svgio/inc/svgfilternode.hxx                      |    6 +++++
 svgio/qa/cppunit/SvgImportTest.cxx               |    3 +-
 svgio/qa/cppunit/data/filterFeGaussianBlur.svg   |    2 -
 svgio/source/svgreader/svgfecolormatrixnode.cxx  |   21 +++++++++++++++++
 svgio/source/svgreader/svgfegaussianblurnode.cxx |   18 +++++++++++++--
 10 files changed, 115 insertions(+), 17 deletions(-)

New commits:
commit 75399b8aad6c0f0998b9d0a6eddb2e29f8bc114c
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Sat Jun 24 11:17:16 2023 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Sat Jun 24 12:33:12 2023 +0200

    tdf#132246, tdf#155735: Add support for SourceAlpha
    
    Change-Id: I8feae2447b17e15113ca45fe46c0d68cb6b6ab71
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153550
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/basegfx/source/color/bcolormodifier.cxx 
b/basegfx/source/color/bcolormodifier.cxx
index 829b0abda659..52f34a69f205 100644
--- a/basegfx/source/color/bcolormodifier.cxx
+++ b/basegfx/source/color/bcolormodifier.cxx
@@ -69,6 +69,25 @@ namespace basegfx
         return "invert";
     }
 
+    BColorModifier_alpha::~BColorModifier_alpha()
+    {
+    }
+
+    bool BColorModifier_alpha::operator==(const BColorModifier& rCompare) const
+    {
+        return dynamic_cast< const BColorModifier_alpha* >(&rCompare) != 
nullptr;
+    }
+
+    ::basegfx::BColor BColorModifier_alpha::getModifiedColor(const 
::basegfx::BColor& /*aSourceColor*/) const
+    {
+        return ::basegfx::BColor(0.0, 0.0, 0.0);
+    }
+
+    OUString BColorModifier_alpha::getModifierName() const
+    {
+        return "alpha";
+    }
+
     BColorModifier_luminance_to_alpha::~BColorModifier_luminance_to_alpha()
     {
     }
diff --git a/basegfx/test/BColorModifierTest.cxx 
b/basegfx/test/BColorModifierTest.cxx
index 6be160ce43ae..5a4b941e1c44 100755
--- a/basegfx/test/BColorModifierTest.cxx
+++ b/basegfx/test/BColorModifierTest.cxx
@@ -378,6 +378,32 @@ public:
         CPPUNIT_ASSERT(aBColorModifier->operator==(*aBColorModifier2));
     }
 
+    void testAlpha()
+    {
+        const basegfx::BColorModifierSharedPtr aBColorModifier
+            = std::make_shared<basegfx::BColorModifier_alpha>();
+
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maWhite));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maGray));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maBlack));
+
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maRed));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maGreen));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maBlue));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maYellow));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maMagenta));
+        CPPUNIT_ASSERT_EQUAL(maBlack, 
aBColorModifier->getModifiedColor(maCyan));
+
+        CPPUNIT_ASSERT(aBColorModifier->operator==(*aBColorModifier));
+        const basegfx::BColorModifierSharedPtr aBColorModifierInvert
+            = std::make_shared<basegfx::BColorModifier_invert>();
+        CPPUNIT_ASSERT(*aBColorModifier != *aBColorModifierInvert);
+
+        const basegfx::BColorModifierSharedPtr aBColorModifier2
+            = std::make_shared<basegfx::BColorModifier_alpha>();
+        CPPUNIT_ASSERT(aBColorModifier->operator==(*aBColorModifier2));
+    }
+
     CPPUNIT_TEST_SUITE(bcolormodifier);
     CPPUNIT_TEST(testGray);
     CPPUNIT_TEST(testInvert);
@@ -389,6 +415,7 @@ public:
     CPPUNIT_TEST(testMatrix);
     CPPUNIT_TEST(testIdentityMatrix);
     CPPUNIT_TEST(testBlackAndWhite);
+    CPPUNIT_TEST(testAlpha);
     CPPUNIT_TEST_SUITE_END();
 };
 
diff --git a/include/basegfx/color/bcolormodifier.hxx 
b/include/basegfx/color/bcolormodifier.hxx
index 6eb40b67e9d7..37c6a5b9e2f3 100644
--- a/include/basegfx/color/bcolormodifier.hxx
+++ b/include/basegfx/color/bcolormodifier.hxx
@@ -126,6 +126,26 @@ namespace basegfx
         SAL_DLLPRIVATE virtual OUString getModifierName() const override;
     };
 
+    /**
+     * convert to alpha
+    */
+    class SAL_WARN_UNUSED BASEGFX_DLLPUBLIC BColorModifier_alpha final : 
public BColorModifier
+    {
+    public:
+        BColorModifier_alpha()
+        {
+        }
+
+        virtual ~BColorModifier_alpha() override;
+
+        // compare operator
+        SAL_DLLPRIVATE virtual bool operator==(const BColorModifier& rCompare) 
const override;
+
+        // compute modified color
+        SAL_DLLPRIVATE virtual ::basegfx::BColor getModifiedColor(const 
::basegfx::BColor& aSourceColor) const override;
+        SAL_DLLPRIVATE virtual OUString getModifierName() const override;
+    };
+
     /** convert to alpha based on luminance
 
         returns a color where red green and blue are first weighted and added
diff --git a/svgio/inc/svgfecolormatrixnode.hxx 
b/svgio/inc/svgfecolormatrixnode.hxx
index 78d8b027f653..d3fafb64e969 100644
--- a/svgio/inc/svgfecolormatrixnode.hxx
+++ b/svgio/inc/svgfecolormatrixnode.hxx
@@ -20,6 +20,7 @@
 #pragma once
 
 #include "svgnode.hxx"
+#include "svgfilternode.hxx"
 #include "svgstyleattributes.hxx"
 #include <basegfx/matrix/b3dhommatrix.hxx>
 
@@ -39,6 +40,7 @@ class SvgFeColorMatrixNode final : public SvgNode
 private:
     ColorType maType;
     OUString maValuesContent;
+    In maIn;
 
 public:
     SvgFeColorMatrixNode(SvgDocument& rDocument, SvgNode* pParent);
diff --git a/svgio/inc/svgfegaussianblurnode.hxx 
b/svgio/inc/svgfegaussianblurnode.hxx
index 5dec4463198f..68068d97ce93 100644
--- a/svgio/inc/svgfegaussianblurnode.hxx
+++ b/svgio/inc/svgfegaussianblurnode.hxx
@@ -20,24 +20,12 @@
 #pragma once
 
 #include "svgnode.hxx"
+#include "svgfilternode.hxx"
 #include "svgstyleattributes.hxx"
 #include <basegfx/matrix/b2dhommatrix.hxx>
 
 namespace svgio::svgreader
 {
-/*
-FIXME: If no value is provided and this is the first filter primitive,
-then this filter primitive will use SourceGraphic as its input.
-If no value is provided and this is a subsequent filter primitive,
-then this filter primitive will use the result from the previous
-filter primitive as its input.
-*/
-enum class In
-{
-    None,
-    SourceGraphic
-};
-
 class SvgFeGaussianBlurNode final : public SvgNode
 {
 private:
diff --git a/svgio/inc/svgfilternode.hxx b/svgio/inc/svgfilternode.hxx
index 19ce2cb34b33..520471501a11 100644
--- a/svgio/inc/svgfilternode.hxx
+++ b/svgio/inc/svgfilternode.hxx
@@ -25,6 +25,12 @@
 
 namespace svgio::svgreader
 {
+enum class In
+{
+    SourceGraphic,
+    SourceAlpha
+};
+
 class SvgFilterNode final : public SvgNode
 {
 public:
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index 8e7d86c145f2..651e1341521f 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -179,7 +179,8 @@ CPPUNIT_TEST_FIXTURE(Test, testFilterFeGaussianBlur)
 
     CPPUNIT_ASSERT (pDocument);
 
-    assertXPath(pDocument, "/primitive2D/transform/softedge", "radius", "5");
+    assertXPath(pDocument, "/primitive2D/transform/modifiedColor", "modifier", 
"alpha");
+    assertXPath(pDocument, "/primitive2D/transform/modifiedColor/softedge", 
"radius", "5");
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testTdf87309)
diff --git a/svgio/qa/cppunit/data/filterFeGaussianBlur.svg 
b/svgio/qa/cppunit/data/filterFeGaussianBlur.svg
index e8fd73068a0b..917a7592d51d 100644
--- a/svgio/qa/cppunit/data/filterFeGaussianBlur.svg
+++ b/svgio/qa/cppunit/data/filterFeGaussianBlur.svg
@@ -4,7 +4,7 @@
   xmlns="http://www.w3.org/2000/svg";
   xmlns:xlink="http://www.w3.org/1999/xlink";>
   <filter id="blurMe">
-    <feGaussianBlur  in="SourceGraphic" stdDeviation="5"/>
+    <feGaussianBlur  in="SourceAlpha" stdDeviation="5"/>
   </filter>
   <circle cx="170" cy="60" r="50" fill="green" filter="url(#blurMe)" />
 </svg>
diff --git a/svgio/source/svgreader/svgfecolormatrixnode.cxx 
b/svgio/source/svgreader/svgfecolormatrixnode.cxx
index 5f8e03c4318b..7902144e8bc8 100644
--- a/svgio/source/svgreader/svgfecolormatrixnode.cxx
+++ b/svgio/source/svgreader/svgfecolormatrixnode.cxx
@@ -26,6 +26,7 @@ namespace svgio::svgreader
 SvgFeColorMatrixNode::SvgFeColorMatrixNode(SvgDocument& rDocument, SvgNode* 
pParent)
     : SvgNode(SVGToken::FeColorMatrix, rDocument, pParent)
     , maType(ColorType::None)
+    , maIn(In::SourceGraphic)
 {
 }
 
@@ -65,6 +66,17 @@ void SvgFeColorMatrixNode::parseAttribute(const OUString& 
/*rTokenName*/, SVGTok
             maValuesContent = aContent;
             break;
         }
+        case SVGToken::In:
+        {
+            if (!aContent.isEmpty())
+            {
+                if (o3tl::equalsIgnoreAsciiCase(o3tl::trim(aContent), 
u"SourceAlpha"))
+                {
+                    maIn = In::SourceAlpha;
+                }
+            }
+            break;
+        }
         default:
         {
             break;
@@ -112,6 +124,15 @@ void 
SvgFeColorMatrixNode::apply(drawinglayer::primitive2d::Primitive2DContainer
                 std::move(rTarget), 
std::make_shared<basegfx::BColorModifier_matrix>(aMatrix)));
         rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
     }
+
+    if (maIn == In::SourceAlpha)
+    {
+        const drawinglayer::primitive2d::Primitive2DReference xRef(
+            new drawinglayer::primitive2d::ModifiedColorPrimitive2D(
+                std::move(rTarget), 
std::make_shared<basegfx::BColorModifier_alpha>()));
+
+        rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
+    }
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfegaussianblurnode.cxx 
b/svgio/source/svgreader/svgfegaussianblurnode.cxx
index fff21345c4d8..7dbe808a484a 100644
--- a/svgio/source/svgreader/svgfegaussianblurnode.cxx
+++ b/svgio/source/svgreader/svgfegaussianblurnode.cxx
@@ -18,6 +18,7 @@
  */
 
 #include <svgfegaussianblurnode.hxx>
+#include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx>
 #include <drawinglayer/primitive2d/softedgeprimitive2d.hxx>
 #include <o3tl/string_view.hxx>
 
@@ -26,7 +27,7 @@ namespace svgio::svgreader
 SvgFeGaussianBlurNode::SvgFeGaussianBlurNode(SvgDocument& rDocument, SvgNode* 
pParent)
     : SvgNode(SVGToken::FeGaussianBlur, rDocument, pParent)
     , maStdDeviation(SvgNumber(0.0))
-    , maIn(In::None)
+    , maIn(In::SourceGraphic)
 {
 }
 
@@ -59,6 +60,10 @@ void SvgFeGaussianBlurNode::parseAttribute(const OUString& 
/*rTokenName*/, SVGTo
                 {
                     maIn = In::SourceGraphic;
                 }
+                else if (o3tl::equalsIgnoreAsciiCase(o3tl::trim(aContent), 
u"SourceAlpha"))
+                {
+                    maIn = In::SourceAlpha;
+                }
             }
             break;
         }
@@ -71,7 +76,7 @@ void SvgFeGaussianBlurNode::parseAttribute(const OUString& 
/*rTokenName*/, SVGTo
 
 void 
SvgFeGaussianBlurNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
 {
-    if (maIn == In::SourceGraphic)
+    if (maStdDeviation.getNumber() != 0.0)
     {
         const drawinglayer::primitive2d::Primitive2DReference xRef(
             new 
drawinglayer::primitive2d::SoftEdgePrimitive2D(maStdDeviation.getNumber(),
@@ -79,6 +84,15 @@ void 
SvgFeGaussianBlurNode::apply(drawinglayer::primitive2d::Primitive2DContaine
 
         rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
     }
+
+    if (maIn == In::SourceAlpha)
+    {
+        const drawinglayer::primitive2d::Primitive2DReference xRef(
+            new drawinglayer::primitive2d::ModifiedColorPrimitive2D(
+                std::move(rTarget), 
std::make_shared<basegfx::BColorModifier_alpha>()));
+
+        rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
+    }
 }
 
 } // end of namespace svgio::svgreader

Reply via email to