diff --git a/text/gotext.go b/text/gotext.go index 6b91eca7..2d37a96d 100644 --- a/text/gotext.go +++ b/text/gotext.go @@ -530,6 +530,7 @@ func (s *shaperImpl) LayoutRunes(params Parameters, txt []rune) document { } truncatedNewline := false if hasNewline && len(txt) == 0 { + params.forceTruncate = false // If we only have a newline, shape a space to get line metrics. ls, truncated = s.shapeAndWrapText(params, []rune{' '}) if truncated > 0 { diff --git a/text/shaper_test.go b/text/shaper_test.go index 87f7dd71..b2d894f7 100644 --- a/text/shaper_test.go +++ b/text/shaper_test.go @@ -163,6 +163,8 @@ func TestShapingNewlineHandling(t *testing.T) { {textInput: "a\nb", expectedLines: 2, expectedGlyphs: 3}, {textInput: "", expectedLines: 1, expectedGlyphs: 1}, {textInput: "\n", expectedLines: 1, expectedGlyphs: 2}, + {textInput: "\n\n", expectedLines: 2, expectedGlyphs: 3}, + {textInput: "\n\n\n", expectedLines: 3, expectedGlyphs: 4}, } { t.Run(fmt.Sprintf("%q", tc.textInput), func(t *testing.T) { ltrFace, _ := opentype.Parse(goregular.TTF) @@ -497,6 +499,32 @@ func TestShapeStringRuneAccounting(t *testing.T) { MaxWidth: 0, }, }, + { + name: "double newline regression", + input: "\n\n", + params: Parameters{ + Font: font.Font{Typeface: "Go", Style: font.Regular, Weight: font.Normal}, + Alignment: Start, + PxPerEm: 768, + MaxLines: 1, + Truncator: "\u200b", + WrapPolicy: WrapHeuristically, + MaxWidth: 1000, + }, + }, + { + name: "triple newline regression", + input: "\n\n\n", + params: Parameters{ + Font: font.Font{Typeface: "Go", Style: font.Regular, Weight: font.Normal}, + Alignment: Start, + PxPerEm: 768, + MaxLines: 1, + Truncator: "\u200b", + WrapPolicy: WrapHeuristically, + MaxWidth: 1000, + }, + }, } { t.Run(tc.name, func(t *testing.T) { for _, setup := range []setup{