diff options
author | Xisco Fauli <xiscofauli@libreoffice.org> | 2024-04-05 10:08:36 +0200 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2024-04-16 09:36:37 +0200 |
commit | cb4698626f17e005c820a7138c63a03c21120ecd (patch) | |
tree | ad153f60368e60065226d8d72b8d17aeb7e95772 /vcl/qa | |
parent | ded4d570fde21e55091c9c8c364114e67aa0cdcf (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.cxx | 122 |
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); |