38 lines
691 B
Go
38 lines
691 B
Go
package typeset
|
|
|
|
import "golang.org/x/image/font"
|
|
import "golang.org/x/image/math/fixed"
|
|
|
|
func recommendHeight (tokens []token, face font.Face, width fixed.Int26_6) fixed.Int26_6 {
|
|
metrics := face.Metrics()
|
|
var dot fixed.Point26_6
|
|
|
|
newline := func () {
|
|
dot.Y += metrics.Height
|
|
dot.X = 0
|
|
}
|
|
|
|
sawLineBreak := false
|
|
for _, token := range tokens {
|
|
// demarcate lines
|
|
if sawLineBreak {
|
|
newline()
|
|
sawLineBreak = false
|
|
}
|
|
if token.kind == tokenKindLineBreak {
|
|
sawLineBreak = true
|
|
} else {
|
|
needWrap :=
|
|
token.kind == tokenKindWord &&
|
|
dot.X + token.width > width
|
|
if needWrap {
|
|
newline()
|
|
}
|
|
dot.X += token.width
|
|
}
|
|
}
|
|
newline()
|
|
|
|
return dot.Y
|
|
}
|