From 579478a586b6d6c51bd5f652def24b362251d082 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Wed, 5 Oct 2005 01:31:46 +0000 Subject: IHNM used only 248 colors for game graphics. Top part of the palette was read from resources. Switching to this scheme fixes magenta outlines in subtitles. svn-id: r18935 --- saga/animation.cpp | 2 +- saga/events.cpp | 25 ++++++++++--- saga/gfx.cpp | 101 +++++++++++++++++++++++++++++++---------------------- saga/gfx.h | 9 +++-- saga/resnames.h | 2 ++ saga/saga.cpp | 3 +- saga/scene.cpp | 10 ++++-- 7 files changed, 99 insertions(+), 53 deletions(-) diff --git a/saga/animation.cpp b/saga/animation.cpp index 2ac8d27bfe..f936922ec4 100644 --- a/saga/animation.cpp +++ b/saga/animation.cpp @@ -114,7 +114,7 @@ void Anim::playCutaway(int cut, bool fade) { const Rect rect(width, height); bgSurface->blit(rect, buf); - _vm->_gfx->setPalette(palette); + _vm->_gfx->setPalette(palette, 0, 248); free(buf); free(resourceData); diff --git a/saga/events.cpp b/saga/events.cpp index 457051e35a..85ba125910 100644 --- a/saga/events.cpp +++ b/saga/events.cpp @@ -149,11 +149,17 @@ int Events::handleContinuous(Event *event) { case kPalEvent: switch (event->op) { case kEventBlackToPal: - _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc, 0, 248); + else + _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc); break; case kEventPalToBlack: - _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc, 0, 248); + else + _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc); break; default: break; @@ -232,11 +238,17 @@ int Events::handleImmediate(Event *event) { case kPalEvent: switch (event->op) { case kEventBlackToPal: - _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc, 0, 248); + else + _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc); break; case kEventPalToBlack: - _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc, 0, 248); + else + _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc); break; default: break; @@ -332,7 +344,10 @@ int Events::handleOneShot(Event *event) { if (event->param == kEvPSetPalette) { PalEntry *palPointer; _vm->_scene->getBGPal(palPointer); - _vm->_gfx->setPalette(palPointer); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->setPalette(palPointer, 0, 248); + else + _vm->_gfx->setPalette(palPointer); } } } diff --git a/saga/gfx.cpp b/saga/gfx.cpp index c18115e7e9..3cb68e1437 100644 --- a/saga/gfx.cpp +++ b/saga/gfx.cpp @@ -26,7 +26,10 @@ #include "saga/saga.h" #include "saga/gfx.h" #include "saga/interface.h" +#include "saga/resnames.h" +#include "saga/rscfile.h" #include "saga/scene.h" +#include "saga/stream.h" #include "common/system.h" @@ -163,14 +166,42 @@ void Surface::transitionDissolve(const byte *sourceBuffer, const Common::Rect &s } } -void Gfx::setPalette(const PalEntry *pal) { +void Gfx::initPalette() { + if(_vm->getGameType() != GType_IHNM) + return; + + ResourceContext *resourceContext = _vm->_resource->getContext(GAME_RESOURCEFILE); + if (resourceContext == NULL) { + error("Resource::loadGlobalResources() resource context not found"); + } + + byte *resourcePointer; + size_t resourceLength; + + _vm->_resource->loadResource(resourceContext, RID_IHNM_DEFAULT_PALETTE, + resourcePointer, resourceLength); + + MemoryReadStream metaS(resourcePointer, resourceLength); + + for(int i = 0; i < 256; i++) { + _globalPalette[i].red = metaS.readByte(); + _globalPalette[i].green = metaS.readByte(); + _globalPalette[i].blue = metaS.readByte(); + } + + free(resourcePointer); + + setPalette(_globalPalette, 0, 256); +} + +void Gfx::setPalette(const PalEntry *pal, int from, int numcolors) { int i; byte *ppal; - for (i = 0, ppal = _currentPal; i < PAL_ENTRIES; i++, ppal += 4) { - ppal[0] = pal[i].red; - ppal[1] = pal[i].green; - ppal[2] = pal[i].blue; + for (i = 0, ppal = &_currentPal[from * 4]; i < numcolors; i++, ppal += 4) { + ppal[0] = _globalPalette[i].red = pal[i].red; + ppal[1] = _globalPalette[i].green = pal[i].green; + ppal[2] = _globalPalette[i].blue = pal[i].blue; ppal[3] = 0; } @@ -188,15 +219,15 @@ void Gfx::setPaletteColor(int n, int r, int g, int b) { // updates, only update the palette if the color actually changes. if (_currentPal[4 * n + 0] != r) { - _currentPal[4 * n + 0] = r; + _currentPal[4 * n + 0] = _globalPalette[n].red = r; update = true; } if (_currentPal[4 * n + 1] != g) { - _currentPal[4 * n + 1] = g; + _currentPal[4 * n + 1] = _globalPalette[n].green = g; update = true; } if (_currentPal[4 * n + 2] != b) { - _currentPal[4 * n + 2] = b; + _currentPal[4 * n + 2] = _globalPalette[n].blue = b; update = true; } if (_currentPal[4 * n + 3] != 0) { @@ -219,11 +250,12 @@ void Gfx::getCurrentPal(PalEntry *src_pal) { } } -void Gfx::palToBlack(PalEntry *src_pal, double percent) { +void Gfx::palToBlack(PalEntry *srcPal, double percent, int from, int numcolors) { int i; //int fade_max = 255; int new_entry; byte *ppal; + PalEntry *palE; double fpercent; @@ -238,7 +270,12 @@ void Gfx::palToBlack(PalEntry *src_pal, double percent) { // Use the correct percentage change per frame for each palette entry for (i = 0, ppal = _currentPal; i < PAL_ENTRIES; i++, ppal += 4) { - new_entry = (int)(src_pal[i].red * fpercent); + if (i < from || i >= from + numcolors) + palE = &_globalPalette[i]; + else + palE = &srcPal[i]; + + new_entry = (int)(palE->red * fpercent); if (new_entry < 0) { ppal[0] = 0; @@ -246,7 +283,7 @@ void Gfx::palToBlack(PalEntry *src_pal, double percent) { ppal[0] = (byte) new_entry; } - new_entry = (int)(src_pal[i].green * fpercent); + new_entry = (int)(palE->green * fpercent); if (new_entry < 0) { ppal[1] = 0; @@ -254,7 +291,7 @@ void Gfx::palToBlack(PalEntry *src_pal, double percent) { ppal[1] = (byte) new_entry; } - new_entry = (int)(src_pal[i].blue * fpercent); + new_entry = (int)(palE->blue * fpercent); if (new_entry < 0) { ppal[2] = 0; @@ -271,16 +308,12 @@ void Gfx::palToBlack(PalEntry *src_pal, double percent) { _system->setPalette(_currentPal, 0, PAL_ENTRIES); } -void Gfx::blackToPal(PalEntry *src_pal, double percent) { +void Gfx::blackToPal(PalEntry *srcPal, double percent, int from, int numcolors) { int new_entry; double fpercent; - int color_delta; - int best_wdelta = 0; - int best_windex = 0; - int best_bindex = 0; - int best_bdelta = 1000; byte *ppal; int i; + PalEntry *palE; if (percent > 1.0) { percent = 1.0; @@ -293,15 +326,20 @@ void Gfx::blackToPal(PalEntry *src_pal, double percent) { // Use the correct percentage change per frame for each palette entry for (i = 0, ppal = _currentPal; i < PAL_ENTRIES; i++, ppal += 4) { - new_entry = (int)(src_pal[i].red - src_pal[i].red * fpercent); + if (i < from || i >= from + numcolors) + palE = &_globalPalette[i]; + else + palE = &srcPal[i]; + + new_entry = (int)(palE->red - palE->red * fpercent); if (new_entry < 0) { ppal[0] = 0; } else { - ppal[0] = (byte) new_entry; + ppal[0] = (byte)new_entry; } - new_entry = (int)(src_pal[i].green - src_pal[i].green * fpercent); + new_entry = (int)(palE->green - palE->green * fpercent); if (new_entry < 0) { ppal[1] = 0; @@ -309,7 +347,7 @@ void Gfx::blackToPal(PalEntry *src_pal, double percent) { ppal[1] = (byte) new_entry; } - new_entry = (int)(src_pal[i].blue - src_pal[i].blue * fpercent); + new_entry = (int)(palE->blue - palE->blue * fpercent); if (new_entry < 0) { ppal[2] = 0; @@ -319,25 +357,6 @@ void Gfx::blackToPal(PalEntry *src_pal, double percent) { ppal[3] = 0; } - // Find the best white and black color indices again - if (percent >= 1.0) { - for (i = 0, ppal = _currentPal; i < PAL_ENTRIES; i++, ppal += 4) { - color_delta = ppal[0]; - color_delta += ppal[1]; - color_delta += ppal[2]; - - if (color_delta < best_bdelta) { - best_bindex = i; - best_bdelta = color_delta; - } - - if (color_delta > best_wdelta) { - best_windex = i; - best_wdelta = color_delta; - } - } - } - // Make 256th color black. See bug #1256368 if (_vm->getFeatures() & GF_MAC_RESOURCES && !_vm->_scene->isInIntro()) memset(&_currentPal[255 * 4], 0, 4); diff --git a/saga/gfx.h b/saga/gfx.h index 739bff59d1..5a4a96bb67 100644 --- a/saga/gfx.h +++ b/saga/gfx.h @@ -134,11 +134,12 @@ public: return &_backBuffer; } - void setPalette(const PalEntry *pal); + void initPalette(); + void setPalette(const PalEntry *pal, int from = 0, int numcolors = PAL_ENTRIES); void setPaletteColor(int n, int r, int g, int b); void getCurrentPal(PalEntry *src_pal); - void palToBlack(PalEntry *src_pal, double percent); - void blackToPal(PalEntry *src_pal, double percent); + void palToBlack(PalEntry *src_pal, double percent, int from = 0, int numcolors = PAL_ENTRIES); + void blackToPal(PalEntry *src_pal, double percent, int from = 0, int numcolors = PAL_ENTRIES); void updateCursor() { setCursor(); } void showCursor(bool state); @@ -149,6 +150,8 @@ private: byte _currentPal[PAL_ENTRIES * 4]; OSystem *_system; SagaEngine *_vm; + + PalEntry _globalPalette[PAL_ENTRIES]; }; } // End of namespace Saga diff --git a/saga/resnames.h b/saga/resnames.h index ca1ae7af72..bb42aa53f5 100644 --- a/saga/resnames.h +++ b/saga/resnames.h @@ -47,6 +47,8 @@ namespace Saga { #define IHNM_OBJ_PROFILE 0x4000 +#define RID_IHNM_DEFAULT_PALETTE 1 + //actor names #define ITE_ACTOR_PUZZLE 176 diff --git a/saga/saga.cpp b/saga/saga.cpp index e861512fcb..226b5e4a8f 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -253,7 +253,6 @@ int SagaEngine::init(GameDetector &detector) { debug(1, "Music disabled."); } - _render = new Render(this, _system); if (!_render->initialized()) { return FAILURE; @@ -270,6 +269,8 @@ int SagaEngine::init(GameDetector &detector) { _music->setVolume(-1, 1); + _gfx->initPalette(); + return SUCCESS; } diff --git a/saga/scene.cpp b/saga/scene.cpp index dd58ba67cb..0ce7ee17ac 100644 --- a/saga/scene.cpp +++ b/saga/scene.cpp @@ -447,7 +447,10 @@ void Scene::changeScene(int16 sceneNumber, int actorsEntrance, SceneTransitionTy cPal[j].blue = *pal++; } free(colors); - _vm->_gfx->setPalette(cPal); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->setPalette(cPal, 0, 248); + else + _vm->_gfx->setPalette(cPal); } @@ -1132,7 +1135,10 @@ void Scene::processSceneResources() { pal[c].green = *palPtr++; pal[c].blue = *palPtr++; } - _vm->_gfx->setPalette(pal); + if (_vm->getGameType() == GType_IHNM) + _vm->_gfx->setPalette(pal, 0, 248); + else + _vm->_gfx->setPalette(pal); } break; default: -- cgit v1.2.3