aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2009-06-25 15:22:08 +0000
committerJohannes Schickel2009-06-25 15:22:08 +0000
commit0ef8d1ffed66d6677b0dff850e4d35d745e93aee (patch)
treef040e0c1f12f356f3459d8a246737754886bdbaf
parent8343bc6cc05dfbc8480306cfb60fe8cde593deb5 (diff)
downloadscummvm-rg350-0ef8d1ffed66d6677b0dff850e4d35d745e93aee.tar.gz
scummvm-rg350-0ef8d1ffed66d6677b0dff850e4d35d745e93aee.tar.bz2
scummvm-rg350-0ef8d1ffed66d6677b0dff850e4d35d745e93aee.zip
Implement proper color index conversion for Lands of Lore PC98. (The intro and menu screen work fine now)
svn-id: r41867
-rw-r--r--engines/kyra/screen.h1
-rw-r--r--engines/kyra/screen_lol.cpp24
-rw-r--r--engines/kyra/screen_lol.h6
-rw-r--r--engines/kyra/staticres.cpp36
4 files changed, 67 insertions, 0 deletions
diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h
index 6b3a09ab34..a37cbc0cfd 100644
--- a/engines/kyra/screen.h
+++ b/engines/kyra/screen.h
@@ -327,6 +327,7 @@ public:
static uint decodeFrame4(const uint8 *src, uint8 *dst, uint32 dstSize);
static void decodeFrameDelta(uint8 *dst, const uint8 *src, bool noXor = false);
static void decodeFrameDeltaPage(uint8 *dst, const uint8 *src, const int pitch, bool noXor);
+
static void convertAmigaGfx(uint8 *data, int w, int h, bool offscreen = true);
static void convertAmigaMsc(uint8 *data);
diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp
index e66c1d4a4a..54d64aa71c 100644
--- a/engines/kyra/screen_lol.cpp
+++ b/engines/kyra/screen_lol.cpp
@@ -971,6 +971,30 @@ uint8 Screen_LoL::getShapePaletteSize(const uint8 *shp) {
return shp[10];
}
+void Screen_LoL::mergeOverlay(int x, int y, int w, int h) {
+ // For now we convert to 16 colors on overlay merging. If that gives
+ // any problems, like Screen functionallity not prepared for the
+ // format PC98 16 color uses, we'll need to think of a better way.
+ //
+ // We must do this before merging the overlay, else the font colors
+ // will be wrong.
+ if (_use16ColorMode)
+ convertPC98Gfx(_sjisOverlayPtrs[0] + y * 640 + x, w, h, 640);
+
+ Screen_v2::mergeOverlay(x, y, w, h);
+}
+
+void Screen_LoL::convertPC98Gfx(uint8 *data, int w, int h, int pitch) {
+ while (h--) {
+ for (int i = 0; i < w; ++i) {
+ *data = _paletteConvTable[*data];
+ ++data;
+ }
+
+ data += pitch - w;
+ }
+}
+
} // end of namespace Kyra
#endif // ENABLE_LOL
diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h
index 017af4ba48..278118ea1c 100644
--- a/engines/kyra/screen_lol.h
+++ b/engines/kyra/screen_lol.h
@@ -92,6 +92,9 @@ public:
uint8 *_grayOverlay;
int _fadeFlag;
+ // PC98 specific
+ static void convertPC98Gfx(uint8 *data, int w, int h, int pitch);
+
private:
LoLEngine *_vm;
@@ -106,6 +109,9 @@ private:
uint8 *_levelOverlays[8];
+ static const uint8 _paletteConvTable[256];
+ void mergeOverlay(int x, int y, int w, int h);
+
// magic atlas
void calcBoundariesIntern(int dstX, int dstY, int c, int d);
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index 86680a7b76..e8597c8326 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -3159,6 +3159,42 @@ const ScreenDim Screen_LoL::_screenDimTable16C[] = {
const int Screen_LoL::_screenDimTableCount = ARRAYSIZE(Screen_LoL::_screenDimTable256C);
+// 256 -> 16 color conversion table
+const uint8 Screen_LoL::_paletteConvTable[256] = {
+ 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x7,
+ 0x0, 0x9, 0x0, 0xB, 0x0, 0xD, 0x0, 0xF,
+ 0x1, 0x1, 0x1, 0x3, 0x1, 0x5, 0x1, 0x7,
+ 0x1, 0x9, 0x1, 0xB, 0x1, 0xD, 0x1, 0xF,
+ 0x2, 0x1, 0x2, 0x3, 0x2, 0x5, 0x2, 0x7,
+ 0x2, 0x9, 0x2, 0xB, 0x2, 0xD, 0x2, 0xF,
+ 0x3, 0x1, 0x3, 0x3, 0x3, 0x5, 0x3, 0x7,
+ 0x3, 0x9, 0x3, 0xB, 0x3, 0xD, 0x3, 0xF,
+ 0x4, 0x1, 0x4, 0x3, 0x4, 0x5, 0x4, 0x7,
+ 0x4, 0x9, 0x4, 0xB, 0x4, 0xD, 0x4, 0xF,
+ 0x5, 0x1, 0x5, 0x3, 0x5, 0x5, 0x5, 0x7,
+ 0x5, 0x9, 0x5, 0xB, 0x5, 0xD, 0x5, 0xF,
+ 0x6, 0x1, 0x6, 0x3, 0x6, 0x5, 0x6, 0x7,
+ 0x6, 0x9, 0x6, 0xB, 0x6, 0xD, 0x6, 0xF,
+ 0x7, 0x1, 0x7, 0x3, 0x7, 0x5, 0x7, 0x7,
+ 0x7, 0x9, 0x7, 0xB, 0x7, 0xD, 0x7, 0xF,
+ 0x8, 0x1, 0x8, 0x3, 0x8, 0x5, 0x8, 0x7,
+ 0x8, 0x9, 0x8, 0xB, 0x8, 0xD, 0x8, 0xF,
+ 0x9, 0x1, 0x9, 0x3, 0x9, 0x5, 0x9, 0x7,
+ 0x9, 0x9, 0x9, 0xB, 0x9, 0xD, 0x9, 0xF,
+ 0xA, 0x1, 0xA, 0x3, 0xA, 0x5, 0xA, 0x7,
+ 0xA, 0x9, 0xA, 0xB, 0xA, 0xD, 0xA, 0xF,
+ 0xB, 0x1, 0xB, 0x3, 0xB, 0x5, 0xB, 0x7,
+ 0xB, 0x9, 0xB, 0xB, 0xB, 0xD, 0xB, 0xF,
+ 0xC, 0x1, 0xC, 0x3, 0xC, 0x5, 0xC, 0x7,
+ 0xC, 0x9, 0xC, 0xB, 0xC, 0xD, 0xC, 0xF,
+ 0xD, 0x1, 0xD, 0x3, 0xD, 0x5, 0xD, 0x7,
+ 0xD, 0x9, 0xD, 0xB, 0xD, 0xD, 0xD, 0xF,
+ 0xE, 0x1, 0xE, 0x3, 0xE, 0x5, 0xE, 0x7,
+ 0xE, 0x9, 0xE, 0xB, 0xE, 0xD, 0xE, 0xF,
+ 0xF, 0x1, 0xF, 0x3, 0xF, 0x5, 0xF, 0x7,
+ 0xF, 0x9, 0xF, 0xB, 0xF, 0xD, 0xF, 0xF
+};
+
const char * const LoLEngine::_languageExt[] = {
"ENG",
"FRE",