mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-05 17:35:36 +00:00
text: ensure runereader behaves same as string
This commit fixes a subtle discrepancy in the handling of text input within the shaper. Text provided as an io.RuneReader with a trailing newline would generate an extra (empty) line of text, whereas the same input provided as a string would not. Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
+7
-5
@@ -223,11 +223,13 @@ func (l *Shaper) layoutText(params Parameters, minWidth, maxWidth int, lc system
|
|||||||
}
|
}
|
||||||
done = endByte == len(str)
|
done = endByte == len(str)
|
||||||
}
|
}
|
||||||
l.txt.append(l.layoutParagraph(params, minWidth, maxWidth, lc, str[startByte:endByte], l.paragraph))
|
if startByte != endByte || len(l.paragraph) > 0 {
|
||||||
if truncating {
|
l.txt.append(l.layoutParagraph(params, minWidth, maxWidth, lc, str[startByte:endByte], l.paragraph))
|
||||||
params.MaxLines = maxLines - len(l.txt.lines)
|
if truncating {
|
||||||
if params.MaxLines == 0 {
|
params.MaxLines = maxLines - len(l.txt.lines)
|
||||||
done = true
|
if params.MaxLines == 0 {
|
||||||
|
done = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if done {
|
if done {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package text
|
package text
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
nsareg "eliasnaur.com/font/noto/sans/arabic/regular"
|
nsareg "eliasnaur.com/font/noto/sans/arabic/regular"
|
||||||
@@ -40,6 +41,32 @@ func TestWrappingTruncation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestShapingNewlineHandling checks that the shaper's newline splitting behaves
|
||||||
|
// consistently and does not create spurious lines of text.
|
||||||
|
func TestShapingNewlineHandling(t *testing.T) {
|
||||||
|
// Use a test string containing multiple newlines to ensure that they are shaped
|
||||||
|
// as separate paragraphs.
|
||||||
|
textInput := "\n"
|
||||||
|
ltrFace, _ := opentype.Parse(goregular.TTF)
|
||||||
|
collection := []FontFace{{Face: ltrFace}}
|
||||||
|
cache := NewShaper(collection)
|
||||||
|
cache.LayoutString(Parameters{
|
||||||
|
Alignment: Middle,
|
||||||
|
PxPerEm: fixed.I(10),
|
||||||
|
}, 200, 200, english, textInput)
|
||||||
|
if lineCount := len(cache.txt.lines); lineCount > 1 {
|
||||||
|
t.Errorf("shaping string %q created %d lines", textInput, lineCount)
|
||||||
|
}
|
||||||
|
|
||||||
|
cache.Layout(Parameters{
|
||||||
|
Alignment: Middle,
|
||||||
|
PxPerEm: fixed.I(10),
|
||||||
|
}, 200, 200, english, strings.NewReader(textInput))
|
||||||
|
if lineCount := len(cache.txt.lines); lineCount > 1 {
|
||||||
|
t.Errorf("shaping reader %q created %d lines", textInput, lineCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestCacheEmptyString ensures that shaping the empty string returns a
|
// TestCacheEmptyString ensures that shaping the empty string returns a
|
||||||
// single synthetic glyph with ascent/descent info.
|
// single synthetic glyph with ascent/descent info.
|
||||||
func TestCacheEmptyString(t *testing.T) {
|
func TestCacheEmptyString(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user