diff options
-rw-r--r-- | dists/msvc8/sci.vcproj | 3 | ||||
-rw-r--r-- | dists/msvc9/sci.vcproj | 3 | ||||
-rw-r--r-- | engines/sci/engine/game.cpp | 8 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_options.h | 63 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_pixmap_scale.cpp | 11 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_res_options.cpp | 140 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_res_options.h | 91 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_resmgr.cpp | 136 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_resmgr.h | 23 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_state_internal.h | 1 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_system.h | 3 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_tools.cpp | 70 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_tools.h | 9 | ||||
-rw-r--r-- | engines/sci/gfx/operations.cpp | 11 | ||||
-rw-r--r-- | engines/sci/gfx/operations.h | 7 | ||||
-rw-r--r-- | engines/sci/gui32/res_pic.cpp | 145 | ||||
-rw-r--r-- | engines/sci/module.mk | 1 | ||||
-rw-r--r-- | engines/sci/sci.cpp | 20 |
18 files changed, 23 insertions, 722 deletions
diff --git a/dists/msvc8/sci.vcproj b/dists/msvc8/sci.vcproj index ab754ec989..404a35dfae 100644 --- a/dists/msvc8/sci.vcproj +++ b/dists/msvc8/sci.vcproj @@ -60,10 +60,7 @@ <File RelativePath="..\..\engines\sci\gfx\gfx_driver.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_gui.cpp" /> <File RelativePath="..\..\engines\sci\gfx\gfx_gui.h" /> - <File RelativePath="..\..\engines\sci\gfx\gfx_options.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_pixmap_scale.cpp" /> - <File RelativePath="..\..\engines\sci\gfx\gfx_res_options.cpp" /> - <File RelativePath="..\..\engines\sci\gfx\gfx_res_options.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_resmgr.cpp" /> <File RelativePath="..\..\engines\sci\gfx\gfx_resmgr.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_resource.cpp" /> diff --git a/dists/msvc9/sci.vcproj b/dists/msvc9/sci.vcproj index c70e76c147..f00496ad60 100644 --- a/dists/msvc9/sci.vcproj +++ b/dists/msvc9/sci.vcproj @@ -61,10 +61,7 @@ <File RelativePath="..\..\engines\sci\gfx\gfx_driver.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_gui.cpp" /> <File RelativePath="..\..\engines\sci\gfx\gfx_gui.h" /> - <File RelativePath="..\..\engines\sci\gfx\gfx_options.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_pixmap_scale.cpp" /> - <File RelativePath="..\..\engines\sci\gfx\gfx_res_options.cpp" /> - <File RelativePath="..\..\engines\sci\gfx\gfx_res_options.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_resmgr.cpp" /> <File RelativePath="..\..\engines\sci\gfx\gfx_resmgr.h" /> <File RelativePath="..\..\engines\sci\gfx\gfx_resource.cpp" /> diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index b1c08ee2fe..c2db6fc793 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -283,14 +283,6 @@ int _reset_graphics_input(EngineState *s) { } int game_init_graphics(EngineState *s) { -#ifdef CUSTOM_GRAPHICS_OPTIONS -#ifndef WITH_PIC_SCALING - if (s->gfx_state->options->pic0_unscaled == 0) - warning("Pic scaling was disabled; your version of ScummVM has no support for scaled pic drawing built in."); - - s->gfx_state->options->pic0_unscaled = 1; -#endif -#endif return _reset_graphics_input(s); } diff --git a/engines/sci/gfx/gfx_options.h b/engines/sci/gfx/gfx_options.h deleted file mode 100644 index 398cb379c9..0000000000 --- a/engines/sci/gfx/gfx_options.h +++ /dev/null @@ -1,63 +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$ - * - */ - - -#ifndef SCI_GFX_GFX_OPTIONS_H -#define SCI_GFX_GFX_OPTIONS_H - -#include "sci/gfx/gfx_resource.h" -#include "sci/gfx/gfx_tools.h" - -// Define this to enable user-defined custom graphics options -#define CUSTOM_GRAPHICS_OPTIONS - -#ifdef CUSTOM_GRAPHICS_OPTIONS -#include "sci/gfx/gfx_res_options.h" -#endif - -namespace Sci { - -/** - * All user options to the rendering pipeline - * - * See note in sci_conf.h for config_entry_t before changing types of - * variables - */ -struct gfx_options_t { -#ifdef CUSTOM_GRAPHICS_OPTIONS - /* SCI0 pic resource options */ - int pic0_unscaled; /* Don't draw scaled SCI0 pics */ - DitherMode pic0_dither_mode; /* Mode to use for pic0 dithering, defined in gfx_resource.h */ - - gfx_brush_mode_t pic0_brush_mode; - gfx_line_mode_t pic0_line_mode; - - gfx_res_fullconf_t res_conf; /* Resource customisation: Per-resource palettes etc. */ -#endif -}; - -} // End of namespace Sci - -#endif // SCI_GFX_GFX_OPTIONS_H diff --git a/engines/sci/gfx/gfx_pixmap_scale.cpp b/engines/sci/gfx/gfx_pixmap_scale.cpp index 5681bdac1c..5b126f71d2 100644 --- a/engines/sci/gfx/gfx_pixmap_scale.cpp +++ b/engines/sci/gfx/gfx_pixmap_scale.cpp @@ -99,13 +99,8 @@ static void _gfx_xlate_pixmap_unfiltered(gfx_mode_t *mode, gfx_pixmap_t *pxm, in } } - if (pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX) { - pxm->width = pxm->index_width; - pxm->height = pxm->index_height; - } else { - pxm->width = pxm->index_width * mode->scaleFactor; - pxm->height = pxm->index_height * mode->scaleFactor; - } + pxm->width = pxm->index_width; + pxm->height = pxm->index_height; } @@ -123,7 +118,7 @@ void gfx_xlate_pixmap(gfx_pixmap_t *pxm, gfx_mode_t *mode) { pxm->alpha_map = (byte*)malloc(mode->scaleFactor * mode->scaleFactor * pxm->index_width * pxm->index_height + 1); } - _gfx_xlate_pixmap_unfiltered(mode, pxm, !(pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX)); + _gfx_xlate_pixmap_unfiltered(mode, pxm, false); if (pxm->palette) pxm->palette_revision = pxm->palette->getRevision(); diff --git a/engines/sci/gfx/gfx_res_options.cpp b/engines/sci/gfx/gfx_res_options.cpp deleted file mode 100644 index 8a8637bf48..0000000000 --- a/engines/sci/gfx/gfx_res_options.cpp +++ /dev/null @@ -1,140 +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" -#include "sci/gfx/gfx_system.h" -#include "sci/gfx/gfx_options.h" -#include "sci/gfx/gfx_resmgr.h" - -#ifdef CUSTOM_GRAPHICS_OPTIONS - -namespace Sci { - -static bool matches_patternlist(gfx_res_pattern_t *patterns, int nr, int val) { - for (int i = 0; i < nr; i++) - if (patterns[i].min <= val && patterns[i].max >= val) - return true; - - return false; -} - -static bool resource_matches_patternlists(gfx_res_conf_t *conf, int type, int nr, int loop, int cel) { - int loc; - if (conf->patterns_nr && !matches_patternlist(conf->patterns, conf->patterns_nr, nr)) - return false; - - if (type == GFX_RESOURCE_TYPE_CURSOR) - return true; - - /* Otherwise, we must match at least the loop (pic) - ** and, for views, the cel as well */ - loc = conf->patterns_nr; - if (conf->loops_nr && - !matches_patternlist(conf->patterns + loc, - conf->loops_nr, - loop)) - return false; - - if (type != GFX_RESOURCE_TYPE_VIEW) - return true; - - loc += conf->loops_nr; - - if (!conf->cels_nr) - return true; - - return matches_patternlist(conf->patterns + loc, conf->cels_nr, cel); -} - -static gfx_res_conf_t *find_match(gfx_res_conf_t *conflist, int type, int nr, int loop, int cel) { - while (conflist) { - if (resource_matches_patternlists(conflist, type, nr, loop, cel)) - return conflist; - - conflist = conflist->next; - } - - return NULL; -} - -void apply_mod(byte rFactor, byte gFactor, byte bFactor, gfx_pixmap_t *pxm) { - Palette *pal = pxm->palette; - int i, pal_size = pal ? pal->size() : 0; - - // Id the pixmap's palette is shared, duplicate it - if (pal && pal->isShared()) { - pal = pxm->palette->copy(); - pxm->palette->free(); - pxm->palette = pal; - } - - for (i = 0; i < pal_size; i++) { - PaletteEntry c = pal->getColor(i); - c.r = CLIP<int>((c.r * rFactor) >> 4, 0, 255); - c.g = CLIP<int>((c.g * gFactor) >> 4, 0, 255); - c.b = CLIP<int>((c.b * bFactor) >> 4, 0, 255); - pal->setColor(i, c.r, c.g, c.b); - } -} - -int gfx_get_res_config(gfx_res_fullconf_t res_conf, gfx_pixmap_t *pxm) { - int restype = GFXR_RES_TYPE(pxm->ID); - int nr = GFXR_RES_NR(pxm->ID); - int loop = pxm->loop; - int cel = pxm->cel; - - gfx_res_conf_t *conf; - - if (pxm->ID < 0 || restype < 0 || restype >= GFX_RESOURCE_TYPES_NR) - return 1; // Not appropriate - - // Find assignment config, if available - conf = find_match(res_conf.assign[restype], restype, nr, loop, cel); - if (conf) { - // Assign palette - if (pxm->palette) - pxm->palette->free(); - - pxm->palette = new Palette(conf->colors, - conf->colors_nr); - pxm->palette->name = "res"; - } - - // Find mod config, if available - conf = res_conf.mod[restype]; - while (conf) { - conf = find_match(conf, restype, nr, loop, cel); - if (conf) { - apply_mod(conf->rFactor, conf->gFactor, conf->bFactor, pxm); - conf = conf->next; - } - } - - return 0; -} - -} // End of namespace Sci - -#endif diff --git a/engines/sci/gfx/gfx_res_options.h b/engines/sci/gfx/gfx_res_options.h deleted file mode 100644 index 97347d3427..0000000000 --- a/engines/sci/gfx/gfx_res_options.h +++ /dev/null @@ -1,91 +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$ - * - */ - -#ifndef SCI_GFX_GFX_RES_OPTIONS_H -#define SCI_GFX_GFX_RES_OPTIONS_H - -#ifdef CUSTOM_GRAPHICS_OPTIONS - -#include "sci/sci.h" -#include "sci/gfx/gfx_resource.h" -#include "sci/gfx/gfx_resmgr.h" - -namespace Sci { -/** @name Configuration options for per-resource customisations */ -/** @{ */ - -struct gfx_res_pattern_t { - int min, max; -}; - -/** - * GFX resource modifications/ - */ -struct gfx_res_conf_t { - int type; /**< Resource type-- only one allowed */ - - /* If any of the following is 0, it means that there is no restriction. - ** Otherwise, one of the patterns associated with them must match. */ - int patterns_nr; /**< Number of patterns (only 'view' patterns for views) */ - int loops_nr, cels_nr; /**< Number of loop/cel patterns, for views only. - ** For pics, loops_nr identifies the palette. */ - - gfx_res_pattern_t *patterns; - - int colors_nr; - PaletteEntry *colors; - byte rFactor, gFactor, bFactor; - - gfx_res_conf_t *next; -}; - - -struct gfx_res_fullconf_t { - gfx_res_conf_t *assign[GFX_RESOURCE_TYPES_NR]; - gfx_res_conf_t *mod[GFX_RESOURCE_TYPES_NR]; -}; - - -struct gfx_options_t; - -/** - * Configures a graphical pixmap according to config options. - * - * Modifies pxm as considered appropriate by configuration options. Does - * not do anything in colour index mode. - * - * @param[in] res_conf The resource options according to which modifications - * should be performed - * @param[in] pxm The pixmap to configure - * @return 0 on success, non-zero otherwise - */ -int gfx_get_res_config(gfx_res_fullconf_t res_conf, gfx_pixmap_t *pxm); - -/** @} */ -} // End of namespace Sci - -#endif - -#endif // SCI_GFX_GFX_RES_OPTIONS_H diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp index 9b94ab6a4b..b53aa419fb 100644 --- a/engines/sci/gfx/gfx_resmgr.cpp +++ b/engines/sci/gfx/gfx_resmgr.cpp @@ -44,16 +44,13 @@ namespace Sci { -// Invalid hash mode: Used to invalidate modified pics -#define MODE_INVALID -1 - struct param_struct { int args[4]; GfxDriver *driver; }; -GfxResManager::GfxResManager(gfx_options_t *options, GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette) : - _options(options), _driver(driver), _resMan(resMan), _screen(screen), _palette(palette), +GfxResManager::GfxResManager(GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette) : + _driver(driver), _resMan(resMan), _screen(screen), _palette(palette), _lockCounter(0), _tagLockCounter(0), _staticPalette(0) { gfxr_init_static_palette(); @@ -86,14 +83,8 @@ void GfxResManager::calculatePic(gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pi basic_style.line_mode = GFX_LINE_MODE_CORRECT; basic_style.brush_mode = GFX_BRUSH_MODE_SCALED; - -#ifdef CUSTOM_GRAPHICS_OPTIONS - style.line_mode = _options->pic0_line_mode; - style.brush_mode = _options->pic0_brush_mode; -#else style.line_mode = GFX_LINE_MODE_CORRECT; style.brush_mode = GFX_BRUSH_MODE_RANDOM_ELLIPSES; -#endif if (!res || !res->data) error("calculatePic(): pic number %d not found", nr); @@ -122,11 +113,7 @@ void GfxResManager::calculatePic(gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pi memcpy(scaled_pic->undithered_buffer, scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer_size); -#ifdef CUSTOM_GRAPHICS_OPTIONS - gfxr_dither_pic0(scaled_pic, _options->pic0_dither_mode); -#else gfxr_dither_pic0(scaled_pic, kDitherNone); -#endif } // Mark default palettes @@ -137,41 +124,6 @@ void GfxResManager::calculatePic(gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pi unscaled_pic->visual_map->loop = default_palette; } -int GfxResManager::getOptionsHash(gfx_resource_type_t type) { - switch (type) { - case GFX_RESOURCE_TYPE_VIEW: - // This should never happen - error("getOptionsHash called on a VIEW resource"); - - case GFX_RESOURCE_TYPE_PIC: -#ifdef CUSTOM_GRAPHICS_OPTIONS - if (_resMan->isVGA()) - // NOTE: here, it is assumed that the upper port bound is always 10, but this doesn't seem to matter for the - // generated options hash anyway - return 10; - else - return (_options->pic0_unscaled) ? 0x10000 : - (_options->pic0_dither_mode << 12) | - (_options->pic0_brush_mode << 4) | - (_options->pic0_line_mode); -#else - if (_resMan->isVGA()) - return 10; - else - return 0x10000 | (GFX_BRUSH_MODE_RANDOM_ELLIPSES << 4) | GFX_LINE_MODE_CORRECT; -#endif - - case GFX_RESOURCE_TYPE_FONT: - case GFX_RESOURCE_TYPE_CURSOR: - return 0; - - case GFX_RESOURCE_TYPES_NR: - default: - error("Invalid resource type: %d", type); - return -1; - } -} - #define FREEALL(freecmd, type) \ if (resource->scaled_data.type) \ freecmd(resource->scaled_data.type); \ @@ -299,8 +251,7 @@ void GfxResManager::setStaticPalette(Palette *newPalette) } \ } -static gfxr_pic_t *gfxr_pic_xlate_common(gfx_resource_t *res, int maps, int scaled, int force, gfx_mode_t *mode, - gfx_options_t *options) { +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); @@ -324,27 +275,16 @@ gfxr_pic_t *GfxResManager::getPic(int num, int maps, int flags, int default_pale gfxr_pic_t *npic = NULL; IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_PIC]; gfx_resource_t *res = NULL; - int hash = getOptionsHash(GFX_RESOURCE_TYPE_PIC); int need_unscaled = (_driver->getMode()->scaleFactor != 1); - hash |= (flags << 20) | ((default_palette & 0x7) << 28); - res = resMap.contains(num) ? resMap[num] : NULL; - if (!res || res->mode != hash) { + if (!res) { gfxr_pic_t *pic = NULL; gfxr_pic_t *unscaled_pic = NULL; -#ifdef CUSTOM_GRAPHICS_OPTIONS - if (_options->pic0_unscaled) { - need_unscaled = 0; - pic = gfxr_init_pic(&mode_1x1_color_index, GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, num), _resMan->isVGA()); - } else - pic = gfxr_init_pic(_driver->getMode(), GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, num), _resMan->isVGA()); -#else need_unscaled = 0; pic = gfxr_init_pic(_driver->getMode(), GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, num), _resMan->isVGA()); -#endif if (!pic) { error("Failed to allocate scaled pic"); @@ -375,21 +315,13 @@ gfxr_pic_t *GfxResManager::getPic(int num, int maps, int flags, int default_pale gfxr_free_pic(res->unscaled_data.pic); } - res->mode = hash; res->scaled_data.pic = pic; res->unscaled_data.pic = unscaled_pic; } else { res->lock_sequence_nr = 0; } -#ifdef CUSTOM_GRAPHICS_OPTIONS - npic = gfxr_pic_xlate_common(res, maps, scaled || _options->pic0_unscaled, 0, _driver->getMode(), - _options); -#else - npic = gfxr_pic_xlate_common(res, maps, 1, 0, _driver->getMode(), - _options); -#endif - + npic = gfxr_pic_xlate_common(res, maps, 1, 0, _driver->getMode()); return npic; } @@ -417,44 +349,15 @@ static int get_pic_id(gfx_resource_t *res) { return res->unscaled_data.pic->visual_map->ID; } -static void _gfxr_unscale_pixmap_index_data(gfx_pixmap_t *pxm, gfx_mode_t *mode) { - int xmod = mode->scaleFactor; // Step size horizontally - int ymod = pxm->index_width * mode->scaleFactor; // Vertical step size - int maxpos = pxm->index_width * pxm->index_height; - int pos; - byte *dest = pxm->index_data; - - if (!(pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX)) - return; // It's not scaled! - - for (pos = 0; pos < maxpos; pos += ymod) { - int c; - - for (c = 0; c < pxm->index_width; c += xmod) - *dest++ = pxm->index_data[pos + c]; - // No overwrite since line and offset readers move much faster (proof by in-duction, trivial - // and left to the reader) - } - - pxm->index_width /= mode->scaleFactor; - pxm->index_height /= mode->scaleFactor; - pxm->flags &= ~GFX_PIXMAP_FLAG_SCALED_INDEX; -} - 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 hash = getOptionsHash(GFX_RESOURCE_TYPE_PIC); -#ifdef CUSTOM_GRAPHICS_OPTIONS - int need_unscaled = !(_options->pic0_unscaled) && (_driver->getMode()->scaleFactor != 1 || _driver->getMode()->scaleFactor != 1); -#else int need_unscaled = 1; -#endif res = resMap.contains(old_nr) ? resMap[old_nr] : NULL; - if (!res || (res->mode != MODE_INVALID && res->mode != hash)) { + if (!res) { getPic(old_nr, 0, flags, old_default_palette, 1); res = resMap.contains(old_nr) ? resMap[old_nr] : NULL; @@ -465,31 +368,15 @@ gfxr_pic_t *GfxResManager::addToPic(int old_nr, int new_nr, int flags, int old_d } } -#ifdef CUSTOM_GRAPHICS_OPTIONS - if (_options->pic0_unscaled) // Unscale priority map, if we scaled it earlier -#endif - _gfxr_unscale_pixmap_index_data(res->scaled_data.pic->priority_map, _driver->getMode()); - // 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); - res->mode = MODE_INVALID; // Invalidate - -#ifdef CUSTOM_GRAPHICS_OPTIONS - if (_options->pic0_unscaled) // Scale priority map again, if needed -#endif - res->scaled_data.pic->priority_map = gfx_pixmap_scale_index_data(res->scaled_data.pic->priority_map, _driver->getMode()); - { 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 -#ifdef CUSTOM_GRAPHICS_OPTIONS - pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode(), _options); -#else - pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode(), _options); -#endif + pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode()); set_pic_id(res, old_ID); } @@ -506,7 +393,7 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) { gfxr_loop_t *loop_data = NULL; gfx_pixmap_t *cel_data = NULL; - if (!res || res->mode != hash) { + if (!res) { // Wrapper code for the new view decoder view = (gfxr_view_t *)malloc(sizeof(gfxr_view_t)); @@ -575,13 +462,11 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) { res->scaled_data.view = NULL; res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_VIEW, nr); res->lock_sequence_nr = _tagLockCounter; - res->mode = hash; resMap[nr] = res; } else { gfxr_free_view(res->unscaled_data.view); } - res->mode = hash; res->unscaled_data.view = view; } else { @@ -595,7 +480,6 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) { cel_data = loop_data->cels[*cel]; if (!cel_data->data) { - gfx_get_res_config(_options->res_conf, cel_data); gfx_xlate_pixmap(cel_data, _driver->getMode()); } @@ -605,7 +489,6 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) { gfx_bitmap_font_t *GfxResManager::getFont(int num, bool scaled) { IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_FONT]; gfx_resource_t *res = NULL; - int hash = getOptionsHash(GFX_RESOURCE_TYPE_FONT); // Workaround: lsl1sci mixes its own internal fonts with the global // SCI ones, so we translate them here, by removing their extra bits @@ -614,7 +497,7 @@ gfx_bitmap_font_t *GfxResManager::getFont(int num, bool scaled) { res = resMap.contains(num) ? resMap[num] : NULL; - if (!res || res->mode != hash) { + if (!res) { Resource *fontRes = _resMan->findResource(ResourceId(kResourceTypeFont, num), 0); if (!fontRes || !fontRes->data) return NULL; @@ -626,7 +509,6 @@ gfx_bitmap_font_t *GfxResManager::getFont(int num, bool scaled) { res->scaled_data.font = NULL; res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_FONT, num); res->lock_sequence_nr = _tagLockCounter; - res->mode = hash; resMap[num] = res; } else { gfxr_free_font(res->unscaled_data.font); diff --git a/engines/sci/gfx/gfx_resmgr.h b/engines/sci/gfx/gfx_resmgr.h index 1f03af0818..b6dea1a8e2 100644 --- a/engines/sci/gfx/gfx_resmgr.h +++ b/engines/sci/gfx/gfx_resmgr.h @@ -64,7 +64,6 @@ enum gfx_resource_type_t { struct gfx_resource_t { int ID; /**< Resource ID */ int lock_sequence_nr; /**< See description of lock_counter in GfxResManager */ - int mode; /**< A mode type hash */ /** Scaled pic */ union { @@ -92,28 +91,9 @@ typedef Common::HashMap<int, gfx_resource_t *> IntResMap; /** Graphics resource manager */ class GfxResManager { public: - GfxResManager(gfx_options_t *options, GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette); + GfxResManager(GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette); ~GfxResManager(); - /** - * Calculates a unique hash value for the specified options/type - * setup. - * - * Covering more entries than relevant may slow down the system when - * options are changed, while covering less may result in invalid - * cached data being used. - * Only positive values may be returned, as negative values are used - * internally by the generic resource manager code. - * Also, only the lower 20 bits are available to the interpreter. - * (Yes, this isn't really a "hash" in the traditional sense...) - * - * @param[in] type The type the hash is to be generated for - * @return A hash over the values of the options entries, - * covering entries iff they are relevant for the - * specified type. - */ - int getOptionsHash(gfx_resource_type_t type); - /** * 'Tags' all resources for deletion. @@ -284,7 +264,6 @@ public: } private: - gfx_options_t *_options; GfxDriver *_driver; Palette *_staticPalette; int _lockCounter; /**< Global lock counter; increased for each new diff --git a/engines/sci/gfx/gfx_state_internal.h b/engines/sci/gfx/gfx_state_internal.h index aeb3b05cd4..5334971e23 100644 --- a/engines/sci/gfx/gfx_state_internal.h +++ b/engines/sci/gfx/gfx_state_internal.h @@ -28,7 +28,6 @@ #include "sci/engine/vm.h" #include "sci/gfx/gfx_tools.h" -#include "sci/gfx/gfx_options.h" #include "sci/gfx/operations.h" #include "sci/gfx/gfx_resmgr.h" #include "sci/gfx/gfx_system.h" diff --git a/engines/sci/gfx/gfx_system.h b/engines/sci/gfx/gfx_system.h index 7dd779ca01..31b799b8fe 100644 --- a/engines/sci/gfx/gfx_system.h +++ b/engines/sci/gfx/gfx_system.h @@ -130,9 +130,6 @@ extern rect_t gfx_rect_fullscreen; #define GFX_PIC_COLORS 256 -#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_COLOR_KEY_NONE -1 /* No transpacency colour key */ #define GFX_CURSOR_TRANSPARENT 255 // Cursor colour key diff --git a/engines/sci/gfx/gfx_tools.cpp b/engines/sci/gfx/gfx_tools.cpp index aa98d44332..eef89ded1b 100644 --- a/engines/sci/gfx/gfx_tools.cpp +++ b/engines/sci/gfx/gfx_tools.cpp @@ -144,13 +144,8 @@ gfx_pixmap_t *gfx_pixmap_alloc_data(gfx_pixmap_t *pixmap, gfx_mode_t *mode) { return pixmap; } - if (pixmap->flags & GFX_PIXMAP_FLAG_SCALED_INDEX) { - pixmap->width = pixmap->index_width; - pixmap->height = pixmap->index_height; - } else { - pixmap->width = pixmap->index_width * mode->scaleFactor; - pixmap->height = pixmap->index_height * mode->scaleFactor; - } + pixmap->width = pixmap->index_width; + pixmap->height = pixmap->index_height; size = pixmap->width * pixmap->height; if (!size) @@ -160,65 +155,4 @@ gfx_pixmap_t *gfx_pixmap_alloc_data(gfx_pixmap_t *pixmap, gfx_mode_t *mode) { return pixmap; } -gfx_pixmap_t *gfx_pixmap_scale_index_data(gfx_pixmap_t *pixmap, gfx_mode_t *mode) { - byte *old_data, *new_data, *initial_new_data; - byte *linestart; - int linewidth; - int xl, yl; - int i, yc; - int xfact = mode->scaleFactor; - int yfact = mode->scaleFactor; - - if (xfact == 1 && yfact == 1) - return pixmap; - - if (!pixmap) - return NULL; - - if (pixmap->flags & GFX_PIXMAP_FLAG_SCALED_INDEX) - return pixmap; // Already done - - old_data = pixmap->index_data; - - if (!old_data) { - error("Attempt to scale index data without index data!\n"); - return pixmap; - } - - xl = pixmap->index_width; - yl = pixmap->index_height; - linewidth = xfact * xl; - initial_new_data = new_data = (byte *)malloc(linewidth * yfact * yl); - - for (yc = 0; yc < yl; yc++) { - - linestart = new_data; - - if (xfact == 1) { - memcpy(new_data, old_data, linewidth); - new_data += linewidth; - old_data += linewidth; - } else for (i = 0; i < xl; i++) { - byte fillc = *old_data++; - memset(new_data, fillc, xfact); - new_data += xfact; - } - - for (i = 1; i < yfact; i++) { - memcpy(new_data, linestart, linewidth); - new_data += linewidth; - } - } - - free(pixmap->index_data); - pixmap->index_data = initial_new_data; - - pixmap->flags |= GFX_PIXMAP_FLAG_SCALED_INDEX; - - pixmap->index_width = linewidth; - pixmap->index_height *= yfact; - - return pixmap; -} - } // End of namespace Sci diff --git a/engines/sci/gfx/gfx_tools.h b/engines/sci/gfx/gfx_tools.h index 57a70f50ad..2d15b51022 100644 --- a/engines/sci/gfx/gfx_tools.h +++ b/engines/sci/gfx/gfx_tools.h @@ -180,15 +180,6 @@ void gfx_crossblit_pixmap(gfx_mode_t *mode, gfx_pixmap_t *pxm, int priority, byte *priority_dest, int priority_line_width, int priority_skip); -/** - * Scales the index data associated with a pixmap - * - * @param[in] pixmap The pixmap whose index data should be scaled - * @param[in] mode The mode to scale it to - * @return The pixmap - */ -gfx_pixmap_t *gfx_pixmap_scale_index_data(gfx_pixmap_t *pixmap, gfx_mode_t *mode); - /** @} */ } // End of namespace Sci diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp index 0a51004f1d..9edba13ae8 100644 --- a/engines/sci/gfx/operations.cpp +++ b/engines/sci/gfx/operations.cpp @@ -354,12 +354,9 @@ static void init_aux_pixmap(gfx_pixmap_t **pixmap) { (*pixmap)->palette = new Palette(default_colors, DEFAULT_COLORS_NR); } -void gfxop_init(GfxState *state, - gfx_options_t *options, ResourceManager *resMan, +void gfxop_init(GfxState *state, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette, int scaleFactor) { - state->options = options; state->visible_map = GFX_MASK_VISUAL; - state->options = options; state->disable_dirty = 0; state->_events.clear(); state->pic = state->pic_unscaled = NULL; @@ -370,7 +367,7 @@ void gfxop_init(GfxState *state, state->driver = new GfxDriver(screen, scaleFactor); - state->gfxResMan = new GfxResManager(state->options, state->driver, resMan, screen, palette); + state->gfxResMan = new GfxResManager(state->driver, resMan, screen, palette); gfxop_set_clip_zone(state, gfx_rect(0, 0, 320, 200)); @@ -1382,10 +1379,6 @@ static void _gfxop_set_pic(GfxState *state) { _gfxop_install_pixmap(state->driver, state->pic->visual_map); } -#ifdef CUSTOM_GRAPHICS_OPTIONS - if (state->options->pic0_unscaled) -#endif - state->pic->priority_map = gfx_pixmap_scale_index_data(state->pic->priority_map, state->driver->getMode()); state->driver->setStaticBuffer(state->pic->visual_map, state->pic->priority_map); } diff --git a/engines/sci/gfx/operations.h b/engines/sci/gfx/operations.h index 0255130b37..6e6ff938e5 100644 --- a/engines/sci/gfx/operations.h +++ b/engines/sci/gfx/operations.h @@ -30,7 +30,6 @@ #include "sci/gfx/gfx_resmgr.h" #include "sci/gfx/gfx_tools.h" -#include "sci/gfx/gfx_options.h" #include "sci/gfx/gfx_system.h" #include "sci/uinput.h" @@ -89,8 +88,6 @@ typedef Common::List<rect_t> DirtyRectList; struct GfxState { - gfx_options_t *options; - rect_t clip_zone_unscaled; /**< The current UNSCALED clipping zone */ rect_t clip_zone; /**< The current SCALED clipping zone; a cached scaled version of clip_zone_unscaled */ @@ -131,11 +128,9 @@ struct GfxState { * @param[in] state The state to initialize * @param[in] scaleFactor Scale factor * @param[in] mode Graphics mode to use - * @param[in] options Rendering options * @param[in] resMan Resource manager to use */ -void gfxop_init(GfxState *state, - gfx_options_t *options, ResourceManager *resMan, +void gfxop_init(GfxState *state, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette, int scaleFactor = 1); /** diff --git a/engines/sci/gui32/res_pic.cpp b/engines/sci/gui32/res_pic.cpp index 4ecec28011..fde3425d73 100644 --- a/engines/sci/gui32/res_pic.cpp +++ b/engines/sci/gui32/res_pic.cpp @@ -167,11 +167,6 @@ gfxr_pic_t *gfxr_init_pic(gfx_mode_t *mode, int ID, bool sci1) { pic->visual_map->flags = 0; pic->priority_map->flags = 0; pic->control_map->flags = 0; - if (mode->scaleFactor > 1) { - pic->visual_map->flags |= GFX_PIXMAP_FLAG_SCALED_INDEX; - pic->priority_map->flags |= GFX_PIXMAP_FLAG_SCALED_INDEX; - } - pic->priority_map->palette = gfx_sci0_image_pal[sci0_palette]->getref(); pic->control_map->palette = gfx_sci0_image_pal[sci0_palette]->getref(); @@ -314,28 +309,6 @@ static void _gfxr_auxbuf_line_clear(gfxr_pic_t *pic, rect_t line, int color, int #undef LINEMACRO -#ifdef WITH_PIC_SCALING -static void _gfxr_auxbuf_propagate_changes(gfxr_pic_t *pic, int bitmask) { - // Propagates all filled bits into the planes described by bitmask - unsigned long *data = (unsigned long *)pic->aux_map; - unsigned long clearmask = 0x07070707; - unsigned long andmask = (bitmask << 3) | (bitmask << (3 + 8)) | (bitmask << (3 + 16)) | (bitmask << (3 + 24)); - - if (sizeof(unsigned long) == 8) { // UltraSparc, Alpha, newer MIPSens, etc - andmask |= (andmask << 32); - clearmask |= (clearmask << 32); - } - - for (int i = 0; i < GFXR_AUX_MAP_SIZE / sizeof(unsigned long); i++) { - unsigned long temp = *data & andmask; - temp >>= 3; - *data = (temp | *data) & clearmask; - ++data; - } -} -#endif - - /*** Regular drawing operations ***/ #define PATTERN_FLAG_RECTANGLE 0x10 @@ -878,111 +851,6 @@ static void _gfxr_draw_line(gfxr_pic_t *pic, int x, int y, int ex, int ey, int c } -#define IS_FILL_BOUNDARY(x) (((x) & legalmask) != legalcolor) - -#ifdef WITH_PIC_SCALING - -#define TEST_POINT(xx, yy) \ - if (pic->aux_map[(yy) * 320 + (xx)] & FRESH_PAINT) { \ - mpos = (((yy) * 320 * pic->mode->scaleFactor) + (xx)) * pic->mode->scaleFactor; \ - for (iy = 0; iy < pic->mode->scaleFactor; iy++) { \ - for (ix = 0; ix < pic->mode->scaleFactor; ix++) { \ - if (!IS_FILL_BOUNDARY(test_map[mpos + ix])) { \ - *x = ix + (xx) * pic->mode->scaleFactor; \ - *y = iy + (yy) * pic->mode->scaleFactor; \ - return 0; \ - } \ - mpos += linewidth; \ - } \ - } \ - } - -static int _gfxr_find_fill_point(gfxr_pic_t *pic, int min_x, int min_y, int max_x, int max_y, int x_320, - int y_200, int color, int drawenable, int *x, int *y) { - // returns -1 on failure, 0 on success - int linewidth = pic->mode->scaleFactor * 320; - int mpos, ix, iy; - int size_x = (max_x - min_x + 1) >> 1; - int size_y = (max_y - min_y + 1) >> 1; - int mid_x = min_x + size_x; - int mid_y = min_y + size_y; - int max_size = (size_x > size_y) ? size_x : size_y; - int size; - int legalcolor; - int legalmask; - byte *test_map; - *x = x_320 * pic->mode->scaleFactor; - *y = y_200 * pic->mode->scaleFactor; - - if (size_x < 0 || size_y < 0) - return 0; - - if (drawenable & GFX_MASK_VISUAL) { - test_map = pic->visual_map->index_data; - - if ((color & 0xf) == 0xf // When dithering with white, do more - // conservative checks - || (color & 0xf0) == 0xf0) - legalcolor = 0xff; - else - legalcolor = 0xf0; // Only check the second color - - legalmask = legalcolor; - } else if (drawenable & GFX_MASK_PRIORITY) { - test_map = pic->priority_map->index_data; - legalcolor = 0; - legalmask = 0xf; - } else return -3; - - TEST_POINT(x_320, y_200); // Most likely candidate - TEST_POINT(mid_x, mid_y); // Second most likely candidate - - for (size = 1; size <= max_size; size++) { - int i; - - if (size <= size_y) { - int limited_size = (size > size_x) ? size_x : size; - - for (i = mid_x - limited_size; i <= mid_x + limited_size; i++) { - TEST_POINT(i, mid_y - size); - TEST_POINT(i, mid_y + size); - } - } - - if (size <= size_x) { - int limited_size = (size - 1 > size_y) ? size_y : size - 1; - - for (i = mid_y - limited_size; i <= mid_y + limited_size; i++) { - TEST_POINT(mid_x - size, i); - TEST_POINT(mid_x + size, i); - } - } - } - - return -1; -} - -#undef TEST_POINT - -} // End of namespace Sci - -// Now include the actual filling code (with scaling support) -#define FILL_FUNCTION _gfxr_fill_any -#define FILL_FUNCTION_RECURSIVE _gfxr_fill_any_recursive -#define AUXBUF_FILL_HELPER _gfxr_auxbuf_fill_any_recursive -#define AUXBUF_FILL _gfxr_auxbuf_fill_any -#define DRAW_SCALED -# include "picfill.cpp" -#undef DRAW_SCALED -#undef AUXBUF_FILL -#undef AUXBUF_FILL_HELPER -#undef FILL_FUNCTION_RECURSIVE -#undef FILL_FUNCTION - -namespace Sci { - -#endif // defined(WITH_PIC_SCALING) - } // End of namespace Sci // Include again, but this time without support for scaling @@ -1280,19 +1148,10 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size, case PIC_OP_FILL: debugC(2, kDebugLevelSci0Pic, "Fill @%d\n", pos); while (*(resource + pos) < PIC_OP_FIRST) { - //fprintf(stderr,"####################\n"); GET_ABS_COORDS(x, y); debugC(2, kDebugLevelSci0Pic, "Abs coords %d,%d\n", x, y); - //fprintf(stderr,"C=(%d,%d)\n", x, y + titlebar_size); -#ifdef WITH_PIC_SCALING - if (pic->mode->scaleFactor > 1) - _gfxr_fill_any(pic, x, y + titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ? - color : 0, priority, control, drawenable, titlebar_size); - - else -#endif - _gfxr_fill_1(pic, x, y + titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ? - color : 0, priority, control, drawenable, titlebar_size); + _gfxr_fill_1(pic, x, y + titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ? + color : 0, priority, control, drawenable, titlebar_size); } goto end_op_loop; diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 0f4d95010f..8b038bf286 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -38,7 +38,6 @@ MODULE_OBJS := \ gfx/gfx_driver.o \ gfx/gfx_gui.o \ gfx/gfx_pixmap_scale.o \ - gfx/gfx_res_options.o \ gfx/gfx_resmgr.o \ gfx/gfx_resource.o \ gfx/gfx_support.o \ diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 4837c87b44..9f3a291733 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -138,24 +138,10 @@ Common::Error SciEngine::run() { _gamestate->gfx_state = &gfx_state; // Assign default values to the config manager, in case settings are missing - ConfMan.registerDefault("dither_mode", "0"); - - // Default config: - gfx_options_t gfx_options; - -#ifdef CUSTOM_GRAPHICS_OPTIONS - gfx_options.pic0_unscaled = 1; - gfx_options.pic0_dither_mode = (DitherMode)ConfMan.getInt("dither_mode"); - gfx_options.pic0_brush_mode = GFX_BRUSH_MODE_RANDOM_ELLIPSES; - gfx_options.pic0_line_mode = GFX_LINE_MODE_CORRECT; - for (int i = 0; i < GFX_RESOURCE_TYPES_NR; i++) { - gfx_options.res_conf.assign[i] = NULL; - gfx_options.res_conf.mod[i] = NULL; - } - // Default config ends -#endif + ConfMan.registerDefault("undither", "true"); + screen->unditherSetState(ConfMan.getBool("undither")); - gfxop_init(&gfx_state, &gfx_options, _resMan, screen, palette, 1); + gfxop_init(&gfx_state, _resMan, screen, palette, 1); if (game_init_graphics(_gamestate)) { // Init interpreter graphics warning("Game initialization failed: Error in GFX subsystem. Aborting..."); |