Kaydet (Commit) b86a3aa0 authored tarafından Armin Le Grand's avatar Armin Le Grand

borderline: restuctured used classes

Restructuring for more efficcient usage of helper
values, some obstacles removed with that

Change-Id: Ia8c4b2d4c423db9500cda507107d87913b79e23c
Reviewed-on: https://gerrit.libreoffice.org/42409Reviewed-by: 's avatarArmin Le Grand <Armin.Le.Grand@cib.de>
Tested-by: 's avatarArmin Le Grand <Armin.Le.Grand@cib.de>
üst 89879b00
......@@ -214,29 +214,87 @@ public:
inline bool operator>( const Style& rL, const Style& rR ) { return rR.operator<(rL); }
// Drawing functions
class SAL_WARN_UNUSED SVX_DLLPUBLIC StyleVectorCombination
{
private:
const Style& mrStyle;
const basegfx::B2DVector maB2DVector;
const bool mbMirrored;
struct OffsetAndHalfWidthAndColor
{
double mfOffset;
double mfHalfWidth;
Color maColor;
OffsetAndHalfWidthAndColor(double offset, double halfWidth, Color color) :
mfOffset(offset),
mfHalfWidth(halfWidth),
maColor(color)
{}
};
double mfRefModeOffset;
basegfx::B2DVector maB2DVector;
std::vector< OffsetAndHalfWidthAndColor > maOffsets;
public:
StyleVectorCombination(const Style& rStyle, const basegfx::B2DVector& rB2DVector, bool bMirrored) :
mrStyle(rStyle),
maB2DVector(rB2DVector),
mbMirrored(bMirrored)
StyleVectorCombination(
const Style& rStyle,
const basegfx::B2DVector& rB2DVector,
bool bMirrored,
const Color* pForceColor = nullptr);
double getRefModeOffset() const { return mfRefModeOffset; }
const basegfx::B2DVector& getB2DVector() const { return maB2DVector; }
bool empty() const { return maOffsets.empty(); }
size_t size() const { return maOffsets.size(); }
void getColorAndOffsetAndHalfWidth(size_t nIndex, Color& rColor, double& rfOffset, double& rfHalfWidth) const
{
if(nIndex >= maOffsets.size())
return;
const OffsetAndHalfWidthAndColor& rCandidate(maOffsets[nIndex]);
rfOffset = rCandidate.mfOffset;
rfHalfWidth = rCandidate.mfHalfWidth;
rColor = rCandidate.maColor;
}
const Style& getStyle() const { return mrStyle; }
const basegfx::B2DVector& getB2DVector() const { return maB2DVector; }
bool isMirrored() const { return mbMirrored; }
bool operator<(const StyleVectorCombination& rOther) const
{
return getB2DVector().cross(rOther.getB2DVector()) < 0.0;
}
};
typedef std::vector< StyleVectorCombination > StyleVectorTable;
class SAL_WARN_UNUSED SVX_DLLPUBLIC StyleVectorTable
{
private:
std::vector< StyleVectorCombination > maEntries;
public:
StyleVectorTable()
: maEntries()
{
}
void add(
const Style& rStyle,
const basegfx::B2DVector& rMyVector,
const basegfx::B2DVector& rOtherVector,
bool bMirrored)
{
if(rStyle.IsUsed() && !basegfx::areParallel(rMyVector, rOtherVector))
{
maEntries.emplace_back(rStyle, rOtherVector, bMirrored);
}
}
void sort()
{
std::sort(maEntries.begin(), maEntries.end());
}
bool empty() const { return maEntries.empty(); }
size_t size() const { return maEntries.size(); }
const std::vector< StyleVectorCombination >& getEntries() const{ return maEntries; }
};
SVX_DLLPUBLIC void CreateBorderPrimitives(
drawinglayer::primitive2d::Primitive2DContainer& rTarget, /// target for created primitives
......
This diff is collapsed.
......@@ -941,11 +941,12 @@ void HelperCreateHorizontalEntry(
const Style& rStartFromBR(rArray.GetCellStyleTL( col, row ));
StyleVectorTable aStart;
if(rStartFromTR.IsUsed()) aStart.push_back(StyleVectorCombination(rStartFromTR, rX - rY, false));
if(rStartLFromT.IsUsed()) aStart.push_back(StyleVectorCombination(rStartLFromT, -rY, true));
if(rStartLFromL.IsUsed()) aStart.push_back(StyleVectorCombination(rStartLFromL, -rX, true));
if(rStartLFromB.IsUsed()) aStart.push_back(StyleVectorCombination(rStartLFromB, rY, false));
if(rStartFromBR.IsUsed()) aStart.push_back(StyleVectorCombination(rStartFromBR, rX + rY, false));
aStart.add(rStartFromTR, rX, rX - rY, false);
aStart.add(rStartLFromT, rX, -rY, true);
aStart.add(rStartLFromL, rX, -rX, true);
aStart.add(rStartLFromB, rX, rY, false);
aStart.add(rStartFromBR, rX, rX + rY, false);
aStart.sort();
// get involved styles at end
const Style& rEndFromTL(rArray.GetCellStyleBR( col, row - 1 ));
......@@ -955,11 +956,12 @@ void HelperCreateHorizontalEntry(
const Style& rEndFromBL(rArray.GetCellStyleTR( col, row ));
StyleVectorTable aEnd;
if(rEndFromTL.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndFromTL, -rX -rY, true));
if(rEndRFromT.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndRFromT, -rY, true));
if(rEndRFromR.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndRFromR, rX, false));
if(rEndRFromB.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndRFromB, rY, false));
if(rEndFromBL.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndFromBL, rY - rX, true));
aEnd.add(rEndFromTL, -rX, -rX -rY, true);
aEnd.add(rEndRFromT, -rX, -rY, true);
aEnd.add(rEndRFromR, -rX, rX, false);
aEnd.add(rEndRFromB, -rX, rY, false);
aEnd.add(rEndFromBL, -rX, rY - rX, true);
aEnd.sort();
CreateBorderPrimitives(
rSequence,
......@@ -986,11 +988,12 @@ void HelperCreateVerticalEntry(
const Style& rStartFromBR(rArray.GetCellStyleTL( col, row ));
StyleVectorTable aStart;
if(rStartFromBR.IsUsed()) aStart.push_back(StyleVectorCombination(rStartFromBR, rX + rY, false));
if(rStartTFromR.IsUsed()) aStart.push_back(StyleVectorCombination(rStartTFromR, rX, false));
if(rStartTFromT.IsUsed()) aStart.push_back(StyleVectorCombination(rStartTFromT, -rY, true));
if(rStartTFromL.IsUsed()) aStart.push_back(StyleVectorCombination(rStartTFromL, -rX, true));
if(rStartFromBL.IsUsed()) aStart.push_back(StyleVectorCombination(rStartFromBL, rY - rX, true));
aStart.add(rStartFromBR, rY, rX + rY, false);
aStart.add(rStartTFromR, rY, rX, false);
aStart.add(rStartTFromT, rY, -rY, true);
aStart.add(rStartTFromL, rY, -rX, true);
aStart.add(rStartFromBL, rY, rY - rX, true);
aStart.sort();
// get involved styles at end
const Style& rEndFromTL(rArray.GetCellStyleBR( col - 1, row ));
......@@ -1000,11 +1003,12 @@ void HelperCreateVerticalEntry(
const Style& rEndFromTR(rArray.GetCellStyleBL( col, row ));
StyleVectorTable aEnd;
if(rEndFromTR.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndFromTR, rX - rY, false));
if(rEndBFromR.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndBFromR, rX, false));
if(rEndBFromB.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndBFromB, rY, false));
if(rEndBFromL.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndBFromL, -rX, true));
if(rEndFromTL.IsUsed()) aEnd.push_back(StyleVectorCombination(rEndFromTL, -rX - rY, true));
aEnd.add(rEndFromTR, -rY, rX - rY, false);
aEnd.add(rEndBFromR, -rY, rX, false);
aEnd.add(rEndBFromB, -rY, rY, false);
aEnd.add(rEndBFromL, -rY, -rX, true);
aEnd.add(rEndFromTL, -rY, -rX - rY, true);
aEnd.sort();
CreateBorderPrimitives(
rSequence,
......@@ -1180,20 +1184,23 @@ drawinglayer::primitive2d::Primitive2DContainer Array::CreateB2DPrimitiveRange(
if(rTLBR.IsUsed())
{
/// top-left and bottom-right Style Tables
StyleVectorTable aStart;
StyleVectorTable aEnd;
/// Fill top-left Style Table
const Style& rTLFromRight(GetCellStyleTop(_nFirstCol, _nFirstRow));
if(rTLFromRight.IsUsed()) aStart.push_back(StyleVectorCombination(rTLFromRight, aX, false));
const Style& rTLFromBottom(GetCellStyleLeft(_nFirstCol, _nFirstRow));
if(rTLFromBottom.IsUsed()) aStart.push_back(StyleVectorCombination(rTLFromBottom, aY, false));
StyleVectorTable aStart;
aStart.add(rTLFromRight, aX + aY, aX, false);
aStart.add(rTLFromBottom, aX + aY, aY, false);
aStart.sort();
/// Fill bottom-right Style Table
const Style& rBRFromBottom(GetCellStyleRight(_nLastCol, _nLastRow));
if(rBRFromBottom.IsUsed()) aEnd.push_back(StyleVectorCombination(rBRFromBottom, -aY, true));
const Style& rBRFromLeft(GetCellStyleBottom(_nLastCol, _nLastRow));
if(rBRFromLeft.IsUsed()) aEnd.push_back(StyleVectorCombination(rBRFromLeft, -aX, true));
StyleVectorTable aEnd;
aEnd.add(rBRFromBottom, -aX -aY, -aY, true);
aEnd.add(rBRFromLeft, -aX -aY, -aX, true);
aEnd.sort();
CreateBorderPrimitives(
aCrossSequence,
......@@ -1210,20 +1217,23 @@ drawinglayer::primitive2d::Primitive2DContainer Array::CreateB2DPrimitiveRange(
if(rBLTR.IsUsed())
{
/// bottom-left and top-right Style Tables
StyleVectorTable aStart;
StyleVectorTable aEnd;
/// Fill bottom-left Style Table
const Style& rBLFromTop(GetCellStyleLeft(_nFirstCol, _nLastRow));
if(rBLFromTop.IsUsed()) aStart.push_back(StyleVectorCombination(rBLFromTop, -aY, true));
const Style& rBLFromBottom(GetCellStyleBottom(_nFirstCol, _nLastRow));
if(rBLFromBottom.IsUsed()) aStart.push_back(StyleVectorCombination(rBLFromBottom, aX, false));
StyleVectorTable aStart;
aStart.add(rBLFromTop, aX - aY, -aY, true);
aStart.add(rBLFromBottom, aX - aY, aX, false);
aStart.sort();
/// Fill top-right Style Table
const Style& rTRFromBottom(GetCellStyleRight(_nLastCol, _nFirstRow));
if(rTRFromBottom.IsUsed()) aEnd.push_back(StyleVectorCombination(rTRFromBottom, -aY, true));
const Style& rTRFromLeft(GetCellStyleTop(_nLastCol, _nFirstRow));
if(rTRFromLeft.IsUsed()) aEnd.push_back(StyleVectorCombination(rTRFromLeft, -aX, false));
StyleVectorTable aEnd;
aEnd.add(rTRFromBottom, aY - aX, -aY, true);
aEnd.add(rTRFromLeft, aY - aX, -aX, false);
aEnd.sort();
CreateBorderPrimitives(
aCrossSequence,
......
......@@ -203,19 +203,23 @@ namespace sdr
const svx::frame::Style& rRightA, const svx::frame::Style& rRightB, const svx::frame::Style& rRightC)
{
/// top-left and bottom-right Style Tables
svx::frame::StyleVectorTable aStart;
svx::frame::StyleVectorTable aEnd;
const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(rX));
/// Fill top-left Style Table
if(rLeftA.IsUsed()) aStart.push_back(svx::frame::StyleVectorCombination(rLeftA, -aY, bHor)); // bHor ? true : false));
if(rLeftB.IsUsed()) aStart.push_back(svx::frame::StyleVectorCombination(rLeftB, -rX, true)); // bHor ? true : true));
if(rLeftC.IsUsed()) aStart.push_back(svx::frame::StyleVectorCombination(rLeftC, aY, !bHor)); // bHor ? false : true));
svx::frame::StyleVectorTable aStart;
aStart.add(rLeftA, rX, -aY, bHor); // bHor ? true : false));
aStart.add(rLeftB, rX, -rX, true); // bHor ? true : true));
aStart.add(rLeftC, rX, aY, !bHor); // bHor ? false : true));
aStart.sort();
/// Fill bottom-right Style Table
if(rRightA.IsUsed()) aEnd.push_back(svx::frame::StyleVectorCombination(rRightA, -aY, bHor)); // bHor ? true : false));
if(rRightB.IsUsed()) aEnd.push_back(svx::frame::StyleVectorCombination(rRightB, rX, false)); // bHor ? false : false));
if(rRightC.IsUsed()) aEnd.push_back(svx::frame::StyleVectorCombination(rRightC, aY, !bHor)); // bHor ? false : true));
svx::frame::StyleVectorTable aEnd;
aEnd.add(rRightA, -rX, -aY, bHor); // bHor ? true : false));
aEnd.add(rRightB, -rX, rX, false); // bHor ? false : false));
aEnd.add(rRightC, -rX, aY, !bHor); // bHor ? false : true));
aEnd.sort();
CreateBorderPrimitives(
rContainer,
......
......@@ -2549,24 +2549,27 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons
if(!aX.equalZero())
{
const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(aX));
svx::frame::StyleVectorTable aStartTable;
svx::frame::StyleVectorTable aEndTable;
svx::frame::StyleVectorTable aStartVector;
if(aStyles[ 1 ].IsUsed()) aStartTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 1 ], -aY, true)); // aLFromT
if(aStyles[ 2 ].IsUsed()) aStartTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 2 ], -aX, true)); // aLFromL
if(aStyles[ 3 ].IsUsed()) aStartTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 3 ], aY, false)); // aLFromB
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();
if(aStyles[ 4 ].IsUsed()) aEndTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 4 ], -aY, true)); // aRFromT
if(aStyles[ 5 ].IsUsed()) aEndTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 5 ], aX, false)); // aRFromR
if(aStyles[ 6 ].IsUsed()) aEndTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 6 ], aY, false)); // aRFromB
svx::frame::StyleVectorTable aEndVector;
aEndVector.add(aStyles[ 4 ], -aX, -aY, true); // aRFromT
aEndVector.add(aStyles[ 5 ], -aX, aX, false); // aRFromR
aEndVector.add(aStyles[ 6 ], -aX, aY, false); // aRFromB
aEndVector.sort();
CreateBorderPrimitives(
aHorizontalSequence,
aOrigin,
aX,
aStyles[ 0 ],
aStartTable,
aEndTable,
aStartVector,
aEndVector,
pTmpColor
);
}
......@@ -2579,24 +2582,27 @@ void SwTabFramePainter::PaintLines(OutputDevice& rDev, const SwRect& rRect) cons
if(!aX.equalZero())
{
const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(aX));
svx::frame::StyleVectorTable aStartTable;
svx::frame::StyleVectorTable aEndTable;
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();
if(aStyles[ 3 ].IsUsed()) aStartTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 3 ], -aY, false)); // aTFromR
if(aStyles[ 2 ].IsUsed()) aStartTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 2 ], -aX, true)); // aTFromT
if(aStyles[ 1 ].IsUsed()) aStartTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 1 ], aY, true)); // aTFromL
svx::frame::StyleVectorTable aEndVector;
if(aStyles[ 6 ].IsUsed()) aEndTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 6 ], -aY, false)); // aBFromR
if(aStyles[ 5 ].IsUsed()) aEndTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 5 ], aX, false)); // aBFromB
if(aStyles[ 4 ].IsUsed()) aEndTable.push_back(svx::frame::StyleVectorCombination(aStyles[ 4 ], aY, true)); // aBFromL
aEndVector.add(aStyles[ 6 ], -aX, -aY, false); // aBFromR
aEndVector.add(aStyles[ 5 ], -aX, aX, false); // aBFromB
aEndVector.add(aStyles[ 4 ], -aX, aY, true); // aBFromL
aEndVector.sort();
CreateBorderPrimitives(
aVerticalSequence,
aOrigin,
aX,
aStyles[ 0 ],
aStartTable,
aEndTable,
aStartVector,
aEndVector,
pTmpColor
);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment