summaryrefslogtreecommitdiffstats
path: root/vcl/qa/cppunit/png
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
commit267c6f2ac71f92999e969232431ba04678e7437e (patch)
tree358c9467650e1d0a1d7227a21dac2e3d08b622b2 /vcl/qa/cppunit/png
parentInitial commit. (diff)
downloadlibreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz
libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vcl/qa/cppunit/png')
-rw-r--r--vcl/qa/cppunit/png/PngFilterTest.cxx2084
-rw-r--r--vcl/qa/cppunit/png/data/alpha-rect-8bit-RGBA.pngbin0 -> 158 bytes
-rw-r--r--vcl/qa/cppunit/png/data/apng_simple.apngbin0 -> 239 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi0g01.pngbin0 -> 217 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi0g02.pngbin0 -> 154 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi0g04.pngbin0 -> 247 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi0g08.pngbin0 -> 254 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi0g16.pngbin0 -> 299 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi2c08.pngbin0 -> 315 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi2c16.pngbin0 -> 595 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi3p01.pngbin0 -> 132 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi3p02.pngbin0 -> 193 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi3p04.pngbin0 -> 327 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi3p08.pngbin0 -> 1527 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi4a08.pngbin0 -> 214 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi4a16.pngbin0 -> 2855 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi6a08.pngbin0 -> 361 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basi6a16.pngbin0 -> 4180 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn0g01.pngbin0 -> 164 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn0g02.pngbin0 -> 104 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn0g04.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn0g08.pngbin0 -> 138 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn0g16.pngbin0 -> 167 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn2c08.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn2c16.pngbin0 -> 302 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn3p01.pngbin0 -> 112 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn3p02.pngbin0 -> 146 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn3p04.pngbin0 -> 216 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn3p08.pngbin0 -> 1286 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn4a08.pngbin0 -> 126 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn4a16.pngbin0 -> 2206 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn6a08.pngbin0 -> 184 bytes
-rw-r--r--vcl/qa/cppunit/png/data/basn6a16.pngbin0 -> 3435 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgai4a08.pngbin0 -> 214 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgai4a16.pngbin0 -> 2855 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgan6a08.pngbin0 -> 184 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgan6a16.pngbin0 -> 3435 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgbn4a08.pngbin0 -> 140 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bggn4a16.pngbin0 -> 2220 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgwn6a08.pngbin0 -> 202 bytes
-rw-r--r--vcl/qa/cppunit/png/data/bgyn6a16.pngbin0 -> 3453 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ccwn2c08.pngbin0 -> 1514 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ccwn3p08.pngbin0 -> 1554 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cdfn2c08.pngbin0 -> 404 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cdhn2c08.pngbin0 -> 344 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cdsn2c08.pngbin0 -> 232 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cdun2c08.pngbin0 -> 724 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ch1n3p04.pngbin0 -> 258 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ch2n3p08.pngbin0 -> 1810 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cm0n0g04.pngbin0 -> 292 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cm7n0g04.pngbin0 -> 292 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cm9n0g04.pngbin0 -> 292 bytes
-rw-r--r--vcl/qa/cppunit/png/data/color-rect-4bit-pal.pngbin0 -> 104 bytes
-rw-r--r--vcl/qa/cppunit/png/data/color-rect-8bit-RGB-interlaced.pngbin0 -> 92 bytes
-rw-r--r--vcl/qa/cppunit/png/data/color-rect-8bit-RGB.pngbin0 -> 90 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cs3n2c16.pngbin0 -> 214 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cs3n3p08.pngbin0 -> 259 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cs5n2c08.pngbin0 -> 186 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cs5n3p08.pngbin0 -> 271 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cs8n2c08.pngbin0 -> 149 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cs8n3p08.pngbin0 -> 256 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ct0n0g04.pngbin0 -> 273 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ct1n0g04.pngbin0 -> 792 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cten0g04.pngbin0 -> 742 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ctfn0g04.pngbin0 -> 716 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ctgn0g04.pngbin0 -> 1182 bytes
-rw-r--r--vcl/qa/cppunit/png/data/cthn0g04.pngbin0 -> 1269 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ctjn0g04.pngbin0 -> 941 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ctzn0g04.pngbin0 -> 753 bytes
-rw-r--r--vcl/qa/cppunit/png/data/dummy.gifbin0 -> 101 bytes
-rw-r--r--vcl/qa/cppunit/png/data/exif2c08.pngbin0 -> 1788 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f00n0g08.pngbin0 -> 319 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f00n2c08.pngbin0 -> 2475 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f01n0g08.pngbin0 -> 321 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f01n2c08.pngbin0 -> 1180 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f02n0g08.pngbin0 -> 355 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f02n2c08.pngbin0 -> 1729 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f03n0g08.pngbin0 -> 389 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f03n2c08.pngbin0 -> 1291 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f04n0g08.pngbin0 -> 269 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f04n2c08.pngbin0 -> 985 bytes
-rw-r--r--vcl/qa/cppunit/png/data/f99n0g04.pngbin0 -> 426 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g03n0g16.pngbin0 -> 345 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g03n2c08.pngbin0 -> 370 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g03n3p04.pngbin0 -> 214 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g04n0g16.pngbin0 -> 363 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g04n2c08.pngbin0 -> 377 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g04n3p04.pngbin0 -> 219 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g05n0g16.pngbin0 -> 339 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g05n2c08.pngbin0 -> 350 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g05n3p04.pngbin0 -> 206 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g07n0g16.pngbin0 -> 321 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g07n2c08.pngbin0 -> 340 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g07n3p04.pngbin0 -> 207 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g10n0g16.pngbin0 -> 262 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g10n2c08.pngbin0 -> 285 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g10n3p04.pngbin0 -> 214 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g25n0g16.pngbin0 -> 383 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g25n2c08.pngbin0 -> 405 bytes
-rw-r--r--vcl/qa/cppunit/png/data/g25n3p04.pngbin0 -> 215 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ms-gif.pngbin0 -> 15901 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi1n0g16.pngbin0 -> 167 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi1n2c16.pngbin0 -> 302 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi2n0g16.pngbin0 -> 179 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi2n2c16.pngbin0 -> 314 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi4n0g16.pngbin0 -> 203 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi4n2c16.pngbin0 -> 338 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi9n0g16.pngbin0 -> 1283 bytes
-rw-r--r--vcl/qa/cppunit/png/data/oi9n2c16.pngbin0 -> 3038 bytes
-rw-r--r--vcl/qa/cppunit/png/data/pp0n2c16.pngbin0 -> 962 bytes
-rw-r--r--vcl/qa/cppunit/png/data/pp0n6a08.pngbin0 -> 818 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ps1n0g08.pngbin0 -> 1456 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ps1n2c16.pngbin0 -> 1620 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ps2n0g08.pngbin0 -> 2320 bytes
-rw-r--r--vcl/qa/cppunit/png/data/ps2n2c16.pngbin0 -> 2484 bytes
-rw-r--r--vcl/qa/cppunit/png/data/rect-1bit-pal.pngbin0 -> 89 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s01i3p01.pngbin0 -> 113 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s01n3p01.pngbin0 -> 113 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s02i3p01.pngbin0 -> 114 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s02n3p01.pngbin0 -> 115 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s03i3p01.pngbin0 -> 118 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s03n3p01.pngbin0 -> 120 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s04i3p01.pngbin0 -> 126 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s04n3p01.pngbin0 -> 121 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s05i3p02.pngbin0 -> 134 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s05n3p02.pngbin0 -> 129 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s06i3p02.pngbin0 -> 143 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s06n3p02.pngbin0 -> 131 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s07i3p02.pngbin0 -> 149 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s07n3p02.pngbin0 -> 138 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s08i3p02.pngbin0 -> 149 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s08n3p02.pngbin0 -> 139 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s09i3p02.pngbin0 -> 147 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s09n3p02.pngbin0 -> 143 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s32i3p04.pngbin0 -> 355 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s32n3p04.pngbin0 -> 263 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s33i3p04.pngbin0 -> 385 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s33n3p04.pngbin0 -> 329 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s34i3p04.pngbin0 -> 349 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s34n3p04.pngbin0 -> 248 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s35i3p04.pngbin0 -> 399 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s35n3p04.pngbin0 -> 338 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s36i3p04.pngbin0 -> 356 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s36n3p04.pngbin0 -> 258 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s37i3p04.pngbin0 -> 393 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s37n3p04.pngbin0 -> 336 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s38i3p04.pngbin0 -> 357 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s38n3p04.pngbin0 -> 245 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s39i3p04.pngbin0 -> 420 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s39n3p04.pngbin0 -> 352 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s40i3p04.pngbin0 -> 357 bytes
-rw-r--r--vcl/qa/cppunit/png/data/s40n3p04.pngbin0 -> 256 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbbn0g04.pngbin0 -> 429 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbbn2c16.pngbin0 -> 2041 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbbn3p08.pngbin0 -> 1499 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbgn2c16.pngbin0 -> 2041 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbgn3p08.pngbin0 -> 1499 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbrn2c08.pngbin0 -> 1633 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbwn0g16.pngbin0 -> 1313 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbwn3p08.pngbin0 -> 1496 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tbyn3p08.pngbin0 -> 1499 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tm3n3p02.pngbin0 -> 116 bytes
-rw-r--r--vcl/qa/cppunit/png/data/tp1n3p08.pngbin0 -> 1483 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xc1n0g08.pngbin0 -> 138 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xc9n2c08.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xcrn0g04.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xcsn0g01.pngbin0 -> 164 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xd0n2c08.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xd3n2c08.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xd9n2c08.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xdtn0g01.pngbin0 -> 61 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xhdn0g08.pngbin0 -> 138 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xlfn0g04.pngbin0 -> 145 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xs1n0g01.pngbin0 -> 164 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xs2n0g01.pngbin0 -> 164 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xs4n0g01.pngbin0 -> 164 bytes
-rw-r--r--vcl/qa/cppunit/png/data/xs7n0g01.pngbin0 -> 164 bytes
-rw-r--r--vcl/qa/cppunit/png/data/z00n2c08.pngbin0 -> 3172 bytes
-rw-r--r--vcl/qa/cppunit/png/data/z03n2c08.pngbin0 -> 232 bytes
-rw-r--r--vcl/qa/cppunit/png/data/z06n2c08.pngbin0 -> 224 bytes
-rw-r--r--vcl/qa/cppunit/png/data/z09n2c08.pngbin0 -> 224 bytes
181 files changed, 2084 insertions, 0 deletions
diff --git a/vcl/qa/cppunit/png/PngFilterTest.cxx b/vcl/qa/cppunit/png/PngFilterTest.cxx
new file mode 100644
index 0000000000..2e900ec41d
--- /dev/null
+++ b/vcl/qa/cppunit/png/PngFilterTest.cxx
@@ -0,0 +1,2084 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sal/config.h>
+
+#include <string_view>
+
+#include <test/bootstrapfixture.hxx>
+#include <tools/stream.hxx>
+#include <vcl/filter/PngImageReader.hxx>
+#include <vcl/filter/PngImageWriter.hxx>
+#include <vcl/BitmapReadAccess.hxx>
+#include <vcl/BitmapMonochromeFilter.hxx>
+#include <vcl/BitmapWriteAccess.hxx>
+#include <vcl/alpha.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <unotools/tempfile.hxx>
+
+using namespace css;
+
+namespace
+{
+struct Case
+{
+ tools::Long mnWidth;
+ tools::Long mnHeight;
+ sal_uInt16 mnBpp;
+ bool mbHasPalette;
+ bool mbIsAlpha;
+};
+// Checks that a pngs BitmapEx is the same after reading and
+// after writing. Takes a vector of function pointers if there's need to test
+// special cases
+void checkImportExportPng(const OUString& sFilePath, const Case& aCase)
+{
+ SvFileStream aFileStream(sFilePath, StreamMode::READ);
+ SvMemoryStream aExportStream;
+ BitmapEx aImportedBitmapEx;
+ BitmapEx aExportedImportedBitmapEx;
+
+ bool bOpenOk = !aFileStream.GetError() && aFileStream.GetBufferSize() > 0;
+ CPPUNIT_ASSERT_MESSAGE(OString("Failed to open file: " + sFilePath.toUtf8()).getStr(), bOpenOk);
+
+ // Read the png from the file
+ {
+ vcl::PngImageReader aPngReader(aFileStream);
+ bool bReadOk = aPngReader.read(aImportedBitmapEx);
+ CPPUNIT_ASSERT_MESSAGE(OString("Failed to read png from: " + sFilePath.toUtf8()).getStr(),
+ bReadOk);
+ Bitmap aImportedBitmap = aImportedBitmapEx.GetBitmap();
+ BitmapScopedInfoAccess pAccess(aImportedBitmap);
+ auto nActualWidth = aImportedBitmapEx.GetSizePixel().Width();
+ auto nActualHeight = aImportedBitmapEx.GetSizePixel().Height();
+ auto nActualBpp = vcl::pixelFormatBitCount(aImportedBitmapEx.GetBitmap().getPixelFormat());
+ auto bActualHasPalette = pAccess->HasPalette();
+ auto bActualIsAlpha = aImportedBitmapEx.IsAlpha();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("Width comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mnWidth, nActualWidth);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("Height comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mnHeight, nActualHeight);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("Bpp comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mnBpp, nActualBpp);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("HasPalette comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mbHasPalette, bActualHasPalette);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("IsAlpha comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mbIsAlpha, bActualIsAlpha);
+ }
+
+ // Write the imported png to a stream
+ {
+ vcl::PngImageWriter aPngWriter(aExportStream);
+ bool bWriteOk = aPngWriter.write(aImportedBitmapEx);
+ CPPUNIT_ASSERT_MESSAGE(OString("Failed to write png: " + sFilePath.toUtf8()).getStr(),
+ bWriteOk);
+ aExportStream.Seek(0);
+ }
+
+ // Read the png again from the exported stream
+ {
+ vcl::PngImageReader aPngReader(aExportStream);
+ bool bReadOk = aPngReader.read(aExportedImportedBitmapEx);
+ CPPUNIT_ASSERT_MESSAGE(
+ OString("Failed to read exported png: " + sFilePath.toUtf8()).getStr(), bReadOk);
+ Bitmap aExportedImportedBitmap = aExportedImportedBitmapEx.GetBitmap();
+ BitmapScopedInfoAccess pAccess(aExportedImportedBitmap);
+ auto nActualWidth = aExportedImportedBitmapEx.GetSizePixel().Width();
+ auto nActualHeight = aExportedImportedBitmapEx.GetSizePixel().Height();
+ auto nActualBpp
+ = vcl::pixelFormatBitCount(aExportedImportedBitmapEx.GetBitmap().getPixelFormat());
+ auto bActualHasPalette = pAccess->HasPalette();
+ auto bActualIsAlpha = aExportedImportedBitmapEx.IsAlpha();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("Width comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mnWidth, nActualWidth);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("Height comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mnHeight, nActualHeight);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("Bpp comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mnBpp, nActualBpp);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("HasPalette comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mbHasPalette, bActualHasPalette);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ OString("IsAlpha comparison failed for exported png:" + sFilePath.toUtf8()).getStr(),
+ aCase.mbIsAlpha, bActualIsAlpha);
+ }
+
+ // Compare imported and exported BitmapEx
+ // This compares size, inner bitmap and alpha mask
+ bool bIsSame = (aExportedImportedBitmapEx == aImportedBitmapEx);
+ CPPUNIT_ASSERT_MESSAGE(
+ OString("Import->Export png test failed for png: " + sFilePath.toUtf8()).getStr(), bIsSame);
+}
+
+// Checks that aPngReader.read returns false on corrupted files
+void checkImportCorruptedPng(const OUString& sFilePath)
+{
+ SvFileStream aFileStream(sFilePath, StreamMode::READ);
+ BitmapEx aImportedBitmapEx;
+
+ bool bOpenOk = !aFileStream.GetError() && aFileStream.GetBufferSize() > 0;
+ CPPUNIT_ASSERT_MESSAGE(OString("Failed to open file: " + sFilePath.toUtf8()).getStr(), bOpenOk);
+ vcl::PngImageReader aPngReader(aFileStream);
+ bool bReadOk = aPngReader.read(aImportedBitmapEx);
+ // Make sure this file was not read successfully
+ CPPUNIT_ASSERT_MESSAGE(
+ OString("Corrupted png should not be opened: " + sFilePath.toUtf8()).getStr(), !bReadOk);
+}
+}
+
+class PngFilterTest : public test::BootstrapFixture
+{
+ // Should keep the temp files (should be false)
+ static constexpr bool bKeepTemp = true;
+
+ OUString maDataUrl;
+
+ OUString getFullUrl(std::u16string_view sFileName)
+ {
+ return m_directories.getURLFromSrc(maDataUrl) + sFileName;
+ }
+
+public:
+ PngFilterTest()
+ : BootstrapFixture(true, false)
+ , maDataUrl("/vcl/qa/cppunit/png/data/")
+ {
+ }
+
+ void testPng();
+ void testApng();
+ void testPngSuite();
+ void testMsGifInPng();
+ void testPngRoundtrip8BitGrey();
+ void testPngRoundtrip24();
+ void testPngRoundtrip24_8();
+ void testPngRoundtrip32();
+ void testPngWrite8BitRGBPalette();
+ void testTdf153180MonochromeFilterPngExport();
+ void testDump();
+
+ CPPUNIT_TEST_SUITE(PngFilterTest);
+ CPPUNIT_TEST(testPng);
+ CPPUNIT_TEST(testApng);
+ CPPUNIT_TEST(testPngSuite);
+ CPPUNIT_TEST(testMsGifInPng);
+ CPPUNIT_TEST(testPngRoundtrip8BitGrey);
+ CPPUNIT_TEST(testPngRoundtrip24);
+ CPPUNIT_TEST(testPngRoundtrip24_8);
+ CPPUNIT_TEST(testPngRoundtrip32);
+ CPPUNIT_TEST(testPngWrite8BitRGBPalette);
+ CPPUNIT_TEST(testDump);
+ CPPUNIT_TEST(testTdf153180MonochromeFilterPngExport);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void PngFilterTest::testPng()
+{
+ for (const OUString& aFileName : { OUString("rect-1bit-pal.png") })
+ {
+ SvFileStream aFileStream(getFullUrl(aFileName), StreamMode::READ);
+
+ vcl::PngImageReader aPngReader(aFileStream);
+ BitmapEx aBitmapEx;
+ aPngReader.read(aBitmapEx);
+
+ Bitmap aBitmap = aBitmapEx.GetBitmap();
+ {
+ BitmapScopedReadAccess pAccess(aBitmap);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAccess->Width());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAccess->Height());
+
+ if (pAccess->GetBitCount() == 24 || pAccess->GetBitCount() == 32)
+ {
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(3, 3));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(3, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(0, 3));
+
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x00, 0x00),
+ pAccess->GetPixel(1, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x00, 0x00),
+ pAccess->GetPixel(1, 2));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x00, 0x00),
+ pAccess->GetPixel(2, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x00, 0x00),
+ pAccess->GetPixel(2, 2));
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("Bitmap is not 24 or 32 bit.", false);
+ }
+ }
+ }
+
+ OUString aFilenames[] = {
+ OUString("color-rect-8bit-RGB.png"),
+ OUString("color-rect-8bit-RGB-interlaced.png"),
+ OUString("color-rect-4bit-pal.png"),
+ };
+
+ for (const OUString& aFileName : aFilenames)
+ {
+ SvFileStream aFileStream(getFullUrl(aFileName), StreamMode::READ);
+
+ vcl::PngImageReader aPngReader(aFileStream);
+ BitmapEx aBitmapEx;
+ aPngReader.read(aBitmapEx);
+
+ Bitmap aBitmap = aBitmapEx.GetBitmap();
+ {
+ BitmapScopedReadAccess pAccess(aBitmap);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAccess->Width());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAccess->Height());
+ if (pAccess->GetBitCount() == 24 || pAccess->GetBitCount() == 32)
+ {
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(3, 3));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(3, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(0, 3));
+
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0x00, 0x00, 0x00),
+ pAccess->GetPixel(1, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0xFF, 0x00, 0x00),
+ pAccess->GetPixel(1, 2));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0xFF, 0x00),
+ pAccess->GetPixel(2, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0x00, 0x00),
+ pAccess->GetPixel(2, 2));
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("Bitmap is not 24 or 32 bit.", false);
+ }
+ }
+ }
+ for (const OUString& aFileName : { OUString("alpha-rect-8bit-RGBA.png") })
+ {
+ SvFileStream aFileStream(getFullUrl(aFileName), StreamMode::READ);
+
+ vcl::PngImageReader aPngReader(aFileStream);
+ BitmapEx aBitmapEx;
+ aPngReader.read(aBitmapEx);
+
+ Bitmap aBitmap = aBitmapEx.GetBitmap();
+ {
+ BitmapScopedReadAccess pAccess(aBitmap);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAccess->Width());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAccess->Height());
+
+ if (pAccess->GetBitCount() == 24)
+ {
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(3, 3));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(3, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x00),
+ pAccess->GetPixel(0, 3));
+
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0x00, 0x00, 0x00),
+ pAccess->GetPixel(1, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0xFF, 0x00, 0x00),
+ pAccess->GetPixel(1, 2));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0xFF, 0x00),
+ pAccess->GetPixel(2, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0x00, 0x00),
+ pAccess->GetPixel(2, 2));
+
+ AlphaMask aAlpha = aBitmapEx.GetAlphaMask();
+ {
+ BitmapScopedReadAccess pAlphaAccess(aAlpha);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), pAlphaAccess->GetBitCount());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAlphaAccess->Width());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4), pAlphaAccess->Height());
+
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x7F, 0x00),
+ pAlphaAccess->GetPixel(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x7F, 0x00),
+ pAlphaAccess->GetPixel(3, 3));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x7F, 0x00),
+ pAlphaAccess->GetPixel(3, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x7F, 0x00),
+ pAlphaAccess->GetPixel(0, 3));
+
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0xBF, 0x00),
+ pAlphaAccess->GetPixel(1, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x3F, 0x00),
+ pAlphaAccess->GetPixel(1, 2));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0x3F, 0x00),
+ pAlphaAccess->GetPixel(2, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0xBF, 0x00),
+ pAlphaAccess->GetPixel(2, 2));
+ }
+ }
+ else if (pAccess->GetBitCount() == 32)
+ {
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x80),
+ pAccess->GetPixel(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x80),
+ pAccess->GetPixel(3, 3));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x80),
+ pAccess->GetPixel(3, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0xFF, 0x80),
+ pAccess->GetPixel(0, 3));
+
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0x00, 0x00, 0x40),
+ pAccess->GetPixel(1, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0xFF, 0x00, 0xC0),
+ pAccess->GetPixel(1, 2));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0x00, 0x00, 0xFF, 0xC0),
+ pAccess->GetPixel(2, 1));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(ColorTransparency, 0xFF, 0xFF, 0x00, 0x40),
+ pAccess->GetPixel(2, 2));
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("Bitmap is not 24 or 32 bit.", false);
+ }
+ }
+ }
+}
+
+void PngFilterTest::testApng()
+{
+ SvFileStream aFileStream(getFullUrl(u"apng_simple.apng"), StreamMode::READ);
+ vcl::PngImageReader aPngReader(aFileStream);
+ Graphic aGraphic;
+ bool bSuccess = aPngReader.read(aGraphic);
+ CPPUNIT_ASSERT(bSuccess);
+ CPPUNIT_ASSERT(aGraphic.IsAnimated());
+ CPPUNIT_ASSERT_EQUAL(size_t(2), aGraphic.GetAnimation().GetAnimationFrames().size());
+
+ AnimationFrame aFrame1 = *aGraphic.GetAnimation().GetAnimationFrames()[0];
+ AnimationFrame aFrame2 = *aGraphic.GetAnimation().GetAnimationFrames()[1];
+
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFrame1.maBitmapEx.GetPixelColor(0, 0));
+ CPPUNIT_ASSERT_EQUAL(Color(0x72d1c8), aFrame1.maBitmapEx.GetPixelColor(2, 2));
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aFrame2.maBitmapEx.GetPixelColor(0, 0));
+
+ // Roundtrip the APNG
+ SvMemoryStream aOutStream;
+ vcl::PngImageWriter aPngWriter(aOutStream);
+ bSuccess = aPngWriter.write(aGraphic);
+ CPPUNIT_ASSERT(bSuccess);
+
+ aOutStream.Seek(STREAM_SEEK_TO_BEGIN);
+ vcl::PngImageReader aPngReader2(aOutStream);
+ Graphic aGraphic2;
+ bSuccess = aPngReader2.read(aGraphic2);
+ CPPUNIT_ASSERT(bSuccess);
+ CPPUNIT_ASSERT(aGraphic2.IsAnimated());
+ CPPUNIT_ASSERT_EQUAL(size_t(2), aGraphic2.GetAnimation().GetAnimationFrames().size());
+
+ AnimationFrame aFrame1Roundtripped = *aGraphic2.GetAnimation().GetAnimationFrames()[0];
+ AnimationFrame aFrame2Roundtripped = *aGraphic2.GetAnimation().GetAnimationFrames()[1];
+
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFrame1Roundtripped.maBitmapEx.GetPixelColor(0, 0));
+ CPPUNIT_ASSERT_EQUAL(Color(0x72d1c8), aFrame1Roundtripped.maBitmapEx.GetPixelColor(2, 2));
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aFrame2Roundtripped.maBitmapEx.GetPixelColor(0, 0));
+
+ // Make sure the two frames have the same properties
+ CPPUNIT_ASSERT_EQUAL(aFrame1.maPositionPixel, aFrame1Roundtripped.maPositionPixel);
+ CPPUNIT_ASSERT_EQUAL(aFrame1.maSizePixel, aFrame1Roundtripped.maSizePixel);
+ CPPUNIT_ASSERT_EQUAL(aFrame1.mnWait, aFrame1Roundtripped.mnWait);
+ CPPUNIT_ASSERT_EQUAL(aFrame1.meDisposal, aFrame1Roundtripped.meDisposal);
+ CPPUNIT_ASSERT_EQUAL(aFrame1.meBlend, aFrame1Roundtripped.meBlend);
+
+ CPPUNIT_ASSERT_EQUAL(aFrame2.maPositionPixel, aFrame2Roundtripped.maPositionPixel);
+ CPPUNIT_ASSERT_EQUAL(aFrame2.maSizePixel, aFrame2Roundtripped.maSizePixel);
+ CPPUNIT_ASSERT_EQUAL(aFrame2.mnWait, aFrame2Roundtripped.mnWait);
+ CPPUNIT_ASSERT_EQUAL(aFrame2.meDisposal, aFrame2Roundtripped.meDisposal);
+ CPPUNIT_ASSERT_EQUAL(aFrame2.meBlend, aFrame2Roundtripped.meBlend);
+}
+
+void PngFilterTest::testPngSuite()
+{
+ // Test the PngSuite test files by Willem van Schaik
+ // filename: g04i2c08.png
+ // || ||||
+ // test feature (in this case gamma) ------+| ||||
+ // parameter of test (here gamma-value) ----+ ||||
+ // interlaced or non-interlaced --------------+|||
+ // color-type (numerical) ---------------------+||
+ // color-type (descriptive) --------------------+|
+ // bit-depth ------------------------------------+
+
+ // Some notes about the cases:
+ // - RGB palette PNGs get converted to a bitmap with png_set_palette_to_rgb
+ // - Grayscale PNGs with alpha also do with png_set_gray_to_rgb
+ // - Grayscale PNGs without alpha use BitmapEx palette utilities
+ // - 1, 2, 4 bit grayscale w/o alpha gets converted to 8 bit with png_set_expand_gray_1_2_4_to_8
+ // - 16 bit per channel gets converted to 8 bit per channel with png_set_scale_16
+ // - PNGs that are not size related have size 32x32
+ // - Internally BitmapEx is never 32 bpp, instead it's 24 bpp (rgb) and uses an 8 bpp alpha mask
+ std::pair<std::u16string_view, Case> aCases[] = {
+ // Basic formats, not interlaced
+ { u"basn0g01.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // b&w
+ { u"basn0g02.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 2 bit grayscale
+ { u"basn0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 4 bit grayscale
+ { u"basn0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 8 bit grayscale
+ { u"basn0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 16 bit grayscale
+ { u"basn2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 8 bit rgb
+ { u"basn2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 16 bit rgb
+ { u"basn3p01.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 1 bit palette
+ { u"basn3p02.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 2 bit palette
+ { u"basn3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 4 bit palette
+ { u"basn3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 8 bit palette
+ { u"basn4a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 8 bit grayscale + 8 bit alpha
+ { u"basn4a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 16 bit grayscale + 16 bit alpha
+ { u"basn6a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 8 bit rgba
+ { u"basn6a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 16 bit rgba
+ // Basic formats, interlaced
+ { u"basi0g01.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // b&w
+ { u"basi0g02.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 2 bit grayscale
+ { u"basi0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 4 bit grayscale
+ { u"basi0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 8 bit grayscale
+ { u"basi0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // 16 bit grayscale
+ { u"basi2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 8 bit rgb
+ { u"basi2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 16 bit rgb
+ { u"basi3p01.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 1 bit palette
+ { u"basi3p02.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 2 bit palette
+ { u"basi3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 4 bit palette
+ { u"basi3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 8 bit palette
+ { u"basi4a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 8 bit grayscale + 8 bit alpha
+ { u"basi4a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 16 bit grayscale + 16 bit alpha
+ { u"basi6a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 8 bit rgba
+ { u"basi6a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 16 bit rgba
+ // // Odd sizes, not interlaced
+ { u"s01n3p01.png",
+ {
+ 1,
+ 1,
+ 24,
+ false,
+ false,
+ } }, // 1x1
+ { u"s02n3p01.png",
+ {
+ 2,
+ 2,
+ 24,
+ false,
+ false,
+ } }, // 2x2
+ { u"s03n3p01.png",
+ {
+ 3,
+ 3,
+ 24,
+ false,
+ false,
+ } }, // 3x3
+ { u"s04n3p01.png",
+ {
+ 4,
+ 4,
+ 24,
+ false,
+ false,
+ } }, // 4x4
+ { u"s05n3p02.png",
+ {
+ 5,
+ 5,
+ 24,
+ false,
+ false,
+ } }, // 5x5
+ { u"s06n3p02.png",
+ {
+ 6,
+ 6,
+ 24,
+ false,
+ false,
+ } }, // 6x6
+ { u"s07n3p02.png",
+ {
+ 7,
+ 7,
+ 24,
+ false,
+ false,
+ } }, // 7x7
+ { u"s08n3p02.png",
+ {
+ 8,
+ 8,
+ 24,
+ false,
+ false,
+ } }, // 8x8
+ { u"s09n3p02.png",
+ {
+ 9,
+ 9,
+ 24,
+ false,
+ false,
+ } }, // 9x9
+ { u"s32n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 32x32
+ { u"s33n3p04.png",
+ {
+ 33,
+ 33,
+ 24,
+ false,
+ false,
+ } }, // 33x33
+ { u"s34n3p04.png",
+ {
+ 34,
+ 34,
+ 24,
+ false,
+ false,
+ } }, // 34x34
+ { u"s35n3p04.png",
+ {
+ 35,
+ 35,
+ 24,
+ false,
+ false,
+ } }, // 35x35
+ { u"s36n3p04.png",
+ {
+ 36,
+ 36,
+ 24,
+ false,
+ false,
+ } }, // 36x36
+ { u"s37n3p04.png",
+ {
+ 37,
+ 37,
+ 24,
+ false,
+ false,
+ } }, // 37x37
+ { u"s38n3p04.png",
+ {
+ 38,
+ 38,
+ 24,
+ false,
+ false,
+ } }, // 38x38
+ { u"s39n3p04.png",
+ {
+ 39,
+ 39,
+ 24,
+ false,
+ false,
+ } }, // 39x39
+ { u"s40n3p04.png",
+ {
+ 40,
+ 40,
+ 24,
+ false,
+ false,
+ } }, // 40x40
+ // // Odd sizes, interlaced
+ { u"s01i3p01.png",
+ {
+ 1,
+ 1,
+ 24,
+ false,
+ false,
+ } }, // 1x1
+ { u"s02i3p01.png",
+ {
+ 2,
+ 2,
+ 24,
+ false,
+ false,
+ } }, // 2x2
+ { u"s03i3p01.png",
+ {
+ 3,
+ 3,
+ 24,
+ false,
+ false,
+ } }, // 3x3
+ { u"s04i3p01.png",
+ {
+ 4,
+ 4,
+ 24,
+ false,
+ false,
+ } }, // 4x4
+ { u"s05i3p02.png",
+ {
+ 5,
+ 5,
+ 24,
+ false,
+ false,
+ } }, // 5x5
+ { u"s06i3p02.png",
+ {
+ 6,
+ 6,
+ 24,
+ false,
+ false,
+ } }, // 6x6
+ { u"s07i3p02.png",
+ {
+ 7,
+ 7,
+ 24,
+ false,
+ false,
+ } }, // 7x7
+ { u"s08i3p02.png",
+ {
+ 8,
+ 8,
+ 24,
+ false,
+ false,
+ } }, // 8x8
+ { u"s09i3p02.png",
+ {
+ 9,
+ 9,
+ 24,
+ false,
+ false,
+ } }, // 9x9
+ { u"s32i3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // 32x32
+ { u"s33i3p04.png",
+ {
+ 33,
+ 33,
+ 24,
+ false,
+ false,
+ } }, // 33x33
+ { u"s34i3p04.png",
+ {
+ 34,
+ 34,
+ 24,
+ false,
+ false,
+ } }, // 34x34
+ { u"s35i3p04.png",
+ {
+ 35,
+ 35,
+ 24,
+ false,
+ false,
+ } }, // 35x35
+ { u"s36i3p04.png",
+ {
+ 36,
+ 36,
+ 24,
+ false,
+ false,
+ } }, // 36x36
+ { u"s37i3p04.png",
+ {
+ 37,
+ 37,
+ 24,
+ false,
+ false,
+ } }, // 37x37
+ { u"s38i3p04.png",
+ {
+ 38,
+ 38,
+ 24,
+ false,
+ false,
+ } }, // 38x38
+ { u"s39i3p04.png",
+ {
+ 39,
+ 39,
+ 24,
+ false,
+ false,
+ } }, // 39x39
+ { u"s40i3p04.png",
+ {
+ 40,
+ 40,
+ 24,
+ false,
+ false,
+ } }, // 40x40
+ // Background colors
+ { u"bgai4a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 8 bit grayscale alpha no background chunk, interlaced
+ { u"bgai4a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 16 bit grayscale alpha no background chunk, interlaced
+ { u"bgan6a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 3 * 8 bits rgb color alpha, no background chunk
+ { u"bgan6a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 3 * 16 bits rgb color alpha, no background chunk
+ { u"bgbn4a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 8 bit grayscale alpha, black background chunk
+ { u"bggn4a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 16 bit grayscale alpha, gray background chunk
+ { u"bgwn6a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 3 * 8 bits rgb color alpha, white background chunk
+ { u"bgyn6a16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // 3 * 16 bits rgb color alpha, yellow background chunk
+ // Transparency
+ { u"tbbn0g04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, black background chunk
+ { u"tbbn2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, blue background chunk
+ { u"tbbn3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, black background chunk
+ { u"tbgn2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, green background chunk
+ { u"tbgn3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, light-gray background chunk
+ { u"tbrn2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, red background chunk
+ { u"tbwn0g16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, white background chunk
+ { u"tbwn3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, white background chunk
+ { u"tbyn3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, yellow background chunk
+ { u"tp1n3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // transparent, but no background chunk
+ { u"tm3n3p02.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // multiple levels of transparency, 3 entries
+ // Gamma
+ { u"g03n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale, file-gamma = 0.35
+ { u"g03n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, file-gamma = 0.35
+ { u"g03n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, file-gamma = 0.35
+ { u"g04n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale, file-gamma = 0.45
+ { u"g04n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, file-gamma = 0.45
+ { u"g04n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, file-gamma = 0.45
+ { u"g05n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale, file-gamma = 0.55
+ { u"g05n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, file-gamma = 0.55
+ { u"g05n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, file-gamma = 0.55
+ { u"g07n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale, file-gamma = 0.70
+ { u"g07n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, file-gamma = 0.70
+ { u"g07n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, file-gamma = 0.70
+ { u"g10n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale, file-gamma = 1.00
+ { u"g10n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, file-gamma = 1.00
+ { u"g10n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, file-gamma = 1.00
+ { u"g25n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale, file-gamma = 2.50
+ { u"g25n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, file-gamma = 2.50
+ { u"g25n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, file-gamma = 2.50
+ // Image filtering
+ { u"f00n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale no interlacing, filter-type 0
+ { u"f00n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, filter-type 0
+ { u"f01n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale no interlacing, filter-type 1
+ { u"f01n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, filter-type 1
+ { u"f02n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale no interlacing, filter-type 2
+ { u"f02n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, filter-type 2
+ { u"f03n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale no interlacing, filter-type 3
+ { u"f03n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, filter-type 3
+ { u"f04n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale no interlacing, filter-type 4
+ { u"f04n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, filter-type 4
+ { u"f99n0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale bit-depth 4, filter changing per scanline
+ // Additional palettes
+ { u"pp0n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // six-cube palette-chunk in true-color image
+ { u"pp0n6a08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ true,
+ } }, // six-cube palette-chunk in true-color+alpha image
+ { u"ps1n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // six-cube suggested palette (1 byte) in grayscale image
+ { u"ps1n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // six-cube suggested palette (1 byte) in true-color image
+ { u"ps2n0g08.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // six-cube suggested palette (2 bytes) in grayscale image
+ { u"ps2n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // six-cube suggested palette (2 bytes) in true-color image
+ // Ancillary chunks
+ { u"ccwn2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // chroma chunk w:0.31270.329 r:0.640.33 g:0.300.60 b:0.15,0.06
+ { u"ccwn3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // chroma chunk w:0.31270.329 r:0.640.33 g:0.300.60 b:0.15,0.06
+ { u"cdfn2c08.png",
+ {
+ 8,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // physical pixel dimensions, 8x32 flat pixels
+ { u"cdhn2c08.png",
+ {
+ 32,
+ 8,
+ 24,
+ false,
+ false,
+ } }, // physical pixel dimensions, 32x8 high pixels
+ { u"cdsn2c08.png",
+ {
+ 8,
+ 8,
+ 24,
+ false,
+ false,
+ } }, // physical pixel dimensions, 8x8 square pixels
+ { u"cdun2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // physical pixel dimensions, 1000 pixels per 1 meter
+ { u"ch1n3p04.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // histogram 15 colors
+ { u"ch2n3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // histogram 256 colors
+ { u"cm0n0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale modification time, 01-jan-2000 12:34:56
+ { u"cm7n0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale modification time, 01-jan-1970 00:00:00
+ { u"cm9n0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale modification time, 31-dec-1999 23:59:59
+ { u"cs3n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, 13 significant bits
+ { u"cs3n3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, 3 significant bits
+ { u"cs5n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, 5 significant bits
+ { u"cs5n3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, 5 significant bits
+ { u"cs8n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color, 8 significant bits (reference)
+ { u"cs8n3p08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // paletted, 8 significant bits (reference)
+ { u"ct0n0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale no textual data
+ { u"ct1n0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale with textual data
+ { u"ctzn0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale with compressed textual data
+ { u"cten0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale international UTF-8, english
+ { u"ctfn0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale international UTF-8, finnish
+ { u"ctgn0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale international UTF-8, greek
+ { u"cthn0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale international UTF-8, hindi
+ { u"ctjn0g04.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale international UTF-8, japanese
+ { u"exif2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // chunk with jpeg exif data
+ // Chunk ordering
+ { u"oi1n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale mother image with 1 idat-chunk
+ { u"oi1n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color mother image with 1 idat-chunk
+ { u"oi2n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale image with 2 idat-chunks
+ { u"oi2n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color image with 2 idat-chunks
+ { u"oi4n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale image with 4 unequal sized idat-chunks
+ { u"oi4n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color image with 4 unequal sized idat-chunks
+ { u"oi9n0g16.png",
+ {
+ 32,
+ 32,
+ 8,
+ true,
+ false,
+ } }, // grayscale image with all idat-chunks length one
+ { u"oi9n2c16.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color image with all idat-chunks length one
+ // Zlib compression
+ { u"z00n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, compression level 0 (none)
+ { u"z03n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, compression level 3
+ { u"z06n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, compression level 6 (default)
+ { u"z09n2c08.png",
+ {
+ 32,
+ 32,
+ 24,
+ false,
+ false,
+ } }, // color no interlacing, compression level 9 (maximum)
+ };
+
+ for (const auto & [ aCaseName, aCase ] : aCases)
+ {
+ checkImportExportPng(getFullUrl(aCaseName), aCase);
+ }
+
+ OUString aCorruptedFilenames[] = {
+ "xs1n0g01.png", // signature byte 1 MSBit reset to zero
+ "xs2n0g01.png", // signature byte 2 is a 'Q'
+ "xs4n0g01.png", // signature byte 4 lowercase
+ "xs7n0g01.png", // 7th byte a space instead of control-Z
+ "xcrn0g04.png", // added cr bytes
+ "xlfn0g04.png", // added lf bytes
+ "xhdn0g08.png", // incorrect IHDR checksum
+ "xc1n0g08.png", // color type 1
+ "xc9n2c08.png", // color type 9
+ "xd0n2c08.png", // bit-depth 0
+ "xd3n2c08.png", // bit-depth 3
+ "xd9n2c08.png", // bit-depth 99
+ "xdtn0g01.png", // missing IDAT chunk
+ "xcsn0g01.png", // incorrect IDAT checksum
+ };
+
+ for (const auto& aFilename : aCorruptedFilenames)
+ {
+ checkImportCorruptedPng(getFullUrl(aFilename));
+ }
+}
+
+void PngFilterTest::testMsGifInPng()
+{
+ GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+ {
+ Graphic aGraphic;
+ const OUString aURL(getFullUrl(u"ms-gif.png"));
+ SvFileStream aFileStream(aURL, StreamMode::READ);
+ ErrCode aResult = rFilter.ImportGraphic(aGraphic, aURL, aFileStream);
+ CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, aResult);
+ CPPUNIT_ASSERT(aGraphic.IsGfxLink());
+ // The image is technically a PNG, but it has an animated Gif as a chunk (Microsoft extension).
+ CPPUNIT_ASSERT_EQUAL(GfxLinkType::NativeGif, aGraphic.GetSharedGfxLink()->GetType());
+ CPPUNIT_ASSERT(aGraphic.IsAnimated());
+ }
+ {
+ // Tests msOG chunk export support
+ const OUString aURL(getFullUrl(u"dummy.gif"));
+ SvFileStream aGIFStream(aURL, StreamMode::READ);
+ sal_uInt32 nGIFSize = aGIFStream.TellEnd();
+ const char* const pHeader = "MSOFFICE9.0";
+ auto nHeaderSize = strlen(pHeader);
+ uno::Sequence<sal_Int8> aGIFSequence(nHeaderSize + nGIFSize);
+ sal_Int8* pSequence = aGIFSequence.getArray();
+ for (size_t i = 0; i < nHeaderSize; i++)
+ *pSequence++ = pHeader[i];
+ aGIFStream.Seek(STREAM_SEEK_TO_BEGIN);
+ aGIFStream.ReadBytes(pSequence, nGIFSize);
+ // Create msOG chunk
+ beans::PropertyValue aChunkProperty, aFilterProperty;
+ aChunkProperty.Name = "msOG";
+ aChunkProperty.Value <<= aGIFSequence;
+ uno::Sequence<beans::PropertyValue> aAdditionalChunkSequence{ aChunkProperty };
+ aFilterProperty.Name = "AdditionalChunks";
+ aFilterProperty.Value <<= aAdditionalChunkSequence;
+ uno::Sequence<beans::PropertyValue> aPNGParameters{ aFilterProperty };
+ // Export the png with the chunk
+ utl::TempFileNamed aTempFile(u"testPngExportMsGif", true, u".png");
+ if (!bKeepTemp)
+ aTempFile.EnableKillingFile();
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::WRITE);
+ BitmapEx aDummyBitmap(Size(8, 8), vcl::PixelFormat::N24_BPP);
+ vcl::PngImageWriter aPngWriter(rStream);
+ aPngWriter.setParameters(aPNGParameters);
+ bool bWriteSuccess = aPngWriter.write(aDummyBitmap);
+ CPPUNIT_ASSERT_EQUAL(true, bWriteSuccess);
+ aTempFile.CloseStream();
+ }
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::READ);
+ rStream.Seek(0);
+ // Import the png and check that it is a gif
+ Graphic aGraphic;
+ ErrCode aResult = rFilter.ImportGraphic(aGraphic, aTempFile.GetURL(), rStream);
+ CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, aResult);
+ CPPUNIT_ASSERT(aGraphic.IsGfxLink());
+ CPPUNIT_ASSERT_EQUAL(GfxLinkType::NativeGif, aGraphic.GetSharedGfxLink()->GetType());
+ CPPUNIT_ASSERT(aGraphic.IsAnimated());
+ }
+ }
+}
+
+void PngFilterTest::testPngRoundtrip8BitGrey()
+{
+ utl::TempFileNamed aTempFile(u"testPngRoundtrip8BitGrey");
+ if (!bKeepTemp)
+ aTempFile.EnableKillingFile();
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::WRITE);
+ Bitmap aBitmap(Size(16, 16), vcl::PixelFormat::N8_BPP, &Bitmap::GetGreyPalette(256));
+ {
+ BitmapScopedWriteAccess pWriteAccess(aBitmap);
+ pWriteAccess->Erase(COL_BLACK);
+ for (int i = 0; i < 8; ++i)
+ {
+ for (int j = 0; j < 8; ++j)
+ {
+ pWriteAccess->SetPixel(i, j, COL_GRAY);
+ }
+ }
+ for (int i = 8; i < 16; ++i)
+ {
+ for (int j = 8; j < 16; ++j)
+ {
+ pWriteAccess->SetPixel(i, j, COL_LIGHTGRAY);
+ }
+ }
+ }
+ BitmapEx aBitmapEx(aBitmap);
+
+ vcl::PngImageWriter aPngWriter(rStream);
+ CPPUNIT_ASSERT_EQUAL(true, aPngWriter.write(aBitmapEx));
+ aTempFile.CloseStream();
+ }
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::READ);
+
+ vcl::PngImageReader aPngReader(rStream);
+ BitmapEx aBitmapEx;
+ CPPUNIT_ASSERT_EQUAL(true, aPngReader.read(aBitmapEx));
+
+ CPPUNIT_ASSERT_EQUAL(Size(16, 16), aBitmapEx.GetSizePixel());
+
+ CPPUNIT_ASSERT_EQUAL(COL_GRAY, aBitmapEx.GetPixelColor(0, 0));
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTGRAY, aBitmapEx.GetPixelColor(15, 15));
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, aBitmapEx.GetPixelColor(15, 0));
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, aBitmapEx.GetPixelColor(0, 15));
+ }
+}
+
+void PngFilterTest::testPngRoundtrip24()
+{
+ utl::TempFileNamed aTempFile(u"testPngRoundtrip24");
+ if (!bKeepTemp)
+ aTempFile.EnableKillingFile();
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::WRITE);
+ Bitmap aBitmap(Size(16, 16), vcl::PixelFormat::N24_BPP);
+ {
+ BitmapScopedWriteAccess pWriteAccess(aBitmap);
+ pWriteAccess->Erase(COL_BLACK);
+ for (int i = 0; i < 8; ++i)
+ {
+ for (int j = 0; j < 8; ++j)
+ {
+ pWriteAccess->SetPixel(i, j, COL_LIGHTRED);
+ }
+ }
+ for (int i = 8; i < 16; ++i)
+ {
+ for (int j = 8; j < 16; ++j)
+ {
+ pWriteAccess->SetPixel(i, j, COL_LIGHTBLUE);
+ }
+ }
+ }
+ BitmapEx aBitmapEx(aBitmap);
+
+ vcl::PngImageWriter aPngWriter(rStream);
+ CPPUNIT_ASSERT_EQUAL(true, aPngWriter.write(aBitmapEx));
+ }
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::READ);
+ rStream.Seek(0);
+
+ vcl::PngImageReader aPngReader(rStream);
+ BitmapEx aBitmapEx;
+ CPPUNIT_ASSERT_EQUAL(true, aPngReader.read(aBitmapEx));
+
+ CPPUNIT_ASSERT_EQUAL(Size(16, 16), aBitmapEx.GetSizePixel());
+
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, aBitmapEx.GetPixelColor(0, 0));
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTBLUE, aBitmapEx.GetPixelColor(15, 15));
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, aBitmapEx.GetPixelColor(15, 0));
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, aBitmapEx.GetPixelColor(0, 15));
+ }
+}
+
+void PngFilterTest::testPngRoundtrip24_8()
+{
+ utl::TempFileNamed aTempFile(u"testPngRoundtrip24_8");
+ if (!bKeepTemp)
+ aTempFile.EnableKillingFile();
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::WRITE);
+ Bitmap aBitmap(Size(16, 16), vcl::PixelFormat::N24_BPP);
+ AlphaMask aAlpha(Size(16, 16));
+ {
+ BitmapScopedWriteAccess pWriteAccessBitmap(aBitmap);
+ BitmapScopedWriteAccess pWriteAccessAlpha(aAlpha);
+ pWriteAccessAlpha->Erase(Color(0xAA, 0xAA, 0xAA));
+ pWriteAccessBitmap->Erase(COL_BLACK);
+ for (int i = 0; i < 8; ++i)
+ {
+ for (int j = 0; j < 8; ++j)
+ {
+ pWriteAccessBitmap->SetPixel(i, j, COL_LIGHTRED);
+ pWriteAccessAlpha->SetPixel(i, j, Color(0xBB, 0xBB, 0xBB));
+ }
+ }
+ for (int i = 8; i < 16; ++i)
+ {
+ for (int j = 8; j < 16; ++j)
+ {
+ pWriteAccessBitmap->SetPixel(i, j, COL_LIGHTBLUE);
+ pWriteAccessAlpha->SetPixel(i, j, Color(0xCC, 0xCC, 0xCC));
+ }
+ }
+ }
+ BitmapEx aBitmapEx(aBitmap, aAlpha);
+ vcl::PngImageWriter aPngWriter(rStream);
+ CPPUNIT_ASSERT_EQUAL(true, aPngWriter.write(aBitmapEx));
+ }
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::READ);
+ rStream.Seek(0);
+
+ vcl::PngImageReader aPngReader(rStream);
+ BitmapEx aBitmapEx;
+ CPPUNIT_ASSERT_EQUAL(true, aPngReader.read(aBitmapEx));
+
+ CPPUNIT_ASSERT_EQUAL(Size(16, 16), aBitmapEx.GetSizePixel());
+
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xBB, 0xFF, 0x00, 0x00),
+ aBitmapEx.GetPixelColor(0, 0));
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xCC, 0x00, 0x00, 0xFF),
+ aBitmapEx.GetPixelColor(15, 15));
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xAA, 0x00, 0x00, 0x00),
+ aBitmapEx.GetPixelColor(15, 0));
+ CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0xAA, 0x00, 0x00, 0x00),
+ aBitmapEx.GetPixelColor(0, 15));
+ }
+}
+
+void PngFilterTest::testPngRoundtrip32() {}
+
+void PngFilterTest::testPngWrite8BitRGBPalette()
+{
+ SvMemoryStream aExportStream;
+ BitmapPalette aRedPalette;
+ aRedPalette.SetEntryCount(256);
+ for (sal_uInt16 i = 0; i < 256; i++)
+ {
+ aRedPalette[i].SetRed(i);
+ aRedPalette[i].SetGreen(0);
+ aRedPalette[i].SetBlue(0);
+ }
+ {
+ Bitmap aBitmap(Size(16, 16), vcl::PixelFormat::N8_BPP, &aRedPalette);
+ {
+ BitmapScopedWriteAccess pWriteAccessBitmap(aBitmap);
+ for (int i = 0; i < 16; i++)
+ {
+ for (int j = 0; j < 16; j++)
+ {
+ pWriteAccessBitmap->SetPixelIndex(i, j, i * 16 + j);
+ }
+ }
+ }
+ BitmapEx aBitmapEx(aBitmap);
+ vcl::PngImageWriter aPngWriter(aExportStream);
+ CPPUNIT_ASSERT_EQUAL(true, aPngWriter.write(aBitmapEx));
+ }
+ aExportStream.Seek(0);
+ {
+ vcl::PngImageReader aPngReader(aExportStream);
+ BitmapEx aBitmapEx;
+ CPPUNIT_ASSERT_EQUAL(true, aPngReader.read(aBitmapEx));
+
+ CPPUNIT_ASSERT_EQUAL(Size(16, 16), aBitmapEx.GetSizePixel());
+
+ for (int i = 0; i < 16; i++)
+ {
+ for (int j = 0; j < 16; j++)
+ {
+ CPPUNIT_ASSERT_EQUAL(aRedPalette[i * 16 + j].GetRGBColor(),
+ aBitmapEx.GetPixelColor(j, i));
+ }
+ }
+ }
+}
+
+void PngFilterTest::testTdf153180MonochromeFilterPngExport()
+{
+ GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+
+ Graphic aGraphicOriginal;
+ {
+ // 3 * 16 bits rgb color alpha, no background chunk
+ const OUString aURL(getFullUrl(u"bgan6a16.png"));
+ SvFileStream aFileStream(aURL, StreamMode::READ);
+ ErrCode aResult = rFilter.ImportGraphic(aGraphicOriginal, aURL, aFileStream);
+ CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, aResult);
+ CPPUNIT_ASSERT(aGraphicOriginal.IsAlpha());
+ }
+
+ // Apply the monochrome filter to the graphic but keep the alpha.
+ BitmapEx aBitmapEx(aGraphicOriginal.GetBitmapEx());
+ AlphaMask aAlphaMask(aBitmapEx.GetAlphaMask());
+
+ BitmapEx aTmpBmpEx(aBitmapEx.GetBitmap());
+ BitmapFilter::Filter(aTmpBmpEx, BitmapMonochromeFilter{ sal_uInt8{ 127 } });
+
+ Graphic aGraphicAfterFilter{ BitmapEx(aTmpBmpEx.GetBitmap(), aAlphaMask) };
+ CPPUNIT_ASSERT(aGraphicAfterFilter.IsAlpha());
+
+ // export the resulting graphic
+ utl::TempFileNamed aTempFile(u"testPngExportTdf153180", true, u".png");
+ if (!bKeepTemp)
+ aTempFile.EnableKillingFile();
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::WRITE);
+ vcl::PngImageWriter aPngWriter(rStream);
+ bool bWriteSuccess = aPngWriter.write(aGraphicAfterFilter.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(true, bWriteSuccess);
+ aTempFile.CloseStream();
+ }
+ {
+ SvStream& rStream = *aTempFile.GetStream(StreamMode::READ);
+ rStream.Seek(0);
+ // Import the png and check that it still has alpha
+ Graphic aGraphic;
+ ErrCode aResult = rFilter.ImportGraphic(aGraphic, aTempFile.GetURL(), rStream);
+ CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, aResult);
+
+ // Without the accompanying patch would fail with:
+ // assertion failed
+ // -Expression : aGraphic.IsAlpha()
+ CPPUNIT_ASSERT(aGraphic.IsAlpha());
+ }
+}
+
+void PngFilterTest::testDump()
+{
+ utl::TempFileNamed aTempFile;
+ Bitmap aBitmap(Size(1, 1), vcl::PixelFormat::N24_BPP);
+ {
+ BitmapScopedWriteAccess pWriteAccessBitmap(aBitmap);
+ pWriteAccessBitmap->SetPixel(0, 0, BitmapColor());
+ }
+ BitmapEx aBitmapEx(aBitmap);
+ aBitmapEx.DumpAsPng(aTempFile.GetURL().toUtf8().getStr());
+ SvStream* pStream = aTempFile.GetStream(StreamMode::READ);
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_uInt64>(0), pStream->remainingSize());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(PngFilterTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qa/cppunit/png/data/alpha-rect-8bit-RGBA.png b/vcl/qa/cppunit/png/data/alpha-rect-8bit-RGBA.png
new file mode 100644
index 0000000000..1e90e1a6cf
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/alpha-rect-8bit-RGBA.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/apng_simple.apng b/vcl/qa/cppunit/png/data/apng_simple.apng
new file mode 100644
index 0000000000..445b7acaf4
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/apng_simple.apng
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi0g01.png b/vcl/qa/cppunit/png/data/basi0g01.png
new file mode 100644
index 0000000000..556fa72704
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi0g02.png b/vcl/qa/cppunit/png/data/basi0g02.png
new file mode 100644
index 0000000000..ce09821ef1
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi0g02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi0g04.png b/vcl/qa/cppunit/png/data/basi0g04.png
new file mode 100644
index 0000000000..3853273f93
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi0g08.png b/vcl/qa/cppunit/png/data/basi0g08.png
new file mode 100644
index 0000000000..faed8bec44
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi0g16.png b/vcl/qa/cppunit/png/data/basi0g16.png
new file mode 100644
index 0000000000..a9f28165ef
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi2c08.png b/vcl/qa/cppunit/png/data/basi2c08.png
new file mode 100644
index 0000000000..2aab44d42b
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi2c16.png b/vcl/qa/cppunit/png/data/basi2c16.png
new file mode 100644
index 0000000000..cd7e50f914
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi3p01.png b/vcl/qa/cppunit/png/data/basi3p01.png
new file mode 100644
index 0000000000..00a7cea6c2
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi3p02.png b/vcl/qa/cppunit/png/data/basi3p02.png
new file mode 100644
index 0000000000..bb16b44b30
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi3p04.png b/vcl/qa/cppunit/png/data/basi3p04.png
new file mode 100644
index 0000000000..b4e888e247
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi3p08.png b/vcl/qa/cppunit/png/data/basi3p08.png
new file mode 100644
index 0000000000..50a6d1cac7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi4a08.png b/vcl/qa/cppunit/png/data/basi4a08.png
new file mode 100644
index 0000000000..398132be5f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi4a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi4a16.png b/vcl/qa/cppunit/png/data/basi4a16.png
new file mode 100644
index 0000000000..51192e7311
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi4a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi6a08.png b/vcl/qa/cppunit/png/data/basi6a08.png
new file mode 100644
index 0000000000..aecb32e0d9
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi6a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basi6a16.png b/vcl/qa/cppunit/png/data/basi6a16.png
new file mode 100644
index 0000000000..4181533ad8
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basi6a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn0g01.png b/vcl/qa/cppunit/png/data/basn0g01.png
new file mode 100644
index 0000000000..1d722423aa
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn0g02.png b/vcl/qa/cppunit/png/data/basn0g02.png
new file mode 100644
index 0000000000..508332418f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn0g02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn0g04.png b/vcl/qa/cppunit/png/data/basn0g04.png
new file mode 100644
index 0000000000..0bf3687863
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn0g08.png b/vcl/qa/cppunit/png/data/basn0g08.png
new file mode 100644
index 0000000000..23c82379a2
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn0g16.png b/vcl/qa/cppunit/png/data/basn0g16.png
new file mode 100644
index 0000000000..e7c82f78eb
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn2c08.png b/vcl/qa/cppunit/png/data/basn2c08.png
new file mode 100644
index 0000000000..db5ad15865
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn2c16.png b/vcl/qa/cppunit/png/data/basn2c16.png
new file mode 100644
index 0000000000..50c1cb91a0
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn3p01.png b/vcl/qa/cppunit/png/data/basn3p01.png
new file mode 100644
index 0000000000..b145c2b8ef
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn3p02.png b/vcl/qa/cppunit/png/data/basn3p02.png
new file mode 100644
index 0000000000..8985b3d818
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn3p04.png b/vcl/qa/cppunit/png/data/basn3p04.png
new file mode 100644
index 0000000000..0fbf9e827b
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn3p08.png b/vcl/qa/cppunit/png/data/basn3p08.png
new file mode 100644
index 0000000000..0ddad07e5f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn4a08.png b/vcl/qa/cppunit/png/data/basn4a08.png
new file mode 100644
index 0000000000..3e13052201
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn4a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn4a16.png b/vcl/qa/cppunit/png/data/basn4a16.png
new file mode 100644
index 0000000000..8243644d07
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn4a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn6a08.png b/vcl/qa/cppunit/png/data/basn6a08.png
new file mode 100644
index 0000000000..e608738763
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn6a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/basn6a16.png b/vcl/qa/cppunit/png/data/basn6a16.png
new file mode 100644
index 0000000000..984a99525f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/basn6a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgai4a08.png b/vcl/qa/cppunit/png/data/bgai4a08.png
new file mode 100644
index 0000000000..398132be5f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgai4a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgai4a16.png b/vcl/qa/cppunit/png/data/bgai4a16.png
new file mode 100644
index 0000000000..51192e7311
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgai4a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgan6a08.png b/vcl/qa/cppunit/png/data/bgan6a08.png
new file mode 100644
index 0000000000..e608738763
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgan6a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgan6a16.png b/vcl/qa/cppunit/png/data/bgan6a16.png
new file mode 100644
index 0000000000..984a99525f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgan6a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgbn4a08.png b/vcl/qa/cppunit/png/data/bgbn4a08.png
new file mode 100644
index 0000000000..7cbefc3bff
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgbn4a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bggn4a16.png b/vcl/qa/cppunit/png/data/bggn4a16.png
new file mode 100644
index 0000000000..13fd85ba19
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bggn4a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgwn6a08.png b/vcl/qa/cppunit/png/data/bgwn6a08.png
new file mode 100644
index 0000000000..a67ff205bb
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgwn6a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/bgyn6a16.png b/vcl/qa/cppunit/png/data/bgyn6a16.png
new file mode 100644
index 0000000000..ae3e9be58a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/bgyn6a16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ccwn2c08.png b/vcl/qa/cppunit/png/data/ccwn2c08.png
new file mode 100644
index 0000000000..47c24817b7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ccwn2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ccwn3p08.png b/vcl/qa/cppunit/png/data/ccwn3p08.png
new file mode 100644
index 0000000000..8bb2c10981
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ccwn3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cdfn2c08.png b/vcl/qa/cppunit/png/data/cdfn2c08.png
new file mode 100644
index 0000000000..559e5261e7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cdfn2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cdhn2c08.png b/vcl/qa/cppunit/png/data/cdhn2c08.png
new file mode 100644
index 0000000000..3e07e8ecbd
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cdhn2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cdsn2c08.png b/vcl/qa/cppunit/png/data/cdsn2c08.png
new file mode 100644
index 0000000000..076c32cc08
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cdsn2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cdun2c08.png b/vcl/qa/cppunit/png/data/cdun2c08.png
new file mode 100644
index 0000000000..846033be6b
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cdun2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ch1n3p04.png b/vcl/qa/cppunit/png/data/ch1n3p04.png
new file mode 100644
index 0000000000..17cd12dfc9
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ch1n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ch2n3p08.png b/vcl/qa/cppunit/png/data/ch2n3p08.png
new file mode 100644
index 0000000000..25c17987a7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ch2n3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cm0n0g04.png b/vcl/qa/cppunit/png/data/cm0n0g04.png
new file mode 100644
index 0000000000..9fba5db3b8
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cm0n0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cm7n0g04.png b/vcl/qa/cppunit/png/data/cm7n0g04.png
new file mode 100644
index 0000000000..f7dc46e685
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cm7n0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cm9n0g04.png b/vcl/qa/cppunit/png/data/cm9n0g04.png
new file mode 100644
index 0000000000..dd70911adc
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cm9n0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/color-rect-4bit-pal.png b/vcl/qa/cppunit/png/data/color-rect-4bit-pal.png
new file mode 100644
index 0000000000..740eede512
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/color-rect-4bit-pal.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/color-rect-8bit-RGB-interlaced.png b/vcl/qa/cppunit/png/data/color-rect-8bit-RGB-interlaced.png
new file mode 100644
index 0000000000..17ca9a350d
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/color-rect-8bit-RGB-interlaced.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/color-rect-8bit-RGB.png b/vcl/qa/cppunit/png/data/color-rect-8bit-RGB.png
new file mode 100644
index 0000000000..727859d8a7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/color-rect-8bit-RGB.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cs3n2c16.png b/vcl/qa/cppunit/png/data/cs3n2c16.png
new file mode 100644
index 0000000000..bf5fd20a20
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cs3n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cs3n3p08.png b/vcl/qa/cppunit/png/data/cs3n3p08.png
new file mode 100644
index 0000000000..f4a66237bf
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cs3n3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cs5n2c08.png b/vcl/qa/cppunit/png/data/cs5n2c08.png
new file mode 100644
index 0000000000..40f947c33e
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cs5n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cs5n3p08.png b/vcl/qa/cppunit/png/data/cs5n3p08.png
new file mode 100644
index 0000000000..dfd6e6e6ec
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cs5n3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cs8n2c08.png b/vcl/qa/cppunit/png/data/cs8n2c08.png
new file mode 100644
index 0000000000..8e01d3294f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cs8n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cs8n3p08.png b/vcl/qa/cppunit/png/data/cs8n3p08.png
new file mode 100644
index 0000000000..a44066eb6e
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cs8n3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ct0n0g04.png b/vcl/qa/cppunit/png/data/ct0n0g04.png
new file mode 100644
index 0000000000..40d1e062f8
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ct0n0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ct1n0g04.png b/vcl/qa/cppunit/png/data/ct1n0g04.png
new file mode 100644
index 0000000000..3ba110aa76
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ct1n0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cten0g04.png b/vcl/qa/cppunit/png/data/cten0g04.png
new file mode 100644
index 0000000000..a6a56faf2b
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cten0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ctfn0g04.png b/vcl/qa/cppunit/png/data/ctfn0g04.png
new file mode 100644
index 0000000000..353873ebbd
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ctfn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ctgn0g04.png b/vcl/qa/cppunit/png/data/ctgn0g04.png
new file mode 100644
index 0000000000..453f2b0a49
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ctgn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/cthn0g04.png b/vcl/qa/cppunit/png/data/cthn0g04.png
new file mode 100644
index 0000000000..8fce253e6d
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/cthn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ctjn0g04.png b/vcl/qa/cppunit/png/data/ctjn0g04.png
new file mode 100644
index 0000000000..a77b8d2fee
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ctjn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ctzn0g04.png b/vcl/qa/cppunit/png/data/ctzn0g04.png
new file mode 100644
index 0000000000..b4401c9cfc
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ctzn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/dummy.gif b/vcl/qa/cppunit/png/data/dummy.gif
new file mode 100644
index 0000000000..fd5c62dcdc
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/dummy.gif
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/exif2c08.png b/vcl/qa/cppunit/png/data/exif2c08.png
new file mode 100644
index 0000000000..56eb734991
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/exif2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f00n0g08.png b/vcl/qa/cppunit/png/data/f00n0g08.png
new file mode 100644
index 0000000000..45a0075967
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f00n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f00n2c08.png b/vcl/qa/cppunit/png/data/f00n2c08.png
new file mode 100644
index 0000000000..d6a1ffff62
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f00n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f01n0g08.png b/vcl/qa/cppunit/png/data/f01n0g08.png
new file mode 100644
index 0000000000..4a1107b463
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f01n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f01n2c08.png b/vcl/qa/cppunit/png/data/f01n2c08.png
new file mode 100644
index 0000000000..26fee958ce
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f01n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f02n0g08.png b/vcl/qa/cppunit/png/data/f02n0g08.png
new file mode 100644
index 0000000000..bfe410c5e7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f02n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f02n2c08.png b/vcl/qa/cppunit/png/data/f02n2c08.png
new file mode 100644
index 0000000000..e590f12348
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f02n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f03n0g08.png b/vcl/qa/cppunit/png/data/f03n0g08.png
new file mode 100644
index 0000000000..ed01e2923c
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f03n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f03n2c08.png b/vcl/qa/cppunit/png/data/f03n2c08.png
new file mode 100644
index 0000000000..758115059d
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f03n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f04n0g08.png b/vcl/qa/cppunit/png/data/f04n0g08.png
new file mode 100644
index 0000000000..663fdae3e7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f04n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f04n2c08.png b/vcl/qa/cppunit/png/data/f04n2c08.png
new file mode 100644
index 0000000000..3c8b5116e7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f04n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/f99n0g04.png b/vcl/qa/cppunit/png/data/f99n0g04.png
new file mode 100644
index 0000000000..0b521c1d56
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/f99n0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g03n0g16.png b/vcl/qa/cppunit/png/data/g03n0g16.png
new file mode 100644
index 0000000000..41083ca80f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g03n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g03n2c08.png b/vcl/qa/cppunit/png/data/g03n2c08.png
new file mode 100644
index 0000000000..a9354dbee6
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g03n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g03n3p04.png b/vcl/qa/cppunit/png/data/g03n3p04.png
new file mode 100644
index 0000000000..60396c95af
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g03n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g04n0g16.png b/vcl/qa/cppunit/png/data/g04n0g16.png
new file mode 100644
index 0000000000..32395b76c9
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g04n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g04n2c08.png b/vcl/qa/cppunit/png/data/g04n2c08.png
new file mode 100644
index 0000000000..a652b0ce87
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g04n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g04n3p04.png b/vcl/qa/cppunit/png/data/g04n3p04.png
new file mode 100644
index 0000000000..5661cc3131
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g04n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g05n0g16.png b/vcl/qa/cppunit/png/data/g05n0g16.png
new file mode 100644
index 0000000000..70b37f01e2
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g05n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g05n2c08.png b/vcl/qa/cppunit/png/data/g05n2c08.png
new file mode 100644
index 0000000000..932c136536
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g05n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g05n3p04.png b/vcl/qa/cppunit/png/data/g05n3p04.png
new file mode 100644
index 0000000000..9619930585
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g05n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g07n0g16.png b/vcl/qa/cppunit/png/data/g07n0g16.png
new file mode 100644
index 0000000000..d6a47c2d57
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g07n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g07n2c08.png b/vcl/qa/cppunit/png/data/g07n2c08.png
new file mode 100644
index 0000000000..597346460f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g07n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g07n3p04.png b/vcl/qa/cppunit/png/data/g07n3p04.png
new file mode 100644
index 0000000000..c73fb61365
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g07n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g10n0g16.png b/vcl/qa/cppunit/png/data/g10n0g16.png
new file mode 100644
index 0000000000..85f2c958e9
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g10n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g10n2c08.png b/vcl/qa/cppunit/png/data/g10n2c08.png
new file mode 100644
index 0000000000..b3039970c1
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g10n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g10n3p04.png b/vcl/qa/cppunit/png/data/g10n3p04.png
new file mode 100644
index 0000000000..1b6a6be2ca
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g10n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g25n0g16.png b/vcl/qa/cppunit/png/data/g25n0g16.png
new file mode 100644
index 0000000000..a9f6787c7a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g25n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g25n2c08.png b/vcl/qa/cppunit/png/data/g25n2c08.png
new file mode 100644
index 0000000000..03f505a64b
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g25n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/g25n3p04.png b/vcl/qa/cppunit/png/data/g25n3p04.png
new file mode 100644
index 0000000000..4f943c6175
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/g25n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ms-gif.png b/vcl/qa/cppunit/png/data/ms-gif.png
new file mode 100644
index 0000000000..1f683241f5
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ms-gif.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi1n0g16.png b/vcl/qa/cppunit/png/data/oi1n0g16.png
new file mode 100644
index 0000000000..e7c82f78eb
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi1n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi1n2c16.png b/vcl/qa/cppunit/png/data/oi1n2c16.png
new file mode 100644
index 0000000000..50c1cb91a0
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi1n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi2n0g16.png b/vcl/qa/cppunit/png/data/oi2n0g16.png
new file mode 100644
index 0000000000..14d64c583d
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi2n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi2n2c16.png b/vcl/qa/cppunit/png/data/oi2n2c16.png
new file mode 100644
index 0000000000..4c2e3e3352
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi2n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi4n0g16.png b/vcl/qa/cppunit/png/data/oi4n0g16.png
new file mode 100644
index 0000000000..69e73ede31
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi4n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi4n2c16.png b/vcl/qa/cppunit/png/data/oi4n2c16.png
new file mode 100644
index 0000000000..93691e373a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi4n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi9n0g16.png b/vcl/qa/cppunit/png/data/oi9n0g16.png
new file mode 100644
index 0000000000..9248413576
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi9n0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/oi9n2c16.png b/vcl/qa/cppunit/png/data/oi9n2c16.png
new file mode 100644
index 0000000000..f0512e49f2
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/oi9n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/pp0n2c16.png b/vcl/qa/cppunit/png/data/pp0n2c16.png
new file mode 100644
index 0000000000..8f2aad7335
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/pp0n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/pp0n6a08.png b/vcl/qa/cppunit/png/data/pp0n6a08.png
new file mode 100644
index 0000000000..4ed7a30e4d
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/pp0n6a08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ps1n0g08.png b/vcl/qa/cppunit/png/data/ps1n0g08.png
new file mode 100644
index 0000000000..99625fa4ba
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ps1n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ps1n2c16.png b/vcl/qa/cppunit/png/data/ps1n2c16.png
new file mode 100644
index 0000000000..0c7a6b380e
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ps1n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ps2n0g08.png b/vcl/qa/cppunit/png/data/ps2n0g08.png
new file mode 100644
index 0000000000..90b2979685
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ps2n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/ps2n2c16.png b/vcl/qa/cppunit/png/data/ps2n2c16.png
new file mode 100644
index 0000000000..a4a181e4ec
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/ps2n2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/rect-1bit-pal.png b/vcl/qa/cppunit/png/data/rect-1bit-pal.png
new file mode 100644
index 0000000000..cf7ac3e7c3
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/rect-1bit-pal.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s01i3p01.png b/vcl/qa/cppunit/png/data/s01i3p01.png
new file mode 100644
index 0000000000..6c0fad1fc9
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s01i3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s01n3p01.png b/vcl/qa/cppunit/png/data/s01n3p01.png
new file mode 100644
index 0000000000..cb2c8c7826
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s01n3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s02i3p01.png b/vcl/qa/cppunit/png/data/s02i3p01.png
new file mode 100644
index 0000000000..2defaed911
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s02i3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s02n3p01.png b/vcl/qa/cppunit/png/data/s02n3p01.png
new file mode 100644
index 0000000000..2b1b669643
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s02n3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s03i3p01.png b/vcl/qa/cppunit/png/data/s03i3p01.png
new file mode 100644
index 0000000000..c23fdc4631
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s03i3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s03n3p01.png b/vcl/qa/cppunit/png/data/s03n3p01.png
new file mode 100644
index 0000000000..6d96ee4f87
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s03n3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s04i3p01.png b/vcl/qa/cppunit/png/data/s04i3p01.png
new file mode 100644
index 0000000000..0e710c2c39
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s04i3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s04n3p01.png b/vcl/qa/cppunit/png/data/s04n3p01.png
new file mode 100644
index 0000000000..956396c45b
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s04n3p01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s05i3p02.png b/vcl/qa/cppunit/png/data/s05i3p02.png
new file mode 100644
index 0000000000..d14cbd351a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s05i3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s05n3p02.png b/vcl/qa/cppunit/png/data/s05n3p02.png
new file mode 100644
index 0000000000..bf940f0576
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s05n3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s06i3p02.png b/vcl/qa/cppunit/png/data/s06i3p02.png
new file mode 100644
index 0000000000..456ada3200
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s06i3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s06n3p02.png b/vcl/qa/cppunit/png/data/s06n3p02.png
new file mode 100644
index 0000000000..501064dc25
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s06n3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s07i3p02.png b/vcl/qa/cppunit/png/data/s07i3p02.png
new file mode 100644
index 0000000000..44b66bab9e
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s07i3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s07n3p02.png b/vcl/qa/cppunit/png/data/s07n3p02.png
new file mode 100644
index 0000000000..6a582593d6
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s07n3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s08i3p02.png b/vcl/qa/cppunit/png/data/s08i3p02.png
new file mode 100644
index 0000000000..acf74f3fc4
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s08i3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s08n3p02.png b/vcl/qa/cppunit/png/data/s08n3p02.png
new file mode 100644
index 0000000000..b7094e1b4f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s08n3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s09i3p02.png b/vcl/qa/cppunit/png/data/s09i3p02.png
new file mode 100644
index 0000000000..0bfae8e456
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s09i3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s09n3p02.png b/vcl/qa/cppunit/png/data/s09n3p02.png
new file mode 100644
index 0000000000..711ab82451
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s09n3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s32i3p04.png b/vcl/qa/cppunit/png/data/s32i3p04.png
new file mode 100644
index 0000000000..0841910b72
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s32i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s32n3p04.png b/vcl/qa/cppunit/png/data/s32n3p04.png
new file mode 100644
index 0000000000..fa58e3e3f6
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s32n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s33i3p04.png b/vcl/qa/cppunit/png/data/s33i3p04.png
new file mode 100644
index 0000000000..ab0dc14aba
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s33i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s33n3p04.png b/vcl/qa/cppunit/png/data/s33n3p04.png
new file mode 100644
index 0000000000..764f1a3dc7
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s33n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s34i3p04.png b/vcl/qa/cppunit/png/data/s34i3p04.png
new file mode 100644
index 0000000000..bd99039be4
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s34i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s34n3p04.png b/vcl/qa/cppunit/png/data/s34n3p04.png
new file mode 100644
index 0000000000..9cbc68b3b9
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s34n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s35i3p04.png b/vcl/qa/cppunit/png/data/s35i3p04.png
new file mode 100644
index 0000000000..e2a5e0a659
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s35i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s35n3p04.png b/vcl/qa/cppunit/png/data/s35n3p04.png
new file mode 100644
index 0000000000..90b892ebaf
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s35n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s36i3p04.png b/vcl/qa/cppunit/png/data/s36i3p04.png
new file mode 100644
index 0000000000..eb61b6f9a3
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s36i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s36n3p04.png b/vcl/qa/cppunit/png/data/s36n3p04.png
new file mode 100644
index 0000000000..b38d179774
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s36n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s37i3p04.png b/vcl/qa/cppunit/png/data/s37i3p04.png
new file mode 100644
index 0000000000..6e2b1e9b79
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s37i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s37n3p04.png b/vcl/qa/cppunit/png/data/s37n3p04.png
new file mode 100644
index 0000000000..4d3054da51
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s37n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s38i3p04.png b/vcl/qa/cppunit/png/data/s38i3p04.png
new file mode 100644
index 0000000000..a0a8a140ad
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s38i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s38n3p04.png b/vcl/qa/cppunit/png/data/s38n3p04.png
new file mode 100644
index 0000000000..1233ed048e
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s38n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s39i3p04.png b/vcl/qa/cppunit/png/data/s39i3p04.png
new file mode 100644
index 0000000000..04fee93eae
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s39i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s39n3p04.png b/vcl/qa/cppunit/png/data/s39n3p04.png
new file mode 100644
index 0000000000..c750100d55
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s39n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s40i3p04.png b/vcl/qa/cppunit/png/data/s40i3p04.png
new file mode 100644
index 0000000000..68f358b822
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s40i3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/s40n3p04.png b/vcl/qa/cppunit/png/data/s40n3p04.png
new file mode 100644
index 0000000000..864b6b9673
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/s40n3p04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbbn0g04.png b/vcl/qa/cppunit/png/data/tbbn0g04.png
new file mode 100644
index 0000000000..39a7050d27
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbbn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbbn2c16.png b/vcl/qa/cppunit/png/data/tbbn2c16.png
new file mode 100644
index 0000000000..dd3168e5c8
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbbn2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbbn3p08.png b/vcl/qa/cppunit/png/data/tbbn3p08.png
new file mode 100644
index 0000000000..0ede3574db
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbbn3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbgn2c16.png b/vcl/qa/cppunit/png/data/tbgn2c16.png
new file mode 100644
index 0000000000..85cec395c0
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbgn2c16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbgn3p08.png b/vcl/qa/cppunit/png/data/tbgn3p08.png
new file mode 100644
index 0000000000..8cf2e6fb6a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbgn3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbrn2c08.png b/vcl/qa/cppunit/png/data/tbrn2c08.png
new file mode 100644
index 0000000000..5cca0d6210
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbrn2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbwn0g16.png b/vcl/qa/cppunit/png/data/tbwn0g16.png
new file mode 100644
index 0000000000..99bdeed2b3
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbwn0g16.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbwn3p08.png b/vcl/qa/cppunit/png/data/tbwn3p08.png
new file mode 100644
index 0000000000..eacab7a144
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbwn3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tbyn3p08.png b/vcl/qa/cppunit/png/data/tbyn3p08.png
new file mode 100644
index 0000000000..656db0989a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tbyn3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tm3n3p02.png b/vcl/qa/cppunit/png/data/tm3n3p02.png
new file mode 100644
index 0000000000..fb3ef1d0c5
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tm3n3p02.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/tp1n3p08.png b/vcl/qa/cppunit/png/data/tp1n3p08.png
new file mode 100644
index 0000000000..a6c9f35a86
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/tp1n3p08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xc1n0g08.png b/vcl/qa/cppunit/png/data/xc1n0g08.png
new file mode 100644
index 0000000000..9404227370
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xc1n0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xc9n2c08.png b/vcl/qa/cppunit/png/data/xc9n2c08.png
new file mode 100644
index 0000000000..b11c2a7b40
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xc9n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xcrn0g04.png b/vcl/qa/cppunit/png/data/xcrn0g04.png
new file mode 100644
index 0000000000..48abba193a
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xcrn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xcsn0g01.png b/vcl/qa/cppunit/png/data/xcsn0g01.png
new file mode 100644
index 0000000000..9863a262ca
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xcsn0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xd0n2c08.png b/vcl/qa/cppunit/png/data/xd0n2c08.png
new file mode 100644
index 0000000000..2f001610a8
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xd0n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xd3n2c08.png b/vcl/qa/cppunit/png/data/xd3n2c08.png
new file mode 100644
index 0000000000..9e4a3ff7ac
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xd3n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xd9n2c08.png b/vcl/qa/cppunit/png/data/xd9n2c08.png
new file mode 100644
index 0000000000..2c3b91aa4f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xd9n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xdtn0g01.png b/vcl/qa/cppunit/png/data/xdtn0g01.png
new file mode 100644
index 0000000000..1a81abef82
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xdtn0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xhdn0g08.png b/vcl/qa/cppunit/png/data/xhdn0g08.png
new file mode 100644
index 0000000000..fcb8737fa2
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xhdn0g08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xlfn0g04.png b/vcl/qa/cppunit/png/data/xlfn0g04.png
new file mode 100644
index 0000000000..d9ec53ed94
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xlfn0g04.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xs1n0g01.png b/vcl/qa/cppunit/png/data/xs1n0g01.png
new file mode 100644
index 0000000000..1817c5144f
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xs1n0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xs2n0g01.png b/vcl/qa/cppunit/png/data/xs2n0g01.png
new file mode 100644
index 0000000000..b8147f2a84
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xs2n0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xs4n0g01.png b/vcl/qa/cppunit/png/data/xs4n0g01.png
new file mode 100644
index 0000000000..45237a1d29
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xs4n0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/xs7n0g01.png b/vcl/qa/cppunit/png/data/xs7n0g01.png
new file mode 100644
index 0000000000..3f307f14ea
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/xs7n0g01.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/z00n2c08.png b/vcl/qa/cppunit/png/data/z00n2c08.png
new file mode 100644
index 0000000000..7669eb8385
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/z00n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/z03n2c08.png b/vcl/qa/cppunit/png/data/z03n2c08.png
new file mode 100644
index 0000000000..bfb10de8de
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/z03n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/z06n2c08.png b/vcl/qa/cppunit/png/data/z06n2c08.png
new file mode 100644
index 0000000000..b90ebc10f5
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/z06n2c08.png
Binary files differ
diff --git a/vcl/qa/cppunit/png/data/z09n2c08.png b/vcl/qa/cppunit/png/data/z09n2c08.png
new file mode 100644
index 0000000000..5f191a78ee
--- /dev/null
+++ b/vcl/qa/cppunit/png/data/z09n2c08.png
Binary files differ