diff options
author | Armin Le Grand <alg@apache.org> | 2012-07-27 14:01:18 +0000 |
---|---|---|
committer | Armin Le Grand <alg@apache.org> | 2012-07-27 14:01:18 +0000 |
commit | 1ea8c3a924d518043c5d3d1427cd40cf500c8b21 (patch) | |
tree | f53d5b1fce56144032e5de355066808aebab827a /svtools | |
parent | 3909704eebf3de1dd9ed6fe0c67082803c5f9e83 (diff) |
#119450# Added EMR_ALPHABLEND case to EnhWMFReader to correct visualisations
Patch by: Jianyuan Li
Review by: alg
Notes
Notes:
merged as: 0752c18df9a975ffa182a4a7bc86e0bcadd58aec
Diffstat (limited to 'svtools')
-rw-r--r-- | svtools/source/filter/wmf/enhwmf.cxx | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/svtools/source/filter/wmf/enhwmf.cxx b/svtools/source/filter/wmf/enhwmf.cxx index c1c2f8104b9d..e41d560ea737 100644 --- a/svtools/source/filter/wmf/enhwmf.cxx +++ b/svtools/source/filter/wmf/enhwmf.cxx @@ -168,6 +168,21 @@ static float GetSwapFloat( SvStream& rSt ) } #endif +struct BLENDFUNCTION{ + unsigned char aBlendOperation; + unsigned char aBlendFlags; + unsigned char aSrcConstantAlpha; + unsigned char aAlphaFormat; + + friend SvStream& operator>>( SvStream& rIn, BLENDFUNCTION& rBlendFun ); +}; + +SvStream& operator>>( SvStream& rIn, BLENDFUNCTION& rBlendFun ) +{ + rIn >> rBlendFun.aBlendOperation >> rBlendFun.aBlendFlags >> + rBlendFun.aSrcConstantAlpha >> rBlendFun.aAlphaFormat; + return rIn; +} SvStream& operator>>( SvStream& rIn, XForm& rXForm ) { if ( sizeof( float ) != 4 ) @@ -805,7 +820,63 @@ sal_Bool EnhWMFReader::ReadEnhWMF() pOut->SetClipPath( aPolyPoly, iMode, sal_False ); } break; + case EMR_ALPHABLEND: + { + sal_Int32 xDest, yDest, cxDest, cyDest; + + BLENDFUNCTION aFunc; + sal_Int32 xSrc, ySrc; + XForm xformSrc; + sal_uInt32 BkColorSrc,iUsageSrc ,offBmiSrc,cbBmiSrc,offBitsSrc,cbBitsSrc ,cxSrc,cySrc ; + + sal_uInt32 nStart = pWMF->Tell() - 8; + pWMF->SeekRel( 0x10 ); + + *pWMF >> xDest >> yDest >> cxDest >> cyDest >> aFunc >> xSrc >> ySrc + >> xformSrc >> BkColorSrc >> iUsageSrc >> offBmiSrc >> cbBmiSrc + >> offBitsSrc >> cbBitsSrc >>cxSrc>>cySrc ; + + sal_uInt32 dwRop = SRCAND|SRCINVERT; + + Bitmap aBitmap; + Rectangle aRect( Point( xDest, yDest ), Size( cxDest+1, cyDest+1 ) ); + if ( (cbBitsSrc > (SAL_MAX_UINT32 - 14)) || ((SAL_MAX_UINT32 - 14) - cbBitsSrc < cbBmiSrc) ) + bStatus = sal_False; + else + { + sal_uInt32 nSize = cbBmiSrc + cbBitsSrc + 14; + if ( nSize <= ( nEndPos - nStartPos ) ) + { + char* pBuf = new char[ nSize ]; + SvMemoryStream aTmp( pBuf, nSize, STREAM_READ | STREAM_WRITE ); + aTmp.ObjectOwnsMemory( sal_True ); + aTmp << (sal_uInt8)'B' + << (sal_uInt8)'M' + << (sal_uInt32)cbBitsSrc + << (sal_uInt16)0 + << (sal_uInt16)0 + << (sal_uInt32)cbBmiSrc + 14; + pWMF->Seek( nStart + offBmiSrc ); + pWMF->Read( pBuf + 14, cbBmiSrc ); + pWMF->Seek( nStart + offBitsSrc ); + pWMF->Read( pBuf + 14 + cbBmiSrc, cbBitsSrc ); + aTmp.Seek( 0 ); + aBitmap.Read( aTmp, sal_True ); + // test if it is sensible to crop + if ( ( cxSrc > 0 ) && ( cySrc > 0 ) && + ( xSrc >= 0 ) && ( ySrc >= 0 ) && + ( xSrc + cxSrc <= aBitmap.GetSizePixel().Width() ) && + ( ySrc + cySrc <= aBitmap.GetSizePixel().Height() ) ) + { + Rectangle aCropRect( Point( xSrc, ySrc ), Size( cxSrc, cySrc ) ); + aBitmap.Crop( aCropRect ); + } + aBmpSaveList.Insert( new BSaveStruct( aBitmap, aRect, dwRop ), LIST_APPEND ); + } + } + } + break; case EMR_BITBLT : // PASSTHROUGH INTENDED case EMR_STRETCHBLT : { @@ -1225,7 +1296,6 @@ sal_Bool EnhWMFReader::ReadEnhWMF() case EMR_COLORCORRECTPALETTE : WinMtfAssertHandler( "ColorCorrectPalette" ); break; case EMR_SETICMPROFILEA : WinMtfAssertHandler( "SetICMProfileA" ); break; case EMR_SETICMPROFILEW : WinMtfAssertHandler( "SetICMProfileW" ); break; - case EMR_ALPHABLEND : WinMtfAssertHandler( "Alphablend" ); break; case EMR_TRANSPARENTBLT : WinMtfAssertHandler( "TransparenBlt" ); break; case EMR_TRANSPARENTDIB : WinMtfAssertHandler( "TransparenDib" ); break; case EMR_GRADIENTFILL : WinMtfAssertHandler( "GradientFill" ); break; |