Documentation
¶
Index ¶
- Constants
- func DefaultFontDirectories(logger Logger) ([]string, error)
- type FontMap
- func (fm *FontMap) AddFace(face font.Face, location Location, md meta.Description)
- func (fm *FontMap) AddFont(fontFile font.Resource, fileID, familyName string) error
- func (fm *FontMap) FindSystemFont(family string) (Location, bool)
- func (fm *FontMap) FindSystemFonts(family string) []Location
- func (fm *FontMap) FontLocation(ft font.Font) Location
- func (fm *FontMap) FontMetadata(ft font.Font) (family string, aspect meta.Aspect)
- func (fm *FontMap) ResolveFace(r rune) (face font.Face)
- func (fm *FontMap) ResolveFaceForLang(lang LangID) font.Face
- func (fm *FontMap) SetQuery(query Query)
- func (fm *FontMap) SetRuneCacheSize(size int)
- func (fm *FontMap) UseSystemFonts(cacheDir string) error
- type LangID
- type Location
- type Logger
- type Query
Examples ¶
Constants ¶
const ( Fantasy = "fantasy" Math = "math" Emoji = "emoji" Serif = "serif" SansSerif = "sans-serif" Cursive = "cursive" Monospace = "monospace" )
Generic families as defined by https://www.w3.org/TR/css-fonts-4/#generic-font-families
Variables ¶
This section is empty.
Functions ¶
func DefaultFontDirectories ¶
DefaultFontDirectories return the OS-dependent usual directories for fonts, or an error if no one exists. These are the directories used by `FontMap.UseSystemFonts` to locate fonts.
Types ¶
type FontMap ¶
type FontMap struct {
// contains filtered or unexported fields
}
FontMap provides a mechanism to select a [font.Face] from a font description. It supports system and user-provided fonts, and implements the CSS font substitutions rules.
Note that FontMap is NOT safe for concurrent use, but several font maps may coexist in an application.
FontMap is mainly designed to work with an index built by scanning the system fonts : see [UseSystemFonts] for more details.
func NewFontMap ¶
NewFontMap return a new font map, which should be filled with the `UseSystemFonts` or `AddFont` methods. The provided logger will be used to record non-fatal errors encountered during font loading. If logger is nil, log.Default() is used.
func (*FontMap) AddFace ¶
[AddFace] inserts an already-loaded font.Face into the FontMap. The caller is responsible for ensuring that [md] is accurate for the face.
The order of calls to [AddFont] and [AddFace] determines relative priority of manually loaded fonts. See [ResolveFace] for details about when this matters.
Example ¶
// Open an on-disk font file. fontFile, _ := os.Open("myFont.ttf") // error handling omitted defer fontFile.Close() // Load it and its metadata. ld, _ := loader.NewLoader(fontFile) // error handling omitted md := meta.Metadata(ld) f, _ := fontapi.NewFont(ld) // error handling omitted fontMap := NewFontMap(log.Default()) fontMap.AddFace(&fontapi.Face{Font: f}, Location{File: fmt.Sprint(md)}, md) // set the font description fontMap.SetQuery(Query{Families: []string{"Arial", "serif"}}) // regular Aspect // `fontMap` is now ready for text shaping, using the `ResolveFace` method
Output:
func (*FontMap) AddFont ¶
[AddFont] loads the faces contained in [fontFile] and add them to the font map. [fileID] is used as the [Location.File] entry returned by [FontLocation].
If `familyName` is not empty, it is used as the family name for `fontFile` instead of the one found in the font file.
An error is returned if the font resource is not supported.
The order of calls to [AddFont] and [AddFace] determines relative priority of manually loaded fonts. See [ResolveFace] for details about when this matters.
Example ¶
// Open an on-disk font file. Do not close it, as the fontMap will need to parse // it on-demand. If you need to close it, read all of the bytes into a bytes.Reader // first. fontFile, _ := os.Open("myFont.ttf") // error handling omitted fontMap := NewFontMap(log.Default()) fontMap.AddFont(fontFile, "myFont.ttf", "My Font") // error handling omitted // set the font description fontMap.SetQuery(Query{Families: []string{"Arial", "serif"}}) // regular Aspect // `fontMap` is now ready for text shaping, using the `ResolveFace` method
Output:
func (*FontMap) FindSystemFont ¶
FindSystemFont looks for a system font with the given [family], returning the first match, or false is no one is found.
User added fonts are ignored, and the FontMap must have been initialized with [UseSystemFonts] or this method will always return false.
Family names are compared through meta.Normalize.
func (*FontMap) FindSystemFonts ¶
FindSystemFonts is the same as FindSystemFont, but returns all matched fonts.
func (*FontMap) FontLocation ¶
FontLocation returns the origin of the provided font. If the font was not previously returned from this FontMap by a call to ResolveFace, the zero value will be returned instead.
func (*FontMap) FontMetadata ¶
FontMetadata returns a description of the provided font. If the font was not previously returned from this FontMap by a call to ResolveFace, the zero value will be returned instead.
func (*FontMap) ResolveFace ¶
ResolveFace select a font based on the current query (see `SetQuery`), and supporting the given rune, applying CSS font selection rules. The function will return nil if the underlying font database is empty, or if the file system is broken; otherwise the returned [font.Face] is always valid.
If no fonts match the current query for the current rune according to the builtin matching process, the fonts added manually by [AddFont] and [AddFace] will be searched in the order in which they were added for a font with coverage for the provided rune. The first font covering the requested rune will be returned.
If no fonts match after the manual font search, an arbitrary face will be returned.
func (*FontMap) ResolveFaceForLang ¶
ResolveForLang returns the first face supporting the given language (for the actual query), or nil if no one is found.
The matching logic is similar to the one used by [ResolveFace].
func (*FontMap) SetQuery ¶
SetQuery set the families and aspect required, influencing subsequent `ResolveFace` calls.
func (*FontMap) SetRuneCacheSize ¶
SetRuneCacheSize configures the size of the cache powering FontMap.ResolveFace. Applications displaying large quantities of text should tune this value to be greater than the number of unique glyphs they expect to display at one time in order to achieve optimal performance when segmenting text by face rune coverage.
func (*FontMap) UseSystemFonts ¶
UseSystemFonts loads the system fonts and adds them to the font map. This method is safe for concurrent use, but should only be called once per font map. The first call of this method trigger a rather long scan. A per-application on-disk cache is used to speed up subsequent initialisations. Callers can provide an appropriate directory path within which this cache may be stored. If the empty string is provided, the FontMap will attempt to infer a correct, platform-dependent cache path.
NOTE: On Android, callers *must* provide a writable path manually, as it cannot be inferred without access to the Java runtime environment of the application.
Example ¶
fontMap := NewFontMap(log.Default()) fontMap.UseSystemFonts("cachdir") // error handling omitted // set the font description fontMap.SetQuery(Query{Families: []string{"Arial", "serif"}}) // regular Aspect // `fontMap` is now ready for text shaping, using the `ResolveFace` method
Output:
type LangID ¶
type LangID uint16
LangID is a compact representation of a language this package has orthographic knowledge of.
type Logger ¶
type Logger interface {
Printf(format string, args ...interface{})
}
Logger is a type that can log warnings.
type Query ¶
type Query struct { // Families is a list of required families, // the first having the highest priority. // Each of them is tried until a suitable match is found. Families []string // Aspect selects which particular face to use among // the font matching the family criteria. Aspect meta.Aspect }
Query exposes the intention of an author about the font to use to shape and render text.