diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2014-06-06 12:07:49 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-06-06 16:40:17 +0100 |
commit | adb1bb21f804c62004f31ad5473d4cf447436b9b (patch) | |
tree | dedb449971fc1b1f51148104534235084a9bc61d /vcl/win/source | |
parent | a10a621b48a30904b970ce01cc0bf2aa15cea9cb (diff) |
Resolves: #i125000# check last status of newly created...
<Gdiplus::Bitmap> instance before using it.
(cherry picked from commit b127235917610b9c68e19df29bb39af496906569)
Change-Id: I97364cf963424b0e8d0b52b3c995bd4defdca067
Diffstat (limited to 'vcl/win/source')
-rw-r--r-- | vcl/win/source/gdi/salbmp.cxx | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/vcl/win/source/gdi/salbmp.cxx b/vcl/win/source/gdi/salbmp.cxx index 30606d8e07be..445839e5b2b9 100644 --- a/vcl/win/source/gdi/salbmp.cxx +++ b/vcl/win/source/gdi/salbmp.cxx @@ -317,24 +317,32 @@ Gdiplus::Bitmap* WinSalBitmap::ImplCreateGdiPlusBitmap() if(pRetval) { - sal_uInt8* pSrcRGB(pRGB->mpBits); - const sal_uInt32 nExtraRGB(pRGB->mnScanlineSize - (nW * 3)); - const bool bTopDown(pRGB->mnFormat & BMP_FORMAT_TOP_DOWN); - const Gdiplus::Rect aAllRect(0, 0, nW, nH); - Gdiplus::BitmapData aGdiPlusBitmapData; - pRetval->LockBits(&aAllRect, Gdiplus::ImageLockModeWrite, PixelFormat24bppRGB, &aGdiPlusBitmapData); - - // copy data to Gdiplus::Bitmap; format is BGR here in both cases, so memcpy is possible - for(sal_uInt32 y(0); y < nH; y++) + if ( pRetval->GetLastStatus() == Gdiplus::Ok ) { - const sal_uInt32 nYInsert(bTopDown ? y : nH - y - 1); - sal_uInt8* targetPixels = (sal_uInt8*)aGdiPlusBitmapData.Scan0 + (nYInsert * aGdiPlusBitmapData.Stride); + sal_uInt8* pSrcRGB(pRGB->mpBits); + const sal_uInt32 nExtraRGB(pRGB->mnScanlineSize - (nW * 3)); + const bool bTopDown(pRGB->mnFormat & BMP_FORMAT_TOP_DOWN); + const Gdiplus::Rect aAllRect(0, 0, nW, nH); + Gdiplus::BitmapData aGdiPlusBitmapData; + pRetval->LockBits(&aAllRect, Gdiplus::ImageLockModeWrite, PixelFormat24bppRGB, &aGdiPlusBitmapData); + + // copy data to Gdiplus::Bitmap; format is BGR here in both cases, so memcpy is possible + for(sal_uInt32 y(0); y < nH; y++) + { + const sal_uInt32 nYInsert(bTopDown ? y : nH - y - 1); + sal_uInt8* targetPixels = (sal_uInt8*)aGdiPlusBitmapData.Scan0 + (nYInsert * aGdiPlusBitmapData.Stride); - memcpy(targetPixels, pSrcRGB, nW * 3); - pSrcRGB += nW * 3 + nExtraRGB; - } + memcpy(targetPixels, pSrcRGB, nW * 3); + pSrcRGB += nW * 3 + nExtraRGB; + } - pRetval->UnlockBits(&aGdiPlusBitmapData); + pRetval->UnlockBits(&aGdiPlusBitmapData); + } + else + { + delete pRetval; + pRetval = NULL; + } } } |