From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- vcl/qa/cppunit/ScanlineToolsTest.cxx | 227 +++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 vcl/qa/cppunit/ScanlineToolsTest.cxx (limited to 'vcl/qa/cppunit/ScanlineToolsTest.cxx') diff --git a/vcl/qa/cppunit/ScanlineToolsTest.cxx b/vcl/qa/cppunit/ScanlineToolsTest.cxx new file mode 100644 index 000000000..c6751b827 --- /dev/null +++ b/vcl/qa/cppunit/ScanlineToolsTest.cxx @@ -0,0 +1,227 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include + +namespace +{ +class ScanlineToolsTest : public CppUnit::TestFixture +{ + void ScanlineTransformer_32_ARGB(); + void ScanlineTransformer_24_BGR(); + void ScanlineTransformer_8bit_Palette(); + void ScanlineTransformer_4bit_Palette(); + void ScanlineTransformer_1bit_Palette(); + + CPPUNIT_TEST_SUITE(ScanlineToolsTest); + CPPUNIT_TEST(ScanlineTransformer_32_ARGB); + CPPUNIT_TEST(ScanlineTransformer_24_BGR); + CPPUNIT_TEST(ScanlineTransformer_8bit_Palette); + CPPUNIT_TEST(ScanlineTransformer_4bit_Palette); + CPPUNIT_TEST(ScanlineTransformer_1bit_Palette); + CPPUNIT_TEST_SUITE_END(); +}; + +void ScanlineToolsTest::ScanlineTransformer_32_ARGB() +{ + BitmapPalette aPalette; + std::unique_ptr pScanlineTransformer + = vcl::bitmap::getScanlineTransformer(32, aPalette); + + std::vector aScanLine(5 * 4, 0); // 5 * 4 BytesPerPixel + pScanlineTransformer->startLine(aScanLine.data()); + + std::vector aColors{ + Color(ColorTransparency, 0, 10, 250, 120), Color(ColorTransparency, 50, 30, 230, 110), + Color(ColorTransparency, 100, 50, 210, 100), Color(ColorTransparency, 150, 70, 190, 90), + Color(ColorTransparency, 200, 90, 170, 80), + }; + + for (Color const& aColor : aColors) + { + pScanlineTransformer->writePixel(aColor); + } + + std::vector aExpectedBytes{ 0, 10, 250, 120, 50, 30, 230, 110, 100, 50, + 210, 100, 150, 70, 190, 90, 200, 90, 170, 80 }; + + for (size_t i = 0; i < aScanLine.size(); ++i) + { + CPPUNIT_ASSERT_EQUAL(int(aExpectedBytes[i]), int(aScanLine[i])); + } +} + +void ScanlineToolsTest::ScanlineTransformer_24_BGR() +{ + BitmapPalette aPalette; + std::unique_ptr pScanlineTransformer + = vcl::bitmap::getScanlineTransformer(24, aPalette); + + std::vector aScanLine(5 * 3, 0); // 5 * 3 BytesPerPixel + pScanlineTransformer->startLine(aScanLine.data()); + + std::vector aColors{ + Color(ColorTransparency, 0, 10, 250, 120), Color(ColorTransparency, 50, 30, 230, 110), + Color(ColorTransparency, 100, 50, 210, 100), Color(ColorTransparency, 150, 70, 190, 90), + Color(ColorTransparency, 200, 90, 170, 80), + }; + + for (Color const& aColor : aColors) + { + pScanlineTransformer->writePixel(aColor); + } + + std::vector aExpectedBytes{ 120, 250, 10, 110, 230, 30, 100, 210, + 50, 90, 190, 70, 80, 170, 90 }; + + for (size_t i = 0; i < aScanLine.size(); ++i) + { + CPPUNIT_ASSERT_EQUAL(int(aExpectedBytes[i]), int(aScanLine[i])); + } +} + +void ScanlineToolsTest::ScanlineTransformer_8bit_Palette() +{ + std::vector aColors{ + Color(ColorTransparency, 0, 10, 250, 120), Color(ColorTransparency, 50, 30, 230, 110), + Color(ColorTransparency, 100, 50, 210, 100), Color(ColorTransparency, 150, 70, 190, 90), + Color(ColorTransparency, 200, 90, 170, 80), + }; + + BitmapPalette aPalette(256); + for (size_t i = 0; i < aColors.size(); ++i) + aPalette[i] = aColors[i]; + + std::unique_ptr pScanlineTransformer + = vcl::bitmap::getScanlineTransformer(8, aPalette); + + std::vector aScanLine(5, 0); // 5 * 1 BytesPerPixel + pScanlineTransformer->startLine(aScanLine.data()); + + for (Color const& aColor : aColors) + { + pScanlineTransformer->writePixel(aColor); + } + + std::vector aExpectedBytes{ 0, 1, 2, 3, 4 }; + + for (size_t i = 0; i < aScanLine.size(); ++i) + { + CPPUNIT_ASSERT_EQUAL(int(aExpectedBytes[i]), int(aScanLine[i])); + } + + pScanlineTransformer->startLine(aScanLine.data()); + + for (size_t i = 0; i < aColors.size(); ++i) + { + Color aColor = pScanlineTransformer->readPixel(); + CPPUNIT_ASSERT_EQUAL(aColors[i], aColor); + } +} + +void ScanlineToolsTest::ScanlineTransformer_4bit_Palette() +{ + std::vector aColors{ + Color(10, 250, 120), Color(30, 230, 110), Color(50, 210, 100), + Color(70, 190, 90), Color(90, 170, 80), Color(110, 150, 70), + }; + + BitmapPalette aPalette(16); + for (size_t i = 0; i < aColors.size(); ++i) + { + aPalette[i] = aColors[i]; + } + + std::unique_ptr pScanlineTransformer + = vcl::bitmap::getScanlineTransformer(4, aPalette); + + std::vector aScanLine(3, 0); // 6 * 0.5 BytesPerPixel + pScanlineTransformer->startLine(aScanLine.data()); + + for (Color const& aColor : aColors) + { + pScanlineTransformer->writePixel(aColor); + } + + std::vector aExpectedBytes{ 0x01, 0x23, 0x45 }; + + for (size_t i = 0; i < aScanLine.size(); ++i) + { + CPPUNIT_ASSERT_EQUAL(int(aExpectedBytes[i]), int(aScanLine[i])); + } + + pScanlineTransformer->startLine(aScanLine.data()); + + for (size_t i = 0; i < aColors.size(); ++i) + { + Color aColor = pScanlineTransformer->readPixel(); + CPPUNIT_ASSERT_EQUAL(aColors[i], aColor); + } +} + +void ScanlineToolsTest::ScanlineTransformer_1bit_Palette() +{ + std::vector aColors{ + Color(10, 250, 120), Color(30, 230, 110), Color(50, 210, 100), Color(70, 190, 90), + Color(90, 170, 80), Color(110, 150, 70), Color(130, 130, 60), Color(150, 110, 50), + Color(170, 90, 40), Color(190, 70, 30), Color(210, 50, 20), Color(230, 30, 10), + Color(250, 10, 0), + }; + + BitmapPalette aPalette(2); + aPalette[0] = Color(10, 250, 120); + aPalette[1] = Color(110, 150, 70); + + std::unique_ptr pScanlineTransformer + = vcl::bitmap::getScanlineTransformer(1, aPalette); + + std::vector aScanLine(2, 0); // 13 * 1/8 BytesPerPixel + pScanlineTransformer->startLine(aScanLine.data()); + + for (Color const& aColor : aColors) + { + pScanlineTransformer->writePixel(aColor); + } + + std::vector aExpectedBytes{ + // We expect 3x index 0 and 10x index 1 => 000 111111111 + 0x1f, // 0001 1111 + 0xf8 // 1111 1000 + }; + + for (size_t i = 0; i < aScanLine.size(); ++i) + { + CPPUNIT_ASSERT_EQUAL(int(aExpectedBytes[i]), int(aScanLine[i])); + } + + pScanlineTransformer->startLine(aScanLine.data()); + + std::vector aColorsExpected{ + Color(10, 250, 120), Color(10, 250, 120), Color(10, 250, 120), Color(110, 150, 70), + Color(110, 150, 70), Color(110, 150, 70), Color(110, 150, 70), Color(110, 150, 70), + Color(110, 150, 70), Color(110, 150, 70), Color(110, 150, 70), Color(110, 150, 70), + Color(110, 150, 70), + }; + + for (size_t i = 0; i < aColors.size(); ++i) + { + Color aColor = pScanlineTransformer->readPixel(); + CPPUNIT_ASSERT_EQUAL(aColorsExpected[i], aColor); + } +} + +} // namespace + +CPPUNIT_TEST_SUITE_REGISTRATION(ScanlineToolsTest); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3