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 <r...@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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits