[Libreoffice-commits] core.git: vcl/win

Armin Le Grand alg at apache.org
Wed Aug 28 07:36:07 PDT 2013


 vcl/win/source/gdi/salbmp.cxx |   37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

New commits:
commit 05c870eff8dab779d38a62894a44c81425254394
Author: Armin Le Grand <alg at apache.org>
Date:   Wed Aug 28 11:15:41 2013 +0000

    Related: #i122923# win only: improved bitmap handling for rendering
    
    (cherry picked from commit 07302c14ad5e5983720a1d4514ff355b9930e5be)
    
    Change-Id: Iba5303085bf4d6fcc79c0d04197429c436666e15

diff --git a/vcl/win/source/gdi/salbmp.cxx b/vcl/win/source/gdi/salbmp.cxx
index 98e908a..1977be0 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);
         }
     }
 


More information about the Libreoffice-commits mailing list