From 5175b1ba7379627d6fd530fc18d3961f26669b4e Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Thu, 15 Feb 2018 10:12:32 +0100 Subject: [PATCH] images and fonts can now be optionally named for later access; DrawImage and SetFont can now accept file names directly and will cache using the path --- canvas.go | 23 +++++++++++++++++++++-- images.go | 32 ++++++++++++++++++++++++++++---- paths.go | 8 ++++---- text.go | 18 +++++++++++++----- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/canvas.go b/canvas.go index 0befb12..c902809 100644 --- a/canvas.go +++ b/canvas.go @@ -5,6 +5,7 @@ import ( "image" "unsafe" + "github.com/golang/freetype/truetype" "github.com/tfriedel6/lm" ) @@ -358,6 +359,10 @@ func parseStyle(value ...interface{}) drawStyle { case *Image: style.image = v return style + case string: + if img, ok := images[v]; ok { + style.image = img + } } } c, ok := parseColor(value...) @@ -428,8 +433,22 @@ func (cv *Canvas) SetLineWidth(width float32) { } // SetFont sets the font and font size -func (cv *Canvas) SetFont(font *Font, size float32) { - cv.state.font = font +func (cv *Canvas) SetFont(font interface{}, size float32) { + switch v := font.(type) { + case *Font: + cv.state.font = v + case *truetype.Font: + cv.state.font = &Font{font: v} + case string: + if f, ok := fonts[v]; ok { + cv.state.font = f + } else { + f, err := LoadFont(v, v) + if err == nil { + cv.state.font = f + } + } + } cv.state.fontSize = size } diff --git a/images.go b/images.go index e26157e..74ad926 100644 --- a/images.go +++ b/images.go @@ -17,7 +17,9 @@ type Image struct { deleted bool } -func LoadImage(src interface{}) (*Image, error) { +var images = make(map[string]*Image) + +func LoadImage(src interface{}, name string) (*Image, error) { var img *Image var err error switch v := src.(type) { @@ -45,16 +47,19 @@ func LoadImage(src interface{}) (*Image, error) { if err != nil { return nil, err } - return LoadImage(srcImg) + return LoadImage(srcImg, name) case []byte: srcImg, _, err := image.Decode(bytes.NewReader(v)) if err != nil { return nil, err } - return LoadImage(srcImg) + return LoadImage(srcImg, name) default: return nil, errors.New("Unsupported source type") } + if name != "" { + images[name] = img + } runtime.SetFinalizer(img, func(img *Image) { glChan <- func() { gli.DeleteTextures(1, &img.tex) @@ -169,7 +174,26 @@ func (img *Image) Delete() { img.deleted = true } -func (cv *Canvas) DrawImage(img *Image, coords ...float32) { +func (cv *Canvas) DrawImage(image interface{}, coords ...float32) { + var img *Image + switch v := image.(type) { + case *Image: + img = v + case string: + if i, ok := images[v]; ok { + img = i + } else { + i, err := LoadImage(v, v) + if err == nil { + img = i + } + } + } + + if img == nil { + return + } + if img.deleted { return } diff --git a/paths.go b/paths.go index 5b8ca7e..e1cf07d 100644 --- a/paths.go +++ b/paths.go @@ -118,8 +118,8 @@ func (cv *Canvas) Arc(x, y, radius, startAngle, endAngle float32, anticlockwise step := 6 / fmath.Max(tr[0], tr[1]) if step > 0.8 { step = 0.8 - } else if step < 0.01 { - step = 0.01 + } else if step < 0.05 { + step = 0.05 } if anticlockwise { for a := startAngle; a > endAngle; a -= step { @@ -316,8 +316,8 @@ func (cv *Canvas) addCircleTris(center lm.Vec2, radius float32, tris []float32) step := 6 / radius if step > 0.8 { step = 0.8 - } else if step < 0.01 { - step = 0.01 + } else if step < 0.05 { + step = 0.05 } for angle := step; angle <= math.Pi*2+step; angle += step { s, c := fmath.Sincos(angle) diff --git a/text.go b/text.go index 928201c..526f392 100644 --- a/text.go +++ b/text.go @@ -18,10 +18,13 @@ type Font struct { font *truetype.Font } -func LoadFont(src interface{}) (*Font, error) { +var fonts = make(map[string]*Font) + +func LoadFont(src interface{}, name string) (*Font, error) { + var f *Font switch v := src.(type) { case *truetype.Font: - return &Font{font: v}, nil + f = &Font{font: v} case string: data, err := ioutil.ReadFile(v) if err != nil { @@ -31,15 +34,20 @@ func LoadFont(src interface{}) (*Font, error) { if err != nil { return nil, err } - return &Font{font: font}, nil + f = &Font{font: font} case []byte: font, err := freetype.ParseFont(v) if err != nil { return nil, err } - return &Font{font: font}, nil + f = &Font{font: font} + default: + return nil, errors.New("Unsupported source type") } - return nil, errors.New("Unsupported source type") + if name != "" { + fonts[name] = f + } + return f, nil } func (cv *Canvas) FillText(str string, x, y float32) {