aboutsummaryrefslogtreecommitdiff
path: root/unicorn
diff options
context:
space:
mode:
authorMartin Ashby <martin@martin-laptop.lan>2018-06-01 19:34:30 +0100
committerMartin Ashby <martin@martin-laptop.lan>2018-06-01 19:34:30 +0100
commit76180c302197e83a257b975394768e5affa4054e (patch)
tree3de64b310a66c0bdbb9ce2368fb4dde6fd16e3cf /unicorn
parentefe8866f28f229446440c6d871e4f9845a97266f (diff)
downloadunicornpaint-76180c302197e83a257b975394768e5affa4054e.tar.gz
unicornpaint-76180c302197e83a257b975394768e5affa4054e.tar.bz2
unicornpaint-76180c302197e83a257b975394768e5affa4054e.tar.xz
unicornpaint-76180c302197e83a257b975394768e5affa4054e.zip
Fixed problem with image changing during render
Diffstat (limited to 'unicorn')
-rw-r--r--unicorn/FakeUnicorn2.go4
-rw-r--r--unicorn/RealUnicorn2.go4
-rw-r--r--unicorn/Unicorn2.go26
3 files changed, 29 insertions, 5 deletions
diff --git a/unicorn/FakeUnicorn2.go b/unicorn/FakeUnicorn2.go
index 1b53376..8728c15 100644
--- 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
index 861b1d5..72b4ed7 100644
--- 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
index 81e3174..5dcc6c2 100644
--- 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)