summaryrefslogtreecommitdiff
path: root/sw/source/core/layout/paintfrm.cxx
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2018-10-22 10:33:03 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2018-10-24 15:45:36 +0200
commit9328368c45f0e8763de2de31343ce5a72dbc1b05 (patch)
tree56d3b04f304bbb3eb517ba9f749d086d7d2f34fd /sw/source/core/layout/paintfrm.cxx
parent86192438d16ec160d6b59d08735e770ee05ac113 (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.cxx196
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)));
}
}