freetype: fix drawContour when the first point is off the curve.
Fixes issue 16. LGTM=crawshaw R=crawshaw CC=golang-codereviews, philipz https://codereview.appspot.com/209280043
This commit is contained in:
parent
78edcde0f3
commit
160e1d6137
|
@ -94,16 +94,43 @@ func (c *Context) drawContour(ps []truetype.Point, dx, dy raster.Fix32) {
|
||||||
if len(ps) == 0 {
|
if len(ps) == 0 {
|
||||||
return
|
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
|
// The low bit of each point's Flags value is whether the point is on the
|
||||||
// going downwards, and offset by (dx, dy)
|
// curve. Truetype fonts only have quadratic Bézier curves, not cubics.
|
||||||
|
// Thus, two consecutive off-curve points imply an on-curve point in the
|
||||||
|
// middle of those two.
|
||||||
|
//
|
||||||
|
// See http://chanae.walon.org/pub/ttf/ttf_glyphs.htm for more details.
|
||||||
|
|
||||||
|
// 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{
|
start := raster.Point{
|
||||||
X: dx + raster.Fix32(ps[0].X<<2),
|
X: dx + raster.Fix32(ps[0].X<<2),
|
||||||
Y: dy - raster.Fix32(ps[0].Y<<2),
|
Y: dy - raster.Fix32(ps[0].Y<<2),
|
||||||
}
|
}
|
||||||
|
others := []truetype.Point(nil)
|
||||||
|
if ps[0].Flags&0x01 != 0 {
|
||||||
|
others = ps[1:]
|
||||||
|
} else {
|
||||||
|
last := raster.Point{
|
||||||
|
X: dx + raster.Fix32(ps[len(ps)-1].X<<2),
|
||||||
|
Y: dy - raster.Fix32(ps[len(ps)-1].Y<<2),
|
||||||
|
}
|
||||||
|
if ps[len(ps)-1].Flags&0x01 != 0 {
|
||||||
|
start = last
|
||||||
|
others = ps[:len(ps)-1]
|
||||||
|
} else {
|
||||||
|
start = raster.Point{
|
||||||
|
X: (start.X + last.X) / 2,
|
||||||
|
Y: (start.Y + last.Y) / 2,
|
||||||
|
}
|
||||||
|
others = ps
|
||||||
|
}
|
||||||
|
}
|
||||||
c.r.Start(start)
|
c.r.Start(start)
|
||||||
q0, on0 := start, true
|
q0, on0 := start, true
|
||||||
for _, p := range ps[1:] {
|
for _, p := range others {
|
||||||
q := raster.Point{
|
q := raster.Point{
|
||||||
X: dx + raster.Fix32(p.X<<2),
|
X: dx + raster.Fix32(p.X<<2),
|
||||||
Y: dy - raster.Fix32(p.Y<<2),
|
Y: dy - raster.Fix32(p.Y<<2),
|
||||||
|
|
Loading…
Reference in New Issue