diff options
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdopath.cxx | 71 |
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)); |