diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-03-16 15:35:49 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-03-16 15:49:42 +0100 |
commit | 804d0a896731629397c5328c13c04a45bc55f459 (patch) | |
tree | a1e7219363e3c3a6700b25243cfb10423688a58d /sw | |
parent | bb35d3b2418979d7be9941095a30fd4684b9e1e9 (diff) |
fdo#42750: delay painting borders until after subsidiary lines
With commit 0f0896c26fb260d1bbf31d7a886df3f61837f0f2, borders are drawn
immediately, but then the subsidiary lines are drawn over the borders,
hiding 1 twip wide borders completely.
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index dac3e273b291..958e279d66ef 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -119,6 +119,7 @@ #include <drawinglayer/primitive2d/textlayoutdevice.hxx> #include <svx/sdr/contact/objectcontacttools.hxx> #include <svx/unoapi.hxx> +#include <comphelper/sequenceasvector.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <basegfx/polygon/b2dpolygon.hxx> @@ -219,6 +220,22 @@ public: inline void Ins( const SwRect &rRect, const sal_uInt8 nSCol ); }; +class BorderLines +{ + ::comphelper::SequenceAsVector< + ::drawinglayer::primitive2d::Primitive2DReference> m_Lines; +public: + void AddBorderLine( + ::drawinglayer::primitive2d::Primitive2DReference const& xLine) + { + m_Lines.push_back(xLine); + } + drawinglayer::primitive2d::Primitive2DSequence GetBorderLines() const + { + return m_Lines.getAsConstList(); + } +}; + //----------------- End of classes for border lines ---------------------- static ViewShell *pGlobalShell = 0; @@ -252,6 +269,7 @@ static double aEdgeScale = 0.5; // be compared with pLines before the work in order to avoid help lines // to hide borders. // bTablines is sal_True during the Paint of a table. +static BorderLines *g_pBorderLines = 0; static SwLineRects *pLines = 0; static SwSubsRects *pSubsLines = 0; // global variable for sub-lines of body, header, footer, section and footnote frames. @@ -334,6 +352,7 @@ class SwSavePaintStatics SwFlyFrm *pSRetoucheFly, *pSRetoucheFly2, *pSFlyOnlyDraw; + BorderLines *pBLines; SwLineRects *pSLines; SwSubsRects *pSSubsLines; SwSubsRects* pSSpecSubsLines; @@ -359,6 +378,7 @@ SwSavePaintStatics::SwSavePaintStatics() : pSRetoucheFly ( pRetoucheFly ), pSRetoucheFly2 ( pRetoucheFly2 ), pSFlyOnlyDraw ( pFlyOnlyDraw ), + pBLines ( g_pBorderLines ), pSLines ( pLines ), pSSubsLines ( pSubsLines ), pSSpecSubsLines ( pSpecSubsLines ), @@ -383,6 +403,7 @@ SwSavePaintStatics::SwSavePaintStatics() : aScaleX = aScaleY = 1.0; aMinDistScale = 0.73; aEdgeScale = 0.5; + g_pBorderLines = 0; pLines = 0; pSubsLines = 0; pSpecSubsLines = 0L; @@ -397,6 +418,7 @@ SwSavePaintStatics::~SwSavePaintStatics() pRetoucheFly = pSRetoucheFly; pRetoucheFly2 = pSRetoucheFly2; pFlyOnlyDraw = pSFlyOnlyDraw; + g_pBorderLines = pBLines; pLines = pSLines; pSubsLines = pSSubsLines; pSpecSubsLines = pSSpecSubsLines; @@ -2889,6 +2911,7 @@ SwRootFrm::Paint(SwRect const& rRect, SwPrintData const*const pPrintData) const pSubsLines = new SwSubsRects; pSpecSubsLines = new SwSubsRects; } + g_pBorderLines = new BorderLines; aPaintRect._Intersection( aRect ); @@ -3002,6 +3025,9 @@ SwRootFrm::Paint(SwRect const& rRect, SwPrintData const*const pPrintData) const DELETEZ( pSubsLines ); DELETEZ( pSpecSubsLines ); } + // fdo#42750: delay painting these until after subsidiary lines + ProcessPrimitives(g_pBorderLines->GetBorderLines()); + DELETEZ(g_pBorderLines); pVout->Leave(); // #i68597# @@ -4507,11 +4533,8 @@ void lcl_PaintLeftRightLine( const sal_Bool _bLeft, ::lcl_SubTopBottom( aRect, rBox, _rAttrs, _rFrm, _rRectFn, bPrtOutputDev ); } - // TODO Postpone the processing of the primitives if ( lcl_GetLineWidth( pLeftRightBorder ) > 0 ) { - drawinglayer::primitive2d::Primitive2DSequence aSequence( 1 ); - double nExtentIS = lcl_GetExtent( pTopBorder, NULL ); double nExtentIE = lcl_GetExtent( pBottomBorder, NULL ); double nExtentOS = lcl_GetExtent( NULL, pTopBorder ); @@ -4533,21 +4556,22 @@ void lcl_PaintLeftRightLine( const sal_Bool _bLeft, Color aLeftColor = _bLeft ? pLeftRightBorder->GetColorOut( _bLeft ) : pLeftRightBorder->GetColorIn( _bLeft ); Color aRightColor = _bLeft ? pLeftRightBorder->GetColorIn( _bLeft ) : pLeftRightBorder->GetColorOut( _bLeft ); - aSequence[0] = new drawinglayer::primitive2d::BorderLinePrimitive2D( + drawinglayer::primitive2d::Primitive2DReference xLine = + new drawinglayer::primitive2d::BorderLinePrimitive2D( aStart, aEnd, nLeftWidth, pLeftRightBorder->GetDistance(), nRightWidth, nExtentIS, nExtentIE, nExtentOS, nExtentOE, aLeftColor.getBColor(), aRightColor.getBColor(), pLeftRightBorder->GetColorGap().getBColor(), pLeftRightBorder->HasGapColor(), pLeftRightBorder->GetStyle( ) ); - _rFrm.ProcessPrimitives( aSequence ); + g_pBorderLines->AddBorderLine(xLine); } } // OD 19.05.2003 #109667# - merge <lcl_PaintTopLine> and <lcl_PaintBottomLine> // into <lcl_PaintTopLine> void lcl_PaintTopBottomLine( const sal_Bool _bTop, - const SwFrm& _rFrm, + const SwFrm& , const SwPageFrm& /*_rPage*/, const SwRect& _rOutRect, const SwRect& /*_rRect*/, @@ -4584,11 +4608,8 @@ void lcl_PaintTopBottomLine( const sal_Bool _bTop, (aRect.*_rRectFn->fnGetHeight)() ); } - // TODO Postpone the processing of the primitives if ( lcl_GetLineWidth( pTopBottomBorder ) > 0 ) { - drawinglayer::primitive2d::Primitive2DSequence aSequence( 1 ); - double nExtentIS = lcl_GetExtent( pRightBorder, NULL ); double nExtentIE = lcl_GetExtent( pLeftBorder, NULL ); double nExtentOS = lcl_GetExtent( NULL, pRightBorder ); @@ -4610,14 +4631,15 @@ void lcl_PaintTopBottomLine( const sal_Bool _bTop, Color aLeftColor = _bTop ? pTopBottomBorder->GetColorOut( _bTop ) : pTopBottomBorder->GetColorIn( _bTop ); Color aRightColor = _bTop ? pTopBottomBorder->GetColorIn( _bTop ) : pTopBottomBorder->GetColorOut( _bTop ); - aSequence[0] = new drawinglayer::primitive2d::BorderLinePrimitive2D( + drawinglayer::primitive2d::Primitive2DReference xLine = + new drawinglayer::primitive2d::BorderLinePrimitive2D( aStart, aEnd, nLeftWidth, pTopBottomBorder->GetDistance(), nRightWidth, nExtentIS, nExtentIE, nExtentOS, nExtentOE, aLeftColor.getBColor(), aRightColor.getBColor(), pTopBottomBorder->GetColorGap().getBColor(), pTopBottomBorder->HasGapColor(), pTopBottomBorder->GetStyle( ) ); - _rFrm.ProcessPrimitives( aSequence ); + g_pBorderLines->AddBorderLine(xLine); } } |