unicornpaint

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 76180c302197e83a257b975394768e5affa4054e
parent efe8866f28f229446440c6d871e4f9845a97266f
Author: Martin Ashby <martin@martin-laptop.lan>
Date:   Fri,  1 Jun 2018 19:34:30 +0100

Fixed problem with image changing during render

Diffstat:
Municorn/FakeUnicorn2.go | 4++--
Municorn/RealUnicorn2.go | 4++--
Municorn/Unicorn2.go | 26+++++++++++++++++++++++++-
3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/unicorn/FakeUnicorn2.go b/unicorn/FakeUnicorn2.go @@ -9,7 +9,7 @@ import ( ) type FakeUnicorn2 struct { - BaseUnicorn2 + *BaseUnicorn2 *BaseFakeUnicorn } @@ -49,7 +49,7 @@ func NewUnicorn2() (*FakeUnicorn2, error) { return nil, err } return &FakeUnicorn2{ - BaseUnicorn2{}, + NewBaseUnicorn2(), baseFake, }, nil } diff --git a/unicorn/RealUnicorn2.go b/unicorn/RealUnicorn2.go @@ -13,7 +13,7 @@ import ( ) type RealUnicorn2 struct { - BaseUnicorn2 + *BaseUnicorn2 device *spi.Device } @@ -55,7 +55,7 @@ func NewUnicorn2() (*RealUnicorn2, error) { return nil, err } return &RealUnicorn2{ - BaseUnicorn2{}, + NewBaseUnicorn2(), dev, }, nil } diff --git a/unicorn/Unicorn2.go b/unicorn/Unicorn2.go @@ -5,6 +5,7 @@ package unicorn import ( "image" + "image/color/palette" "image/gif" "time" ) @@ -18,7 +19,7 @@ type Unicorn2 interface { SetGif(*gif.GIF) // Starts the rendering goroutine - StartRender() + StartRender() chan bool // Must be implemented to actually render the image to device renderImage(image.Image) @@ -42,6 +43,23 @@ func (u *BaseUnicorn2) SetGif(g *gif.GIF) { u.g = g } +func NewBaseUnicorn2() *BaseUnicorn2 { + im := image.NewPaletted( + image.Rect(0, 0, 16, 16), + palette.WebSafe) + + gf := &gif.GIF{ + Image: []*image.Paletted{im}, + Delay: []int{50}, + Disposal: []byte{gif.DisposalBackground}, + BackgroundIndex: 0, // This is black in the websafe palette + } + + return &BaseUnicorn2{ + g: gf, + } +} + // StartRenderBase ... // Deals with the timing aspect of animated GIFs func (u *BaseUnicorn2) StartRenderBase(renderImage func(image.Image)) chan bool { @@ -57,6 +75,12 @@ func (u *BaseUnicorn2) StartRenderBase(renderImage func(image.Image)) chan bool running = false case <-timer.C: gf := u.GetGif() + + // Image could change underneath us, but there should always be 1 image at least. + if imageIndex >= len(gf.Image) { + imageIndex = 0 + } + im := gf.Image[imageIndex] delay := gf.Delay[imageIndex] //100ths of a second, 10^-2 renderImage(im)