aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/adl/display.cpp57
-rw-r--r--engines/adl/display.h4
2 files changed, 33 insertions, 28 deletions
diff --git a/engines/adl/display.cpp b/engines/adl/display.cpp
index 2a24b65a18..6f72f91b32 100644
--- a/engines/adl/display.cpp
+++ b/engines/adl/display.cpp
@@ -39,6 +39,11 @@ namespace Adl {
// This implements the Apple II "Hi-Res" display mode
#define DISPLAY_PITCH (DISPLAY_WIDTH / 7)
+#define DISPLAY_SIZE (DISPLAY_PITCH * DISPLAY_HEIGHT)
+
+#define TEXT_WIDTH 40
+#define TEXT_HEIGHT 24
+#define TEXT_BUF_SIZE (TEXT_WIDTH * TEXT_HEIGHT)
#define COLOR_PALETTE_ENTRIES 8
const byte colorPalette[COLOR_PALETTE_ENTRIES * 3] = {
@@ -117,14 +122,15 @@ Display::Display() :
showScanlines(_scanlines);
- _frameBuf = new byte[DISPLAY_PITCH * DISPLAY_HEIGHT];
+ _frameBuf = new byte[DISPLAY_SIZE];
+ memset(_frameBuf, 0, DISPLAY_SIZE);
_frameBufSurface = new Graphics::Surface;
// We need 2x scaling to properly render the half-pixel shift
// of the second palette
_frameBufSurface->create(DISPLAY_WIDTH * 2, DISPLAY_HEIGHT * 2, Graphics::PixelFormat::createFormatCLUT8());
- _textBuf = new byte[kTextBufSize];
- memset(_textBuf, APPLECHAR(' '), kTextBufSize);
+ _textBuf = new byte[TEXT_BUF_SIZE];
+ memset(_textBuf, APPLECHAR(' '), TEXT_BUF_SIZE);
_textBufSurface = new Graphics::Surface;
// For ease of copying, also use 2x scaling here
_textBufSurface->create(DISPLAY_WIDTH * 2, DISPLAY_HEIGHT * 2, Graphics::PixelFormat::createFormatCLUT8());
@@ -193,9 +199,9 @@ bool Display::saveThumbnail(Common::WriteStream &out) {
}
void Display::loadFrameBuffer(Common::ReadStream &stream) {
+ byte *dst = _frameBuf;
for (uint j = 0; j < 8; ++j) {
for (uint i = 0; i < 8; ++i) {
- byte *dst = _frameBuf + DISPLAY_PITCH * (i * 8 + j);
stream.read(dst, DISPLAY_PITCH);
dst += DISPLAY_PITCH * 64;
stream.read(dst, DISPLAY_PITCH);
@@ -203,12 +209,13 @@ void Display::loadFrameBuffer(Common::ReadStream &stream) {
stream.read(dst, DISPLAY_PITCH);
stream.readUint32LE();
stream.readUint32LE();
- dst += DISPLAY_PITCH * 64;
+ dst -= DISPLAY_PITCH * 120;
}
+ dst -= DISPLAY_PITCH * 63;
}
}
-void Display::putPixel(Common::Point p, byte color) {
+void Display::putPixel(const Common::Point &p, byte color) {
byte offset = p.x / 7;
if (offset & 1) {
@@ -230,35 +237,33 @@ void Display::clear(byte color) {
if (c >= 0x40 && c < 0xc0)
val = 0x7f;
- for (uint i = 0; i < DISPLAY_PITCH * DISPLAY_HEIGHT; ++i) {
+ for (uint i = 0; i < DISPLAY_SIZE; ++i) {
_frameBuf[i] = color;
color ^= val;
}
}
void Display::home() {
- memset(_textBuf, APPLECHAR(' '), kTextBufSize);
+ memset(_textBuf, APPLECHAR(' '), TEXT_BUF_SIZE);
_cursorPos = 0;
}
void Display::moveCursorForward() {
++_cursorPos;
- if (_cursorPos >= kTextBufSize)
+ if (_cursorPos >= TEXT_BUF_SIZE)
scrollUp();
}
void Display::moveCursorBackward() {
- --_cursorPos;
-
- if (_cursorPos < 0)
- _cursorPos = 0;
+ if (_cursorPos > 0)
+ --_cursorPos;
}
void Display::moveCursorTo(const Common::Point &pos) {
- _cursorPos = pos.y * 40 + pos.x;
+ _cursorPos = pos.y * TEXT_WIDTH + pos.x;
- if (_cursorPos >= kTextBufSize)
+ if (_cursorPos >= TEXT_BUF_SIZE)
error("Cursor position (%i, %i) out of bounds", pos.x, pos.y);
}
@@ -268,13 +273,13 @@ void Display::printString(const Common::String &str) {
byte b = *c;
if (*c == APPLECHAR('\r'))
- _cursorPos = (_cursorPos / 40 + 1) * 40;
+ _cursorPos = (_cursorPos / TEXT_WIDTH + 1) * TEXT_WIDTH;
else if (b < 0x80 || b >= 0xa0) {
setCharAtCursor(b);
++_cursorPos;
}
- if (_cursorPos == kTextBufSize)
+ if (_cursorPos == TEXT_BUF_SIZE)
scrollUp();
}
@@ -358,8 +363,8 @@ void Display::decodeScanlineColor(byte *dst, int pitch, byte *src) const {
bool odd = false;
- for (uint i = 0; i < 40; ++i) {
- if (i != 39) {
+ for (uint i = 0; i < DISPLAY_PITCH; ++i) {
+ if (i != DISPLAY_PITCH - 1) {
bits |= (src[i + 1] & 0x7f) << 8;
pal |= (src[i + 1] >> 7) << 1;
}
@@ -424,9 +429,9 @@ void Display::decodeScanline(byte *dst, int pitch, byte *src) const {
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];
+ for (uint col = 0; col < TEXT_WIDTH; ++col) {
+ uint charPos = row * TEXT_WIDTH + col;
+ char c = _textBuf[row * TEXT_WIDTH + col];
if (charPos == _cursorPos && _showCursor)
c = (c & 0x3f) | 0x40;
@@ -482,10 +487,10 @@ void Display::createFont() {
}
void Display::scrollUp() {
- memmove(_textBuf, _textBuf + 40, kTextBufSize - 40);
- memset(_textBuf + kTextBufSize - 40, APPLECHAR(' '), 40);
- if (_cursorPos >= 40)
- _cursorPos -= 40;
+ memmove(_textBuf, _textBuf + TEXT_WIDTH, TEXT_BUF_SIZE - TEXT_WIDTH);
+ memset(_textBuf + TEXT_BUF_SIZE - TEXT_WIDTH, APPLECHAR(' '), TEXT_WIDTH);
+ if (_cursorPos >= TEXT_WIDTH)
+ _cursorPos -= TEXT_WIDTH;
}
} // End of namespace Adl
diff --git a/engines/adl/display.h b/engines/adl/display.h
index b93128f6a5..102622e61f 100644
--- a/engines/adl/display.h
+++ b/engines/adl/display.h
@@ -61,7 +61,7 @@ public:
// Graphics
void loadFrameBuffer(Common::ReadStream &stream);
- void putPixel(Common::Point p1, byte color);
+ void putPixel(const Common::Point &p, byte color);
void clear(byte color);
// Text
@@ -99,7 +99,7 @@ private:
byte *_textBuf;
Graphics::Surface *_textBufSurface;
Graphics::Surface *_font;
- int _cursorPos;
+ uint _cursorPos;
bool _showCursor;
};