aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/adl/adl.cpp10
-rw-r--r--engines/adl/display.cpp114
-rw-r--r--engines/adl/display.h9
-rw-r--r--engines/adl/hires1.cpp4
4 files changed, 78 insertions, 59 deletions
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index 99267baa00..313b14681e 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -312,7 +312,7 @@ void AdlEngine::doActions(const Command &command, byte noun, byte offset) {
if (input.size() == 0 || input[0] != APPLECHAR('N')) {
_isRestarting = true;
_display->clear(0x00);
- _display->decodeFrameBuffer();
+ _display->updateHiResScreen();
restartGame();
return;
}
@@ -515,9 +515,9 @@ void AdlEngine::showRoom() {
if (!_state.isDark) {
drawPic(curRoom().curPicture);
drawItems();
+ _display->updateHiResScreen();
}
- _display->decodeFrameBuffer();
printMessage(curRoom().description, false);
}
@@ -913,9 +913,7 @@ byte AdlEngine::inputKey() {
};
}
- _display->updateTextSurface();
- _display->updateScreen();
- g_system->updateScreen();
+ _display->updateTextScreen();
g_system->delayMillis(16);
}
@@ -942,8 +940,6 @@ void AdlEngine::delay(uint32 ms) {
}
}
}
- _display->updateScreen();
- g_system->updateScreen();
g_system->delayMillis(16);
}
}
diff --git a/engines/adl/display.cpp b/engines/adl/display.cpp
index a75b129dc8..05c96cfcda 100644
--- a/engines/adl/display.cpp
+++ b/engines/adl/display.cpp
@@ -36,10 +36,12 @@
namespace Adl {
+// TODO: Implement partial screen updates
+
#define DISPLAY_PITCH (DISPLAY_WIDTH / 7)
-#define COLOR_PALETTE_SIZE 6
-const byte colorPalette[COLOR_PALETTE_SIZE * 3] = {
+#define COLOR_PALETTE_ENTRIES 6
+const byte colorPalette[COLOR_PALETTE_ENTRIES * 3] = {
0x00, 0x00, 0x00,
0xff, 0xff, 0xff,
0xc7, 0x34, 0xff,
@@ -48,8 +50,8 @@ const byte colorPalette[COLOR_PALETTE_SIZE * 3] = {
0xf2, 0x5e, 0x00
};
-#define MONO_PALETTE_SIZE 2
-const byte monoPalette[MONO_PALETTE_SIZE * 3] = {
+#define MONO_PALETTE_ENTRIES 2
+const byte monoPalette[MONO_PALETTE_ENTRIES * 3] = {
0x00, 0x00, 0x00,
0x00, 0xc0, 0x01
};
@@ -100,9 +102,9 @@ Display::Display() :
_scanlines = ConfMan.getBool("scanlines");
if (_monochrome)
- g_system->getPaletteManager()->setPalette(monoPalette, 0, MONO_PALETTE_SIZE);
+ g_system->getPaletteManager()->setPalette(monoPalette, 0, MONO_PALETTE_ENTRIES);
else
- g_system->getPaletteManager()->setPalette(colorPalette, 0, COLOR_PALETTE_SIZE);
+ g_system->getPaletteManager()->setPalette(colorPalette, 0, COLOR_PALETTE_ENTRIES);
enableScanlines(_scanlines);
@@ -134,15 +136,35 @@ Display::~Display() {
delete _font;
}
-void Display::updateScreen() {
- if (_mode == DISPLAY_MODE_TEXT) {
+void Display::setMode(DisplayMode mode) {
+ _mode = mode;
+
+ if (_mode == DISPLAY_MODE_TEXT || _mode == DISPLAY_MODE_MIXED)
+ updateTextScreen();
+ if (_mode == DISPLAY_MODE_HIRES || _mode == DISPLAY_MODE_MIXED)
+ updateHiResScreen();
+}
+
+void Display::updateTextScreen() {
+ updateTextSurface();
+
+ if (_mode == DISPLAY_MODE_TEXT)
g_system->copyRectToScreen(_textBufSurface->getPixels(), _textBufSurface->pitch, 0, 0, _textBufSurface->w, _textBufSurface->h);
- } else if (_mode == DISPLAY_MODE_HIRES) {
+ else if (_mode == DISPLAY_MODE_MIXED)
+ g_system->copyRectToScreen(_textBufSurface->getBasePtr(0, _textBufSurface->h - 4 * 8 * 2), _textBufSurface->pitch, 0, _textBufSurface->h - 4 * 8 * 2, _textBufSurface->w, 4 * 8 * 2);
+
+ g_system->updateScreen();
+}
+
+void Display::updateHiResScreen() {
+ updateHiResSurface();
+
+ if (_mode == DISPLAY_MODE_HIRES)
g_system->copyRectToScreen(_frameBufSurface->getPixels(), _frameBufSurface->pitch, 0, 0, _frameBufSurface->w, _frameBufSurface->h);
- } else {
+ else if (_mode == DISPLAY_MODE_MIXED)
g_system->copyRectToScreen(_frameBufSurface->getPixels(), _frameBufSurface->pitch, 0, 0, _frameBufSurface->w, _frameBufSurface->h - 4 * 8 * 2);
- g_system->copyRectToScreen(_textBufSurface->getBasePtr(0, _textBufSurface->h - 4 * 8 * 2), _textBufSurface->pitch, 0, _textBufSurface->h - 4 * 8 * 2, _textBufSurface->w, 4 * 8 * 2);
- }
+
+ g_system->updateScreen();
}
bool Display::saveThumbnail(Common::WriteStream &out) {
@@ -177,17 +199,6 @@ void Display::loadFrameBuffer(Common::ReadStream &stream) {
}
}
-void Display::decodeFrameBuffer() {
- byte *src = _frameBuf;
- byte *dst = (byte *)_frameBufSurface->getPixels();
-
- for (uint i = 0; i < DISPLAY_HEIGHT; ++i) {
- decodeScanline(dst, _frameBufSurface->pitch, src);
- src += DISPLAY_PITCH;
- dst += _frameBufSurface->pitch * 2;
- }
-}
-
void Display::putPixel(Common::Point p, byte color) {
byte offset = p.x / 7;
@@ -216,27 +227,6 @@ void Display::clear(byte color) {
}
}
-void Display::updateTextSurface() {
- for (uint row = 0; row < 24; ++row)
- for (uint col = 0; col < 40; ++col) {
- int charPos = row * 40 + col;
- char c = _textBuf[row * 40 + col];
-
- if (charPos == _cursorPos && _showCursor)
- c = (c & 0x3f) | 0x40;
-
- Common::Rect r(7 * 2, 8 * 2);
- r.translate(((c & 0x3f) % 16) * 7 * 2, (c & 0x3f) / 16 * 8 * 2);
-
- if (!(c & 0x80)) {
- if (!(c & 0x40) || ((g_system->getMillis() / 270) & 1))
- r.translate(0, 4 * 8 * 2);
- }
-
- _textBufSurface->copyRectToSurface(*_font, col * 7 * 2, row * 8 * 2, r);
- }
-}
-
void Display::home() {
memset(_textBuf, APPLECHAR(' '), kTextBufSize);
_cursorPos = 0;
@@ -279,7 +269,7 @@ void Display::printString(const Common::String &str) {
scrollUp();
}
- updateTextSurface();
+ updateTextScreen();
}
void Display::setCharAtCursor(byte c) {
@@ -291,7 +281,7 @@ void Display::showCursor(bool enable) {
}
void Display::enableScanlines(bool enable) {
- byte pal[6 * 3] = { };
+ byte pal[COLOR_PALETTE_ENTRIES * 3] = { };
if (enable)
g_system->getPaletteManager()->setPalette(pal, 6, 6);
@@ -301,6 +291,17 @@ void Display::enableScanlines(bool enable) {
}
}
+void Display::updateHiResSurface() {
+ byte *src = _frameBuf;
+ byte *dst = (byte *)_frameBufSurface->getPixels();
+
+ for (uint i = 0; i < DISPLAY_HEIGHT; ++i) {
+ decodeScanline(dst, _frameBufSurface->pitch, src);
+ src += DISPLAY_PITCH;
+ dst += _frameBufSurface->pitch * 2;
+ }
+}
+
void Display::decodeScanlineColor(byte *dst, int pitch, byte *src) const {
// TODO: shift secondPal by half a pixel
@@ -370,6 +371,27 @@ void Display::decodeScanline(byte *dst, int pitch, byte *src) const {
decodeScanlineColor(dst, pitch, src);
}
+void Display::updateTextSurface() {
+ for (uint row = 0; row < 24; ++row)
+ for (uint col = 0; col < 40; ++col) {
+ int charPos = row * 40 + col;
+ char c = _textBuf[row * 40 + col];
+
+ if (charPos == _cursorPos && _showCursor)
+ c = (c & 0x3f) | 0x40;
+
+ Common::Rect r(7 * 2, 8 * 2);
+ r.translate(((c & 0x3f) % 16) * 7 * 2, (c & 0x3f) / 16 * 8 * 2);
+
+ if (!(c & 0x80)) {
+ if (!(c & 0x40) || ((g_system->getMillis() / 270) & 1))
+ r.translate(0, 4 * 8 * 2);
+ }
+
+ _textBufSurface->copyRectToSurface(*_font, col * 7 * 2, row * 8 * 2, r);
+ }
+}
+
void Display::drawChar(byte c, int x, int y) {
byte *buf = (byte *)_font->getPixels() + y * _font->pitch + x;
diff --git a/engines/adl/display.h b/engines/adl/display.h
index 40151c1c6a..16b52bf9a3 100644
--- a/engines/adl/display.h
+++ b/engines/adl/display.h
@@ -54,18 +54,17 @@ public:
Display();
~Display();
- void setMode(DisplayMode mode) { _mode = mode; }
- void updateScreen();
+ void setMode(DisplayMode mode);
+ void updateTextScreen();
+ void updateHiResScreen();
bool saveThumbnail(Common::WriteStream &out);
// Graphics
void loadFrameBuffer(Common::ReadStream &stream);
- void decodeFrameBuffer();
void putPixel(Common::Point p1, byte color);
void clear(byte color);
// Text
- void updateTextSurface();
void home();
void moveCursorTo(const Common::Point &pos);
void moveCursorForward();
@@ -79,11 +78,13 @@ private:
kTextBufSize = 40 * 24
};
+ void updateHiResSurface();
void enableScanlines(bool enable);
void decodeScanlineColor(byte *dst, int pitch, byte *src) const;
void decodeScanlineMono(byte *dst, int pitch, byte *src) const;
void decodeScanline(byte *dst, int pitch, byte *src) const;
+ void updateTextSurface();
void drawChar(byte c, int x, int y);
void createFont();
void scrollUp();
diff --git a/engines/adl/hires1.cpp b/engines/adl/hires1.cpp
index 6c369222b1..8b5b9220f7 100644
--- a/engines/adl/hires1.cpp
+++ b/engines/adl/hires1.cpp
@@ -96,7 +96,7 @@ void HiRes1Engine::runIntro() {
file.seek(IDI_HR1_OFS_LOGO_0);
_display->setMode(DISPLAY_MODE_HIRES);
_display->loadFrameBuffer(file);
- _display->decodeFrameBuffer();
+ _display->updateHiResScreen();
delay(4000);
if (shouldQuit())
@@ -186,7 +186,7 @@ void HiRes1Engine::runIntro() {
// Title screen shown during loading
file.seek(0x1800);
_display->loadFrameBuffer(file);
- _display->decodeFrameBuffer();
+ _display->updateHiResScreen();
delay(2000);
}