diff options
Diffstat (limited to 'basegfx/source/polygon/b2dtrapezoid.cxx')
-rw-r--r-- | basegfx/source/polygon/b2dtrapezoid.cxx | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/basegfx/source/polygon/b2dtrapezoid.cxx b/basegfx/source/polygon/b2dtrapezoid.cxx index 36c0c483a291..5648aa3be81c 100644 --- a/basegfx/source/polygon/b2dtrapezoid.cxx +++ b/basegfx/source/polygon/b2dtrapezoid.cxx @@ -422,61 +422,61 @@ namespace basegfx::trapezoidhelper void solveHorizontalEdges(TrDeSimpleEdges& rTrDeSimpleEdges) { - if(!rTrDeSimpleEdges.empty() && !maTrDeEdgeEntries.empty()) + if(rTrDeSimpleEdges.empty() || maTrDeEdgeEntries.empty()) + return; + + // there were horizontal edges. These can be excluded, but + // cuts with other edges need to be solved and added before + // ignoring them + for(const TrDeSimpleEdge & rHorEdge : rTrDeSimpleEdges) { - // there were horizontal edges. These can be excluded, but - // cuts with other edges need to be solved and added before - // ignoring them - for(const TrDeSimpleEdge & rHorEdge : rTrDeSimpleEdges) - { - // get horizontal edge as candidate; prepare its range and fixed Y - const B1DRange aRange(rHorEdge.getStart().getX(), rHorEdge.getEnd().getX()); - const double fFixedY(rHorEdge.getStart().getY()); + // get horizontal edge as candidate; prepare its range and fixed Y + const B1DRange aRange(rHorEdge.getStart().getX(), rHorEdge.getEnd().getX()); + const double fFixedY(rHorEdge.getStart().getY()); + + // loop over traversing edges + TrDeEdgeEntries::iterator aCurrent(maTrDeEdgeEntries.begin()); - // loop over traversing edges - TrDeEdgeEntries::iterator aCurrent(maTrDeEdgeEntries.begin()); + do + { + // get compare edge + TrDeEdgeEntries::reference aCompare(*aCurrent++); - do + if(fTools::lessOrEqual(aCompare.getEnd().getY(), fFixedY)) { - // get compare edge - TrDeEdgeEntries::reference aCompare(*aCurrent++); + // edge ends above horizontal edge, continue + continue; + } - if(fTools::lessOrEqual(aCompare.getEnd().getY(), fFixedY)) - { - // edge ends above horizontal edge, continue - continue; - } + if(fTools::moreOrEqual(aCompare.getStart().getY(), fFixedY)) + { + // edge starts below horizontal edge, continue + continue; + } - if(fTools::moreOrEqual(aCompare.getStart().getY(), fFixedY)) - { - // edge starts below horizontal edge, continue - continue; - } + // vertical overlap, get horizontal range + const B1DRange aCompareRange(aCompare.getStart().getX(), aCompare.getEnd().getX()); - // vertical overlap, get horizontal range - const B1DRange aCompareRange(aCompare.getStart().getX(), aCompare.getEnd().getX()); + if(aRange.overlaps(aCompareRange)) + { + // possible cut, get cut point + const B2DPoint aSplit(aCompare.getCutPointForGivenY(fFixedY)); - if(aRange.overlaps(aCompareRange)) + if(fTools::more(aSplit.getX(), aRange.getMinimum()) + && fTools::less(aSplit.getX(), aRange.getMaximum())) { - // possible cut, get cut point - const B2DPoint aSplit(aCompare.getCutPointForGivenY(fFixedY)); + // cut is in XRange of horizontal edge, potentially needed cut + B2DPoint* pNewPoint = maNewPoints.allocatePoint(aSplit); - if(fTools::more(aSplit.getX(), aRange.getMinimum()) - && fTools::less(aSplit.getX(), aRange.getMaximum())) + if(!splitEdgeAtGivenPoint(aCompare, *pNewPoint, aCurrent)) { - // cut is in XRange of horizontal edge, potentially needed cut - B2DPoint* pNewPoint = maNewPoints.allocatePoint(aSplit); - - if(!splitEdgeAtGivenPoint(aCompare, *pNewPoint, aCurrent)) - { - maNewPoints.freeIfLast(pNewPoint); - } + maNewPoints.freeIfLast(pNewPoint); } } } - while(aCurrent != maTrDeEdgeEntries.end() - && fTools::less(aCurrent->getStart().getY(), fFixedY)); } + while(aCurrent != maTrDeEdgeEntries.end() + && fTools::less(aCurrent->getStart().getY(), fFixedY)); } } |