public void TestPathText() { string d = "M1,2L3,4l5,6H7h8V9v0zC1,2,3,4,5,6c7,8,9,0,1,2S3,4,5,6s7,8,9,0Q1,2,3,4q5,6,7,8T9,0t1,2A3,4,5,1,0,8,9a0,1,2,0,1,5,6"; SvgPathSegList list = new SvgPathSegList(d, false); Assert.AreEqual(d, list.PathText); }
private void VisitPathSegList(SvgGraphicsElement graphicsElement, SvgPathSegList paths) { if (!ShouldDisplay(graphicsElement)) { return; } PushTransformsMatrix(graphicsElement.Transform); { var pathsToDraw = paths .ConvertToAbsolute() .ConvertAllLinesAndCurvesToCubicCurves() .MultiplyByMatrix(CurrentMatrix); var svgToPdfPathConverter = new SvgPathSegToDynamicPdfPathsConverter(graphicsElement, null, 0, _spotColorOverride); pathsToDraw.ForEach(i => i.Accept(svgToPdfPathConverter)); foreach (var path in svgToPdfPathConverter.Paths) { path.Draw(_writer); ClippingAreaPainted = true; } } PopTransformsMatrix(graphicsElement.Transform); }
/// <summary> /// get height of a path using polygon height method /// </summary> public double pathHeight(string myPath) { // just use sharpVector segmentList SvgPathSegList mylist = new SvgPathSegList(myPath, true); StringBuilder sb = new StringBuilder(); int segCount = 0; foreach (SvgPointF seg in mylist.Points) { sb.Append(Convert.ToString(seg.ValueX) + "," + Convert.ToString(seg.ValueY)); segCount += 1; if (segCount < mylist.NumberOfItems) { sb.Append(" "); } } mylist = null; string sbString = sb.ToString(); sb = null; return(polyHeight(sbString)); }
public string start() { string pathstring = @"M70.491,50.826c-2.232,1.152-6.913,2.304-12.817,2.304c-13.682,0-23.906-8.641-23.906-24.626 c0-15.266,10.297-25.49,25.346-25.49c5.977,0,9.865,1.296,11.521,2.16l-1.584,5.112C66.747,9.134,63.363,8.27,59.33,8.27 c-11.377,0-18.938,7.272-18.938,20.018c0,11.953,6.841,19.514,18.578,19.514c3.888,0,7.777-0.792,10.297-2.016L70.491,50.826z"; SvgPathSegList mylist = new SvgPathSegList(pathstring, true); StringBuilder sb = new StringBuilder(); int segCount = 0; foreach (SvgPointF seg in mylist.Points) { sb.Append(Convert.ToString(seg.X) + "," + Convert.ToString(seg.Y)); segCount += 1; if (segCount < mylist.NumberOfItems) { sb.Append(" "); } } sb.Append("<br>" + segCount + "<br>" + mylist.NumberOfItems); //return Convert.ToString(mylist.GetTotalLength()); return(sb.ToString()); }
public void TestReplace() { SvgPathSegList list = getNonEmptyList(); list.ReplaceItem(getLineto(), 0); Assert.AreEqual(3, list.NumberOfItems); Assert.AreEqual(SvgPathSegType.LineToAbs, list[0].PathSegType); }
public void TestAppend() { SvgPathSegList list = getEmptyList(); list.AppendItem(getLineto()); Assert.AreEqual(1, list.NumberOfItems); Assert.AreEqual(SvgPathSegType.LineToAbs, list[0].PathSegType); }
public void TestInitialize() { SvgPathSegList list = getNonEmptyList(); list.Initialize(getLineto()); Assert.AreEqual(1, list.NumberOfItems); Assert.AreEqual(SvgPathSegType.LineToAbs, list[0].PathSegType); Assert.AreEqual(0, ((SvgPathSeg)list[0]).Index); }
public void TestStartEndAngle1() { SvgPathSegList list = new SvgPathSegList("M10,10L100,10,100,100,10,100z", false); Assert.AreEqual(270, ((SvgPathSeg)list[1]).StartAngle); Assert.AreEqual(90, ((SvgPathSeg)list[1]).EndAngle); Assert.AreEqual(180, ((SvgPathSeg)list[4]).StartAngle); Assert.AreEqual(0, ((SvgPathSeg)list[4]).EndAngle); }
public void TestRemove() { SvgPathSegList list = getNonEmptyList(); list.RemoveItem(1); Assert.AreEqual(2, list.NumberOfItems); Assert.AreEqual(0, ((SvgPathSeg)list[0]).Index); Assert.AreEqual(1, ((SvgPathSeg)list[1]).Index); Assert.AreEqual(SvgPathSegType.LineToRel, list[1].PathSegType); }
private void diffAndBisectTest(SvgPathSegList list, int startSeg, float expectedDiff, float expectedBisect) { float diff = SvgNumber.CalcAngleDiff(((SvgPathSeg)list[startSeg]).EndAngle, ((SvgPathSeg)list[startSeg + 1]).StartAngle); float bisect = SvgNumber.CalcAngleBisection(((SvgPathSeg)list[startSeg]).EndAngle, ((SvgPathSeg)list[startSeg + 1]).StartAngle); string label = startSeg + "-" + (startSeg + 1); floatsTest(label + " diff", expectedDiff, diff); floatsTest(label + " bisect", expectedBisect, bisect); }
public void TestMultipleMovetosRel() { SvgPathSegList list = new SvgPathSegList("m10,30 20,20", false); Assert.AreEqual(2, list.NumberOfItems); Assert.AreEqual("m", list[0].PathSegTypeAsLetter); Assert.AreEqual(new PointF(10, 30), ((SvgPathSegMovetoRel)list[0]).AbsXY); Assert.AreEqual("l", list[1].PathSegTypeAsLetter); Assert.AreEqual(new PointF(30, 50), ((SvgPathSegLinetoRel)list[1]).AbsXY); }
// hanlde Paths : public static double getPathLength(string myPath) { // just use sharpVector segmentList SvgPathSegList mylist = new SvgPathSegList(myPath, true); Double pathLength = mylist.GetTotalLength(); mylist = null; //return convertUnitToMm(pathLength); return(convertPixelToMm(pathLength)); }
public void TestMultipleMovetosAbs() { SvgPathSegList list = new SvgPathSegList("M10, 30 70-20,23 -12", false); Assert.AreEqual(3, list.NumberOfItems); Assert.AreEqual("M", list[0].PathSegTypeAsLetter); Assert.AreEqual(new PointF(10, 30), ((SvgPathSegMovetoAbs)list[0]).AbsXY); Assert.AreEqual("L", list[1].PathSegTypeAsLetter); Assert.AreEqual(new PointF(70, -20), ((SvgPathSegLinetoAbs)list[1]).AbsXY); Assert.AreEqual("L", list[2].PathSegTypeAsLetter); Assert.AreEqual(new PointF(23, -12), ((SvgPathSegLinetoAbs)list[2]).AbsXY); }
private void RenderPathSegList(SvgGraphicsElement element, SvgPathSegList segs) { var reenderer = new PathRenderer(); foreach (var seq in segs) { seq.Accept(reenderer); } var path = reenderer.Path(); this.RenderShapeToCanvas(element, path); }
public void TestInsert() { SvgPathSegList list = getNonEmptyList(); list.InsertItemBefore(getLineto(), 1); Assert.AreEqual(4, list.NumberOfItems); Assert.AreEqual(1, ((SvgPathSeg)list[1]).Index); Assert.AreEqual(2, ((SvgPathSeg)list[2]).Index); Assert.AreEqual(SvgPathSegType.MoveToAbs, list[0].PathSegType); Assert.AreEqual(SvgPathSegType.LineToAbs, list[1].PathSegType); Assert.AreEqual(SvgPathSegType.LineToAbs, list[2].PathSegType); Assert.AreEqual(SvgPathSegType.LineToRel, list[3].PathSegType); }
private PageElement VisitPathSegList(SvgGraphicsElement graphicsElement, SvgPathSegList paths) { if (!IsVisible(graphicsElement)) { return(null); } var result = new Group(); PushTransformsMatrix(graphicsElement.Transform); var innerMatrix = CurrentMatrix; var pathsToDraw = paths .ConvertToAbsolute() .ConvertAllLinesAndCurvesToCubicCurves() .MultiplyByMatrix(CurrentMatrix); var fillOpacity = Math.Max(0, Math.Min(1, graphicsElement.Style.FillOpacity)); var strokeOpacity = Math.Max(0, Math.Min(1, graphicsElement.Style.StrokeOpacity)); var svgToPdfPathConverter = new SvgPathSegToDynamicPdfPathsConverter(graphicsElement, _pageViewport, _pageHeight, _spotColorOverride); bool IsPaintedPath(Path path) => path.FillColor != null || path.LineColor != null; if (Math.Abs(fillOpacity - 1) > float.Epsilon || Math.Abs(strokeOpacity - 1) > float.Epsilon) { var fillGroup = new TransparencyGroup(fillOpacity * _groupAlpha); svgToPdfPathConverter.SetStrokeStyle(null); pathsToDraw.ForEach(i => i.Accept(svgToPdfPathConverter)); fillGroup.AddRange(svgToPdfPathConverter.Paths.Where(IsPaintedPath)); svgToPdfPathConverter.Reset(); svgToPdfPathConverter.SetFillStyle(null); svgToPdfPathConverter.SetStrokeStyle(graphicsElement); var strokeGroup = new TransparencyGroup(strokeOpacity * _groupAlpha); pathsToDraw.ForEach(i => i.Accept(svgToPdfPathConverter)); strokeGroup.AddRange(svgToPdfPathConverter.Paths.Where(IsPaintedPath)); result.Add(fillGroup); result.Add(strokeGroup); } else { pathsToDraw.ForEach(i => i.Accept(svgToPdfPathConverter)); result.AddRange(svgToPdfPathConverter.Paths.Where(IsPaintedPath)); } PopTransformsMatrix(graphicsElement.Transform); return(result.Count == 0 ? null : CheckAndApplyClipPath(graphicsElement, result, innerMatrix)); }
public void ParseTest1() { SvgPathSegList list = new SvgPathSegList("M10, 30L70-20,23 -12L23 34z", false); Assert.AreEqual(5, list.NumberOfItems); Assert.AreEqual("M", list[0].PathSegTypeAsLetter); Assert.AreEqual(new PointF(10, 30), ((SvgPathSegMovetoAbs)list[0]).AbsXY); Assert.AreEqual("L", list[1].PathSegTypeAsLetter); Assert.AreEqual(new PointF(70, -20), ((SvgPathSegLinetoAbs)list[1]).AbsXY); Assert.AreEqual("L", list[2].PathSegTypeAsLetter); Assert.AreEqual(new PointF(23, -12), ((SvgPathSegLinetoAbs)list[2]).AbsXY); Assert.AreEqual("L", list[3].PathSegTypeAsLetter); Assert.AreEqual(new PointF(23, 34), ((SvgPathSegLinetoAbs)list[3]).AbsXY); Assert.AreEqual("z", list[4].PathSegTypeAsLetter); }
/// <summary> /// Not using returns negative value if points in wrong order /// </summary> public double getPathArea(string myPath) { // just use sharpVector segmentList SvgPathSegList mylist = new SvgPathSegList(myPath, true); StringBuilder sb = new StringBuilder(); double fX = 0.0; double fY = 0.0; int segCount = 0; foreach (SvgPointF seg in mylist.Points) { sb.Append(Convert.ToString(seg.ValueX) + "," + Convert.ToString(seg.ValueY)); segCount += 1; if (segCount < mylist.NumberOfItems) { sb.Append(" "); } } mylist = null; //reverse order string[] points = sb.ToString().Split(' '); StringBuilder revPoints = new StringBuilder(); for (int i = points.Length - 3; i >= 0; i--) { if (points[i].Contains(",")) { revPoints.Append(points[i]); if (i > 0) { revPoints.Append(" "); } } } return(polygonArea(revPoints.ToString())); }
public void TestStartEndAngle2() { SvgPathSegList list = new SvgPathSegList("M5,5 L15,5 25,25 Q30,40 40,30 L50 20 a25,25 -30 0,1 0,50 l-40 20 z", false); floatsTest("1 startAngle", 270, ((SvgPathSeg)list[1]).StartAngle); floatsTest("1 endAngle", 90, ((SvgPathSeg)list[1]).EndAngle); diffAndBisectTest(list, 1, 117, 31.5f); floatsTest("2 startAngle", 333, ((SvgPathSeg)list[2]).StartAngle); floatsTest("2 endAngle", 153, ((SvgPathSeg)list[2]).EndAngle); diffAndBisectTest(list, 2, 172, 67.5f); floatsTest("3 startAngle", 342, ((SvgPathSeg)list[3]).StartAngle); floatsTest("3 endAngle", 45, ((SvgPathSeg)list[3]).EndAngle); diffAndBisectTest(list, 3, 180, 315f); floatsTest("4 startAngle", 225, ((SvgPathSeg)list[4]).StartAngle); floatsTest("4 endAngle", 45, ((SvgPathSeg)list[4]).EndAngle); diffAndBisectTest(list, 4, 135, 337.5f); floatsTest("5 startAngle", 270, ((SvgPathSeg)list[5]).StartAngle); floatsTest("5 endAngle", 270, ((SvgPathSeg)list[5]).EndAngle); diffAndBisectTest(list, 5, 207, 166.5f); //rel Lineto 50,70 => 10,90 floatsTest("6 startAngle", 63, ((SvgPathSeg)list[6]).StartAngle); floatsTest("6 endAngle", 243, ((SvgPathSeg)list[6]).EndAngle); diffAndBisectTest(list, 6, 67, 210f); //close 10,90 => 5,5 floatsTest("7 startAngle", 177, ((SvgPathSeg)list[7]).StartAngle); floatsTest("7 endAngle", 357, ((SvgPathSeg)list[7]).EndAngle); }
public static GraphicsPath CreatePath(SvgPathElement element) { GraphicsPath gp = new GraphicsPath(); SvgPointF initPoint = new SvgPointF(0, 0); SvgPointF lastPoint = new SvgPointF(0, 0); SvgPointF ptXY = new SvgPointF(0, 0); SvgPathSeg segment = null; SvgPathSegMoveto pathMoveTo = null; SvgPathSegLineto pathLineTo = null; SvgPathSegCurveto pathCurveTo = null; SvgPathSegArc pathArc = null; SvgPathSegList segments = element.PathSegList; int nElems = segments.NumberOfItems; for (int i = 0; i < nElems; i++) { segment = segments.GetItem(i); switch (segment.PathType) { case SvgPathType.MoveTo: //if (DynamicCast.Cast(segment, out pathMoveTo)) pathMoveTo = (SvgPathSegMoveto)segment; gp.StartFigure(); lastPoint = initPoint = pathMoveTo.AbsXY; break; case SvgPathType.LineTo: //else if (DynamicCast.Cast(segment, out pathLineTo)) pathLineTo = (SvgPathSegLineto)segment; ptXY = pathLineTo.AbsXY; gp.AddLine(lastPoint.X, lastPoint.Y, ptXY.X, ptXY.Y); lastPoint = ptXY; break; case SvgPathType.CurveTo: //else if (DynamicCast.Cast(segment, out pathCurveTo)) pathCurveTo = (SvgPathSegCurveto)segment; SvgPointF xy = pathCurveTo.AbsXY; SvgPointF x1y1 = pathCurveTo.CubicX1Y1; SvgPointF x2y2 = pathCurveTo.CubicX2Y2; gp.AddBezier(lastPoint.X, lastPoint.Y, x1y1.X, x1y1.Y, x2y2.X, x2y2.Y, xy.X, xy.Y); lastPoint = xy; break; case SvgPathType.ArcTo: //else if (DynamicCast.Cast(segment, out pathArc)) pathArc = (SvgPathSegArc)segment; ptXY = pathArc.AbsXY; if (lastPoint.Equals(ptXY)) { // If the endpoints (x, y) and (x0, y0) are identical, then this // is equivalent to omitting the elliptical arc segment entirely. } else if (pathArc.R1.Equals(0) || pathArc.R2.Equals(0)) { // Ensure radii are valid gp.AddLine(lastPoint.X, lastPoint.Y, ptXY.X, ptXY.Y); } else { CalculatedArcValues calcValues = pathArc.GetCalculatedArcValues(); GraphicsPath subPath = new GraphicsPath(); subPath.StartFigure(); subPath.AddArc((float)(calcValues.Cx - calcValues.CorrRx), (float)(calcValues.Cy - calcValues.CorrRy), (float)calcValues.CorrRx * 2, (float)calcValues.CorrRy * 2, (float)calcValues.AngleStart, (float)calcValues.AngleExtent); Matrix matrix = new Matrix(); matrix.Translate(-(float)calcValues.Cx, -(float)calcValues.Cy); subPath.Transform(matrix); matrix = new Matrix(); matrix.Rotate((float)pathArc.Angle); subPath.Transform(matrix); matrix = new Matrix(); matrix.Translate((float)calcValues.Cx, (float)calcValues.Cy); subPath.Transform(matrix); gp.AddPath(subPath, true); } lastPoint = ptXY; break; case SvgPathType.Close: //else if (segment is SvgPathSegClosePath) gp.CloseFigure(); lastPoint = initPoint; break; } } string fillRule = element.GetPropertyValue("fill-rule"); if (fillRule == "evenodd") { gp.FillMode = FillMode.Alternate; } else { gp.FillMode = FillMode.Winding; } return(gp); }
public Geometry CreateGeometry(SvgPathElement element) { PathGeometry geometry = new PathGeometry(); var comparer = StringComparison.OrdinalIgnoreCase; string fillRule = element.GetPropertyValue("fill-rule"); string clipRule = element.GetAttribute("clip-rule"); if (!string.IsNullOrWhiteSpace(clipRule) && string.Equals(clipRule, "evenodd", comparer) || string.Equals(clipRule, CssConstants.ValNonzero, comparer)) { fillRule = clipRule; } if (string.Equals(fillRule, "evenodd", comparer)) { geometry.FillRule = FillRule.EvenOdd; } else if (string.Equals(fillRule, CssConstants.ValNonzero, comparer)) { geometry.FillRule = FillRule.Nonzero; } SvgPointF initPoint = new SvgPointF(0, 0); SvgPointF lastPoint = new SvgPointF(0, 0); SvgPointF ptXY = new SvgPointF(0, 0); SvgPathSeg segment = null; SvgPathSegMoveto pathMoveTo = null; SvgPathSegLineto pathLineTo = null; SvgPathSegCurveto pathCurveTo = null; SvgPathSegArc pathArc = null; SvgPathSegList segments = element.PathSegList; int numSegs = segments.NumberOfItems; if (numSegs == 0) { return(geometry); } PathFigure pathFigure = null; for (int i = 0; i < numSegs; i++) { segment = segments.GetItem(i); switch (segment.PathType) { case SvgPathType.MoveTo: //if (DynamicCast.Cast(segment, out pathMoveTo)) pathMoveTo = (SvgPathSegMoveto)segment; if (pathFigure != null) { pathFigure.IsClosed = false; pathFigure.IsFilled = true; geometry.Figures.Add(pathFigure); pathFigure = null; } lastPoint = initPoint = pathMoveTo.AbsXY; pathFigure = new PathFigure(); pathFigure.StartPoint = new Point(initPoint.ValueX, initPoint.ValueY); break; case SvgPathType.LineTo: //else if (DynamicCast.Cast(segment, out pathLineTo)) pathLineTo = (SvgPathSegLineto)segment; ptXY = pathLineTo.AbsXY; pathFigure.Segments.Add(new LineSegment(new Point(ptXY.ValueX, ptXY.ValueY), true)); lastPoint = ptXY; break; case SvgPathType.CurveTo: //else if (DynamicCast.Cast(segment, out pathCurveTo)) pathCurveTo = (SvgPathSegCurveto)segment; SvgPointF xy = pathCurveTo.AbsXY; SvgPointF x1y1 = pathCurveTo.CubicX1Y1; SvgPointF x2y2 = pathCurveTo.CubicX2Y2; pathFigure.Segments.Add(new BezierSegment(new Point(x1y1.ValueX, x1y1.ValueY), new Point(x2y2.ValueX, x2y2.ValueY), new Point(xy.ValueX, xy.ValueY), true)); lastPoint = xy; break; case SvgPathType.ArcTo: //else if (DynamicCast.Cast(segment, out pathArc)) pathArc = (SvgPathSegArc)segment; ptXY = pathArc.AbsXY; if (lastPoint.Equals(ptXY)) { // If the endpoints (x, y) and (x0, y0) are identical, then this // is equivalent to omitting the elliptical arc segment entirely. } else if (pathArc.R1.Equals(0) || pathArc.R2.Equals(0)) { // Ensure radii are valid pathFigure.Segments.Add(new LineSegment(new Point(ptXY.ValueX, ptXY.ValueY), true)); } else { CalculatedArcValues calcValues = pathArc.GetCalculatedArcValues(); pathFigure.Segments.Add(new ArcSegment(new Point(ptXY.ValueX, ptXY.ValueY), new Size(pathArc.R1, pathArc.R2), pathArc.Angle, pathArc.LargeArcFlag, pathArc.SweepFlag ? SweepDirection.Clockwise : SweepDirection.Counterclockwise, true)); } lastPoint = ptXY; break; case SvgPathType.Close: //else if (segment is SvgPathSegClosePath) if (pathFigure != null) { pathFigure.IsClosed = true; pathFigure.IsFilled = true; geometry.Figures.Add(pathFigure); pathFigure = null; } lastPoint = initPoint; break; } } if (pathFigure != null) { pathFigure.IsClosed = false; pathFigure.IsFilled = true; geometry.Figures.Add(pathFigure); } return(geometry); }
public void TestEmptyList() { SvgPathSegList list = getEmptyList(); Assert.AreEqual(0, list.NumberOfItems); }
public void TestReadOnlyAppend() { SvgPathSegList list = new SvgPathSegList("", true); list.AppendItem(getLineto()); }
public void SetUp() { segments = makeSegments(); segment = getTestSegment(); }
public void TestReadOnlyClear() { SvgPathSegList list = new SvgPathSegList("", true); list.Clear(); }