void HatchSolidDiamond(CGContext context) { var hatchWidth = getHatchWidth (hatchStyle); var hatchHeight = getHatchHeight (hatchStyle); var lineWidth = getLineWidth (hatchStyle); initializeContext(context, hatchHeight, false); /* draw background */ drawBackground (context, backColor, hatchWidth, hatchHeight); /* draw lines in the foreground color */ context.SetFillColor(foreColor.ToCGColor()); context.SetStrokeColor(foreColor.ToCGColor()); context.SetLineWidth(lineWidth); context.SetLineCap(CGLineCap.Square); float halfMe = hatchWidth / 2.0f; // We will paint two triangles from corners meeting in the middle // make sure to offset by half pixels so that the point is actually a point. context.MoveTo(-HALF_PIXEL_X,HALF_PIXEL_Y); context.AddLineToPoint(2+HALF_PIXEL_X, halfMe - HALF_PIXEL_Y); context.AddLineToPoint(-HALF_PIXEL_X, hatchHeight- (1.0f + HALF_PIXEL_Y)); context.ClosePath(); context.FillPath(); // now we do the right one context.MoveTo(hatchWidth,HALF_PIXEL_Y); context.AddLineToPoint(halfMe+HALF_PIXEL_X, halfMe - HALF_PIXEL_Y); context.AddLineToPoint(hatchWidth, hatchHeight - (1.0f + HALF_PIXEL_Y)); context.ClosePath(); context.FillPath(); }
public static void DrawLine(CGContext context, List<PointF> points, CGColor color, float lineWidth, bool closePath, bool dashed) { if (points == null) throw new NullReferenceException(); if (points.Count == 0) throw new ArgumentException("The line must have at least one point."); context.SaveState(); context.SetStrokeColor(color); context.SetLineWidth(lineWidth); context.MoveTo(points[0].X, points[0].Y); for(int a = 1; a < points.Count; a++) context.AddLineToPoint(points[a].X, points[a].Y); if (dashed) context.SetLineDash(0, new float[2] { 1, 2 }, 2); if (closePath) context.ClosePath(); context.StrokePath(); context.RestoreState(); }
static void make_arcs(CGContext graphics, float x, float y, float width, float height, float startAngle, float sweepAngle, bool convert_units, bool antialiasing, bool isPieSlice) { int i; float drawn = 0; float endAngle; bool enough = false; // I do not think we need to convert the units so commented this out. /* if required deal, once and for all, with unit conversions */ //if (convert_units && !OPTIMIZE_CONVERSION(graphics)) //{ // x = gdip_unitx_convgr(graphics, x); // y = gdip_unity_convgr(graphics, y); // width = gdip_unitx_convgr(graphics, width); // height = gdip_unity_convgr(graphics, height); //} if (Math.Abs(sweepAngle) >= 360) { graphics.AddEllipseInRect(new RectangleF(x,y,width,height)); return; } endAngle = startAngle + sweepAngle; /* if we end before the start then reverse positions (to keep increment positive) */ if (endAngle < startAngle) { var temp = endAngle; endAngle = startAngle; startAngle = temp; } if (isPieSlice) { graphics.MoveTo(x + (width / 2), y + (height / 2)); } /* i is the number of sub-arcs drawn, each sub-arc can be at most 90 degrees.*/ /* there can be no more then 4 subarcs, ie. 90 + 90 + 90 + (something less than 90) */ for (i = 0; i < 4; i++) { float current = startAngle + drawn; float additional; if (enough) { if (isPieSlice) { graphics.ClosePath(); } return; } additional = endAngle - current; /* otherwise, add the remainder */ if (additional > 90) { additional = 90.0f; } else { /* a near zero value will introduce bad artefact in the drawing (#78999) */ if (( additional >= -0.0001f) && (additional <= 0.0001f)) return; enough = true; } make_arc(graphics, (i == 0), /* only move to the starting pt in the 1st iteration */ x, y, width, height, /* bounding rectangle */ current, current + additional, antialiasing, isPieSlice); drawn += additional; } if (isPieSlice) { graphics.ClosePath(); } }