From 13127f28169eb54c6bef54af0c7c3d04a11ebb22 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Wed, 28 Mar 2018 12:42:50 +0200 Subject: [PATCH] added MeasureText method --- text.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/text.go b/text.go index edb8487..0e94047 100644 --- a/text.go +++ b/text.go @@ -123,3 +123,41 @@ func (cv *Canvas) FillText(str string, x, y float64) { gli.ActiveTexture(gl_TEXTURE0) } + +type TextMetrics struct { + Width float64 +} + +func (cv *Canvas) MeasureText(str string) TextMetrics { + frc := fontRenderingContext + frc.setFont(cv.state.font.font) + frc.setFontSize(float64(cv.state.fontSize)) + fnt := cv.state.font.font + + var x float64 + prev, hasPrev := truetype.Index(0), false + for _, rn := range str { + idx := fnt.Index(rn) + if idx == 0 { + prev = 0 + hasPrev = false + continue + } + if hasPrev { + kern := fnt.Kern(frc.scale, prev, idx) + if frc.hinting != font.HintingNone { + kern = (kern + 32) &^ 63 + } + x += float64(kern) / 64 + } + advance, _, _, err := frc.glyph(idx, fixed.Point26_6{}) + if err != nil { + prev = 0 + hasPrev = false + continue + } + x += float64(advance) / 64 + } + + return TextMetrics{Width: x} +}