Author: alg
Date: Fri Jul 27 15:01:18 2012
New Revision: 1366403

URL: http://svn.apache.org/viewvc?rev=1366403&view=rev
Log:
#119450# Added EMR_ALPHABLEND case to EnhWMFReader to correct visualisations
Patch by: Jianyuan Li
Review by: alg

Modified:
    incubator/ooo/trunk/main/svtools/source/filter/wmf/enhwmf.cxx

Modified: incubator/ooo/trunk/main/svtools/source/filter/wmf/enhwmf.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svtools/source/filter/wmf/enhwmf.cxx?rev=1366403&r1=1366402&r2=1366403&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svtools/source/filter/wmf/enhwmf.cxx (original)
+++ incubator/ooo/trunk/main/svtools/source/filter/wmf/enhwmf.cxx Fri Jul 27 
15:01:18 2012
@@ -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;


Reply via email to