diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-12-29 15:36:54 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-01-05 09:18:17 +0000 |
commit | 2669d048bc8c38f5b75cd0ecdde8d6ae326601eb (patch) | |
tree | b34e5ebb94d290e72d49d563646cc06c0297886e /cppcanvas | |
parent | 91894d52b6a585c57d68c67b1e0fbe2bee426279 (diff) |
make VectorOfOutDevStates a class and refactor this a little
Diffstat (limited to 'cppcanvas')
-rw-r--r-- | cppcanvas/source/inc/implrenderer.hxx | 12 | ||||
-rw-r--r-- | cppcanvas/source/mtfrenderer/implrenderer.cxx | 483 |
2 files changed, 254 insertions, 241 deletions
diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index 3c1ec6de127f..9c270e822a99 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -69,7 +69,17 @@ namespace cppcanvas // state stack of OutputDevice, to correctly handle // push/pop actions - typedef ::std::vector< OutDevState > VectorOfOutDevStates; + class VectorOfOutDevStates + { + public: + OutDevState& getState(); + const OutDevState& getState() const; + void pushState(sal_uInt16 nFlags); + void popState(); + void clearStateStack(); + private: + ::std::vector< OutDevState > m_aStates; + }; // EMF+ // TODO: replace? diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx index 65b9d21a37ee..9132ebd698dc 100644 --- a/cppcanvas/source/mtfrenderer/implrenderer.cxx +++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx @@ -128,154 +128,13 @@ namespace } } - - // state stack manipulators - // ------------------------ - void clearStateStack( ::cppcanvas::internal::VectorOfOutDevStates& rStates ) - { - rStates.clear(); - const ::cppcanvas::internal::OutDevState aDefaultState; - rStates.push_back( aDefaultState ); - } - - ::cppcanvas::internal::OutDevState& getState( ::cppcanvas::internal::VectorOfOutDevStates& rStates ) - { - return rStates.back(); - } - - const ::cppcanvas::internal::OutDevState& getState( const ::cppcanvas::internal::VectorOfOutDevStates& rStates ) - { - return rStates.back(); - } - - void pushState( ::cppcanvas::internal::VectorOfOutDevStates& rStates, - sal_uInt16 nFlags ) - { - rStates.push_back( getState( rStates ) ); - getState( rStates ).pushFlags = nFlags; - } - - void popState( ::cppcanvas::internal::VectorOfOutDevStates& rStates ) - { - if( getState( rStates ).pushFlags != PUSH_ALL ) - { - // a state is pushed which is incomplete, i.e. does not - // restore everything to the previous stack level when - // popped. - // That means, we take the old state, and restore every - // OutDevState member whose flag is set, from the new to the - // old state. Then the new state gets overwritten by the - // calculated state - - // preset to-be-calculated new state with old state - ::cppcanvas::internal::OutDevState aCalculatedNewState( getState( rStates ) ); - - // selectively copy to-be-restored content over saved old - // state - rStates.pop_back(); - - const ::cppcanvas::internal::OutDevState& rNewState( getState( rStates ) ); - - if( (aCalculatedNewState.pushFlags & PUSH_LINECOLOR) ) - { - aCalculatedNewState.lineColor = rNewState.lineColor; - aCalculatedNewState.isLineColorSet = rNewState.isLineColorSet; - } - - if( (aCalculatedNewState.pushFlags & PUSH_FILLCOLOR) ) - { - aCalculatedNewState.fillColor = rNewState.fillColor; - aCalculatedNewState.isFillColorSet = rNewState.isFillColorSet; - } - - if( (aCalculatedNewState.pushFlags & PUSH_FONT) ) - { - aCalculatedNewState.xFont = rNewState.xFont; - aCalculatedNewState.fontRotation = rNewState.fontRotation; - aCalculatedNewState.textReliefStyle = rNewState.textReliefStyle; - aCalculatedNewState.textOverlineStyle = rNewState.textOverlineStyle; - aCalculatedNewState.textUnderlineStyle = rNewState.textUnderlineStyle; - aCalculatedNewState.textStrikeoutStyle = rNewState.textStrikeoutStyle; - aCalculatedNewState.textEmphasisMarkStyle = rNewState.textEmphasisMarkStyle; - aCalculatedNewState.isTextEffectShadowSet = rNewState.isTextEffectShadowSet; - aCalculatedNewState.isTextWordUnderlineSet = rNewState.isTextWordUnderlineSet; - aCalculatedNewState.isTextOutlineModeSet = rNewState.isTextOutlineModeSet; - } - - if( (aCalculatedNewState.pushFlags & PUSH_TEXTCOLOR) ) - { - aCalculatedNewState.textColor = rNewState.textColor; - } - - if( (aCalculatedNewState.pushFlags & PUSH_MAPMODE) ) - { - aCalculatedNewState.mapModeTransform = rNewState.mapModeTransform; - } - - if( (aCalculatedNewState.pushFlags & PUSH_CLIPREGION) ) - { - aCalculatedNewState.clip = rNewState.clip; - aCalculatedNewState.clipRect = rNewState.clipRect; - aCalculatedNewState.xClipPoly = rNewState.xClipPoly; - } - - // TODO(F2): Raster ops NYI - // if( (aCalculatedNewState.pushFlags & PUSH_RASTEROP) ) - // { - // } - - if( (aCalculatedNewState.pushFlags & PUSH_TEXTFILLCOLOR) ) - { - aCalculatedNewState.textFillColor = rNewState.textFillColor; - aCalculatedNewState.isTextFillColorSet = rNewState.isTextFillColorSet; - } - - if( (aCalculatedNewState.pushFlags & PUSH_TEXTALIGN) ) - { - aCalculatedNewState.textReferencePoint = rNewState.textReferencePoint; - } - - // TODO(F1): Refpoint handling NYI - // if( (aCalculatedNewState.pushFlags & PUSH_REFPOINT) ) - // { - // } - - if( (aCalculatedNewState.pushFlags & PUSH_TEXTLINECOLOR) ) - { - aCalculatedNewState.textLineColor = rNewState.textLineColor; - aCalculatedNewState.isTextLineColorSet = rNewState.isTextLineColorSet; - } - - if( (aCalculatedNewState.pushFlags & PUSH_TEXTLAYOUTMODE) ) - { - aCalculatedNewState.textAlignment = rNewState.textAlignment; - aCalculatedNewState.textDirection = rNewState.textDirection; - } - - // TODO(F2): Text language handling NYI - // if( (aCalculatedNewState.pushFlags & PUSH_TEXTLANGUAGE) ) - // { - // } - - // always copy push mode - aCalculatedNewState.pushFlags = rNewState.pushFlags; - - // flush to stack - getState( rStates ) = aCalculatedNewState; - } - else - { - rStates.pop_back(); - } - } - void setupStrokeAttributes( rendering::StrokeAttributes& o_rStrokeAttributes, const ::cppcanvas::internal::ActionFactoryParameters& rParms, const LineInfo& rLineInfo ) { const ::basegfx::B2DSize aWidth( rLineInfo.GetWidth(), 0 ); o_rStrokeAttributes.StrokeWidth = - (getState( rParms.mrStates ).mapModeTransform * aWidth).getX(); + (rParms.mrStates.getState().mapModeTransform * aWidth).getX(); // setup reasonable defaults o_rStrokeAttributes.MiterLimit = 15.0; // 1.0 was no good default; GDI+'s limit is 10.0, our's is 15.0 @@ -300,7 +159,7 @@ namespace if( LINE_DASH == rLineInfo.GetStyle() ) { - const ::cppcanvas::internal::OutDevState& rState( getState( rParms.mrStates ) ); + const ::cppcanvas::internal::OutDevState& rState( rParms.mrStates.getState() ); // TODO(F1): Interpret OutDev::GetRefPoint() for the start of the dashing. @@ -464,10 +323,149 @@ namespace cppcanvas { namespace internal { + // state stack manipulators + // ------------------------ + void VectorOfOutDevStates::clearStateStack() + { + m_aStates.clear(); + const OutDevState aDefaultState; + m_aStates.push_back(aDefaultState); + } + + OutDevState& VectorOfOutDevStates::getState() + { + return m_aStates.back(); + } + + const OutDevState& VectorOfOutDevStates::getState() const + { + return m_aStates.back(); + } + + void VectorOfOutDevStates::pushState(sal_uInt16 nFlags) + { + m_aStates.push_back( getState() ); + getState().pushFlags = nFlags; + } + + void VectorOfOutDevStates::popState() + { + if( getState().pushFlags != PUSH_ALL ) + { + // a state is pushed which is incomplete, i.e. does not + // restore everything to the previous stack level when + // popped. + // That means, we take the old state, and restore every + // OutDevState member whose flag is set, from the new to the + // old state. Then the new state gets overwritten by the + // calculated state + + // preset to-be-calculated new state with old state + OutDevState aCalculatedNewState( getState() ); + + // selectively copy to-be-restored content over saved old + // state + m_aStates.pop_back(); + + const OutDevState& rNewState( getState() ); + + if( (aCalculatedNewState.pushFlags & PUSH_LINECOLOR) ) + { + aCalculatedNewState.lineColor = rNewState.lineColor; + aCalculatedNewState.isLineColorSet = rNewState.isLineColorSet; + } + + if( (aCalculatedNewState.pushFlags & PUSH_FILLCOLOR) ) + { + aCalculatedNewState.fillColor = rNewState.fillColor; + aCalculatedNewState.isFillColorSet = rNewState.isFillColorSet; + } + + if( (aCalculatedNewState.pushFlags & PUSH_FONT) ) + { + aCalculatedNewState.xFont = rNewState.xFont; + aCalculatedNewState.fontRotation = rNewState.fontRotation; + aCalculatedNewState.textReliefStyle = rNewState.textReliefStyle; + aCalculatedNewState.textOverlineStyle = rNewState.textOverlineStyle; + aCalculatedNewState.textUnderlineStyle = rNewState.textUnderlineStyle; + aCalculatedNewState.textStrikeoutStyle = rNewState.textStrikeoutStyle; + aCalculatedNewState.textEmphasisMarkStyle = rNewState.textEmphasisMarkStyle; + aCalculatedNewState.isTextEffectShadowSet = rNewState.isTextEffectShadowSet; + aCalculatedNewState.isTextWordUnderlineSet = rNewState.isTextWordUnderlineSet; + aCalculatedNewState.isTextOutlineModeSet = rNewState.isTextOutlineModeSet; + } + + if( (aCalculatedNewState.pushFlags & PUSH_TEXTCOLOR) ) + { + aCalculatedNewState.textColor = rNewState.textColor; + } + + if( (aCalculatedNewState.pushFlags & PUSH_MAPMODE) ) + { + aCalculatedNewState.mapModeTransform = rNewState.mapModeTransform; + } + + if( (aCalculatedNewState.pushFlags & PUSH_CLIPREGION) ) + { + aCalculatedNewState.clip = rNewState.clip; + aCalculatedNewState.clipRect = rNewState.clipRect; + aCalculatedNewState.xClipPoly = rNewState.xClipPoly; + } + + // TODO(F2): Raster ops NYI + // if( (aCalculatedNewState.pushFlags & PUSH_RASTEROP) ) + // { + // } + + if( (aCalculatedNewState.pushFlags & PUSH_TEXTFILLCOLOR) ) + { + aCalculatedNewState.textFillColor = rNewState.textFillColor; + aCalculatedNewState.isTextFillColorSet = rNewState.isTextFillColorSet; + } + + if( (aCalculatedNewState.pushFlags & PUSH_TEXTALIGN) ) + { + aCalculatedNewState.textReferencePoint = rNewState.textReferencePoint; + } + + // TODO(F1): Refpoint handling NYI + // if( (aCalculatedNewState.pushFlags & PUSH_REFPOINT) ) + // { + // } + + if( (aCalculatedNewState.pushFlags & PUSH_TEXTLINECOLOR) ) + { + aCalculatedNewState.textLineColor = rNewState.textLineColor; + aCalculatedNewState.isTextLineColorSet = rNewState.isTextLineColorSet; + } + + if( (aCalculatedNewState.pushFlags & PUSH_TEXTLAYOUTMODE) ) + { + aCalculatedNewState.textAlignment = rNewState.textAlignment; + aCalculatedNewState.textDirection = rNewState.textDirection; + } + + // TODO(F2): Text language handling NYI + // if( (aCalculatedNewState.pushFlags & PUSH_TEXTLANGUAGE) ) + // { + // } + + // always copy push mode + aCalculatedNewState.pushFlags = rNewState.pushFlags; + + // flush to stack + getState() = aCalculatedNewState; + } + else + { + m_aStates.pop_back(); + } + } + bool ImplRenderer::createFillAndStroke( const ::basegfx::B2DPolyPolygon& rPolyPoly, const ActionFactoryParameters& rParms ) { - const OutDevState& rState( getState( rParms.mrStates ) ); + const OutDevState& rState( rParms.mrStates.getState() ); if( (!rState.isLineColorSet && !rState.isFillColorSet) || (rState.lineColor.getLength() == 0 && @@ -583,7 +581,7 @@ namespace cppcanvas DBG_TESTSOLARMUTEX(); ::basegfx::B2DPolyPolygon aDevicePoly( rPoly.getB2DPolyPolygon() ); - aDevicePoly.transform( getState( rParms.mrStates ).mapModeTransform ); + aDevicePoly.transform( rParms.mrStates.getState().mapModeTransform ); // decide, whether this gradient can be rendered natively // by the canvas, or must be emulated via VCL gradient @@ -799,7 +797,7 @@ namespace cppcanvas internal::PolyPolyActionFactory::createPolyPolyAction( aDevicePoly, rParms.mrCanvas, - getState( rParms.mrStates ), + rParms.mrStates.getState(), aTexture ) ); if( pPolyAction ) @@ -821,7 +819,7 @@ namespace cppcanvas // cannot currently use native canvas gradients, as a // finite step size is given (this funny feature is not // supported by the XCanvas API) - pushState( rParms.mrStates, PUSH_ALL ); + rParms.mrStates.pushState(PUSH_ALL); if( !bIsPolygonRectangle ) { @@ -841,7 +839,7 @@ namespace cppcanvas createActions( aTmpMtf, rParms, bSubsettableActions ); - popState( rParms.mrStates ); + rParms.mrStates.popState(); } uno::Reference< rendering::XCanvasFont > ImplRenderer::createFont( double& o_rFontRotation, @@ -916,7 +914,7 @@ namespace cppcanvas // #i52608# apply map mode scale also to font matrix - an // anisotrophic mapmode must be reflected in an // anisotrophic font matrix scale. - const OutDevState& rState( getState( rParms.mrStates ) ); + const OutDevState& rState( rParms.mrStates.getState() ); if( !::basegfx::fTools::equal( rState.mapModeTransform.get(0,0), rState.mapModeTransform.get(1,1)) ) @@ -954,7 +952,7 @@ namespace cppcanvas if( !nLength ) return; // zero-length text, no visible output - const OutDevState& rState( getState( rParms.mrStates ) ); + const OutDevState& rState( rParms.mrStates.getState() ); // TODO(F2): implement all text effects // if( rState.textAlignment ); // TODO(F2): NYI @@ -1014,7 +1012,7 @@ namespace cppcanvas if( aTextColor.GetColor() == COL_BLACK ) { aTextColor = ::Color( COL_WHITE ); - getState( rParms.mrStates ).textColor = + rParms.mrStates.getState().textColor = ::vcl::unotools::colorToDoubleSequence( aTextColor, xColorSpace ); } @@ -1140,7 +1138,7 @@ namespace cppcanvas const ActionFactoryParameters& rParms, bool bIntersect ) { - ::cppcanvas::internal::OutDevState& rState( getState( rParms.mrStates ) ); + ::cppcanvas::internal::OutDevState& rState( rParms.mrStates.getState() ); ::basegfx::B2DPolyPolygon aClipPoly( rClipPoly ); const bool bEmptyClipRect( rState.clipRect.IsEmpty() ); @@ -1216,7 +1214,7 @@ namespace cppcanvas const ActionFactoryParameters& rParms, bool bIntersect ) { - ::cppcanvas::internal::OutDevState& rState( getState( rParms.mrStates ) ); + ::cppcanvas::internal::OutDevState& rState( rParms.mrStates.getState() ); const bool bEmptyClipRect( rState.clipRect.IsEmpty() ); const bool bEmptyClipPoly( rState.clip.count() == 0 ); @@ -1349,13 +1347,12 @@ namespace cppcanvas case META_PUSH_ACTION: { MetaPushAction* pPushAction = static_cast<MetaPushAction*>(pCurrAct); - pushState( rStates, - pPushAction->GetFlags() ); + rStates.pushState(pPushAction->GetFlags()); } break; case META_POP_ACTION: - popState( rStates ); + rStates.popState(); break; case META_TEXTLANGUAGE_ACTION: @@ -1368,7 +1365,7 @@ namespace cppcanvas // modify current mapModeTransformation // transformation, such that subsequent // coordinates map correctly - tools::calcLogic2PixelAffineTransform( getState( rStates ).mapModeTransform, + tools::calcLogic2PixelAffineTransform( rStates.getState().mapModeTransform, rVDev ); break; @@ -1380,7 +1377,7 @@ namespace cppcanvas if( !pClipAction->IsClipping() ) { // clear clipping - getState( rStates ).clip.clear(); + rStates.getState().clip.clear(); } else { @@ -1476,8 +1473,8 @@ namespace cppcanvas if( !rParms.maLineColor.is_initialized() ) { setStateColor( static_cast<MetaLineColorAction*>(pCurrAct), - getState( rStates ).isLineColorSet, - getState( rStates ).lineColor, + rStates.getState().isLineColorSet, + rStates.getState().lineColor, rCanvas ); } break; @@ -1486,8 +1483,8 @@ namespace cppcanvas if( !rParms.maFillColor.is_initialized() ) { setStateColor( static_cast<MetaFillColorAction*>(pCurrAct), - getState( rStates ).isFillColorSet, - getState( rStates ).fillColor, + rStates.getState().isFillColorSet, + rStates.getState().fillColor, rCanvas ); } break; @@ -1505,7 +1502,7 @@ namespace cppcanvas // explicitly via META_TRANSPARENT_ACTION aColor.SetTransparency(0); - getState( rStates ).textColor = + rStates.getState().textColor = ::vcl::unotools::colorToDoubleSequence( aColor, rCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace() ); @@ -1517,8 +1514,8 @@ namespace cppcanvas if( !rParms.maTextColor.is_initialized() ) { setStateColor( static_cast<MetaTextFillColorAction*>(pCurrAct), - getState( rStates ).isTextFillColorSet, - getState( rStates ).textFillColor, + rStates.getState().isTextFillColorSet, + rStates.getState().textFillColor, rCanvas ); } break; @@ -1527,15 +1524,15 @@ namespace cppcanvas if( !rParms.maTextColor.is_initialized() ) { setStateColor( static_cast<MetaTextLineColorAction*>(pCurrAct), - getState( rStates ).isTextLineColorSet, - getState( rStates ).textLineColor, + rStates.getState().isTextLineColorSet, + rStates.getState().textLineColor, rCanvas ); } break; case META_TEXTALIGN_ACTION: { - ::cppcanvas::internal::OutDevState& rState = getState( rStates ); + ::cppcanvas::internal::OutDevState& rState = rStates.getState(); const TextAlign eTextAlign( static_cast<MetaTextAlignAction*>(pCurrAct)->GetTextAlign() ); rState.textReferencePoint = eTextAlign; @@ -1544,7 +1541,7 @@ namespace cppcanvas case META_FONT_ACTION: { - ::cppcanvas::internal::OutDevState& rState = getState( rStates ); + ::cppcanvas::internal::OutDevState& rState = rStates.getState(); const ::Font& rFont( static_cast<MetaFontAction*>(pCurrAct)->GetFont() ); rState.xFont = createFont( rState.fontRotation, @@ -1573,7 +1570,7 @@ namespace cppcanvas { // TODO(F2): A lot is missing here int nLayoutMode = static_cast<MetaLayoutModeAction*>(pCurrAct)->GetLayoutMode(); - ::cppcanvas::internal::OutDevState& rState = getState( rStates ); + ::cppcanvas::internal::OutDevState& rState = rStates.getState(); switch( nLayoutMode & (TEXT_LAYOUT_BIDI_RTL|TEXT_LAYOUT_BIDI_STRONG) ) { case TEXT_LAYOUT_BIDI_LTR: @@ -1654,7 +1651,7 @@ namespace cppcanvas // Setup local transform, such that the // metafile renders itself into the given // output rectangle - pushState( rStates, PUSH_ALL ); + rStates.pushState(PUSH_ALL); rVDev.Push(); rVDev.SetMapMode( rSubstitute.GetPrefMapMode() ); @@ -1662,9 +1659,9 @@ namespace cppcanvas const ::Point& rPos( rVDev.LogicToPixel( pAct->GetPoint() ) ); const ::Size& rSize( rVDev.LogicToPixel( pAct->GetSize() ) ); - getState( rStates ).transform.translate( rPos.X(), + rStates.getState().transform.translate( rPos.X(), rPos.Y() ); - getState( rStates ).transform.scale( (double)rSize.Width() / aMtfSizePix.Width(), + rStates.getState().transform.scale( (double)rSize.Width() / aMtfSizePix.Width(), (double)rSize.Height() / aMtfSizePix.Height() ); createActions( const_cast<GDIMetaFile&>(pAct->GetSubstitute()), @@ -1672,7 +1669,7 @@ namespace cppcanvas bSubsettableActions ); rVDev.Pop(); - popState( rStates ); + rStates.popState(); } break; @@ -1811,12 +1808,12 @@ namespace cppcanvas aFill.getPath( aPath ); ::basegfx::B2DPolyPolygon aPoly( aPath.getB2DPolyPolygon() ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); ActionSharedPtr pPolyAction( internal::PolyPolyActionFactory::createPolyPolyAction( aPoly, rCanvas, - getState( rStates ), + rStates.getState(), aTexture ) ); if( pPolyAction ) @@ -1848,7 +1845,7 @@ namespace cppcanvas } EMFP_DEBUG (printf ("EMF+ passed to canvas mtf renderer, size: %u\n", (unsigned int)pAct->GetDataSize ())); if (count < limit) - processEMFPlus( pAct, rFactoryParms, getState( rStates ), rCanvas ); + processEMFPlus( pAct, rFactoryParms, rStates.getState(), rCanvas ); count ++; } else if( pAct->GetComment().equalsL(RTL_CONSTASCII_STRINGPARAM("EMF_PLUS_HEADER_INFO")) ) { EMFP_DEBUG (printf ("EMF+ passed to canvas mtf renderer - header info, size: %u\n", (unsigned int)pAct->GetDataSize ())); @@ -1877,7 +1874,7 @@ namespace cppcanvas case META_POINT_ACTION: { - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); if( rState.lineColor.getLength() ) { ActionSharedPtr pPointAction( @@ -1902,7 +1899,7 @@ namespace cppcanvas case META_PIXEL_ACTION: { - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); if( rState.lineColor.getLength() ) { ActionSharedPtr pPointAction( @@ -1928,7 +1925,7 @@ namespace cppcanvas case META_LINE_ACTION: { - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); if( rState.lineColor.getLength() ) { MetaLineAction* pLineAct = static_cast<MetaLineAction*>(pCurrAct); @@ -2007,7 +2004,7 @@ namespace cppcanvas if( rRect.IsEmpty() ) break; - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); const ::basegfx::B2DPoint aTopLeftPixel( rState.mapModeTransform * ::vcl::unotools::b2DPointFromPoint( rRect.TopLeft() ) ); const ::basegfx::B2DPoint aBottomRightPixel( @@ -2040,7 +2037,7 @@ namespace cppcanvas ::basegfx::B2DPoint(1,1) ), ( (double) static_cast<MetaRoundRectAction*>(pCurrAct)->GetHorzRound() ) / rRect.GetWidth(), ( (double) static_cast<MetaRoundRectAction*>(pCurrAct)->GetVertRound() ) / rRect.GetHeight() ) ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); @@ -2065,7 +2062,7 @@ namespace cppcanvas aRange.getCenter(), aRange.getWidth(), aRange.getHeight() )); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); @@ -2079,7 +2076,7 @@ namespace cppcanvas static_cast<MetaArcAction*>(pCurrAct)->GetStartPoint(), static_cast<MetaArcAction*>(pCurrAct)->GetEndPoint(), POLY_ARC ); ::basegfx::B2DPolygon aPoly( aToolsPoly.getB2DPolygon() ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); @@ -2093,7 +2090,7 @@ namespace cppcanvas static_cast<MetaPieAction*>(pCurrAct)->GetStartPoint(), static_cast<MetaPieAction*>(pCurrAct)->GetEndPoint(), POLY_PIE ); ::basegfx::B2DPolygon aPoly( aToolsPoly.getB2DPolygon() ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); @@ -2107,7 +2104,7 @@ namespace cppcanvas static_cast<MetaChordAction*>(pCurrAct)->GetStartPoint(), static_cast<MetaChordAction*>(pCurrAct)->GetEndPoint(), POLY_CHORD ); ::basegfx::B2DPolygon aPoly( aToolsPoly.getB2DPolygon() ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); @@ -2116,7 +2113,7 @@ namespace cppcanvas case META_POLYLINE_ACTION: { - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); if( rState.lineColor.getLength() || rState.fillColor.getLength() ) { @@ -2182,7 +2179,7 @@ namespace cppcanvas case META_POLYGON_ACTION: { ::basegfx::B2DPolygon aPoly( static_cast<MetaPolygonAction*>(pCurrAct)->GetPolygon().getB2DPolygon() ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); } @@ -2191,7 +2188,7 @@ namespace cppcanvas case META_POLYPOLYGON_ACTION: { ::basegfx::B2DPolyPolygon aPoly( static_cast<MetaPolyPolygonAction*>(pCurrAct)->GetPolyPolygon().getB2DPolyPolygon() ); - aPoly.transform( getState( rStates ).mapModeTransform ); + aPoly.transform( rStates.getState().mapModeTransform ); createFillAndStroke( aPoly, rFactoryParms ); } @@ -2204,10 +2201,10 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( pAct->GetBitmap(), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2228,12 +2225,12 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( pAct->GetBitmap(), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2261,12 +2258,12 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( aBmp, - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetDestSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2287,10 +2284,10 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( pAct->GetBitmapEx(), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2311,12 +2308,12 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( pAct->GetBitmapEx(), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2344,12 +2341,12 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( aBmp, - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetDestSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2376,10 +2373,10 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( aBmp, - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2406,12 +2403,12 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( aBmp, - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2444,12 +2441,12 @@ namespace cppcanvas ActionSharedPtr pBmpAction( internal::BitmapActionFactory::createBitmapAction( aBmp, - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetDestSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pBmpAction ) { @@ -2474,7 +2471,7 @@ namespace cppcanvas case META_TRANSPARENT_ACTION: { - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); if( rState.lineColor.getLength() || rState.fillColor.getLength() ) { @@ -2520,12 +2517,12 @@ namespace cppcanvas pMtf, pGradient, rParms, - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pFloatTransAction ) { @@ -2581,7 +2578,7 @@ namespace cppcanvas { MetaTextLineAction* pAct = static_cast<MetaTextLineAction*>(pCurrAct); - const OutDevState& rState( getState( rStates ) ); + const OutDevState& rState( rStates.getState() ); const ::Size aBaselineOffset( tools::getBaselineOffset( rState, rVDev ) ); const ::Point aStartPoint( pAct->GetStartPoint() ); @@ -2618,7 +2615,7 @@ namespace cppcanvas { MetaTextRectAction* pAct = static_cast<MetaTextRectAction*>(pCurrAct); - pushState( rStates, PUSH_ALL ); + rStates.pushState(PUSH_ALL); // use the VDev to break up the text rect // action into readily formatted lines @@ -2632,7 +2629,7 @@ namespace cppcanvas rFactoryParms, bSubsettableActions ); - popState( rStates ); + rStates.popState(); break; } @@ -2695,12 +2692,12 @@ namespace cppcanvas ActionSharedPtr pRenderGraphicAction( internal::RenderGraphicActionFactory::createRenderGraphicAction( pAct->GetRenderGraphic(), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), - getState( rStates ).mapModeTransform * + rStates.getState().mapModeTransform * ::vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), rCanvas, - getState( rStates ) ) ); + rStates.getState() ) ); if( pRenderGraphicAction ) { @@ -3007,42 +3004,48 @@ namespace cppcanvas nCurrActions ); // init state stack - clearStateStack( aStateStack ); + aStateStack.clearStateStack(); // Setup local state, such that the metafile renders // itself into a one-by-one square at the origin for // identity view and render transformations - getState( aStateStack ).transform.scale( 1.0 / aMtfSizePix.Width(), + aStateStack.getState().transform.scale( 1.0 / aMtfSizePix.Width(), 1.0 / aMtfSizePix.Height() ); - tools::calcLogic2PixelAffineTransform( getState( aStateStack ).mapModeTransform, + tools::calcLogic2PixelAffineTransform( aStateStack.getState().mapModeTransform, aVDev ); ColorSharedPtr pColor( getCanvas()->createColor() ); - // setup default text color to black - getState( aStateStack ).textColor = - getState( aStateStack ).textFillColor = - getState( aStateStack ).textLineColor = pColor->getDeviceColor( 0x000000FF ); + { + ::cppcanvas::internal::OutDevState& rState = aStateStack.getState(); + // setup default text color to black + rState.textColor = + rState.textFillColor = + rState.textLineColor = pColor->getDeviceColor( 0x000000FF ); + } // apply overrides from the Parameters struct if( rParams.maFillColor.is_initialized() ) { - getState( aStateStack ).isFillColorSet = true; - getState( aStateStack ).fillColor = pColor->getDeviceColor( *rParams.maFillColor ); + ::cppcanvas::internal::OutDevState& rState = aStateStack.getState(); + rState.isFillColorSet = true; + rState.fillColor = pColor->getDeviceColor( *rParams.maFillColor ); } if( rParams.maLineColor.is_initialized() ) { - getState( aStateStack ).isLineColorSet = true; - getState( aStateStack ).lineColor = pColor->getDeviceColor( *rParams.maLineColor ); + ::cppcanvas::internal::OutDevState& rState = aStateStack.getState(); + rState.isLineColorSet = true; + rState.lineColor = pColor->getDeviceColor( *rParams.maLineColor ); } if( rParams.maTextColor.is_initialized() ) { - getState( aStateStack ).isTextFillColorSet = true; - getState( aStateStack ).isTextLineColorSet = true; - getState( aStateStack ).textColor = - getState( aStateStack ).textFillColor = - getState( aStateStack ).textLineColor = pColor->getDeviceColor( *rParams.maTextColor ); + ::cppcanvas::internal::OutDevState& rState = aStateStack.getState(); + rState.isTextFillColorSet = true; + rState.isTextLineColorSet = true; + rState.textColor = + rState.textFillColor = + rState.textLineColor = pColor->getDeviceColor( *rParams.maTextColor ); } if( rParams.maFontName.is_initialized() || rParams.maFontWeight.is_initialized() || @@ -3050,7 +3053,7 @@ namespace cppcanvas rParams.maFontUnderline.is_initialized() || rParams.maFontProportion.is_initialized() ) { - ::cppcanvas::internal::OutDevState& rState = getState( aStateStack ); + ::cppcanvas::internal::OutDevState& rState = aStateStack.getState(); rState.xFont = createFont( rState.fontRotation, ::Font(), // default font |