aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorFilippos Karapetis2009-10-07 11:31:30 +0000
committerFilippos Karapetis2009-10-07 11:31:30 +0000
commita17d01bd21b8377b132b59ec48589495d3852fb0 (patch)
treec97498447f0093d0a0f4cd8004a739f8b94f1654 /engines
parentf72c4d21c7d158345546dd9db95c2ae9a1924f79 (diff)
downloadscummvm-rg350-a17d01bd21b8377b132b59ec48589495d3852fb0.tar.gz
scummvm-rg350-a17d01bd21b8377b132b59ec48589495d3852fb0.tar.bz2
scummvm-rg350-a17d01bd21b8377b132b59ec48589495d3852fb0.zip
More work on the view code wrapper. Now all SCI0-SCI11 views should be displayed correctly, apart from the late SCI0 ones (e.g. in Codename Iceman), where the palette is incorrect
svn-id: r44724
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/gfx/gfx_resmgr.cpp53
-rw-r--r--engines/sci/gui/gui_view.h3
2 files changed, 22 insertions, 34 deletions
diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp
index 87e232c052..276f8402c3 100644
--- a/engines/sci/gfx/gfx_resmgr.cpp
+++ b/engines/sci/gfx/gfx_resmgr.cpp
@@ -519,13 +519,21 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
// Translate view palette
view->palette = NULL;
- if (guiView->getPalette()) {
- GuiPalette viewPalette = guiView->getPalette()->_sysPalette;
- int colorCount = (viewType == kViewVga) ? 256 : 16;
- view->palette = new Palette(colorCount);
+ if (viewType == kViewVga || viewType == kViewVga11) {
+ GuiPalette *viewPalette = guiView->getPalette();
+ if (viewPalette) {
+ view->palette = new Palette(256);
+ for (int c = 0; c < 256; c++)
+ view->palette->setColor(c, viewPalette->colors[c].r, viewPalette->colors[c].g, viewPalette->colors[c].b);
+ }
+ } else {
+ view->palette = _staticPalette->getref();
- for (int c = 0; c < colorCount; c++)
- view->palette->setColor(c, viewPalette.colors[c].r, viewPalette.colors[c].g, viewPalette.colors[c].b);
+ const byte *paldata = guiView->getEgaMapping();
+ for (int p = 0; p < GFX_SCI0_IMAGE_COLORS_NR; p++)
+ view->translation[p] = *(paldata++);
+
+ view->flags |= GFX_PIXMAP_FLAG_PALETTIZED;
}
view->loops_nr = guiView->getLoopCount();
@@ -546,15 +554,16 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
curCel->height = celInfo->height;
curCel->index_width = celInfo->width;
curCel->index_height = celInfo->height;
- curCel->palette_revision = 0;
- curCel->xoffset = celInfo->displaceX;
- curCel->yoffset = celInfo->displaceY;
+ curCel->palette_revision = -1;
+ curCel->xoffset = -celInfo->displaceX;
+ curCel->yoffset = -celInfo->displaceY;
curCel->alpha_map = 0; // will be allocated by gfx_xlate_pixmap()
curCel->data = 0; // will be allocated by gfx_xlate_pixmap()
- curCel->palette = view->palette->getref();
+ curCel->palette = NULL; // will be assigned to the view palette below
}
}
+ if (viewType == kViewVga || viewType == kViewVga11) {
#else
// Existing code
@@ -570,6 +579,7 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
view = getEGAView(resid, viewRes->data, viewRes->size, pal);
} else {
view = getVGAView(resid, viewRes->data, viewRes->size, viewType);
+#endif
if (view->palette) {
// Palettize view
@@ -585,8 +595,6 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
}
}
-#endif
-
if (!res) {
res = (gfx_resource_t *)malloc(sizeof(gfx_resource_t));
res->scaled_data.view = NULL;
@@ -607,30 +615,9 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
}
*loop = CLIP<int>(*loop, 0, view->loops_nr - 1);
-
- if (*loop < 0) {
- warning("[GFX] View %d has no loops", nr);
- return NULL;
- }
-
loop_data = view->loops + (*loop);
- if (loop_data == NULL) {
- warning("[GFX] Trying to load invalid loop %d of view %d", *loop, nr);
- return NULL;
- }
-
*cel = CLIP<int>(*cel, 0, loop_data->cels_nr - 1);
-
- if (*cel < 0) {
- warning("[GFX] View %d loop %d has no cels", nr, *loop);
- return NULL;
- }
-
cel_data = loop_data->cels[*cel];
- if (loop_data == NULL) {
- warning("[GFX] Trying to load invalid view/loop/cel %d/%d/%d", nr, *loop, *cel);
- return NULL;
- }
if (!cel_data->data) {
if (!cel_data->palette)
diff --git a/engines/sci/gui/gui_view.h b/engines/sci/gui/gui_view.h
index b52cf585d7..8ed7bb058b 100644
--- a/engines/sci/gui/gui_view.h
+++ b/engines/sci/gui/gui_view.h
@@ -59,7 +59,8 @@ public:
byte *getBitmap(GuiViewLoopNo loopNo, GuiViewCelNo celNo);
void draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, GuiViewLoopNo loopNo, GuiViewCelNo celNo, byte priority, uint16 paletteNo);
uint16 getLoopCount() const { return _loopCount; }
- SciGuiPalette *getPalette() const { return _palette; }
+ GuiPalette *getPalette() { return &_viewPalette; }
+ const byte *getEgaMapping() const { return _EGAMapping; }
private:
void initData(GuiResourceId resourceId);