aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/screen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/kyra/screen.cpp')
-rw-r--r--engines/kyra/screen.cpp134
1 files changed, 125 insertions, 9 deletions
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index 1ca67fc1d1..ca736aac7b 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -793,6 +793,10 @@ bool Screen::loadFont(FontId fontId, const char *filename) {
debugC(9, kDebugLevelScreen, "Screen::loadFont(%d, '%s')", fontId, filename);
Font *fnt = &_fonts[fontId];
+ // FIXME: add font support for amiga version
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return true;
+
if (!fnt)
error("fontId %d is invalid", fontId);
@@ -827,14 +831,23 @@ Screen::FontId Screen::setFont(FontId fontId) {
}
int Screen::getFontHeight() const {
+ // FIXME: add font support for amiga version
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return 0;
return *(_fonts[_currentFont].fontData + _fonts[_currentFont].charSizeOffset + 4);
}
int Screen::getFontWidth() const {
+ // FIXME: add font support for amiga version
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return 0;
return *(_fonts[_currentFont].fontData + _fonts[_currentFont].charSizeOffset + 5);
}
int Screen::getCharWidth(uint16 c) const {
+ // FIXME: add font support for amiga version
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return 0;
debugC(9, kDebugLevelScreen, "Screen::getCharWidth('%c'|%d)", c & 0xFF, c);
if (c & 0xFF00)
return SJIS_CHARSIZE >> 1;
@@ -842,6 +855,9 @@ int Screen::getCharWidth(uint16 c) const {
}
int Screen::getTextWidth(const char *str) const {
+ // FIXME: add font support for amiga version
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return 0;
debugC(9, kDebugLevelScreen, "Screen::getTextWidth('%s')", str);
int curLineLen = 0;
@@ -872,6 +888,9 @@ int Screen::getTextWidth(const char *str) const {
}
void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2) {
+ // FIXME: add font support for amiga version
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return;
debugC(9, kDebugLevelScreen, "Screen::printText('%s', %d, %d, 0x%X, 0x%X)", str, x, y, color1, color2);
uint8 cmap[2];
cmap[0] = color2;
@@ -1598,15 +1617,26 @@ uint Screen::decodeFrame4(const uint8 *src, uint8 *dst, uint32 dstSize) {
return dst - dstOrig;
}
-void Screen::decodeFrameDelta(uint8 *dst, const uint8 *src) {
- debugC(9, kDebugLevelScreen, "Screen::decodeFrameDelta(%p, %p)", (const void *)dst, (const void *)src);
+void Screen::decodeFrameDelta(uint8 *dst, const uint8 *src, bool noXor) {
+ debugC(9, kDebugLevelScreen, "Screen::decodeFrameDelta(%p, %p, %d)", (const void *)dst, (const void *)src, noXor);
+ if (noXor)
+ wrapped_decodeFrameDelta<true>(dst, src);
+ else
+ wrapped_decodeFrameDelta<false>(dst, src);
+}
+
+template <bool noXor>
+void Screen::wrapped_decodeFrameDelta(uint8 *dst, const uint8 *src) {
while (1) {
uint8 code = *src++;
if (code == 0) {
uint8 len = *src++;
code = *src++;
while (len--) {
- *dst++ ^= code;
+ if (noXor)
+ *dst++ = code;
+ else
+ *dst++ ^= code;
}
} else if (code & 0x80) {
code -= 0x80;
@@ -1622,11 +1652,17 @@ void Screen::decodeFrameDelta(uint8 *dst, const uint8 *src) {
uint16 len = subcode - 0x4000;
code = *src++;
while (len--) {
- *dst++ ^= code;
+ if (noXor)
+ *dst++ = code;
+ else
+ *dst++ ^= code;
}
} else {
while (subcode--) {
- *dst++ ^= *src++;
+ if (noXor)
+ *dst++ = *src++;
+ else
+ *dst++ ^= *src++;
}
}
} else {
@@ -1635,7 +1671,10 @@ void Screen::decodeFrameDelta(uint8 *dst, const uint8 *src) {
}
} else {
while (code--) {
- *dst++ ^= *src++;
+ if (noXor)
+ *dst++ = *src++;
+ else
+ *dst++ ^= *src++;
}
}
}
@@ -1651,9 +1690,54 @@ void Screen::decodeFrameDeltaPage(uint8 *dst, const uint8 *src, int pitch, bool
}
}
+void Screen::convertAmigaGfx(uint8 *data, int w, int h, bool offscreen) {
+ static uint8 tmp[320*200];
+
+ if (offscreen) {
+ uint8 *curLine = tmp;
+ const uint8 *src = data;
+ int hC = h;
+ while (hC--) {
+ uint8 *dst1 = curLine;
+ uint8 *dst2 = dst1 + 8000;
+ uint8 *dst3 = dst2 + 8000;
+ uint8 *dst4 = dst3 + 8000;
+ uint8 *dst5 = dst4 + 8000;
+
+ int width = w >> 3;
+ while (width--) {
+ *dst1++ = *src++;
+ *dst2++ = *src++;
+ *dst3++ = *src++;
+ *dst4++ = *src++;
+ *dst5++ = *src++;
+ }
+
+ curLine += 40;
+ }
+ } else {
+ memcpy(tmp, data, w*h);
+ }
+
+ int planeOffset = 8000;
+ for (int y = 0; y < h; ++y) {
+ for (int x = 0; x < w; ++x) {
+ int bytePos = x/8+y*40;
+ int bitPos = 7-x&7;
+
+ byte colorIndex = 0;
+ colorIndex |= (((tmp[bytePos + planeOffset * 0] & (1 << bitPos)) >> bitPos) & 0x1) << 0;
+ colorIndex |= (((tmp[bytePos + planeOffset * 1] & (1 << bitPos)) >> bitPos) & 0x1) << 1;
+ colorIndex |= (((tmp[bytePos + planeOffset * 2] & (1 << bitPos)) >> bitPos) & 0x1) << 2;
+ colorIndex |= (((tmp[bytePos + planeOffset * 3] & (1 << bitPos)) >> bitPos) & 0x1) << 3;
+ colorIndex |= (((tmp[bytePos + planeOffset * 4] & (1 << bitPos)) >> bitPos) & 0x1) << 4;
+ *data++ = colorIndex;
+ }
+ }
+}
+
template<bool noXor>
void Screen::wrapped_decodeFrameDeltaPage(uint8 *dst, const uint8 *src, int pitch) {
- debugC(9, kDebugLevelScreen, "Screen::wrapped_decodeFrameDeltaPage(%p, %p, %d)", (const void *)dst, (const void *)src, pitch);
int count = 0;
uint8 *dstNext = dst;
while (1) {
@@ -2473,6 +2557,10 @@ void Screen::loadBitmap(const char *filename, int tempPage, int dstPage, uint8 *
break;
}
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ Screen::convertAmigaGfx(dstData, 320, 200, false);
+ }
+
delete [] srcData;
}
@@ -2483,14 +2571,42 @@ void Screen::loadPalette(const char *filename, uint8 *palData) {
if (palData && fileSize) {
debugC(9, kDebugLevelScreen,"Loading a palette of size %i from '%s'", fileSize, filename);
- memcpy(palData, srcData, fileSize);
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ assert(fileSize % 2 == 0);
+ assert(fileSize / 2 <= 256);
+ fileSize >>= 1;
+ const uint16 *src = (const uint16 *)srcData;
+ for (uint i = 0; i < fileSize; ++i) {
+ uint16 col = READ_BE_UINT16(src); ++src;
+ palData[2] = (col & 0xF) << 2; col >>= 4;
+ palData[1] = (col & 0xF) << 2; col >>= 4;
+ palData[0] = (col & 0xF) << 2; col >>= 4;
+ palData += 3;
+ }
+ } else {
+ memcpy(palData, srcData, fileSize);
+ }
}
delete [] srcData;
}
void Screen::loadPalette(const byte *data, uint8 *palData, int bytes) {
debugC(9, kDebugLevelScreen, "Screen::loadPalette(%p, %p %d)", (const void *)data, (void *)palData, bytes);
- memcpy(palData, data, bytes);
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ assert(bytes % 2 == 0);
+ assert(bytes / 2 <= 256);
+ bytes >>= 1;
+ const uint16 *src = (const uint16 *)data;
+ for (int i = 0; i < bytes; ++i) {
+ uint16 col = READ_BE_UINT16(src); ++src;
+ palData[2] = (col & 0xF) << 2; col >>= 4;
+ palData[1] = (col & 0xF) << 2; col >>= 4;
+ palData[0] = (col & 0xF) << 2; col >>= 4;
+ palData += 3;
+ }
+ } else {
+ memcpy(palData, data, bytes);
+ }
}
// kyra3 specific