[Scummvm-git-logs] scummvm master -> 90e97f7069cf05df5da75eade74ac18380622895

stevenhoefel stevenhoefel at hotmail.com
Thu Apr 6 06:55:29 CEST 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
90e97f7069 DIRECTOR: Further work loading assets from D5 Movies.


Commit: 90e97f7069cf05df5da75eade74ac18380622895
    https://github.com/scummvm/scummvm/commit/90e97f7069cf05df5da75eade74ac18380622895
Author: stevenhoefel (stevenhoefel at hotmail.com)
Date: 2017-04-06T14:55:15+10:00

Commit Message:
DIRECTOR: Further work loading assets from D5 Movies.

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/frame.cpp
    engines/director/score.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 1bd554f..9fe84b4 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -26,7 +26,7 @@
 
 namespace Director {
 
-BitmapCast::BitmapCast(Common::ReadStreamEndian &stream, uint16 version) {
+BitmapCast::BitmapCast(Common::ReadStreamEndian &stream, uint32 castTag, uint16 version) {
 	if (version < 4) {
 		flags = stream.readByte();
 		someFlaggyThing = stream.readUint16();
@@ -71,35 +71,33 @@ BitmapCast::BitmapCast(Common::ReadStreamEndian &stream, uint16 version) {
 		uint32 unk2 = stream.readUint32();
 		uint32 unk3 = stream.readUint32();
 		uint32 unk4 = stream.readUint32();
+		uint32 unk5 = stream.readUint32();
+		uint32 unk6 = stream.readUint32();
+		uint32 unk7 = stream.readUint32();
 
 		uint16 count = stream.readUint16();
 		for (uint16 cc = 0; cc < count; cc++)
 			stream.readUint32();
 
-		stream.readUint32();
-		byte stringLength = stream.readByte();
-		char* string = new char[stringLength];
-		stream.read(string, stringLength);
-
-		stream.readUint16();
-		/*node.x1 = stream.readUint16();
-		if (node.x1 > 2048) node.x1 = -(0xffff - node.x1);
-		node.y1 = ReadWordAsInt(ref start, true);
-		if (node.y1 > 2048) node.y1 = -(0xffff - node.y1);
-		node.x2 = ReadWordAsInt(ref start, true);
-		node.y2 = ReadWordAsInt(ref start, true);*/
+		uint32 stringLength = stream.readUint32();
+		for (int s = 0; s < stringLength; s++) 
+			stream.readByte();
 
+		uint16 width = stream.readUint16LE(); //maybe?
 		initialRect = Score::readRect(stream);
 
-		//node.h = (node.x2 - node.x1);
-		//node.w = (node.y2 - node.y1);
-
-		stream.readUint16(); 
-		stream.readUint16();
+		uint32 somethingElse = stream.readUint32();
+		boundingRect = Score::readRect(stream);
 
 		bitsPerPixel = stream.readUint16();
+
+		regX = 0;
+		regY = 0;
+
+		stream.readUint32();
 	}
 	modified = 0;
+	tag = castTag;
 }
 
 TextCast::TextCast(Common::ReadStreamEndian &stream, uint16 version) {
@@ -238,7 +236,7 @@ ButtonCast::ButtonCast(Common::ReadStreamEndian &stream, uint16 version) : TextC
 ScriptCast::ScriptCast(Common::ReadStreamEndian &stream, uint16 version) {
 	if (version < 4) {
 		error("Unhandled Script cast");
-	} else {
+	} else if (version == 4) {
 		stream.readByte();
 		stream.readByte();
 
@@ -251,6 +249,18 @@ ScriptCast::ScriptCast(Common::ReadStreamEndian &stream, uint16 version) {
 
 		stream.readByte(); // There should be no more data
 		assert(stream.eos());
+	} else if (version > 4) {
+		stream.readByte();
+		stream.readByte();
+
+		initialRect = Score::readRect(stream);
+		boundingRect = Score::readRect(stream);
+
+		id = stream.readUint32();
+
+		debugC(4, kDebugLoading, "CASt: Script id: %d", id);
+
+		// WIP need to complete this!
 	}
 	modified = 0;
 }
diff --git a/engines/director/cast.h b/engines/director/cast.h
index f304456..69641b5 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -59,7 +59,7 @@ public:
 
 class BitmapCast : public Cast {
 public:
-	BitmapCast(Common::ReadStreamEndian &stream, uint16 version = 2);
+	BitmapCast(Common::ReadStreamEndian &stream, uint32 castTag, uint16 version = 2);
 
 	uint16 regX;
 	uint16 regY;
@@ -68,6 +68,8 @@ public:
 	uint16 unk1, unk2;
 
 	uint16 bitsPerPixel;
+
+	uint32 tag;
 };
 
 enum ShapeType {
diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index ba53d6d..ba5b903 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -610,7 +610,7 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
 				int x = _sprites[i]->_startPoint.x - regX + rectLeft;
 				int y = _sprites[i]->_startPoint.y - regY + rectTop;
 				int height = _sprites[i]->_height;
-				int width = _sprites[i]->_width;
+				int width = _vm->getVersion() > 4 ? _sprites[i]->_bitmapCast->initialRect.width() : _sprites[i]->_width;
 
 				Common::Rect drawRect(x, y, x + width, y + height);
 				addDrawRect(i, drawRect);
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 38f5ba6..72913d4 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -135,6 +135,9 @@ void Score::loadArchive() {
 
 	if (_movieArchive->hasResource(MKTAG('V', 'W', 'C', 'F'), -1)) {
 		loadConfig(*_movieArchive->getResource(MKTAG('V', 'W', 'C', 'F'), 1024));
+	} else {
+		// TODO: Source this from somewhere!
+		_movieRect = Common::Rect(0, 0, 640, 480);
 	}
 
 	if (_movieArchive->hasResource(MKTAG('V', 'W', 'C', 'R'), -1)) {
@@ -196,35 +199,43 @@ void Score::loadSpriteImages(bool isSharedCast) {
 	Common::HashMap<int, BitmapCast *>::iterator bc;
 	for (bc = _loadedBitmaps->begin(); bc != _loadedBitmaps->end(); ++bc) {
 		if (bc->_value) {
+			uint32 tag = bc->_value->tag;
 			uint16 imgId = bc->_key + 1024;
 			BitmapCast *bitmapCast = bc->_value;
 
-			if (_vm->getVersion() >= 4 && bitmapCast->children.size() > 0)
+			if (_vm->getVersion() >= 4 && bitmapCast->children.size() > 0) {
 				imgId = bitmapCast->children[0].index;
-
-			Image::ImageDecoder *img = NULL;
-
-			if (_movieArchive->hasResource(MKTAG('D', 'I', 'B', ' '), imgId)) {
-				img = new DIBDecoder();
-				img->loadStream(*_movieArchive->getResource(MKTAG('D', 'I', 'B', ' '), imgId));
-				bitmapCast->surface = img->getSurface();
-			}
-
-			if (isSharedCast && _vm->getSharedDIB() != NULL && _vm->getSharedDIB()->contains(imgId)) {
-				img = new DIBDecoder();
-				img->loadStream(*_vm->getSharedDIB()->getVal(imgId));
-				bitmapCast->surface = img->getSurface();
+				tag = bitmapCast->children[0].tag;
 			}
 
+			Image::ImageDecoder *img = NULL;
 			Common::SeekableReadStream *pic = NULL;
 
-			if (isSharedCast) {
-				debugC(4, kDebugImages, "Shared cast BMP: id: %d", imgId);
-				pic = _vm->getSharedBMP()->getVal(imgId);
-				if (pic != NULL)
-					pic->seek(0); // TODO: this actually gets re-read every loop... we need to rewind it!
-			} else 	if (_movieArchive->hasResource(MKTAG('B', 'I', 'T', 'D'), imgId)) {
-				pic = _movieArchive->getResource(MKTAG('B', 'I', 'T', 'D'), imgId);
+			switch (tag) {
+			case MKTAG('D', 'I', 'B', ' '):
+				if (_movieArchive->hasResource(MKTAG('D', 'I', 'B', ' '), imgId)) {
+					img = new DIBDecoder();
+					img->loadStream(*_movieArchive->getResource(MKTAG('D', 'I', 'B', ' '), imgId));
+					bitmapCast->surface = img->getSurface();
+				} else if (isSharedCast && _vm->getSharedDIB() != NULL && _vm->getSharedDIB()->contains(imgId)) {
+					img = new DIBDecoder();
+					img->loadStream(*_vm->getSharedDIB()->getVal(imgId));
+					bitmapCast->surface = img->getSurface();
+				}
+				break;
+			case MKTAG('B', 'I', 'T', 'D'):
+				if (isSharedCast) {
+					debugC(4, kDebugImages, "Shared cast BMP: id: %d", imgId);
+					pic = _vm->getSharedBMP()->getVal(imgId);
+					if (pic != NULL)
+						pic->seek(0); // TODO: this actually gets re-read every loop... we need to rewind it!
+				} else 	if (_movieArchive->hasResource(MKTAG('B', 'I', 'T', 'D'), imgId)) {
+					pic = _movieArchive->getResource(MKTAG('B', 'I', 'T', 'D'), imgId);
+				}
+				break;
+			default:
+				warning("Unknown Bitmap Cast Tag: [%d] %s", tag, tag2str(tag));
+				break;
 			}
 
 			int w = bitmapCast->initialRect.width(), h = bitmapCast->initialRect.height();
@@ -242,9 +253,9 @@ void Score::loadSpriteImages(bool isSharedCast) {
 
 				img->loadStream(*pic);
 				bitmapCast->surface = img->getSurface();
+			} else {
+				warning("Image %d not found", imgId);
 			}
-
-			warning("Image %d not found", imgId);
 		}
 	}
 }
@@ -408,7 +419,7 @@ void Score::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
 		if (size == 0)
 			continue;
 
-		if (debugChannelSet(5, kDebugLoading))
+		if (debugChannelSet(5, kDebugLoading) && size < 2048)
 			stream.hexdump(size);
 
 		uint8 castType = stream.readByte();
@@ -416,7 +427,8 @@ void Score::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
 		switch (castType) {
 		case kCastBitmap:
 			debugC(3, kDebugLoading, "CastTypes id: %d BitmapCast", id);
-			_loadedBitmaps->setVal(id, new BitmapCast(stream));
+			// TODO: Work out the proper tag!
+			_loadedBitmaps->setVal(id, new BitmapCast(stream, MKTAG('B', 'I', 'T', 'D')));
 			_castTypes[id] = kCastBitmap;
 			break;
 		case kCastText:
@@ -498,14 +510,14 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 
 	debugC(3, kDebugLoading, "CASt: id: %d", id);
 
-	if (debugChannelSet(5, kDebugLoading))
+	if (debugChannelSet(5, kDebugLoading) && stream.size() < 2048)
 		stream.hexdump(stream.size());
 
 	uint32 size1, size2, size3, castType;
 	byte unk1 = 0, unk2 = 0, unk3 = 0;
 
 	if (_vm->getVersion() <= 3) {
-		size1 = stream.readUint16() + 16;
+		size1 = stream.readUint16() + 16; // 16 is for bounding rects
 		size2 = stream.readUint32();
 		size3 = 0;
 		castType = stream.readByte();
@@ -513,7 +525,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 		unk2 = stream.readByte();
 		unk3 = stream.readByte();
 	} else if (_vm->getVersion() == 4) {
-		size1 = stream.readUint16() + 2 + 16;
+		size1 = stream.readUint16() + 2 + 16; // 16 is for bounding rects
 		size2 = stream.readUint32();
 		size3 = 0;
 		castType = stream.readByte();
@@ -524,9 +536,11 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 
 		size3 = stream.readUint32();
 		size2 = stream.readUint32();
-		size1 = stream.readUint32() - 4;
+		size1 = stream.readUint32();
 		// assert(size1 == 0x14);
-		// size1 = 0;
+
+		// don't read the strings later, the full cast data is needed to be parsed.
+		size1 = stream.size();
 	} else {
 		error("Score::loadCastData: unsupported Director version (%d)", _vm->getVersion());
 	}
@@ -534,14 +548,14 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 	debugC(3, kDebugLoading, "CASt: id: %d type: %x size1: %d size2: %d (%x) size3: %d unk1: %d unk2: %d unk3: %d",
 		id, castType, size1, size2, size2, size3, unk1, unk2, unk3);
 
-	byte *data = (byte *)calloc(size1, 1); // 16 is for bounding rects
+	byte *data = (byte *)calloc(size1, 1);
 	stream.read(data, size1);
 
 	Common::MemoryReadStreamEndian castStream(data, size1, stream.isBE());
 
 	switch (castType) {
 	case kCastBitmap:
-		_loadedBitmaps->setVal(id, new BitmapCast(castStream, _vm->getVersion()));
+		_loadedBitmaps->setVal(id, new BitmapCast(castStream, res->tag, _vm->getVersion()));
 		for (uint child = 0; child < res->children.size(); child++)
 			_loadedBitmaps->getVal(id)->children.push_back(res->children[child]);
 		_castTypes[id] = kCastBitmap;
@@ -570,12 +584,14 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 		break;
 	default:
 		warning("Score::loadCastData(): Unhandled cast type: %d [%s]", castType, tag2str(castType));
+		// also don't try and read the strings... we don't know what this item is.
+		size2 = 0;
 		break;
 	}
 
 	free(data);
 
-	if (size2) {
+	if (size2 && _vm->getVersion() < 5) {
 		uint32 entryType = 0;
 		Common::Array<Common::String> castStrings = loadStrings(stream, entryType, false);
 





More information about the Scummvm-git-logs mailing list