[Scummvm-cvs-logs] SF.net SVN: scummvm:[50099] scummvm/trunk/engines/sci/graphics
m_kiewitz at users.sourceforge.net
m_kiewitz at users.sourceforge.net
Sun Jun 20 22:52:31 CEST 2010
Revision: 50099
http://scummvm.svn.sourceforge.net/scummvm/?rev=50099&view=rev
Author: m_kiewitz
Date: 2010-06-20 20:52:31 +0000 (Sun, 20 Jun 2010)
Log Message:
-----------
SCI: properly implement kPalVary functionality within kDrawPic and transitions, so pharkas finally works w/o palette corruption
Modified Paths:
--------------
scummvm/trunk/engines/sci/graphics/frameout.cpp
scummvm/trunk/engines/sci/graphics/paint16.cpp
scummvm/trunk/engines/sci/graphics/palette.cpp
scummvm/trunk/engines/sci/graphics/palette.h
scummvm/trunk/engines/sci/graphics/transitions.cpp
Modified: scummvm/trunk/engines/sci/graphics/frameout.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/frameout.cpp 2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/frameout.cpp 2010-06-20 20:52:31 UTC (rev 50099)
@@ -161,7 +161,7 @@
planePictureCels = planePicture->getSci32celCount();
_coordAdjuster->pictureSetDisplayArea(planeRect);
- _palette->increaseSysTimestamp();
+ _palette->drewPicture(planePictureNr);
}
// Fill our itemlist for this plane
Modified: scummvm/trunk/engines/sci/graphics/paint16.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/paint16.cpp 2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/paint16.cpp 2010-06-20 20:52:31 UTC (rev 50099)
@@ -76,9 +76,10 @@
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!
Modified: scummvm/trunk/engines/sci/graphics/palette.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/palette.cpp 2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/palette.cpp 2010-06-20 20:52:31 UTC (rev 50099)
@@ -212,13 +212,16 @@
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 @@
}
}
+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 @@
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 @@
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 @@
_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 @@
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::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;
Modified: scummvm/trunk/engines/sci/graphics/palette.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/palette.h 2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/palette.h 2010-06-20 20:52:31 UTC (rev 50099)
@@ -45,13 +45,14 @@
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 @@
void kernelPalVaryPause(bool pause);
void kernelPalVaryDeinit();
void palVaryUpdate();
+ void palVaryPrepareForTransition();
void palVaryProcess(int signal, bool setPalette);
Palette _sysPalette;
@@ -75,6 +77,7 @@
private:
void palVaryInit();
void palVaryInstallTimer();
+ bool palVaryLoadTargetPalette(GuiResourceId resourceId);
static void palVaryCallback(void *refCon);
void palVaryIncreaseSignal();
Modified: scummvm/trunk/engines/sci/graphics/transitions.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/transitions.cpp 2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/transitions.cpp 2010-06-20 20:52:31 UTC (rev 50099)
@@ -167,6 +167,8 @@
}
}
+ _palette->palVaryPrepareForTransition();
+
// Now we do the actual transition to the new screen
doTransition(_number, false);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list