From 2d1f61f746a54e2a89150a75cd3413b76a4af40d Mon Sep 17 00:00:00 2001 From: faiface Date: Sun, 7 May 2017 21:08:10 +0200 Subject: [PATCH] improve Text code --- text/text.go | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/text/text.go b/text/text.go index a0bf35e..be1f098 100644 --- a/text/text.go +++ b/text/text.go @@ -115,6 +115,12 @@ func (txt *Text) BoundsOf(s string) pixel.Rect { bounds := pixel.Rect{} for _, r := range s { + var control bool + dot, control = txt.controlRune(r, dot) + if control { + continue + } + var b pixel.Rect _, _, b, dot = txt.Atlas().DrawRune(prevR, r, dot) @@ -178,26 +184,36 @@ func (txt *Text) WriteRune(r rune) (n int, err error) { return n, nil } +// controlRune checks if r is a control rune (newline, tab, ...). If it is, a new dot position and +// true is returned. If r is not a control rune, the original dot and false is returned. +func (txt *Text) controlRune(r rune, dot pixel.Vec) (newDot pixel.Vec, control bool) { + switch r { + case '\n': + dot -= pixel.Y(txt.lineHeight) + dot = dot.WithX(txt.Orig.X()) + case '\r': + dot = dot.WithX(txt.Orig.X()) + case '\t': + rem := math.Mod(dot.X()-txt.Orig.X(), txt.tabWidth) + rem = math.Mod(rem, rem+txt.tabWidth) + if rem == 0 { + rem = txt.tabWidth + } + dot += pixel.X(rem) + default: + return dot, false + } + return dot, true +} + func (txt *Text) drawBuf() { for utf8.FullRune(txt.buf) { r, size := utf8.DecodeRune(txt.buf) txt.buf = txt.buf[size:] - switch r { - case '\n': - txt.Dot -= pixel.Y(txt.lineHeight) - txt.Dot = txt.Dot.WithX(txt.Orig.X()) - continue - case '\r': - txt.Dot = txt.Dot.WithX(txt.Orig.X()) - continue - case '\t': - rem := math.Mod(txt.Dot.X()-txt.Orig.X(), txt.tabWidth) - rem = math.Mod(rem, rem+txt.tabWidth) - if rem == 0 { - rem = txt.tabWidth - } - txt.Dot += pixel.X(rem) + var control bool + txt.Dot, control = txt.controlRune(r, txt.Dot) + if control { continue }