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

Radek Doulik rodo at novell.com
Tue Mar 19 05:20:14 PDT 2013


 cppcanvas/source/inc/implrenderer.hxx        |   12 ++
 cppcanvas/source/inc/outdevstate.hxx         |  126 +++++++++++++++++++++++++++
 cppcanvas/source/mtfrenderer/emfplus.cxx     |   49 ++++++++++
 cppcanvas/source/mtfrenderer/outdevstate.hxx |  126 ---------------------------
 4 files changed, 184 insertions(+), 129 deletions(-)

New commits:
commit 69b19ba284a1589a9e85b259dfe327cb7ee9d618
Author: Radek Doulik <rodo at novell.com>
Date:   Tue Mar 19 13:17:42 2013 +0100

    implemented EmfPlusRecordTypeSave and EmfPlusRecordTypeRestore records
    
    Change-Id: Iac87870c0f50a74b7f4db4c674adcded1494c055

diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx
index c2902d6..4537368 100644
--- a/cppcanvas/source/inc/implrenderer.hxx
+++ b/cppcanvas/source/inc/implrenderer.hxx
@@ -28,8 +28,10 @@
 
 #include <canvasgraphichelper.hxx>
 #include <action.hxx>
+#include <outdevstate.hxx>
 
 #include <vector>
+#include <map>
 
 class GDIMetaFile;
 class VirtualDevice;
@@ -166,6 +168,12 @@ static float GetSwapFloat( SvStream& rSt )
             }
         };
 
+        // EMF+
+        typedef struct {
+            XForm aWorldTransform;
+            OutDevState aDevState;
+        } EmfPlusGraphicState;
+
         class ImplRenderer : public virtual Renderer, protected CanvasGraphicHelper
         {
         public:
@@ -278,7 +286,6 @@ static float GetSwapFloat( SvStream& rSt )
             sal_Int32       nOriginY;
             sal_Int32       nHDPI;
             sal_Int32       nVDPI;
-            ::PolyPolygon   aClippingPolygon;
             /* EMF+ emf header info */
             sal_Int32       nFrameLeft;
             sal_Int32       nFrameTop;
@@ -292,6 +299,9 @@ static float GetSwapFloat( SvStream& rSt )
             bool            mbMultipart;
             sal_uInt16      mMFlags;
             SvMemoryStream  mMStream;
+            /* emf+ graphic state stack */
+            ::std::map<int,EmfPlusGraphicState> mGSStack;
+            typedef ::std::map<int,EmfPlusGraphicState>::iterator EPGSSIter;
         };
 
 
