summaryrefslogtreecommitdiff
path: root/cppcanvas/source
diff options
context:
space:
mode:
authorRadek Doulik <rodo@novell.com>2013-03-22 20:54:03 +0100
committerRadek Doulik <rodo@novell.com>2013-03-22 20:55:09 +0100
commit8b1eac4a14e222238913b8b33c0aeb98ea702589 (patch)
tree42a3da412b37fb46f70b8acb5bdaaf6fa9ebe7f7 /cppcanvas/source
parent98d72730b7c6320341b52ed18ed765b72cf922c1 (diff)
implemented BeginContainerNoParams and EndContainer records
- plus a bit of refactoring to reuse code Change-Id: I416d2c47800752a27e2dc79f9b55b096e641062f
Diffstat (limited to 'cppcanvas/source')
-rw-r--r--cppcanvas/source/inc/implrenderer.hxx8
-rw-r--r--cppcanvas/source/mtfrenderer/emfplus.cxx85
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;