[Libreoffice-commits] core.git: cppcanvas/source

Radek Doulik rodo at novell.com
Fri Mar 22 12:56:01 PDT 2013


 cppcanvas/source/inc/implrenderer.hxx    |    8 ++
 cppcanvas/source/mtfrenderer/emfplus.cxx |   85 ++++++++++++++++++++++---------
 2 files changed, 67 insertions(+), 26 deletions(-)

New commits:
commit 8b1eac4a14e222238913b8b33c0aeb98ea702589
Author: Radek Doulik <rodo at novell.com>
Date:   Fri Mar 22 20:54:03 2013 +0100

    implemented BeginContainerNoParams and EndContainer records
    
     - plus a bit of refactoring to reuse code
    
    Change-Id: I416d2c47800752a27e2dc79f9b55b096e641062f

diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx
index 4537368..addcdc2 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 8989113..5cf3264 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;


More information about the Libreoffice-commits mailing list