diff --git a/cppcanvas/source/inc/outdevstate.hxx b/cppcanvas/source/inc/outdevstate.hxx
new file mode 100644
index 0000000..26e1026
--- /dev/null
+++ b/cppcanvas/source/inc/outdevstate.hxx
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef _CPPCANVAS_OUTDEVSTATE_HXX
+#define _CPPCANVAS_OUTDEVSTATE_HXX
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+#include <com/sun/star/rendering/StringContext.hpp>
+#include <com/sun/star/rendering/RenderState.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+#include <com/sun/star/rendering/XCanvasFont.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <vcl/fntstyle.hxx>
+#include <vcl/vclenum.hxx>
+#include <vcl/outdev.hxx>
+
+
+namespace cppcanvas
+{
+    namespace internal
+    {
+        struct OutDevState
+        {
+            OutDevState() :
+                clip(),
+                clipRect(),
+                xClipPoly(),
+
+                lineColor(),
+                fillColor(),
+                textColor(),
+                textFillColor(),
+                textLineColor(),
+
+                xFont(),
+                transform(),
+                mapModeTransform(),
+                fontRotation(0.0),
+
+                textEmphasisMarkStyle(EMPHASISMARK_NONE),
+                pushFlags(PUSH_ALL),
+                textDirection(::com::sun::star::rendering::TextDirection::WEAK_LEFT_TO_RIGHT),
+                textAlignment(0), // TODO(Q2): Synchronize with implrenderer
+                                  // and possibly new rendering::TextAlignment
+                textReliefStyle(RELIEF_NONE),
+                textOverlineStyle(UNDERLINE_NONE),
+                textUnderlineStyle(UNDERLINE_NONE),
+                textStrikeoutStyle(STRIKEOUT_NONE),
+                textReferencePoint(ALIGN_BASELINE),
+
+                isTextOutlineModeSet( false ),
+                isTextEffectShadowSet( false ),
+                isTextWordUnderlineSet( false ),
+
+                isLineColorSet( false ),
+                isFillColorSet( false ),
+                isTextFillColorSet( false ),
+                isTextLineColorSet( false )
+            {
+            }
+
+            ::basegfx::B2DPolyPolygon                                                           clip;
+            ::Rectangle                                                                         clipRect;
+            ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >     xClipPoly;
+
+            ::com::sun::star::uno::Sequence< double >                                           lineColor;
+            ::com::sun::star::uno::Sequence< double >                                           fillColor;
+            ::com::sun::star::uno::Sequence< double >                                           textColor;
+            ::com::sun::star::uno::Sequence< double >                                           textFillColor;
+            ::com::sun::star::uno::Sequence< double >                                           textLineColor;
+
+            /** Current font.
+
+                @attention Beware, this member can be NULL, and
+                nevertheless text output is generated.
+             */
+            ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont >        xFont;
+            ::basegfx::B2DHomMatrix                                                             transform;
+            ::basegfx::B2DHomMatrix                                                             mapModeTransform;
+            double                                                                              fontRotation;
+
+            sal_uInt16                                                                          textEmphasisMarkStyle;
+            sal_uInt16                                                                          pushFlags;
+            sal_Int8                                                                            textDirection;
+            sal_Int8                                                                            textAlignment;
+            sal_Int8                                                                            textReliefStyle;
+            sal_Int8                                                                            textOverlineStyle;
+            sal_Int8                                                                            textUnderlineStyle;
+            sal_Int8                                                                            textStrikeoutStyle;
+            TextAlign                                                                           textReferencePoint;
+
+            bool                                                                                isTextOutlineModeSet;
+            bool                                                                                isTextEffectShadowSet;
+            bool                                                                                isTextWordUnderlineSet;
+
+            bool                                                                                isLineColorSet;
+            bool                                                                                isFillColorSet;
+            bool                                                                                isTextFillColorSet;
+            bool                                                                                isTextLineColorSet;
+        };
+    }
+}
+
+#endif /* _CPPCANVAS_OUTDEVSTATE_HXX */
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index 3f787e1..8989113 100644
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
@@ -68,6 +68,7 @@
 #define EmfPlusRecordTypeSetPixelOffsetMode 16418
 #define EmfPlusRecordTypeSetCompositingQuality 16420
 #define EmfPlusRecordTypeSave 16421
+#define EmfPlusRecordTypeRestore 16422
 #define EmfPlusRecordTypeSetWorldTransform 16426
 #define EmfPlusRecordTypeResetWorldTransform 16427
 #define EmfPlusRecordTypeMultiplyWorldTransform 16428
@@ -1669,9 +1670,53 @@ namespace cppcanvas
                         EMFP_DEBUG (printf ("EMF+\tTODO\n"));
                         break;
                     case EmfPlusRecordTypeSave:
-                        EMFP_DEBUG (printf ("EMF+ Save\n"));
-                        EMFP_DEBUG (printf ("EMF+\tTODO\n"));
+                    {
+                        sal_uInt32 stackIndex;
+
+                        rMF >> stackIndex;
+
+                        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 );
+
+                            EMFP_DEBUG (printf ("stack index: %d found and erased\n", stackIndex));
+                        }
+
+                        EmfPlusGraphicState aState;
+
+                        aState.aWorldTransform = aWorldTransform;
+                        aState.aDevState = rState;
+
+                        mGSStack[ stackIndex ] = aState;
+
                         break;
