diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-06-02 11:04:41 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-06-02 13:27:52 +0200 |
commit | 5c0cee64b9430da404fa52988871fae6a5dd9f41 (patch) | |
tree | 6a6c5a36730d5815986c4a00459db5f4a12f9f03 /vcl/unx/generic | |
parent | 70c477e80bb0b345f64c54cae681f7eba12a7968 (diff) |
no need to assign a nullptr after a bad_alloc
since if the allocation failed, the assignment would never happen
Also use early exit to simplify the code in X11SalBitmap::ImplCreateDIB
Change-Id: I73301bfad6492c2b42c08744c24cfb78237983f0
Reviewed-on: https://gerrit.libreoffice.org/38346
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'vcl/unx/generic')
-rw-r--r-- | vcl/unx/generic/gdi/salbmp.cxx | 165 |
1 files changed, 80 insertions, 85 deletions
diff --git a/vcl/unx/generic/gdi/salbmp.cxx b/vcl/unx/generic/gdi/salbmp.cxx index 00043d5e783e..8401fa8e3b24 100644 --- a/vcl/unx/generic/gdi/salbmp.cxx +++ b/vcl/unx/generic/gdi/salbmp.cxx @@ -135,105 +135,100 @@ BitmapBuffer* X11SalBitmap::ImplCreateDIB( BitmapBuffer* pDIB = nullptr; - if( rSize.Width() && rSize.Height() ) + if( !rSize.Width() || !rSize.Height() ) + return nullptr; + + try { - try - { - pDIB = new BitmapBuffer; - } - catch (const std::bad_alloc&) - { - pDIB = nullptr; - } + pDIB = new BitmapBuffer; + } + catch (const std::bad_alloc&) + { + return nullptr; + } - if( pDIB ) - { - const sal_uInt16 nColors = ( nBitCount <= 8 ) ? ( 1 << nBitCount ) : 0; + const sal_uInt16 nColors = ( nBitCount <= 8 ) ? ( 1 << nBitCount ) : 0; - pDIB->mnFormat = ScanlineFormat::NONE; + pDIB->mnFormat = ScanlineFormat::NONE; - switch( nBitCount ) - { - case 1: pDIB->mnFormat |= ScanlineFormat::N1BitMsbPal; break; - case 4: pDIB->mnFormat |= ScanlineFormat::N4BitMsnPal; break; - case 8: pDIB->mnFormat |= ScanlineFormat::N8BitPal; break; + switch( nBitCount ) + { + case 1: pDIB->mnFormat |= ScanlineFormat::N1BitMsbPal; break; + case 4: pDIB->mnFormat |= ScanlineFormat::N4BitMsnPal; break; + case 8: pDIB->mnFormat |= ScanlineFormat::N8BitPal; break; #ifdef OSL_BIGENDIAN - case 16: - { - pDIB->mnFormat|= ScanlineFormat::N16BitTcMsbMask; - ColorMaskElement aRedMask(0xf800); - aRedMask.CalcMaskShift(); - ColorMaskElement aGreenMask(0x07e0); - aGreenMask.CalcMaskShift(); - ColorMaskElement aBlueMask(0x001f); - aBlueMask.CalcMaskShift(); - pDIB->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask); - break; - } + case 16: + { + pDIB->mnFormat|= ScanlineFormat::N16BitTcMsbMask; + ColorMaskElement aRedMask(0xf800); + aRedMask.CalcMaskShift(); + ColorMaskElement aGreenMask(0x07e0); + aGreenMask.CalcMaskShift(); + ColorMaskElement aBlueMask(0x001f); + aBlueMask.CalcMaskShift(); + pDIB->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask); + break; + } #else - case 16: - { - pDIB->mnFormat|= ScanlineFormat::N16BitTcLsbMask; - ColorMaskElement aRedMask(0xf800); - aRedMask.CalcMaskShift(); - ColorMaskElement aGreenMask(0x07e0); - aGreenMask.CalcMaskShift(); - ColorMaskElement aBlueMask(0x001f); - aBlueMask.CalcMaskShift(); - pDIB->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask); - break; - } + case 16: + { + pDIB->mnFormat|= ScanlineFormat::N16BitTcLsbMask; + ColorMaskElement aRedMask(0xf800); + aRedMask.CalcMaskShift(); + ColorMaskElement aGreenMask(0x07e0); + aGreenMask.CalcMaskShift(); + ColorMaskElement aBlueMask(0x001f); + aBlueMask.CalcMaskShift(); + pDIB->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask); + break; + } #endif - default: - nBitCount = 24; - SAL_FALLTHROUGH; - case 24: - pDIB->mnFormat |= ScanlineFormat::N24BitTcBgr; - break; - } + default: + nBitCount = 24; + SAL_FALLTHROUGH; + case 24: + pDIB->mnFormat |= ScanlineFormat::N24BitTcBgr; + break; + } - pDIB->mnWidth = rSize.Width(); - pDIB->mnHeight = rSize.Height(); - long nScanlineBase; - bool bFail = o3tl::checked_multiply<long>(pDIB->mnWidth, nBitCount, nScanlineBase); - if (bFail) - { - SAL_WARN("vcl.gdi", "checked multiply failed"); - delete pDIB; - return nullptr; - } - pDIB->mnScanlineSize = AlignedWidth4Bytes(nScanlineBase); - if (pDIB->mnScanlineSize < nScanlineBase/8) - { - SAL_WARN("vcl.gdi", "scanline calculation wraparound"); - delete pDIB; - return nullptr; - } - pDIB->mnBitCount = nBitCount; + pDIB->mnWidth = rSize.Width(); + pDIB->mnHeight = rSize.Height(); + long nScanlineBase; + bool bFail = o3tl::checked_multiply<long>(pDIB->mnWidth, nBitCount, nScanlineBase); + if (bFail) + { + SAL_WARN("vcl.gdi", "checked multiply failed"); + delete pDIB; + return nullptr; + } + pDIB->mnScanlineSize = AlignedWidth4Bytes(nScanlineBase); + if (pDIB->mnScanlineSize < nScanlineBase/8) + { + SAL_WARN("vcl.gdi", "scanline calculation wraparound"); + delete pDIB; + return nullptr; + } + pDIB->mnBitCount = nBitCount; - if( nColors ) - { - pDIB->maPalette = rPal; - pDIB->maPalette.SetEntryCount( nColors ); - } + if( nColors ) + { + pDIB->maPalette = rPal; + pDIB->maPalette.SetEntryCount( nColors ); + } - try - { - pDIB->mpBits = new sal_uInt8[ pDIB->mnScanlineSize * pDIB->mnHeight ]; + try + { + pDIB->mpBits = new sal_uInt8[ pDIB->mnScanlineSize * pDIB->mnHeight ]; #if defined HAVE_VALGRIND_HEADERS - if (RUNNING_ON_VALGRIND) - blankExtraSpace(pDIB); + if (RUNNING_ON_VALGRIND) + blankExtraSpace(pDIB); #endif - } - catch (const std::bad_alloc&) - { - delete pDIB; - pDIB = nullptr; - } - } } - else + catch (const std::bad_alloc&) + { + delete pDIB; pDIB = nullptr; + } return pDIB; } |