forked from joejulian/gio
16d2a3ac0a
In preparation for using Shaper with an io.Reader, rework the API to not refer to strings. In particular, introduce Glyph for holding the rune in addition to the advance. For fast traversing of the underlying text, add Len to Line with the UTF8 length. Layout is a useless wrapper around []Line; remove it while we're here. Signed-off-by: Elias Naur <mail@eliasnaur.com>
100 lines
1.9 KiB
Go
100 lines
1.9 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package text
|
|
|
|
import (
|
|
"gioui.org/op"
|
|
"gioui.org/unit"
|
|
"golang.org/x/image/font"
|
|
"golang.org/x/image/math/fixed"
|
|
)
|
|
|
|
// A Line contains the measurements of a line of text.
|
|
type Line struct {
|
|
Layout []Glyph
|
|
// Len is the length in UTF8 bytes of the line.
|
|
Len int
|
|
// Width is the width of the line.
|
|
Width fixed.Int26_6
|
|
// Ascent is the height above the baseline.
|
|
Ascent fixed.Int26_6
|
|
// Descent is the height below the baseline, including
|
|
// the line gap.
|
|
Descent fixed.Int26_6
|
|
// Bounds is the visible bounds of the line.
|
|
Bounds fixed.Rectangle26_6
|
|
}
|
|
|
|
type Glyph struct {
|
|
Rune rune
|
|
Advance fixed.Int26_6
|
|
}
|
|
|
|
// LayoutOptions specify the constraints of a text layout.
|
|
type LayoutOptions struct {
|
|
// MaxWidth is the available width of the layout.
|
|
MaxWidth int
|
|
}
|
|
|
|
// Style is the font style.
|
|
type Style int
|
|
|
|
// Weight is a font weight, in CSS units.
|
|
type Weight int
|
|
|
|
// Font specify a particular typeface, style and size.
|
|
type Font struct {
|
|
Typeface Typeface
|
|
Variant Variant
|
|
Size unit.Value
|
|
Style Style
|
|
// Weight is the text weight. If zero, Normal is used instead.
|
|
Weight Weight
|
|
}
|
|
|
|
// Face implements text layout and shaping for a particular font.
|
|
type Face interface {
|
|
Layout(ppem fixed.Int26_6, str string, opts LayoutOptions) []Line
|
|
Shape(ppem fixed.Int26_6, str []Glyph) op.CallOp
|
|
Metrics(ppem fixed.Int26_6) font.Metrics
|
|
}
|
|
|
|
// Typeface identifies a particular typeface design. The empty
|
|
// string denotes the default typeface.
|
|
type Typeface string
|
|
|
|
// Variant denotes a typeface variant such as "Mono" or "Smallcaps".
|
|
type Variant string
|
|
|
|
type Alignment uint8
|
|
|
|
const (
|
|
Start Alignment = iota
|
|
End
|
|
Middle
|
|
)
|
|
|
|
const (
|
|
Regular Style = iota
|
|
Italic
|
|
)
|
|
|
|
const (
|
|
Normal Weight = 400
|
|
Medium Weight = 500
|
|
Bold Weight = 600
|
|
)
|
|
|
|
func (a Alignment) String() string {
|
|
switch a {
|
|
case Start:
|
|
return "Start"
|
|
case End:
|
|
return "End"
|
|
case Middle:
|
|
return "Middle"
|
|
default:
|
|
panic("unreachable")
|
|
}
|
|
}
|