diff options
author | Armin Le Grand <alg@apache.org> | 2013-08-28 11:15:41 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-08-28 15:34:16 +0100 |
commit | 05c870eff8dab779d38a62894a44c81425254394 (patch) | |
tree | a1fb5f23cbdbced5593c3b61132816cb52c7b6f9 /vcl | |
parent | 741c430f6c7e289543f1f73ce6568e1f07a7ea48 (diff) |
Related: #i122923# win only: improved bitmap handling for rendering
(cherry picked from commit 07302c14ad5e5983720a1d4514ff355b9930e5be)
Change-Id: Iba5303085bf4d6fcc79c0d04197429c436666e15
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/win/source/gdi/salbmp.cxx | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/vcl/win/source/gdi/salbmp.cxx b/vcl/win/source/gdi/salbmp.cxx index 98e908a07ca4..1977be08b3bb 100644 --- a/vcl/win/source/gdi/salbmp.cxx +++ b/vcl/win/source/gdi/salbmp.cxx @@ -334,22 +334,21 @@ Gdiplus::Bitmap* WinSalBitmap::ImplCreateGdiPlusBitmap() 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); - for(sal_uInt32 x(0); x < nW; x++) - { - const sal_uInt8 nB(*pSrcRGB++); - const sal_uInt8 nG(*pSrcRGB++); - const sal_uInt8 nR(*pSrcRGB++); - - pRetval->SetPixel(x, nYInsert, Gdiplus::Color(nR, nG, nB)); - } - - pSrcRGB += nExtraRGB; + memcpy(targetPixels, pSrcRGB, nW * 3); + pSrcRGB += nW * 3 + nExtraRGB; } + + pRetval->UnlockBits(&aGdiPlusBitmapData); } } @@ -464,24 +463,30 @@ Gdiplus::Bitmap* WinSalBitmap::ImplCreateGdiPlusBitmap(const WinSalBitmap& rAlph const sal_uInt32 nExtraRGB(pRGB->mnScanlineSize - (nW * 3)); const sal_uInt32 nExtraA(pA->mnScanlineSize - nW); 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, PixelFormat32bppARGB, &aGdiPlusBitmapData); + // copy data to Gdiplus::Bitmap; format is BGRA; need to mix BGR from Bitmap and + // A from alpha, so inner loop is needed (who invented BitmapEx..?) 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); for(sal_uInt32 x(0); x < nW; x++) { - const sal_uInt8 nB(*pSrcRGB++); - const sal_uInt8 nG(*pSrcRGB++); - const sal_uInt8 nR(*pSrcRGB++); - const sal_uInt8 nA(0xff - *pSrcA++); - - pRetval->SetPixel(x, nYInsert, Gdiplus::Color(nA, nR, nG, nB)); + *targetPixels++ = *pSrcRGB++; + *targetPixels++ = *pSrcRGB++; + *targetPixels++ = *pSrcRGB++; + *targetPixels++ = 0xff - *pSrcA++; } pSrcRGB += nExtraRGB; pSrcA += nExtraA; } + + pRetval->UnlockBits(&aGdiPlusBitmapData); } } |