aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/dc/dc.h1
-rw-r--r--backends/dc/display.cpp40
-rw-r--r--backends/mac/mac.cpp6
-rw-r--r--backends/morphos/morphos.cpp40
-rw-r--r--backends/morphos/morphos.h1
-rw-r--r--backends/null/null.cpp1
-rw-r--r--backends/sdl/sdl-common.cpp37
-rw-r--r--backends/sdl/sdl-common.h2
-rw-r--r--backends/wince/pocketpc.cpp42
-rw-r--r--backends/x11/x11.cpp40
-rw-r--r--common/system.h4
-rw-r--r--scumm/gfx.cpp90
12 files changed, 300 insertions, 4 deletions
diff --git a/backends/dc/dc.h b/backends/dc/dc.h
index 4a2b78cfb7..7bd15c9bbf 100644
--- a/backends/dc/dc.h
+++ b/backends/dc/dc.h
@@ -15,6 +15,7 @@ class OSystem_Dreamcast : public OSystem {
// Draw a bitmap to screen.
// The screen will not be updated to reflect the new bitmap
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
+ void move_screen(int dx, int dy, int height);
// Update the dirty areas of the screen
void update_screen();
diff --git a/backends/dc/display.cpp b/backends/dc/display.cpp
index 97c7f2aed5..317f33a0fa 100644
--- a/backends/dc/display.cpp
+++ b/backends/dc/display.cpp
@@ -132,6 +132,46 @@ void OSystem_Dreamcast::copy_rect(const byte *buf, int pitch, int x, int y,
} while (--h);
}
+void OSystem_Dreamcast::move_screen(int dx, int dy, int height) {
+
+ if ((dx == 0) && (dy == 0))
+ return;
+
+ if (dx == 0) {
+ // vertical movement
+ if (dy > 0) {
+ // move down
+ // copy from bottom to top
+ for (int y = height - 1; y >= dy; y--)
+ copy_rect(screen + SCREEN_W * (y - dy), SCREEN_W, 0, y, SCREEN_W, 1);
+ } else {
+ // move up
+ // copy from top to bottom
+ for (int y = 0; y < height + dx; y++)
+ copy_rect(screen + SCREEN_W * (y - dy), SCREEN_W, 0, y, SCREEN_W, 1);
+ }
+ } else if (dy == 0) {
+ // horizontal movement
+ if (dx > 0) {
+ // move right
+ // copy from right to left
+ for (int x = SCREEN_W - 1; x >= dx; x--)
+ copy_rect(screen + x - dx, SCREEN_W, x, 0, 1, height);
+ } else {
+ // move left
+ // copy from left to right
+ for (int x = 0; x < SCREEN_W; x++)
+ copy_rect(screen + x - dx, SCREEN_W, x, 0, 1, height);
+ }
+ } else {
+ // free movement
+ // not neccessary for now
+ }
+
+
+}
+
+
bool OSystem_Dreamcast::show_mouse(bool visible)
{
bool last = _ms_visible;
diff --git a/backends/mac/mac.cpp b/backends/mac/mac.cpp
index f22d72666b..2dc6dea1f5 100644
--- a/backends/mac/mac.cpp
+++ b/backends/mac/mac.cpp
@@ -772,6 +772,12 @@ void OSystem_MAC::copy_rect(const byte *buf, int pitch, int x, int y, int w, int
} while(--h);
}
+void OSystem_MAC::move_screen(int dx, int dy) {
+
+
+}
+
+
void OSystem_MAC::add_dirty_rect(int x, int y, int w, int h) {
if (force_full)
return;
diff --git a/backends/morphos/morphos.cpp b/backends/morphos/morphos.cpp
index 629b8079b8..164c046b54 100644
--- a/backends/morphos/morphos.cpp
+++ b/backends/morphos/morphos.cpp
@@ -927,6 +927,46 @@ void OSystem_MorphOS::copy_rect(const byte *src, int pitch, int x, int y, int w,
}
}
+void OSystem_MorphOS::move_screen(int dx, int dy, int height) {
+
+ if ((dx == 0) && (dy == 0))
+ return;
+
+ if (dx == 0) {
+ // vertical movement
+ if (dy > 0) {
+ // move down
+ // copy from bottom to top
+ for (int y = height - 1; y >= dy; y--)
+ copy_rect((byte *)ScummBuffer + ScummBufferWidth * (y - dy), ScummBufferWidth, 0, y, ScummBufferWidth, 1);
+ } else {
+ // move up
+ // copy from top to bottom
+ for (int y = 0; y < height + dx; y++)
+ copy_rect((byte *)ScummBuffer + ScummBufferWidth * (y - dy), ScummBufferWidth, 0, y, ScummBufferWidth, 1);
+ }
+ } else if (dy == 0) {
+ // horizontal movement
+ if (dx > 0) {
+ // move right
+ // copy from right to left
+ for (int x = ScummBufferWidth - 1; x >= dx; x--)
+ copy_rect((byte *)ScummBuffer + x - dx, ScummBufferWidth, x, 0, 1, height);
+ } else {
+ // move left
+ // copy from left to right
+ for (int x = 0; x < ScummBufferWidth; x++)
+ copy_rect((byte *)ScummBuffer + x - dx, ScummBufferWidth, x, 0, 1, height);
+ }
+ } else {
+ // free movement
+ // not neccessary for now
+ }
+
+
+}
+
+
bool OSystem_MorphOS::AddUpdateRect(WORD x, WORD y, WORD w, WORD h)
{
if (UpdateRects > 25)
diff --git a/backends/morphos/morphos.h b/backends/morphos/morphos.h
index aead0c3aec..6bda51d597 100644
--- a/backends/morphos/morphos.h
+++ b/backends/morphos/morphos.h
@@ -47,6 +47,7 @@ class OSystem_MorphOS : public OSystem
// Draw a bitmap to screen.
// The screen will not be updated to reflect the new bitmap
virtual void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
+ void move_screen(int dx, int dy, int height);
// Update the dirty areas of the screen
virtual void update_screen();
diff --git a/backends/null/null.cpp b/backends/null/null.cpp
index d48f1be764..df42dbfc38 100644
--- a/backends/null/null.cpp
+++ b/backends/null/null.cpp
@@ -30,6 +30,7 @@ public:
void set_palette(const byte *colors, uint start, uint num) {}
void init_size(uint w, uint h);
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h) {}
+ void move_screen(int dx, int dy) {}
void update_screen() {}
bool show_mouse(bool visible) { return false; }
void set_mouse_pos(int x, int y) {}
diff --git a/backends/sdl/sdl-common.cpp b/backends/sdl/sdl-common.cpp
index 422ce8b353..bdedb8ed1a 100644
--- a/backends/sdl/sdl-common.cpp
+++ b/backends/sdl/sdl-common.cpp
@@ -135,6 +135,43 @@ void OSystem_SDL_Common::copy_rect(const byte *buf, int pitch, int x, int y, int
}
+void OSystem_SDL_Common::move_screen(int dx, int dy, int height) {
+
+ if ((dx == 0) && (dy == 0))
+ return;
+
+ if (dx == 0) {
+ // vertical movement
+ if (dy > 0) {
+ // move down
+ // copy from bottom to top
+ for (int y = height - 1; y >= dy; y--)
+ copy_rect((byte *)sdl_screen->pixels + SCREEN_WIDTH * (y - dy), SCREEN_WIDTH, 0, y, SCREEN_WIDTH, 1);
+ } else {
+ // move up
+ // copy from top to bottom
+ for (int y = 0; y < height + dx; y++)
+ copy_rect((byte *)sdl_screen->pixels + SCREEN_WIDTH * (y - dy), SCREEN_WIDTH, 0, y, SCREEN_WIDTH, 1);
+ }
+ } else if (dy == 0) {
+ // horizontal movement
+ if (dx > 0) {
+ // move right
+ // copy from right to left
+ for (int x = SCREEN_WIDTH - 1; x >= dx; x--)
+ copy_rect((byte *)sdl_screen->pixels + x - dx, SCREEN_WIDTH, x, 0, 1, height);
+ } else {
+ // move left
+ // copy from left to right
+ for (int x = 0; x < SCREEN_WIDTH; x++)
+ copy_rect((byte *)sdl_screen->pixels + x - dx, SCREEN_WIDTH, x, 0, 1, height);
+ }
+ } else {
+ // free movement
+ // not neccessary for now
+ }
+}
+
void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) {
if (force_full)
return;
diff --git a/backends/sdl/sdl-common.h b/backends/sdl/sdl-common.h
index ae7b64306e..bd2410ab2a 100644
--- a/backends/sdl/sdl-common.h
+++ b/backends/sdl/sdl-common.h
@@ -42,6 +42,8 @@ public:
// The screen will not be updated to reflect the new bitmap
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
+ void move_screen(int dx, int dy, int height);
+
// Update the dirty areas of the screen
void update_screen() = 0;
diff --git a/backends/wince/pocketpc.cpp b/backends/wince/pocketpc.cpp
index 0162d14e28..6adb61b0b3 100644
--- a/backends/wince/pocketpc.cpp
+++ b/backends/wince/pocketpc.cpp
@@ -95,6 +95,8 @@ public:
// The screen will not be updated to reflect the new bitmap
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
+ void move_screen(int dx, int dy, int height);
+
// Update the dirty areas of the screen
void update_screen();
@@ -1215,6 +1217,46 @@ void OSystem_WINCE3::copy_rect(const byte *buf, int pitch, int x, int y, int w,
} while (--h);
}
+void OSystem_WINCE3::move_screen(int dx, int dy, int height) {
+
+ if ((dx == 0) && (dy == 0))
+ return;
+
+ if (dx == 0) {
+ // vertical movement
+ if (dy > 0) {
+ // move down
+ // copy from bottom to top
+ for (int y = height - 1; y >= dy; y--)
+ copy_rect(_gfx_buf + SCREEN_WIDTH * (y - dy), SCREEN_WIDTH, 0, y, SCREEN_WIDTH, 1);
+ } else {
+ // move up
+ // copy from top to bottom
+ for (int y = 0; y < height + dx; y++)
+ copy_rect(_gfx_buf + SCREEN_WIDTH * (y - dy), SCREEN_WIDTH, 0, y, SCREEN_WIDTH, 1);
+ }
+ } else if (dy == 0) {
+ // horizontal movement
+ if (dx > 0) {
+ // move right
+ // copy from right to left
+ for (int x = SCREEN_WIDTH - 1; x >= dx; x--)
+ copy_rect(_gfx_buf + x - dx, SCREEN_WIDTH, x, 0, 1, height);
+ } else {
+ // move left
+ // copy from left to right
+ for (int x = 0; x < SCREEN_WIDTH; x++)
+ copy_rect(_gfx_buf + x - dx, SCREEN_WIDTH, x, 0, 1, height);
+ }
+ } else {
+ // free movement
+ // not neccessary for now
+ }
+
+
+}
+
+
void OSystem_WINCE3::update_screen() {
if (!hide_cursor)
diff --git a/backends/x11/x11.cpp b/backends/x11/x11.cpp
index 1492c0d8ae..3a2e362a1d 100644
--- a/backends/x11/x11.cpp
+++ b/backends/x11/x11.cpp
@@ -62,6 +62,8 @@ public:
// The screen will not be updated to reflect the new bitmap
void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h);
+ void move_screen(int dx, int dy, int height);
+
// Update the dirty areas of the screen
void update_screen();
@@ -509,6 +511,44 @@ void OSystem_X11::copy_rect(const byte *buf, int pitch, int x, int y, int w, int
}
}
+void OSystem_X11::move_screen(int dx, int dy, int height) {
+
+ if ((dx == 0) && (dy == 0))
+ return;
+
+ if (dx == 0) {
+ // vertical movement
+ if (dy > 0) {
+ // move down
+ // copy from bottom to top
+ for (int y = height - 1; y >= dy; y--)
+ copy_rect(local_fb + fb_width * (y - dy), fb_width, 0, y, fb_width, 1);
+ } else {
+ // move up
+ // copy from top to bottom
+ for (int y = 0; y < height + dx; y++)
+ copy_rect(local_fb + fb_width * (y - dy), fb_width, 0, y, fb_width, 1);
+ }
+ } else if (dy == 0) {
+ // horizontal movement
+ if (dx > 0) {
+ // move right
+ // copy from right to left
+ for (int x = fb_width - 1; x >= dx; x--)
+ copy_rect(local_fb + x - dx, fb_width, x, 0, 1, height);
+ } else {
+ // move left
+ // copy from left to right
+ for (int x = 0; x < fb_width; x++)
+ copy_rect(local_fb + x - dx, fb_width, x, 0, 1, height);
+ }
+ } else {
+ // free movement
+ // not neccessary for now
+ }
+}
+
+
void OSystem_X11::update_screen_helper(const dirty_square * d, dirty_square * dout)
{
int x, y;
diff --git a/common/system.h b/common/system.h
index 4bac597eb1..c0fabec1b4 100644
--- a/common/system.h
+++ b/common/system.h
@@ -92,6 +92,10 @@ public:
// The screen will not be updated to reflect the new bitmap
virtual void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h) = 0;
+ // Moves the screen content around by the given amount of pixels
+ // but only the top height pixel rows, the rest stays untouched
+ virtual void move_screen(int dx, int dy, int height) = 0;
+
// Update the dirty areas of the screen
virtual void update_screen() = 0;
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp
index 07f92f9e33..2bbaf04dc6 100644
--- a/scumm/gfx.cpp
+++ b/scumm/gfx.cpp
@@ -681,16 +681,16 @@ void Scumm::fadeIn(int effect)
unkScreenEffect6();
break;
case 130:
- unkScreenEffect1();
+ scrollEffect(3); // right unkScreenEffect1();
break;
case 131:
- unkScreenEffect2();
+ scrollEffect(2); // left unkScreenEffect2();
break;
case 132:
- unkScreenEffect3();
+ scrollEffect(1); // down unkScreenEffect3();
break;
case 133:
- unkScreenEffect4();
+ scrollEffect(0); // up unkScreenEffect4();
break;
case 134:
dissolveEffect(1, 1);
@@ -2092,6 +2092,88 @@ void Scumm::dissolveEffect(int width, int height) {
}
}
+void Scumm::scrollEffect(int dir) {
+
+ VirtScreen *vs = &virtscr[0];
+
+ int x, y;
+ int step;
+
+ if ((dir == 0) || (dir == 1))
+ step = vs->height;
+ else
+ step = vs->width;
+
+#define scrolltime 500 // ms the scroll is supposed to take
+#define picturedelay 20
+
+ step /= (scrolltime/picturedelay);
+
+ switch (dir) {
+ case 0:
+ //up
+ y = 1 + step;
+ while (y < vs->height) {
+ _system->move_screen(0, -step, vs->height);
+ _system->copy_rect(vs->screenPtr + vs->xstart + (y - step) * vs->width,
+ vs->width,
+ 0, vs->height - step,
+ vs->width, step);
+ _system->update_screen();
+ waitForTimer(picturedelay);
+
+ y += step;
+ }
+ break;
+ case 1:
+ // down
+ y = 1 + step;
+ while (y < vs->height) {
+ _system->move_screen(0, step, vs->height);
+ _system->copy_rect(vs->screenPtr + vs->xstart + vs->width * (vs->height-y),
+ vs->width,
+ 0, 0,
+ vs->width, step);
+ _system->update_screen();
+ waitForTimer(picturedelay);
+
+ y += step;
+ }
+ break;
+ case 2:
+ // left
+ x = 1 + step;
+ while (x < vs->width) {
+ _system->move_screen(-step, 0, vs->height);
+ _system->copy_rect(vs->screenPtr + vs->xstart + x - step,
+ vs->width,
+ vs->width - step, 0,
+ step, vs->height);
+ _system->update_screen();
+ waitForTimer(picturedelay);
+
+ x += step;
+ }
+ break;
+ case 3:
+ // right
+ x = 1 + step;
+ while (x < vs->width) {
+ _system->move_screen(step, 0, vs->height);
+ _system->copy_rect(vs->screenPtr + vs->xstart + vs->width - x,
+ vs->width,
+ 0, 0,
+ step, vs->height);
+ _system->update_screen();
+ waitForTimer(picturedelay);
+
+ x += step;
+ }
+ break;
+ }
+}
+
+
void Scumm::unkScreenEffect6() {
if (_gameId == GID_LOOM256)
dissolveEffect(1, 1);