Files
gio-patched/text/text.go
T
Elias Naur 16d2a3ac0a text: remove String, Layout and add Glyph
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>
2020-01-13 19:54:11 +01:00

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")
}
}