diff options
-rw-r--r-- | cppcanvas/source/inc/implrenderer.hxx | 12 | ||||
-rw-r--r-- | cppcanvas/source/inc/outdevstate.hxx (renamed from cppcanvas/source/mtfrenderer/outdevstate.hxx) | 0 | ||||
-rw-r--r-- | cppcanvas/source/mtfrenderer/emfplus.cxx | 49 |
3 files changed, 58 insertions, 3 deletions
diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index c2902d6c0b6a..453736825e9b 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -28,8 +28,10 @@ #include <canvasgraphichelper.hxx> #include <action.hxx> +#include <outdevstate.hxx> #include <vector> +#include <map> class GDIMetaFile; class VirtualDevice; @@ -166,6 +168,12 @@ static float GetSwapFloat( SvStream& rSt ) } }; + // EMF+ + typedef struct { + XForm aWorldTransform; + OutDevState aDevState; + } EmfPlusGraphicState; + class ImplRenderer : public virtual Renderer, protected CanvasGraphicHelper { public: @@ -278,7 +286,6 @@ static float GetSwapFloat( SvStream& rSt ) sal_Int32 nOriginY; sal_Int32 nHDPI; sal_Int32 nVDPI; - ::PolyPolygon aClippingPolygon; /* EMF+ emf header info */ sal_Int32 nFrameLeft; sal_Int32 nFrameTop; @@ -292,6 +299,9 @@ static float GetSwapFloat( SvStream& rSt ) bool mbMultipart; sal_uInt16 mMFlags; SvMemoryStream mMStream; + /* emf+ graphic state stack */ + ::std::map<int,EmfPlusGraphicState> mGSStack; + typedef ::std::map<int,EmfPlusGraphicState>::iterator EPGSSIter; }; diff --git a/cppcanvas/source/mtfrenderer/outdevstate.hxx b/cppcanvas/source/inc/outdevstate.hxx index 26e10263a369..26e10263a369 100644 --- a/cppcanvas/source/mtfrenderer/outdevstate.hxx +++ b/cppcanvas/source/inc/outdevstate.hxx diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index 3f787e1e13d0..8989113b297d 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -68,6 +68,7 @@ #define EmfPlusRecordTypeSetPixelOffsetMode 16418 #define EmfPlusRecordTypeSetCompositingQuality 16420 #define EmfPlusRecordTypeSave 16421 +#define EmfPlusRecordTypeRestore 16422 #define EmfPlusRecordTypeSetWorldTransform 16426 #define EmfPlusRecordTypeResetWorldTransform 16427 #define EmfPlusRecordTypeMultiplyWorldTransform 16428 @@ -1669,9 +1670,53 @@ namespace cppcanvas EMFP_DEBUG (printf ("EMF+\tTODO\n")); break; case EmfPlusRecordTypeSave: - EMFP_DEBUG (printf ("EMF+ Save\n")); - EMFP_DEBUG (printf ("EMF+\tTODO\n")); + { + sal_uInt32 stackIndex; + + rMF >> stackIndex; + + EMFP_DEBUG (printf ("EMF+ Save stack index: %d\n", stackIndex)); + + EPGSSIter aIter = mGSStack.find( stackIndex ); + + if ( aIter != mGSStack.end() ) + { + EmfPlusGraphicState aState = aIter->second; + mGSStack.erase( aIter ); + + EMFP_DEBUG (printf ("stack index: %d found and erased\n", stackIndex)); + } + + EmfPlusGraphicState aState; + + aState.aWorldTransform = aWorldTransform; + aState.aDevState = rState; + + mGSStack[ stackIndex ] = aState; + break; + } + case EmfPlusRecordTypeRestore: + { + sal_uInt32 stackIndex; + + rMF >> stackIndex; + + EMFP_DEBUG (printf ("EMF+ Restore stack index: %d\n", stackIndex)); + + EPGSSIter aIter = mGSStack.find( stackIndex ); + + if ( aIter != mGSStack.end() ) { + EMFP_DEBUG (printf ("stack index: %d found\n", stackIndex)); + EmfPlusGraphicState aState = aIter->second; + aWorldTransform = aState.aWorldTransform; + rState.clip = aState.aDevState.clip; + rState.clipRect = aState.aDevState.clipRect; + rState.xClipPoly = aState.aDevState.xClipPoly; + } + + break; + } case EmfPlusRecordTypeSetWorldTransform: { EMFP_DEBUG (printf ("EMF+ SetWorldTransform\n")); XForm transform; |