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

Armin Le Grand alg at apache.org
Thu Aug 29 10:12:38 PDT 2013


 vcl/source/gdi/dibtools.cxx |   39 +++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

New commits:
commit f84d2ce5453af7d20b0fc84d470a7661c3a7bca0
Author: Armin Le Grand <alg at apache.org>
Date:   Thu Aug 29 11:25:32 2013 +0000

    Resolves: #i122920# Corrected minor aspects of DIB clipboard exchange format
    
    (cherry picked from commit 95212768770c2206b18e9fb929a79fae24f4a6d8)
    
    Change-Id: Iff78cd8bb37748424210d5b5e3979afb5d85978d

diff --git a/vcl/source/gdi/dibtools.cxx b/vcl/source/gdi/dibtools.cxx
index 6a15ade..85d0d9b 100644
--- a/vcl/source/gdi/dibtools.cxx
+++ b/vcl/source/gdi/dibtools.cxx
@@ -382,12 +382,12 @@ void ImplDecodeRLE( sal_uInt8* pBuffer, DIBV5Header& rHeader, BitmapWriteAccess&
     while ( !bEndDecoding && ( nY >= 0L ) );
 }
 
-bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& rAcc, BitmapWriteAccess* pAccAlpha, bool bTopDown)
+bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& rAcc, BitmapWriteAccess* pAccAlpha, bool bTopDown, bool& rAlphaUsed)
 {
     const sal_uLong nAlignedWidth = AlignedWidth4Bytes(rHeader.nWidth * rHeader.nBitCount);
-    sal_uInt32 nRMask(0);
-    sal_uInt32 nGMask(0);
-    sal_uInt32 nBMask(0);
+    sal_uInt32 nRMask(( rHeader.nBitCount == 16 ) ? 0x00007c00UL : 0x00ff0000UL);
+    sal_uInt32 nGMask(( rHeader.nBitCount == 16 ) ? 0x000003e0UL : 0x0000ff00UL);
+    sal_uInt32 nBMask(( rHeader.nBitCount == 16 ) ? 0x0000001fUL : 0x000000ffUL);
     bool bNative(false);
     bool bTCMask(!pAccAlpha && ((16 == rHeader.nBitCount) || (32 == rHeader.nBitCount)));
     bool bRLE((RLE_8 == rHeader.nCompression && 8 == rHeader.nBitCount) || (RLE_4 == rHeader.nCompression && 4 == rHeader.nBitCount));
@@ -424,21 +424,12 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
     else
     {
         // Read color mask
-        if(bTCMask)
+        if(bTCMask && BITFIELDS == rHeader.nCompression)
         {
-            if(BITFIELDS == rHeader.nCompression)
-            {
-                rIStm.SeekRel( -12L );
-                rIStm >> nRMask;
-                rIStm >> nGMask;
-                rIStm >> nBMask;
-            }
-            else
-            {
-                nRMask = ( rHeader.nBitCount == 16 ) ? 0x00007c00UL : 0x00ff0000UL;
-                nGMask = ( rHeader.nBitCount == 16 ) ? 0x000003e0UL : 0x0000ff00UL;
-                nBMask = ( rHeader.nBitCount == 16 ) ? 0x0000001fUL : 0x000000ffUL;
-            }
+            rIStm.SeekRel( -12L );
+            rIStm >> nRMask;
+            rIStm >> nGMask;
+            rIStm >> nBMask;
         }
 
         if(bRLE)
@@ -595,6 +586,7 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
                                 aMask.GetColorAndAlphaFor32Bit( aColor, aAlpha, (sal_uInt8*) pTmp32++ );
                                 rAcc.SetPixel( nY, nX, aColor );
                                 pAccAlpha->SetPixelIndex(nY, nX, sal_uInt8(0xff) - aAlpha);
+                                rAlphaUsed |= bool(0xff != aAlpha);
                             }
                         }
                     }
@@ -719,6 +711,8 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
             }
 
             // read bits
+            bool bAlphaUsed(false);
+
             if(!pIStm->GetError())
             {
                 if(nOffset)
@@ -726,7 +720,7 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
                     pIStm->SeekRel(nOffset - (pIStm->Tell() - nStmPos));
                 }
 
-                bRet = ImplReadDIBBits(*pIStm, aHeader, *pAcc, pAccAlpha, bTopDown);
+                bRet = ImplReadDIBBits(*pIStm, aHeader, *pAcc, pAccAlpha, bTopDown, bAlphaUsed);
 
                 if(bRet && aHeader.nXPelsPerMeter && aHeader.nYPelsPerMeter)
                 {
@@ -752,6 +746,11 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
             if(bAlphaPossible)
             {
                 aNewBmpAlpha.ReleaseAccess(pAccAlpha);
+
+                if(!bAlphaUsed)
+                {
+                    bAlphaPossible = false;
+                }
             }
 
             if(bRet)
@@ -1227,7 +1226,7 @@ bool ImplWriteDIBBody(const Bitmap& rBitmap, SvStream& rOStm, BitmapReadAccess&
     if(pAccAlpha) // only write DIBV5 when asked to do so
     {
         aHeader.nV5CSType = 0x57696E20; // LCS_WINDOWS_COLOR_SPACE
-        aHeader.nV5Intent = 0x00000008; // LCS_GM_ABS_COLORIMETRIC
+        aHeader.nV5Intent = 0x00000004; // LCS_GM_IMAGES
 
         rOStm << aHeader.nV5RedMask;
         rOStm << aHeader.nV5GreenMask;


More information about the Libreoffice-commits mailing list