aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorathrxx2012-02-14 18:31:33 +0100
committerathrxx2012-02-21 21:48:43 +0100
commitdf9b1bd2e4f70b3d9b2ad35ce806d0da4de253fe (patch)
tree2d8167796d7724aa641964bb5a8e5255caffb4a3 /engines/kyra
parenta4223e9c2ba7d53097df95a3f640ffdba7d0fb20 (diff)
downloadscummvm-rg350-df9b1bd2e4f70b3d9b2ad35ce806d0da4de253fe.tar.gz
scummvm-rg350-df9b1bd2e4f70b3d9b2ad35ce806d0da4de253fe.tar.bz2
scummvm-rg350-df9b1bd2e4f70b3d9b2ad35ce806d0da4de253fe.zip
KYRA: (EOB) - implement EGA graphics mode for EOB1
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/eobcommon.cpp2
-rw-r--r--engines/kyra/items_eob.cpp2
-rw-r--r--engines/kyra/scene_rpg.cpp2
-rw-r--r--engines/kyra/screen.cpp11
-rw-r--r--engines/kyra/screen_eob.cpp110
-rw-r--r--engines/kyra/screen_eob.h1
-rw-r--r--engines/kyra/sequences_eob.cpp4
7 files changed, 76 insertions, 56 deletions
diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp
index ecac20a7f8..9bec256ec7 100644
--- a/engines/kyra/eobcommon.cpp
+++ b/engines/kyra/eobcommon.cpp
@@ -390,7 +390,7 @@ Common::Error EoBCoreEngine::init() {
if (!_staticres->init())
error("_staticres->init() failed");
- if (!screen()->init())
+ if (!_screen->init(_flags.gameID == GI_EOB2 && _configRenderMode == Common::kRenderEGA))
error("screen()->init() failed");
if (ConfMan.hasKey("save_slot")) {
diff --git a/engines/kyra/items_eob.cpp b/engines/kyra/items_eob.cpp
index 5b65887d4b..0994e12e4f 100644
--- a/engines/kyra/items_eob.cpp
+++ b/engines/kyra/items_eob.cpp
@@ -465,7 +465,7 @@ void EoBCoreEngine::drawItemIconShape(int pageNum, Item itemId, int x, int y) {
const uint8 *ovl = 0;
if (applyBluePal) {
- if (_flags.gameID == GI_EOB1) {
+ if (_flags.gameID == GI_EOB1) {
ovl = (_configRenderMode == Common::kRenderCGA) ? _itemsOverlayCGA : &_itemsOverlay[icn << 4];
} else {
_screen->setFadeTableIndex(3);
diff --git a/engines/kyra/scene_rpg.cpp b/engines/kyra/scene_rpg.cpp
index 7f6b16bfc6..da7c9fdb90 100644
--- a/engines/kyra/scene_rpg.cpp
+++ b/engines/kyra/scene_rpg.cpp
@@ -111,7 +111,7 @@ void KyraRpgEngine::setDoorShapeDim(int index, int16 &y1, int16 &y2, int dim) {
a += _dscDoorFrameIndex1[_currentLevel - 1];
b += _dscDoorFrameIndex2[_currentLevel - 1];
}
-
+
y1 = _dscDoorFrameY1[a];
y2 = _dscDoorFrameY2[b];
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index d394a86f6f..3087a8a027 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -648,6 +648,9 @@ void Screen::fadeFromBlack(int delay, const UpdateFunctor *upFunc) {
}
void Screen::fadeToBlack(int delay, const UpdateFunctor *upFunc) {
+ if (_renderMode == Common::kRenderEGA)
+ return;
+
Palette pal(getPalette(0).getNumColors());
fadePalette(pal, delay, upFunc);
}
@@ -1038,7 +1041,9 @@ void Screen::fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum,
color &= 0x0F;
color |= (color << 4);
} else if (_renderMode == Common::kRenderCGA) {
- color &= 3;
+ color &= 0x03;
+ } else if (_renderMode == Common::kRenderEGA) {
+ color &= 0x0F;
}
if (xored) {
@@ -1117,7 +1122,9 @@ void Screen::drawLine(bool vertical, int x, int y, int length, int color) {
color &= 0x0F;
color |= (color << 4);
} else if (_renderMode == Common::kRenderCGA) {
- color &= 3;
+ color &= 0x03;
+ } else if (_renderMode == Common::kRenderEGA) {
+ color &= 0x0F;
}
if (vertical) {
diff --git a/engines/kyra/screen_eob.cpp b/engines/kyra/screen_eob.cpp
index 8721c2cc02..51665a00b1 100644
--- a/engines/kyra/screen_eob.cpp
+++ b/engines/kyra/screen_eob.cpp
@@ -70,6 +70,10 @@ Screen_EoB::~Screen_EoB() {
}
bool Screen_EoB::init() {
+ return init(false);
+}
+
+bool Screen_EoB::init(bool useHiResEGADithering) {
if (Screen::init()) {
int temp;
_gfxMaxY = _vm->staticres()->loadRawData(kEoBBaseExpObjectY, temp);
@@ -91,6 +95,7 @@ bool Screen_EoB::init() {
_dsTempPage = new uint8[12000];
if (_renderMode == Common::kRenderEGA) {
+ _useHiResEGADithering = useHiResEGADithering;
_egaColorMap = new uint8[256];
_egaPixelValueTable = new uint8[256];
for (int i = 0; i < 256; i++) {
@@ -98,9 +103,6 @@ bool Screen_EoB::init() {
_egaPixelValueTable[i] = i & 0x0f;
}
- if (_vm->game() == GI_EOB2)
- _useHiResEGADithering = true;
-
} else if (_renderMode == Common::kRenderCGA) {
_cgaMappingDefault = _vm->staticres()->loadRawData(kEoB1CgaMappingDefault, temp);
_cgaDitheringTables[0] = new uint16[256];
@@ -346,6 +348,9 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco
uint8 *srcLineStart = getPagePtr(_curPage | 1) + y * 320 + (x << 3);
uint8 *src = srcLineStart;
+ if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering)
+ encode8bit = false;
+
if (_renderMode == Common::kRenderCGA) {
if (cgaMapping)
generateCGADitheringTables(cgaMapping);
@@ -450,8 +455,12 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco
} else {
uint8 nib = 0, col = 0;
- uint8 *colorMap = new uint8[0x100];
- memset(colorMap, 0xff, 0x100);
+ uint8 *colorMap = 0;
+
+ if (_renderMode != Common::kRenderEGA) {
+ colorMap = new uint8[0x100];
+ memset(colorMap, 0xff, 0x100);
+ }
shapesize = h * (w << 2) + 20;
shp = new uint8[shapesize];
@@ -462,7 +471,13 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco
*dst++ = (h & 0xff);
*dst++ = (w & 0xff);
*dst++ = (h & 0xff);
- memset(dst, 0xff, 0x10);
+
+ if (_renderMode == Common::kRenderEGA) {
+ for (int i = 0; i < 16; i++)
+ dst[i] = i;
+ } else {
+ memset(dst, 0xff, 0x10);
+ }
uint8 *pal = dst;
dst += 16;
@@ -473,15 +488,18 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco
uint16 w1 = w << 3;
while (w1--) {
uint8 s = *src++;
- uint8 c = colorMap[s];
- if (c == 0xff) {
- if (col < 0x10) {
- *pal++ = s;
- c = colorMap[s] = col++;
- if (!col)
+ uint8 c = s & 0x0f;
+ if (colorMap) {
+ c = colorMap[s];
+ if (c == 0xff) {
+ if (col < 0x10) {
+ *pal++ = s;
+ c = colorMap[s] = col++;
+ if (!col)
+ c = 0;
+ } else {
c = 0;
- } else {
- c = 0;
+ }
}
}
@@ -782,12 +800,9 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y,
src += pixelStep;
shSwtch = bitShDef;
}
- if (pixelsPerByte == 2) {
- if (pal[(in >> shift) & pixelPackingMask])
- drawShapeSetPixel(dst, pal[(in >> shift) & pixelPackingMask]);
- } else {
- *dst = (*dst & ((trans >> shift) & (pixelPackingMask))) | pal[(in >> shift) & pixelPackingMask];
- }
+ uint8 col = (pixelsPerByte == 2) ? pal[(in >> shift) & pixelPackingMask] : (*dst & ((trans >> shift) & (pixelPackingMask))) | pal[(in >> shift) & pixelPackingMask];
+ if (col || pixelsPerByte == 4)
+ drawShapeSetPixel(dst, col);
dst++;
shift = (shift - (pixelStep * pixelPacking) & 7);
}
@@ -819,11 +834,11 @@ const uint8 *Screen_EoB::scaleShapeStep(const uint8 *shp) {
uint16 w2 = (w << 3) / pixelsPerByte;
uint16 t = ((w << 1) % 3) ? 1 : 0;
d[1] = ((w << 1) / 3) + t;
-
+
uint32 transOffsetSrc = (pixelsPerByte == 4) ? (shp[0] * shp[1]) << 1 : 0;
uint32 transOffsetDst = (pixelsPerByte == 4) ? (d[0] * d[1]) << 1 : 0;
shp += 3;
- d += 3;
+ d += 3;
if (pixelsPerByte == 2) {
int i = 0;
@@ -1252,19 +1267,21 @@ const uint16 *Screen_EoB::getCGADitheringTable(int index) {
}
void Screen_EoB::drawShapeSetPixel(uint8 *dst, uint8 c) {
- if (_shapeFadeMode[0]) {
- if (_shapeFadeMode[1]) {
- c = *dst;
- } else {
- _shapeFadeInternal &= 7;
- c = *(dst + _shapeFadeInternal++);
+ if ((_renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA) || _useHiResEGADithering) {
+ if (_shapeFadeMode[0]) {
+ if (_shapeFadeMode[1]) {
+ c = *dst;
+ } else {
+ _shapeFadeInternal &= 7;
+ c = *(dst + _shapeFadeInternal++);
+ }
}
- }
- if (_shapeFadeMode[1]) {
- uint8 cnt = _shapeFadeMode[1];
- while (cnt--)
- c = _fadeData[_fadeDataIndex + c];
+ if (_shapeFadeMode[1]) {
+ uint8 cnt = _shapeFadeMode[1];
+ while (cnt--)
+ c = _fadeData[_fadeDataIndex + c];
+ }
}
*dst = c;
@@ -1485,6 +1502,11 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const {
uint16 cgaMask1 = cgaColorMask[color1 & 3];
uint16 cgaMask2 = cgaColorMask[color2 & 3];
+ if (_renderMode == Common::kRenderCGA) {
+ color1 &= 0x0f;
+ color2 &= 0x0f;
+ }
+
int cH = _height;
while (cH--) {
int cW = w;
@@ -1525,6 +1547,7 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const {
}
last = s;
+
} else {
for (bool runWidthLoop = true; runWidthLoop;) {
uint8 s = *src++;
@@ -1536,22 +1559,11 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const {
break;
}
- if (_renderMode == Common::kRenderCGA) {
- uint8 in = s | last;
- if (s & i) {
- if (color1)
- *dst = color1;
- } else if (color2) {
- *dst = color2;
- }
- last = s;
- } else {
- if (s & i) {
- if (color1)
- *dst = color1;
- } else if (color2) {
- *dst = color2;
- }
+ if (s & i) {
+ if (color1)
+ *dst = color1;
+ } else if (color2) {
+ *dst = color2;
}
dst++;
}
diff --git a/engines/kyra/screen_eob.h b/engines/kyra/screen_eob.h
index dc6c4b200f..cf8f86953d 100644
--- a/engines/kyra/screen_eob.h
+++ b/engines/kyra/screen_eob.h
@@ -36,6 +36,7 @@ public:
virtual ~Screen_EoB();
bool init();
+ bool init(bool useHiResEGADithering);
void setClearScreenDim(int dim);
void clearCurDim();
diff --git a/engines/kyra/sequences_eob.cpp b/engines/kyra/sequences_eob.cpp
index aa8d18fe77..4a9f7d8a65 100644
--- a/engines/kyra/sequences_eob.cpp
+++ b/engines/kyra/sequences_eob.cpp
@@ -119,12 +119,12 @@ void EoBIntroPlayer::start() {
Common::SeekableReadStream *s = _vm->resource()->createReadStream("TEXT.RAW");
if (s) {
s->seek(768);
- _screen->loadFileDataToPage(s, 6, s->size() - 768);
+ _screen->loadFileDataToPage(s, 5, s->size() - 768);
delete s;
} else {
_screen->loadBitmap("TEXT.CMP", 3, 5, 0);
- _screen->convertPage(5, 6, _vm->_cgaMappingAlt);
}
+ _screen->convertPage(5, 6, _vm->_cgaMappingAlt);
tower();
orb();