func drawContour(r *raster.Rasterizer, ps []truetype.Point, dx, dy raster.Fix32) { if len(ps) == 0 { return } // ps[0] is a truetype.Point measured in FUnits and positive Y going upwards. // start is the same thing measured in fixed point units and positive Y // going downwards, and offset by (dx, dy) start := raster.Point{ X: dx + raster.Fix32(ps[0].X<<2), Y: dy - raster.Fix32(ps[0].Y<<2), } r.Start(start) q0, on0 := start, true for _, p := range ps[1:] { q := raster.Point{ X: dx + raster.Fix32(p.X<<2), Y: dy - raster.Fix32(p.Y<<2), } on := p.Flags&0x01 != 0 if on { if on0 { r.Add1(q) } else { r.Add2(q0, q) } } else { if on0 { // No-op. } else { mid := raster.Point{ X: (q0.X + q.X) / 2, Y: (q0.Y + q.Y) / 2, } r.Add2(q0, mid) } } q0, on0 = q, on } // Close the curve. if on0 { r.Add1(start) } else { r.Add2(q0, start) } }
func contour(r *raster.Rasterizer, ns []node) { if len(ns) == 0 { return } i := 0 r.Start(p(ns[i])) for { switch ns[i].degree { case -1: // -1 signifies end-of-contour. return case 1: i += 1 r.Add1(p(ns[i])) case 2: i += 2 r.Add2(p(ns[i-1]), p(ns[i])) default: panic("bad degree") } } }