[Scummvm-git-logs] scummvm master -> c5b8d31f16e9c39072e5d5702a535aa0e1a6df1c

sev- noreply at scummvm.org
Tue Jun 14 23:01:21 UTC 2022


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

Summary:
b7735a6326 DIRECTOR: Encapsulated tile access and implement override by VWTL
c5b8d31f16 DIRECTOR: Implement tile pattern drawing. Not yet referenced.


Commit: b7735a632643459dc5f84d29f37a9ded7aad95ea
    https://github.com/scummvm/scummvm/commit/b7735a632643459dc5f84d29f37a9ded7aad95ea
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-06-15T01:01:05+02:00

Commit Message:
DIRECTOR: Encapsulated tile access and implement override by VWTL

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/director.h
    engines/director/graphics.cpp
    engines/director/sprite.cpp
    engines/director/tests.cpp
    engines/director/types.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 2edfa977f70..9ee9e06191a 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1370,7 +1370,7 @@ void Cast::loadVWTL(Common::SeekableReadStreamEndian &stream) {
 	uint16 castLibId = 0; // default for pre-D5
 	uint16 memberId;
 
-	for (int i = 0; i < NUMTILEPATTERNS; i++) {
+	for (int i = 0; i < kNumBuiltinTiles; i++) {
 		stream.readUint32(); // unused
 
 		if (_version >= kFileVer500)
@@ -1380,9 +1380,9 @@ void Cast::loadVWTL(Common::SeekableReadStreamEndian &stream) {
 
 		r = Movie::readRect(stream);
 
-		_patterns[i].bitmapId.castLib = castLibId;
-		_patterns[i].bitmapId.member = memberId;
-		_patterns[i].rect = r;
+		_tiles[i].bitmapId.castLib = castLibId;
+		_tiles[i].bitmapId.member = memberId;
+		_tiles[i].rect = r;
 
 		debugC(2, kDebugLoading, "Cast::loadCastDataVWCR(): entry %d - %u:%u [%d, %d, %d, %d]", i, castLibId, memberId,
 				r.left, r.top, r.right, r.bottom);
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 71d7d3fd005..16b476cc1e8 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -142,6 +142,7 @@ public:
 	Common::Rect _movieRect;
 	uint16 _stageColor;
 	int _defaultPalette;
+	TilePatternEntry _tiles[kNumBuiltinTiles];
 
 	LingoArchive *_lingoArchive;
 
@@ -157,8 +158,6 @@ private:
 	Common::HashMap<uint16, CastMemberInfo *> _castsInfo;
 	Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _castsNames;
 	Common::HashMap<uint16, int> _castsScriptIds;
-
-	TilePatternEntry _patterns[NUMTILEPATTERNS];
 };
 
 } // End of namespace Director
diff --git a/engines/director/director.h b/engines/director/director.h
index e9d93db2dc7..125d018e328 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -124,9 +124,17 @@ struct MacShape {
 	int lineSize;
 	uint pattern;
 
+	Image::ImageDecoder *tile;
+	Common::Rect *tileRect;
+
 	Graphics::MacPlotData *pd;
 };
 
+struct PatternTile {
+	Image::ImageDecoder *img;
+	Common::Rect rect;
+};
+
 const int SCALE_THRESHOLD = 0x100;
 
 class DirectorEngine : public ::Engine {
@@ -178,6 +186,8 @@ public:
 	uint16 getPaletteColorCount() const { return _currentPaletteLength; }
 
 	void loadPatterns();
+	Image::ImageDecoder *getTile(int num);
+	const Common::Rect &getTileRect(int num);
 	uint32 transformColor(uint32 color);
 	Graphics::MacPatterns &getPatterns();
 	void setCursor(DirectorCursor type);
@@ -236,10 +246,8 @@ private:
 
 	Graphics::MacPatterns _director3Patterns;
 	Graphics::MacPatterns _director3QuickDrawPatterns;
-public:
-	Image::ImageDecoder *_builtinTiles[kNumBuiltinTiles];
+	PatternTile _builtinTiles[kNumBuiltinTiles];
 
-private:
 	Common::HashMap<int, PaletteV4> _loadedPalettes;
 
 	Graphics::ManagedSurface *_surface;
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 7dcc07b0608..b84d5171262 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -24,6 +24,9 @@
 #include "graphics/macgui/macwindowmanager.h"
 
 #include "director/director.h"
+#include "director/cast.h"
+#include "director/castmember.h"
+#include "director/movie.h"
 #include "director/images.h"
 
 namespace Director {
@@ -51,13 +54,17 @@ void DirectorEngine::loadPatterns() {
 	for (int i = 0; i < ARRAYSIZE(director3QuickDrawPatterns); i++)
 		_director3QuickDrawPatterns.push_back(director3QuickDrawPatterns[i]);
 
+	// We must set it here for correct work of BITDDecoder.
+	// It is set later in Director properly
 	_pixelformat = Graphics::PixelFormat::createFormatCLUT8();
 
 	for (int i = 0; i < ARRAYSIZE(builtinTiles); i++) {
 		Common::MemoryReadStream stream(builtinTiles[i].ptr, builtinTiles[i].size);
 
-		_builtinTiles[i] = new BITDDecoder(builtinTiles[i].w, builtinTiles[i].h, 8, builtinTiles[i].w, macPalette, kFileVer300);
-		_builtinTiles[i]->loadStream(stream);
+		_builtinTiles[i].img = new BITDDecoder(builtinTiles[i].w, builtinTiles[i].h, 8, builtinTiles[i].w, macPalette, kFileVer300);
+		_builtinTiles[i].img->loadStream(stream);
+
+		_builtinTiles[i].rect = Common::Rect(0, 0, builtinTiles[i].w, builtinTiles[i].h);
 	}
 }
 
@@ -66,6 +73,40 @@ Graphics::MacPatterns &DirectorEngine::getPatterns() {
 	return _director3QuickDrawPatterns;
 }
 
+Image::ImageDecoder *DirectorEngine::getTile(int num) {
+	TilePatternEntry *tile = &getCurrentMovie()->getCast()->_tiles[num];
+
+	if (tile->bitmapId.isNull())
+		return _builtinTiles[num].img;
+
+	CastMember *member = getCurrentMovie()->getCastMember(tile->bitmapId);
+
+	if (!member) {
+		warning("BUILDBOT: DirectorEngine::getTile(%d) VWTL refers to non-existing cast %s", num,
+				tile->bitmapId.asString().c_str());
+
+		return _builtinTiles[num].img;
+	}
+
+	if (member->_type != kCastBitmap) {
+		warning("BUILDBOT: DirectorEngine::getTile(%d) VWTL refers to incorrect cast %s type %s", num,
+				tile->bitmapId.asString().c_str(), castTypeToString(member->_type).c_str());
+
+		return _builtinTiles[num].img;
+	}
+
+	return ((BitmapCastMember *)member)->_img;
+}
+
+const Common::Rect &DirectorEngine::getTileRect(int num) {
+	TilePatternEntry *tile = &getCurrentMovie()->getCast()->_tiles[num];
+
+	if (tile->bitmapId.isNull())
+		return _builtinTiles[num].rect;
+
+	return tile->rect;
+}
+
 void DirectorEngine::loadDefaultPalettes() {
 	_loadedPalettes[kClutSystemMac] = PaletteV4(kClutSystemMac, macPalette, 256);
 	_loadedPalettes[kClutRainbow] = PaletteV4(kClutRainbow, rainbowPalette, 256);
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 36241f934cb..b3281250997 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -212,6 +212,8 @@ MacShape *Sprite::getShape() {
 	shape->backColor = _backColor;
 	shape->lineSize = _thickness & 0x3;
 	shape->pattern = getPattern();
+	shape->tile = nullptr;
+	shape->tileRect = nullptr;
 
 	if (g_director->getVersion() >= 300 && shape->spriteType == kCastMemberSprite) {
 		if (!_cast) {
@@ -439,10 +441,10 @@ void Sprite::setCast(CastMemberID memberID) {
 	 *   1. The cast member's type
 	 *   2. The sprite's type
 	 * If the two types do not align, the sprite should not render.
-	 * 
+	 *
 	 * Before D4, you needed to manually set a sprite's type along
 	 * with its castNum.
-	 * 
+	 *
 	 * Starting in D4, setting a sprite's castNum also set its type
 	 * to an appropriate default.
 	 */
diff --git a/engines/director/tests.cpp b/engines/director/tests.cpp
index be5e5d9840e..f5d83286fdd 100644
--- a/engines/director/tests.cpp
+++ b/engines/director/tests.cpp
@@ -101,9 +101,10 @@ void Window::testFontScaling() {
 
 	x = 10;
 	for (int i = 0; i < kNumBuiltinTiles; i++) {
-		surface.blitFrom(g_director->_builtinTiles[i]->getSurface(), Common::Point(x, 250));
+		Image::ImageDecoder *tile = g_director->getTile(i);
+		surface.blitFrom(tile->getSurface(), Common::Point(x, 250));
 
-		x += g_director->_builtinTiles[i]->getSurface()->w + 10;
+		x += tile->getSurface()->w + 10;
 	}
 
 	g_system->copyRectToScreen(surface.getPixels(), surface.pitch, 0, 0, w, h); // testing fonts
diff --git a/engines/director/types.h b/engines/director/types.h
index 33c9d27cbf8..e346ac19a85 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -382,6 +382,8 @@ struct CastMemberID {
 		return member != c.member || castLib != c.castLib;
 	}
 
+	bool isNull() { return member == 0 && castLib == 0; }
+
 	Common::String asString() const;
 };
 


Commit: c5b8d31f16e9c39072e5d5702a535aa0e1a6df1c
    https://github.com/scummvm/scummvm/commit/c5b8d31f16e9c39072e5d5702a535aa0e1a6df1c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-06-15T01:01:05+02:00

Commit Message:
DIRECTOR: Implement tile pattern drawing. Not yet referenced.

Changed paths:
    engines/director/director.h
    engines/director/graphics.cpp


diff --git a/engines/director/director.h b/engines/director/director.h
index 125d018e328..1fea005e835 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -125,7 +125,7 @@ struct MacShape {
 	uint pattern;
 
 	Image::ImageDecoder *tile;
-	Common::Rect *tileRect;
+	const Common::Rect *tileRect;
 
 	Graphics::MacPlotData *pd;
 };
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index b84d5171262..1d19f4d0fd5 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -202,6 +202,13 @@ void inkDrawPixel(int x, int y, int src, void *data) {
 	dst = (T)p->dst->getBasePtr(x, y);
 
 	if (p->ms) {
+		if (p->ms->tile) {
+			int x1 = p->ms->tileRect->left + (p->ms->pd->fillOriginX + x) % p->ms->tileRect->width();
+			int y1 = p->ms->tileRect->top  + (p->ms->pd->fillOriginY + y) % p->ms->tileRect->height();
+
+			*dst = p->ms->tile->getSurface()->getPixel(x1, y1);
+			return;
+		}
 		// Get the pixel that macDrawPixel will give us, but store it to apply the
 		// ink later
 		tmpDst = *dst;




More information about the Scummvm-git-logs mailing list