public override bool OnTouchEvent(MotionEvent e) { float currentX = e.GetX(); float currentY = e.GetY(); switch (e.Action) { case MotionEventActions.Down: path.MoveTo(currentX, currentY); previousX = currentX; previouxY = currentY; return(true); case MotionEventActions.Move: case MotionEventActions.Up: for (int i = 0; i < e.HistorySize; i++) { float historicalX = e.GetHistoricalX(i); float historicalY = e.GetHistoricalY(i); path.LineTo(historicalX, historicalY); } path.LineTo(currentX, currentY); Invalidate(); previousX = currentX; previouxY = currentY; return(true); default: return(false); } }
private void Touch_start(float x, float y) { mPath.Reset(); mPath.MoveTo(x, y); mX = x; mY = y; }
public void DrawPath(IEnumerable <PathOp> ops, Pen pen = null, Brush brush = null) { if (pen == null && brush == null) { return; } using (var path = new global::Android.Graphics.Path()) { var bb = new BoundingBoxBuilder(); Point?prevPoint = null; foreach (var op in ops) { var mt = op as MoveTo; if (mt != null) { var p = mt.Point; path.MoveTo((float)p.X, (float)p.Y); bb.Add(p); prevPoint = p; continue; } var lt = op as LineTo; if (lt != null) { var p = lt.Point; path.LineTo((float)p.X, (float)p.Y); bb.Add(p); prevPoint = p; continue; } var at = op as ArcTo; if (at != null) { var p = at.Point; if (!prevPoint.HasValue) { throw new NotSupportedException("Cannot begin path with Arc."); } var pp = prevPoint.Value; Point c1, c2; at.GetCircles(pp, out c1, out c2); var circleCenter = at.LargeArc ^ !at.SweepClockwise ? c2 : c1; var rect = new Rect(circleCenter - at.Radius, at.Radius * 2); var startAngle = Conversions.RadToDeg((float)Math.Atan2(pp.Y - circleCenter.Y, pp.X - circleCenter.X)); var endAngle = Conversions.RadToDeg((float)Math.Atan2(p.Y - circleCenter.Y, p.X - circleCenter.X)); var sweepAngle = endAngle - startAngle; if (at.SweepClockwise && sweepAngle < 0) { // If we want to go CW, sweepAngle needs to be positive sweepAngle += 360.0f; } else if (!at.SweepClockwise && sweepAngle > 0) { // If we want to go CCW, sweepAngle needs to be negative sweepAngle -= 360.0f; } path.AddArc(Conversions.GetRectF(rect), startAngle, sweepAngle); bb.Add(p); prevPoint = p; continue; } var ct = op as CurveTo; if (ct != null) { var p = ct.Point; var c1 = ct.Control1; var c2 = ct.Control2; path.CubicTo((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y); bb.Add(p); bb.Add(c1); bb.Add(c2); prevPoint = p; continue; } var cp = op as ClosePath; if (cp != null) { path.Close(); continue; } throw new NotSupportedException("Path Op " + op); } var frame = bb.BoundingBox; if (brush != null) { var paint = GetBrushPaint(brush, frame); graphics.DrawPath(path, paint); } if (pen != null) { var paint = GetPenPaint(pen); graphics.DrawPath(path, paint); } } }
public void DrawPath(IEnumerable<PathOp> ops, Pen pen = null, Brush brush = null) { if (pen == null && brush == null) return; using (var path = new global::Android.Graphics.Path ()) { var bb = new BoundingBoxBuilder (); foreach (var op in ops) { var mt = op as MoveTo; if (mt != null) { var p = mt.Point; path.MoveTo ((float)p.X, (float)p.Y); bb.Add (p); continue; } var lt = op as LineTo; if (lt != null) { var p = lt.Point; path.LineTo ((float)p.X, (float)p.Y); bb.Add (p); continue; } var at = op as ArcTo; if (at != null) { var p = at.Point; path.LineTo ((float)p.X, (float)p.Y); bb.Add (p); continue; } var ct = op as CurveTo; if (ct != null) { var p = ct.Point; var c1 = ct.Control1; var c2 = ct.Control2; path.CubicTo ((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y); bb.Add (p); bb.Add (c1); bb.Add (c2); continue; } var cp = op as ClosePath; if (cp != null) { path.Close (); continue; } throw new NotSupportedException ("Path Op " + op); } var frame = bb.BoundingBox; if (brush != null) { var paint = GetBrushPaint (brush, frame); graphics.DrawPath (path, paint); } if (pen != null) { var paint = GetPenPaint (pen); graphics.DrawPath (path, paint); } } }
/// <summary> /// Draws a line on the target. The coordinates given are scene coordinates. /// </summary> /// <param name="x">The x coordinate.</param> /// <param name="y">The y coordinate.</param> /// <param name="color">Color.</param> /// <param name="width">Width.</param> /// <param name="casingWidth">Casing width.</param> /// <param name="casingColor">Casing color.</param> protected override void DrawLine(Target2DWrapper <global::Android.Graphics.Canvas> target, double[] x, double[] y, int color, double width, LineJoin lineJoine, int[] dashes) { if (x.Length > 1) { _paint.AntiAlias = true; _paint.SetStyle(global::Android.Graphics.Paint.Style.Stroke); if (dashes != null && dashes.Length > 0) { // set the dashes effect. float[] intervals = new float[dashes.Length]; for (int idx = 0; idx < dashes.Length; idx++) { intervals [idx] = dashes [idx]; } _paint.SetPathEffect( new global::Android.Graphics.DashPathEffect( intervals, 0)); } float minX = float.MaxValue, maxX = float.MinValue, minY = float.MaxValue, maxY = float.MinValue; float xT, yT; // convert to the weid android api array! _path.Rewind(); double[] transformed = this.Tranform(x [0], y [0]); xT = (float)transformed [0]; yT = (float)transformed [1]; _path.MoveTo(xT, yT); if (xT < minX) { minX = xT; } if (xT > maxX) { maxX = xT; } if (yT < minY) { minY = yT; } if (yT > maxY) { maxY = yT; } for (int idx = 1; idx < x.Length; idx++) { transformed = this.Tranform(x [idx], y [idx]); xT = (float)transformed[0]; yT = (float)transformed[1]; _path.LineTo(xT, yT); if (xT < minX) { minX = xT; } if (xT > maxX) { maxX = xT; } if (yT < minY) { minY = yT; } if (yT > maxY) { maxY = yT; } } if ((maxX - minX) > 1 || (maxY - minY) > 1) { // if (casingWidth > 0) { // float casingWidthInPixels = this.ToPixels (casingWidth + width); // _paint.Color = new global::Android.Graphics.Color (casingColor); // _paint.StrokeWidth = casingWidthInPixels; // target.Target.DrawPath (_path, _paint); // } float widthInPixels = this.ToPixels(width); _paint.Color = new global::Android.Graphics.Color(color); _paint.StrokeWidth = widthInPixels; target.Target.DrawPath(_path, _paint); } _paint.Reset(); } }
public void DrawPath(IEnumerable <PathOp> ops, Pen pen = null, Brush brush = null) { if (pen == null && brush == null) { return; } using (var path = new global::Android.Graphics.Path()) { var bb = new BoundingBoxBuilder(); foreach (var op in ops) { var mt = op as MoveTo; if (mt != null) { var p = mt.Point; path.MoveTo((float)p.X, (float)p.Y); bb.Add(p); continue; } var lt = op as LineTo; if (lt != null) { var p = lt.Point; path.LineTo((float)p.X, (float)p.Y); bb.Add(p); continue; } var at = op as ArcTo; if (at != null) { var p = at.Point; path.LineTo((float)p.X, (float)p.Y); bb.Add(p); continue; } var ct = op as CurveTo; if (ct != null) { var p = ct.Point; var c1 = ct.Control1; var c2 = ct.Control2; path.CubicTo((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y); bb.Add(p); bb.Add(c1); bb.Add(c2); continue; } var cp = op as ClosePath; if (cp != null) { path.Close(); continue; } throw new NotSupportedException("Path Op " + op); } var frame = bb.BoundingBox; if (brush != null) { var paint = GetBrushPaint(brush, frame); graphics.DrawPath(path, paint); } if (pen != null) { var paint = GetPenPaint(pen); graphics.DrawPath(path, paint); } } }
public static Bitmap Draw(int width, int height, double direction) { if(width == 0 || height == 0) return null; int w2 = width / 2; int h2 = height / 2; Paint light = new Paint(PaintFlags.AntiAlias); Paint dark = new Paint(PaintFlags.AntiAlias); Paint black = new Paint(PaintFlags.AntiAlias); light.Color = new Color(128, 0, 0, 255); light.StrokeWidth = 0f; light.SetStyle(Paint.Style.FillAndStroke); dark.Color = new Color(255, 0, 0, 255); dark.StrokeWidth = 0f; dark.SetStyle(Paint.Style.FillAndStroke); black.Color = new Color(0, 0, 0, 255); black.StrokeWidth = 0f; black.SetStyle(Paint.Style.Stroke); // Values of direction are between 0° and 360°, but for drawing we need -180° to +180° direction -= 180; double rad1 = direction / 180.0 * Math.PI; double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI; double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; double rad4 = (direction + 180.0) / 180.0 * Math.PI; PointF p1 = new PointF((float) (w2 + w2 * Math.Sin (rad1)), (float) (h2 + h2 * Math.Cos (rad1))); PointF p2 = new PointF((float) (w2 + w2 * Math.Sin (rad2)), (float) (h2 + h2 * Math.Cos (rad2))); PointF p3 = new PointF((float) (w2 + w2 * Math.Sin (rad3)), (float) (h2 + h2 * Math.Cos (rad3))); PointF p4 = new PointF((float) (w2 + width / 3 * Math.Sin (rad4)), (float) (h2 + height / 3 * Math.Cos (rad4))); Bitmap b = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888); using(Canvas c = new Canvas(b)) { int cx = c.Width / 2 - 1; int cy = c.Height / 2 - 1; global::Android.Graphics.Path path1 = new global::Android.Graphics.Path (); global::Android.Graphics.Path path2 = new global::Android.Graphics.Path (); global::Android.Graphics.Path path3 = new global::Android.Graphics.Path (); path1.MoveTo (p1.X,p1.Y); path1.LineTo (p2.X,p2.Y); path1.LineTo (p4.X,p4.Y); path1.LineTo (p1.X,p1.Y); path2.MoveTo (p1.X,p1.Y); path2.LineTo (p3.X,p3.Y); path2.LineTo (p4.X,p4.Y); path2.LineTo (p1.X,p1.Y); path3.MoveTo (p1.X,p1.Y); path3.LineTo (p2.X,p2.Y); path3.LineTo (p4.X,p4.Y); path3.LineTo (p1.X,p1.Y); path3.LineTo (p3.X,p3.Y); path3.LineTo (p4.X,p4.Y); light.Color = new Color (128, 0, 0, 255); dark.Color = new Color (255, 0, 0, 255); black.Color = new Color (0, 0, 0, 255); c.DrawPath (path1, light); c.DrawPath (path2, dark); c.DrawPath (path3, black); } return b; }
public void DrawPath(IEnumerable<PathOp> ops, Pen pen = null, Brush brush = null) { if (pen == null && brush == null) return; using (var path = new global::Android.Graphics.Path ()) { var bb = new BoundingBoxBuilder (); Point? prevPoint = null; foreach (var op in ops) { var mt = op as MoveTo; if (mt != null) { var p = mt.Point; path.MoveTo ((float)p.X, (float)p.Y); bb.Add (p); prevPoint = p; continue; } var lt = op as LineTo; if (lt != null) { var p = lt.Point; path.LineTo ((float)p.X, (float)p.Y); bb.Add (p); prevPoint = p; continue; } var at = op as ArcTo; if (at != null) { var p = at.Point; if (!prevPoint.HasValue) { throw new NotSupportedException("Cannot begin path with Arc."); } var pp = prevPoint.Value; Point c1, c2; at.GetCircles(pp, out c1, out c2); var circleCenter = at.LargeArc ^ !at.SweepClockwise ? c2 : c1; var rect = new Rect(circleCenter - at.Radius, at.Radius * 2); var startAngle = Conversions.RadToDeg((float)Math.Atan2(pp.Y - circleCenter.Y, pp.X - circleCenter.X)); var endAngle = Conversions.RadToDeg((float)Math.Atan2(p.Y - circleCenter.Y, p.X - circleCenter.X)); var sweepAngle = endAngle - startAngle; if (at.SweepClockwise && sweepAngle < 0) { // If we want to go CW, sweepAngle needs to be positive sweepAngle += 360.0f; } else if (!at.SweepClockwise && sweepAngle > 0) { // If we want to go CCW, sweepAngle needs to be negative sweepAngle -= 360.0f; } path.AddArc(Conversions.GetRectF(rect), startAngle, sweepAngle); bb.Add (p); prevPoint = p; continue; } var ct = op as CurveTo; if (ct != null) { var p = ct.Point; var c1 = ct.Control1; var c2 = ct.Control2; path.CubicTo ((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y); bb.Add (p); bb.Add (c1); bb.Add (c2); prevPoint = p; continue; } var cp = op as ClosePath; if (cp != null) { path.Close (); continue; } throw new NotSupportedException ("Path Op " + op); } var frame = bb.BoundingBox; if (brush != null) { var paint = GetBrushPaint (brush, frame); graphics.DrawPath (path, paint); } if (pen != null) { var paint = GetPenPaint (pen); graphics.DrawPath (path, paint); } } }
public static Bitmap Draw(int width, int height, double direction) { if (width == 0 || height == 0) { return(null); } int w2 = width / 2; int h2 = height / 2; Paint light = new Paint(PaintFlags.AntiAlias); Paint dark = new Paint(PaintFlags.AntiAlias); Paint black = new Paint(PaintFlags.AntiAlias); light.Color = new Color(128, 0, 0, 255); light.StrokeWidth = 0f; light.SetStyle(Paint.Style.FillAndStroke); dark.Color = new Color(255, 0, 0, 255); dark.StrokeWidth = 0f; dark.SetStyle(Paint.Style.FillAndStroke); black.Color = new Color(0, 0, 0, 255); black.StrokeWidth = 0f; black.SetStyle(Paint.Style.Stroke); // Values of direction are between 0° and 360°, but for drawing we need -180° to +180° direction -= 180; double rad1 = direction / 180.0 * Math.PI; double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI; double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; double rad4 = (direction + 180.0) / 180.0 * Math.PI; PointF p1 = new PointF((float)(w2 + w2 * Math.Sin(rad1)), (float)(h2 + h2 * Math.Cos(rad1))); PointF p2 = new PointF((float)(w2 + w2 * Math.Sin(rad2)), (float)(h2 + h2 * Math.Cos(rad2))); PointF p3 = new PointF((float)(w2 + w2 * Math.Sin(rad3)), (float)(h2 + h2 * Math.Cos(rad3))); PointF p4 = new PointF((float)(w2 + width / 3 * Math.Sin(rad4)), (float)(h2 + height / 3 * Math.Cos(rad4))); Bitmap b = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888); using (Canvas c = new Canvas(b)) { int cx = c.Width / 2 - 1; int cy = c.Height / 2 - 1; global::Android.Graphics.Path path1 = new global::Android.Graphics.Path(); global::Android.Graphics.Path path2 = new global::Android.Graphics.Path(); global::Android.Graphics.Path path3 = new global::Android.Graphics.Path(); path1.MoveTo(p1.X, p1.Y); path1.LineTo(p2.X, p2.Y); path1.LineTo(p4.X, p4.Y); path1.LineTo(p1.X, p1.Y); path2.MoveTo(p1.X, p1.Y); path2.LineTo(p3.X, p3.Y); path2.LineTo(p4.X, p4.Y); path2.LineTo(p1.X, p1.Y); path3.MoveTo(p1.X, p1.Y); path3.LineTo(p2.X, p2.Y); path3.LineTo(p4.X, p4.Y); path3.LineTo(p1.X, p1.Y); path3.LineTo(p3.X, p3.Y); path3.LineTo(p4.X, p4.Y); light.Color = new Color(128, 0, 0, 255); dark.Color = new Color(255, 0, 0, 255); black.Color = new Color(0, 0, 0, 255); c.DrawPath(path1, light); c.DrawPath(path2, dark); c.DrawPath(path3, black); } return(b); }
protected override void OnDraw(Canvas canvas) { var trans = Element.RenderTransform ?? new IdentityTransform(); var path = new global::Android.Graphics.Path(); foreach (var command in PathDataParser.ToAbsolute(PathDataParser.Parse(Element.Data))) { switch (command.Type) { case PathDataParser.CommandType.MoveTo: { var pt = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[0], command.Arguments[1])); path.MoveTo(pt.X, pt.Y); } break; case PathDataParser.CommandType.LineTo: { var pt = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[0], command.Arguments[1])); path.LineTo(pt.X, pt.Y); } break; case PathDataParser.CommandType.QBezier: { var pt = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[0], command.Arguments[1])); var pt2 = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[2], command.Arguments[3])); path.QuadTo(pt.X, pt.Y, pt2.X, pt2.Y); } break; case PathDataParser.CommandType.Bezier: { var pt = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[0], command.Arguments[1])); var pt2 = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[2], command.Arguments[3])); var pt3 = trans.TransformPoint( new System.Drawing.PointF(command.Arguments[4], command.Arguments[5])); path.CubicTo(pt.X, pt.Y, pt2.X, pt2.Y, pt3.X, pt3.Y); } break; case PathDataParser.CommandType.Close: path.Close(); DrawPath(canvas, path); path = new global::Android.Graphics.Path(); break; } } if (!path.IsEmpty) { DrawPath(canvas, path); } }
public Bitmap DrawArrow (double direction) { int w = 48; int h = 48; int w2 = w / 2; int h2 = w / 2; double rad1 = direction / 180.0 * Math.PI; double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI; double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; double rad4 = (direction + 180.0) / 180.0 * Math.PI; PointF p1 = new PointF((float) (w2 + w2 * Math.Sin (rad1)), (float) (h2 + h2 * Math.Cos (rad1))); PointF p2 = new PointF((float) (w2 + w2 * Math.Sin (rad2)), (float) (h2 + h2 * Math.Cos (rad2))); PointF p3 = new PointF((float) (w2 + w2 * Math.Sin (rad3)), (float) (h2 + h2 * Math.Cos (rad3))); PointF p4 = new PointF((float) (w2 + w / 3 * Math.Sin (rad4)), (float) (h2 + h / 3 * Math.Cos (rad4))); Bitmap b = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888); Canvas c = new Canvas(b); Paint light = new Paint (PaintFlags.AntiAlias); Paint dark = new Paint (PaintFlags.AntiAlias); Paint black = new Paint (PaintFlags.AntiAlias); light.Color = new Color (128, 0, 0, 255); light.StrokeWidth = 0f; light.SetStyle (Paint.Style.FillAndStroke); dark.Color = new Color (255, 0, 0, 255); dark.StrokeWidth = 0f; dark.SetStyle (Paint.Style.FillAndStroke); black.Color = new Color (0, 0, 0, 255); black.StrokeWidth = 0f; black.SetStyle (Paint.Style.Stroke); int cx = c.Width / 2 - 1; int cy = c.Height / 2 - 1; global::Android.Graphics.Path path1 = new global::Android.Graphics.Path (); global::Android.Graphics.Path path2 = new global::Android.Graphics.Path (); global::Android.Graphics.Path path3 = new global::Android.Graphics.Path (); path1.MoveTo (p1.X,p1.Y); path1.LineTo (p2.X,p2.Y); path1.LineTo (p4.X,p4.Y); path1.LineTo (p1.X,p1.Y); path2.MoveTo (p1.X,p1.Y); path2.LineTo (p3.X,p3.Y); path2.LineTo (p4.X,p4.Y); path2.LineTo (p1.X,p1.Y); path3.MoveTo (p1.X,p1.Y); path3.LineTo (p2.X,p2.Y); path3.LineTo (p4.X,p4.Y); path3.LineTo (p1.X,p1.Y); path3.LineTo (p3.X,p3.Y); path3.LineTo (p4.X,p4.Y); c.DrawPath (path1, light); c.DrawPath (path2, dark); c.DrawPath (path3, black); // UIGraphics.BeginImageContext (new SizeF(64, 64)); // // using (CGContext cont = UIGraphics.GetCurrentContext()) { // // using (CGPath path = new CGPath()) { // // cont.SetLineWidth (1f); // cont.SetRGBStrokeColor (0f, 0, 0, 1); // cont.SetRGBFillColor (1f, 0, 0, 1); // path.AddLines (new PointF[] { p1, p2, p4 }); // path.CloseSubpath (); // // cont.AddPath (path); // cont.DrawPath (CGPathDrawingMode.FillStroke); // // } // // using (CGPath path = new CGPath()) { // // cont.SetRGBStrokeColor (0f, 0, 0, 1); // cont.SetRGBFillColor (.5f, 0, 0, 1); // path.AddLines (new PointF[] { p1, p3, p4 }); // path.CloseSubpath (); // // cont.AddPath (path); // cont.DrawPath (CGPathDrawingMode.FillStroke); // // } // // return UIGraphics.GetImageFromCurrentImageContext (); // // } // // UIGraphics.EndImageContext (); return b; }
/// <summary> /// Draws image of arrow with given direction. /// </summary> /// <returns>Bitmap of arrow.</returns> /// <param name="direction">Direction of the arrow.</param> internal Bitmap DrawArrow (double direction) { int w = 48; int h = 48; int w2 = w / 2; int h2 = w / 2; double rad1 = direction / 180.0 * Math.PI; double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI; double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; double rad4 = (direction + 180.0) / 180.0 * Math.PI; PointF p1 = new PointF((float) (w2 + w2 * Math.Sin (rad1)), (float) (h2 + h2 * Math.Cos (rad1))); PointF p2 = new PointF((float) (w2 + w2 * Math.Sin (rad2)), (float) (h2 + h2 * Math.Cos (rad2))); PointF p3 = new PointF((float) (w2 + w2 * Math.Sin (rad3)), (float) (h2 + h2 * Math.Cos (rad3))); PointF p4 = new PointF((float) (w2 + w / 3 * Math.Sin (rad4)), (float) (h2 + h / 3 * Math.Cos (rad4))); Bitmap b = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888); using(Canvas c = new Canvas(b)) { int cx = c.Width / 2 - 1; int cy = c.Height / 2 - 1; global::Android.Graphics.Path path1 = new global::Android.Graphics.Path (); global::Android.Graphics.Path path2 = new global::Android.Graphics.Path (); global::Android.Graphics.Path path3 = new global::Android.Graphics.Path (); path1.MoveTo (p1.X,p1.Y); path1.LineTo (p2.X,p2.Y); path1.LineTo (p4.X,p4.Y); path1.LineTo (p1.X,p1.Y); path2.MoveTo (p1.X,p1.Y); path2.LineTo (p3.X,p3.Y); path2.LineTo (p4.X,p4.Y); path2.LineTo (p1.X,p1.Y); path3.MoveTo (p1.X,p1.Y); path3.LineTo (p2.X,p2.Y); path3.LineTo (p4.X,p4.Y); path3.LineTo (p1.X,p1.Y); path3.LineTo (p3.X,p3.Y); path3.LineTo (p4.X,p4.Y); c.DrawPath (path1, light); c.DrawPath (path2, dark); c.DrawPath (path3, black); } return b; }