Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/LibreOffice/sd/qa/unit/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 44 kB image not shown  

Quelle  PNGExportTests.cxx   Sprache: C

 
/* -*- 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 <sal/config.h>

#include <test/unoapi_test.hxx>

#include <com/sun/star/drawing/GraphicExportFilter.hpp>
#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <comphelper/propertyvalue.hxx>
#include <vcl/BitmapReadAccess.hxx>
#include <vcl/filter/PngImageReader.hxx>
#include <vcl/skia/SkiaHelper.hxx>

using namespace ::com::sun::star;

class SdPNGExportTest : public UnoApiTest
{
public:
    SdPNGExportTest()
        : UnoApiTest(u"/sd/qa/unit/data/"_ustr)
    {
    }
};

static void assertColorsAreSimilar(const std::string& message, const BitmapColor&&nbsp;expected,
                                   const BitmapColor& actual, int nDelta)
{
    // Check that the two colors match or are reasonably similar.
    if (expected.GetColorError(actual) <= nDelta)
        return;

    CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf105998)
{
    loadFromFile(u"odp/tdf105998.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                             uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xShape);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure only the shape is exported
    Size aSize = aBMPEx.GetSizePixel();
    const auto[scalingX, scalingY] = getDPIScaling();
    CPPUNIT_ASSERT_DOUBLES_EQUAL(193 * scalingX, aSize.getWidth(), 1.5);
    CPPUNIT_ASSERT_DOUBLES_EQUAL(193 * scalingY, aSize.getHeight(), 1.5);
    if (!IsDefaultDPI())
        return;

    // Check all borders are red
    // use assertColorsAreSimilar since the color might differ a little bit on mac
    Bitmap aBMP = aBMPEx.GetBitmap();
    {
        BitmapScopedReadAccess pReadAccess(aBMP);
        for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
        {
            const Color aColorTop = pReadAccess->GetColor(0, nX);
            const Color aColorBottom = pReadAccess->GetColor(aSize.Height() - 1, nX);

            assertColorsAreSimilar("Incorrect top border", COL_LIGHTRED, aColorTop, 5);

            // Without the fix in place, this test would have failed with
            // - Expected: Color: R:255 G:0 B:0 A:0
            // - Actual  : Color: R:9 G:9 B:9 A:0
            assertColorsAreSimilar("Incorrect bottom border", COL_LIGHTRED, aColorBottom, 5);
        }

        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColorLeft = pReadAccess->GetColor(nY, 0);
            const Color aColorRight = pReadAccess->GetColor(nY, aSize.Width() - 1);

            assertColorsAreSimilar("Incorrect left border", COL_LIGHTRED, aColorLeft, 5);
            assertColorsAreSimilar("Incorrect right border", COL_LIGHTRED, aColorRight, 5);
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf126319)
{
    loadFromFile(u"odg/tdf126319.odg");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                             uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xShape);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure only the shape is exported
    Size aSize = aBMPEx.GetSizePixel();
    const auto[scalingX, scalingY] = getDPIScaling();
    CPPUNIT_ASSERT_DOUBLES_EQUAL(295 * scalingX, aSize.getWidth(), 1.5);
    CPPUNIT_ASSERT_DOUBLES_EQUAL(134 * scalingY, aSize.getHeight(), 1.5);
    if (!IsDefaultDPI())
        return;

    // Check all borders are red or similar. Ignore the corners
    Bitmap aBMP = aBMPEx.GetBitmap();
    {
        BitmapScopedReadAccess pReadAccess(aBMP);
        for (tools::Long nX = 2; nX < aSize.Width() - 2; ++nX)
        {
            const Color aColorTop = pReadAccess->GetColor(0, nX);
            // tdf#150102 the exported graphic now has no longer an empty bottom
            // row, so test with '-1' in height , same as already in test
            // testTdf105998 above
            const Color aColorBottom = pReadAccess->GetColor(aSize.Height() - 1, nX);

            assertColorsAreSimilar("Incorrect top border", COL_LIGHTRED, aColorTop, 5);

            // Without the fix in place, this test would have failed with
            // - Expected: Color: R:255 G:0 B:0 A:0
            // - Actual  : Color: R:77 G:0 B:0 A:0
            assertColorsAreSimilar("Incorrect bottom border", COL_LIGHTRED, aColorBottom, 5);
        }

        for (tools::Long nY = 2; nY < aSize.Height() - 2; ++nY)
        {
            const Color aColorLeft = pReadAccess->GetColor(nY, 0);
            // tdf#150102 the exported graphic now has no longer an empty right
            // column, so test with '-1' in width , same as already in test
            // testTdf105998 above
            const Color aColorRight = pReadAccess->GetColor(nY, aSize.Width() - 1);

            assertColorsAreSimilar("Incorrect left border", COL_LIGHTRED, aColorLeft, 5);
            assertColorsAreSimilar("Incorrect right border", COL_LIGHTRED, aColorRight, 5);
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf136632)
{
    // Reuse existing file
    loadFromFile(u"odp/tdf105998.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{ comphelper::makePropertyValue(
        u"Translucent"_ustr, sal_Int32(0)) };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                             uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xShape);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();
    AlphaMask aAlpha = aBMPEx.GetAlphaMask();
    BitmapScopedReadAccess pReadAccess(aAlpha);

    // Without the fix in place, this test would have failed here
    CPPUNIT_ASSERT(!pReadAccess);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157652)
{
    loadFromFile(u"odp/tdf157652.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);

            // Without the fix in place, this test would have failed with
            // - Expected: rgba[ffffffff]
            // - Actual  : rgba[ff953eff]
            CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor);
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf156808)
{
    loadFromFile(u"pptx/tdf156808.pptx");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    int nBlackCount = 0;
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);
            if (aColor == COL_BLACK)
                ++nBlackCount;
        }
    }

    // Without the fix in place, this test would have failed with
    // - Expected greater than: 9000
    // - Actual  : 0
    CPPUNIT_ASSERT_GREATER(9000, nBlackCount);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf158743)
{
    loadFromFile(u"odp/tdf158743.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"Translucent"_ustr, sal_Int32(1))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);

    // read RGB
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);

    // read Alpha
    Bitmap aAlpha = aBMPEx.GetAlphaMask().GetBitmap();
    BitmapScopedReadAccess pReadAccessAlpha(aAlpha);

    int nBlackCount = 0;
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);
            const Color aTrans = pReadAccessAlpha->GetColor(nY, nX);

            // only count as black when *not* transparent, else
            // the color is random/luck. Note that when accessing
            // AlphaMask like this alpha is actually in R, G and B,
            // *not* in GetAlpha() (sigh...)
            if (0 != aTrans.GetRed() && aColor == COL_BLACK)
                ++nBlackCount;
        }
    }

    // Without the fix in place, this test would have failed with
    // - Expected: 842
    // - Actual  : 2493
    CPPUNIT_ASSERT_LESS(900, nBlackCount);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157795)
{
    loadFromFile(u"odp/tdf157795.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"Translucent"_ustr, sal_Int32(1)),
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);

            // Without the fix in place, this test would have failed with
            // - Expected: rgba[000000ff]
            // - Actual  : rgba[010101ff]
            CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor);
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf105362)
{
    loadFromFile(u"odp/tdf105362.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"Translucent"_ustr, sal_Int32(1)),
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);

            // Without the fix in place, this test would have failed with
            // - Expected: rgba[000000ff]
            // - Actual  : rgba[ffffffff]
            CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor);
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157636)
{
    loadFromFile(u"ppt/tdf157636.ppt");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    int nBlackCount = 0;
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);
            if (aColor == COL_BLACK)
                ++nBlackCount;
        }
    }

    // Without the fix in place, this test would have failed with
    // - Expected greater than: 6600
    // - Actual  : 559
    CPPUNIT_ASSERT_GREATER(6600, nBlackCount);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157793)
{
    loadFromFile(u"pptx/tdf157793.pptx");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    int nWhiteCount = 0;
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);
            if (aColor == 0xffffff)
                ++nWhiteCount;
        }
    }

    // Without the fix in place, this test would have failed with
    // - Expected greater than: 7800
    // - Actual  : 0
    CPPUNIT_ASSERT_GREATER(7800, nWhiteCount);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157635)
{
    loadFromFile(u"pptx/tdf157635.pptx");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    BitmapScopedReadAccess pReadAccess(aBMP);
    int nBlackCount = 0;
    for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
    {
        for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
        {
            const Color aColor = pReadAccess->GetColor(nY, nX);
            if (aColor == COL_BLACK)
                ++nBlackCount;
        }
    }

    // Without the fix in place, this test would have failed with
    // - Expected greater than: 7100
    // - Actual  : 0
    CPPUNIT_ASSERT_GREATER(7100, nBlackCount);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf113163)
{
    loadFromFile(u"pptx/tdf113163.pptx");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    {
        BitmapScopedReadAccess pReadAccess(aBMP);
        for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
        {
            for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
            {
                // Check all pixels in the image are black
                // Without the fix in place, this test would have failed with
                // - Expected: 0
                // - Actual  : 16777215
                const Color aColor = pReadAccess->GetColor(nY, nX);
                CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor);
            }
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf147119)
{
    loadFromFile(u"odg/tdf147119.odg");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"Translucent"_ustr, sal_Int32(1)),
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    AlphaMask aAlpha = aBMPEx.GetAlphaMask();
    {
        BitmapScopedReadAccess pReadAccess(aAlpha);
        for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
        {
            for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
            {
                // Without the fix in place, this test would have failed with
                // - Expected: Color: R:255 G:255 B:255 A:0
                // - Actual  : Color: R:0 G:0 B:0 A:0
                const Color aColor = pReadAccess->GetColor(nY, nX);
                CPPUNIT_ASSERT_EQUAL(COL_ALPHA_TRANSPARENT, aColor);
            }
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf113197)
{
    loadFromFile(u"odp/tdf113197.odp");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(100)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(100)),
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    Size aSize = aBMPEx.GetSizePixel();
    CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
    Bitmap aBMP = aBMPEx.GetBitmap();
    {
        BitmapScopedReadAccess pReadAccess(aBMP);
        for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
        {
            // Check the bottom half of the document is white
            for (tools::Long nY = 50; nY < aSize.Height() - 1; ++nY)
            {
                // Check all pixels in the image are black
                // Without the fix in place, this test would have failed with
                // - Expected: Color: R:255 G:255 B:255 A:0
                // - Actual  : Color: R:153 G:0 B:51 A:0
                const Color aColor = pReadAccess->GetColor(nY, nX);
                CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor);
            }
        }
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf93124)
{
    loadFromFile(u"ppt/tdf93124.ppt");
    uno::Reference<uno::XComponentContext> xContext = getComponentContext();
    CPPUNIT_ASSERT(xContext.is());
    uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
        = drawing::GraphicExportFilter::create(xContext);

    uno::Sequence<beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(320)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(180))
    };

    uno::Sequence<beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                           uno::UNO_QUERY);
    xGraphicExporter->setSourceDocument(xPage);
    xGraphicExporter->filter(aDescriptor);

    SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
    vcl::PngImageReader aPNGReader(aFileStream);
    BitmapEx aBMPEx = aPNGReader.read();

    // make sure the bitmap is not empty and correct size (PNG export->import was successful)
    CPPUNIT_ASSERT_EQUAL(Size(320, 180), aBMPEx.GetSizePixel());
    Bitmap aBMP = aBMPEx.GetBitmap();
    {
        BitmapScopedReadAccess pReadAccess(aBMP);
        int nNonWhiteCount = 0;
        // The word "Top" should be in rectangle 34,4 - 76,30. If text alignment is wrong, the rectangle will be white.
        for (tools::Long nY = 4; nY < (4 + 26); ++nY)
        {
            for (tools::Long nX = 34; nX < (34 + 43); ++nX)
            {
                const Color aColor = pReadAccess->GetColor(nY, nX);
                if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff)
                    || (aColor.GetBlue() != 0xff))
                    ++nNonWhiteCount;
            }
        }
        CPPUNIT_ASSERT_MESSAGE("Tdf93124: vertical alignment of text is incorrect!",
                               nNonWhiteCount > 50);
    }
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf99729)
{
    const OUString filenames[] = { u"odp/tdf99729-new.odp"_ustr, u"odp/tdf99729-legacy.odp"_ustr };
    int nonwhitecounts[] = { 0, 0 };
    for (size_t i = 0; i < SAL_N_ELEMENTS(filenames); ++i)
    {
        // 1st check for new behaviour - having AnchoredTextOverflowLegacy compatibility flag set to false in settings.xml
        loadFromFile(filenames[i]);

        uno::Reference<uno::XComponentContext> xContext = getComponentContext();
        CPPUNIT_ASSERT(xContext.is());
        uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
            = drawing::GraphicExportFilter::create(xContext);
        CPPUNIT_ASSERT(xGraphicExporter.is());

        uno::Sequence<beans::PropertyValue> aFilterData{
            comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(320)),
            comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(240))
        };

        uno::Sequence<beans::PropertyValue> aDescriptor{
            comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
            comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
            comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
        };

        uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
        uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
                                               uno::UNO_QUERY);
        CPPUNIT_ASSERT(xPage.is());
        xGraphicExporter->setSourceDocument(xPage);
        xGraphicExporter->filter(aDescriptor);

        SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
        vcl::PngImageReader aPNGReader(aFileStream);
        BitmapEx aBMPEx = aPNGReader.read();
        Bitmap aBMP = aBMPEx.GetBitmap();
        BitmapScopedReadAccess pRead(aBMP);
        for (tools::Long nX = 154; nX < (154 + 12); ++nX)
        {
            for (tools::Long nY = 16; nY < (16 + 96); ++nY)
            {
                const Color aColor = pRead->GetColor(nY, nX);
                if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff)
                    || (aColor.GetBlue() != 0xff))
                    ++nonwhitecounts[i];
            }
        }
    }
    // The numbers 1-9 should be above the Text Box in rectangle 154,16 - 170,112.
    // If text alignment is wrong, the rectangle will be white.
    CPPUNIT_ASSERT_MESSAGE("Tdf99729: vertical alignment of text is incorrect!",
                           nonwhitecounts[0] > 100); // it is 134 with cleartype disabled
    // The numbers 1-9 should be below the Text Box -> rectangle 154,16 - 170,112 should be white.
    CPPUNIT_ASSERT_EQUAL_MESSAGE("Tdf99729: legacy vertical alignment of text is incorrect!", 0,
                                 nonwhitecounts[1]);
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf155048)
{
    loadFromFile(u"odg/diagonalLine.fodg");

    auto xGraphicExporter = drawing::GraphicExportFilter::create(getComponentContext());
    CPPUNIT_ASSERT(xGraphicExporter);

    auto xSupplier = mxComponent.queryThrow<css::drawing::XDrawPagesSupplier>();
    auto xPage = xSupplier->getDrawPages()->getByIndex(0).queryThrow<css::lang::XComponent>();
    xGraphicExporter->setSourceDocument(xPage);

    // 1. AA disabled
    {
#ifdef MACOSX
    // Disable test that always fails with Apple Retina displays
    // With a HiDPI display on macOS, each logical pixel is backed
    // by 4 physical pixels. Turning off antialiasing and drawing a
    // diagonal line causes many logical pixels on the edge of the
    // diagonal line to have a mixture of white and blue physical
    // pixels. Then, when such logical pixels are fetched via
    // BitmapEx::GetPixelColor(), their underlying 4 white and blue
    // physical pixels are combined into blended shades of white
    // and blue.
#else
        css::uno::Sequence<css::beans::PropertyValue> aFilterData{
            comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(200)),
            comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(200)),
            comphelper::makePropertyValue(u"AntiAliasing"_ustr, false),
        };

        css::uno::Sequence<css::beans::PropertyValue> aDescriptor{
            comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
            comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
            comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
        };

        xGraphicExporter->filter(aDescriptor);

        BitmapEx bmp = vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read();
        std::set<Color> foundColors;
        for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x)
            for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y)
                foundColors.insert(bmp.GetPixelColor(x, y));

        // There must be only two colors (white and blue) in the bitmap generated without AA
        CPPUNIT_ASSERT_EQUAL(size_t(2), foundColors.size());
        maTempFile.CloseStream();
#endif
    }

    // 2. AA enabled
    {
        css::uno::Sequence<css::beans::PropertyValue> aFilterData{
            comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(200)),
            comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(200)),
            comphelper::makePropertyValue(u"AntiAliasing"_ustr, true),
        };

        css::uno::Sequence<css::beans::PropertyValue> aDescriptor{
            comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
            comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
            comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
        };

        xGraphicExporter->filter(aDescriptor);

        BitmapEx bmp = vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read();
        std::set<Color> foundColors;
        for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x)
            for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y)
                foundColors.insert(bmp.GetPixelColor(x, y));

        // With AA, the number of colors will be greater - it is 19 on my system
        CPPUNIT_ASSERT_GREATER(size_t(2), foundColors.size());
        maTempFile.CloseStream();
    }
}

#if defined _WIN32 && defined _ARM64_
    // skip for windows arm64 build
#else
CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testNoAntiAliasExport)
{
#ifdef MACOSX
// See comment in testTdf155048
#else
    loadFromFile(u"svg/tdf162259.svg");

    auto xGraphicExporter = drawing::GraphicExportFilter::create(getComponentContext());
    CPPUNIT_ASSERT(xGraphicExporter);

    auto xSupplier = mxComponent.queryThrow<css::drawing::XDrawPagesSupplier>();
    auto xPage = xSupplier->getDrawPages()->getByIndex(0).queryThrow<css::lang::XComponent>();
    xGraphicExporter->setSourceDocument(xPage);

    // 101 x 151 is current width x height ratio of the loaded SVG. FIXME: it should be 100 x 150.
    css::uno::Sequence<css::beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(101)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(151)),
        comphelper::makePropertyValue(u"AntiAliasing"_ustr, false),
    };

    css::uno::Sequence<css::beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    xGraphicExporter->filter(aDescriptor);
    BitmapEx bmp = vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read();

    std::set<Color> colors;

    for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x)
        for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y)
            colors.insert(bmp.GetPixelColor(x, y));

    // With AntiAliasing = false, the text must be rendered aliased
    CPPUNIT_ASSERT_EQUAL(size_t(2), colors.size());
#endif
}

CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf162259)
{
    // The top X in the SVG, having no skew, used a fast rendering path, and was output much wider
    // than the bottom one, which has a skew. Test the rendered pixels inside the known boundaries.

    loadFromFile(u"svg/tdf162259.svg");

    auto xGraphicExporter = drawing::GraphicExportFilter::create(getComponentContext());
    CPPUNIT_ASSERT(xGraphicExporter);

    auto xSupplier = mxComponent.queryThrow<css::drawing::XDrawPagesSupplier>();
    auto xPage = xSupplier->getDrawPages()->getByIndex(0).queryThrow<css::lang::XComponent>();
    xGraphicExporter->setSourceDocument(xPage);

    // 101 x 151 is current width x height ratio of the loaded SVG. FIXME: it should be 100 x 150.
    css::uno::Sequence<css::beans::PropertyValue> aFilterData{
        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(101)),
        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(151)),
        comphelper::makePropertyValue(u"AntiAliasing"_ustr, true),
    };

    css::uno::Sequence<css::beans::PropertyValue> aDescriptor{
        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
    };

    xGraphicExporter->filter(aDescriptor);
    BitmapEx bmp = vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read();

    tools::Rectangle topX(12, 21, 37, 60);
    int topNonWhites = 0;
    tools::Rectangle bottomX(12, 82, 37, 126);
    int bottomNonWhites = 0;

    // Check that there is nothing outside the X rectangles
    for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x)
    {
        for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y)
        {
            if (topX.Contains(Point{ x, y }))
            {
                if (bmp.GetPixelColor(x, y) != COL_WHITE)
                    ++topNonWhites;
            }
            else if (bottomX.Contains(Point{ x, y }))
            {
                if (bmp.GetPixelColor(x, y) != COL_WHITE)
                    ++bottomNonWhites;
            }
            else
            {
                OString msg("Pixel: " + OString::number(x) + "," + OString::number(y));
                CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), COL_WHITE, bmp.GetPixelColor(x, y));
            }
        }
    }

    CPPUNIT_ASSERT_GREATER(310, topNonWhites); // Win: 399 with Skia, 325 with DWriteTextRenderer
    CPPUNIT_ASSERT_GREATER(350, bottomNonWhites); // Win: 362 with Skia, 371 with DWriteTextRenderer
}
#endif

CPPUNIT_PLUGIN_IMPLEMENT();

Messung V0.5
C=91 H=51 G=73

¤ Dauer der Verarbeitung: 0.17 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.