Kaydet (Commit) d96b939f authored tarafından Caolán McNamara's avatar Caolán McNamara

make CalcMaskShift a verifiable operation

and check it on untrusted data

Change-Id: I7c97a27d70f91b9686adf9dcb8b68c5aa25c2b4c
Reviewed-on: https://gerrit.libreoffice.org/18637Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 57ad819c
...@@ -187,29 +187,29 @@ struct VCL_DLLPUBLIC ColorMaskElement ...@@ -187,29 +187,29 @@ struct VCL_DLLPUBLIC ColorMaskElement
int mnShift; int mnShift;
int mnOrShift; int mnOrShift;
sal_uInt8 mnOr; sal_uInt8 mnOr;
ColorMaskElement(sal_uInt32 nMask) explicit ColorMaskElement(sal_uInt32 nMask = 0)
: mnMask(nMask) : mnMask(nMask)
, mnShift(0) , mnShift(0)
, mnOrShift(0) , mnOrShift(0)
, mnOr(0) , mnOr(0)
{ {
} }
static bool CalcMaskShift(ColorMaskElement &rElem) bool CalcMaskShift()
{ {
if (rElem.mnMask == 0) if (mnMask == 0)
return true; return true;
// from which bit starts the mask? // from which bit starts the mask?
int nShift = 31; int nShift = 31;
while( nShift >= 0 && !( rElem.mnMask & ( 1 << nShift ) ) ) while( nShift >= 0 && !( mnMask & ( 1 << nShift ) ) )
--nShift; --nShift;
rElem.mnShift = nShift - 7; mnShift = nShift - 7;
int nLen = 0; int nLen = 0;
// XXX determine number of bits set => walk right until null // XXX determine number of bits set => walk right until null
while( nShift >= 0 && ( rElem.mnMask & ( 1 << nShift ) ) ) while( nShift >= 0 && ( mnMask & ( 1 << nShift ) ) )
{ {
nShift--; nShift--;
nLen++; nLen++;
...@@ -218,8 +218,8 @@ struct VCL_DLLPUBLIC ColorMaskElement ...@@ -218,8 +218,8 @@ struct VCL_DLLPUBLIC ColorMaskElement
if (nLen > 8) // mask length must be 8 bits or less if (nLen > 8) // mask length must be 8 bits or less
return false; return false;
rElem.mnOrShift = 8 - nLen; mnOrShift = 8 - nLen;
rElem.mnOr = static_cast<sal_uInt8>( ( 0xFF >> nLen ) << rElem.mnOrShift ); mnOr = static_cast<sal_uInt8>( ( 0xFF >> nLen ) << mnOrShift );
return true; return true;
} }
...@@ -235,11 +235,18 @@ class VCL_DLLPUBLIC ColorMask ...@@ -235,11 +235,18 @@ class VCL_DLLPUBLIC ColorMask
public: public:
inline ColorMask( sal_uInt32 nRedMask = 0, ColorMask(const ColorMaskElement& rRedMask = ColorMaskElement(),
sal_uInt32 nGreenMask = 0, const ColorMaskElement& rGreenMask = ColorMaskElement(),
sal_uInt32 nBlueMask = 0, const ColorMaskElement& rBlueMask = ColorMaskElement(),
sal_uInt32 nAlphaChannel = 0 ); sal_uInt32 nAlphaChannel = 0)
inline ~ColorMask() {} : maR(rRedMask)
, maG(rGreenMask)
, maB(rBlueMask)
, mnAlphaChannel(nAlphaChannel)
{
}
~ColorMask() {}
inline sal_uInt32 GetRedMask() const; inline sal_uInt32 GetRedMask() const;
inline sal_uInt32 GetGreenMask() const; inline sal_uInt32 GetGreenMask() const;
...@@ -599,20 +606,6 @@ inline sal_uInt16 BitmapPalette::GetBestIndex( const BitmapColor& rCol ) const ...@@ -599,20 +606,6 @@ inline sal_uInt16 BitmapPalette::GetBestIndex( const BitmapColor& rCol ) const
return nRetIndex; return nRetIndex;
} }
inline ColorMask::ColorMask( sal_uInt32 nRedMask,
sal_uInt32 nGreenMask,
sal_uInt32 nBlueMask,
sal_uInt32 nAlphaChannel )
: maR(nRedMask)
, maG(nGreenMask)
, maB(nBlueMask)
, mnAlphaChannel(nAlphaChannel)
{
ColorMaskElement::CalcMaskShift(maR);
ColorMaskElement::CalcMaskShift(maG);
ColorMaskElement::CalcMaskShift(maB);
}
inline sal_uInt32 ColorMask::GetRedMask() const inline sal_uInt32 ColorMask::GetRedMask() const
{ {
return maR.mnMask; return maR.mnMask;
......
...@@ -172,65 +172,130 @@ BitmapBuffer* SvpSalBitmap::AcquireBuffer( BitmapAccessMode ) ...@@ -172,65 +172,130 @@ BitmapBuffer* SvpSalBitmap::AcquireBuffer( BitmapAccessMode )
pBuf->mnFormat = BMP_FORMAT_8BIT_PAL; pBuf->mnFormat = BMP_FORMAT_8BIT_PAL;
break; break;
case Format::SixteenBitLsbTcMask: case Format::SixteenBitLsbTcMask:
{
nBitCount = 16; nBitCount = 16;
pBuf->mnFormat = BMP_FORMAT_16BIT_TC_LSB_MASK; pBuf->mnFormat = BMP_FORMAT_16BIT_TC_LSB_MASK;
pBuf->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); ColorMaskElement aRedMask(0xf800);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x07e0);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x001f);
aBlueMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break; break;
}
case Format::SixteenBitMsbTcMask: case Format::SixteenBitMsbTcMask:
{
nBitCount = 16; nBitCount = 16;
pBuf->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK; pBuf->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK;
pBuf->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); ColorMaskElement aRedMask(0xf800);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x07e0);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x001f);
aBlueMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break; break;
}
case Format::TwentyFourBitTcMask: case Format::TwentyFourBitTcMask:
nBitCount = 24; nBitCount = 24;
pBuf->mnFormat = BMP_FORMAT_24BIT_TC_BGR; pBuf->mnFormat = BMP_FORMAT_24BIT_TC_BGR;
break; break;
case Format::ThirtyTwoBitTcMaskBGRX: case Format::ThirtyTwoBitTcMaskBGRX:
{
nBitCount = 32; nBitCount = 32;
pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK;
#ifdef OSL_BIGENDIAN #ifdef OSL_BIGENDIAN
pBuf->maColorMask = ColorMask( 0x0000ff00, 0x00ff0000, 0xff000000 ); ColorMaskElement aRedMask(0x0000ff00);
ColorMaskElement aGreenMask(0x00ff0000);
ColorMaskElement aBlueMask(0xff000000);
#else #else
pBuf->maColorMask = ColorMask( 0x00ff0000, 0x0000ff00, 0x000000ff ); ColorMaskElement aRedMask(0x00ff0000);
ColorMaskElement aGreenMask(0x0000ff00);
ColorMaskElement aBlueMask(0x000000ff);
#endif #endif
aBlueMask.CalcMaskShift();
aRedMask.CalcMaskShift();
aGreenMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break; break;
}
case Format::ThirtyTwoBitTcMaskBGRA: case Format::ThirtyTwoBitTcMaskBGRA:
{
nBitCount = 32; nBitCount = 32;
pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK;
#ifdef OSL_BIGENDIAN #ifdef OSL_BIGENDIAN
pBuf->maColorMask = ColorMask( 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff ); ColorMaskElement aRedMask(0x0000ff00);
ColorMaskElement aGreenMask(0x00ff0000);
ColorMaskElement aBlueMask(0xff000000);
#else #else
pBuf->maColorMask = ColorMask( 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 ); ColorMaskElement aRedMask(0x00ff0000);
ColorMaskElement aGreenMask(0x0000ff00);
ColorMaskElement aBlueMask(0x000000ff);
#endif #endif
aBlueMask.CalcMaskShift();
aRedMask.CalcMaskShift();
aGreenMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask, 0xff000000);
break; break;
}
case Format::ThirtyTwoBitTcMaskARGB: case Format::ThirtyTwoBitTcMaskARGB:
{
nBitCount = 32; nBitCount = 32;
pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK;
#ifdef OSL_BIGENDIAN #ifdef OSL_BIGENDIAN
pBuf->maColorMask = ColorMask( 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 ); ColorMaskElement aRedMask(0x00ff0000);
ColorMaskElement aGreenMask(0x0000ff00);
ColorMaskElement aBlueMask(0x000000ff);
#else #else
pBuf->maColorMask = ColorMask( 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff ); ColorMaskElement aRedMask(0x0000ff00);
ColorMaskElement aGreenMask(0x00ff0000);
ColorMaskElement aBlueMask(0xff000000);
#endif #endif
aBlueMask.CalcMaskShift();
aRedMask.CalcMaskShift();
aGreenMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask, 0xff000000 );
break; break;
}
case Format::ThirtyTwoBitTcMaskABGR: case Format::ThirtyTwoBitTcMaskABGR:
{
nBitCount = 32; nBitCount = 32;
pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK;
#ifdef OSL_BIGENDIAN #ifdef OSL_BIGENDIAN
pBuf->maColorMask = ColorMask( 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 ); ColorMaskElement aRedMask(0x000000ff);
ColorMaskElement aGreenMask(0x0000ff00);
ColorMaskElement aBlueMask(0x00ff0000);
#else #else
pBuf->maColorMask = ColorMask( 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff ); ColorMaskElement aRedMask(0xff000000);
ColorMaskElement aGreenMask(0x00ff0000);
ColorMaskElement aBlueMask(0x0000ff00);
#endif #endif
aBlueMask.CalcMaskShift();
aRedMask.CalcMaskShift();
aGreenMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask, 0xff000000);
break; break;
}
case Format::ThirtyTwoBitTcMaskRGBA: case Format::ThirtyTwoBitTcMaskRGBA:
{
nBitCount = 32; nBitCount = 32;
pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK;
#ifdef OSL_BIGENDIAN #ifdef OSL_BIGENDIAN
pBuf->maColorMask = ColorMask( 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff ); ColorMaskElement aRedMask(0xff000000);
ColorMaskElement aGreenMask(0x00ff0000);
ColorMaskElement aBlueMask(0x0000ff00);
#else #else
pBuf->maColorMask = ColorMask( 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 ); ColorMaskElement aRedMask(0x000000ff);
ColorMaskElement aGreenMask(0x0000ff00);
ColorMaskElement aBlueMask(0x00ff0000);
#endif #endif
aBlueMask.CalcMaskShift();
aRedMask.CalcMaskShift();
aGreenMask.CalcMaskShift();
pBuf->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask, 0x000000ff);
break; break;
}
default: default:
// this is an error case !!!!! // this is an error case !!!!!
nBitCount = 1; nBitCount = 1;
......
...@@ -709,18 +709,44 @@ BitmapBuffer* OpenGLSalBitmap::AcquireBuffer( BitmapAccessMode nMode ) ...@@ -709,18 +709,44 @@ BitmapBuffer* OpenGLSalBitmap::AcquireBuffer( BitmapAccessMode nMode )
pBuffer->mnScanlineSize = mnBytesPerRow; pBuffer->mnScanlineSize = mnBytesPerRow;
pBuffer->mpBits = maUserBuffer.get(); pBuffer->mpBits = maUserBuffer.get();
pBuffer->mnBitCount = mnBits; pBuffer->mnBitCount = mnBits;
switch( mnBits ) switch (mnBits)
{ {
case 1: pBuffer->mnFormat = BMP_FORMAT_1BIT_MSB_PAL; break; case 1:
case 4: pBuffer->mnFormat = BMP_FORMAT_4BIT_MSN_PAL; break; pBuffer->mnFormat = BMP_FORMAT_1BIT_MSB_PAL;
case 8: pBuffer->mnFormat = BMP_FORMAT_8BIT_PAL; break; break;
case 16: pBuffer->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK; case 4:
pBuffer->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); pBuffer->mnFormat = BMP_FORMAT_4BIT_MSN_PAL;
break; break;
case 24: pBuffer->mnFormat = BMP_FORMAT_24BIT_TC_RGB; break; case 8:
case 32: pBuffer->mnFormat = BMP_FORMAT_32BIT_TC_RGBA; pBuffer->mnFormat = BMP_FORMAT_8BIT_PAL;
pBuffer->maColorMask = ColorMask( 0xff000000, 0x00ff0000, 0x0000ff00 );
break; break;
case 16:
{
pBuffer->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK;
ColorMaskElement aRedMask(0xf800);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x07e0);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x001f);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break;
}
case 24:
pBuffer->mnFormat = BMP_FORMAT_24BIT_TC_RGB;
break;
case 32:
{
pBuffer->mnFormat = BMP_FORMAT_32BIT_TC_RGBA;
ColorMaskElement aRedMask(0xff000000);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x00ff0000);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x0000ff00);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break;
}
} }
return pBuffer; return pBuffer;
......
...@@ -759,16 +759,42 @@ BitmapBuffer* QuartzSalBitmap::AcquireBuffer( BitmapAccessMode /*nMode*/ ) ...@@ -759,16 +759,42 @@ BitmapBuffer* QuartzSalBitmap::AcquireBuffer( BitmapAccessMode /*nMode*/ )
pBuffer->mnBitCount = mnBits; pBuffer->mnBitCount = mnBits;
switch( mnBits ) switch( mnBits )
{ {
case 1: pBuffer->mnFormat = BMP_FORMAT_1BIT_MSB_PAL; break; case 1:
case 4: pBuffer->mnFormat = BMP_FORMAT_4BIT_MSN_PAL; break; pBuffer->mnFormat = BMP_FORMAT_1BIT_MSB_PAL;
case 8: pBuffer->mnFormat = BMP_FORMAT_8BIT_PAL; break;
case 16: pBuffer->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK;
pBuffer->maColorMask = ColorMask( k16BitRedColorMask, k16BitGreenColorMask, k16BitBlueColorMask );
break; break;
case 24: pBuffer->mnFormat = BMP_FORMAT_24BIT_TC_BGR; break; case 4:
case 32: pBuffer->mnFormat = BMP_FORMAT_32BIT_TC_ARGB; pBuffer->mnFormat = BMP_FORMAT_4BIT_MSN_PAL;
pBuffer->maColorMask = ColorMask( k32BitRedColorMask, k32BitGreenColorMask, k32BitBlueColorMask );
break; break;
case 8:
pBuffer->mnFormat = BMP_FORMAT_8BIT_PAL;
break;
case 16:
{
pBuffer->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK;
ColorMaskElement aRedMask(k16BitRedColorMask);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(k16BitGreenColorMask);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(k16BitBlueColorMask);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break;
}
case 24:
pBuffer->mnFormat = BMP_FORMAT_24BIT_TC_BGR;
break;
case 32:
{
pBuffer->mnFormat = BMP_FORMAT_32BIT_TC_ARGB;
ColorMaskElement aRedMask(k32BitRedColorMask);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(k32BitGreenColorMask);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(k32BitBlueColorMask);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break;
}
} }
pBuffer->mnFormat |= BMP_FORMAT_BOTTOM_UP; pBuffer->mnFormat |= BMP_FORMAT_BOTTOM_UP;
......
...@@ -596,7 +596,17 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -596,7 +596,17 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
case( 16 ): case( 16 ):
{ {
ColorMask aMask( nRMask, nGMask, nBMask ); ColorMaskElement aRedMask(nRMask);
if (!aRedMask.CalcMaskShift())
return false;
ColorMaskElement aGreenMask(nGMask);
if (!aGreenMask.CalcMaskShift())
return false;
ColorMaskElement aBlueMask(nBMask);
if (!aBlueMask.CalcMaskShift())
return false;
ColorMask aMask(aRedMask, aGreenMask, aBlueMask);
BitmapColor aColor; BitmapColor aColor;
sal_uInt16* pTmp16; sal_uInt16* pTmp16;
...@@ -643,7 +653,17 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -643,7 +653,17 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
case( 32 ): case( 32 ):
{ {
ColorMask aMask(nRMask, nGMask, nBMask); ColorMaskElement aRedMask(nRMask);
if (!aRedMask.CalcMaskShift())
return false;
ColorMaskElement aGreenMask(nGMask);
if (!aGreenMask.CalcMaskShift())
return false;
ColorMaskElement aBlueMask(nBMask);
if (!aBlueMask.CalcMaskShift())
return false;
ColorMask aMask(aRedMask, aGreenMask, aBlueMask);
BitmapColor aColor; BitmapColor aColor;
sal_uInt32* pTmp32; sal_uInt32* pTmp32;
......
...@@ -154,14 +154,30 @@ BitmapBuffer* X11SalBitmap::ImplCreateDIB( ...@@ -154,14 +154,30 @@ BitmapBuffer* X11SalBitmap::ImplCreateDIB(
case( 8 ): pDIB->mnFormat |= BMP_FORMAT_8BIT_PAL; break; case( 8 ): pDIB->mnFormat |= BMP_FORMAT_8BIT_PAL; break;
#ifdef OSL_BIGENDIAN #ifdef OSL_BIGENDIAN
case(16 ): case(16 ):
{
pDIB->mnFormat|= BMP_FORMAT_16BIT_TC_MSB_MASK; pDIB->mnFormat|= BMP_FORMAT_16BIT_TC_MSB_MASK;
pDIB->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); ColorMaskElement aRedMask(0xf800);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x07e0);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x001f);
aBlueMask.CalcMaskShift();
pDIB->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break; break;
}
#else #else
case(16 ): case(16 ):
{
pDIB->mnFormat|= BMP_FORMAT_16BIT_TC_LSB_MASK; pDIB->mnFormat|= BMP_FORMAT_16BIT_TC_LSB_MASK;
pDIB->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); ColorMaskElement aRedMask(0xf800);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x07e0);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x001f);
aBlueMask.CalcMaskShift();
pDIB->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
break; break;
}
#endif #endif
default: default:
nBitCount = 24; nBitCount = 24;
...@@ -274,7 +290,13 @@ BitmapBuffer* X11SalBitmap::ImplCreateDIB( ...@@ -274,7 +290,13 @@ BitmapBuffer* X11SalBitmap::ImplCreateDIB(
case( 16 ): case( 16 ):
{ {
aSrcBuf.maColorMask = ColorMask( pImage->red_mask, pImage->green_mask, pImage->blue_mask ); ColorMaskElement aRedMask(pImage->red_mask);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(pImage->green_mask);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(pImage->blue_mask);
aBlueMask.CalcMaskShift();
aSrcBuf.maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
if( LSBFirst == pImage->byte_order ) if( LSBFirst == pImage->byte_order )
{ {
...@@ -444,7 +466,13 @@ XImage* X11SalBitmap::ImplCreateXImage( ...@@ -444,7 +466,13 @@ XImage* X11SalBitmap::ImplCreateXImage(
#endif #endif
xMask.reset(new ColorMask( pImage->red_mask, pImage->green_mask, pImage->blue_mask )); ColorMaskElement aRedMask(pImage->red_mask);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(pImage->green_mask);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(pImage->blue_mask);
aBlueMask.CalcMaskShift();
xMask.reset(new ColorMask(aRedMask, aGreenMask, aBlueMask));
} }
break; break;
......
...@@ -906,14 +906,34 @@ BitmapBuffer* WinSalBitmap::AcquireBuffer( BitmapAccessMode /*nMode*/ ) ...@@ -906,14 +906,34 @@ BitmapBuffer* WinSalBitmap::AcquireBuffer( BitmapAccessMode /*nMode*/ )
if( pBIH->biCompression == BI_BITFIELDS ) if( pBIH->biCompression == BI_BITFIELDS )
{ {
nOffset = 3 * sizeof( RGBQUAD ); nOffset = 3 * sizeof( RGBQUAD );
pBuffer->maColorMask = ColorMask( *(UINT32*) &pBI->bmiColors[ 0 ], ColorMaskElement aRedMask(*(UINT32*) &pBI->bmiColors[ 0 ]);
*(UINT32*) &pBI->bmiColors[ 1 ], aRedMask.CalcMaskShift();
*(UINT32*) &pBI->bmiColors[ 2 ] ); ColorMaskElement aGreenMask(*(UINT32*) &pBI->bmiColors[ 1 ]);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(*(UINT32*) &pBI->bmiColors[ 2 ]);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
} }
else if( pBIH->biBitCount == 16 ) else if( pBIH->biBitCount == 16 )
pBuffer->maColorMask = ColorMask( 0x00007c00UL, 0x000003e0UL, 0x0000001fUL ); {
ColorMaskElement aRedMask(0x00007c00UL);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x000003e0UL);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x0000001fUL);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
}
else else
pBuffer->maColorMask = ColorMask( 0x00ff0000UL, 0x0000ff00UL, 0x000000ffUL ); {
ColorMaskElement aRedMask(0x00ff0000UL);
aRedMask.CalcMaskShift();
ColorMaskElement aGreenMask(0x0000ff00UL);
aGreenMask.CalcMaskShift();
ColorMaskElement aBlueMask(0x000000ffUL);
aBlueMask.CalcMaskShift();
pBuffer->maColorMask = ColorMask(aRedMask, aGreenMask, aBlueMask);
}
pBuffer->mpBits = (PBYTE) pBI + *(DWORD*) pBI + nOffset; pBuffer->mpBits = (PBYTE) pBI + *(DWORD*) pBI + nOffset;
} }
......
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