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
This commit is contained in:
parent
59033ea55b
commit
5175b1ba73
4 changed files with 66 additions and 15 deletions
23
canvas.go
23
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
|
||||
}
|
||||
|
||||
|
|
32
images.go
32
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
|
||||
}
|
||||
|
|
8
paths.go
8
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)
|
||||
|
|
18
text.go
18
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")
|
||||
}
|
||||
if name != "" {
|
||||
fonts[name] = f
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func (cv *Canvas) FillText(str string, x, y float32) {
|
||||
|
|
Loading…
Reference in a new issue