diff options
author | Radek Doulik <rodo@novell.com> | 2013-03-22 20:54:03 +0100 |
---|---|---|
committer | Radek Doulik <rodo@novell.com> | 2013-03-22 20:55:09 +0100 |
commit | 8b1eac4a14e222238913b8b33c0aeb98ea702589 (patch) | |
tree | 42a3da412b37fb46f70b8acb5bdaaf6fa9ebe7f7 /cppcanvas | |
parent | 98d72730b7c6320341b52ed18ed765b72cf922c1 (diff) |
implemented BeginContainerNoParams and EndContainer records
- plus a bit of refactoring to reuse code
Change-Id: I416d2c47800752a27e2dc79f9b55b096e641062f
Diffstat (limited to 'cppcanvas')
-rw-r--r-- | cppcanvas/source/inc/implrenderer.hxx | 8 | ||||
-rw-r--r-- | cppcanvas/source/mtfrenderer/emfplus.cxx | 85 |
2 files changed, 67 insertions, 26 deletions
diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index 453736825e9b..addcdc2f15b1 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -174,6 +174,8 @@ static float GetSwapFloat( SvStream& rSt ) OutDevState aDevState; } EmfPlusGraphicState; + typedef ::std::map<int,EmfPlusGraphicState> GraphicStateMap; + class ImplRenderer : public virtual Renderer, protected CanvasGraphicHelper { public: @@ -215,6 +217,8 @@ static float GetSwapFloat( SvStream& rSt ) void MapToDevice (double &x, double &y); ::basegfx::B2DPoint Map (double ix, double iy); ::basegfx::B2DSize MapSize (double iwidth, double iheight); + void GraphicStatePush (GraphicStateMap& map, sal_Int32 index, OutDevState& rState); + void GraphicStatePop (GraphicStateMap& map, sal_Int32 index, OutDevState& rState); private: // default: disabled copy/assignment @@ -300,8 +304,8 @@ static float GetSwapFloat( SvStream& rSt ) sal_uInt16 mMFlags; SvMemoryStream mMStream; /* emf+ graphic state stack */ - ::std::map<int,EmfPlusGraphicState> mGSStack; - typedef ::std::map<int,EmfPlusGraphicState>::iterator EPGSSIter; + GraphicStateMap mGSStack; + GraphicStateMap mGSContainerStack; }; diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index 8989113b297d..5cf32646e513 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -69,6 +69,8 @@ #define EmfPlusRecordTypeSetCompositingQuality 16420 #define EmfPlusRecordTypeSave 16421 #define EmfPlusRecordTypeRestore 16422 +#define EmfPlusRecordTypeBeginContainerNoParams 16424 +#define EmfPlusRecordTypeEndContainer 16425 #define EmfPlusRecordTypeSetWorldTransform 16426 #define EmfPlusRecordTypeResetWorldTransform 16427 #define EmfPlusRecordTypeMultiplyWorldTransform 16428 @@ -1221,6 +1223,43 @@ namespace cppcanvas return cellSize; } + void ImplRenderer::GraphicStatePush(GraphicStateMap& map, sal_Int32 index, OutDevState& rState) + { + GraphicStateMap::iterator iter = map.find( index ); + + if ( iter != map.end() ) + { + EmfPlusGraphicState state = iter->second; + map.erase( iter ); + + EMFP_DEBUG (printf ("stack index: %d found and erased\n", index)); + } + + EmfPlusGraphicState state; + + state.aWorldTransform = aWorldTransform; + state.aDevState = rState; + + map[ index ] = state; + } + + void ImplRenderer::GraphicStatePop(GraphicStateMap& map, sal_Int32 index, OutDevState& rState) + { + GraphicStateMap::iterator iter = map.find( index ); + + if ( iter != map.end() ) + { + EMFP_DEBUG (printf ("stack index: %d found\n", index)); + + EmfPlusGraphicState state = iter->second; + + aWorldTransform = state.aWorldTransform; + rState.clip = state.aDevState.clip; + rState.clipRect = state.aDevState.clipRect; + rState.xClipPoly = state.aDevState.xClipPoly; + } + } + void ImplRenderer::processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas ) { @@ -1677,46 +1716,44 @@ namespace cppcanvas 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 ); + GraphicStatePush( mGSStack, stackIndex, rState ); - EMFP_DEBUG (printf ("stack index: %d found and erased\n", stackIndex)); - } + break; + } + case EmfPlusRecordTypeRestore: + { + sal_uInt32 stackIndex; - EmfPlusGraphicState aState; + rMF >> stackIndex; - aState.aWorldTransform = aWorldTransform; - aState.aDevState = rState; + EMFP_DEBUG (printf ("EMF+ Restore stack index: %d\n", stackIndex)); - mGSStack[ stackIndex ] = aState; + GraphicStatePop( mGSStack, stackIndex, rState ); break; } - case EmfPlusRecordTypeRestore: + case EmfPlusRecordTypeBeginContainerNoParams: { sal_uInt32 stackIndex; rMF >> stackIndex; - EMFP_DEBUG (printf ("EMF+ Restore stack index: %d\n", stackIndex)); + EMFP_DEBUG (printf ("EMF+ Begin Container No Params stack index: %d\n", stackIndex)); - EPGSSIter aIter = mGSStack.find( stackIndex ); + GraphicStatePush( mGSContainerStack, stackIndex, rState ); + } + break; + case EmfPlusRecordTypeEndContainer: + { + sal_uInt32 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; - } + rMF >> stackIndex; - break; + EMFP_DEBUG (printf ("EMF+ End Container stack index: %d\n", stackIndex)); + + GraphicStatePop( mGSContainerStack, stackIndex, rState ); } + break; case EmfPlusRecordTypeSetWorldTransform: { EMFP_DEBUG (printf ("EMF+ SetWorldTransform\n")); XForm transform; |