/// <summary> /// (re)calculates the given GraphicsPath according to the given CapShape. /// </summary> /// <param name="capPath">Reference of the GraphicsPath to (re)calculate</param> /// <param name="capShape">Desired shape of the LineCap</param> /// <param name="capSize">Desired Size of the LineCap</param> private static void CalcCapShape(ref GraphicsPath capPath, CapShape capShape, float capSize) { Debug.Assert(capSize >= 0); if (capPath == null) { capPath = new GraphicsPath(); } float halfSize = capSize / 2f; capPath.Reset(); switch (capShape) { case CapShape.ClosedArrow: capPath.StartFigure(); capPath.AddLine(-halfSize, -capSize, 0, 0); capPath.AddLine(0, 0, halfSize, -capSize); capPath.AddLine(halfSize, -capSize, -halfSize, -capSize); capPath.CloseFigure(); break; case CapShape.OpenArrow: float quaterSize = capSize / 4f; capPath.StartFigure(); capPath.AddLine(-halfSize, -capSize, 0, 0); capPath.AddLine(0, 0, halfSize, -capSize); capPath.AddLine(halfSize, -capSize, 0, -quaterSize); capPath.AddLine(0, -quaterSize, -halfSize, -capSize); capPath.CloseFigure(); break; case CapShape.Triangle: capPath.StartFigure(); capPath.AddLine(0, -capSize, -halfSize, 0); capPath.AddLine(-halfSize, 0, halfSize, 0); capPath.AddLine(halfSize, 0, 0, -capSize); capPath.CloseFigure(); break; case CapShape.Circle: capPath.StartFigure(); capPath.AddEllipse(-halfSize, -capSize, capSize, capSize); capPath.CloseFigure(); break; case CapShape.Square: _rectFBuffer.X = -halfSize; _rectFBuffer.Y = -capSize; _rectFBuffer.Width = halfSize + halfSize; _rectFBuffer.Height = capSize; capPath.StartFigure(); capPath.AddRectangle(_rectFBuffer); capPath.CloseFigure(); break; case CapShape.Diamond: capPath.StartFigure(); capPath.AddLine(0, 0, -halfSize, -halfSize); capPath.AddLine(-halfSize, -halfSize, 0, -capSize); capPath.AddLine(0, -capSize, halfSize, -halfSize); capPath.AddLine(halfSize, -halfSize, 0, 0); capPath.CloseFigure(); break; case CapShape.CenteredCircle: capPath.StartFigure(); capPath.AddEllipse(-halfSize, -halfSize, capSize, capSize); capPath.CloseFigure(); break; case CapShape.CenteredHalfCircle: capPath.StartFigure(); capPath.StartFigure(); capPath.AddArc(-halfSize, -halfSize, capSize, capSize, 0f, -180f); capPath.AddLine(-halfSize, 0, -halfSize - 1, 0); capPath.AddArc(-halfSize - 1, -halfSize - 1, capSize + 2, capSize + 2, 180f, 180f); capPath.AddLine(halfSize + 1, 0, halfSize, 0); capPath.CloseFigure(); capPath.CloseFigure(); break; case CapShape.None: case CapShape.Round: return; default: throw new NShapeUnsupportedValueException(capShape); } }
/// <summary> /// (re)calculates the given GraphicsPath according to the given CapShape. /// </summary> /// <param name="capPath">Reference of the GraphicsPath to (re)calculate</param> /// <param name="capShape">Desired shape of the LineCap</param> /// <param name="capSize">Desired Size of the LineCap</param> private static void CalcCapShape(ref GraphicsPath capPath, CapShape capShape, int capSize) { Debug.Assert(capSize >= 0); if (capPath == null) capPath = new GraphicsPath(); float halfSize = capSize / 2f; capPath.Reset(); switch (capShape) { case CapShape.ArrowClosed: capPath.StartFigure(); capPath.AddLine(-halfSize, -capSize, 0, 0); capPath.AddLine(0, 0, halfSize, -capSize); capPath.AddLine(halfSize, -capSize, -halfSize, -capSize); capPath.CloseFigure(); break; case CapShape.ArrowOpen: float quaterSize = capSize / 4f; capPath.StartFigure(); capPath.AddLine(-halfSize, -capSize, 0, 0); capPath.AddLine(0, 0, halfSize, -capSize); capPath.AddLine(halfSize, -capSize, 0, -quaterSize); capPath.AddLine(0, -quaterSize, -halfSize, -capSize); capPath.CloseFigure(); break; case CapShape.Triangle: capPath.StartFigure(); capPath.AddLine(0, -capSize, -halfSize, 0); capPath.AddLine(-halfSize, 0, halfSize, 0); capPath.AddLine(halfSize, 0, 0, -capSize); capPath.CloseFigure(); break; case CapShape.Circle: capPath.StartFigure(); capPath.AddEllipse(-halfSize, -capSize, capSize, capSize); capPath.CloseFigure(); break; case CapShape.Square: rectFBuffer.X = -halfSize; rectFBuffer.Y = -capSize; rectFBuffer.Width = halfSize + halfSize; rectFBuffer.Height = capSize; capPath.StartFigure(); capPath.AddRectangle(rectFBuffer); capPath.CloseFigure(); break; case CapShape.Diamond: capPath.StartFigure(); capPath.AddLine(0, 0, -halfSize, -halfSize); capPath.AddLine(-halfSize, -halfSize, 0, -capSize); capPath.AddLine(0, -capSize, halfSize, -halfSize); capPath.AddLine(halfSize, -halfSize, 0, 0); capPath.CloseFigure(); break; case CapShape.CenteredCircle: capPath.StartFigure(); capPath.AddEllipse(-halfSize, -halfSize, capSize, capSize); capPath.CloseFigure(); break; case CapShape.CenteredHalfCircle: capPath.StartFigure(); capPath.StartFigure(); capPath.AddArc(-halfSize, -halfSize, capSize, capSize, 0f, -180f); capPath.AddLine(-halfSize, 0, -halfSize - 1, 0); capPath.AddArc(-halfSize - 1, -halfSize - 1, capSize + 2, capSize + 2, 180f, 180f); capPath.AddLine(halfSize + 1, 0, halfSize, 0); capPath.CloseFigure(); capPath.CloseFigure(); break; case CapShape.None: return; default: throw new NShapeUnsupportedValueException(capShape); } }