mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-12 22:17:26 +01:00
Revert "graphics: Avoid all copying pixels"
This reverts commit c60a32a479
.
Reason: This breaks backward comptibility and it was not obvious how to fix examples.
This commit is contained in:
parent
75a88fd112
commit
aa6fc67736
3
image.go
3
image.go
@ -432,9 +432,6 @@ func (i *Image) Dispose() error {
|
|||||||
//
|
//
|
||||||
// The given p must represent RGBA pre-multiplied alpha values. len(p) must equal to 4 * (image width) * (image height).
|
// The given p must represent RGBA pre-multiplied alpha values. len(p) must equal to 4 * (image width) * (image height).
|
||||||
//
|
//
|
||||||
// ReplacePixels takes the ownership of the given p. This means that p must not be modified after ReplacePixels is
|
|
||||||
// called.
|
|
||||||
//
|
|
||||||
// ReplacePixels may be slow (as for implementation, this calls glTexSubImage2D).
|
// ReplacePixels may be slow (as for implementation, this calls glTexSubImage2D).
|
||||||
//
|
//
|
||||||
// When len(p) is not appropriate, ReplacePixels panics.
|
// When len(p) is not appropriate, ReplacePixels panics.
|
||||||
|
@ -354,8 +354,19 @@ func TestImageReplacePixels(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// Even if p is changed after calling ReplacePixel, img0 uses the original values.
|
||||||
// p cannot be modified as of 1.11.0-alpha.
|
for i := range p {
|
||||||
|
p[i] = 0
|
||||||
|
}
|
||||||
|
for j := 0; j < img0.Bounds().Size().Y; j++ {
|
||||||
|
for i := 0; i < img0.Bounds().Size().X; i++ {
|
||||||
|
got := img0.At(i, j)
|
||||||
|
want := color.RGBA{0x80, 0x80, 0x80, 0x80}
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("img0 At(%d, %d): got %#v; want %#v", i, j, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestImageReplacePixelsNil(t *testing.T) {
|
func TestImageReplacePixelsNil(t *testing.T) {
|
||||||
|
@ -155,13 +155,15 @@ func (i *Image) Pixels() []byte {
|
|||||||
return c.result
|
return c.result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Image) ReplacePixels(pixels []byte, x, y, width, height int) {
|
func (i *Image) ReplacePixels(p []byte, x, y, width, height int) {
|
||||||
// ReplacePixels for a part might invalidate the current image that are drawn by DrawTriangles (#593, #738).
|
// ReplacePixels for a part might invalidate the current image that are drawn by DrawTriangles (#593, #738).
|
||||||
if i.lastCommand == lastCommandDrawTriangles {
|
if i.lastCommand == lastCommandDrawTriangles {
|
||||||
if x != 0 || y != 0 || i.width != width || i.height != height {
|
if x != 0 || y != 0 || i.width != width || i.height != height {
|
||||||
panic("graphicscommand: ReplacePixels for a part after DrawTriangles is forbidden")
|
panic("graphicscommand: ReplacePixels for a part after DrawTriangles is forbidden")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pixels := make([]byte, len(p))
|
||||||
|
copy(pixels, p)
|
||||||
c := &replacePixelsCommand{
|
c := &replacePixelsCommand{
|
||||||
dst: i,
|
dst: i,
|
||||||
pixels: pixels,
|
pixels: pixels,
|
||||||
|
@ -37,13 +37,16 @@ func (rtp *rectToPixels) addOrReplace(pixels []byte, x, y, width, height int) {
|
|||||||
rtp.m = map[image.Rectangle][]byte{}
|
rtp.m = map[image.Rectangle][]byte{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copied := make([]byte, len(pixels))
|
||||||
|
copy(copied, pixels)
|
||||||
|
|
||||||
newr := image.Rect(x, y, x+width, y+height)
|
newr := image.Rect(x, y, x+width, y+height)
|
||||||
for r := range rtp.m {
|
for r := range rtp.m {
|
||||||
if r == newr {
|
if r == newr {
|
||||||
// Replace the region.
|
// Replace the region.
|
||||||
rtp.m[r] = pixels
|
rtp.m[r] = copied
|
||||||
if r == rtp.lastR {
|
if r == rtp.lastR {
|
||||||
rtp.lastPix = pixels
|
rtp.lastPix = copied
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -53,9 +56,9 @@ func (rtp *rectToPixels) addOrReplace(pixels []byte, x, y, width, height int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the region.
|
// Add the region.
|
||||||
rtp.m[newr] = pixels
|
rtp.m[newr] = copied
|
||||||
if newr == rtp.lastR {
|
if newr == rtp.lastR {
|
||||||
rtp.lastPix = pixels
|
rtp.lastPix = copied
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user