[Libreoffice-commits] core.git: vcl/source
LuboÅ¡ LuÅák (via logerrit)
logerrit at kemper.freedesktop.org
Thu Apr 15 19:15:16 UTC 2021
vcl/source/filter/png/PngImageReader.cxx | 31 +++++++++----------------------
1 file changed, 9 insertions(+), 22 deletions(-)
New commits:
commit 272a639bd8ea7c85d6f12dc2e217e79280a1a196
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Thu Apr 15 16:33:11 2021 +0200
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Thu Apr 15 21:14:25 2021 +0200
automatic png_struct cleanup
Change-Id: I77f3c5070b4481e4c349bac51ddc55218cd0654b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114164
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/vcl/source/filter/png/PngImageReader.cxx b/vcl/source/filter/png/PngImageReader.cxx
index 7c32188c22ba..b3a2265c23bf 100644
--- a/vcl/source/filter/png/PngImageReader.cxx
+++ b/vcl/source/filter/png/PngImageReader.cxx
@@ -58,6 +58,13 @@ bool isPng(SvStream& rStream)
return png_sig_cmp(aHeader, 0, PNG_SIGNATURE_SIZE) == 0;
}
+struct PngDestructor
+{
+ ~PngDestructor() { png_destroy_read_struct(&pPng, &pInfo, nullptr); }
+ png_structp pPng;
+ png_infop pInfo;
+};
+
bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
{
if (!isPng(rStream))
@@ -74,6 +81,8 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
return false;
}
+ PngDestructor pngDestructor = { pPng, pInfo };
+
// All variables holding resources need to be declared here in order to be
// properly cleaned up in case of an error, otherwise libpng's longjmp()
// jumps over the destructor calls.
@@ -86,7 +95,6 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
if (setjmp(png_jmpbuf(pPng)))
{
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
// Set the bitmap if it contains something, even on failure. This allows
// reading images that are only partially broken.
pWriteAccess.reset();
@@ -126,10 +134,7 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
&interlace, nullptr, nullptr);
if (returnValue != 1)
- {
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
- }
if (colorType == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(pPng);
@@ -163,16 +168,12 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
nullptr, nullptr);
if (returnValue != 1)
- {
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
- }
if (bitDepth != 8
|| (colorType != PNG_COLOR_TYPE_RGB && colorType != PNG_COLOR_TYPE_RGB_ALPHA
&& colorType != PNG_COLOR_TYPE_GRAY))
{
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
}
@@ -192,10 +193,7 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
aBitmap = Bitmap(Size(width, height), vcl::PixelFormat::N24_BPP);
pWriteAccess = BitmapScopedWriteAccess(aBitmap);
if (!pWriteAccess)
- {
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
- }
ScanlineFormat eFormat = pWriteAccess->GetScanlineFormat();
if (eFormat == ScanlineFormat::N24BitTcBgr)
png_set_bgr(pPng);
@@ -220,10 +218,7 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
aBitmap = Bitmap(Size(width, height), vcl::PixelFormat::N32_BPP);
pWriteAccess = BitmapScopedWriteAccess(aBitmap);
if (!pWriteAccess)
- {
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
- }
ScanlineFormat eFormat = pWriteAccess->GetScanlineFormat();
if (eFormat == ScanlineFormat::N32BitTcAbgr || eFormat == ScanlineFormat::N32BitTcBgra)
{
@@ -277,10 +272,7 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
aBitmapAlpha = AlphaMask(Size(width, height), nullptr);
pWriteAccess = BitmapScopedWriteAccess(aBitmap);
if (!pWriteAccess)
- {
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
- }
ScanlineFormat eFormat = pWriteAccess->GetScanlineFormat();
if (eFormat == ScanlineFormat::N24BitTcBgr)
png_set_bgr(pPng);
@@ -322,10 +314,7 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
aBitmap.Erase(COL_WHITE);
pWriteAccess = BitmapScopedWriteAccess(aBitmap);
if (!pWriteAccess)
- {
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
return false;
- }
for (int pass = 0; pass < nNumberOfPasses; pass++)
{
@@ -341,8 +330,6 @@ bool reader(SvStream& rStream, BitmapEx& rBitmapEx, bool bUseBitmap32)
png_read_end(pPng, pInfo);
- png_destroy_read_struct(&pPng, &pInfo, nullptr);
-
if (!prefSize.IsEmpty())
{
rBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM));
More information about the Libreoffice-commits
mailing list