summaryrefslogtreecommitdiff
path: root/vcl/qa
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2024-04-05 10:08:36 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2024-04-16 09:36:37 +0200
commitcb4698626f17e005c820a7138c63a03c21120ecd (patch)
treead153f60368e60065226d8d72b8d17aeb7e95772 /vcl/qa
parentded4d570fde21e55091c9c8c364114e67aa0cdcf (diff)
tdf#48062: Add support for arithmetic in feComposite
Took https://github.com/w3c/csswg-drafts/issues/3831 as a reference Change-Id: I42039c481ec114c3faeae51526a5f29b86960146 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165828 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'vcl/qa')
-rw-r--r--vcl/qa/cppunit/BitmapFilterTest.cxx122
1 files changed, 122 insertions, 0 deletions
diff --git a/vcl/qa/cppunit/BitmapFilterTest.cxx b/vcl/qa/cppunit/BitmapFilterTest.cxx
index 00ba12b4a925..902d5934f07d 100644
--- a/vcl/qa/cppunit/BitmapFilterTest.cxx
+++ b/vcl/qa/cppunit/BitmapFilterTest.cxx
@@ -15,6 +15,7 @@
#include <tools/stream.hxx>
#include <vcl/graphicfilter.hxx>
+#include <vcl/BitmapArithmeticBlendFilter.hxx>
#include <vcl/BitmapScreenBlendFilter.hxx>
#include <vcl/BitmapBasicMorphologyFilter.hxx>
#include <vcl/BitmapFilterStackBlur.hxx>
@@ -41,6 +42,7 @@ public:
void testPerformance();
void testGenerateStripRanges();
void testScreenBlendFilter();
+ void testArithmeticBlendFilter();
CPPUNIT_TEST_SUITE(BitmapFilterTest);
CPPUNIT_TEST(testBlurCorrectness);
@@ -48,6 +50,7 @@ public:
CPPUNIT_TEST(testPerformance);
CPPUNIT_TEST(testGenerateStripRanges);
CPPUNIT_TEST(testScreenBlendFilter);
+ CPPUNIT_TEST(testArithmeticBlendFilter);
CPPUNIT_TEST_SUITE_END();
private:
@@ -333,6 +336,125 @@ void BitmapFilterTest::testScreenBlendFilter()
}
}
+void BitmapFilterTest::testArithmeticBlendFilter()
+{
+ Bitmap aRedBitmap(Size(4, 4), vcl::PixelFormat::N24_BPP);
+ CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N24_BPP, aRedBitmap.getPixelFormat());
+ {
+ BitmapScopedWriteAccess aWriteAccess(aRedBitmap);
+ aWriteAccess->Erase(COL_LIGHTRED);
+ }
+
+ Bitmap aGreenBitmap(Size(4, 4), vcl::PixelFormat::N24_BPP);
+ CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N24_BPP, aGreenBitmap.getPixelFormat());
+ {
+ BitmapScopedWriteAccess aWriteAccess(aGreenBitmap);
+ aWriteAccess->Erase(COL_GREEN);
+ }
+
+ Bitmap aTransparentBitmap(Size(4, 4), vcl::PixelFormat::N24_BPP);
+ CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N24_BPP, aTransparentBitmap.getPixelFormat());
+ {
+ BitmapScopedWriteAccess aWriteAccess(aTransparentBitmap);
+ aWriteAccess->Erase(COL_AUTO);
+ }
+
+ BitmapEx aRedBitmapEx(aRedBitmap);
+ BitmapEx aGreenBitmapEx(aGreenBitmap);
+ BitmapEx aTransparentBitmapEx(aTransparentBitmap);
+
+ // same color
+ {
+ BitmapArithmeticBlendFilter* pArithmeticFilter
+ = new BitmapArithmeticBlendFilter(aRedBitmapEx, aRedBitmapEx);
+ BitmapEx aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x00, 0x00, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(1, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 1, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 1, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 1);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xFF, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0.5, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0.5, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0.5, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 0.5);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ }
+
+ // Different colors
+ {
+ BitmapArithmeticBlendFilter* pArithmeticFilter
+ = new BitmapArithmeticBlendFilter(aRedBitmapEx, aGreenBitmapEx);
+ BitmapEx aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x00, 0x00, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(1, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 1, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 1, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_GREEN, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 1);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xFF, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0.5, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0x00, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0.5, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0.5, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0x00, 0x81, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 0.5);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ }
+
+ // transparent
+ {
+ BitmapArithmeticBlendFilter* pArithmeticFilter
+ = new BitmapArithmeticBlendFilter(aRedBitmapEx, aTransparentBitmapEx);
+ BitmapEx aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x00, 0x00, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(1, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 1, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 1, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xFF, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 1);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xFF, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0.5, 0, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0.5, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0x00, 0x00),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0.5, 0);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ aResBitmapEx = pArithmeticFilter->execute(0, 0, 0, 0.5);
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x7F, 0xFF, 0xFF, 0xFF),
+ aResBitmapEx.GetPixelColor(0, 0));
+ }
+}
+
} // namespace
CPPUNIT_TEST_SUITE_REGISTRATION(BitmapFilterTest);