diff --git a/image.go b/image.go index 4a418161f..f9ecba6c2 100644 --- a/image.go +++ b/image.go @@ -126,10 +126,6 @@ func (i *Image) fill(r, g, b, a uint8) { _ = i.DrawImage(emptyImage, op) } -var ( - quadIndices = []uint16{0, 1, 2, 1, 2, 3} -) - // DrawImage draws the given image on the image i. // // DrawImage accepts the options. For details, see the document of DrawImageOptions. @@ -243,7 +239,8 @@ func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error { a, b, c, d, tx, ty := geom.elements() vs := img.shareableImage.QuadVertices(sx0, sy0, sx1, sy1, a, b, c, d, tx, ty) - i.shareableImage.DrawImage(img.shareableImage, vs, quadIndices, options.ColorM.impl, mode, filter) + is := graphicsutil.QuadIndices() + i.shareableImage.DrawImage(img.shareableImage, vs, is, options.ColorM.impl, mode, filter) return nil } diff --git a/internal/graphicsutil/vertices.go b/internal/graphicsutil/vertices.go index 5ca112ddf..9eb8e5744 100644 --- a/internal/graphicsutil/vertices.go +++ b/internal/graphicsutil/vertices.go @@ -111,3 +111,11 @@ func quadVerticesImpl(x, y, u0, v0, u1, v1, a, b, c, d, tx, ty float32) []float3 return vs } + +var ( + quadIndices = []uint16{0, 1, 2, 1, 2, 3} +) + +func QuadIndices() []uint16 { + return quadIndices +} diff --git a/internal/restorable/image.go b/internal/restorable/image.go index 389b119a9..906dbc3f9 100644 --- a/internal/restorable/image.go +++ b/internal/restorable/image.go @@ -132,10 +132,6 @@ func (i *Image) makeStale() { // the former image can be restored from the latest state of the latter image. } -var ( - quadIndices = []uint16{0, 1, 2, 1, 2, 3} -) - // ReplacePixels replaces the image pixels with the given pixels slice. // // If pixels is nil, ReplacePixels clears the specified reagion. @@ -164,7 +160,8 @@ func (i *Image) ReplacePixels(pixels []byte, x, y, width, height int) { vs := graphicsutil.QuadVertices(w, h, 0, 0, w, h, float32(width)/float32(w), 0, 0, float32(height)/float32(h), float32(x), float32(y)) - i.image.DrawImage(dummyImage.image, vs, quadIndices, colorm, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + i.image.DrawImage(dummyImage.image, vs, is, colorm, opengl.CompositeModeCopy, graphics.FilterNearest) } if x == 0 && y == 0 && width == w && height == h { diff --git a/internal/restorable/images_test.go b/internal/restorable/images_test.go index bd0a4b230..4aefae02c 100644 --- a/internal/restorable/images_test.go +++ b/internal/restorable/images_test.go @@ -99,10 +99,6 @@ func TestRestore(t *testing.T) { } } -var ( - quadIndices = []uint16{0, 1, 2, 1, 2, 3} -) - func TestRestoreChain(t *testing.T) { const num = 10 imgs := []*Image{} @@ -121,7 +117,8 @@ func TestRestoreChain(t *testing.T) { for i := 0; i < num-1; i++ { w, h := imgs[i].Size() vs := graphicsutil.QuadVertices(w, h, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0) - imgs[i+1].DrawImage(imgs[i], vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + imgs[i+1].DrawImage(imgs[i], vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) } ResolveStaleImages() if err := Restore(); err != nil { @@ -162,10 +159,11 @@ func TestRestoreChain2(t *testing.T) { fill(imgs[8], clr8.R, clr8.G, clr8.B, clr8.A) vs := graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - imgs[8].DrawImage(imgs[7], vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) - imgs[9].DrawImage(imgs[8], vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + imgs[8].DrawImage(imgs[7], vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + imgs[9].DrawImage(imgs[8], vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) for i := 0; i < 7; i++ { - imgs[i+1].DrawImage(imgs[i], vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + imgs[i+1].DrawImage(imgs[i], vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) } ResolveStaleImages() @@ -207,10 +205,11 @@ func TestRestoreOverrideSource(t *testing.T) { clr1 := color.RGBA{0x00, 0x00, 0x01, 0xff} fill(img1, clr0.R, clr0.G, clr0.B, clr0.A) vs := graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - img2.DrawImage(img1, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) - img3.DrawImage(img2, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img2.DrawImage(img1, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img3.DrawImage(img2, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) fill(img0, clr1.R, clr1.G, clr1.B, clr1.A) - img1.DrawImage(img0, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img1.DrawImage(img0, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) ResolveStaleImages() if err := Restore(); err != nil { t.Fatal(err) @@ -291,23 +290,24 @@ func TestRestoreComplexGraph(t *testing.T) { img0.Dispose() }() vs := graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - img3.DrawImage(img0, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img3.DrawImage(img0, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 1, 0) - img3.DrawImage(img1, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img3.DrawImage(img1, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 1, 0) - img4.DrawImage(img1, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img4.DrawImage(img1, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 2, 0) - img4.DrawImage(img2, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img4.DrawImage(img2, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - img5.DrawImage(img3, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img5.DrawImage(img3, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - img6.DrawImage(img3, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img6.DrawImage(img3, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 1, 0) - img6.DrawImage(img4, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img6.DrawImage(img4, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - img7.DrawImage(img2, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img7.DrawImage(img2, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) vs = graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 2, 0) - img7.DrawImage(img3, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img7.DrawImage(img3, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) ResolveStaleImages() if err := Restore(); err != nil { t.Fatal(err) @@ -398,8 +398,9 @@ func TestRestoreRecursive(t *testing.T) { img0.Dispose() }() vs := graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 1, 0) - img1.DrawImage(img0, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) - img0.DrawImage(img1, vs, quadIndices, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img1.DrawImage(img0, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) + img0.DrawImage(img1, vs, is, nil, opengl.CompositeModeSourceOver, graphics.FilterNearest) ResolveStaleImages() if err := Restore(); err != nil { t.Fatal(err) @@ -485,7 +486,8 @@ func TestDrawImageAndReplacePixels(t *testing.T) { defer img1.Dispose() vs := graphicsutil.QuadVertices(1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0) - img1.DrawImage(img0, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img1.DrawImage(img0, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) img1.ReplacePixels([]byte{0xff, 0xff, 0xff, 0xff}, 1, 0, 1, 1) ResolveStaleImages() @@ -516,8 +518,9 @@ func TestDispose(t *testing.T) { defer img2.Dispose() vs := graphicsutil.QuadVertices(1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0) - img1.DrawImage(img2, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) - img0.DrawImage(img1, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img1.DrawImage(img2, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + img0.DrawImage(img1, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) img1.Dispose() ResolveStaleImages() @@ -543,7 +546,8 @@ func TestDoubleResolve(t *testing.T) { img1 := newImageFromImage(base) vs := graphicsutil.QuadVertices(1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0) - img0.DrawImage(img1, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img0.DrawImage(img1, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) img0.ReplacePixels([]uint8{0x00, 0xff, 0x00, 0xff}, 1, 1, 1, 1) // Now img0 is stale. ResolveStaleImages() diff --git a/internal/shareable/shareable.go b/internal/shareable/shareable.go index 3252805a2..327565fec 100644 --- a/internal/shareable/shareable.go +++ b/internal/shareable/shareable.go @@ -29,10 +29,6 @@ import ( "github.com/hajimehoshi/ebiten/internal/restorable" ) -var ( - quadIndices = []uint16{0, 1, 2, 1, 2, 3} -) - type backend struct { restorable *restorable.Image @@ -68,7 +64,8 @@ func (b *backend) TryAlloc(width, height int) (*packing.Node, bool) { oldImg := b.restorable w, h := oldImg.Size() vs := graphicsutil.QuadVertices(w, h, 0, 0, w, h, 1, 0, 0, 1, 0, 0) - newImg.DrawImage(oldImg, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + newImg.DrawImage(oldImg, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) oldImg.Dispose() b.restorable = newImg @@ -115,7 +112,8 @@ func (i *Image) ensureNotShared() { newImg := restorable.NewImage(w, h, false) vw, vh := i.backend.restorable.Size() vs := graphicsutil.QuadVertices(vw, vh, x, y, x+w, y+h, 1, 0, 0, 1, 0, 0) - newImg.DrawImage(i.backend.restorable, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + newImg.DrawImage(i.backend.restorable, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) i.dispose(false) i.backend = &backend{ diff --git a/internal/shareable/shareable_test.go b/internal/shareable/shareable_test.go index bc8f20470..169421f21 100644 --- a/internal/shareable/shareable_test.go +++ b/internal/shareable/shareable_test.go @@ -22,6 +22,7 @@ import ( "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/internal/graphics" + "github.com/hajimehoshi/ebiten/internal/graphicsutil" "github.com/hajimehoshi/ebiten/internal/opengl" . "github.com/hajimehoshi/ebiten/internal/shareable" "github.com/hajimehoshi/ebiten/internal/testflock" @@ -45,10 +46,6 @@ func TestMain(m *testing.M) { const bigSize = 2049 -var ( - quadIndices = []uint16{0, 1, 2, 1, 2, 3} -) - func TestEnsureNotShared(t *testing.T) { // Create img1 and img2 with this size so that the next images are allocated // with non-upper-left location. @@ -89,7 +86,8 @@ func TestEnsureNotShared(t *testing.T) { ) // img4.ensureNotShared() should be called. vs := img3.QuadVertices(0, 0, size/2, size/2, 1, 0, 0, 1, size/4, size/4) - img4.DrawImage(img3, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + is := graphicsutil.QuadIndices() + img4.DrawImage(img3, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) for j := 0; j < size; j++ { for i := 0; i < size; i++ { @@ -107,5 +105,5 @@ func TestEnsureNotShared(t *testing.T) { // Check further drawing doesn't cause panic. // This bug was fixed by 03dcd948. - img4.DrawImage(img3, vs, quadIndices, nil, opengl.CompositeModeCopy, graphics.FilterNearest) + img4.DrawImage(img3, vs, is, nil, opengl.CompositeModeCopy, graphics.FilterNearest) }