image.go
func (img *Image) Set(x, y int, clr color.Color) {
	if atomic.LoadInt32(&isRunning) == 0 {
		panic("ebiten: (*Image).Set is not available outside the main loop so far")
	}

	img.copyCheck()
	if img.isDisposed() {
		return
	}
	if img.isSubImage() && !image.Pt(x, y).In(img.bounds) {
		return
	}
	if img.isSubImage() {
		img = img.original
	}

	w, h := img.Size()
	if img.pendingPixels == nil {
		pix := make([]byte, 4*w*h)
		idx := 0
		for j := 0; j < h; j++ {
			for i := 0; i < w; i++ {
				r, g, b, a := img.mipmap.original().At(i, j)
				pix[4*idx] = r
				pix[4*idx+1] = g
				pix[4*idx+2] = b
				pix[4*idx+3] = a
				idx++
			}
		}
		img.pendingPixels = pix
	}
	r, g, b, a := clr.RGBA()
	img.pendingPixels[4*(x+y*w)] = byte(r >> 8)
	img.pendingPixels[4*(x+y*w)+1] = byte(g >> 8)
	img.pendingPixels[4*(x+y*w)+2] = byte(b >> 8)
	img.pendingPixels[4*(x+y*w)+3] = byte(a >> 8)
}
func (img *Image) Set(x, y int, clr color.Color) {
	if atomic.LoadInt32(&isRunning) == 0 {
		panic("ebiten: (*Image).Set is not available outside the main loop so far")
	}

	img.copyCheck()
	if img.isDisposed() {
		return
	}
	if img.isSubImage() && !image.Pt(x, y).In(img.bounds) {
		return
	}
	if img.isSubImage() {
		img = img.original
	}

	w, h := img.Size()
	if img.pendingPixels == nil {
		pix := make([]byte, 4*w*h)
		idx := 0
		for j := 0; j < h; j++ {
			for i := 0; i < w; i++ {
				r, g, b, a := img.mipmap.original().At(i, j)
				pix[4*idx] = r
				pix[4*idx+1] = g
				pix[4*idx+2] = b
				pix[4*idx+3] = a
				idx++
			}
		}
		img.pendingPixels = pix
	}
	r, g, b, a := clr.RGBA()
	img.pendingPixels[4*(x+y*w)] = byte(r >> 8)
	img.pendingPixels[4*(x+y*w)+1] = byte(g >> 8)
	img.pendingPixels[4*(x+y*w)+2] = byte(b >> 8)
	img.pendingPixels[4*(x+y*w)+3] = byte(a >> 8)
}
// Set sets the color at (x, y).
//
// Set loads pixels from GPU to system memory if necessary, which means that Set can be slow.
//
// Set can't be called outside the main loop (ebiten.Run's updating function) starts.
//
// If the image is disposed, Set does nothing.