Move moveScreen to common surface functions for graphics
svn-id: r23218
This commit is contained in:
parent
286de879fd
commit
3c11d2fa18
3 changed files with 57 additions and 49 deletions
|
@ -1104,58 +1104,10 @@ void ScummEngine::moveScreen(int dx, int dy, int height) {
|
||||||
if ((dx == 0 && dy == 0) || height <= 0)
|
if ((dx == 0 && dy == 0) || height <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
byte *src, *dst;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
Graphics::Surface screen;
|
Graphics::Surface screen;
|
||||||
assert(_system->grabRawScreen(&screen));
|
assert(_system->grabRawScreen(&screen));
|
||||||
|
|
||||||
// vertical movement
|
screen.move(dx, dy, height);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_system->copyRectToScreen((byte *)screen.pixels, screen.pitch, 0, 0, screen.w, screen.h);
|
_system->copyRectToScreen((byte *)screen.pixels, screen.pitch, 0, 0, screen.w, screen.h);
|
||||||
screen.free();
|
screen.free();
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,4 +164,59 @@ void Surface::frameRect(const Common::Rect &r, uint32 color) {
|
||||||
vLine(r.right-1, r.top, r.bottom-1, 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
|
} // End of namespace Graphics
|
||||||
|
|
|
@ -65,6 +65,7 @@ struct Surface {
|
||||||
void vLine(int x, int y, int y2, uint32 color);
|
void vLine(int x, int y, int y2, uint32 color);
|
||||||
void fillRect(const Common::Rect &r, uint32 color);
|
void fillRect(const Common::Rect &r, uint32 color);
|
||||||
void frameRect(const Common::Rect &r, uint32 color);
|
void frameRect(const Common::Rect &r, uint32 color);
|
||||||
|
void move(int dx, int dy, int height);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue