incubator-ooo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From a..@apache.org
Subject svn commit: r1366403 - /incubator/ooo/trunk/main/svtools/source/filter/wmf/enhwmf.cxx
Date Fri, 27 Jul 2012 15:01:19 GMT
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;



Mime
View raw message