diff options
author | Radek Doulik <rodo@novell.com> | 2013-03-19 13:17:42 +0100 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-03-19 14:13:32 +0000 |
commit | af837e0fd656859e6c0a11020ea3556bfe984d06 (patch) | |
tree | b78e1562e94e3e0ebe36883b3ab756e9e4764de5 /cppcanvas/source | |
parent | 5df8397041f15a6c8aea6e4088ba3999606a0c51 (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>
Diffstat (limited to 'cppcanvas/source')
-rw-r--r-- | cppcanvas/source/inc/implrenderer.hxx | 12 | ||||
-rw-r--r-- | cppcanvas/source/inc/outdevstate.hxx (renamed from cppcanvas/source/mtfrenderer/outdevstate.hxx) | 0 | ||||
-rw-r--r-- | cppcanvas/source/mtfrenderer/emfplus.cxx | 49 |
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; |