From 26001f4f84b0d921c8612d888856613735ba5314 Mon Sep 17 00:00:00 2001 From: Regina Henschel Date: Wed, 7 Nov 2018 17:25:32 +0100 Subject: tdf120965 Simplify SdrPathObj::AddToHdlList() A polygon consists of line segments without controls and curve segments with two controls. Where two segments meet, can only be 'line to line', 'line to curve' or 'curve to curve'. So for a handle which marks a meeting point of two segments, there are 0 or 1 control before and 0 or 1 control after. Thus a loop is not needed and makes the code harder to read. Therefore I have removed the loop. Change-Id: I48bcdbdf028542e08b3f5ed3f66907f2993e26bd Reviewed-on: https://gerrit.libreoffice.org/63036 Tested-by: Jenkins Reviewed-by: Regina Henschel --- svx/source/svdraw/svdopath.cxx | 71 ++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/svx/source/svdraw/svdopath.cxx b/svx/source/svdraw/svdopath.cxx index eda7c34db46a..63481a141248 100644 --- a/svx/source/svdraw/svdopath.cxx +++ b/svx/source/svdraw/svdopath.cxx @@ -2008,62 +2008,45 @@ void SdrPathObj::AddToHdlList(SdrHdlList& rHdlList) const void SdrPathObj::AddToPlusHdlList(SdrHdlList& rHdlList, SdrHdl& rHdl) const { - // keep old stuff to be able to keep old SdrHdl stuff, too - const XPolyPolygon aOldPathPolygon(GetPathPoly()); - sal_uInt16 nPnt = static_cast(rHdl.GetPointNum()); + // exclude some error situations + const XPolyPolygon aPathPolyPolygon(GetPathPoly()); sal_uInt16 nPolyNum = static_cast(rHdl.GetPolyNum()); - - if (nPolyNum>=aOldPathPolygon.Count()) + if (nPolyNum>=aPathPolyPolygon.Count()) return; - const XPolygon& rXPoly = aOldPathPolygon[nPolyNum]; - sal_uInt16 nPntMax = rXPoly.GetPointCount(); + const XPolygon& rXPoly = aPathPolyPolygon[nPolyNum]; + sal_uInt16 nPntCount = rXPoly.GetPointCount(); + if (nPntCount<=0) + return; - if (nPntMax<=0) + sal_uInt16 nPnt = static_cast(rHdl.GetPointNum()); + if (nPnt>=nPntCount) return; - nPntMax--; - if (nPnt>nPntMax) + + if (rXPoly.IsControl(nPnt)) return; - // calculate the number of plus points - sal_uInt16 nCnt = 0; - if (rXPoly.GetFlags(nPnt)!=PolyFlags::Control) + // segment before + if (nPnt==0 && IsClosed()) + nPnt=nPntCount-1; + if (nPnt>0 && rXPoly.IsControl(nPnt-1)) { - if (nPnt==0 && IsClosed()) - nPnt=nPntMax; - if (nPnt>0 && rXPoly.GetFlags(nPnt-1)==PolyFlags::Control) - nCnt++; - if (nPnt==nPntMax && IsClosed()) - nPnt=0; - if (nPnt pHdl(new SdrHdlBezWgt(&rHdl)); + pHdl->SetPos(rXPoly[nPnt-1]); + pHdl->SetPointNum(nPnt-1); + pHdl->SetSourceHdlNum(rHdl.GetSourceHdlNum()); + pHdl->SetPlusHdl(true); + rHdlList.AddHdl(std::move(pHdl)); } - // construct the plus points - for (sal_uInt32 nPlusNum = 0; nPlusNum < nCnt; ++nPlusNum) + // segment after + if (nPnt==nPntCount-1 && IsClosed()) + nPnt=0; + if (nPnt(rHdl.GetPointNum()); std::unique_ptr pHdl(new SdrHdlBezWgt(&rHdl)); - pHdl->SetPolyNum(rHdl.GetPolyNum()); - - if (nPnt==0 && IsClosed()) - nPnt=nPntMax; - if (nPnt>0 && rXPoly.GetFlags(nPnt-1)==PolyFlags::Control && nPlusNum==0) - { - pHdl->SetPos(rXPoly[nPnt-1]); - pHdl->SetPointNum(nPnt-1); - } - else - { - if (nPnt==nPntMax && IsClosed()) - nPnt=0; - if (nPntSetPos(rXPoly[nPnt+1]); - pHdl->SetPointNum(nPnt+1); - } - } - + pHdl->SetPos(rXPoly[nPnt+1]); + pHdl->SetPointNum(nPnt+1); pHdl->SetSourceHdlNum(rHdl.GetSourceHdlNum()); pHdl->SetPlusHdl(true); rHdlList.AddHdl(std::move(pHdl)); -- cgit