GetItem() public méthode

public GetItem ( int index ) : ISvgPathSeg
index int
Résultat ISvgPathSeg
Exemple #1
0
        public GraphicsPath GetGraphicsPath()
        {
            if (gp == null)
            {
                gp = new GraphicsPath();

                PointF initPoint = new PointF(0, 0);
                PointF lastPoint = new PointF(0, 0);

                SvgPathSegList segments = (SvgPathSegList)PathSegList;
                SvgPathSeg     segment;

                int nElems = segments.NumberOfItems;

                for (int i = 0; i < nElems; i++)
                {
                    segment = (SvgPathSeg)segments.GetItem(i);

                    if (segment is SvgPathSegMoveto)
                    {
                        SvgPathSegMoveto seg = (SvgPathSegMoveto)segment;
                        gp.StartFigure();
                        lastPoint = initPoint = seg.AbsXY;
                    }
                    else if (segment is SvgPathSegLineto)
                    {
                        SvgPathSegLineto seg = (SvgPathSegLineto)segment;
                        PointF           p   = seg.AbsXY;
                        gp.AddLine(lastPoint.X, lastPoint.Y, p.X, p.Y);

                        lastPoint = p;
                    }
                    else if (segment is SvgPathSegCurveto)
                    {
                        SvgPathSegCurveto seg  = (SvgPathSegCurveto)segment;
                        PointF            xy   = seg.AbsXY;
                        PointF            x1y1 = seg.CubicX1Y1;
                        PointF            x2y2 = seg.CubicX2Y2;
                        gp.AddBezier(lastPoint.X, lastPoint.Y, x1y1.X, x1y1.Y, x2y2.X, x2y2.Y, xy.X, xy.Y);

                        lastPoint = xy;
                    }
                    else if (segment is SvgPathSegArc)
                    {
                        SvgPathSegArc seg = (SvgPathSegArc)segment;
                        PointF        p   = seg.AbsXY;
                        if (lastPoint.Equals(p))
                        {
                            // If the endpoints (x, y) and (x0, y0) are identical, then this
                            // is equivalent to omitting the elliptical arc segment entirely.
                        }
                        else if (seg.R1 == 0 || seg.R2 == 0)
                        {
                            // Ensure radii are valid
                            gp.AddLine(lastPoint, p);
                        }
                        else
                        {
                            CalculatedArcValues calcValues = seg.GetCalculatedArcValues();

                            GraphicsPath gp2 = new GraphicsPath();
                            gp2.StartFigure();
                            gp2.AddArc(
                                calcValues.Cx - calcValues.CorrRx,
                                calcValues.Cy - calcValues.CorrRy,
                                calcValues.CorrRx * 2,
                                calcValues.CorrRy * 2,
                                calcValues.AngleStart,
                                calcValues.AngleExtent
                                );

                            Matrix matrix = new Matrix();
                            matrix.Translate(
                                -calcValues.Cx,
                                -calcValues.Cy
                                );
                            gp2.Transform(matrix);

                            matrix = new Matrix();
                            matrix.Rotate(seg.Angle);
                            gp2.Transform(matrix);

                            matrix = new Matrix();
                            matrix.Translate(calcValues.Cx, calcValues.Cy);
                            gp2.Transform(matrix);

                            gp.AddPath(gp2, true);
                        }

                        lastPoint = p;
                    }
                    else if (segment is SvgPathSegClosePath)
                    {
                        gp.CloseFigure();
                        lastPoint = initPoint;
                    }
                }

                string fillRule = GetPropertyValue("fill-rule");
                if (fillRule == "evenodd")
                {
                    gp.FillMode = FillMode.Alternate;
                }
                else
                {
                    gp.FillMode = FillMode.Winding;
                }
            }

            return(gp);
        }