SCI32: Separate remap types

This commit is contained in:
Colin Snover 2016-06-25 21:19:47 +02:00 committed by Willem Jan Palenstijn
parent 14e57ac867
commit 0aed08681e
5 changed files with 40 additions and 43 deletions

View File

@ -21,31 +21,23 @@
*/
#include "sci/sci.h"
#include "sci/resource.h"
#include "sci/graphics/palette.h"
#include "sci/graphics/palette32.h"
#include "sci/graphics/remap.h"
#include "sci/graphics/screen.h"
namespace Sci {
#pragma mark -
#pragma mark SCI16 remapping (QFG4 demo)
GfxRemap::GfxRemap(GfxPalette *palette)
: _palette(palette) {
_remapOn = false;
resetRemapping();
}
GfxRemap::~GfxRemap() {
}
byte GfxRemap::remapColor(byte remappedColor, byte screenColor) {
assert(_remapOn);
if (_remappingType[remappedColor] == kRemappingByRange)
if (_remappingType[remappedColor] == kRemapByRange)
return _remappingByRange[screenColor];
else if (_remappingType[remappedColor] == kRemappingByPercent)
else if (_remappingType[remappedColor] == kRemapByPercent)
return _remappingByPercent[screenColor];
else
error("remapColor(): Color %d isn't remapped", remappedColor);
@ -58,7 +50,7 @@ void GfxRemap::resetRemapping() {
_remappingPercentToSet = 0;
for (int i = 0; i < 256; i++) {
_remappingType[i] = kRemappingNone;
_remappingType[i] = kRemapNone;
_remappingByPercent[i] = i;
_remappingByRange[i] = i;
}
@ -80,7 +72,7 @@ void GfxRemap::setRemappingPercent(byte color, byte percent) {
_remappingByPercent[i] = _palette->kernelFindColor(r, g, b);
}
_remappingType[color] = kRemappingByPercent;
_remappingType[color] = kRemapByPercent;
}
void GfxRemap::setRemappingRange(byte color, byte from, byte to, byte base) {
@ -90,7 +82,7 @@ void GfxRemap::setRemappingRange(byte color, byte from, byte to, byte base) {
_remappingByRange[i] = i + base;
}
_remappingType[color] = kRemappingByRange;
_remappingType[color] = kRemapByRange;
}
void GfxRemap::updateRemapping() {

View File

@ -30,33 +30,30 @@ namespace Sci {
class GfxScreen;
enum ColorRemappingType {
kRemappingNone = 0,
kRemappingByRange = 1,
kRemappingByPercent = 2,
kRemappingToGray = 3,
kRemappingToPercentGray = 4
};
/**
* Remap class, handles color remapping
* This class handles color remapping for the QFG4 demo.
*/
class GfxRemap {
private:
enum ColorRemappingType {
kRemapNone = 0,
kRemapByRange = 1,
kRemapByPercent = 2
};
public:
GfxRemap(GfxPalette *_palette);
~GfxRemap();
void resetRemapping();
void setRemappingPercent(byte color, byte percent);
void setRemappingRange(byte color, byte from, byte to, byte base);
bool isRemapped(byte color) const {
return _remapOn && (_remappingType[color] != kRemappingNone);
return _remapOn && (_remappingType[color] != kRemapNone);
}
byte remapColor(byte remappedColor, byte screenColor);
void updateRemapping();
private:
GfxScreen *_screen;
GfxPalette *_palette;
bool _remapOn;

View File

@ -28,7 +28,7 @@ namespace Sci {
GfxRemap32::GfxRemap32(GfxPalette32 *palette) : _palette(palette) {
for (int i = 0; i < REMAP_COLOR_COUNT; i++)
_remaps[i] = RemapParams(0, 0, 0, 0, 100, kRemappingNone);
_remaps[i] = RemapParams(0, 0, 0, 0, 100, kRemapNone);
_noMapStart = _noMapCount = 0;
_update = false;
_remapCount = 0;
@ -41,13 +41,13 @@ GfxRemap32::GfxRemap32(GfxPalette32 *palette) : _palette(palette) {
void GfxRemap32::remapOff(byte color) {
if (!color) {
for (int i = 0; i < REMAP_COLOR_COUNT; i++)
_remaps[i] = RemapParams(0, 0, 0, 0, 100, kRemappingNone);
_remaps[i] = RemapParams(0, 0, 0, 0, 100, kRemapNone);
_remapCount = 0;
} else {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
const byte index = _remapEndColor - color;
_remaps[index] = RemapParams(0, 0, 0, 0, 100, kRemappingNone);
_remaps[index] = RemapParams(0, 0, 0, 0, 100, kRemapNone);
_remapCount--;
}
@ -56,7 +56,7 @@ void GfxRemap32::remapOff(byte color) {
void GfxRemap32::setRemappingRange(byte color, byte from, byte to, byte base) {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
_remaps[_remapEndColor - color] = RemapParams(from, to, base, 0, 100, kRemappingByRange);
_remaps[_remapEndColor - color] = RemapParams(from, to, base, 0, 100, kRemapByRange);
initColorArrays(_remapEndColor - color);
_remapCount++;
_update = true;
@ -64,7 +64,7 @@ void GfxRemap32::setRemappingRange(byte color, byte from, byte to, byte base) {
void GfxRemap32::setRemappingPercent(byte color, byte percent) {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
_remaps[_remapEndColor - color] = RemapParams(0, 0, 0, 0, percent, kRemappingByPercent);
_remaps[_remapEndColor - color] = RemapParams(0, 0, 0, 0, percent, kRemapByPercent);
initColorArrays(_remapEndColor - color);
_remapCount++;
_update = true;
@ -72,7 +72,7 @@ void GfxRemap32::setRemappingPercent(byte color, byte percent) {
void GfxRemap32::setRemappingToGray(byte color, byte gray) {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
_remaps[_remapEndColor - color] = RemapParams(0, 0, 0, gray, 100, kRemappingToGray);
_remaps[_remapEndColor - color] = RemapParams(0, 0, 0, gray, 100, kRemapToGray);
initColorArrays(_remapEndColor - color);
_remapCount++;
_update = true;
@ -80,7 +80,7 @@ void GfxRemap32::setRemappingToGray(byte color, byte gray) {
void GfxRemap32::setRemappingToPercentGray(byte color, byte gray, byte percent) {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
_remaps[_remapEndColor - color] = RemapParams(0, 0, 0, gray, percent, kRemappingToPercentGray);
_remaps[_remapEndColor - color] = RemapParams(0, 0, 0, gray, percent, kRemapToPercentGray);
initColorArrays(_remapEndColor - color);
_remapCount++;
_update = true;
@ -94,13 +94,13 @@ void GfxRemap32::setNoMatchRange(byte from, byte count) {
bool GfxRemap32::remapEnabled(byte color) const {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
const byte index = _remapEndColor - color;
return (_remaps[index].type != kRemappingNone);
return (_remaps[index].type != kRemapNone);
}
byte GfxRemap32::remapColor(byte color, byte target) {
assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT);
const byte index = _remapEndColor - color;
if (_remaps[index].type != kRemappingNone)
if (_remaps[index].type != kRemapNone)
return _remaps[index].remap[target];
else
return target;
@ -127,9 +127,9 @@ bool GfxRemap32::updateRemap(byte index, bool palChanged) {
Common::fill(_targetChanged, _targetChanged + NON_REMAPPED_COLOR_COUNT, false);
switch (curRemap->type) {
case kRemappingNone:
case kRemapNone:
return false;
case kRemappingByRange:
case kRemapByRange:
for (int i = 0; i < NON_REMAPPED_COLOR_COUNT; i++) {
if (curRemap->from <= i && i <= curRemap->to)
result = i + curRemap->base;
@ -144,7 +144,7 @@ bool GfxRemap32::updateRemap(byte index, bool palChanged) {
curRemap->colorChanged[i] = true;
}
return changed;
case kRemappingByPercent:
case kRemapByPercent:
for (int i = 1; i < NON_REMAPPED_COLOR_COUNT; i++) {
// NOTE: This method uses nextPalette instead of curPalette
Color color = nextPalette->colors[i];
@ -172,7 +172,7 @@ bool GfxRemap32::updateRemap(byte index, bool palChanged) {
Common::fill(curRemap->colorChanged, curRemap->colorChanged + NON_REMAPPED_COLOR_COUNT, false);
curRemap->oldPercent = curRemap->percent;
return changed;
case kRemappingToGray:
case kRemapToGray:
for (int i = 1; i < NON_REMAPPED_COLOR_COUNT; i++) {
Color color = curPalette->colors[i];
@ -200,7 +200,7 @@ bool GfxRemap32::updateRemap(byte index, bool palChanged) {
Common::fill(curRemap->colorChanged, curRemap->colorChanged + NON_REMAPPED_COLOR_COUNT, false);
curRemap->oldGray = curRemap->gray;
return changed;
case kRemappingToPercentGray:
case kRemapToPercentGray:
for (int i = 1; i < NON_REMAPPED_COLOR_COUNT; i++) {
Color color = curPalette->colors[i];

View File

@ -24,13 +24,20 @@
#define SCI_GRAPHICS_REMAP32_H
#include "common/array.h"
#include "sci/graphics/remap.h"
namespace Sci {
#define REMAP_COLOR_COUNT 9
#define NON_REMAPPED_COLOR_COUNT 236
enum RemapType {
kRemapNone = 0,
kRemapByRange = 1,
kRemapByPercent = 2,
kRemapToGray = 3,
kRemapToPercentGray = 4
};
struct RemapParams {
byte from;
byte to;
@ -39,7 +46,7 @@ struct RemapParams {
byte oldGray;
byte percent;
byte oldPercent;
ColorRemappingType type;
RemapType type;
Color curColor[256];
Color targetColor[256];
byte distance[256];
@ -48,7 +55,7 @@ struct RemapParams {
RemapParams() {
from = to = base = gray = oldGray = percent = oldPercent = 0;
type = kRemappingNone;
type = kRemapNone;
// curColor and targetColor are initialized in GfxRemap32::initColorArrays
memset(curColor, 0, 256 * sizeof(Color));
@ -59,7 +66,7 @@ struct RemapParams {
Common::fill(colorChanged, colorChanged + ARRAYSIZE(colorChanged), true);
}
RemapParams(byte from_, byte to_, byte base_, byte gray_, byte percent_, ColorRemappingType type_) {
RemapParams(byte from_, byte to_, byte base_, byte gray_, byte percent_, RemapType type_) {
from = from_;
to = to_;
base = base_;

View File

@ -55,6 +55,7 @@ struct LoopInfo {
class GfxScreen;
class GfxPalette;
class Resource;
/**
* View class, handles loading of view resources and drawing contained cels to screen