font/gofont: add font collection using the new shaper

This commit adds a font collection that uses the new
text shaper so that constructing material.Themes atop
it is equally simple to using the old shaper.

You can use material.NewTheme(gofont.CollectionHB()) with
this commit applied.

References: https://todo.sr.ht/~eliasnaur/gio/146
Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
Chris Waldon
2022-03-16 16:01:35 -04:00
committed by Elias Naur
parent 1e5a3696f5
commit 938179d293
+34 -2
View File
@@ -29,8 +29,10 @@ import (
)
var (
once sync.Once
collection []text.FontFace
once sync.Once
collection []text.FontFace
onceHB sync.Once
collectionHB []text.FontFace
)
func Collection() []text.FontFace {
@@ -54,6 +56,36 @@ func Collection() []text.FontFace {
return collection
}
func CollectionHB() []text.FontFace {
onceHB.Do(func() {
registerHB(text.Font{}, goregular.TTF)
registerHB(text.Font{Style: text.Italic}, goitalic.TTF)
registerHB(text.Font{Weight: text.Bold}, gobold.TTF)
registerHB(text.Font{Style: text.Italic, Weight: text.Bold}, gobolditalic.TTF)
registerHB(text.Font{Weight: text.Medium}, gomedium.TTF)
registerHB(text.Font{Weight: text.Medium, Style: text.Italic}, gomediumitalic.TTF)
registerHB(text.Font{Variant: "Mono"}, gomono.TTF)
registerHB(text.Font{Variant: "Mono", Weight: text.Bold}, gomonobold.TTF)
registerHB(text.Font{Variant: "Mono", Weight: text.Bold, Style: text.Italic}, gomonobolditalic.TTF)
registerHB(text.Font{Variant: "Mono", Style: text.Italic}, gomonoitalic.TTF)
registerHB(text.Font{Variant: "Smallcaps"}, gosmallcaps.TTF)
registerHB(text.Font{Variant: "Smallcaps", Style: text.Italic}, gosmallcapsitalic.TTF)
// Ensure that any outside appends will not reuse the backing store.
n := len(collectionHB)
collectionHB = collectionHB[:n:n]
})
return collectionHB
}
func registerHB(fnt text.Font, ttf []byte) {
face, err := opentype.ParseHarfbuzz(ttf)
if err != nil {
panic(fmt.Errorf("failed to parse font: %v", err))
}
fnt.Typeface = "Go"
collectionHB = append(collectionHB, text.FontFace{Font: fnt, Face: face})
}
func register(fnt text.Font, ttf []byte) {
face, err := opentype.Parse(ttf)
if err != nil {