vcl/source/filter/png/PngImageReader.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
New commits: commit 0387077e6647d7a30fd36d4ec41dfc559afe45c3 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Wed Sep 23 12:01:35 2020 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Wed Sep 23 16:13:00 2020 +0200 Correctly read PNG into bitmaps N32BitTcA... formats (where alpha comes first) This appears to be a regression introduced with 86ea64f216819696cd86d1926aff0a138ace2baf "Support for native 32bit Bitmap in VCL and SVP (cairo) backend". It caused CppunitTest_vcl_png_test to fail on (big-endian) Linux s390x with > vcl/qa/cppunit/png/PngFilterTest.cxx:176:PngFilterTest::testPng > equality assertion failed > - Expected: c[ff000040] > - Actual : c[0000ff40] where eFormat happens to be ScanlineFormat::N32BitTcArgb, vs. ScanlineFormat::N32BitTcBgra on e.g. Linux x86-64 (and which thus didn't notice the lack of support for N32BitTcA... formats where alpha goes first instead of last). Change-Id: Id6030468718f6ef831b42f2b5ad7ba2c4c46a805 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103240 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/vcl/source/filter/png/PngImageReader.cxx b/vcl/source/filter/png/PngImageReader.cxx index fae4b29a339a..ab5097bfce2c 100644 --- a/vcl/source/filter/png/PngImageReader.cxx +++ b/vcl/source/filter/png/PngImageReader.cxx @@ -187,6 +187,8 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32) for (auto& rRow : aRows) rRow.resize(aRowSizeBytes, 0); + auto const alphaFirst = (eFormat == ScanlineFormat::N32BitTcAbgr + || eFormat == ScanlineFormat::N32BitTcArgb); for (int pass = 0; pass < nNumberOfPasses; pass++) { for (png_uint_32 y = 0; y < height; y++) @@ -198,10 +200,17 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32) for (size_t i = 0; i < aRowSizeBytes; i += 4) { sal_Int8 alpha = pRow[i + 3]; + if (alphaFirst) + { + pScanline[iColor++] = alpha; + } pScanline[iColor++] = vcl::bitmap::premultiply(pRow[i + 0], alpha); pScanline[iColor++] = vcl::bitmap::premultiply(pRow[i + 1], alpha); pScanline[iColor++] = vcl::bitmap::premultiply(pRow[i + 2], alpha); - pScanline[iColor++] = alpha; + if (!alphaFirst) + { + pScanline[iColor++] = alpha; + } } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits