diff options
author | Armin Le Grand <Armin.Le.Grand@cib.de> | 2018-10-22 10:33:03 +0200 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@cib.de> | 2018-10-24 15:45:36 +0200 |
commit | 9328368c45f0e8763de2de31343ce5a72dbc1b05 (patch) | |
tree | 56d3b04f304bbb3eb517ba9f749d086d7d2f34fd /sw/source/core/layout/paintfrm.cxx | |
parent | 86192438d16ec160d6b59d08735e770ee05ac113 (diff) |
Reorganize FrameBorderPrimitive creation
Step1: Basic concept, move stuff to svx and new
SdrFrameBorderPrimitive2D
Step2: Adapt all creators/usages to use
SdrFrameBorderData/SdrFrameBorderPrimitive2D,
check functionality
Step3: Re-implement mergre of BorderLinePrimitive2D
during decomposition of SdrFrameBorderPrimitive2D
to keep the number of primitives low from the start,
make merge optional (not urgently needed)
Step4: Migrate and isolate all helper methods
and classes involved in geometry creation of border
lines to the implementation (.cxx) of the new
primitive
Change-Id: I840b6765439bd995f2c57ef36315427b1f0f3e21
Reviewed-on: https://gerrit.libreoffice.org/62247
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
Diffstat (limited to 'sw/source/core/layout/paintfrm.cxx')
-rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 196 |
1 files changed, 89 insertions, 107 deletions
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 0306a1d0d382..22122b663918 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -64,6 +64,7 @@ #include <colfrm.hxx> #include <sw_primitivetypes2d.hxx> +#include <svx/sdr/primitive2d/sdrframeborderprimitive2d.hxx> #include <svx/sdr/contact/viewobjectcontactredirector.hxx> #include <svx/sdr/contact/viewobjectcontact.hxx> #include <svx/sdr/contact/viewcontact.hxx> @@ -1731,7 +1732,7 @@ bool DrawFillAttributes( aPaintRange, aDefineRange); - if(!rSequence.empty()) + if(rSequence.size()) { drawinglayer::primitive2d::Primitive2DContainer const* pPrimitives(&rSequence); @@ -2371,8 +2372,10 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons aUpper.Pos() += pUpper->getFrameArea().Pos(); SwRect aUpperAligned( aUpper ); ::SwAlignRect( aUpperAligned, gProp.pSGlobalShell, &rDev ); - drawinglayer::primitive2d::Primitive2DContainer aHorizontalSequence; - drawinglayer::primitive2d::Primitive2DContainer aVerticalSequence; + + // prepare SdrFrameBorderDataVector + std::shared_ptr<drawinglayer::primitive2d::SdrFrameBorderDataVector> aData( + std::make_shared<drawinglayer::primitive2d::SdrFrameBorderDataVector>()); while ( true ) { @@ -2510,30 +2513,20 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons if(!aX.equalZero()) { const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(aX)); - svx::frame::StyleVectorTable aStartVector; - - aStartVector.add(aStyles[ 1 ], aX, -aY, true); // aLFromT - aStartVector.add(aStyles[ 2 ], aX, -aX, true); // aLFromL - aStartVector.add(aStyles[ 3 ], aX, aY, false); // aLFromB - aStartVector.sort(); - - svx::frame::StyleVectorTable aEndVector; - const basegfx::B2DVector aAxis(-aX); - - aEndVector.add(aStyles[ 4 ], aAxis, -aY, true); // aRFromT - aEndVector.add(aStyles[ 5 ], aAxis, aX, false); // aRFromR - aEndVector.add(aStyles[ 6 ], aAxis, aY, false); // aRFromB - aEndVector.sort(); - - CreateBorderPrimitives( - aHorizontalSequence, + aData->emplace_back( aOrigin, aX, - aStyles[ 0 ], - aStartVector, - aEndVector, - pTmpColor - ); + aStyles[0], + pTmpColor); + drawinglayer::primitive2d::SdrFrameBorderData& rInstance(aData->back()); + + rInstance.addSdrConnectStyleData(true, aStyles[1], -aY, true); // aLFromT + rInstance.addSdrConnectStyleData(true, aStyles[2], -aX, true); // aLFromL + rInstance.addSdrConnectStyleData(true, aStyles[3], aY, false); // aLFromB + + rInstance.addSdrConnectStyleData(false, aStyles[4], -aY, true); // aRFromT + rInstance.addSdrConnectStyleData(false, aStyles[5], aX, false); // aRFromR + rInstance.addSdrConnectStyleData(false, aStyles[6], aY, false); // aRFromB } } else // vertical @@ -2544,30 +2537,20 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons if(!aX.equalZero()) { const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(aX)); - svx::frame::StyleVectorTable aStartVector; - - aStartVector.add(aStyles[ 3 ], aX, -aY, false); // aTFromR - aStartVector.add(aStyles[ 2 ], aX, -aX, true); // aTFromT - aStartVector.add(aStyles[ 1 ], aX, aY, true); // aTFromL - aStartVector.sort(); - - svx::frame::StyleVectorTable aEndVector; - const basegfx::B2DVector aAxis(-aX); - - aEndVector.add(aStyles[ 6 ], aAxis, -aY, false); // aBFromR - aEndVector.add(aStyles[ 5 ], aAxis, aX, false); // aBFromB - aEndVector.add(aStyles[ 4 ], aAxis, aY, true); // aBFromL - aEndVector.sort(); - - CreateBorderPrimitives( - aVerticalSequence, + aData->emplace_back( aOrigin, aX, - aStyles[ 0 ], - aStartVector, - aEndVector, - pTmpColor - ); + aStyles[0], + pTmpColor); + drawinglayer::primitive2d::SdrFrameBorderData& rInstance(aData->back()); + + rInstance.addSdrConnectStyleData(true, aStyles[3], -aY, false); // aTFromR + rInstance.addSdrConnectStyleData(true, aStyles[2], -aX, true); // aTFromT + rInstance.addSdrConnectStyleData(true, aStyles[1], aY, true); // aTFromL + + rInstance.addSdrConnectStyleData(false, aStyles[6], -aY, false); // aBFromR + rInstance.addSdrConnectStyleData(false, aStyles[5], aX, false); // aBFromB + rInstance.addSdrConnectStyleData(false, aStyles[4], aY, true); // aBFromL } } } @@ -2575,15 +2558,19 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons ++aIter; } - // to stay compatible, create order as it was formally. Also try to - // merge primitives as far as possible - drawinglayer::primitive2d::Primitive2DContainer aSequence; - - svx::frame::HelperMergeInB2DPrimitiveArray(aHorizontalSequence, aSequence); - svx::frame::HelperMergeInB2DPrimitiveArray(aVerticalSequence, aSequence); - - // paint - mrTabFrame.ProcessPrimitives(aSequence); + // create instance of SdrFrameBorderPrimitive2D if + // SdrFrameBorderDataVector is used + if(!aData->empty()) + { + drawinglayer::primitive2d::Primitive2DContainer aSequence; + aSequence.append( + drawinglayer::primitive2d::Primitive2DReference( + new drawinglayer::primitive2d::SdrFrameBorderPrimitive2D( + aData, + true))); + // paint + mrTabFrame.ProcessPrimitives(aSequence); + } // restore output device: rDev.SetDrawMode( nOldDrawMode ); @@ -4505,6 +4492,10 @@ namespace drawinglayer basegfx::B2DPoint aBottomLeft(getB2DHomMatrix() * basegfx::B2DPoint(0.0, 1.0)); basegfx::B2DPoint aBottomRight(getB2DHomMatrix() * basegfx::B2DPoint(1.0, 1.0)); + // prepare SdrFrameBorderDataVector + std::shared_ptr<drawinglayer::primitive2d::SdrFrameBorderDataVector> aData( + std::make_shared<drawinglayer::primitive2d::SdrFrameBorderDataVector>()); + if(getStyleTop().IsUsed()) { // move top left/right inwards half border width @@ -4547,108 +4538,99 @@ namespace drawinglayer { // create BorderPrimitive(s) for top border const basegfx::B2DVector aVector(aTopRight - aTopLeft); - svx::frame::StyleVectorTable aStartStyleVectorTable; - svx::frame::StyleVectorTable aEndStyleVectorTable; + aData->emplace_back( + aTopLeft, + aVector, + getStyleTop(), + nullptr); + drawinglayer::primitive2d::SdrFrameBorderData& rInstance(aData->back()); if(getStyleLeft().IsUsed()) { - aStartStyleVectorTable.add(getStyleLeft(), aVector, basegfx::B2DVector(aBottomLeft - aTopLeft), false); + rInstance.addSdrConnectStyleData(true, getStyleLeft(), basegfx::B2DVector(aBottomLeft - aTopLeft), false); } if(getStyleRight().IsUsed()) { - aEndStyleVectorTable.add(getStyleRight(), -aVector, basegfx::B2DVector(aBottomRight - aTopRight), false); + rInstance.addSdrConnectStyleData(false, getStyleRight(), basegfx::B2DVector(aBottomRight - aTopRight), false); } - - CreateBorderPrimitives( - rContainer, - aTopLeft, - aVector, - getStyleTop(), - aStartStyleVectorTable, - aEndStyleVectorTable, - nullptr); } if(getStyleRight().IsUsed()) { // create BorderPrimitive(s) for right border const basegfx::B2DVector aVector(aBottomRight - aTopRight); - svx::frame::StyleVectorTable aStartStyleVectorTable; - svx::frame::StyleVectorTable aEndStyleVectorTable; + aData->emplace_back( + aTopRight, + aVector, + getStyleRight(), + nullptr); + drawinglayer::primitive2d::SdrFrameBorderData& rInstance(aData->back()); if(getStyleTop().IsUsed()) { - aStartStyleVectorTable.add(getStyleTop(), aVector, basegfx::B2DVector(aTopLeft - aTopRight), false); + rInstance.addSdrConnectStyleData(true, getStyleTop(), basegfx::B2DVector(aTopLeft - aTopRight), false); } if(getStyleBottom().IsUsed()) { - aEndStyleVectorTable.add(getStyleBottom(), -aVector, basegfx::B2DVector(aBottomLeft - aBottomRight), false); + rInstance.addSdrConnectStyleData(false, getStyleBottom(), basegfx::B2DVector(aBottomLeft - aBottomRight), false); } - - CreateBorderPrimitives( - rContainer, - aTopRight, - aVector, - getStyleRight(), - aStartStyleVectorTable, - aEndStyleVectorTable, - nullptr); } if(getStyleBottom().IsUsed()) { // create BorderPrimitive(s) for bottom border const basegfx::B2DVector aVector(aBottomLeft - aBottomRight); - svx::frame::StyleVectorTable aStartStyleVectorTable; - svx::frame::StyleVectorTable aEndStyleVectorTable; + aData->emplace_back( + aBottomRight, + aVector, + getStyleBottom(), + nullptr); + drawinglayer::primitive2d::SdrFrameBorderData& rInstance(aData->back()); if(getStyleRight().IsUsed()) { - aStartStyleVectorTable.add(getStyleRight(), aVector, basegfx::B2DVector(aTopRight - aBottomRight), false); + rInstance.addSdrConnectStyleData(true, getStyleRight(), basegfx::B2DVector(aTopRight - aBottomRight), false); } if(getStyleLeft().IsUsed()) { - aEndStyleVectorTable.add(getStyleLeft(), -aVector, basegfx::B2DVector(aTopLeft - aBottomLeft), false); + rInstance.addSdrConnectStyleData(false, getStyleLeft(), basegfx::B2DVector(aTopLeft - aBottomLeft), false); } - - CreateBorderPrimitives( - rContainer, - aBottomRight, - aVector, - getStyleBottom(), - aStartStyleVectorTable, - aEndStyleVectorTable, - nullptr); } if(getStyleLeft().IsUsed()) { // create BorderPrimitive(s) for left border const basegfx::B2DVector aVector(aTopLeft - aBottomLeft); - svx::frame::StyleVectorTable aStartStyleVectorTable; - svx::frame::StyleVectorTable aEndStyleVectorTable; + aData->emplace_back( + aBottomLeft, + aVector, + getStyleLeft(), + nullptr); + drawinglayer::primitive2d::SdrFrameBorderData& rInstance(aData->back()); if(getStyleBottom().IsUsed()) { - aStartStyleVectorTable.add(getStyleBottom(), aVector, basegfx::B2DVector(aBottomRight - aBottomLeft), false); + rInstance.addSdrConnectStyleData(true, getStyleBottom(), basegfx::B2DVector(aBottomRight - aBottomLeft), false); } if(getStyleTop().IsUsed()) { - aEndStyleVectorTable.add(getStyleTop(), -aVector, basegfx::B2DVector(aTopRight - aTopLeft), false); + rInstance.addSdrConnectStyleData(false, getStyleTop(), basegfx::B2DVector(aTopRight - aTopLeft), false); } + } - CreateBorderPrimitives( - rContainer, - aBottomLeft, - aVector, - getStyleLeft(), - aStartStyleVectorTable, - aEndStyleVectorTable, - nullptr); + // create instance of SdrFrameBorderPrimitive2D if + // SdrFrameBorderDataVector is used + if(!aData->empty()) + { + rContainer.append( + drawinglayer::primitive2d::Primitive2DReference( + new drawinglayer::primitive2d::SdrFrameBorderPrimitive2D( + aData, + true))); } } |