mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
internal/atlas: refactoring
This commit is contained in:
parent
3d034610a9
commit
764ec8c794
@ -572,29 +572,32 @@ func (i *Image) replacePixels(pix []byte, x, y, width, height int) {
|
|||||||
i.backend.restorable.ReplacePixels(pixb, x, y, pw, ph)
|
i.backend.restorable.ReplacePixels(pixb, x, y, pw, ph)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *Image) Pixels(graphicsDriver graphicsdriver.Graphics) ([]byte, error) {
|
func (img *Image) ReadPixels(graphicsDriver graphicsdriver.Graphics, pixels []byte) error {
|
||||||
backendsM.Lock()
|
backendsM.Lock()
|
||||||
defer backendsM.Unlock()
|
defer backendsM.Unlock()
|
||||||
|
|
||||||
x := img.paddingSize()
|
x := img.paddingSize()
|
||||||
y := img.paddingSize()
|
y := img.paddingSize()
|
||||||
|
|
||||||
bs := make([]byte, 4*img.width*img.height)
|
if got, want := len(pixels), 4*img.width*img.height; got != want {
|
||||||
|
return fmt.Errorf("atlas: len(pixels) must be %d but %d", want, got)
|
||||||
|
}
|
||||||
|
|
||||||
idx := 0
|
idx := 0
|
||||||
for j := y; j < y+img.height; j++ {
|
for j := y; j < y+img.height; j++ {
|
||||||
for i := x; i < x+img.width; i++ {
|
for i := x; i < x+img.width; i++ {
|
||||||
r, g, b, a, err := img.at(graphicsDriver, i, j)
|
r, g, b, a, err := img.at(graphicsDriver, i, j)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
bs[4*idx] = r
|
pixels[4*idx] = r
|
||||||
bs[4*idx+1] = g
|
pixels[4*idx+1] = g
|
||||||
bs[4*idx+2] = b
|
pixels[4*idx+2] = b
|
||||||
bs[4*idx+3] = a
|
pixels[4*idx+3] = a
|
||||||
idx++
|
idx++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bs, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Image) at(graphicsDriver graphicsdriver.Graphics, x, y int) (byte, byte, byte, byte, error) {
|
func (i *Image) at(graphicsDriver graphicsdriver.Graphics, x, y int) (byte, byte, byte, byte, error) {
|
||||||
|
@ -125,8 +125,8 @@ func TestEnsureIsolated(t *testing.T) {
|
|||||||
t.Errorf("got: %v, want: %v", got, want)
|
t.Errorf("got: %v, want: %v", got, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
pix, err := img4.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*size*size)
|
||||||
if err != nil {
|
if err := img4.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < size; j++ {
|
for j := 0; j < size; j++ {
|
||||||
@ -217,8 +217,8 @@ func TestReputOnAtlas(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pix, err := img1.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*size*size)
|
||||||
if err != nil {
|
if err := img1.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < size; j++ {
|
for j := 0; j < size; j++ {
|
||||||
@ -241,8 +241,8 @@ func TestReputOnAtlas(t *testing.T) {
|
|||||||
t.Errorf("got: %v, want: %v", got, want)
|
t.Errorf("got: %v, want: %v", got, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
pix, err = img1.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*size*size)
|
||||||
if err != nil {
|
if err := img1.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < size; j++ {
|
for j := 0; j < size; j++ {
|
||||||
@ -329,8 +329,8 @@ func TestExtend(t *testing.T) {
|
|||||||
// Ensure to allocate
|
// Ensure to allocate
|
||||||
img1.ReplacePixels(p1, 0, 0, w1, h1)
|
img1.ReplacePixels(p1, 0, 0, w1, h1)
|
||||||
|
|
||||||
pix0, err := img0.Pixels(ui.GraphicsDriverForTesting())
|
pix0 := make([]byte, 4*w0*h0)
|
||||||
if err != nil {
|
if err := img0.ReadPixels(ui.GraphicsDriverForTesting(), pix0); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < h0; j++ {
|
for j := 0; j < h0; j++ {
|
||||||
@ -348,8 +348,8 @@ func TestExtend(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pix1, err := img1.Pixels(ui.GraphicsDriverForTesting())
|
pix1 := make([]byte, 4*w1*h1)
|
||||||
if err != nil {
|
if err := img1.ReadPixels(ui.GraphicsDriverForTesting(), pix1); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < h1; j++ {
|
for j := 0; j < h1; j++ {
|
||||||
@ -395,8 +395,8 @@ func TestReplacePixelsAfterDrawTriangles(t *testing.T) {
|
|||||||
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeCopy, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeCopy, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
||||||
dst.ReplacePixels(pix, 0, 0, w, h)
|
dst.ReplacePixels(pix, 0, 0, w, h)
|
||||||
|
|
||||||
pix, err := dst.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*w*h)
|
||||||
if err != nil {
|
if err := dst.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < h; j++ {
|
for j := 0; j < h; j++ {
|
||||||
@ -442,8 +442,8 @@ func TestSmallImages(t *testing.T) {
|
|||||||
}
|
}
|
||||||
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeSourceOver, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeSourceOver, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
||||||
|
|
||||||
pix, err := dst.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*w*h)
|
||||||
if err != nil {
|
if err := dst.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < h; j++ {
|
for j := 0; j < h; j++ {
|
||||||
@ -490,8 +490,8 @@ func TestLongImages(t *testing.T) {
|
|||||||
}
|
}
|
||||||
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeSourceOver, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeSourceOver, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
||||||
|
|
||||||
pix, err := dst.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*dstW*dstH)
|
||||||
if err != nil {
|
if err := dst.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < h; j++ {
|
for j := 0; j < h; j++ {
|
||||||
@ -717,8 +717,8 @@ func TestImageReplacePixelsModify(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check the pixels are the original ones.
|
// Check the pixels are the original ones.
|
||||||
pix, err := img.Pixels(ui.GraphicsDriverForTesting())
|
pix = make([]byte, 4*size*size)
|
||||||
if err != nil {
|
if err := img.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for j := 0; j < size; j++ {
|
for j := 0; j < size; j++ {
|
||||||
|
@ -48,8 +48,8 @@ func TestShaderFillTwice(t *testing.T) {
|
|||||||
s1 := atlas.NewShader(etesting.ShaderProgramFill(0x80, 0x80, 0x80, 0xff))
|
s1 := atlas.NewShader(etesting.ShaderProgramFill(0x80, 0x80, 0x80, 0xff))
|
||||||
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeCopy, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, s1, nil, false)
|
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeCopy, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, s1, nil, false)
|
||||||
|
|
||||||
pix, err := dst.Pixels(g)
|
pix := make([]byte, 4*w*h)
|
||||||
if err != nil {
|
if err := dst.ReadPixels(g, pix); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
if got, want := (color.RGBA{pix[0], pix[1], pix[2], pix[3]}), (color.RGBA{0x80, 0x80, 0x80, 0xff}); got != want {
|
if got, want := (color.RGBA{pix[0], pix[1], pix[2], pix[3]}), (color.RGBA{0x80, 0x80, 0x80, 0xff}); got != want {
|
||||||
@ -80,8 +80,8 @@ func TestImageDrawTwice(t *testing.T) {
|
|||||||
vs = quadVertices(w, h, 0, 0, 1)
|
vs = quadVertices(w, h, 0, 0, 1)
|
||||||
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src1}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeCopy, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
dst.DrawTriangles([graphics.ShaderImageCount]*atlas.Image{src1}, vs, is, affine.ColorMIdentity{}, graphicsdriver.CompositeModeCopy, graphicsdriver.FilterNearest, graphicsdriver.AddressUnsafe, dr, graphicsdriver.Region{}, [graphics.ShaderImageCount - 1][2]float32{}, nil, nil, false)
|
||||||
|
|
||||||
pix, err := dst.Pixels(ui.GraphicsDriverForTesting())
|
pix := make([]byte, 4*w*h)
|
||||||
if err != nil {
|
if err := dst.ReadPixels(ui.GraphicsDriverForTesting(), pix); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
if got, want := (color.RGBA{pix[0], pix[1], pix[2], pix[3]}), (color.RGBA{0x80, 0x80, 0x80, 0xff}); got != want {
|
if got, want := (color.RGBA{pix[0], pix[1], pix[2], pix[3]}), (color.RGBA{0x80, 0x80, 0x80, 0xff}); got != want {
|
||||||
|
@ -80,20 +80,20 @@ func (i *Image) MarkDisposed() {
|
|||||||
i.img.MarkDisposed()
|
i.img.MarkDisposed()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *Image) At(graphicsDriver graphicsdriver.Graphics, x, y int) (r, g, b, a byte, err error) {
|
func (i *Image) At(graphicsDriver graphicsdriver.Graphics, x, y int) (r, g, b, a byte, err error) {
|
||||||
checkDelayedCommandsFlushed("At")
|
checkDelayedCommandsFlushed("At")
|
||||||
|
|
||||||
idx := (y*img.width + x)
|
idx := (y*i.width + x)
|
||||||
if img.pixels != nil {
|
if i.pixels != nil {
|
||||||
return img.pixels[4*idx], img.pixels[4*idx+1], img.pixels[4*idx+2], img.pixels[4*idx+3], nil
|
return i.pixels[4*idx], i.pixels[4*idx+1], i.pixels[4*idx+2], i.pixels[4*idx+3], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pix, err := img.img.Pixels(graphicsDriver)
|
pix := make([]byte, 4*i.width*i.height)
|
||||||
if err != nil {
|
if err := i.img.ReadPixels(graphicsDriver, pix); err != nil {
|
||||||
return 0, 0, 0, 0, err
|
return 0, 0, 0, 0, err
|
||||||
}
|
}
|
||||||
img.pixels = pix
|
i.pixels = pix
|
||||||
return img.pixels[4*idx], img.pixels[4*idx+1], img.pixels[4*idx+2], img.pixels[4*idx+3], nil
|
return i.pixels[4*idx], i.pixels[4*idx+1], i.pixels[4*idx+2], i.pixels[4*idx+3], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Image) DumpScreenshot(graphicsDriver graphicsdriver.Graphics, name string, blackbg bool) error {
|
func (i *Image) DumpScreenshot(graphicsDriver graphicsdriver.Graphics, name string, blackbg bool) error {
|
||||||
|
Loading…
Reference in New Issue
Block a user