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 )
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;
};
......
......@@ -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;
......
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