mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
15031d0b52
In the general case, it isn't possible for us to efficiently find system fonts that are monospace. Fonts don't advertise being monospace frequently, so the only way to reliably detect it is to check that all glyphs are the same width. This is expensive, far too much so to be done on every system font when there may be thousands of them. Other font resolution systems rely upon the user requesting fonts by their family name. If you want a monospace font, ask for it by name or use a generic name like 'monospace'. This will be Gio's approach from here on out. Existing code relying upon setting Variant="Mono" should instead set Typeface="Go Mono" (for the Go font) or specify another monospace typeface. The generic face "monospace" will search for one of a set of known monospace fonts that may be available on the system. Similarly, smallcaps isn't well advertised and users should rely on requesting all-smallcaps fonts by typeface. To get the Go smallcaps font, use Typeface="Go Smallcaps". Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
// Package gofont exports the Go fonts as a text.Collection.
|
|
//
|
|
// See https://blog.golang.org/go-fonts for a description of the
|
|
// fonts, and the golang.org/x/image/font/gofont packages for the
|
|
// font data.
|
|
package gofont
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"golang.org/x/image/font/gofont/gobold"
|
|
"golang.org/x/image/font/gofont/gobolditalic"
|
|
"golang.org/x/image/font/gofont/goitalic"
|
|
"golang.org/x/image/font/gofont/gomedium"
|
|
"golang.org/x/image/font/gofont/gomediumitalic"
|
|
"golang.org/x/image/font/gofont/gomono"
|
|
"golang.org/x/image/font/gofont/gomonobold"
|
|
"golang.org/x/image/font/gofont/gomonobolditalic"
|
|
"golang.org/x/image/font/gofont/gomonoitalic"
|
|
"golang.org/x/image/font/gofont/goregular"
|
|
"golang.org/x/image/font/gofont/gosmallcaps"
|
|
"golang.org/x/image/font/gofont/gosmallcapsitalic"
|
|
|
|
"gioui.org/font"
|
|
"gioui.org/font/opentype"
|
|
)
|
|
|
|
var (
|
|
regOnce sync.Once
|
|
reg []font.FontFace
|
|
once sync.Once
|
|
collection []font.FontFace
|
|
)
|
|
|
|
func loadRegular() {
|
|
regOnce.Do(func() {
|
|
faces, err := opentype.ParseCollection(goregular.TTF)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to parse font: %v", err))
|
|
}
|
|
reg = faces
|
|
collection = append(collection, reg[0])
|
|
})
|
|
}
|
|
|
|
// Regular returns a collection of only the Go regular font face.
|
|
func Regular() []font.FontFace {
|
|
loadRegular()
|
|
return reg
|
|
}
|
|
|
|
// Regular returns a collection of all available Go font faces.
|
|
func Collection() []font.FontFace {
|
|
loadRegular()
|
|
once.Do(func() {
|
|
register(goitalic.TTF)
|
|
register(gobold.TTF)
|
|
register(gobolditalic.TTF)
|
|
register(gomedium.TTF)
|
|
register(gomediumitalic.TTF)
|
|
register(gomono.TTF)
|
|
register(gomonobold.TTF)
|
|
register(gomonobolditalic.TTF)
|
|
register(gomonoitalic.TTF)
|
|
register(gosmallcaps.TTF)
|
|
register(gosmallcapsitalic.TTF)
|
|
// Ensure that any outside appends will not reuse the backing store.
|
|
n := len(collection)
|
|
collection = collection[:n:n]
|
|
})
|
|
return collection
|
|
}
|
|
|
|
func register(ttf []byte) {
|
|
faces, err := opentype.ParseCollection(ttf)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to parse font: %v", err))
|
|
}
|
|
collection = append(collection, faces[0])
|
|
}
|