diff options
| author | Paul Gilbert | 2014-04-12 11:00:29 -0400 | 
|---|---|---|
| committer | Paul Gilbert | 2014-04-12 11:00:29 -0400 | 
| commit | 2a979e59a0481f62d67b8b323c79cccaa6552d0a (patch) | |
| tree | e1286144d595129199438a85899662c33aaa15e0 | |
| parent | 5793daa75ea9364b163acaa83c1be126971444e4 (diff) | |
| download | scummvm-rg350-2a979e59a0481f62d67b8b323c79cccaa6552d0a.tar.gz scummvm-rg350-2a979e59a0481f62d67b8b323c79cccaa6552d0a.tar.bz2 scummvm-rg350-2a979e59a0481f62d67b8b323c79cccaa6552d0a.zip  | |
MADS: Refactoring PaletteUsage to use external data arrays
| -rw-r--r-- | engines/mads/animation.cpp | 1 | ||||
| -rw-r--r-- | engines/mads/game.cpp | 7 | ||||
| -rw-r--r-- | engines/mads/palette.cpp | 59 | ||||
| -rw-r--r-- | engines/mads/palette.h | 17 | ||||
| -rw-r--r-- | engines/mads/scene.cpp | 9 | ||||
| -rw-r--r-- | engines/mads/scene.h | 2 | 
6 files changed, 53 insertions, 42 deletions
diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp index 40abdbe26b..0547c6b379 100644 --- a/engines/mads/animation.cpp +++ b/engines/mads/animation.cpp @@ -403,6 +403,7 @@ void Animation::loadInterface(UserInterface &interfaceSurface, MSurface &depthSu  		AAHeader &header, int flags, Common::Array<RGB4> *palAnimData, SceneInfo *sceneInfo) {  	_scene->_depthStyle = 0;  	if (header._animMode <= 2) { +		_vm->_palette->_paletteUsage.setEmpty();  		sceneInfo->load(header._roomNumber, flags, header._interfaceFile, 0, depthSurface, interfaceSurface);  		_scene->_depthStyle = sceneInfo->_depthStyle == 2 ? 1 : 0;  		if (palAnimData) { diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 9296b95d47..9eb2c5c56f 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -189,7 +189,12 @@ void Game::sectionLoop() {  			_vm->_palette->initPalette();  		} -		_vm->_palette->_paletteUsage.load(3, 0xF0, 0xF1, 0xF2); +		// Set up scene palette usage +		_scene._scenePaletteUsage.clear(); +		_scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF0)); +		_scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF1)); +		_scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF2)); +		_vm->_palette->_paletteUsage.load(&_scene._scenePaletteUsage);  		if (!_player._spritesLoaded && _player._loadsFirst) {  			if (_player.loadSprites("")) diff --git a/engines/mads/palette.cpp b/engines/mads/palette.cpp index 2ff16fb5c1..a307a08848 100644 --- a/engines/mads/palette.cpp +++ b/engines/mads/palette.cpp @@ -44,27 +44,20 @@ void RGB6::load(Common::SeekableReadStream *f) {  PaletteUsage::PaletteUsage(MADSEngine *vm) {  	_vm = vm; +	_data = nullptr;  } -void PaletteUsage::load(int count, ...) { -	va_list va; -	va_start(va, count); - -	_data.clear(); -	for (int i = 0; i < count; ++i) -		_data.push_back(UsageEntry(va_arg(va, int))); - -	va_end(va); +void PaletteUsage::load(Common::Array<UsageEntry> *data) { +	_data = data;  } -  void PaletteUsage::getKeyEntries(Common::Array<RGB6> &palette) { -	_data.clear(); +	_data->clear();  	 for (uint i = 0; i < palette.size(); ++i) {  		 byte *uPtr = &palette[i]._flags; -		 if ((*uPtr & 0x10) && _data.size() < 3) { -			 _data.push_back(UsageEntry(i)); +		 if ((*uPtr & 0x10) && _data->size() < 3) { +			 _data->push_back(UsageEntry(i));  		 }  	 }  } @@ -74,12 +67,12 @@ static bool sortHelper(const PaletteUsage::UsageEntry &ue1, const PaletteUsage::  }  void PaletteUsage::prioritize(Common::Array<RGB6> &palette) { -	for (uint i = 0; i < _data.size(); ++i) { -		RGB6 &palEntry = palette[_data[i]._palIndex]; -		_data[i]._sortValue = rgbMerge(palEntry); +	for (uint i = 0; i < _data->size(); ++i) { +		RGB6 &palEntry = palette[(*_data)[i]._palIndex]; +		(*_data)[i]._sortValue = rgbMerge(palEntry);  	} -	Common::sort(_data.begin(), _data.end(), sortHelper); +	Common::sort(_data->begin(), _data->end(), sortHelper);  }  static bool rangeSorter(const PaletteUsage::UsageRange &ur1, const PaletteUsage::UsageRange &ur2) { @@ -105,15 +98,15 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  	int rgbIndex = _vm->_palette->_rgbList.scan();  	uint32 rgbMask = 1 << rgbIndex; -	int varA = flags & 0x8000; -	bool hasUsage = !_vm->_palette->_paletteUsage.empty(); +	bool noUsageFlag = flags & 0x8000; +	bool hasUsage = _data != nullptr;  	bool flag1 = false;  	if (hasUsage) { -		if (varA || _vm->_palette->_paletteUsage.empty()) +		if (noUsageFlag || _data->size() == 0)  			hasUsage = false; -		if (varA && !_vm->_palette->_paletteUsage.empty()) +		if (noUsageFlag && _data->size() > 0)  			flag1 = true;  	} @@ -155,18 +148,18 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  		}  		if (hasUsage && palette[v1]._flags & 0x10) { -			for (uint usageIndex = 0; usageIndex < _data.size() && !var48; ++usageIndex) { -				if (_data[usageIndex]._palIndex == palIndex) { +			for (uint usageIndex = 0; usageIndex < _data->size() && !var48; ++usageIndex) { +				if ((*_data)[usageIndex]._palIndex == palIndex) {  					var48 = true; -					int dataIndex = MIN(usageIndex, _data.size() - 1); -					var4 = _data[dataIndex]._palIndex; +					int dataIndex = MIN(usageIndex, _data->size() - 1); +					var4 = (*_data)[dataIndex]._palIndex;  				}  			}  		}  		if (flag1 && palette[palIndex]._flags & 0x10) { -			for (uint usageIndex = 0; usageIndex < _data.size() && !var48; ++usageIndex) { -				if (_data[usageIndex]._palIndex == palIndex) { +			for (uint usageIndex = 0; usageIndex < _data->size() && !var48; ++usageIndex) { +				if ((*_data)[usageIndex]._palIndex == palIndex) {  					var48 = true;  					var4 = 0xF0 + usageIndex; @@ -180,7 +173,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  			}  		} -		if (!var48 && !varA) { +		if (!var48 && !noUsageFlag) {  			int var2 = (palette[palIndex]._flags & 0x20) ||  				(((flags & 0x2000) || (palette[palIndex]._flags & 0x4000)) &&  				((flags & 0x1000) || (palCount == 0))) ? 0x7fff : 1; @@ -229,7 +222,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  		}  		assert(var48); -		int var52 = (varA && palette[palIndex]._u2) ? 2 : 0; +		int var52 = (noUsageFlag && palette[palIndex]._u2) ? 2 : 0;  		_vm->_palette->_palFlags[var4] |= var52 | rgbMask;  		palette[palIndex]._palIndex = var4; @@ -248,9 +241,9 @@ int PaletteUsage::rgbMerge(RGB6 &palEntry) {  void PaletteUsage::transform(Common::Array<RGB6> &palette) {  	if (!empty()) { -		for (uint i = 0; i < _data.size(); ++i) { -			int palIndex = _data[i]._palIndex; -			_data[i]._palIndex = palette[palIndex]._palIndex; +		for (uint i = 0; i < _data->size(); ++i) { +			int palIndex = (*_data)[i]._palIndex; +			(*_data)[i]._palIndex = palette[palIndex]._palIndex;  		}  	}  } @@ -433,7 +426,7 @@ void Palette::resetGamePalette(int lowRange, int highRange) {  	if (highRange) {  		_palFlags[255] = 1; -		Common::fill(&_palFlags[255 - highRange], &_palFlags[254], _palFlags[255]); +		Common::fill(&_palFlags[256 - highRange], &_palFlags[254], _palFlags[255]);  	}  	_rgbList.clear(); diff --git a/engines/mads/palette.h b/engines/mads/palette.h index cceef09417..74355f8847 100644 --- a/engines/mads/palette.h +++ b/engines/mads/palette.h @@ -71,7 +71,7 @@ public:  		uint16 _palIndex;  		int _sortValue; -		UsageEntry(int palIndex) { _palIndex = palIndex; } +		UsageEntry(int palIndex) { _palIndex = palIndex; _sortValue = -1; }  	};  	struct UsageRange {  		byte _v1, _v2; @@ -80,27 +80,34 @@ public:  	};  private:  	MADSEngine *_vm; -	Common::Array<UsageEntry> _data; +	Common::Array<UsageEntry> *_data;  	int rgbMerge(RGB6 &palEntry);  	int getGamePalFreeIndex(int *palIndex);  	int rgbFactor(byte *palEntry, RGB6 &pal6); + +	Common::Array<UsageEntry> _nullUsage;  public:  	/**  	 * Constructor  	 */  	PaletteUsage(MADSEngine *vm); -	void load(int count, ...); +	void load(Common::Array<UsageEntry> *data);  	/**  	 * Returns whether the usage list is empty  	 */ -	bool empty() const { return _data.size() == 0;  } +	bool empty() const { return _data == nullptr; } + +	uint16 &operator[](int index) { return (*_data)[index]._palIndex; } -	uint16 &operator[](int index) { return _data[index]._palIndex; } +	/** +	 * Assigns the class to an empty usage array +	 */ +	void setEmpty() { _data = &_nullUsage; }  	/**  	 * Gets key entries from the passed palette diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp index 9f8c922861..92c5cedc04 100644 --- a/engines/mads/scene.cpp +++ b/engines/mads/scene.cpp @@ -50,6 +50,8 @@ Scene::Scene(MADSEngine *vm): _vm(vm), _action(_vm), _depthSurface(vm),  	_layer = LAYER_GUI;  	_lookFlag = false; +	_paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF)); +  	_verbList.push_back(VerbInit(VERB_LOOK, VERB_THAT, PREP_NONE));  	_verbList.push_back(VerbInit(VERB_TAKE, VERB_THAT, PREP_NONE));  	_verbList.push_back(VerbInit(VERB_PUSH, VERB_THAT, PREP_NONE)); @@ -121,8 +123,8 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) {  	_spriteSlots.reset(false);  	_sequences.clear();  	_kernelMessages.clear(); +	_vm->_palette->_paletteUsage.load(&_scenePaletteUsage); -	// TODO: palletteUsage reset?  setPalette(_nullPalette);  	int flags = SCENEFLAG_LOAD_SHADOW;  	if (_vm->_dithering)  		flags |= SCENEFLAG_DITHER; @@ -144,7 +146,7 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) {  	loadVocab();  	// Load palette usage -	_vm->_palette->_paletteUsage.load(1, 0xF); +	_vm->_palette->_paletteUsage.load(&_paletteUsageF);  	// Load interface  	flags = PALFLAG_RESERVED | ANIMFLAG_LOAD_BACKGROUND; @@ -157,7 +159,7 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) {  	MSurface depthSurface;  	_animationData->load(_userInterface, depthSurface, prefix, flags, nullptr, nullptr); -	_vm->_palette->_paletteUsage.load(0); +	_vm->_palette->_paletteUsage.load(&_scenePaletteUsage);  	_bandsRange = _sceneInfo->_yBandsEnd - _sceneInfo->_yBandsStart;  	_scaleRange = _sceneInfo->_maxScale - _sceneInfo->_minScale; @@ -576,6 +578,7 @@ void Scene::free() {  		_activeAnimation = nullptr;  	} +	_vm->_palette->_paletteUsage.load(nullptr);  	_hotspots.clear();  	_backgroundSurface.free();  	_depthSurface.free(); diff --git a/engines/mads/scene.h b/engines/mads/scene.h index a49692dc5b..4d9a3f8efa 100644 --- a/engines/mads/scene.h +++ b/engines/mads/scene.h @@ -128,6 +128,8 @@ public:  	Layer _layer;  	bool _lookFlag;  	Common::Point _customDest; +	Common::Array<PaletteUsage::UsageEntry> _paletteUsageF; +	Common::Array<PaletteUsage::UsageEntry> _scenePaletteUsage;  	/**  	 * Constructor  | 
