fixed a bug when text was rendered starting left of the window

This commit is contained in:
Thomas Friedel 2018-10-04 19:09:24 +02:00
parent b73d093683
commit c71711e498

14
text.go
View file

@ -78,6 +78,7 @@ func (cv *Canvas) FillText(str string, x, y float64) {
curX := x curX := x
var p fixed.Point26_6 var p fixed.Point26_6
prev, hasPrev := truetype.Index(0), false
strFrom, strTo := 0, len(str) strFrom, strTo := 0, len(str)
curInside := false curInside := false
@ -93,6 +94,13 @@ func (cv *Canvas) FillText(str string, x, y float64) {
if err != nil { if err != nil {
continue continue
} }
if hasPrev {
kern := fnt.Kern(frc.scale, prev, idx)
if frc.hinting != font.HintingNone {
kern = (kern + 32) &^ 63
}
curX += float64(kern) / 64
}
p0 := cv.tf(vec{float64(bounds.Min.X) + curX, float64(bounds.Min.Y) + y}) p0 := cv.tf(vec{float64(bounds.Min.X) + curX, float64(bounds.Min.Y) + y})
p1 := cv.tf(vec{float64(bounds.Min.X) + curX, float64(bounds.Max.Y) + y}) p1 := cv.tf(vec{float64(bounds.Min.X) + curX, float64(bounds.Max.Y) + y})
@ -106,6 +114,7 @@ func (cv *Canvas) FillText(str string, x, y float64) {
if !curInside && inside { if !curInside && inside {
curInside = true curInside = true
strFrom = i strFrom = i
x = curX
} else if curInside && !inside { } else if curInside && !inside {
strTo = i strTo = i
break break
@ -121,6 +130,7 @@ func (cv *Canvas) FillText(str string, x, y float64) {
strMaxY = bounds.Max.Y strMaxY = bounds.Max.Y
} }
p.X += advance p.X += advance
curX += float64(advance) / 64
} }
strWidth = p.X.Ceil() - textOffset.X strWidth = p.X.Ceil() - textOffset.X
strHeight := strMaxY - textOffset.Y strHeight := strMaxY - textOffset.Y
@ -153,7 +163,7 @@ func (cv *Canvas) FillText(str string, x, y float64) {
} }
} }
prev, hasPrev := truetype.Index(0), false prev, hasPrev = truetype.Index(0), false
for _, rn := range str[strFrom:strTo] { for _, rn := range str[strFrom:strTo] {
idx := fnt.Index(rn) idx := fnt.Index(rn)
if idx == 0 { if idx == 0 {
@ -395,7 +405,7 @@ func (cv *Canvas) MeasureText(str string) TextMetrics {
} }
return TextMetrics{ return TextMetrics{
Width: x, Width: x,
ActualBoundingBoxAscent: -minY, ActualBoundingBoxAscent: -minY,
ActualBoundingBoxDescent: +maxY, ActualBoundingBoxDescent: +maxY,
} }