always convert images to NRGBA
this type is rpc-serializable, and we avoid repeated color conversion
This commit is contained in:
parent
3f06bf6b82
commit
2ec417da6a
11
io.go
11
io.go
|
@ -31,3 +31,14 @@ func writeImage(path string, img image.Image) {
|
|||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func imgToNRGBA(img image.Image) *image.NRGBA {
|
||||
b := img.Bounds()
|
||||
r := image.NewNRGBA(b)
|
||||
for x := b.Min.X; x < b.Max.X; x++ {
|
||||
for y := b.Min.Y; y < b.Max.Y; y++ {
|
||||
r.Set(x, y, img.At(x, y))
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
|
2
main.go
2
main.go
|
@ -50,7 +50,7 @@ func main() {
|
|||
|
||||
if *imgPath != "" {
|
||||
offset := image.Pt(*x, *y)
|
||||
img := readImage(*imgPath)
|
||||
img := imgToNRGBA(readImage(*imgPath))
|
||||
|
||||
// check connectivity by opening one test connection
|
||||
conn, err := net.Dial("tcp", *address)
|
||||
|
|
|
@ -14,7 +14,7 @@ import (
|
|||
// using `conns` connections. Pixels are sent column wise, unless `shuffle`
|
||||
// is set. Stops when stop is closed.
|
||||
// @cleanup: use FlutTask{} as arg
|
||||
func Flut(img image.Image, position image.Point, shuffle bool, address string, conns int, stop chan bool, wg *sync.WaitGroup) {
|
||||
func Flut(img *image.NRGBA, position image.Point, shuffle bool, address string, conns int, stop chan bool, wg *sync.WaitGroup) {
|
||||
cmds := commandsFromImage(img, position)
|
||||
if shuffle {
|
||||
cmds.Shuffle()
|
||||
|
|
|
@ -33,16 +33,14 @@ func (c commands) Shuffle() {
|
|||
}
|
||||
|
||||
// CommandsFromImage converts an image to the respective pixelflut commands
|
||||
func commandsFromImage(img image.Image, offset image.Point) (cmds commands) {
|
||||
func commandsFromImage(img *image.NRGBA, offset image.Point) (cmds commands) {
|
||||
b := img.Bounds()
|
||||
cmds = make([][]byte, b.Size().X*b.Size().Y)
|
||||
numCmds := 0
|
||||
|
||||
for x := b.Min.X; x < b.Max.X; x++ {
|
||||
for y := b.Min.Y; y < b.Max.Y; y++ {
|
||||
// ensure we're working with RGBA colors (non-alpha-pre-multiplied)
|
||||
c := color.NRGBAModel.Convert(img.At(x, y)).(color.NRGBA)
|
||||
|
||||
c := img.At(x, y).(color.NRGBA)
|
||||
// ignore transparent pixels
|
||||
if c.A == 0 {
|
||||
continue
|
||||
|
|
|
@ -32,7 +32,7 @@ type Hevring struct {
|
|||
type FlutTask struct {
|
||||
Address string
|
||||
MaxConns int
|
||||
Img *image.NRGBA // bug :imageType: should be image.Image, but can't be serialized. do conversion in task creation?
|
||||
Img *image.NRGBA
|
||||
Offset image.Point
|
||||
Shuffle bool
|
||||
}
|
||||
|
|
|
@ -115,13 +115,12 @@ func SummonRán(address string, stopChan chan bool, wg *sync.WaitGroup) *Rán {
|
|||
}
|
||||
|
||||
// SetTask assigns a FlutTask to Rán, distributing it to all clients
|
||||
func (r *Rán) SetTask(img image.Image, offset image.Point, address string, maxConns int) {
|
||||
func (r *Rán) SetTask(img *image.NRGBA, offset image.Point, address string, maxConns int) {
|
||||
// @incomplete: smart task creation:
|
||||
// fetch server state & sample foreign activity in image regions. assign
|
||||
// subregions to clients (per connection), considering their bandwidth.
|
||||
|
||||
// @bug :imageType
|
||||
r.task = FlutTask{address, maxConns, img.(*image.NRGBA), offset, true}
|
||||
r.task = FlutTask{address, maxConns, img, offset, true}
|
||||
for _, c := range r.clients {
|
||||
ack := FlutAck{}
|
||||
// @speed: should send tasks async
|
||||
|
|
Loading…
Reference in New Issue