From 081065846502874997032e038607ea88a727064a Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 19 Nov 2018 21:52:18 +0000 Subject: [PATCH] Add first pass font rendering to GL driver This is very inefficient and lacks styles, but shows the concept --- driver/gl/draw.go | 29 +++++++++++++++++++++++++++++ driver/gl/driver.go | 28 +++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/driver/gl/draw.go b/driver/gl/draw.go index be0b3be264..cd9a7cd73e 100644 --- a/driver/gl/draw.go +++ b/driver/gl/draw.go @@ -8,6 +8,8 @@ import ( "github.com/fyne-io/fyne/canvas" "github.com/fyne-io/fyne/theme" "github.com/go-gl/gl/v3.3-core/gl" + "github.com/golang/freetype" + "github.com/golang/freetype/truetype" "image/draw" "log" "os" @@ -224,6 +226,31 @@ func (c *glCanvas) drawImage(img *canvas.Image, pos fyne.Position) { c.drawRawImage(raw, img.Size, pos) } +func (c *glCanvas) drawText(text *canvas.Text, pos fyne.Position) { + bounds := text.MinSize() + width := scaleInt(c, bounds.Width) + height := scaleInt(c, bounds.Height) + + img := image.NewRGBA(image.Rect(0, 0, width, height)) + + var opts truetype.Options + font := fontCache() + fontSize := float64(text.TextSize) * float64(c.Scale()) + opts.Size = fontSize + face := truetype.NewFace(fontCache(), &opts) + + ctx := freetype.NewContext() + ctx.SetDPI(72) + ctx.SetFont(font) + ctx.SetFontSize(fontSize) + ctx.SetClip(img.Bounds()) + ctx.SetDst(img) + ctx.SetSrc(&image.Uniform{theme.TextColor()}) + + ctx.DrawString(text.Text, freetype.Pt(0, height+2-face.Metrics().Descent.Ceil())) + c.drawRawImage(img, bounds, pos) +} + func (c *glCanvas) drawObject(o fyne.CanvasObject, offset fyne.Position) { pos := o.CurrentPosition().Add(offset) switch obj := o.(type) { @@ -231,5 +258,7 @@ func (c *glCanvas) drawObject(o fyne.CanvasObject, offset fyne.Position) { c.drawRectangle(obj, pos) case *canvas.Image: c.drawImage(obj, pos) + case *canvas.Text: + c.drawText(obj, pos) } } diff --git a/driver/gl/driver.go b/driver/gl/driver.go index dd6f973632..d8e44ce944 100644 --- a/driver/gl/driver.go +++ b/driver/gl/driver.go @@ -4,6 +4,10 @@ package gl import ( "github.com/fyne-io/fyne" + "github.com/fyne-io/fyne/theme" + "github.com/golang/freetype/truetype" + "golang.org/x/image/font" + "log" ) type gLDriver struct { @@ -12,8 +16,30 @@ type gLDriver struct { done chan interface{} } +// TODO for styles... +var fontRegular *truetype.Font + +func fontCache() *truetype.Font { + if fontRegular != nil { + return fontRegular + } + + loaded, err := truetype.Parse(theme.TextFont().Content()) + if err != nil { + log.Println("Font error", err) + } + fontRegular = loaded + return fontRegular +} + func (d *gLDriver) RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size { - return fyne.NewSize(len(text)*10, size+4) + var opts truetype.Options + + opts.Size = float64(size) + face := truetype.NewFace(fontCache(), &opts) + advance := font.MeasureString(face, text) + + return fyne.NewSize(advance.Ceil(), face.Metrics().Height.Ceil()) } func (d *gLDriver) Quit() {