package typeset

import "golang.org/x/image/font"
import "golang.org/x/image/math/fixed"

func measure (tokens []token, face font.Face) {
	var lastRune rune
	for index, token := range tokens {
		var x fixed.Int26_6
		for index, runl := range token.runes {
			advance, ok := face.GlyphAdvance(runl.run)
			if !ok { advance = tofuAdvance(face) }
			advance += face.Kern(lastRune, runl.run)
			
			runl.x = x
			x += advance
			lastRune = runl.run
			token.runes[index] = runl
		}
		token.width = x
		tokens[index] = token
	}
}

const tofuStandinRune     = 'M'
const fallbackTofuAdvance = 16
const fallbackTofuWidth   = 14
const fallbackTofuAscend  = 16

func tofuAdvance (face font.Face) fixed.Int26_6 {
	if advance, ok := face.GlyphAdvance(tofuStandinRune); ok {
		return advance
	} else {
		return fallbackTofuAdvance
	}
}

func tofuBounds (face font.Face) (fixed.Rectangle26_6, fixed.Int26_6) {
	if bounds, advance, ok := face.GlyphBounds(tofuStandinRune); ok {
		return bounds, advance
	} else {
		return fixed.R(0, -fallbackTofuAscend, fallbackTofuWidth, 0),
			fallbackTofuAdvance
	}
}