summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2023-06-24 11:17:16 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2023-06-24 12:33:12 +0200
commit75399b8aad6c0f0998b9d0a6eddb2e29f8bc114c (patch)
tree02c834bff607acc6a8b5f7ec4c243454fdc5c8ac
parent85013c57dd29e32ec0411c159ea72824ebca5aa9 (diff)
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 <xiscofauli@libreoffice.org>
-rw-r--r--basegfx/source/color/bcolormodifier.cxx19
-rwxr-xr-xbasegfx/test/BColorModifierTest.cxx27
-rw-r--r--include/basegfx/color/bcolormodifier.hxx20
-rw-r--r--svgio/inc/svgfecolormatrixnode.hxx2
-rw-r--r--svgio/inc/svgfegaussianblurnode.hxx14
-rw-r--r--svgio/inc/svgfilternode.hxx6
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx3
-rw-r--r--svgio/qa/cppunit/data/filterFeGaussianBlur.svg2
-rw-r--r--svgio/source/svgreader/svgfecolormatrixnode.cxx21
-rw-r--r--svgio/source/svgreader/svgfegaussianblurnode.cxx18
10 files changed, 115 insertions, 17 deletions
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