+                    }
+                    case EmfPlusRecordTypeRestore:
+                    {
+                        sal_uInt32 stackIndex;
+
+                        rMF >> stackIndex;
+
+                        EMFP_DEBUG (printf ("EMF+ Restore stack index: %d\n", stackIndex));
+
+                        EPGSSIter aIter = mGSStack.find( 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;
+                        }
+
+                        break;
+                    }
                     case EmfPlusRecordTypeSetWorldTransform: {
                         EMFP_DEBUG (printf ("EMF+ SetWorldTransform\n"));
                         XForm transform;
diff --git a/cppcanvas/source/mtfrenderer/outdevstate.hxx b/cppcanvas/source/mtfrenderer/outdevstate.hxx
deleted file mode 100644
index 26e1026..0000000
--- a/cppcanvas/source/mtfrenderer/outdevstate.hxx
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef _CPPCANVAS_OUTDEVSTATE_HXX
-#define _CPPCANVAS_OUTDEVSTATE_HXX
-
-#include <com/sun/star/uno/Reference.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-
-#include <com/sun/star/rendering/StringContext.hpp>
-#include <com/sun/star/rendering/RenderState.hpp>
-#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
-#include <com/sun/star/rendering/XCanvasFont.hpp>
-#include <com/sun/star/rendering/TextDirection.hpp>
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <basegfx/polygon/b2dpolypolygon.hxx>
-#include <vcl/fntstyle.hxx>
-#include <vcl/vclenum.hxx>
-#include <vcl/outdev.hxx>
-
-
-namespace cppcanvas
-{
-    namespace internal
-    {
-        struct OutDevState
-        {
-            OutDevState() :
-                clip(),
-                clipRect(),
-                xClipPoly(),
-
-                lineColor(),
-                fillColor(),
-                textColor(),
-                textFillColor(),
-                textLineColor(),
-
-                xFont(),
-                transform(),
-                mapModeTransform(),
-                fontRotation(0.0),
-
-                textEmphasisMarkStyle(EMPHASISMARK_NONE),
-                pushFlags(PUSH_ALL),
-                textDirection(::com::sun::star::rendering::TextDirection::WEAK_LEFT_TO_RIGHT),
-                textAlignment(0), // TODO(Q2): Synchronize with implrenderer
-                                  // and possibly new rendering::TextAlignment
-                textReliefStyle(RELIEF_NONE),
-                textOverlineStyle(UNDERLINE_NONE),
-                textUnderlineStyle(UNDERLINE_NONE),
-                textStrikeoutStyle(STRIKEOUT_NONE),
-                textReferencePoint(ALIGN_BASELINE),
-
-                isTextOutlineModeSet( false ),
-                isTextEffectShadowSet( false ),
-                isTextWordUnderlineSet( false ),
-
-                isLineColorSet( false ),
-                isFillColorSet( false ),
-                isTextFillColorSet( false ),
-                isTextLineColorSet( false )
-            {
-            }
-
-            ::basegfx::B2DPolyPolygon                                                           clip;
-            ::Rectangle                                                                         clipRect;
-            ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >     xClipPoly;
-
-            ::com::sun::star::uno::Sequence< double >                                           lineColor;
-            ::com::sun::star::uno::Sequence< double >                                           fillColor;
-            ::com::sun::star::uno::Sequence< double >                                           textColor;
-            ::com::sun::star::uno::Sequence< double >                                           textFillColor;
-            ::com::sun::star::uno::Sequence< double >                                           textLineColor;
-
-            /** Current font.
-
-                @attention Beware, this member can be NULL, and
-                nevertheless text output is generated.
-             */
-            ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont >        xFont;
-            ::basegfx::B2DHomMatrix                                                             transform;
-            ::basegfx::B2DHomMatrix                                                             mapModeTransform;
-            double                                                                              fontRotation;
-
-            sal_uInt16                                                                          textEmphasisMarkStyle;
-            sal_uInt16                                                                          pushFlags;
-            sal_Int8                                                                            textDirection;
-            sal_Int8                                                                            textAlignment;
-            sal_Int8                                                                            textReliefStyle;
-            sal_Int8                                                                            textOverlineStyle;
-            sal_Int8                                                                            textUnderlineStyle;
-            sal_Int8                                                                            textStrikeoutStyle;
-            TextAlign                                                                           textReferencePoint;
-
-            bool                                                                                isTextOutlineModeSet;
-            bool                                                                                isTextEffectShadowSet;
-            bool                                                                                isTextWordUnderlineSet;
-
-            bool                                                                                isLineColorSet;
-            bool                                                                                isFillColorSet;
-            bool                                                                                isTextFillColorSet;
-            bool                                                                                isTextLineColorSet;
-        };
-    }
-}
-
-#endif /* _CPPCANVAS_OUTDEVSTATE_HXX */
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list