mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
buffered: Bug fix: Resolve pixels when DrawTriangles is called before the main loop
Fixes #1052
This commit is contained in:
parent
ff2159f56f
commit
ccab797473
@ -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()
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user