[Scummvm-cvs-logs] SF.net SVN: scummvm:[47210] scummvm/trunk/engines/sci/graphics

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sat Jan 9 22:12:20 CET 2010


Revision: 47210
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47210&view=rev
Author:   m_kiewitz
Date:     2010-01-09 21:12:08 +0000 (Sat, 09 Jan 2010)

Log Message:
-----------
kPortrait: found the coordinate offsets, corrected actual bitmap size (sometimes extra bytes are appended per line) animation bitmaps now valid

Modified Paths:
--------------
    scummvm/trunk/engines/sci/graphics/portrait.cpp
    scummvm/trunk/engines/sci/graphics/portrait.h

Modified: scummvm/trunk/engines/sci/graphics/portrait.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/portrait.cpp	2010-01-09 20:50:45 UTC (rev 47209)
+++ scummvm/trunk/engines/sci/graphics/portrait.cpp	2010-01-09 21:12:08 UTC (rev 47210)
@@ -103,14 +103,29 @@
 	// Read all bitmaps
 	PortraitBitmap *curBitmap = _bitmaps;
 	uint16 bitmapNr;
+	uint16 bytesPerLine;
 
 	for (bitmapNr = 0; bitmapNr < _bitmapCount; bitmapNr++) {
+		curBitmap->width = READ_LE_UINT16(data + 2);
 		curBitmap->height = READ_LE_UINT16(data + 4);
-		curBitmap->width = READ_LE_UINT16(data + 6);
+		bytesPerLine = READ_LE_UINT16(data + 6);
+		if (bytesPerLine < curBitmap->width)
+			error("kPortrait: bytesPerLine larger than actual width");
+		curBitmap->extraBytesPerLine = bytesPerLine - curBitmap->width;
 		curBitmap->rawBitmap = data + 14;
-		data += 14 + (curBitmap->height * curBitmap->width);
+		data += 14 + (curBitmap->height * bytesPerLine);
 		curBitmap++;
 	}
+
+	// Offset table follows
+	curBitmap = _bitmaps;
+	data += 18;
+	for (bitmapNr = 0; bitmapNr < _bitmapCount; bitmapNr++) {
+		curBitmap->displaceX = READ_LE_UINT16(data);
+		curBitmap->displaceY = READ_LE_UINT16(data + 2);
+		data += 14;
+		curBitmap++;
+	}
 }
 
 void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) {
@@ -169,15 +184,20 @@
 	byte *data = _bitmaps[bitmapNr].rawBitmap;
 	uint16 bitmapHeight = _bitmaps[bitmapNr].height;
 	uint16 bitmapWidth = _bitmaps[bitmapNr].width;
+	Common::Point bitmapPosition = _position;
 
+	bitmapPosition.x += _bitmaps[bitmapNr].displaceX;
+	bitmapPosition.y += _bitmaps[bitmapNr].displaceY;
+
 	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++]);
+			_screen->putPixelOnDisplay(bitmapPosition.x + x, bitmapPosition.y + y, _portraitPalette.mapping[*data++]);
 		}
+		data += _bitmaps[bitmapNr].extraBytesPerLine;
 	}
 
 	Common::Rect bitmapRect = Common::Rect(bitmapWidth, bitmapHeight);
-	bitmapRect.moveTo(_position.x, _position.y);
+	bitmapRect.moveTo(bitmapPosition.x, bitmapPosition.y);
 	_screen->copyDisplayRectToScreen(bitmapRect);
 	g_system->updateScreen();
 }

Modified: scummvm/trunk/engines/sci/graphics/portrait.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/portrait.h	2010-01-09 20:50:45 UTC (rev 47209)
+++ scummvm/trunk/engines/sci/graphics/portrait.h	2010-01-09 21:12:08 UTC (rev 47210)
@@ -30,6 +30,8 @@
 
 struct PortraitBitmap {
 	int16 width, height;
+	int16 extraBytesPerLine;
+	uint16 displaceX, displaceY;
 	byte *rawBitmap;
 };
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list