aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorJohannes Schickel2009-06-22 02:37:57 +0000
committerJohannes Schickel2009-06-22 02:37:57 +0000
commit5767277d8d2910a9f9817a6b845ea5a91caec6bf (patch)
treeaf7c10de3796eab51ea95c099bad9be181e303a8 /engines/kyra
parentd7432e18eae9e6d632addcea1a0dd6933e5b0770 (diff)
downloadscummvm-rg350-5767277d8d2910a9f9817a6b845ea5a91caec6bf.tar.gz
scummvm-rg350-5767277d8d2910a9f9817a6b845ea5a91caec6bf.tar.bz2
scummvm-rg350-5767277d8d2910a9f9817a6b845ea5a91caec6bf.zip
- Fixed regression in Screen::fadeToBlack
- Fixed some palette regressions in Kyra1 Amiga (only the intro works currently) svn-id: r41746
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/screen.cpp58
-rw-r--r--engines/kyra/screen.h10
-rw-r--r--engines/kyra/screen_lol.cpp15
-rw-r--r--engines/kyra/sequences_lok.cpp2
4 files changed, 58 insertions, 27 deletions
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index e4f7e05dde..deee1cfb60 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -126,11 +126,9 @@ bool Screen::init() {
_screenPalette = new Palette(256);
assert(_screenPalette);
- _tempPalette = new Palette(_screenPalette->getNumColors());
- assert(_tempPalette);
if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
- for (int i = 0; i < 7; ++i) {
+ for (int i = 0; i < 12; ++i) {
_palettes[i] = new Palette(32);
assert(_palettes[i]);
}
@@ -141,6 +139,9 @@ bool Screen::init() {
}
}
+ _internFadePalette = new Palette(_palettes[0]->getNumColors());
+ assert(_internFadePalette);
+
setScreenPalette(getPalette(0));
_curDim = 0;
@@ -496,8 +497,8 @@ void Screen::fadeFromBlack(int delay, const UpdateFunctor *upFunc) {
}
void Screen::fadeToBlack(int delay, const UpdateFunctor *upFunc) {
- _tempPalette->clear();
- fadePalette(*_tempPalette, delay, upFunc);
+ Palette pal(getPalette(0).getNumColors());
+ fadePalette(pal, delay, upFunc);
}
void Screen::fadePalette(const Palette &pal, int delay, const UpdateFunctor *upFunc) {
@@ -554,13 +555,13 @@ void Screen::getFadeParams(const Palette &pal, int delay, int &delayInc, int &di
}
int Screen::fadePalStep(const Palette &pal, int diff) {
- _tempPalette->copy(*_screenPalette);
+ _internFadePalette->copy(*_screenPalette);
bool needRefresh = false;
for (int i = 0; i < pal.getNumColors() * 3; ++i) {
int c1 = pal[i];
- int c2 = (*_tempPalette)[i];
+ int c2 = (*_internFadePalette)[i];
if (c1 != c2) {
needRefresh = true;
if (c1 > c2) {
@@ -575,12 +576,12 @@ int Screen::fadePalStep(const Palette &pal, int diff) {
c2 = c1;
}
- (*_tempPalette)[i] = (uint8)c2;
+ (*_internFadePalette)[i] = (uint8)c2;
}
}
if (needRefresh)
- setScreenPalette(*_tempPalette);
+ setScreenPalette(*_internFadePalette);
return needRefresh ? 1 : 0;
}
@@ -2642,7 +2643,7 @@ void Screen::setMouseCursor(int x, int y, const byte *shape) {
}
Palette &Screen::getPalette(int num) {
- assert(num >= 0 && num < (_vm->gameFlags().platform == Common::kPlatformAmiga ? 7 : 4));
+ assert(num >= 0 && num < (_vm->gameFlags().platform == Common::kPlatformAmiga ? 12 : 4));
return *_palettes[num];
}
@@ -2828,9 +2829,37 @@ bool Screen::loadPalette(const char *filename, Palette &pal) {
debugC(3, kDebugLevelScreen, "Screen::loadPalette('%s', %p)", filename, (const void *)&pal);
if (_vm->gameFlags().platform == Common::kPlatformAmiga)
- pal.loadAmigaPalette(*stream, stream->size() / 2);
+ pal.loadAmigaPalette(*stream, stream->size() / Palette::kAmigaBytesPerColor);
else
- pal.loadVGAPalette(*stream, stream->size() / 3);
+ pal.loadVGAPalette(*stream, stream->size() / Palette::kVGABytesPerColor);
+
+ delete stream;
+ return true;
+}
+
+bool Screen::loadPaletteTable(const char *filename, int firstPalette) {
+ Common::SeekableReadStream *stream = _vm->resource()->createReadStream(filename);
+
+ if (!stream)
+ return false;
+
+ debugC(3, kDebugLevelScreen, "Screen::loadPaletteTable('%s', %d)", filename, firstPalette);
+
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ const int numColors = getPalette(firstPalette).getNumColors();
+ const int palSize = getPalette(firstPalette).getNumColors() * Palette::kAmigaBytesPerColor;
+ const int numPals = stream->size() / palSize;
+
+ for (int i = 0; i < numPals; ++i)
+ getPalette(i + firstPalette).loadAmigaPalette(*stream, numColors);
+ } else {
+ const int numColors = getPalette(firstPalette).getNumColors();
+ const int palSize = getPalette(firstPalette).getNumColors() * Palette::kVGABytesPerColor;
+ const int numPals = stream->size() / palSize;
+
+ for (int i = 0; i < numPals; ++i)
+ getPalette(i + firstPalette).loadVGAPalette(*stream, numColors);
+ }
delete stream;
return true;
@@ -3240,10 +3269,7 @@ void Palette::loadAmigaPalette(Common::ReadStream &stream, int colors) {
assert(colors <= _numColors);
- assert(colors % 2 == 0);
- assert(colors / 2 <= 256);
-
- for (int i = 0; i < (colors >> 1); ++i) {
+ for (int i = 0; i < colors; ++i) {
uint16 col = stream.readUint16BE();
_palData[i * 3 + 2] = (col & 0xF) << 2; col >>= 4;
_palData[i * 3 + 1] = (col & 0xF) << 2; col >>= 4;
diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h
index b35b2dd3af..b4541a53fb 100644
--- a/engines/kyra/screen.h
+++ b/engines/kyra/screen.h
@@ -72,6 +72,11 @@ public:
Palette(const int numColors);
~Palette();
+ enum {
+ kVGABytesPerColor = 3,
+ kAmigaBytesPerColor = 2
+ };
+
/**
* Load a VGA palette from the given stream.
*/
@@ -287,6 +292,7 @@ public:
void loadBitmap(const char *filename, int tempPage, int dstPage, Palette *pal, bool skip=false);
bool loadPalette(const char *filename, Palette &pal);
+ bool loadPaletteTable(const char *filename, int firstPalette);
void loadPalette(const byte *data, Palette &pal, int bytes);
void setAnimBlockPtr(int size);
@@ -360,8 +366,8 @@ protected:
uint8 _sjisInvisibleColor;
Palette *_screenPalette;
- Palette *_palettes[7];
- Palette *_tempPalette;
+ Palette *_palettes[12];
+ Palette *_internFadePalette;
Font _fonts[FID_NUM];
uint8 _textColorsMap[16];
diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp
index fc8740a9d3..f2d6a2565e 100644
--- a/engines/kyra/screen_lol.cpp
+++ b/engines/kyra/screen_lol.cpp
@@ -861,8 +861,8 @@ void Screen_LoL::copyColor(int dstColorIndex, int srcColorIndex) {
}
bool Screen_LoL::fadeColor(int dstColorIndex, int srcColorIndex, uint32 elapsedTime, uint32 targetTime) {
- uint8 *dst = _screenPalette->getData() + 3 * dstColorIndex;
- uint8 *src = _screenPalette->getData() + 3 * srcColorIndex;
+ const uint8 *dst = _screenPalette->getData() + 3 * dstColorIndex;
+ const uint8 *src = _screenPalette->getData() + 3 * srcColorIndex;
uint8 *p = getPalette(1).getData() + 3 * dstColorIndex;
bool res = false;
@@ -896,10 +896,9 @@ bool Screen_LoL::fadeColor(int dstColorIndex, int srcColorIndex, uint32 elapsedT
p++;
}
- _tempPalette->copy(*_screenPalette);
- _tempPalette->copy(*_screenPalette);
- _tempPalette->copy(tmpPalEntry, 0, 1, dstColorIndex);
- setScreenPalette(*_tempPalette);
+ _internFadePalette->copy(*_screenPalette);
+ _internFadePalette->copy(tmpPalEntry, 0, 1, dstColorIndex);
+ setScreenPalette(*_internFadePalette);
updateScreen();
return res;
@@ -924,10 +923,10 @@ bool Screen_LoL::fadePaletteStep(uint8 *pal1, uint8 *pal2, uint32 elapsedTime, u
res = false;
}
- (*_tempPalette)[i] = out;
+ (*_internFadePalette)[i] = out;
}
- setScreenPalette(*_tempPalette);
+ setScreenPalette(*_internFadePalette);
updateScreen();
return res;
diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp
index 1bc512adf5..d483409090 100644
--- a/engines/kyra/sequences_lok.cpp
+++ b/engines/kyra/sequences_lok.cpp
@@ -141,7 +141,7 @@ void KyraEngine_LoK::seq_introLogos() {
_screen->clearPage(0);
if (_flags.platform == Common::kPlatformAmiga) {
- _screen->loadPalette("INTRO.PAL", _screen->getPalette(0));
+ _screen->loadPaletteTable("INTRO.PAL", 0);
_screen->loadBitmap("BOTTOM.CPS", 3, 5, 0);
_screen->loadBitmap("TOP.CPS", 3, 3, 0);
_screen->copyRegion(0, 0, 0, 111, 320, 64, 2, 0);