add Canvas.SetSize method

This commit is contained in:
faiface 2017-01-22 03:05:46 +01:00
parent 8e1359b45d
commit d686841b5c
1 changed files with 43 additions and 1 deletions

View File

@ -16,6 +16,9 @@ type Canvas struct {
f *pixelgl.Frame
s *pixelgl.Shader
copyVs *pixelgl.VertexSlice
smooth bool
pic *Picture
mat mgl32.Mat3
col mgl32.Vec4
@ -24,7 +27,7 @@ type Canvas struct {
// NewCanvas creates a new fully transparent Canvas with specified dimensions in pixels.
func NewCanvas(width, height float64, smooth bool) *Canvas {
c := &Canvas{}
c := &Canvas{smooth: smooth}
mainthread.Call(func() {
var err error
c.f = pixelgl.NewFrame(int(width), int(height), smooth)
@ -37,6 +40,18 @@ func NewCanvas(width, height float64, smooth bool) *Canvas {
if err != nil {
panic(errors.Wrap(err, "failed to create canvas"))
}
c.copyVs = pixelgl.MakeVertexSlice(c.s, 6, 6)
c.copyVs.Begin()
c.copyVs.SetVertexData([]float32{
-1, -1, 1, 1, 1, 1, 0, 0,
1, -1, 1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 0, 1,
})
c.copyVs.End()
})
c.pic = nil
c.mat = mgl32.Ident3()
@ -45,6 +60,33 @@ func NewCanvas(width, height float64, smooth bool) *Canvas {
return c
}
// SetSize resizes the Canvas. The original content will be stretched to the new size.
func (c *Canvas) SetSize(width, height float64) {
if V(width, height) == V(c.Size()) {
return
}
mainthread.Call(func() {
oldF := c.f
c.f = pixelgl.NewFrame(int(width), int(height), c.smooth)
c.f.Begin()
c.s.Begin()
c.s.SetUniformAttr(canvasTransformMat3, mgl32.Ident3())
c.s.SetUniformAttr(canvasMaskColorVec4, mgl32.Vec4{1, 1, 1, 1})
c.s.SetUniformAttr(canvasBoundsVec4, mgl32.Vec4{0, 0, 1, 1})
oldF.Texture().Begin()
c.copyVs.Begin()
c.copyVs.Draw()
c.copyVs.End()
oldF.Texture().End()
c.s.End()
c.f.End()
})
}
// Size returns the width and the height of the Canvas in pixels.
func (c *Canvas) Size() (width, height float64) {
return float64(c.f.Width()), float64(c.f.Height())