summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2017-09-14 16:45:56 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2017-09-15 12:58:04 +0200
commitab65fe804cf3a97bd172b5551b553b9bcde6d756 (patch)
tree3c956b067379cc1e3fddd5eb2ce341eab52a5f0e /svx
parent2f16219741aba016677103e4b22738d055c39a91 (diff)
borderline: Extended decompose
Decompose of BorderLinePrimitive2D extended to take care of non-perpendicular line endings for matching. Improved matching, one error in calc fixed Change-Id: I869a75385711b58e6725daba0f22be8a98158ad9
Diffstat (limited to 'svx')
-rw-r--r--svx/source/dialog/framelink.cxx51
1 files changed, 37 insertions, 14 deletions
diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx
index ea5b33315cfc..e205560df33c 100644
--- a/svx/source/dialog/framelink.cxx
+++ b/svx/source/dialog/framelink.cxx
@@ -550,12 +550,15 @@ void getAllCutSets(
for(const auto& rOtherOffset : otherOffsets)
{
- const basegfx::B2DPoint aOtherLeft(rOrigin + (aOtherPerpend * (rOtherOffset.mfOffset - rOtherOffset.mfHalfWidth)));
- const basegfx::B2DPoint aOtherRight(rOrigin + (aOtherPerpend * (rOtherOffset.mfOffset + rOtherOffset.mfHalfWidth)));
- CutSet aCutSet;
+ if(0xff != rOtherOffset.maColor.GetTransparency())
+ {
+ const basegfx::B2DPoint aOtherLeft(rOrigin + (aOtherPerpend * (rOtherOffset.mfOffset - rOtherOffset.mfHalfWidth)));
+ const basegfx::B2DPoint aOtherRight(rOrigin + (aOtherPerpend * (rOtherOffset.mfOffset + rOtherOffset.mfHalfWidth)));
+ CutSet aCutSet;
- getCutSet(aCutSet, rLeft, rRight, rX, aOtherLeft, aOtherRight, rStyleVectorCombination.getB2DVector());
- rCutSets.push_back(aCutSet);
+ getCutSet(aCutSet, rLeft, rRight, rX, aOtherLeft, aOtherRight, rStyleVectorCombination.getB2DVector());
+ rCutSets.push_back(aCutSet);
+ }
}
}
}
@@ -586,22 +589,42 @@ CutSet getMinMaxCutSet(
{
const CutSet& rCandidate(rCutSets[a]);
const double fCandidate(rCandidate.mfOLML + rCandidate.mfORML + rCandidate.mfOLMR + rCandidate.mfORMR);
+ bool bCopy(false);
- if(bMin)
+ if(basegfx::fTools::equalZero(fCandidate - fRetval))
{
- if(fCandidate < fRetval)
+ // both are equal (use basegfx::fTools::equalZero and *not* rtl::math::approxEqual here, that is too precise)
+ const bool bPerpendR(rtl::math::approxEqual(aRetval.mfOLML, aRetval.mfOLMR) || rtl::math::approxEqual(aRetval.mfORML, aRetval.mfORMR));
+ const bool bPerpendC(rtl::math::approxEqual(rCandidate.mfOLML, rCandidate.mfOLMR) || rtl::math::approxEqual(rCandidate.mfORML, rCandidate.mfORMR));
+
+ if(!bPerpendR && !bPerpendC)
+ {
+ // when both are not perpend, create medium cut
+ const double fNewOLML(std::max(std::min(rCandidate.mfOLML, rCandidate.mfORML), std::min(aRetval.mfOLML, aRetval.mfORML)));
+ const double fNewORML(std::min(std::max(rCandidate.mfOLML, rCandidate.mfORML), std::max(aRetval.mfOLML, aRetval.mfORML)));
+ const double fNewOLMR(std::max(std::min(rCandidate.mfOLMR, rCandidate.mfORMR), std::min(aRetval.mfOLMR, aRetval.mfORMR)));
+ const double fNewORMR(std::min(std::max(rCandidate.mfOLMR, rCandidate.mfORMR), std::max(aRetval.mfOLMR, aRetval.mfORMR)));
+ aRetval.mfOLML = fNewOLML;
+ aRetval.mfORML = fNewORML;
+ aRetval.mfOLMR = fNewOLMR;
+ aRetval.mfORMR = fNewORMR;
+ fRetval = aRetval.mfOLML + aRetval.mfORML + aRetval.mfOLMR + aRetval.mfORMR;
+ }
+ else
{
- fRetval = fCandidate;
- aRetval = rCandidate;
+ // if equal and perpend differs, perpend one is assumed smaller
+ bCopy = ((bMin && bPerpendC && !bPerpendR) || (!bMin && !bPerpendC && bPerpendR));
}
}
else
{
- if(fCandidate > fRetval)
- {
- fRetval = fCandidate;
- aRetval = rCandidate;
- }
+ bCopy = ((bMin && fCandidate < fRetval) || (!bMin && fCandidate > fRetval));
+ }
+
+ if(bCopy)
+ {
+ fRetval = fCandidate;
+ aRetval = rCandidate;
}
}