[Libreoffice-commits] core.git: vcl/CppunitTest_vcl_bitmap_test.mk vcl/qa

Tomaž Vajngerl (via logerrit) logerrit at kemper.freedesktop.org
Thu Jun 6 08:15:10 UTC 2019


 vcl/CppunitTest_vcl_bitmap_test.mk |    1 
 vcl/qa/cppunit/BitmapScaleTest.cxx |  300 +++++++++++++++++++++++++++++++++++++
 vcl/qa/cppunit/BitmapTest.cxx      |  242 -----------------------------
 3 files changed, 301 insertions(+), 242 deletions(-)

New commits:
commit 6a82019d51ae4f3d092d9ca2b4578325f4004713
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Wed Jun 5 23:48:14 2019 +0900
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Thu Jun 6 10:14:04 2019 +0200

    vcl: move bitmap scale test to its own file
    
    Change-Id: I21e01f63da1c95c3a2c8bae9b998a28fc0a27bc1
    Reviewed-on: https://gerrit.libreoffice.org/73560
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/vcl/CppunitTest_vcl_bitmap_test.mk b/vcl/CppunitTest_vcl_bitmap_test.mk
index 714b390cba93..90db22099b40 100644
--- a/vcl/CppunitTest_vcl_bitmap_test.mk
+++ b/vcl/CppunitTest_vcl_bitmap_test.mk
@@ -14,6 +14,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,vcl_bitmap_test, \
     vcl/qa/cppunit/BitmapExTest \
     vcl/qa/cppunit/bitmapcolor \
     vcl/qa/cppunit/ScanlineToolsTest \
+    vcl/qa/cppunit/BitmapScaleTest \
 ))
 
 $(eval $(call gb_CppunitTest_use_externals,vcl_bitmap_test,\
diff --git a/vcl/qa/cppunit/BitmapScaleTest.cxx b/vcl/qa/cppunit/BitmapScaleTest.cxx
new file mode 100644
index 000000000000..4c47db3d7357
--- /dev/null
+++ b/vcl/qa/cppunit/BitmapScaleTest.cxx
@@ -0,0 +1,300 @@
+/* -*- 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 <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <vcl/bitmap.hxx>
+#include <vcl/bitmapaccess.hxx>
+#include <vcl/alpha.hxx>
+
+#include <rtl/strbuf.hxx>
+#include <tools/stream.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <config_features.h>
+
+#include <vcl/BitmapTools.hxx>
+#include <BitmapSymmetryCheck.hxx>
+#include <bitmapwriteaccess.hxx>
+#include <svdata.hxx>
+#include <salinst.hxx>
+
+namespace
+{
+class BitmapScaleTest : public CppUnit::TestFixture
+{
+    void testScale();
+    void testScale2();
+    void testScaleSymmetry();
+
+    CPPUNIT_TEST_SUITE(BitmapScaleTest);
+    CPPUNIT_TEST(testScale);
+    CPPUNIT_TEST(testScale2);
+    CPPUNIT_TEST(testScaleSymmetry);
+    CPPUNIT_TEST_SUITE_END();
+};
+
+bool checkBitmapColor(Bitmap const& rBitmap, Color const& rExpectedColor)
+{
+    bool bResult = true;
+    Bitmap aBitmap(rBitmap);
+    Bitmap::ScopedReadAccess pReadAccess(aBitmap);
+    long nHeight = pReadAccess->Height();
+    long nWidth = pReadAccess->Width();
+    for (long y = 0; y < nHeight; ++y)
+    {
+        Scanline pScanlineRead = pReadAccess->GetScanline(y);
+        for (long x = 0; x < nWidth; ++x)
+        {
+            Color aColor = pReadAccess->GetPixelFromData(pScanlineRead, x);
+            if (aColor != rExpectedColor)
+                bResult = false;
+        }
+    }
+
+    return bResult;
+}
+
+void assertColorsAreSimilar(int maxDifference, const std::string& message,
+                            const BitmapColor& expected, const BitmapColor& actual)
+{
+    // Check that the two colors match or are reasonably similar.
+    if (expected == actual)
+        return;
+    if (abs(expected.GetRed() - actual.GetRed()) <= maxDifference
+        && abs(expected.GetGreen() - actual.GetGreen()) <= maxDifference
+        && abs(expected.GetBlue() - actual.GetBlue()) <= maxDifference
+        && abs(expected.GetAlpha() - actual.GetAlpha()) <= maxDifference)
+    {
+        return;
+    }
+    CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual);
+}
+
+void assertColorsAreSimilar(int maxDifference, int line, const BitmapColor& expected,
+                            const BitmapColor& actual)
+{
+    std::stringstream stream;
+    stream << "Line: " << line;
+    assertColorsAreSimilar(maxDifference, stream.str(), expected, actual);
+}
+
+void BitmapScaleTest::testScale()
+{
+    const bool bExportBitmap(false);
+    using tools::Rectangle;
+
+    static const BmpScaleFlag scaleMethods[]
+        = { BmpScaleFlag::Default,     BmpScaleFlag::Fast,    BmpScaleFlag::BestQuality,
+            BmpScaleFlag::Interpolate, BmpScaleFlag::Lanczos, BmpScaleFlag::BiCubic,
+            BmpScaleFlag::BiLinear };
+    for (BmpScaleFlag scaleMethod : scaleMethods)
+    {
+        struct ScaleSize
+        {
+            Size srcSize;
+            Size destSize;
+        };
+        static const ScaleSize scaleSizes[]
+            = { // test no-op
+                { Size(16, 16), Size(16, 16) },
+                // powers of 2 (OpenGL may use texture atlas)
+                { Size(16, 16), Size(14, 14) },
+                { Size(14, 14), Size(16, 16) }, // both upscaling and downscaling
+                // "random" sizes
+                { Size(18, 18), Size(14, 14) },
+                { Size(14, 14), Size(18, 18) },
+                // different x/y ratios
+                { Size(16, 30), Size(14, 18) },
+                { Size(14, 18), Size(16, 30) },
+                // ratio larger than 16 (triggers different paths in some OpenGL algorithms)
+                { Size(18 * 20, 18 * 20), Size(14, 14) },
+                { Size(14, 14), Size(18 * 20, 18 * 20) }
+              };
+        for (const ScaleSize& scaleSize : scaleSizes)
+        {
+            OString testStr = "Testing scale (" + scaleSize.srcSize.toString() + ")->("
+                              + scaleSize.destSize.toString() + "), method "
+                              + OString::number(static_cast<int>(scaleMethod));
+            fprintf(stderr, "%s\n", testStr.getStr());
+            Bitmap bitmap(scaleSize.srcSize, 24);
+            {
+                // Fill each quarter of the source bitmap with a different color,
+                // and center with yet another color.
+                BitmapScopedWriteAccess writeAccess(bitmap);
+                const int halfW = scaleSize.srcSize.getWidth() / 2;
+                const int halfH = scaleSize.srcSize.getHeight() / 2;
+                writeAccess->SetFillColor(COL_GREEN);
+                writeAccess->FillRect(Rectangle(Point(0, 0), Size(halfW, halfH)));
+                writeAccess->SetFillColor(COL_RED);
+                writeAccess->FillRect(Rectangle(Point(0, halfH), Size(halfW, halfH)));
+                writeAccess->SetFillColor(COL_YELLOW);
+                writeAccess->FillRect(Rectangle(Point(halfW, 0), Size(halfW, halfH)));
+                writeAccess->SetFillColor(COL_BLACK);
+                writeAccess->FillRect(Rectangle(Point(halfW, halfH), Size(halfW, halfH)));
+                writeAccess->SetFillColor(COL_BLUE);
+                writeAccess->FillRect(Rectangle(Point(halfW / 2, halfH / 2), Size(halfW, halfH)));
+            }
+            if (bExportBitmap)
+            {
+                SvFileStream aStream("~/scale_before.png", StreamMode::WRITE | StreamMode::TRUNC);
+                GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+                rFilter.compressAsPNG(bitmap, aStream);
+            }
+            CPPUNIT_ASSERT(bitmap.Scale(scaleSize.destSize, scaleMethod));
+            if (bExportBitmap)
+            {
+                SvFileStream aStream("~/scale_after.png", StreamMode::WRITE | StreamMode::TRUNC);
+                GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+                rFilter.compressAsPNG(bitmap, aStream);
+            }
+            CPPUNIT_ASSERT_EQUAL(scaleSize.destSize, bitmap.GetSizePixel());
+            {
+                // Scaling should keep each quarter of the resulting bitmap have the same color,
+                // so check that color in each corner of the result bitmap is the same color,
+                // or reasonably close (some algorithms may alter the color very slightly).
+                BitmapReadAccess readAccess(bitmap);
+                const int lastW = scaleSize.destSize.getWidth() - 1;
+                const int lastH = scaleSize.destSize.getHeight() - 1;
+                assertColorsAreSimilar(2, __LINE__, COL_GREEN, readAccess.GetColor(0, 0));
+                assertColorsAreSimilar(2, __LINE__, COL_RED, readAccess.GetColor(lastH, 0));
+                assertColorsAreSimilar(2, __LINE__, COL_YELLOW, readAccess.GetColor(0, lastW));
+                assertColorsAreSimilar(2, __LINE__, COL_BLACK, readAccess.GetColor(lastH, lastW));
+                assertColorsAreSimilar(2, __LINE__, COL_BLUE,
+                                       readAccess.GetColor(lastH / 2, lastW / 2));
+            }
+        }
+    }
+}
+
+void BitmapScaleTest::testScale2()
+{
+    const bool bExportBitmap(false);
+
+    Bitmap aBitmap24Bit(Size(4096, 4096), 24);
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(24), aBitmap24Bit.GetBitCount());
+    Color aBitmapColor = COL_YELLOW;
+    {
+        BitmapScopedWriteAccess aWriteAccess(aBitmap24Bit);
+        aWriteAccess->Erase(aBitmapColor);
+    }
+
+    if (bExportBitmap)
+    {
+        SvFileStream aStream("scale_before.png", StreamMode::WRITE | StreamMode::TRUNC);
+        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+        rFilter.compressAsPNG(aBitmap24Bit, aStream);
+    }
+
+    // Scale - 65x65
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Height());
+    Bitmap aScaledBitmap = aBitmap24Bit;
+    aScaledBitmap.Scale(Size(65, 65));
+
+    if (bExportBitmap)
+    {
+        SvFileStream aStream("scale_after_65x65.png", StreamMode::WRITE | StreamMode::TRUNC);
+        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+        rFilter.compressAsPNG(aScaledBitmap, aStream);
+    }
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(65), aScaledBitmap.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(65), aScaledBitmap.GetSizePixel().Height());
+    CPPUNIT_ASSERT(checkBitmapColor(aScaledBitmap, aBitmapColor));
+
+    // Scale - 64x64
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Height());
+    aScaledBitmap = aBitmap24Bit;
+    aScaledBitmap.Scale(Size(64, 64));
+
+    if (bExportBitmap)
+    {
+        SvFileStream aStream("scale_after_64x64.png", StreamMode::WRITE | StreamMode::TRUNC);
+        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+        rFilter.compressAsPNG(aScaledBitmap, aStream);
+    }
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(64), aScaledBitmap.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(64), aScaledBitmap.GetSizePixel().Height());
+    CPPUNIT_ASSERT(checkBitmapColor(aScaledBitmap, aBitmapColor));
+
+    // Scale - 63x63
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Height());
+    aScaledBitmap = aBitmap24Bit;
+    aScaledBitmap.Scale(Size(63, 63));
+
+    if (bExportBitmap)
+    {
+        SvFileStream aStream("scale_after_63x63.png", StreamMode::WRITE | StreamMode::TRUNC);
+        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+        rFilter.compressAsPNG(aScaledBitmap, aStream);
+    }
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(63), aScaledBitmap.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(63), aScaledBitmap.GetSizePixel().Height());
+    CPPUNIT_ASSERT(checkBitmapColor(aScaledBitmap, aBitmapColor));
+}
+
+void BitmapScaleTest::testScaleSymmetry()
+{
+    const bool bExportBitmap(false);
+
+    Bitmap aBitmap24Bit(Size(10, 10), 24);
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(24), aBitmap24Bit.GetBitCount());
+
+    {
+        BitmapScopedWriteAccess aWriteAccess(aBitmap24Bit);
+        aWriteAccess->Erase(COL_WHITE);
+        aWriteAccess->SetLineColor(COL_BLACK);
+        aWriteAccess->DrawRect(tools::Rectangle(1, 1, 8, 8));
+        aWriteAccess->DrawRect(tools::Rectangle(3, 3, 6, 6));
+    }
+
+    BitmapSymmetryCheck aBitmapSymmetryCheck;
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(10), aBitmap24Bit.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(10), aBitmap24Bit.GetSizePixel().Height());
+
+    // Check symmetry of the bitmap
+    CPPUNIT_ASSERT(BitmapSymmetryCheck::check(aBitmap24Bit));
+
+    if (bExportBitmap)
+    {
+        SvFileStream aStream("~/scale_before.png", StreamMode::WRITE | StreamMode::TRUNC);
+        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+        rFilter.compressAsPNG(aBitmap24Bit, aStream);
+    }
+
+    aBitmap24Bit.Scale(2, 2, BmpScaleFlag::Fast);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(20), aBitmap24Bit.GetSizePixel().Width());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long>(20), aBitmap24Bit.GetSizePixel().Height());
+
+    // After scaling the bitmap should still be symmetrical. This check guarantees that
+    // scaling doesn't misalign the bitmap.
+    CPPUNIT_ASSERT(BitmapSymmetryCheck::check(aBitmap24Bit));
+
+    if (bExportBitmap)
+    {
+        SvFileStream aStream("~/scale_after.png", StreamMode::WRITE | StreamMode::TRUNC);
+        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+        rFilter.compressAsPNG(aBitmap24Bit, aStream);
+    }
+}
+
+} // namespace
+
+CPPUNIT_TEST_SUITE_REGISTRATION(BitmapScaleTest);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qa/cppunit/BitmapTest.cxx b/vcl/qa/cppunit/BitmapTest.cxx
index e01f3fb6ecb5..dd27746e63fe 100644
--- a/vcl/qa/cppunit/BitmapTest.cxx
+++ b/vcl/qa/cppunit/BitmapTest.cxx
@@ -27,7 +27,6 @@
 #endif
 #include <vcl/BitmapMonochromeFilter.hxx>
 
-#include <BitmapSymmetryCheck.hxx>
 #include <bitmapwriteaccess.hxx>
 
 #include <svdata.hxx>
@@ -44,9 +43,6 @@ class BitmapTest : public CppUnit::TestFixture
     void testN4Greyscale();
     void testN8Greyscale();
     void testConvert();
-    void testScaleSymmetry();
-    void testScale();
-    void testScale2();
     void testCRC();
     void testGreyPalette();
     void testCustom8BitPalette();
@@ -61,9 +57,6 @@ class BitmapTest : public CppUnit::TestFixture
     CPPUNIT_TEST(testConvert);
     CPPUNIT_TEST(testN4Greyscale);
     CPPUNIT_TEST(testN8Greyscale);
-    CPPUNIT_TEST(testScaleSymmetry);
-    CPPUNIT_TEST(testScale);
-    CPPUNIT_TEST(testScale2);
     CPPUNIT_TEST(testCRC);
     CPPUNIT_TEST(testGreyPalette);
     CPPUNIT_TEST(testCustom8BitPalette);
@@ -89,14 +82,6 @@ void assertColorsAreSimilar(int maxDifference, const std::string& message,
     CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual);
 }
 
-void assertColorsAreSimilar(int maxDifference, int line, const BitmapColor& expected,
-                            const BitmapColor& actual)
-{
-    std::stringstream stream;
-    stream << "Line: " << line;
-    assertColorsAreSimilar(maxDifference, stream.str(), expected, actual);
-}
-
 void BitmapTest::testCreation()
 {
     {
@@ -437,233 +422,6 @@ void BitmapTest::testConvert()
     }
 }
 
-void BitmapTest::testScaleSymmetry()
-{
-    const bool bExportBitmap(false);
-
-    Bitmap aBitmap24Bit(Size(10, 10), 24);
-    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(24), aBitmap24Bit.GetBitCount());
-
-    {
-        BitmapScopedWriteAccess aWriteAccess(aBitmap24Bit);
-        aWriteAccess->Erase(COL_WHITE);
-        aWriteAccess->SetLineColor(COL_BLACK);
-        aWriteAccess->DrawRect(tools::Rectangle(1, 1, 8, 8));
-        aWriteAccess->DrawRect(tools::Rectangle(3, 3, 6, 6));
-    }
-
-    BitmapSymmetryCheck aBitmapSymmetryCheck;
-
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(10), aBitmap24Bit.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(10), aBitmap24Bit.GetSizePixel().Height());
-
-    // Check symmetry of the bitmap
-    CPPUNIT_ASSERT(BitmapSymmetryCheck::check(aBitmap24Bit));
-
-    if (bExportBitmap)
-    {
-        SvFileStream aStream("~/scale_before.png", StreamMode::WRITE | StreamMode::TRUNC);
-        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-        rFilter.compressAsPNG(aBitmap24Bit, aStream);
-    }
-
-    aBitmap24Bit.Scale(2, 2, BmpScaleFlag::Fast);
-
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(20), aBitmap24Bit.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(20), aBitmap24Bit.GetSizePixel().Height());
-
-    // After scaling the bitmap should still be symmetrical. This check guarantees that
-    // scaling doesn't misalign the bitmap.
-    CPPUNIT_ASSERT(BitmapSymmetryCheck::check(aBitmap24Bit));
-
-    if (bExportBitmap)
-    {
-        SvFileStream aStream("~/scale_after.png", StreamMode::WRITE | StreamMode::TRUNC);
-        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-        rFilter.compressAsPNG(aBitmap24Bit, aStream);
-    }
-}
-
-void BitmapTest::testScale()
-{
-    const bool bExportBitmap(false);
-    using tools::Rectangle;
-
-    static const BmpScaleFlag scaleMethods[]
-        = { BmpScaleFlag::Default,     BmpScaleFlag::Fast,    BmpScaleFlag::BestQuality,
-            BmpScaleFlag::Interpolate, BmpScaleFlag::Lanczos, BmpScaleFlag::BiCubic,
-            BmpScaleFlag::BiLinear };
-    for (BmpScaleFlag scaleMethod : scaleMethods)
-    {
-        struct ScaleSize
-        {
-            Size srcSize;
-            Size destSize;
-        };
-        static const ScaleSize scaleSizes[]
-            = { // test no-op
-                { Size(16, 16), Size(16, 16) },
-                // powers of 2 (OpenGL may use texture atlas)
-                { Size(16, 16), Size(14, 14) },
-                { Size(14, 14), Size(16, 16) }, // both upscaling and downscaling
-                // "random" sizes
-                { Size(18, 18), Size(14, 14) },
-                { Size(14, 14), Size(18, 18) },
-                // different x/y ratios
-                { Size(16, 30), Size(14, 18) },
-                { Size(14, 18), Size(16, 30) },
-                // ratio larger than 16 (triggers different paths in some OpenGL algorithms)
-                { Size(18 * 20, 18 * 20), Size(14, 14) },
-                { Size(14, 14), Size(18 * 20, 18 * 20) }
-              };
-        for (const ScaleSize& scaleSize : scaleSizes)
-        {
-            OString testStr = "Testing scale (" + scaleSize.srcSize.toString() + ")->("
-                              + scaleSize.destSize.toString() + "), method "
-                              + OString::number(static_cast<int>(scaleMethod));
-            fprintf(stderr, "%s\n", testStr.getStr());
-            Bitmap bitmap(scaleSize.srcSize, 24);
-            {
-                // Fill each quarter of the source bitmap with a different color,
-                // and center with yet another color.
-                BitmapScopedWriteAccess writeAccess(bitmap);
-                const int halfW = scaleSize.srcSize.getWidth() / 2;
-                const int halfH = scaleSize.srcSize.getHeight() / 2;
-                writeAccess->SetFillColor(COL_GREEN);
-                writeAccess->FillRect(Rectangle(Point(0, 0), Size(halfW, halfH)));
-                writeAccess->SetFillColor(COL_RED);
-                writeAccess->FillRect(Rectangle(Point(0, halfH), Size(halfW, halfH)));
-                writeAccess->SetFillColor(COL_YELLOW);
-                writeAccess->FillRect(Rectangle(Point(halfW, 0), Size(halfW, halfH)));
-                writeAccess->SetFillColor(COL_BLACK);
-                writeAccess->FillRect(Rectangle(Point(halfW, halfH), Size(halfW, halfH)));
-                writeAccess->SetFillColor(COL_BLUE);
-                writeAccess->FillRect(Rectangle(Point(halfW / 2, halfH / 2), Size(halfW, halfH)));
-            }
-            if (bExportBitmap)
-            {
-                SvFileStream aStream("~/scale_before.png", StreamMode::WRITE | StreamMode::TRUNC);
-                GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-                rFilter.compressAsPNG(bitmap, aStream);
-            }
-            CPPUNIT_ASSERT(bitmap.Scale(scaleSize.destSize, scaleMethod));
-            if (bExportBitmap)
-            {
-                SvFileStream aStream("~/scale_after.png", StreamMode::WRITE | StreamMode::TRUNC);
-                GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-                rFilter.compressAsPNG(bitmap, aStream);
-            }
-            CPPUNIT_ASSERT_EQUAL(scaleSize.destSize, bitmap.GetSizePixel());
-            {
-                // Scaling should keep each quarter of the resulting bitmap have the same color,
-                // so check that color in each corner of the result bitmap is the same color,
-                // or reasonably close (some algorithms may alter the color very slightly).
-                BitmapReadAccess readAccess(bitmap);
-                const int lastW = scaleSize.destSize.getWidth() - 1;
-                const int lastH = scaleSize.destSize.getHeight() - 1;
-                assertColorsAreSimilar(2, __LINE__, COL_GREEN, readAccess.GetColor(0, 0));
-                assertColorsAreSimilar(2, __LINE__, COL_RED, readAccess.GetColor(lastH, 0));
-                assertColorsAreSimilar(2, __LINE__, COL_YELLOW, readAccess.GetColor(0, lastW));
-                assertColorsAreSimilar(2, __LINE__, COL_BLACK, readAccess.GetColor(lastH, lastW));
-                assertColorsAreSimilar(2, __LINE__, COL_BLUE,
-                                       readAccess.GetColor(lastH / 2, lastW / 2));
-            }
-        }
-    }
-}
-
-bool checkBitmapColor(Bitmap const& rBitmap, Color const& rExpectedColor)
-{
-    bool bResult = true;
-    Bitmap aBitmap(rBitmap);
-    Bitmap::ScopedReadAccess pReadAccess(aBitmap);
-    long nHeight = pReadAccess->Height();
-    long nWidth = pReadAccess->Width();
-    for (long y = 0; y < nHeight; ++y)
-    {
-        Scanline pScanlineRead = pReadAccess->GetScanline(y);
-        for (long x = 0; x < nWidth; ++x)
-        {
-            Color aColor = pReadAccess->GetPixelFromData(pScanlineRead, x);
-            if (aColor != rExpectedColor)
-                bResult = false;
-        }
-    }
-
-    return bResult;
-}
-
-void BitmapTest::testScale2()
-{
-    const bool bExportBitmap(false);
-
-    Bitmap aBitmap24Bit(Size(4096, 4096), 24);
-    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(24), aBitmap24Bit.GetBitCount());
-    Color aBitmapColor = COL_YELLOW;
-    {
-        BitmapScopedWriteAccess aWriteAccess(aBitmap24Bit);
-        aWriteAccess->Erase(aBitmapColor);
-    }
-
-    if (bExportBitmap)
-    {
-        SvFileStream aStream("scale_before.png", StreamMode::WRITE | StreamMode::TRUNC);
-        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-        rFilter.compressAsPNG(aBitmap24Bit, aStream);
-    }
-
-    // Scale - 65x65
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Height());
-    Bitmap aScaledBitmap = aBitmap24Bit;
-    aScaledBitmap.Scale(Size(65, 65));
-
-    if (bExportBitmap)
-    {
-        SvFileStream aStream("scale_after_65x65.png", StreamMode::WRITE | StreamMode::TRUNC);
-        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-        rFilter.compressAsPNG(aScaledBitmap, aStream);
-    }
-
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(65), aScaledBitmap.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(65), aScaledBitmap.GetSizePixel().Height());
-    CPPUNIT_ASSERT(checkBitmapColor(aScaledBitmap, aBitmapColor));
-
-    // Scale - 64x64
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Height());
-    aScaledBitmap = aBitmap24Bit;
-    aScaledBitmap.Scale(Size(64, 64));
-
-    if (bExportBitmap)
-    {
-        SvFileStream aStream("scale_after_64x64.png", StreamMode::WRITE | StreamMode::TRUNC);
-        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-        rFilter.compressAsPNG(aScaledBitmap, aStream);
-    }
-
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(64), aScaledBitmap.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(64), aScaledBitmap.GetSizePixel().Height());
-    CPPUNIT_ASSERT(checkBitmapColor(aScaledBitmap, aBitmapColor));
-
-    // Scale - 63x63
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(4096), aBitmap24Bit.GetSizePixel().Height());
-    aScaledBitmap = aBitmap24Bit;
-    aScaledBitmap.Scale(Size(63, 63));
-
-    if (bExportBitmap)
-    {
-        SvFileStream aStream("scale_after_63x63.png", StreamMode::WRITE | StreamMode::TRUNC);
-        GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
-        rFilter.compressAsPNG(aScaledBitmap, aStream);
-    }
-
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(63), aScaledBitmap.GetSizePixel().Width());
-    CPPUNIT_ASSERT_EQUAL(static_cast<long>(63), aScaledBitmap.GetSizePixel().Height());
-    CPPUNIT_ASSERT(checkBitmapColor(aScaledBitmap, aBitmapColor));
-}
-
 typedef std::unordered_map<sal_uInt64, const char*> CRCHash;
 
 void checkAndInsert(CRCHash& rHash, sal_uInt64 nCRC, const char* pLocation)


More information about the Libreoffice-commits mailing list