summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
Diffstat (limited to 'svx')
-rw-r--r--svx/source/svdraw/svdopath.cxx71
1 files 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<sal_uInt16>(rHdl.GetPointNum());
+ // exclude some error situations
+ const XPolyPolygon aPathPolyPolygon(GetPathPoly());
sal_uInt16 nPolyNum = static_cast<sal_uInt16>(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<sal_uInt16>(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<nPntMax && rXPoly.GetFlags(nPnt+1)==PolyFlags::Control)
- nCnt++;
+ std::unique_ptr<SdrHdl> 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<nPntCount-1 && rXPoly.IsControl(nPnt+1))
{
- nPnt = static_cast<sal_uInt16>(rHdl.GetPointNum());
std::unique_ptr<SdrHdl> 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 (nPnt<rXPoly.GetPointCount()-1 && rXPoly.GetFlags(nPnt+1)==PolyFlags::Control)
- {
- pHdl->SetPos(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));