diff --git a/font/opentype/opentype.go b/font/opentype/opentype.go index c509c8d3..b87becc9 100644 --- a/font/opentype/opentype.go +++ b/font/opentype/opentype.go @@ -176,9 +176,10 @@ func layoutText(sbuf *sfnt.Buffer, ppem fixed.Int26_6, maxWidth int, fonts []*op } var prev, word state endLine := func() { - if prev.f != nil { - updateBounds(prev.f) + if prev.f == nil && len(fonts) > 0 { + prev.f = fonts[0] } + updateBounds(prev.f) nextLine.Layout = glyphs[:prev.idx:prev.idx] nextLine.Len = prev.len nextLine.Width = prev.x + prev.adv diff --git a/font/opentype/opentype_test.go b/font/opentype/opentype_test.go index 0c73b9d9..bd8da79f 100644 --- a/font/opentype/opentype_test.go +++ b/font/opentype/opentype_test.go @@ -13,6 +13,9 @@ import ( "gioui.org/internal/ops" "gioui.org/op" "gioui.org/text" + "golang.org/x/image/font" + "golang.org/x/image/font/gofont/goregular" + "golang.org/x/image/font/sfnt" "golang.org/x/image/math/fixed" ) @@ -87,6 +90,31 @@ func TestCollectionAsFace(t *testing.T) { } } +func TestEmptyString(t *testing.T) { + face, err := Parse(goregular.TTF) + if err != nil { + t.Fatal(err) + } + + ppem := fixed.I(200) + + lines, err := face.Layout(ppem, 2000, strings.NewReader("")) + if err != nil { + t.Fatal(err) + } + if len(lines) == 0 { + t.Fatalf("Layout returned no lines for empty string; expected 1") + } + l := lines[0] + exp, err := face.font.Bounds(new(sfnt.Buffer), ppem, font.HintingFull) + if err != nil { + t.Fatal(err) + } + if got := l.Bounds; got != exp { + t.Errorf("got bounds %+v for empty string; expected %+v", got, exp) + } +} + func decompressFontFile(name string) (*Font, []byte, error) { f, err := os.Open(name) if err != nil {