mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-02 08:55:45 +00:00
SCI32: Separate remap types
This commit is contained in:
parent
14e57ac867
commit
0aed08681e
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
|
||||
|
@ -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_;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user