diff options
| -rw-r--r-- | engines/scumm/gfx.cpp | 50 | ||||
| -rw-r--r-- | graphics/surface.cpp | 55 | ||||
| -rw-r--r-- | graphics/surface.h | 1 | 
3 files changed, 57 insertions, 49 deletions
| diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 70105b0162..699c6ac3f8 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -1104,58 +1104,10 @@ void ScummEngine::moveScreen(int dx, int dy, int height) {  	if ((dx == 0 && dy == 0) || height <= 0)  		return; -	byte *src, *dst; -	int x, y; -  	Graphics::Surface screen;  	assert(_system->grabRawScreen(&screen)); -	// vertical movement -	if (dy > 0) { -		// move down - copy from bottom to top -		dst = (byte *)screen.pixels + (height - 1) * _screenWidth; -		src = dst - dy * _screenWidth; -		for (y = dy; y < height; y++) { -			memcpy(dst, src, _screenWidth); -			src -= _screenWidth; -			dst -= _screenWidth; -		} -	} else if (dy < 0) { -		// move up - copy from top to bottom -		dst = (byte *)screen.pixels; -		src = dst - dy * _screenWidth; -		for (y = -dy; y < height; y++) { -			memcpy(dst, src, _screenWidth); -			src += _screenWidth; -			dst += _screenWidth; -		} -	} - -	// horizontal movement -	if (dx > 0) { -		// move right - copy from right to left -		dst = (byte *)screen.pixels + (_screenWidth - 1); -		src = dst - dx; -		for (y = 0; y < height; y++) { -			for (x = dx; x < _screenWidth; x++) { -				*dst-- = *src--; -			} -			src += _screenWidth + (_screenWidth - dx); -			dst += _screenWidth + (_screenWidth - dx); -		} -	} else if (dx < 0)  { -		// move left - copy from left to right -		dst = (byte *)screen.pixels; -		src = dst - dx; -		for (y = 0; y < height; y++) { -			for (x = -dx; x < _screenWidth; x++) { -				*dst++ = *src++; -			} -			src += _screenWidth - (_screenWidth + dx); -			dst += _screenWidth - (_screenWidth + dx); -		} -	} - +	screen.move(dx, dy, height);  	_system->copyRectToScreen((byte *)screen.pixels, screen.pitch, 0, 0, screen.w, screen.h);  	screen.free();  } diff --git a/graphics/surface.cpp b/graphics/surface.cpp index 6a851ae5e5..e9d52e162e 100644 --- a/graphics/surface.cpp +++ b/graphics/surface.cpp @@ -164,4 +164,59 @@ void Surface::frameRect(const Common::Rect &r, uint32 color) {  	vLine(r.right-1, r.top, r.bottom-1, color);  } +void Surface::move(int dx, int dy, int height) { +	// Short circuit check - do we have to do anything anyway? +	if ((dx == 0 && dy == 0) || height <= 0) +		return; + +	byte *src, *dst; +	int x, y; + +	// vertical movement +	if (dy > 0) { +		// move down - copy from bottom to top +		dst = (byte *)pixels + (height - 1) * w; +		src = dst - dy * w; +		for (y = dy; y < height; y++) { +			memcpy(dst, src, w); +			src -= w; +			dst -= w; +		} +	} else if (dy < 0) { +		// move up - copy from top to bottom +		dst = (byte *)pixels; +		src = dst - dy * w; +		for (y = -dy; y < height; y++) { +			memcpy(dst, src, w); +			src += w; +			dst += w; +		} +	} + +	// horizontal movement +	if (dx > 0) { +		// move right - copy from right to left +		dst = (byte *)pixels + (w - 1); +		src = dst - dx; +		for (y = 0; y < height; y++) { +			for (x = dx; x < w; x++) { +				*dst-- = *src--; +			} +			src += w + (w - dx); +			dst += w + (w - dx); +		} +	} else if (dx < 0)  { +		// move left - copy from left to right +		dst = (byte *)pixels; +		src = dst - dx; +		for (y = 0; y < height; y++) { +			for (x = -dx; x < w; x++) { +				*dst++ = *src++; +			} +			src += w - (w + dx); +			dst += w - (w + dx); +		} +	} +} +  } // End of namespace Graphics diff --git a/graphics/surface.h b/graphics/surface.h index 995e2b9b07..2fd5968727 100644 --- a/graphics/surface.h +++ b/graphics/surface.h @@ -65,6 +65,7 @@ struct Surface {  	void vLine(int x, int y, int y2, uint32 color);  	void fillRect(const Common::Rect &r, uint32 color);  	void frameRect(const Common::Rect &r, uint32 color); +	void move(int dx, int dy, int height);  }; | 
