Esempio n. 1
0
        private void AddLineJoin(PointFP lastPoint, PointFP currPoint,
                                 PointFP nextPoint)
        {
            if (lastPoint == null || currPoint == null || nextPoint == null ||
                nextPoint.Equals(currPoint) || lastPoint.Equals(currPoint))
            {
                return;
            }

            PointFP p1 = null, p2 = null;
            LineFP  head, tail, lastHead, lastTail;

            CalcHeadTail(currPoint, nextPoint,
                         head = new LineFP(), tail = new LineFP());
            CalcHeadTail(lastPoint, currPoint,
                         lastHead = new LineFP(), lastTail = new LineFP());
            var needLineJoin = false;
            var pi1          = new PointFP();
            var pi2          = new PointFP();

            var cross1 = LineFP.Intersects(new LineFP(head.Pt1, tail.Pt1),
                                           new LineFP(lastHead.Pt1, lastTail.Pt1), pi1);
            var cross2 = LineFP.Intersects(new LineFP(head.Pt2, tail.Pt2),
                                           new LineFP(lastHead.Pt2, lastTail.Pt2), pi2);

            if (cross1 && !cross2 && pi1.X != SingleFP.NOT_A_NUMBER)
            {
                p1           = lastTail.Pt2;
                p2           = head.Pt2;
                needLineJoin = true;
            }
            else if (!cross1 && cross2 && pi2.X != SingleFP.NOT_A_NUMBER)
            {
                p1           = lastTail.Pt1;
                p2           = head.Pt1;
                needLineJoin = true;
            }
            if (needLineJoin)
            {
                _outline.AddMoveTo(cross1 ? pi1 : pi2);
                _outline.AddLineTo(cross1 ? p2 : p1);
                if (_lineJoin == PenFP.LINEJOIN_MITER)
                {
                    _outline.AddLineTo(cross1 ? pi2 : pi1);
                }
                _outline.AddLineTo(cross1 ? p1 : p2);
                _outline.AddClose();
                if (_lineJoin == PenFP.LINEJOIN_ROUND)
                {
                    AddLineCap(cross2 ? pi2 : pi1, currPoint, PenFP.LINECAP_ROUND);
                }
            }
        }