summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2013-08-29 11:25:32 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-08-29 18:12:11 +0100
commitf84d2ce5453af7d20b0fc84d470a7661c3a7bca0 (patch)
treef4437d182b61d94f077060b8114d5a1902d5252f /vcl
parenta7fdd474161ba8ab34945bc9a32c7a33de6eaf9a (diff)
Resolves: #i122920# Corrected minor aspects of DIB clipboard exchange format
(cherry picked from commit 95212768770c2206b18e9fb929a79fae24f4a6d8) Change-Id: Iff78cd8bb37748424210d5b5e3979afb5d85978d
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/gdi/dibtools.cxx39
1 files changed, 19 insertions, 20 deletions
diff --git a/vcl/source/gdi/dibtools.cxx b/vcl/source/gdi/dibtools.cxx
index 6a15ade6b6cb..85d0d9b7acbe 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;