diff options
| author | Martin Kiewitz | 2010-01-09 20:38:22 +0000 | 
|---|---|---|
| committer | Martin Kiewitz | 2010-01-09 20:38:22 +0000 | 
| commit | 273da184ee4f63904e72e5aa9ae85daa93f5f95e (patch) | |
| tree | 442435b9e6268f84f369e45a2bfa0956c15884c7 | |
| parent | ac66783b5f5243163bcd06da43007e938e3b8f60 (diff) | |
| download | scummvm-rg350-273da184ee4f63904e72e5aa9ae85daa93f5f95e.tar.gz scummvm-rg350-273da184ee4f63904e72e5aa9ae85daa93f5f95e.tar.bz2 scummvm-rg350-273da184ee4f63904e72e5aa9ae85daa93f5f95e.zip | |
SCI: kPortrait - animation included, doesnt seem right currently coordinate offset is missing (cause i cant find it) and mouth movement doesnt seem right...at least the basics work and graphic data is fine
svn-id: r47206
| -rw-r--r-- | engines/sci/graphics/portrait.cpp | 76 | ||||
| -rw-r--r-- | engines/sci/graphics/portrait.h | 12 | 
2 files changed, 50 insertions, 38 deletions
| diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index 67abacfb75..65f82022ef 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -82,7 +82,8 @@ void Portrait::init() {  	}  	_width = READ_LE_UINT16(_fileData + 3);  	_height = READ_LE_UINT16(_fileData + 5); -	_animationCount = READ_LE_UINT16(_fileData + 7); +	_bitmapCount = READ_LE_UINT16(_fileData + 7); +	_bitmaps = new PortraitBitmap[_bitmapCount];  	_portraitPaletteSize = READ_LE_UINT16(_fileData + 13);  	byte *data = _fileData + 17; @@ -98,14 +99,17 @@ void Portrait::init() {  		palNr++; palSize += 3;  	} -	// Read main bitmap -	assert(READ_LE_UINT16(data + 4) == _height); -	assert(READ_LE_UINT16(data + 6) == _width); -	data += 14; // Skip over bitmap header -	_mainBitmapData = data; -	data += _height * _width; -	 -	// TODO: Read animation bitmaps +	// Read all bitmaps +	PortraitBitmap *curBitmap = _bitmaps; +	uint16 bitmapNr; + +	for (bitmapNr = 0; bitmapNr < _bitmapCount; bitmapNr++) { +		curBitmap->height = READ_LE_UINT16(data + 4); +		curBitmap->width = READ_LE_UINT16(data + 6); +		curBitmap->rawBitmap = data + 14; +		data += 14 + (curBitmap->height * curBitmap->width); +		curBitmap++; +	}  }  void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { @@ -118,57 +122,61 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint  	uint syncOffset = 0;  	// Draw base bitmap -	drawMainBitmap(); +	_palette->set(&_portraitPalette, 1); +	drawBitmap(0);  	// Start playing audio...  	_audio->stopAudio();  	_audio->startAudio(resourceId, audioNumber);  	// Do animation depending on sync resource till audio is done playing -	int16 syncCue; +	// TODO: This whole mess doesnt seem to be correct currently +	uint16 syncCue;  	int timerPosition, curPosition; - -	timerPosition = 0;  	while (syncOffset < syncResource->size - 2) { -		timerPosition += (int16)READ_LE_UINT16(syncResource->data + syncOffset); +		timerPosition = (int16)READ_LE_UINT16(syncResource->data + syncOffset);  		syncOffset += 2;  		if (syncOffset < syncResource->size - 2) { -			syncCue = (int16)READ_LE_UINT16(syncResource->data + syncOffset); +			syncCue = READ_LE_UINT16(syncResource->data + syncOffset);  			syncOffset += 2;  		} else { -			syncCue = -1; +			syncCue = 0xFFFF;  		} + +		if (syncCue != 0xFFFF) { +			// Display animation bitmap +			syncCue++; // TODO: Not sure if 0 means main bitmap or animation-frame 0 +			if (syncCue < _bitmapCount) { +				drawBitmap(syncCue); +			} else { +				warning("kPortrait: sync information tried to draw non-existant %d", syncCue); +			} +		} +  		// Wait till syncTime passed, then show specific animation bitmap  		do {  			g_system->delayMillis(10);  			curPosition = _audio->getAudioPosition();  		} while ((curPosition != -1) && (curPosition < timerPosition)); - -		if (syncCue >= 0) { -			// Display animation bitmap -			drawBitmap(syncCue); -			warning("display animation %d", syncCue); -		}  	}  } -void Portrait::drawMainBitmap() { -	byte *data = _mainBitmapData; -	_palette->set(&_portraitPalette, 1); -	for (int y = 0; y < _height; y++) { -		for (int x = 0; x < _width; x++) { +// TODO: coordinate offset is missing...can't find it in the bitmap header nor in the main header +void Portrait::drawBitmap(uint16 bitmapNr) { +	byte *data = _bitmaps[bitmapNr].rawBitmap; +	uint16 bitmapHeight = _bitmaps[bitmapNr].height; +	uint16 bitmapWidth = _bitmaps[bitmapNr].width; + +	for (int y = 0; y < bitmapHeight; y++) { +		for (int x = 0; x < bitmapWidth; x++) {  			_screen->putPixelOnDisplay(_position.x + x, _position.y + y, _portraitPalette.mapping[*data++]);  		}  	} -	Common::Rect mainBitmap = Common::Rect(_width, _height); -	mainBitmap.moveTo(_position.x, _position.y); -	_screen->copyDisplayRectToScreen(mainBitmap); +	Common::Rect bitmapRect = Common::Rect(bitmapWidth, bitmapHeight); +	bitmapRect.moveTo(_position.x, _position.y); +	_screen->copyDisplayRectToScreen(bitmapRect);  	g_system->updateScreen();  } -void Portrait::drawBitmap(int16 bitmapNr) { -	// 0 seems to be main bitmap -} -  } // End of namespace Sci diff --git a/engines/sci/graphics/portrait.h b/engines/sci/graphics/portrait.h index 30984e091b..71218bdd90 100644 --- a/engines/sci/graphics/portrait.h +++ b/engines/sci/graphics/portrait.h @@ -28,6 +28,11 @@  namespace Sci { +struct PortraitBitmap { +	int16 width, height; +	byte *rawBitmap; +}; +  class Portrait {  public:  	Portrait(ResourceManager *resMan, Screen *screen, SciPalette *palette, AudioPlayer *audio, Common::String resourceName); @@ -38,8 +43,7 @@ public:  private:  	void init(); -	void drawMainBitmap(); -	void drawBitmap(int16 bitmapNr); +	void drawBitmap(uint16 bitmapNr);  	ResourceManager *_resMan;  	Screen *_screen; @@ -53,11 +57,11 @@ private:  	uint16 _height;  	uint16 _width; -	uint16 _animationCount;  	uint16 _portraitPaletteSize;  	Palette _portraitPalette; -	byte *_mainBitmapData; +	uint16 _bitmapCount; +	PortraitBitmap *_bitmaps;  	Common::Point _position;  }; | 
