// Rectangle draws a rectangle using a path between (x1,y1) and (x2,y2) func Rectangle(path draw2d.PathBuilder, x1, y1, x2, y2 float64) { path.MoveTo(x1, y1) path.LineTo(x2, y1) path.LineTo(x2, y2) path.LineTo(x1, y2) path.Close() }
func rLineTo(path draw2d.PathBuilder, x, y float64) { x0, y0 := path.LastPoint() path.LineTo(x0+x, y0+y) }
// Circle draws a circle using a path with center (cx,cy) and radius func Circle(path draw2d.PathBuilder, cx, cy, radius float64) { path.ArcTo(cx, cy, radius, radius, 0, -math.Pi*2) path.Close() }
// Ellipse draws an ellipse using a path with center (cx,cy) and radius (rx,ry) func Ellipse(path draw2d.PathBuilder, cx, cy, rx, ry float64) { path.ArcTo(cx, cy, rx, ry, 0, -math.Pi*2) path.Close() }
// RoundedRectangle draws a rectangle using a path between (x1,y1) and (x2,y2) func RoundedRectangle(path draw2d.PathBuilder, x1, y1, x2, y2, arcWidth, arcHeight float64) { arcWidth = arcWidth / 2 arcHeight = arcHeight / 2 path.MoveTo(x1, y1+arcHeight) path.QuadCurveTo(x1, y1, x1+arcWidth, y1) path.LineTo(x2-arcWidth, y1) path.QuadCurveTo(x2, y1, x2, y1+arcHeight) path.LineTo(x2, y2-arcHeight) path.QuadCurveTo(x2, y2, x2-arcWidth, y2) path.LineTo(x1+arcWidth, y2) path.QuadCurveTo(x1, y2, x1, y2-arcHeight) path.Close() }
func rCubicCurveTo(path draw2d.PathBuilder, dcx1, dcy1, dcx2, dcy2, dx, dy float64) { x, y := path.LastPoint() path.CubicCurveTo(x+dcx1, y+dcy1, x+dcx2, y+dcy2, x+dx, y+dy) }
func rQuadCurveTo(path draw2d.PathBuilder, dcx, dcy, dx, dy float64) { x, y := path.LastPoint() path.QuadCurveTo(x+dcx, y+dcy, x+dx, y+dy) }
// DrawContour draws the given closed contour at the given sub-pixel offset. func DrawContour(path draw2d.PathBuilder, ps []truetype.Point, dx, dy float64) { if len(ps) == 0 { return } startX, startY := pointToF64Point(ps[0]) path.MoveTo(startX+dx, startY+dy) q0X, q0Y, on0 := startX, startY, true for _, p := range ps[1:] { qX, qY := pointToF64Point(p) on := p.Flags&0x01 != 0 if on { if on0 { path.LineTo(qX+dx, qY+dy) } else { path.QuadCurveTo(q0X+dx, q0Y+dy, qX+dx, qY+dy) } } else { if on0 { // No-op. } else { midX := (q0X + qX) / 2 midY := (q0Y + qY) / 2 path.QuadCurveTo(q0X+dx, q0Y+dy, midX+dx, midY+dy) } } q0X, q0Y, on0 = qX, qY, on } // Close the curve. if on0 { path.LineTo(startX+dx, startY+dy) } else { path.QuadCurveTo(q0X+dx, q0Y+dy, startX+dx, startY+dy) } }