Kaydet (Commit) 8b1eac4a authored tarafından Radek Doulik's avatar Radek Doulik

implemented BeginContainerNoParams and EndContainer records

 - plus a bit of refactoring to reuse code

Change-Id: I416d2c47800752a27e2dc79f9b55b096e641062f
üst 98d72730
...@@ -174,6 +174,8 @@ static float GetSwapFloat( SvStream& rSt ) ...@@ -174,6 +174,8 @@ static float GetSwapFloat( SvStream& rSt )
OutDevState aDevState; OutDevState aDevState;
} EmfPlusGraphicState; } EmfPlusGraphicState;
typedef ::std::map<int,EmfPlusGraphicState> GraphicStateMap;
class ImplRenderer : public virtual Renderer, protected CanvasGraphicHelper class ImplRenderer : public virtual Renderer, protected CanvasGraphicHelper
{ {
public: public:
...@@ -215,6 +217,8 @@ static float GetSwapFloat( SvStream& rSt ) ...@@ -215,6 +217,8 @@ static float GetSwapFloat( SvStream& rSt )
void MapToDevice (double &x, double &y); void MapToDevice (double &x, double &y);
::basegfx::B2DPoint Map (double ix, double iy); ::basegfx::B2DPoint Map (double ix, double iy);
::basegfx::B2DSize MapSize (double iwidth, double iheight); ::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: private:
// default: disabled copy/assignment // default: disabled copy/assignment
...@@ -300,8 +304,8 @@ static float GetSwapFloat( SvStream& rSt ) ...@@ -300,8 +304,8 @@ static float GetSwapFloat( SvStream& rSt )
sal_uInt16 mMFlags; sal_uInt16 mMFlags;
SvMemoryStream mMStream; SvMemoryStream mMStream;
/* emf+ graphic state stack */ /* emf+ graphic state stack */
::std::map<int,EmfPlusGraphicState> mGSStack; GraphicStateMap mGSStack;
typedef ::std::map<int,EmfPlusGraphicState>::iterator EPGSSIter; GraphicStateMap mGSContainerStack;
}; };
......
...@@ -69,6 +69,8 @@ ...@@ -69,6 +69,8 @@
#define EmfPlusRecordTypeSetCompositingQuality 16420 #define EmfPlusRecordTypeSetCompositingQuality 16420
#define EmfPlusRecordTypeSave 16421 #define EmfPlusRecordTypeSave 16421
#define EmfPlusRecordTypeRestore 16422 #define EmfPlusRecordTypeRestore 16422
#define EmfPlusRecordTypeBeginContainerNoParams 16424
#define EmfPlusRecordTypeEndContainer 16425
#define EmfPlusRecordTypeSetWorldTransform 16426 #define EmfPlusRecordTypeSetWorldTransform 16426
#define EmfPlusRecordTypeResetWorldTransform 16427 #define EmfPlusRecordTypeResetWorldTransform 16427
#define EmfPlusRecordTypeMultiplyWorldTransform 16428 #define EmfPlusRecordTypeMultiplyWorldTransform 16428
...@@ -1221,6 +1223,43 @@ namespace cppcanvas ...@@ -1221,6 +1223,43 @@ namespace cppcanvas
return cellSize; 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, void ImplRenderer::processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms,
OutDevState& rState, const CanvasSharedPtr& rCanvas ) OutDevState& rState, const CanvasSharedPtr& rCanvas )
{ {
...@@ -1677,46 +1716,44 @@ namespace cppcanvas ...@@ -1677,46 +1716,44 @@ namespace cppcanvas
EMFP_DEBUG (printf ("EMF+ Save stack index: %d\n", stackIndex)); EMFP_DEBUG (printf ("EMF+ Save stack index: %d\n", stackIndex));
EPGSSIter aIter = mGSStack.find( stackIndex ); GraphicStatePush( mGSStack, stackIndex, rState );
if ( aIter != mGSStack.end() ) break;
{
EmfPlusGraphicState aState = aIter->second;
mGSStack.erase( aIter );
EMFP_DEBUG (printf ("stack index: %d found and erased\n", stackIndex));
} }
case EmfPlusRecordTypeRestore:
{
sal_uInt32 stackIndex;
EmfPlusGraphicState aState; rMF >> stackIndex;
aState.aWorldTransform = aWorldTransform; EMFP_DEBUG (printf ("EMF+ Restore stack index: %d\n", stackIndex));
aState.aDevState = rState;
mGSStack[ stackIndex ] = aState; GraphicStatePop( mGSStack, stackIndex, rState );
break; break;
} }
case EmfPlusRecordTypeRestore: case EmfPlusRecordTypeBeginContainerNoParams:
{ {
sal_uInt32 stackIndex; sal_uInt32 stackIndex;
rMF >> 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 );
if ( aIter != mGSStack.end() ) { GraphicStatePush( mGSContainerStack, stackIndex, rState );
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; break;
case EmfPlusRecordTypeEndContainer:
{
sal_uInt32 stackIndex;
rMF >> stackIndex;
EMFP_DEBUG (printf ("EMF+ End Container stack index: %d\n", stackIndex));
GraphicStatePop( mGSContainerStack, stackIndex, rState );
} }
break;
case EmfPlusRecordTypeSetWorldTransform: { case EmfPlusRecordTypeSetWorldTransform: {
EMFP_DEBUG (printf ("EMF+ SetWorldTransform\n")); EMFP_DEBUG (printf ("EMF+ SetWorldTransform\n"));
XForm transform; XForm transform;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment