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); }; |