summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadek Doulik <rodo@novell.com>2013-03-19 13:17:42 +0100
committerFridrich Strba <fridrich@documentfoundation.org>2013-03-19 14:13:32 +0000
commitaf837e0fd656859e6c0a11020ea3556bfe984d06 (patch)
treeb78e1562e94e3e0ebe36883b3ab756e9e4764de5
parent5df8397041f15a6c8aea6e4088ba3999606a0c51 (diff)
implemented EmfPlusRecordTypeSave and EmfPlusRecordTypeRestore records
Signed-off-by: Fridrich Štrba <fridrich.strba@bluewin.ch> (cherry picked from commit 5a86702e13b3654982f1ee84da981d7fb8c442c5) Change-Id: Iac87870c0f50a74b7f4db4c674adcded1494c055 Reviewed-on: https://gerrit.libreoffice.org/2839 Reviewed-by: Noel Power <noel.power@suse.com> Reviewed-by: Michael Meeks <michael.meeks@suse.com> Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r--cppcanvas/source/inc/implrenderer.hxx12
-rw-r--r--cppcanvas/source/inc/outdevstate.hxx (renamed from cppcanvas/source/mtfrenderer/outdevstate.hxx)0
-rw-r--r--cppcanvas/source/mtfrenderer/emfplus.cxx49
3 files changed, 58 insertions, 3 deletions
diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx
index c2902d6c0b6a..453736825e9b 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/mtfrenderer/outdevstate.hxx b/cppcanvas/source/inc/outdevstate.hxx
index 26e10263a369..26e10263a369 100644
--- a/cppcanvas/source/mtfrenderer/outdevstate.hxx
+++ b/cppcanvas/source/inc/outdevstate.hxx
diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index 491b085e6aff..81f7eb7de01b 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
@@ -1658,9 +1659,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;