You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2013/08/29 13:25:33 UTC

svn commit: r1518592 - /openoffice/trunk/main/vcl/source/gdi/dibtools.cxx

Author: alg
Date: Thu Aug 29 11:25:32 2013
New Revision: 1518592

URL: http://svn.apache.org/r1518592
Log:
i122920 Corrected some minor aspects of DIB clipboard exchange format

Modified:
    openoffice/trunk/main/vcl/source/gdi/dibtools.cxx

Modified: openoffice/trunk/main/vcl/source/gdi/dibtools.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/source/gdi/dibtools.cxx?rev=1518592&r1=1518591&r2=1518592&view=diff
==============================================================================
--- openoffice/trunk/main/vcl/source/gdi/dibtools.cxx (original)
+++ openoffice/trunk/main/vcl/source/gdi/dibtools.cxx Thu Aug 29 11:25:32 2013
@@ -388,12 +388,12 @@ void ImplDecodeRLE( sal_uInt8* pBuffer, 
 	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));
@@ -430,22 +430,13 @@ bool ImplReadDIBBits(SvStream& rIStm, DI
 	else
 	{
 		// Read color mask
-		if(bTCMask)
-		{
-			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;
-			}
-		}
+        if(bTCMask && BITFIELDS == rHeader.nCompression)
+        {
+            rIStm.SeekRel( -12L );
+            rIStm >> nRMask;
+            rIStm >> nGMask;
+            rIStm >> nBMask;
+        }
 
 		if(bRLE)
 		{
@@ -601,6 +592,7 @@ bool ImplReadDIBBits(SvStream& rIStm, DI
                                 aMask.GetColorAndAlphaFor32Bit( aColor, aAlpha, (sal_uInt8*) pTmp32++ );
                                 rAcc.SetPixel( nY, nX, aColor );
                                 pAccAlpha->SetPixelIndex(nY, nX, sal_uInt8(0xff) - aAlpha);
+                                rAlphaUsed |= bool(0xff != aAlpha);
                             }
                         }
                     }
@@ -725,6 +717,8 @@ bool ImplReadDIBBody( SvStream& rIStm, B
 			}
 
 			// read bits
+            bool bAlphaUsed(false);
+
 			if(!pIStm->GetError())
 			{
 				if(nOffset)
@@ -732,7 +726,7 @@ bool ImplReadDIBBody( SvStream& rIStm, B
 					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)
 				{
@@ -758,6 +752,11 @@ bool ImplReadDIBBody( SvStream& rIStm, B
             if(bAlphaPossible)
             {
                 aNewBmpAlpha.ReleaseAccess(pAccAlpha);
+
+                if(!bAlphaUsed)
+                {
+                    bAlphaPossible = false;
+                }
             }
 
 			if(bRet)
@@ -1240,7 +1239,7 @@ bool ImplWriteDIBBody(const Bitmap& rBit
     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;