Kaydet (Commit) 95212768 authored tarafından Armin Le Grand's avatar Armin Le Grand

i122920 Corrected some minor aspects of DIB clipboard exchange format

üst 98bd1ade
...@@ -388,12 +388,12 @@ void ImplDecodeRLE( sal_uInt8* pBuffer, DIBV5Header& rHeader, BitmapWriteAccess& ...@@ -388,12 +388,12 @@ void ImplDecodeRLE( sal_uInt8* pBuffer, DIBV5Header& rHeader, BitmapWriteAccess&
while ( !bEndDecoding && ( nY >= 0L ) ); 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); const sal_uLong nAlignedWidth = AlignedWidth4Bytes(rHeader.nWidth * rHeader.nBitCount);
sal_uInt32 nRMask(0); sal_uInt32 nRMask(( rHeader.nBitCount == 16 ) ? 0x00007c00UL : 0x00ff0000UL);
sal_uInt32 nGMask(0); sal_uInt32 nGMask(( rHeader.nBitCount == 16 ) ? 0x000003e0UL : 0x0000ff00UL);
sal_uInt32 nBMask(0); sal_uInt32 nBMask(( rHeader.nBitCount == 16 ) ? 0x0000001fUL : 0x000000ffUL);
bool bNative(false); bool bNative(false);
bool bTCMask(!pAccAlpha && ((16 == rHeader.nBitCount) || (32 == rHeader.nBitCount))); 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)); bool bRLE((RLE_8 == rHeader.nCompression && 8 == rHeader.nBitCount) || (RLE_4 == rHeader.nCompression && 4 == rHeader.nBitCount));
...@@ -430,21 +430,12 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -430,21 +430,12 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
else else
{ {
// Read color mask // Read color mask
if(bTCMask) if(bTCMask && BITFIELDS == rHeader.nCompression)
{ {
if(BITFIELDS == rHeader.nCompression) rIStm.SeekRel( -12L );
{ rIStm >> nRMask;
rIStm.SeekRel( -12L ); rIStm >> nGMask;
rIStm >> nRMask; rIStm >> nBMask;
rIStm >> nGMask;
rIStm >> nBMask;
}
else
{
nRMask = ( rHeader.nBitCount == 16 ) ? 0x00007c00UL : 0x00ff0000UL;
nGMask = ( rHeader.nBitCount == 16 ) ? 0x000003e0UL : 0x0000ff00UL;
nBMask = ( rHeader.nBitCount == 16 ) ? 0x0000001fUL : 0x000000ffUL;
}
} }
if(bRLE) if(bRLE)
...@@ -601,6 +592,7 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -601,6 +592,7 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
aMask.GetColorAndAlphaFor32Bit( aColor, aAlpha, (sal_uInt8*) pTmp32++ ); aMask.GetColorAndAlphaFor32Bit( aColor, aAlpha, (sal_uInt8*) pTmp32++ );
rAcc.SetPixel( nY, nX, aColor ); rAcc.SetPixel( nY, nX, aColor );
pAccAlpha->SetPixelIndex(nY, nX, sal_uInt8(0xff) - aAlpha); pAccAlpha->SetPixelIndex(nY, nX, sal_uInt8(0xff) - aAlpha);
rAlphaUsed |= bool(0xff != aAlpha);
} }
} }
} }
...@@ -725,6 +717,8 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon ...@@ -725,6 +717,8 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
} }
// read bits // read bits
bool bAlphaUsed(false);
if(!pIStm->GetError()) if(!pIStm->GetError())
{ {
if(nOffset) if(nOffset)
...@@ -732,7 +726,7 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon ...@@ -732,7 +726,7 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
pIStm->SeekRel(nOffset - (pIStm->Tell() - nStmPos)); 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) if(bRet && aHeader.nXPelsPerMeter && aHeader.nYPelsPerMeter)
{ {
...@@ -758,6 +752,11 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon ...@@ -758,6 +752,11 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon
if(bAlphaPossible) if(bAlphaPossible)
{ {
aNewBmpAlpha.ReleaseAccess(pAccAlpha); aNewBmpAlpha.ReleaseAccess(pAccAlpha);
if(!bAlphaUsed)
{
bAlphaPossible = false;
}
} }
if(bRet) if(bRet)
...@@ -1240,7 +1239,7 @@ bool ImplWriteDIBBody(const Bitmap& rBitmap, SvStream& rOStm, BitmapReadAccess& ...@@ -1240,7 +1239,7 @@ bool ImplWriteDIBBody(const Bitmap& rBitmap, SvStream& rOStm, BitmapReadAccess&
if(pAccAlpha) // only write DIBV5 when asked to do so if(pAccAlpha) // only write DIBV5 when asked to do so
{ {
aHeader.nV5CSType = 0x57696E20; // LCS_WINDOWS_COLOR_SPACE 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.nV5RedMask;
rOStm << aHeader.nV5GreenMask; rOStm << aHeader.nV5GreenMask;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment