Remap would crash SCI2.1early games with 19 remap slots, and did not actually work in most cases in SCI2.1mid+ games. The SCI16 implementation was moved to its own separate file but was otherwise touched as little as possible, so may still have similar problems to the SCI32 code. 1. Split SCI16 and SCI32 code into separate files 2. Use -32 prefixes for SCI32 code and no prefix for SCI16 code, where possible, to match other existing code 3. Avoid accidental corruption of values from the VM that may be valid when signed or larger than 8 bits 4. Added documentation 5. Add missing remap CelObj calls 6. Inline where possible in performance-critical code paths 7. Fix bad `matchColor` function, and move it from GfxPalette to GfxRemap32 since it is only used by GfxRemap32 8. Fix bad capitalisation in getCycleMap 9. Remove unnecessary initialisation of SingleRemaps 10. Update architecture to more closely mirror how SSCI worked 11. Clarify the purpose of each type of remap type (and associated variable names) 12. Split large `apply` function into smaller units 13. Fix buffer overrun when loading a SCI2.1early game with remap 14. Remove use of `#define` constants 15. Warn instead of crashing with an error on invalid input (to match SSCI more closely) 16. Change the collision avoidance mechanism between the RemapType enum and remap kernel functions 17. Add save/load function
99 lines
3.2 KiB
C++
99 lines
3.2 KiB
C++
/* 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.
|
|
*
|
|
*/
|
|
|
|
#include "sci/sci.h"
|
|
#include "sci/graphics/palette.h"
|
|
#include "sci/graphics/remap.h"
|
|
#include "sci/graphics/screen.h"
|
|
|
|
namespace Sci {
|
|
|
|
GfxRemap::GfxRemap(GfxPalette *palette)
|
|
: _palette(palette) {
|
|
_remapOn = false;
|
|
resetRemapping();
|
|
}
|
|
|
|
byte GfxRemap::remapColor(byte remappedColor, byte screenColor) {
|
|
assert(_remapOn);
|
|
if (_remappingType[remappedColor] == kRemapByRange)
|
|
return _remappingByRange[screenColor];
|
|
else if (_remappingType[remappedColor] == kRemapByPercent)
|
|
return _remappingByPercent[screenColor];
|
|
else
|
|
error("remapColor(): Color %d isn't remapped", remappedColor);
|
|
|
|
return 0; // should never reach here
|
|
}
|
|
|
|
void GfxRemap::resetRemapping() {
|
|
_remapOn = false;
|
|
_remappingPercentToSet = 0;
|
|
|
|
for (int i = 0; i < 256; i++) {
|
|
_remappingType[i] = kRemapNone;
|
|
_remappingByPercent[i] = i;
|
|
_remappingByRange[i] = i;
|
|
}
|
|
}
|
|
|
|
void GfxRemap::setRemappingPercent(byte color, byte percent) {
|
|
_remapOn = true;
|
|
|
|
// We need to defer the setup of the remapping table every time the screen
|
|
// palette is changed, so that kernelFindColor() can find the correct
|
|
// colors. Set it once here, in case the palette stays the same and update
|
|
// it on each palette change by copySysPaletteToScreen().
|
|
_remappingPercentToSet = percent;
|
|
|
|
for (int i = 0; i < 256; i++) {
|
|
byte r = _palette->_sysPalette.colors[i].r * _remappingPercentToSet / 100;
|
|
byte g = _palette->_sysPalette.colors[i].g * _remappingPercentToSet / 100;
|
|
byte b = _palette->_sysPalette.colors[i].b * _remappingPercentToSet / 100;
|
|
_remappingByPercent[i] = _palette->kernelFindColor(r, g, b);
|
|
}
|
|
|
|
_remappingType[color] = kRemapByPercent;
|
|
}
|
|
|
|
void GfxRemap::setRemappingRange(byte color, byte from, byte to, byte base) {
|
|
_remapOn = true;
|
|
|
|
for (int i = from; i <= to; i++) {
|
|
_remappingByRange[i] = i + base;
|
|
}
|
|
|
|
_remappingType[color] = kRemapByRange;
|
|
}
|
|
|
|
void GfxRemap::updateRemapping() {
|
|
// Check if we need to reset remapping by percent with the new colors.
|
|
if (_remappingPercentToSet) {
|
|
for (int i = 0; i < 256; i++) {
|
|
byte r = _palette->_sysPalette.colors[i].r * _remappingPercentToSet / 100;
|
|
byte g = _palette->_sysPalette.colors[i].g * _remappingPercentToSet / 100;
|
|
byte b = _palette->_sysPalette.colors[i].b * _remappingPercentToSet / 100;
|
|
_remappingByPercent[i] = _palette->kernelFindColor(r, g, b);
|
|
}
|
|
}
|
|
}
|
|
} // End of namespace Sci
|