aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2009-10-07 16:26:16 +0000
committerFilippos Karapetis2009-10-07 16:26:16 +0000
commitec421984a9a6aa8d1f51913a6382b8eb1eb2c59a (patch)
tree79cb21e4c5f80e2c318df9b4db1acbc5621a9115
parentde3d1cfdaf040d3f9959d9738205f0e3fc3b6b08 (diff)
downloadscummvm-rg350-ec421984a9a6aa8d1f51913a6382b8eb1eb2c59a.tar.gz
scummvm-rg350-ec421984a9a6aa8d1f51913a6382b8eb1eb2c59a.tar.bz2
scummvm-rg350-ec421984a9a6aa8d1f51913a6382b8eb1eb2c59a.zip
Replaced the view loading code with the new view loading functions. EGA view color translation has been disabled, as it caused palette problems in Codename:Iceman
svn-id: r44737
-rw-r--r--engines/sci/gfx/gfx_resmgr.cpp54
-rw-r--r--engines/sci/gfx/gfx_resource.h25
-rw-r--r--engines/sci/gfx/gfx_system.h1
-rw-r--r--engines/sci/gfx/res_view.cpp129
-rw-r--r--engines/sci/gui/gui_view.cpp7
-rw-r--r--engines/sci/gui/gui_view.h2
6 files changed, 18 insertions, 200 deletions
diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp
index 276f8402c3..773d9d4bf5 100644
--- a/engines/sci/gfx/gfx_resmgr.cpp
+++ b/engines/sci/gfx/gfx_resmgr.cpp
@@ -507,8 +507,7 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
gfx_pixmap_t *cel_data = NULL;
if (!res || res->mode != hash) {
- // Wrapper code for the new view decoder - still WIP
-#if 0
+ // Wrapper code for the new view decoder
view = (gfxr_view_t *)malloc(sizeof(gfxr_view_t));
view->ID = nr;
@@ -526,14 +525,17 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
for (int c = 0; c < 256; c++)
view->palette->setColor(c, viewPalette->colors[c].r, viewPalette->colors[c].g, viewPalette->colors[c].b);
}
+
+ // Assign missing colors from the view's palette to the global palette ones
+ for (unsigned i = 0; i < MIN(view->palette->size(), _staticPalette->size()); i++) {
+ const PaletteEntry& vc = view->palette->getColor(i);
+ if (vc.r == 0 && vc.g == 0 && vc.b == 0) {
+ const PaletteEntry& sc = _staticPalette->getColor(i);
+ view->palette->setColor(i, sc.r, sc.g, sc.b);
+ }
+ }
} else {
view->palette = _staticPalette->getref();
-
- 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();
@@ -557,41 +559,9 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
curCel->palette_revision = -1;
curCel->xoffset = -celInfo->displaceX;
curCel->yoffset = -celInfo->displaceY;
+ curCel->palette = view->palette->getref();
curCel->alpha_map = 0; // will be allocated by gfx_xlate_pixmap()
curCel->data = 0; // will be allocated by gfx_xlate_pixmap()
- curCel->palette = NULL; // will be assigned to the view palette below
- }
- }
-
- if (viewType == kViewVga || viewType == kViewVga11) {
-#else
-
- // Existing code
-
- Resource *viewRes = _resMan->findResource(ResourceId(kResourceTypeView, nr), 0);
- if (!viewRes || !viewRes->data)
- return NULL;
-
- int resid = GFXR_RES_ID(GFX_RESOURCE_TYPE_VIEW, nr);
-
- if (viewType == kViewEga) {
- int pal = (getSciVersion() <= SCI_VERSION_01) ? -1 : palette;
- view = getEGAView(resid, viewRes->data, viewRes->size, pal);
- } else {
- view = getVGAView(resid, viewRes->data, viewRes->size, viewType);
-#endif
-
- if (view->palette) {
- // Palettize view
- for (unsigned i = 0; i < MIN(view->palette->size(), _staticPalette->size()); i++) {
- const PaletteEntry& vc = view->palette->getColor(i);
- if (vc.r == 0 && vc.g == 0 && vc.b == 0) {
- const PaletteEntry& sc = _staticPalette->getColor(i);
- view->palette->setColor(i, sc.r, sc.g, sc.b);
- }
- }
- } else {
- view->palette = _staticPalette->getref();
}
}
@@ -620,8 +590,6 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
cel_data = loop_data->cels[*cel];
if (!cel_data->data) {
- if (!cel_data->palette)
- cel_data->palette = view->palette->getref();
gfx_get_res_config(_options->res_conf, cel_data);
gfx_xlate_pixmap(cel_data, _driver->getMode());
}
diff --git a/engines/sci/gfx/gfx_resource.h b/engines/sci/gfx/gfx_resource.h
index 0bb5265bdf..63d43b6f74 100644
--- a/engines/sci/gfx/gfx_resource.h
+++ b/engines/sci/gfx/gfx_resource.h
@@ -130,8 +130,6 @@ struct gfxr_view_t {
int loops_nr;
gfxr_loop_t *loops;
-
- int translation[GFX_SCI0_IMAGE_COLORS_NR];
};
/**
@@ -252,17 +250,6 @@ void gfxr_remove_artifacts_pic0(gfxr_pic_t *dest, gfxr_pic_t *src);
void gfxr_dither_pic0(gfxr_pic_t *pic, DitherMode mode);
/**
- * Calculates an EGA view.
- *
- * @param[in] id Resource ID of the view
- * @param[in] resource Pointer to the resource to read
- * @param[in] size Size of the resource
- * @param[in] palette The palette to use
- * @return The resulting view
- */
-gfxr_view_t *getEGAView(int id, byte *resource, int size, int palette);
-
-/**
* Calculates a SCI cursor.
*
* @param[in] id The cursor's resource ID
@@ -309,18 +296,6 @@ Palette *gfxr_read_pal1_amiga(Common::File &file);
*/
Palette *gfxr_read_pal11(int id, byte *resource, int size);
-/**
- * Calculates a VGA view.
- *
- * @param[in] id Resource ID of the view
- * @param[in] resource Pointer to the resource to read
- * @param[in] size Size of the resource
- * @param[in] static_pal The static palette
- * @param[in] isSci11 true if SCI1.1, false otherwise
- * @return The resulting view
- */
-gfxr_view_t *getVGAView(int id, byte *resource, int size, ViewType viewType);
-
gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, byte *cel_base, int size, gfxr_view_t *view, ViewType viewType);
/** @} */
diff --git a/engines/sci/gfx/gfx_system.h b/engines/sci/gfx/gfx_system.h
index 0e474c8985..37b915f518 100644
--- a/engines/sci/gfx/gfx_system.h
+++ b/engines/sci/gfx/gfx_system.h
@@ -133,7 +133,6 @@ extern rect_t gfx_rect_fullscreen;
#define GFX_PIXMAP_FLAG_SCALED_INDEX (1<<0) /* Index data is scaled already */
#define GFX_PIXMAP_FLAG_INSTALLED (1<<2) /* Pixmap has been registered */
-#define GFX_PIXMAP_FLAG_PALETTIZED (1<<6) /* Indicates a palettized view */
#define GFX_PIXMAP_COLOR_KEY_NONE -1 /* No transpacency colour key */
#define GFX_CURSOR_TRANSPARENT 255 // Cursor colour key
diff --git a/engines/sci/gfx/res_view.cpp b/engines/sci/gfx/res_view.cpp
index c10f62f676..e4f6148fc0 100644
--- a/engines/sci/gfx/res_view.cpp
+++ b/engines/sci/gfx/res_view.cpp
@@ -86,9 +86,6 @@ gfx_pixmap_t *gfxr_draw_cel0(int id, int loop, int cel, byte *resource, int size
int count = op >> 4;
int color = op & 0xf;
- if (view->flags & GFX_PIXMAP_FLAG_PALETTIZED)
- color = view->translation[color];
-
if (color == color_key)
color = retval->color_key;
@@ -116,9 +113,6 @@ gfx_pixmap_t *gfxr_draw_cel0(int id, int loop, int cel, byte *resource, int size
int count = op >> 4;
int color = op & 0xf;
- if (view && (view->flags & GFX_PIXMAP_FLAG_PALETTIZED))
- color = view->translation[color];
-
if (color == color_key)
color = retval->color_key;
@@ -135,65 +129,6 @@ gfx_pixmap_t *gfxr_draw_cel0(int id, int loop, int cel, byte *resource, int size
return retval;
}
-gfxr_view_t *getEGAView(int id, byte *resource, int size, int palette) {
- int i;
- gfxr_view_t *view;
- int mirror_bitpos = 1;
- int mirror_bytepos = V0_MIRROR_LIST_OFFSET;
- int palette_ofs = READ_LE_UINT16(resource + 6);
-
- if (size < V0_FIRST_LOOP_OFFSET + 8) {
- error("Attempt to draw empty view %04x", id);
- return NULL;
- }
-
- view = (gfxr_view_t *)malloc(sizeof(gfxr_view_t));
- view->ID = id;
-
- view->loops_nr = resource[V0_LOOPS_NR_OFFSET];
-
- // Set palette
- view->flags = 0;
- view->palette = gfx_sci0_image_pal[sci0_palette]->getref();
-
- if ((palette_ofs) && (palette >= 0)) {
- byte *paldata = resource + palette_ofs + (palette * GFX_SCI0_IMAGE_COLORS_NR);
-
- for (i = 0; i < GFX_SCI0_IMAGE_COLORS_NR; i++)
- view->translation[i] = *(paldata++);
-
- view->flags |= GFX_PIXMAP_FLAG_PALETTIZED;
- }
-
- if (view->loops_nr * 2 + V0_FIRST_LOOP_OFFSET > size) {
- error("View %04x: Not enough space in resource to accomodate for the claimed %d loops", id, view->loops_nr);
- free(view);
- return NULL;
- }
-
- view->loops = (gfxr_loop_t*)malloc(sizeof(gfxr_loop_t) * ((view->loops_nr) ? view->loops_nr : 1)); /* Alloc 1 if no loop */
-
- for (i = 0; i < view->loops_nr; i++) {
- int loop_offset = READ_LE_UINT16(resource + V0_FIRST_LOOP_OFFSET + (i << 1));
- int mirrored = resource[mirror_bytepos] & mirror_bitpos;
-
- if ((mirror_bitpos <<= 1) == 0x100) {
- mirror_bytepos++;
- mirror_bitpos = 1;
- }
-
- view->loops[i].cels_nr = READ_LE_UINT16(resource + loop_offset);
- view->loops[i].cels = (gfx_pixmap_t**)calloc(view->loops[i].cels_nr, sizeof(gfx_pixmap_t *));
-
- for (int j = 0; j < view->loops[i].cels_nr; j++) {
- int cel_offset = READ_LE_UINT16(resource + loop_offset + 4 + (j << 1));
- view->loops[i].cels[j] = gfxr_draw_cel0(id, i, j, resource + cel_offset, size - cel_offset, view, mirrored);
- }
- }
-
- return view;
-}
-
#define NEXT_LITERAL_BYTE(n) \
if (literal_pos == runlength_pos) \
runlength_pos += n; \
@@ -365,68 +300,4 @@ gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *reso
return retval;
}
-// SCI1:
-// [LoopCount:WORD] [MirrorMask:WORD] [??:WORD] [PaletteOffset:WORD] [LoopOffset0:WORD] [LoopOffset1:WORD]...
-// Loop-data:
-// [CelCount:WORD] [Unknown:WORD] [CelOffset0:WORD] [CelOffset1:WORD]...
-// SCI11:
-// [HeaderSize:WORD] [LoopCount:BYTE] [Unknown:BYTE] [??:WORD] [??:WORD] [PaletteOffset:WORD]
-gfxr_view_t *getVGAView(int id, byte *resource, int size, ViewType viewType) {
- uint16 palOffset = READ_LE_UINT16(resource + V1_PALETTE_OFFSET + ((viewType == kViewVga11) ? 2 : 0));
- uint16 headerSize = (viewType == kViewVga11) ? READ_LE_UINT16(resource + V2_HEADER_SIZE) : 0;
- byte* seeker = resource + headerSize;
- uint16 loopOffset = 0;
- gfxr_view_t *view = (gfxr_view_t *)malloc(sizeof(gfxr_view_t));
-
- view->ID = id;
- view->flags = 0;
- view->loops_nr = READ_LE_UINT16(resource + V1_LOOPS_NR_OFFSET + ((viewType == kViewVga11) ? 2 : 0)) & 0xFF;
-
- if (palOffset > 0) {
- if (viewType == kViewVga11)
- view->palette = gfxr_read_pal11(id, resource + palOffset, size - palOffset);
- else
- view->palette = gfxr_read_pal1(id, resource + palOffset, size - palOffset);
- } else {
- view->palette = NULL;
- }
-
- view->loops = (gfxr_loop_t *)calloc(view->loops_nr, sizeof(gfxr_loop_t));
-
- for (int i = 0; i < view->loops_nr; i++) {
- if (viewType != kViewVga11) {
- bool mirrored = READ_LE_UINT16(resource + V1_MIRROR_MASK) & (1 << i);
- loopOffset = READ_LE_UINT16(resource + V1_FIRST_LOOP_OFFSET + (i << 1));
- view->loops[i].cels_nr = READ_LE_UINT16(resource + loopOffset);
- view->loops[i].cels = (gfx_pixmap_t**)calloc(view->loops[i].cels_nr, sizeof(gfx_pixmap_t *));
-
- for (int j = 0; j < view->loops[i].cels_nr; j++) {
- int cel_offset = READ_LE_UINT16(resource + loopOffset + 4 + (j << 1));
- view->loops[i].cels[j] = gfxr_draw_cel1(id, i, j, mirrored,
- resource + cel_offset,
- resource + cel_offset,
- size - cel_offset,
- view, viewType);
- }
- } else {
- byte copy_entry = seeker[V2_COPY_OF_LOOP];
- bool mirrored = (copy_entry != 255);
- byte *buf = !mirrored ? seeker : resource + headerSize + copy_entry * resource[V2_BYTES_PER_LOOP];
- loopOffset = READ_LE_UINT16(buf + V2_LOOP_OFFSET);
- view->loops[i].cels_nr = buf[V2_CELS_NUM];
- view->loops[i].cels = (gfx_pixmap_t**)calloc(view->loops[i].cels_nr, sizeof(gfx_pixmap_t *));
-
- byte* celSeeker = resource + loopOffset;
- for (int j = 0; j < view->loops[i].cels_nr; j++) {
- view->loops[i].cels[j] = gfxr_draw_cel1(id, i, j, mirrored, resource, celSeeker, size, view, viewType);
- celSeeker += resource[V2_BYTES_PER_CEL];
- }
-
- seeker += resource[V2_BYTES_PER_LOOP];
- }
- }
-
- return view;
-}
-
} // End of namespace Sci
diff --git a/engines/sci/gui/gui_view.cpp b/engines/sci/gui/gui_view.cpp
index 379e8bf612..1c3072eaed 100644
--- a/engines/sci/gui/gui_view.cpp
+++ b/engines/sci/gui/gui_view.cpp
@@ -81,7 +81,8 @@ void SciGuiView::initData(GuiResourceId resourceId) {
if (palOffset && palOffset != 0x100) {
if (IsEGA) { // simple mapping for 16 colors
- _EGAMapping = _resourceData + palOffset;
+ // FIXME: this messes up the colors in Codename: Iceman
+ //_EGAMapping = _resourceData + palOffset;
} else {
_palette->createFromData(&_resourceData[palOffset], &_viewPalette);
_embeddedPal = true;
@@ -374,4 +375,8 @@ void SciGuiView::draw(Common::Rect rect, Common::Rect clipRect, Common::Rect cli
}
}
+GuiPalette *SciGuiView::getPalette() {
+ return _embeddedPal ? &_viewPalette : &_palette->_sysPalette;
+}
+
} // End of namespace Sci
diff --git a/engines/sci/gui/gui_view.h b/engines/sci/gui/gui_view.h
index 8ed7bb058b..9f07ee4c49 100644
--- a/engines/sci/gui/gui_view.h
+++ b/engines/sci/gui/gui_view.h
@@ -59,7 +59,7 @@ 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; }
- GuiPalette *getPalette() { return &_viewPalette; }
+ GuiPalette *getPalette();
const byte *getEgaMapping() const { return _EGAMapping; }
private: