diff options
author | Martin Kiewitz | 2010-06-20 20:52:31 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-06-20 20:52:31 +0000 |
commit | 4a83b2c5f6a0b43c25d8870168baca9a76eee103 (patch) | |
tree | a5d7275bacb32c023f0dc796a22fe88227500ea5 | |
parent | d79428e816af4a73a21d6c350c5a266af01a08de (diff) | |
download | scummvm-rg350-4a83b2c5f6a0b43c25d8870168baca9a76eee103.tar.gz scummvm-rg350-4a83b2c5f6a0b43c25d8870168baca9a76eee103.tar.bz2 scummvm-rg350-4a83b2c5f6a0b43c25d8870168baca9a76eee103.zip |
SCI: properly implement kPalVary functionality within kDrawPic and transitions, so pharkas finally works w/o palette corruption
svn-id: r50099
-rw-r--r-- | engines/sci/graphics/frameout.cpp | 2 | ||||
-rw-r--r-- | engines/sci/graphics/paint16.cpp | 5 | ||||
-rw-r--r-- | engines/sci/graphics/palette.cpp | 77 | ||||
-rw-r--r-- | engines/sci/graphics/palette.h | 5 | ||||
-rw-r--r-- | engines/sci/graphics/transitions.cpp | 2 |
5 files changed, 63 insertions, 28 deletions
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 545121c2b8..05c2a1b7ad 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -161,7 +161,7 @@ void GfxFrameout::kernelFrameout() { planePictureCels = planePicture->getSci32celCount(); _coordAdjuster->pictureSetDisplayArea(planeRect); - _palette->increaseSysTimestamp(); + _palette->drewPicture(planePictureNr); } // Fill our itemlist for this plane diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 63e7d30ca0..4cf3cc16e5 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -76,9 +76,10 @@ void GfxPaint16::drawPicture(GuiResourceId pictureId, int16 animationNr, bool mi picture->draw(animationNr, mirroredFlag, addToFlag, paletteId); delete picture; - // We update our sys palette timestamp here (SCI1.1 only) + // We make a call to SciPalette here, for increasing sys timestamp and also loading targetpalette, if palvary active + // (SCI1.1 only) if (getSciVersion() == SCI_VERSION_1_1) - _palette->increaseSysTimestamp(); + _palette->drewPicture(pictureId); } // This one is the only one that updates screen! diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 3ff6c4dc54..c9fb42b48d 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -212,13 +212,16 @@ void GfxPalette::setEGA() { void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { uint32 systime = _sysPalette.timestamp; - // Pal-Vary is taking place -> abort merge - if (_palVaryResourceId != -1) - return; - if (force || newPalette->timestamp != systime) { _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); newPalette->timestamp = _sysPalette.timestamp; + + if (_palVaryResourceId != -1) { + // Pal-vary currently active, we don't set at any time, but also insert into origin palette + insert(newPalette, &_palVaryOriginPalette); + return; + } + if (_sysPaletteChanged && _screen->_picNotValid == 0) { // && systime != _sysPalette.timestamp) { // Removed timestamp checking, because this shouldnt be needed anymore. I'm leaving it commented just in // case this causes regressions @@ -228,6 +231,24 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } +bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { + bool paletteChanged = false; + + for (int i = 1; i < 255; i++) { + if (newPalette->colors[i].used) { + if ((newPalette->colors[i].r != destPalette->colors[i].r) || (newPalette->colors[i].g != destPalette->colors[i].g) || (newPalette->colors[i].b != destPalette->colors[i].b)) { + destPalette->colors[i].r = newPalette->colors[i].r; + destPalette->colors[i].g = newPalette->colors[i].g; + destPalette->colors[i].b = newPalette->colors[i].b; + paletteChanged = true; + } + destPalette->colors[i].used = newPalette->colors[i].used; + newPalette->mapping[i] = i; + } + } + return paletteChanged; +} + bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { uint16 res; int i,j; @@ -236,20 +257,9 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { if ((!forceRealMerge) && (!_alwaysForceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) { // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes // There are some games with inbetween SCI1.1 interpreters, use real merging for them (e.g. laura bow 2 demo) - for (i = 1; i < 255; i++) { - if (newPalette->colors[i].used) { - if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) { - _sysPalette.colors[i].r = newPalette->colors[i].r; - _sysPalette.colors[i].g = newPalette->colors[i].g; - _sysPalette.colors[i].b = newPalette->colors[i].b; - paletteChanged = true; - } - _sysPalette.colors[i].used = newPalette->colors[i].used; - newPalette->mapping[i] = i; - } - } + // We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls - return paletteChanged; + return insert(newPalette, &_sysPalette); } else { // colors 0 (black) and 255 (white) are not affected by merging @@ -305,10 +315,15 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { return paletteChanged; } -// This is used for SCI1.1 and called from kDrawPic. We only update sysPalette timestamp this way for SCI1.1 -void GfxPalette::increaseSysTimestamp() { +// This is called for SCI1.1, when kDrawPic got done. We update sysPalette timestamp this way for SCI1.1 and also load +// target-palette, if palvary is active +void GfxPalette::drewPicture(GuiResourceId pictureId) { if (!_alwaysForceRealMerge) // Don't do this on inbetween SCI1.1 games _sysPalette.timestamp++; + + if (_palVaryResourceId != -1) { + palVaryLoadTargetPalette(pictureId); + } } uint16 GfxPalette::matchColor(byte r, byte g, byte b) { @@ -487,6 +502,17 @@ void GfxPalette::palVaryInit() { _palVaryTicks = 0; } +bool GfxPalette::palVaryLoadTargetPalette(GuiResourceId resourceId) { + _palVaryResourceId = resourceId; + Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); + if (palResource) { + // Load and initialize destination palette + createFromData(palResource->data, &_palVaryTargetPalette); + return true; + } + return false; +} + void GfxPalette::palVaryInstallTimer() { int16 ticks = _palVaryTicks > 0 ? _palVaryTicks : 1; // Call signal increase every [ticks] @@ -497,11 +523,7 @@ bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1 if (_palVaryResourceId != -1) // another palvary is taking place, return return false; - _palVaryResourceId = resourceId; - Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); - if (palResource) { - // Load and initialize destination palette - createFromData(palResource->data, &_palVaryTargetPalette); + if (palVaryLoadTargetPalette(resourceId)) { // Save current palette memcpy(&_palVaryOriginPalette, &_sysPalette, sizeof(Palette)); @@ -578,6 +600,13 @@ void GfxPalette::palVaryUpdate() { } } +void GfxPalette::palVaryPrepareForTransition() { + if (_palVaryResourceId != -1) { + // Before doing transitions, we have to prepare palette + palVaryProcess(0, false); + } +} + // Processes pal vary updates void GfxPalette::palVaryProcess(int signal, bool setPalette) { int16 stepChange = signal * _palVaryDirection; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 5fcf1a0412..af193e4b62 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -45,13 +45,14 @@ public: void modifyAmigaPalette(byte *data); void setEGA(); void set(Palette *sciPal, bool force, bool forceRealMerge = false); + bool insert(Palette *newPaette, Palette *destPalette); bool merge(Palette *pFrom, bool force, bool forceRealMerge); uint16 matchColor(byte r, byte g, byte b); void getSys(Palette *pal); void setOnScreen(); - void increaseSysTimestamp(); + void drewPicture(GuiResourceId pictureId); bool kernelSetFromResource(GuiResourceId resourceId, bool force); void kernelSetFlag(uint16 fromColor, uint16 toColor, uint16 flag); @@ -68,6 +69,7 @@ public: void kernelPalVaryPause(bool pause); void kernelPalVaryDeinit(); void palVaryUpdate(); + void palVaryPrepareForTransition(); void palVaryProcess(int signal, bool setPalette); Palette _sysPalette; @@ -75,6 +77,7 @@ public: private: void palVaryInit(); void palVaryInstallTimer(); + bool palVaryLoadTargetPalette(GuiResourceId resourceId); static void palVaryCallback(void *refCon); void palVaryIncreaseSignal(); diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 9f8d4d1164..9f37aa016d 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -167,6 +167,8 @@ void GfxTransitions::doit(Common::Rect picRect) { } } + _palette->palVaryPrepareForTransition(); + // Now we do the actual transition to the new screen doTransition(_number, false); |