aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx/gfx_resmgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx/gfx_resmgr.cpp')
-rw-r--r--engines/sci/gfx/gfx_resmgr.cpp532
1 files changed, 0 insertions, 532 deletions
diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp
deleted file mode 100644
index f78f5980e9..0000000000
--- a/engines/sci/gfx/gfx_resmgr.cpp
+++ /dev/null
@@ -1,532 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "sci/sci.h" // for INCLUDE_OLDGFX
-#ifdef INCLUDE_OLDGFX
-
-// Resource manager core part
-
-// FIXME/TODO: The name "(Graphics) resource manager", and the associated
-// filenames, are misleading. This should be renamed to "Graphics manager"
-// or something like that.
-
-#include "sci/gfx/gfx_resource.h"
-#include "sci/gfx/gfx_tools.h"
-#include "sci/gfx/gfx_resmgr.h"
-#include "sci/gui/gui_palette.h"
-#include "sci/gui/gui_screen.h"
-#include "sci/gui/gui_view.h"
-#include "sci/gfx/gfx_driver.h"
-#include "sci/gfx/gfx_state_internal.h"
-#include "sci/gui32/font.h"
-
-#include "common/system.h"
-
-namespace Sci {
-
-struct param_struct {
- int args[4];
- GfxDriver *driver;
-};
-
-GfxResManager::GfxResManager(GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette, Common::Rect portBounds) :
- _driver(driver), _resMan(resMan), _screen(screen), _palette(palette),
- _lockCounter(0), _tagLockCounter(0), _staticPalette(0) {
- gfxr_init_static_palette();
-
- _portBounds = portBounds;
-
- if (!_resMan->isVGA()) {
- _staticPalette = gfx_sci0_pic_colors->getref();
- } else if (getSciVersion() == SCI_VERSION_1_1) {
- debugC(2, kDebugLevelGraphics, "Palettes are not yet supported in this SCI version\n");
-#ifdef ENABLE_SCI32
- } else if (getSciVersion() >= SCI_VERSION_2) {
- debugC(2, kDebugLevelGraphics, "Palettes are not yet supported in this SCI version\n");
-#endif
- } else {
- Resource *res = resMan->findResource(ResourceId(kResourceTypePalette, 999), 0);
- if (res && res->data)
- _staticPalette = gfxr_read_pal1(res->id.number, res->data, res->size);
- }
-}
-
-GfxResManager::~GfxResManager() {
- _staticPalette->free();
- _staticPalette = 0;
-}
-
-void GfxResManager::calculatePic(gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pic, int flags, int default_palette, int nr) {
- Resource *res = _resMan->findResource(ResourceId(kResourceTypePic, nr), 0);
- int need_unscaled = unscaled_pic != NULL;
- gfxr_pic0_params_t style, basic_style;
-
- basic_style.line_mode = GFX_LINE_MODE_CORRECT;
- basic_style.brush_mode = GFX_BRUSH_MODE_SCALED;
- style.line_mode = GFX_LINE_MODE_CORRECT;
- style.brush_mode = GFX_BRUSH_MODE_RANDOM_ELLIPSES;
-
- if (!res || !res->data)
- error("calculatePic(): pic number %d not found", nr);
-
- if (need_unscaled) {
- if (_resMan->getViewType() == kViewVga11)
- gfxr_draw_pic11(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id.number, _staticPalette, _portBounds);
- else
- gfxr_draw_pic01(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id.number, _resMan->getViewType(), _staticPalette, _portBounds);
- }
-
- if (scaled_pic && scaled_pic->undithered_buffer)
- memcpy(scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer, scaled_pic->undithered_buffer_size);
-
- if (_resMan->getViewType() == kViewVga11)
- gfxr_draw_pic11(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id.number, _staticPalette, _portBounds);
- else
- gfxr_draw_pic01(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id.number, _resMan->getViewType(), _staticPalette, _portBounds);
-
- if (getSciVersion() <= SCI_VERSION_1_EGA) {
- if (need_unscaled)
- gfxr_remove_artifacts_pic0(scaled_pic, unscaled_pic);
-
- if (!scaled_pic->undithered_buffer)
- scaled_pic->undithered_buffer = malloc(scaled_pic->undithered_buffer_size);
-
- memcpy(scaled_pic->undithered_buffer, scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer_size);
-
- gfxr_dither_pic0(scaled_pic, kDitherNone);
- }
-
- // Mark default palettes
- if (scaled_pic)
- scaled_pic->visual_map->loop = default_palette;
-
- if (unscaled_pic)
- unscaled_pic->visual_map->loop = default_palette;
-}
-
-#define FREEALL(freecmd, type) \
- if (resource->scaled_data.type) \
- freecmd(resource->scaled_data.type); \
- resource->scaled_data.type = NULL; \
- if (resource->unscaled_data.type) \
- freecmd(resource->unscaled_data.type); \
- resource->unscaled_data.type = NULL;
-
-void gfxr_free_resource(gfx_resource_t *resource, int type) {
- if (!resource)
- return;
-
- switch (type) {
-
- case GFX_RESOURCE_TYPE_VIEW:
- FREEALL(gfxr_free_view, view);
- break;
-
- case GFX_RESOURCE_TYPE_PIC:
- FREEALL(gfxr_free_pic, pic);
- break;
-
- case GFX_RESOURCE_TYPE_FONT:
- FREEALL(gfxr_free_font, font);
- break;
-
- case GFX_RESOURCE_TYPE_CURSOR:
- FREEALL(gfx_free_pixmap, pointer);
- break;
-
- default:
- warning("[GFX] Attempt to free invalid resource type %d", type);
- }
-
- free(resource);
-}
-
-void GfxResManager::freeAllResources() {
- for (int type = 0; type < GFX_RESOURCE_TYPES_NR; ++type) {
- for (IntResMap::iterator iter = _resourceMaps[type].begin(); iter != _resourceMaps[type].end(); ++iter) {
- gfxr_free_resource(iter->_value, type);
- iter->_value = 0;
- }
- }
-}
-
-void GfxResManager::freeResManager() {
- freeAllResources();
- _lockCounter = _tagLockCounter = 0;
-}
-
-void GfxResManager::freeTaggedResources() {
- // Current heuristics: free tagged views and old pics
-
- IntResMap::iterator iter;
- int type;
- const int tmp = _tagLockCounter;
-
- type = GFX_RESOURCE_TYPE_VIEW;
- for (iter = _resourceMaps[type].begin(); iter != _resourceMaps[type].end(); ++iter) {
- gfx_resource_t *resource = iter->_value;
-
- if (resource) {
- if (resource->lock_sequence_nr < tmp) {
- gfxr_free_resource(resource, type);
- iter->_value = 0;
- } else {
- resource->lock_sequence_nr = 0;
- }
- }
- }
-
- type = GFX_RESOURCE_TYPE_PIC;
- for (iter = _resourceMaps[type].begin(); iter != _resourceMaps[type].end(); ++iter) {
- gfx_resource_t *resource = iter->_value;
-
- if (resource) {
- if (resource->lock_sequence_nr < 0) {
- gfxr_free_resource(resource, type);
- iter->_value = 0;
- } else {
- resource->lock_sequence_nr--;
- }
- }
- }
-
- _tagLockCounter = 0;
-}
-
-
-void GfxResManager::setStaticPalette(Palette *newPalette)
-{
- if (_staticPalette)
- _staticPalette->free();
-
- _staticPalette = newPalette;
- _staticPalette->name = "static palette";
-
- if (_driver->getMode()->palette)
- _staticPalette->mergeInto(_driver->getMode()->palette);
-}
-
-#if 0
-// FIXME: the options for GFX_MASK_VISUAL are actually unused
-#define XLATE_AS_APPROPRIATE(key, entry) \
- if (maps & key) { \
- if (res->unscaled_data.pic&& (force || !res->unscaled_data.pic->entry->data)) { \
- if (key == GFX_MASK_VISUAL) \
- gfx_get_res_config(options->res_conf, res->unscaled_data.pic->entry); \
- gfx_xlate_pixmap(res->unscaled_data.pic->entry, mode, filter); \
- } if (scaled && res->scaled_data.pic && (force || !res->scaled_data.pic->entry->data)) { \
- if (key == GFX_MASK_VISUAL) \
- gfx_get_res_config(options->res_conf, res->scaled_data.pic->entry); \
- gfx_xlate_pixmap(res->scaled_data.pic->entry, mode, filter); \
- } \
- }
-#endif
-
-#define XLATE_AS_APPROPRIATE(key, entry) \
- if (maps & key) { \
- if (res->unscaled_data.pic&& (force || !res->unscaled_data.pic->entry->data)) { \
- gfx_xlate_pixmap(res->unscaled_data.pic->entry, mode); \
- } if (scaled && res->scaled_data.pic && (force || !res->scaled_data.pic->entry->data)) { \
- gfx_xlate_pixmap(res->scaled_data.pic->entry, mode); \
- } \
- }
-
-static gfxr_pic_t *gfxr_pic_xlate_common(gfx_resource_t *res, int maps, int scaled, int force, gfx_mode_t *mode) {
-
- XLATE_AS_APPROPRIATE(GFX_MASK_VISUAL, visual_map);
- XLATE_AS_APPROPRIATE(GFX_MASK_PRIORITY, priority_map);
- XLATE_AS_APPROPRIATE(GFX_MASK_CONTROL, control_map);
-
- return scaled ? res->scaled_data.pic : res->unscaled_data.pic;
-}
-#undef XLATE_AS_APPROPRIATE
-
-/* unscaled color index mode: Used in addition to a scaled mode
-** to render the pic resource twice.
-*/
-// FIXME: this is an ugly hack. Perhaps we could do it some other way?
-gfx_mode_t mode_1x1_color_index = { /* Fake 1x1 mode */
- /* scaleFactor */ 1,
- /* xsize */ 1, /* ysize */ 1,
- /* palette */ NULL
-};
-
-gfxr_pic_t *GfxResManager::getPic(int num, int maps, int flags, int default_palette, bool scaled) {
- gfxr_pic_t *npic = NULL;
- IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_PIC];
- gfx_resource_t *res = NULL;
- int need_unscaled = (_driver->getMode()->scaleFactor != 1);
-
- res = resMap.contains(num) ? resMap[num] : NULL;
-
- if (!res) {
- gfxr_pic_t *pic = NULL;
- gfxr_pic_t *unscaled_pic = NULL;
-
- need_unscaled = 0;
- pic = gfxr_init_pic(_driver->getMode(), GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, num), _resMan->isVGA());
-
- if (!pic) {
- error("Failed to allocate scaled pic");
- return NULL;
- }
-
- gfxr_clear_pic0(pic, SCI_TITLEBAR_SIZE);
-
- if (need_unscaled) {
- unscaled_pic = gfxr_init_pic(&mode_1x1_color_index, GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, num), _resMan->isVGA());
- if (!unscaled_pic) {
- error("Failed to allocate unscaled pic");
- return NULL;
- }
- gfxr_clear_pic0(pic, SCI_TITLEBAR_SIZE);
- }
-
- calculatePic(pic, unscaled_pic, flags, default_palette, num);
-
- if (!res) {
- res = (gfx_resource_t *)malloc(sizeof(gfx_resource_t));
- res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, num);
- res->lock_sequence_nr = 0;
- resMap[num] = res;
- } else {
- gfxr_free_pic(res->scaled_data.pic);
- if (res->unscaled_data.pic)
- gfxr_free_pic(res->unscaled_data.pic);
- }
-
- res->scaled_data.pic = pic;
- res->unscaled_data.pic = unscaled_pic;
- } else {
- res->lock_sequence_nr = 0;
- }
-
- npic = gfxr_pic_xlate_common(res, maps, 1, 0, _driver->getMode());
-
- return npic;
-}
-
-static void set_pic_id(gfx_resource_t *res, int id) {
- if (res->scaled_data.pic) {
- gfxr_pic_t *pic = res->scaled_data.pic;
- pic->control_map->ID = id;
- pic->priority_map->ID = id;
- pic->visual_map->ID = id;
- }
-
- if (res->unscaled_data.pic) {
- gfxr_pic_t *pic = res->unscaled_data.pic;
- pic->control_map->ID = id;
- pic->priority_map->ID = id;
- pic->visual_map->ID = id;
- }
-}
-
-static int get_pic_id(gfx_resource_t *res) {
- if (res->scaled_data.pic)
- return res->scaled_data.pic->visual_map->ID;
- else
- return res->unscaled_data.pic->visual_map->ID;
-}
-
-gfxr_pic_t *GfxResManager::addToPic(int old_nr, int new_nr, int flags, int old_default_palette, int default_palette) {
- IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_PIC];
- gfxr_pic_t *pic = NULL;
- gfx_resource_t *res = NULL;
- int need_unscaled = 1;
-
- res = resMap.contains(old_nr) ? resMap[old_nr] : NULL;
-
- if (!res) {
- getPic(old_nr, 0, flags, old_default_palette, 1);
-
- res = resMap.contains(old_nr) ? resMap[old_nr] : NULL;
-
- if (!res) {
- warning("[GFX] Attempt to add pic %d to non-existing pic %d", new_nr, old_nr);
- return NULL;
- }
- }
-
- // The following two operations are needed when returning scaled maps (which is always the case here)
- res->lock_sequence_nr = 0;
- calculatePic(res->scaled_data.pic, need_unscaled ? res->unscaled_data.pic : NULL,
- flags | DRAWPIC01_FLAG_OVERLAID_PIC, default_palette, new_nr);
-
- {
- int old_ID = get_pic_id(res);
- set_pic_id(res, GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, new_nr)); // To ensure that our graphical translation options work properly
- pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode());
- set_pic_id(res, old_ID);
- }
-
- return pic;
-}
-
-gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
- IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_VIEW];
- gfx_resource_t *res = resMap.contains(nr) ? resMap[nr] : NULL;
- ViewType viewType = _resMan->getViewType();
-
- gfxr_view_t *view = NULL;
- gfxr_loop_t *loop_data = NULL;
- gfx_pixmap_t *cel_data = NULL;
-
- if (!res) {
- // Wrapper code for the new view decoder
- view = (gfxr_view_t *)malloc(sizeof(gfxr_view_t));
-
- view->ID = nr;
- view->flags = 0;
-
- SciGuiView *guiView = new SciGuiView(_resMan, _screen, _palette, nr);
-
- // Translate view palette
- view->palette = NULL;
-
- 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);
- }
-
- // 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();
- }
-
- view->loops_nr = guiView->getLoopCount();
- view->loops = (gfxr_loop_t*)malloc(sizeof(gfxr_loop_t) * ((view->loops_nr) ? view->loops_nr : 1)); /* Alloc 1 if no loop */
-
- for (int i = 0; i < view->loops_nr; i++) {
- view->loops[i].cels_nr = guiView->getLoopInfo(i)->celCount;
- 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++) {
- sciViewCelInfo *celInfo = guiView->getCelInfo(i, j);
- view->loops[i].cels[j] = gfx_pixmap_alloc_index_data(gfx_new_pixmap(celInfo->width, celInfo->height, nr, i, j));
- gfx_pixmap_t *curCel = view->loops[i].cels[j];
- curCel->color_key = celInfo->clearKey;
- // old code uses malloc() here, so we do so as well, as the buffer will be freed with free() in gfx_free_pixmap
- curCel->index_data = (byte *)malloc(celInfo->width * celInfo->height);
- byte *tmpBuffer = guiView->getBitmap(i, j);
- memcpy(curCel->index_data, tmpBuffer, celInfo->width * celInfo->height);
- curCel->flags = 0;
- curCel->width = celInfo->width;
- curCel->height = celInfo->height;
- curCel->index_width = celInfo->width;
- curCel->index_height = celInfo->height;
- 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()
- }
- }
-
- delete guiView;
-
- if (!res) {
- res = (gfx_resource_t *)malloc(sizeof(gfx_resource_t));
- res->scaled_data.view = NULL;
- res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_VIEW, nr);
- res->lock_sequence_nr = _tagLockCounter;
- resMap[nr] = res;
- } else {
- gfxr_free_view(res->unscaled_data.view);
- }
-
- res->unscaled_data.view = view;
-
- } else {
- res->lock_sequence_nr = _tagLockCounter; // Update lock counter
- view = res->unscaled_data.view;
- }
-
- *loop = CLIP<int>(*loop, 0, view->loops_nr - 1);
- loop_data = view->loops + (*loop);
- *cel = CLIP<int>(*cel, 0, loop_data->cels_nr - 1);
- cel_data = loop_data->cels[*cel];
-
- if (!cel_data->data) {
- gfx_xlate_pixmap(cel_data, _driver->getMode());
- }
-
- return view;
-}
-
-gfx_bitmap_font_t *GfxResManager::getFont(int num, bool scaled) {
- IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_FONT];
- gfx_resource_t *res = NULL;
-
- // Workaround: lsl1sci mixes its own internal fonts with the global
- // SCI ones, so we translate them here, by removing their extra bits
- if (!resMap.contains(num) && !_resMan->testResource(ResourceId(kResourceTypeFont, num)))
- num = num & 0x7ff;
-
- res = resMap.contains(num) ? resMap[num] : NULL;
-
- if (!res) {
- Resource *fontRes = _resMan->findResource(ResourceId(kResourceTypeFont, num), 0);
- if (!fontRes || !fontRes->data)
- return NULL;
-
- gfx_bitmap_font_t *font = gfxr_read_font(fontRes->id.number, fontRes->data, fontRes->size);
-
- if (!res) {
- res = (gfx_resource_t *)malloc(sizeof(gfx_resource_t));
- res->scaled_data.font = NULL;
- res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_FONT, num);
- res->lock_sequence_nr = _tagLockCounter;
- resMap[num] = res;
- } else {
- gfxr_free_font(res->unscaled_data.font);
- }
-
- res->unscaled_data.font = font;
-
- return font;
- } else {
- res->lock_sequence_nr = _tagLockCounter; // Update lock counter
- if (res->unscaled_data.pointer)
- return res->unscaled_data.font;
- else
- return res->scaled_data.font;
- }
-}
-
-} // End of namespace Sci
-
-#endif