font/opentype: [API] support font collection loading

This commit adds back support for loading font collections, which we
lost when switching to the harfbuzz-based shaper last January. In
addition, this commit takes advantage of our new font loading library's
metadata facilities to automatically construct text.FontFaces for all
fonts within a collection. This is significantly more ergonomic for
users, and can be used to load single fonts with automatic metadata
detection as well.

I've exposed a opentype.Face.Font() method that can be used to get the
font metadata for a given face as well, though you have to type assert to
see it:

var myFace text.Face
if asOpentype, ok := myFace.(opentype.Face); ok {
    myFont := asOpentype.Font()
}

The one problem with this approach is that the font variant field always
be automatically populated. Mono font detection is supported, but
other variants like SmallCaps are more complicated and may need to be
expressed differently in the future (smallcaps is a feature that any font
file can have, not necessarily a separate font file). See this [0] upstream
issue for details.

Additionally, in order to avoid import cycles, I've moved the declarations
of font attributes to package font. You can fix your code automatically to
refer to the new definitions by running the following:

    gofmt -w -r 'text.FontFace -> font.FontFace' .
    gofmt -w -r 'text.Variant -> font.Variant' .
    gofmt -w -r 'text.Style -> font.Style' .
    gofmt -w -r 'text.Typeface -> font.Typeface' .
    gofmt -w -r 'text.Font -> font.Font' .
    gofmt -w -r 'text.Regular -> font.Regular' .
    gofmt -w -r 'text.Italic -> font.Italic' .
    gofmt -w -r 'text.Thin -> font.Thin' .
    gofmt -w -r 'text.ExtraLight -> font.ExtraLight' .
    gofmt -w -r 'text.Light -> font.Light' .
    gofmt -w -r 'text.Normal -> font.Normal' .
    gofmt -w -r 'text.Medium -> font.Medium' .
    gofmt -w -r 'text.SemiBold -> font.SemiBold' .
    gofmt -w -r 'text.Bold -> font.Bold' .
    gofmt -w -r 'text.ExtraBold -> font.ExtraBold' .
    gofmt -w -r 'text.Black -> font.Black' .
    gofmt -w -r 'text.Hairline -> font.Thin' .
    gofmt -w -r 'text.UltraLight -> font.ExtraLight' .
    gofmt -w -r 'text.DemiBold -> font.SemiBold' .
    gofmt -w -r 'text.UltraBold -> font.ExtraBold' .
    gofmt -w -r 'text.Heavy -> font.Black' .
    gofmt -w -r 'text.ExtraBlack -> font.Black+50' .
    gofmt -w -r 'text.UltraBlack -> font.ExtraBlack' .

Make sure each affected file imports gioui.org/font.

[0] https://github.com/go-text/typesetting/issues/57

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
Chris Waldon
2023-04-07 13:24:51 -04:00
committed by Elias Naur
parent cda73efa6a
commit f77bf9a42c
25 changed files with 366 additions and 241 deletions
+2 -1
View File
@@ -7,6 +7,7 @@ import (
"image/color"
"math"
"gioui.org/font"
"gioui.org/internal/f32color"
"gioui.org/io/semantic"
"gioui.org/layout"
@@ -22,7 +23,7 @@ type ButtonStyle struct {
Text string
// Color is the text color.
Color color.NRGBA
Font text.Font
Font font.Font
TextSize unit.Sp
Background color.NRGBA
CornerRadius unit.Dp
+2 -1
View File
@@ -6,6 +6,7 @@ import (
"image"
"image/color"
"gioui.org/font"
"gioui.org/internal/f32color"
"gioui.org/layout"
"gioui.org/op"
@@ -19,7 +20,7 @@ import (
type checkable struct {
Label string
Color color.NRGBA
Font text.Font
Font font.Font
TextSize unit.Sp
IconColor color.NRGBA
Size unit.Dp
+2 -1
View File
@@ -5,6 +5,7 @@ package material
import (
"image/color"
"gioui.org/font"
"gioui.org/internal/f32color"
"gioui.org/layout"
"gioui.org/op"
@@ -15,7 +16,7 @@ import (
)
type EditorStyle struct {
Font text.Font
Font font.Font
TextSize unit.Sp
// Color is the text color.
Color color.NRGBA
+6 -5
View File
@@ -5,6 +5,7 @@ package material
import (
"image/color"
"gioui.org/font"
"gioui.org/internal/f32color"
"gioui.org/layout"
"gioui.org/op"
@@ -19,7 +20,7 @@ import (
// the label will be non-interactive.
type LabelStyle struct {
// Face defines the text style.
Font text.Font
Font font.Font
// Color is the text color.
Color color.NRGBA
// SelectionColor is the color of the background for selected text.
@@ -47,13 +48,13 @@ type LabelStyle struct {
func H1(th *Theme, txt string) LabelStyle {
label := Label(th, th.TextSize*96.0/16.0, txt)
label.Font.Weight = text.Light
label.Font.Weight = font.Light
return label
}
func H2(th *Theme, txt string) LabelStyle {
label := Label(th, th.TextSize*60.0/16.0, txt)
label.Font.Weight = text.Light
label.Font.Weight = font.Light
return label
}
@@ -71,7 +72,7 @@ func H5(th *Theme, txt string) LabelStyle {
func H6(th *Theme, txt string) LabelStyle {
label := Label(th, th.TextSize*20.0/16.0, txt)
label.Font.Weight = text.Medium
label.Font.Weight = font.Medium
return label
}
@@ -81,7 +82,7 @@ func Subtitle1(th *Theme, txt string) LabelStyle {
func Subtitle2(th *Theme, txt string) LabelStyle {
label := Label(th, th.TextSize*14.0/16.0, txt)
label.Font.Weight = text.Medium
label.Font.Weight = font.Medium
return label
}
+2 -1
View File
@@ -7,6 +7,7 @@ import (
"golang.org/x/exp/shiny/materialdesign/icons"
"gioui.org/font"
"gioui.org/text"
"gioui.org/unit"
"gioui.org/widget"
@@ -46,7 +47,7 @@ type Theme struct {
FingerSize unit.Dp
}
func NewTheme(fontCollection []text.FontFace) *Theme {
func NewTheme(fontCollection []font.FontFace) *Theme {
t := &Theme{
Shaper: text.NewShaper(fontCollection),
}