// enumerate returns all glyphs with a valid index. func enumerate(f *truetype.Font, fc font.Face) []*glyph { var gs []*glyph for r := rune(1); r < (1<<16)-1; r++ { if r == '\uFEFF' { continue // ignore BOM } if f.Index(r) != 0 { b, a, _ := fc.GlyphBounds(r) gs = append(gs, &glyph{r: r, b: b, a: a}) } } return gs }
// https://code.google.com/p/plotinum/source/browse/vg/font.go#160 func widthOfString(font *truetype.Font, size float64, s string) float64 { // scale converts truetype.FUnit to float64 scale := size / float64(font.FUnitsPerEm()) width := 0 prev, hasPrev := truetype.Index(0), false for _, rune := range s { index := font.Index(rune) if hasPrev { width += int(font.Kern(fixed.Int26_6(font.FUnitsPerEm()), prev, index)) } width += int(font.HMetric(fixed.Int26_6(font.FUnitsPerEm()), index).AdvanceWidth) prev, hasPrev = index, true } return float64(width) * scale }
func loadRanges(f *truetype.Font) (ret [][2]rune) { rr := [2]rune{-1, -1} for r := rune(0); r <= unicode.MaxRune; r++ { if privateUseArea(r) { continue } if f.Index(r) == 0 { continue } if rr[1] == r { rr[1] = r + 1 continue } if rr[0] != -1 { ret = append(ret, rr) } rr = [2]rune{r, r + 1} } if rr[0] != -1 { ret = append(ret, rr) } return ret }