buffered: Bug fix: Resolve pixels when DrawTriangles is called before the main loop

Fixes #1052
This commit is contained in:
Hajime Hoshi 2020-01-11 04:29:45 +09:00
parent ff2159f56f
commit ccab797473
2 changed files with 89 additions and 16 deletions

View File

@ -226,6 +226,8 @@ func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16,
delayedCommandsM.Lock()
if needsToDelayCommands {
delayedCommands = append(delayedCommands, func() {
src.resolvePendingPixels(true)
i.resolvePendingPixels(false)
i.img.DrawTriangles(src.img, vertices, indices, colorm, mode, filter, address)
})
delayedCommandsM.Unlock()

View File

@ -15,7 +15,6 @@
package buffered_test
import (
"errors"
"image/color"
"os"
"testing"
@ -40,31 +39,103 @@ func TestMain(m *testing.M) {
}()
for {
select {
case f := <-mainCh:
if err := ebiten.Run(func(*ebiten.Image) error {
f := <-mainCh
f()
return nil
}, 320, 240, 1, ""); err != nil {
panic(err)
}
}
}
func TestSetBeforeRun(t *testing.T) {
clr := color.RGBA{1, 2, 3, 4}
type testResult struct {
want color.RGBA
got <-chan color.RGBA
}
var testSetBeforeMainResult = func() testResult {
clr := color.RGBA{1, 2, 3, 4}
img, _ := ebiten.NewImage(16, 16, ebiten.FilterDefault)
img.Set(0, 0, clr)
want := clr
var got color.RGBA
ch := make(chan color.RGBA, 1)
go func() {
runOnMainThread(func() {
ch <- img.At(0, 0).(color.RGBA)
})
}()
runOnMainThread(func() {
quit := errors.New("quit")
if err := ebiten.Run(func(*ebiten.Image) error {
got = img.At(0, 0).(color.RGBA)
return quit
}, 320, 240, 1, ""); err != nil && err != quit {
t.Fatal(err)
}
})
return testResult{
want: clr,
got: ch,
}
}()
func TestSetBeforeMain(t *testing.T) {
got := <-testSetBeforeMainResult.got
want := testSetBeforeMainResult.want
if got != want {
t.Errorf("got: %v, want: %v", got, want)
}
}
var testDrawTrianglesBeforeMainResult = func() testResult {
const w, h = 16, 16
src, _ := ebiten.NewImage(w, h, ebiten.FilterDefault)
dst, _ := ebiten.NewImage(w, h, ebiten.FilterDefault)
src.Set(0, 0, color.White)
vs := []ebiten.Vertex{
{
DstX: 0,
DstY: 0,
SrcX: 0,
SrcY: 0,
ColorR: 1,
ColorG: 1,
ColorB: 1,
ColorA: 1,
},
{
DstX: w,
DstY: 0,
SrcX: w,
SrcY: 0,
ColorR: 1,
ColorG: 1,
ColorB: 1,
ColorA: 1,
},
{
DstX: 0,
DstY: h,
SrcX: 0,
SrcY: h,
ColorR: 1,
ColorG: 1,
ColorB: 1,
ColorA: 1,
},
}
dst.DrawTriangles(vs, []uint16{0, 1, 2}, src, nil)
ch := make(chan color.RGBA, 1)
go func() {
runOnMainThread(func() {
ch <- dst.At(0, 0).(color.RGBA)
})
}()
return testResult{
want: color.RGBA{0xff, 0xff, 0xff, 0xff},
got: ch,
}
}()
func TestDrawTrianglesBeforeMain(t *testing.T) {
got := <-testDrawTrianglesBeforeMainResult.got
want := testDrawTrianglesBeforeMainResult.want
if got != want {
t.Errorf("got: %v, want: %v", got, want)