diff options
| author | Alyssa Milburn | 2011-07-15 23:44:00 +0200 | 
|---|---|---|
| committer | Alyssa Milburn | 2011-07-15 23:44:00 +0200 | 
| commit | 97d7767e895955673d4ad756f741e46c40e76b51 (patch) | |
| tree | a242180b17263c2bc002cbcb122facbae25b7171 | |
| parent | f396e77cacdea88214baada40ce464b2baabdfa1 (diff) | |
| download | scummvm-rg350-97d7767e895955673d4ad756f741e46c40e76b51.tar.gz scummvm-rg350-97d7767e895955673d4ad756f741e46c40e76b51.tar.bz2 scummvm-rg350-97d7767e895955673d4ad756f741e46c40e76b51.zip | |
COMPOSER: Decompress sprites at load time.
| -rw-r--r-- | engines/composer/composer.cpp | 54 | ||||
| -rw-r--r-- | engines/composer/composer.h | 4 | 
2 files changed, 32 insertions, 26 deletions
| diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp index 9b907765d0..cde2e0bb0a 100644 --- a/engines/composer/composer.cpp +++ b/engines/composer/composer.cpp @@ -457,9 +457,13 @@ void ComposerEngine::addSprite(uint16 id, uint16 animId, uint16 zorder, const Co  	sprite.animId = animId;  	sprite.zorder = zorder;  	sprite.pos = pos; +	if (!initSprite(sprite)) { +		warning("ignoring addSprite on invalid sprite %d", id); +		return; +	}  	for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) { -		if (sprite.zorder < i->zorder) +		if (sprite.zorder > i->zorder)  			continue;  		_sprites.insert(i, sprite);  		return; @@ -473,6 +477,7 @@ void ComposerEngine::removeSprite(uint16 id, uint16 animId) {  			continue;  		if (i->animId && animId && (i->animId != animId))  			continue; +		i->surface.free();  		i = _sprites.reverse_erase(i);  		return;  	} @@ -547,10 +552,8 @@ Common::Error ComposerEngine::run() {  		if (lastDrawTime + frameTime <= thisTime) {  			lastDrawTime += frameTime; -			if (hasResource(ID_BMAP, 1000)) -				drawBMAP(1000, 0, 0);  			for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) { -				drawBMAP(i->id, i->pos.x, i->pos.y); +				drawSprite(*i);  			}  			_system->copyRectToScreen((byte *)_surface.pixels, _surface.pitch, 0, 0, _surface.w, _surface.h); @@ -662,7 +665,8 @@ void ComposerEngine::loadLibrary(uint id) {  	delete stream;*/  	// TODO: set background properly -	// +	addSprite(1000, 0, 0, Common::Point()); +  	// TODO: better CTBL logic  	loadCTBL(1000, 100); @@ -1105,48 +1109,48 @@ void ComposerEngine::decompressBitmap(uint16 type, Common::SeekableReadStream *s  	}  } -void ComposerEngine::drawBMAP(uint id, uint x, uint y) { +bool ComposerEngine::initSprite(Sprite &sprite) {  	Common::SeekableReadStream *stream = NULL; -	if (hasResource(ID_BMAP, id)) -		stream = getResource(ID_BMAP, id); +	if (hasResource(ID_BMAP, sprite.id)) +		stream = getResource(ID_BMAP, sprite.id);  	else  		for (Common::List<Pipe *>::iterator k = _pipes.begin(); k != _pipes.end(); k++) {  			Pipe *pipe = *k; -			if (!pipe->hasResource(ID_BMAP, id)) +			if (!pipe->hasResource(ID_BMAP, sprite.id))  				continue; -			stream = pipe->getResource(ID_BMAP, id, true); +			stream = pipe->getResource(ID_BMAP, sprite.id, true);  			break;  		} -	if (!stream) { -		// FIXME -		warning("couldn't find BMAP %d", id); -		return; -	} +	if (!stream) +		return false;  	uint16 type = stream->readUint16LE();  	uint16 height = stream->readUint16LE();  	uint16 width = stream->readUint16LE();  	uint32 size = stream->readUint32LE(); -	debug(1, "BMAP: type %d, width %d, height %d, size %d", type, width, height, size); +	debug(1, "loading BMAP: type %d, width %d, height %d, size %d", type, width, height, size); + +	sprite.surface.create(width, height, Graphics::PixelFormat::createFormatCLUT8()); +	decompressBitmap(type, stream, (byte *)sprite.surface.pixels, size, width, height); +	delete stream; -	byte *buffer = new byte[width * height]; -	decompressBitmap(type, stream, buffer, size, width, height); +	return true; +} -	debug(1, "draw at %d,%d", x, y); +void ComposerEngine::drawSprite(const Sprite &sprite) { +	int x = sprite.pos.x; +	int y = sprite.pos.y;  	// incoming data is BMP-style (bottom-up), so flip it  	byte *pixels = (byte *)_surface.pixels; -	for (uint j = 0; j < height; j++) { -		byte *in = buffer + (height - j - 1) * width; +	for (uint j = 0; j < sprite.surface.h; j++) { +		byte *in = (byte *)sprite.surface.pixels + (sprite.surface.h - j - 1) * sprite.surface.w;  		byte *out = pixels + ((j + y) * _surface.w) + x; -		for (uint i = 0; i < width; i++) +		for (uint i = 0; i < sprite.surface.w; i++)  			if (in[i])  				out[i] = in[i];  	} - -	delete[] buffer; -	delete stream;  }  } // End of namespace Composer diff --git a/engines/composer/composer.h b/engines/composer/composer.h index b18b3575f2..4955a0ce3a 100644 --- a/engines/composer/composer.h +++ b/engines/composer/composer.h @@ -64,6 +64,7 @@ struct Sprite {  	uint16 animId;  	uint16 zorder;  	Common::Point pos; +	Graphics::Surface surface;  };  struct AnimationEntry { @@ -199,7 +200,8 @@ private:  	void loadCTBL(uint id, uint fadePercent);  	void decompressBitmap(uint16 type, Common::SeekableReadStream *stream, byte *buffer, uint32 size, uint width, uint height); -	void drawBMAP(uint id, uint x, uint y); +	bool initSprite(Sprite &sprite); +	void drawSprite(const Sprite &sprite);  };  } // End of namespace Composer | 
