[Scummvm-git-logs] scummvm master -> 0d7c1a51b2c1020fdc354d0975841614d0f54900

sev- sev at scummvm.org
Thu Jul 8 00:25:37 UTC 2021


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

Summary:
4aace40b6c DIRECTOR: don't apply effects when we are drawing invisible rectangles. i.e. return directly.
010c724971 DIRECTOR: modify the way we are inverting the channel
5d4b11c198 DIRECTOR: introduce partial invertion to resolve render invert channel problem
ee2077b63d DIRECTOR: skip the compression when we have exactly number of what we need for image in D2
327b73b23a DIRECTOR: if we have pic size bigger than we want, then we won't regard it as RLE compression
b04c96d401 DIRECTOR: scale the bitmap castmember when we are drawing a smaller sprite
048585abca DIRECTOR: scale the registrationOffset when we are scaling the bitcast
f9de2bad63 DIRECTOR: use channel's original dims instread of initialRect for bitmap castmember
ef2b6cc934 DIRECTOR: add 32 bit support for scaling bitmap castmember
330d3b4dc5 DIRECTOR: enforce to replace widget when we have dims changed
8c792cd2a4 DIRECTOR: set the newSprite to reset the currentpoint when we are changing the widget.
8d270071cf DIRECTOR: don't draw outline shape when we get linesize < 0
d53064f948 DIRECTOR: amend setting dims for bitmap cast member
13f5460ca4 DIRECTOR: only use the original sprites when we have to scale down the bitmap cast member
111726031d DIRECTOR: set currentChannelId to 0 for script channel scripts.
bb456a64d2 DIRECTOR: switch to next frame when we are calling play done at script channel scripts.
6593d125b0 DIRECTOR: read rect dims as signed number instead of unsigned
a841358e69 DIRECTOR: implement some basic field operations for text cast
60c0e78d95 GRAPHICS: MACGUI: add line spacing for mactext
1492a06a84 GRAPHICS: MACGUI: amend interLinear for mactext
8c70bab234 DIRECTOR: implement linespacing for text castmember, set line spacing default to 1 in D4
56fad1585b DIRECTOR: implement setting text size for text cast member
42aa4739f8 DIRECTOR: implement chunk field operations for text cast member
6e2a8fc08f GRAPHICS: MACGUI: implement setting text slant and text fontId of text chunks
dc41917a74 DIRECTOR: implement text chunk fields operations
4add086365 DIRECTOR: create a stub for fplay
d8d43958e8 DIRECTOR: use initialRect for sprite dims when ink type is copy
6c8d4f3367 DIRECTOR: force to modify sprite dims when we are setting cast though lingo
629ee4bfa3 DIRECTOR: Don't skip the compression when _bitsPerPixel == 1
b152fc82aa DIRECTOR: amend setting sprites dims.
1b6f29b63a DIRECTOR: clean the surface after playing transitions
d92c06617b DIRECTOR: fixing createQDMatte
4ba52620e5 DIRECTOR: delete creating quick matte.
fcd8703356 DIRECTOR: regard 0 as the default palette
2ef52a07cb DIRECTOR: amend the way we are parsing palette for D2
0d7c1a51b2 DIRECTOR: amend resolvePaletteId.


Commit: 4aace40b6c6943ce0df4f83110b2bc03da66181e
    https://github.com/scummvm/scummvm/commit/4aace40b6c6943ce0df4f83110b2bc03da66181e
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: don't apply effects when we are drawing invisible rectangles. i.e. return directly.

Changed paths:
    engines/director/graphics.cpp


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 920292633e..09b201b13d 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -155,7 +155,10 @@ void inkDrawPixel(int x, int y, int src, void *data) {
 
 	if (p->ms) {
 		// Get the pixel that macDrawPixel will give us, but store it to apply the
-		// ink later.
+		// ink later
+		// if we have lineSize <= 0, means we are not drawing anything. so we may return directly.
+		if (p->ms->lineSize <= 0)
+			return;
 		tmpDst = *dst;
 		(p->_wm->getDrawPixel())(x, y, src, p->ms->pd);
 		src = *dst;


Commit: 010c72497133bbab233b5d138f4873624bda283a
    https://github.com/scummvm/scummvm/commit/010c72497133bbab233b5d138f4873624bda283a
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: modify the way we are inverting the channel

Changed paths:
    engines/director/events.cpp
    engines/director/movie.h
    engines/director/window.cpp


diff --git a/engines/director/events.cpp b/engines/director/events.cpp
index 7243a97585..3843cb36c8 100644
--- a/engines/director/events.cpp
+++ b/engines/director/events.cpp
@@ -117,8 +117,8 @@ bool Movie::processEvent(Common::Event &event) {
 		// hiliteChannelId is specified for BitMap castmember, so we deal with them separately with other castmember
 		// if we are moving out of bounds, then we don't hilite it anymore
 		if (_currentHiliteChannelId && !sc->_channels[_currentHiliteChannelId]->isMouseIn(pos)) {
-			g_director->getCurrentWindow()->invertChannel(sc->_channels[_currentHiliteChannelId]);
 			g_director->getCurrentWindow()->setDirty(true);
+			g_director->getCurrentWindow()->addDirtyRect(sc->_channels[_currentHiliteChannelId]->getBbox());
 			_currentHiliteChannelId = 0;
 			_currentHandlingChannelId = 0;
 		}
@@ -157,7 +157,8 @@ bool Movie::processEvent(Common::Event &event) {
 
 			if (spriteId > 0 && sc->_channels[spriteId]->_sprite->shouldHilite()) {
 				_currentHiliteChannelId = spriteId;
-				g_director->getCurrentWindow()->invertChannel(sc->_channels[spriteId]);
+				g_director->getCurrentWindow()->setDirty(true);
+				g_director->getCurrentWindow()->addDirtyRect(sc->_channels[_currentHiliteChannelId]->getBbox());
 			}
 
 			_lastEventTime = g_director->getMacTicks();
@@ -180,8 +181,10 @@ bool Movie::processEvent(Common::Event &event) {
 
 		_currentClickOnSpriteId = sc->getActiveSpriteIDFromPos(pos);
 
-		if (_currentHiliteChannelId && sc->_channels[_currentHiliteChannelId])
-			g_director->getCurrentWindow()->invertChannel(sc->_channels[_currentHiliteChannelId]);
+		if (_currentHiliteChannelId && sc->_channels[_currentHiliteChannelId]) {
+			g_director->getCurrentWindow()->setDirty(true);
+			g_director->getCurrentWindow()->addDirtyRect(sc->_channels[_currentHiliteChannelId]->getBbox());
+		}
 
 		debugC(3, kDebugEvents, "event: Button Up @(%d, %d), movie '%s', sprite id: %d", pos.x, pos.y, _macName.c_str(), _currentHandlingChannelId);
 
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 5eecc95c1e..eb08a177b3 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -174,6 +174,8 @@ public:
 
 	int _checkBoxType;
 
+	uint16 _currentHiliteChannelId;
+
 private:
 	Window *_window;
 	DirectorEngine *_vm;
@@ -189,7 +191,6 @@ private:
 	Common::String _script;
 	Common::String _directory;
 
-	uint16 _currentHiliteChannelId;
 	uint16 _currentHandlingChannelId;
 	Channel *_currentDraggedChannel;
 	Common::Point _draggingSpritePos;
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index 9d72bbd281..edbfd26c08 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -113,6 +113,7 @@ bool Window::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
 
 	if (!blitTo)
 		blitTo = _composeSurface;
+	Channel *hiliteChannel = _currentMovie->getScore()->getChannelById(_currentMovie->_currentHiliteChannelId);
 
 	for (Common::List<Common::Rect>::iterator i = _dirtyRects.begin(); i != _dirtyRects.end(); i++) {
 		const Common::Rect &r = *i;
@@ -129,12 +130,21 @@ bool Window::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
 						continue;
 				}
 
-				if ((*j)->_visible)
+				if ((*j)->_visible) {
+					if ((*j) == hiliteChannel)
+						continue;
 					inkBlitFrom(*j, r, blitTo);
+				}
 			}
 		}
 	}
 
+	if (_currentMovie->_currentHiliteChannelId) {
+		blitTo->fillRect(hiliteChannel->getBbox(), _stageColor);
+		inkBlitFrom(hiliteChannel, hiliteChannel->getBbox(), blitTo);
+		invertChannel(hiliteChannel);
+	}
+
 	_dirtyRects.clear();
 	_contentIsDirty = true;
 


Commit: 5d4b11c198d11b011d6aeeea5ef03675367f7677
    https://github.com/scummvm/scummvm/commit/5d4b11c198d11b011d6aeeea5ef03675367f7677
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: introduce partial invertion to resolve render invert channel problem

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


diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index edbfd26c08..edde3d78c0 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -70,27 +70,28 @@ Window::~Window() {
 	}
 }
 
-void Window::invertChannel(Channel *channel) {
+void Window::invertChannel(Channel *channel, const Common::Rect &destRect) {
 	const Graphics::Surface *mask = channel->getMask(true);
-	Common::Rect destRect = channel->getBbox();
+	Common::Rect srcRect = channel->getBbox();
+	srcRect.clip(destRect);
 
 	if (_wm->_pixelformat.bytesPerPixel == 1) {
-		for (int i = 0; i < destRect.height(); i++) {
-			byte *src = (byte *)_composeSurface->getBasePtr(destRect.left, destRect.top + i);
+		for (int i = 0; i < srcRect.height(); i++) {
+			byte *src = (byte *)_composeSurface->getBasePtr(srcRect.left, srcRect.top + i);
 			const byte *msk = mask ? (const byte *)mask->getBasePtr(0, i) : nullptr;
 
-			for (int j = 0; j < destRect.width(); j++, src++)
+			for (int j = 0; j < srcRect.width(); j++, src++)
 				if (!mask || (msk && !(*msk++)))
 					*src = ~(*src);
 		}
 	} else {
 		uint32 alpha = _wm->_pixelformat.ARGBToColor(255, 0, 0, 0);
 
-		for (int i = 0; i < destRect.height(); i++) {
-			uint32 *src = (uint32 *)_composeSurface->getBasePtr(destRect.left, destRect.top + i);
+		for (int i = 0; i < srcRect.height(); i++) {
+			uint32 *src = (uint32 *)_composeSurface->getBasePtr(srcRect.left, srcRect.top + i);
 			const uint32 *msk = mask ? (const uint32 *)mask->getBasePtr(0, i) : nullptr;
 
-			for (int j = 0; j < destRect.width(); j++, src++)
+			for (int j = 0; j < srcRect.width(); j++, src++)
 				if (!mask || (msk && !(*msk++)))
 					*src = ~(*src & ~alpha) | alpha;
 		}
@@ -131,20 +132,14 @@ bool Window::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
 				}
 
 				if ((*j)->_visible) {
-					if ((*j) == hiliteChannel)
-						continue;
 					inkBlitFrom(*j, r, blitTo);
+					if ((*j) == hiliteChannel)
+						invertChannel(hiliteChannel, r);
 				}
 			}
 		}
 	}
 
-	if (_currentMovie->_currentHiliteChannelId) {
-		blitTo->fillRect(hiliteChannel->getBbox(), _stageColor);
-		inkBlitFrom(hiliteChannel, hiliteChannel->getBbox(), blitTo);
-		invertChannel(hiliteChannel);
-	}
-
 	_dirtyRects.clear();
 	_contentIsDirty = true;
 
diff --git a/engines/director/window.h b/engines/director/window.h
index e49ed2e522..95991baf3b 100644
--- a/engines/director/window.h
+++ b/engines/director/window.h
@@ -87,12 +87,12 @@ struct TransParams {
 };
 
 class Window : public Graphics::MacWindow, public Object<Window> {
- public:
+public:
 	Window(int id, bool scrollable, bool resizable, bool editable, Graphics::MacWindowManager *wm, DirectorEngine *vm, bool isStage);
 	~Window();
 
 	bool render(bool forceRedraw = false, Graphics::ManagedSurface *blitTo = nullptr);
-	void invertChannel(Channel *channel);
+	void invertChannel(Channel *channel, const Common::Rect &destRect);
 
 	bool needsAppliedColor(DirectorPlotData *pd);
 	void setStageColor(uint32 stageColor, bool forceReset = false);


Commit: ee2077b63d5418857fa8324254dc0bcc15a0c568
    https://github.com/scummvm/scummvm/commit/ee2077b63d5418857fa8324254dc0bcc15a0c568
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: skip the compression when we have exactly number of what we need for image in D2

Changed paths:
    engines/director/images.cpp


diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index ac26092340..64ce81f90c 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -182,7 +182,7 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) {
 	Common::Array<int> pixels;
 	// If the stream has exactly the required number of bits for this image,
 	// we assume it is uncompressed.
-	if (stream.size() == _pitch * _surface->h * _bitsPerPixel / 8) {
+	if ((stream.size() == _pitch * _surface->h * _bitsPerPixel / 8) || (g_director->getVersion() == 200 && stream.size() == _surface->h * _surface->w * (_bitsPerPixel / 8))) {
 		debugC(6, kDebugImages, "Skipping compression");
 		for (int i = 0; i < stream.size(); i++) {
 			pixels.push_back((int)stream.readByte());


Commit: 327b73b23a6b3b9e0a41bc5f13e288ffe04e51d9
    https://github.com/scummvm/scummvm/commit/327b73b23a6b3b9e0a41bc5f13e288ffe04e51d9
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: if we have pic size bigger than we want, then we won't regard it as RLE compression

Changed paths:
    engines/director/images.cpp


diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index 64ce81f90c..864db611c7 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -182,7 +182,7 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) {
 	Common::Array<int> pixels;
 	// If the stream has exactly the required number of bits for this image,
 	// we assume it is uncompressed.
-	if ((stream.size() == _pitch * _surface->h * _bitsPerPixel / 8) || (g_director->getVersion() == 200 && stream.size() == _surface->h * _surface->w * (_bitsPerPixel / 8))) {
+	if ((stream.size() == _pitch * _surface->h * _bitsPerPixel / 8) || (g_director->getVersion() == 200 && stream.size() >= _surface->h * _surface->w * (_bitsPerPixel / 8))) {
 		debugC(6, kDebugImages, "Skipping compression");
 		for (int i = 0; i < stream.size(); i++) {
 			pixels.push_back((int)stream.readByte());


Commit: b04c96d40148fcdd003adbb77f0b8b37fb49e962
    https://github.com/scummvm/scummvm/commit/b04c96d40148fcdd003adbb77f0b8b37fb49e962
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: scale the bitmap castmember when we are drawing a smaller sprite

Changed paths:
    engines/director/castmember.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index d4ff03a564..19c5b23ac2 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -182,7 +182,27 @@ Graphics::MacWidget *BitmapCastMember::createWidget(Common::Rect &bbox, Channel
 	}
 
 	Graphics::MacWidget *widget = new Graphics::MacWidget(g_director->getCurrentWindow(), bbox.left, bbox.top, bbox.width(), bbox.height(), g_director->_wm, false);
-	widget->getSurface()->blitFrom(*_img->getSurface());
+
+	// scale for drawing a smaller sprite
+	if (bbox.width() < _initialRect.width() || bbox.height() < _initialRect.height()) {
+
+		int scaleX = SCALE_THRESHOLD * _initialRect.width() / bbox.width();
+		int scaleY = SCALE_THRESHOLD * _initialRect.height() / bbox.height();
+
+		for (int y = 0, scaleYCtr = 0; y < bbox.height(); y++, scaleYCtr += scaleY) {
+			if (g_director->_wm->_pixelformat.bytesPerPixel == 1) {
+				for (int x = 0, scaleXCtr = 0; x < bbox.width(); x++, scaleXCtr += scaleX) {
+					const byte *src = (const byte *)_img->getSurface()->getBasePtr(scaleXCtr / SCALE_THRESHOLD, scaleYCtr / SCALE_THRESHOLD);
+					byte *dst = (byte *)widget->getSurface()->getBasePtr(x, y);
+					*dst = *src;
+				}
+			}
+		}
+
+	} else {
+		widget->getSurface()->blitFrom(*_img->getSurface());
+	}
+
 	return widget;
 }
 


Commit: 048585abcab61dd746a769e90487d970bf4a12ec
    https://github.com/scummvm/scummvm/commit/048585abcab61dd746a769e90487d970bf4a12ec
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: scale the registrationOffset when we are scaling the bitcast

Changed paths:
    engines/director/channel.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index b07df4d75d..40f548fb65 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -519,18 +519,23 @@ void Channel::addRegistrationOffset(Common::Point &pos, bool subtract) {
 		return;
 
 	switch (_sprite->_cast->_type) {
-	case kCastBitmap:
-		{
-			BitmapCastMember *bc = (BitmapCastMember *)(_sprite->_cast);
-
-			if (subtract)
-				pos -= Common::Point(bc->_initialRect.left - bc->_regX,
-															bc->_initialRect.top - bc->_regY);
-			else
-				pos += Common::Point(bc->_initialRect.left - bc->_regX,
-															bc->_initialRect.top - bc->_regY);
+	case kCastBitmap: {
+		BitmapCastMember *bc = (BitmapCastMember *)(_sprite->_cast);
+
+		Common::Point point(0, 0);
+		// stretch the offset
+		if (!_sprite->_stretch && (_sprite->_width < bc->_initialRect.width() || _sprite->_height < bc->_initialRect.height())) {
+			point.x = (bc->_initialRect.left - bc->_regX) * _sprite->_width / bc->_initialRect.width();
+			point.y = (bc->_initialRect.top - bc->_regY) * _sprite->_height / bc->_initialRect.height();
+		} else {
+			point.x = bc->_initialRect.left - bc->_regX;
+			point.y = bc->_initialRect.top - bc->_regY;
 		}
-		break;
+		if (subtract)
+			pos -= point;
+		else
+			pos += point;
+	} break;
 	case kCastDigitalVideo:
 		pos -= Common::Point(_sprite->_cast->_initialRect.width() >> 1, _sprite->_cast->_initialRect.height() >> 1);
 		break;


Commit: f9de2bad63fe7fede59a8e7732523a50e845c0c2
    https://github.com/scummvm/scummvm/commit/f9de2bad63fe7fede59a8e7732523a50e845c0c2
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: use channel's original dims instread of initialRect for bitmap castmember

Changed paths:
    engines/director/sprite.cpp


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 53ddf5512d..9caa275226 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -285,7 +285,7 @@ void Sprite::setCast(CastMemberID memberID) {
 
 		// TODO: Respect sprite width/height settings. Need to determine how to read
 		// them properly.
-		if (_cast->_type != kCastShape && _cast->_type != kCastText) {
+		if (_cast->_type != kCastShape && _cast->_type != kCastText && _cast->_type != kCastBitmap) {
 			Common::Rect dims = _cast->getInitialRect();
 			_width = dims.width();
 			_height = dims.height();


Commit: ef2b6cc9343244d12a99712ab5140248992f3eba
    https://github.com/scummvm/scummvm/commit/ef2b6cc9343244d12a99712ab5140248992f3eba
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: add 32 bit support for scaling bitmap castmember

Changed paths:
    engines/director/castmember.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 19c5b23ac2..a32d9d1664 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -183,7 +183,7 @@ Graphics::MacWidget *BitmapCastMember::createWidget(Common::Rect &bbox, Channel
 
 	Graphics::MacWidget *widget = new Graphics::MacWidget(g_director->getCurrentWindow(), bbox.left, bbox.top, bbox.width(), bbox.height(), g_director->_wm, false);
 
-	// scale for drawing a smaller sprite
+	// scale for drawing a different size sprite
 	if (bbox.width() < _initialRect.width() || bbox.height() < _initialRect.height()) {
 
 		int scaleX = SCALE_THRESHOLD * _initialRect.width() / bbox.width();
@@ -193,8 +193,12 @@ Graphics::MacWidget *BitmapCastMember::createWidget(Common::Rect &bbox, Channel
 			if (g_director->_wm->_pixelformat.bytesPerPixel == 1) {
 				for (int x = 0, scaleXCtr = 0; x < bbox.width(); x++, scaleXCtr += scaleX) {
 					const byte *src = (const byte *)_img->getSurface()->getBasePtr(scaleXCtr / SCALE_THRESHOLD, scaleYCtr / SCALE_THRESHOLD);
-					byte *dst = (byte *)widget->getSurface()->getBasePtr(x, y);
-					*dst = *src;
+					*(byte *)widget->getSurface()->getBasePtr(x, y) = *src;
+				}
+			} else {
+				for (int x = 0, scaleXCtr = 0; x < bbox.width(); x++, scaleXCtr += scaleX) {
+					const int *src = (const int *)_img->getSurface()->getBasePtr(scaleXCtr / SCALE_THRESHOLD, scaleYCtr / SCALE_THRESHOLD);
+					*(int *)widget->getSurface()->getBasePtr(x, y) = *src;
 				}
 			}
 		}


Commit: 330d3b4dc57815e557cacde50268d31acd2746d5
    https://github.com/scummvm/scummvm/commit/330d3b4dc57815e557cacde50268d31acd2746d5
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: enforce to replace widget when we have dims changed

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


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 40f548fb65..dc9f5b87dd 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -302,6 +302,12 @@ void Channel::setClean(Sprite *nextSprite, int spriteId, bool partial) {
 	CastMemberID previousCastId(0, 0);
 	bool replace = isDirty(nextSprite);
 
+	// for dirty situation that we need to replace widget.
+	// if cast are modified, then we need to replace it
+	// if cast size are changed, and we may need to replace it, because we may having the scaled bitmap castmember
+	// other situation, e.g. position changing, we will let channel to handle it. So we don't have to replace widget
+	bool dimsChanged = !_sprite->_stretch && !hasTextCastMember(_sprite) && (_sprite->_width != nextSprite->_width || _sprite->_height != nextSprite->_height);
+
 	if (nextSprite) {
 		if (nextSprite->_cast && (_dirty || _sprite->_castId != nextSprite->_castId)) {
 			if (nextSprite->_cast->_type == kCastDigitalVideo) {
@@ -328,7 +334,7 @@ void Channel::setClean(Sprite *nextSprite, int spriteId, bool partial) {
 
 	if (replace) {
 		_sprite->updateCast();
-		replaceWidget(previousCastId);
+		replaceWidget(previousCastId, dimsChanged);
 	}
 
 	updateTextCast();
@@ -469,9 +475,9 @@ bool Channel::canKeepWidget(Sprite *currentSprite, Sprite *nextSprite) {
 
 // currently, when we are setting hilite, we delete the widget and the re-create it
 // so we may optimize this if this operation takes much time
-void Channel::replaceWidget(CastMemberID previousCastId) {
+void Channel::replaceWidget(CastMemberID previousCastId, bool force) {
 	// if the castmember is the same, and we are not modifying anything which cannot be handle by channel. Then we don't replace the widget
-	if (canKeepWidget(previousCastId)) {
+	if (!force && canKeepWidget(previousCastId)) {
 		debug(5, "Channel::replaceWidget(): skip deleting %s", _sprite->_castId.asString().c_str());
 		return;
 	}
@@ -524,9 +530,9 @@ void Channel::addRegistrationOffset(Common::Point &pos, bool subtract) {
 
 		Common::Point point(0, 0);
 		// stretch the offset
-		if (!_sprite->_stretch && (_sprite->_width < bc->_initialRect.width() || _sprite->_height < bc->_initialRect.height())) {
-			point.x = (bc->_initialRect.left - bc->_regX) * _sprite->_width / bc->_initialRect.width();
-			point.y = (bc->_initialRect.top - bc->_regY) * _sprite->_height / bc->_initialRect.height();
+		if (!_sprite->_stretch && (_width < bc->_initialRect.width() || _height < bc->_initialRect.height())) {
+			point.x = (bc->_initialRect.left - bc->_regX) * _width / bc->_initialRect.width();
+			point.y = (bc->_initialRect.top - bc->_regY) * _height / bc->_initialRect.height();
 		} else {
 			point.x = bc->_initialRect.left - bc->_regX;
 			point.y = bc->_initialRect.top - bc->_regY;
diff --git a/engines/director/channel.h b/engines/director/channel.h
index 3e19c1c20c..557facf3b4 100644
--- a/engines/director/channel.h
+++ b/engines/director/channel.h
@@ -62,7 +62,7 @@ public:
 	void setClean(Sprite *nextSprite, int spriteId, bool partial = false);
 	void setEditable(bool editable);
 	void replaceSprite(Sprite *nextSprite);
-	void replaceWidget(CastMemberID previousCastId = CastMemberID(0, 0));
+	void replaceWidget(CastMemberID previousCastId = CastMemberID(0, 0), bool force = false);
 	bool updateWidget();
 	void updateTextCast();
 


Commit: 8c792cd2a4b254e1f291819222d211b15194c7ab
    https://github.com/scummvm/scummvm/commit/8c792cd2a4b254e1f291819222d211b15194c7ab
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: set the newSprite to reset the currentpoint when we are changing the widget.

Changed paths:
    engines/director/channel.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index dc9f5b87dd..d6b3753ff5 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -406,6 +406,7 @@ void Channel::replaceSprite(Sprite *nextSprite) {
 	if (_sprite->_cast && !canKeepWidget(_sprite, nextSprite)) {
 		widgetKeeped = false;
 		_sprite->_cast->releaseWidget();
+		newSprite = true;
 	}
 
 	int width = _width;


Commit: 8d270071cf99d451bb867d97bdb9a3abd8512019
    https://github.com/scummvm/scummvm/commit/8d270071cf99d451bb867d97bdb9a3abd8512019
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: don't draw outline shape when we get linesize < 0

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


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 09b201b13d..643ff6d57a 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -156,9 +156,6 @@ void inkDrawPixel(int x, int y, int src, void *data) {
 	if (p->ms) {
 		// Get the pixel that macDrawPixel will give us, but store it to apply the
 		// ink later
-		// if we have lineSize <= 0, means we are not drawing anything. so we may return directly.
-		if (p->ms->lineSize <= 0)
-			return;
 		tmpDst = *dst;
 		(p->_wm->getDrawPixel())(x, y, src, p->ms->pd);
 		src = *dst;
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index edde3d78c0..286a53a6f2 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -214,6 +214,9 @@ void Window::inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect) {
 		Graphics::drawFilledRect(fillAreaRect, pd->ms->foreColor, g_director->getInkDrawPixel(), pd);
 		// fall through
 	case kOutlinedRectangleSprite:
+		// if we have lineSize <= 0, means we are not drawing anything. so we may return directly.
+		if (pd->ms->lineSize <= 0)
+			break;
 		pd->ms->pd = &plotStroke;
 		Graphics::drawRect(strokeRect, pd->ms->foreColor, g_director->getInkDrawPixel(), pd);
 		break;
@@ -222,6 +225,8 @@ void Window::inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect) {
 		Graphics::drawRoundRect(fillAreaRect, 12, pd->ms->foreColor, true, g_director->getInkDrawPixel(), pd);
 		// fall through
 	case kOutlinedRoundedRectangleSprite:
+		if (pd->ms->lineSize <= 0)
+			break;
 		pd->ms->pd = &plotStroke;
 		Graphics::drawRoundRect(strokeRect, 12, pd->ms->foreColor, false, g_director->getInkDrawPixel(), pd);
 		break;
@@ -230,6 +235,8 @@ void Window::inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect) {
 		Graphics::drawEllipse(fillAreaRect.left, fillAreaRect.top, fillAreaRect.right, fillAreaRect.bottom, pd->ms->foreColor, true, g_director->getInkDrawPixel(), pd);
 		// fall through
 	case kOutlinedOvalSprite:
+		if (pd->ms->lineSize <= 0)
+			break;
 		pd->ms->pd = &plotStroke;
 		Graphics::drawEllipse(strokeRect.left, strokeRect.top, strokeRect.right, strokeRect.bottom, pd->ms->foreColor, false, g_director->getInkDrawPixel(), pd);
 		break;


Commit: d53064f9481fc1e6ea8c509601e480a9f99e6ae9
    https://github.com/scummvm/scummvm/commit/d53064f9481fc1e6ea8c509601e480a9f99e6ae9
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: amend setting dims for bitmap cast member

Changed paths:
    engines/director/sprite.cpp


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 9caa275226..4bb1272c8c 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -285,8 +285,14 @@ void Sprite::setCast(CastMemberID memberID) {
 
 		// TODO: Respect sprite width/height settings. Need to determine how to read
 		// them properly.
-		if (_cast->_type != kCastShape && _cast->_type != kCastText && _cast->_type != kCastBitmap) {
-			Common::Rect dims = _cast->getInitialRect();
+		Common::Rect dims = _cast->getInitialRect();
+		// strange logic here, need to be fixed
+		if (_cast->_type == kCastBitmap) {
+			if (_width > dims.width() || _height > dims.height()) {
+				_width = dims.width();
+				_height = dims.height();
+			}
+		} else if (_cast->_type != kCastShape && _cast->_type != kCastText) {
 			_width = dims.width();
 			_height = dims.height();
 		}


Commit: 13f5460ca4fd2b9f7d5e498512e1c63b47a5ffde
    https://github.com/scummvm/scummvm/commit/13f5460ca4fd2b9f7d5e498512e1c63b47a5ffde
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: only use the original sprites when we have to scale down the bitmap cast member

Changed paths:
    engines/director/sprite.cpp


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 4bb1272c8c..7446f5a74b 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -288,7 +288,7 @@ void Sprite::setCast(CastMemberID memberID) {
 		Common::Rect dims = _cast->getInitialRect();
 		// strange logic here, need to be fixed
 		if (_cast->_type == kCastBitmap) {
-			if (_width > dims.width() || _height > dims.height()) {
+			if (_width >= dims.width() || _height >= dims.height()) {
 				_width = dims.width();
 				_height = dims.height();
 			}


Commit: 111726031d54338c46b04eede6edafaeb4258b4e
    https://github.com/scummvm/scummvm/commit/111726031d54338c46b04eede6edafaeb4258b4e
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: set currentChannelId to 0 for script channel scripts.

Changed paths:
    engines/director/lingo/lingo-events.cpp


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 3c750d4c8d..b2088a3a22 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -171,9 +171,9 @@ void Movie::queueFrameEvent(LEvent event, int eventId) {
 		return;
 
 	if (event == kEventEnterFrame && script->_eventHandlers.contains(kEventGeneric)) {
-		_eventQueue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, scriptId, false));
+		_eventQueue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, scriptId, false, 0));
 	} else if (script->_eventHandlers.contains(event)) {
-		_eventQueue.push(LingoEvent(event, eventId, kScoreScript, scriptId, false));
+		_eventQueue.push(LingoEvent(event, eventId, kScoreScript, scriptId, false, 0));
 	}
 }
 


Commit: bb456a64d23d7fbd894ecbb63159aee64b7917b4
    https://github.com/scummvm/scummvm/commit/bb456a64d23d7fbd894ecbb63159aee64b7917b4
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: switch to next frame when we are calling play done at script channel scripts.

Changed paths:
    engines/director/lingo/lingo-funcs.cpp


diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index ec80c8186b..790e9e2ebe 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -284,6 +284,9 @@ void Lingo::func_play(Datum &frame, Datum &movie) {
 		f.type = INT;
 		f.u.i = ref.frameI;
 
+		if (g_lingo->_currentChannelId == 0)
+			f.u.i++;
+
 		func_goto(f, m);
 
 		return;


Commit: 6593d125b0ccf9226971fed1a133dc8dc18e7ae6
    https://github.com/scummvm/scummvm/commit/6593d125b0ccf9226971fed1a133dc8dc18e7ae6
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: read rect dims as signed number instead of unsigned

Changed paths:
    engines/director/movie.cpp


diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 7d40e1639f..85b714a7a1 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -174,10 +174,10 @@ bool Movie::loadArchive() {
 
 Common::Rect Movie::readRect(Common::ReadStreamEndian &stream) {
 	Common::Rect rect;
-	rect.top = stream.readUint16();
-	rect.left = stream.readUint16();
-	rect.bottom = stream.readUint16();
-	rect.right = stream.readUint16();
+	rect.top = stream.readSint16();
+	rect.left = stream.readSint16();
+	rect.bottom = stream.readSint16();
+	rect.right = stream.readSint16();
 
 	return rect;
 }


Commit: a841358e693912726a6f2a73f1f2eded7bbe3a1f
    https://github.com/scummvm/scummvm/commit/a841358e693912726a6f2a73f1f2eded7bbe3a1f
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: implement some basic field operations for text cast

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h
    engines/director/lingo/lingo-object.cpp
    graphics/macgui/mactext.h


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index a32d9d1664..ad9d4344e8 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -790,6 +790,23 @@ void TextCastMember::setText(const char *text) {
 	}
 }
 
+int TextCastMember::getTextHeight() {
+	if (_widget)
+		return ((Graphics::MacText *)_widget)->getTextHeight();
+	else
+		warning("TextCastMember::getTextHeight: getting text height when there is no widget, returning 0");
+	return 0;
+}
+
+// this should be amend when we have some where using this function
+int TextCastMember::getTextSize() {
+	if (_widget)
+		return ((Graphics::MacText *)_widget)->getTextSize();
+	else
+		warning("TextCastMember::getTextSize: getting text size when there is no widget, returning 0");
+	return 0;
+}
+
 Common::String TextCastMember::getText() {
 	return _ptext;
 }
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index ca6a149df8..73fdf4d75d 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -238,6 +238,9 @@ public:
 	Datum getChunkField(int field, int start, int end);
 	bool setChunkField(int field, int start, int end, const Datum &value);
 
+	int getTextHeight();
+	int getTextSize();
+
 	SizeType _borderSize;
 	SizeType _gutterSize;
 	SizeType _boxShadow;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 532b0a5883..96d30afd49 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -896,16 +896,16 @@ Datum TextCastMember::getField(int field) {
 		}
 		break;
 	case kTheTextFont:
-		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = _fontId;
 		break;
 	case kTheTextHeight:
-		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = getTextHeight();
 		break;
 	case kTheTextSize:
-		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = getTextSize();
 		break;
 	case kTheTextStyle:
-		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = _textSlant;
 		break;
 	default:
 		d = CastMember::getField(field);
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index ee5dd133d6..b1ad93a37c 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -193,6 +193,10 @@ public:
 	void appendText(const Common::U32String &str, int fontId = kMacFontChicago, int fontSize = 12, int fontSlant = kMacFontRegular, uint16 r = 0, uint16 g = 0, uint16 b = 0, bool skipAdd = false);
 	void appendText(const Common::U32String &str, const Font *font, uint16 r = 0, uint16 g = 0, uint16 b = 0, bool skipAdd = false);
 
+	int getTextFont() { return _defaultFormatting.fontId; }
+	int getTextSize() { return _defaultFormatting.fontSize; }
+	int getTextColor() { return _defaultFormatting.fgcolor; }
+
 private:
 	void appendText_(const Common::U32String &strWithFont, uint oldLen);
 	void deletePreviousCharInternal(int *row, int *col);


Commit: 60c0e78d95d4b7ffa60268cfba0b03efddbca1c3
    https://github.com/scummvm/scummvm/commit/60c0e78d95d4b7ffa60268cfba0b03efddbca1c3
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
GRAPHICS: MACGUI: add line spacing for mactext

Changed paths:
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 98e382cdab..ced166d31a 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -109,6 +109,7 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager
 	_macFontMode = true;
 	_encodeType = Common::kUtf8;
 	_plainByteMode = false;
+	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -134,6 +135,7 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager
 	_macFontMode = true;
 	_encodeType = encodeType;
 	_plainByteMode = true;
+	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -160,6 +162,7 @@ MacText::MacText(const Common::U32String &s, MacWindowManager *wm, const MacFont
 	_macFontMode = true;
 	_encodeType = Common::kUtf8;
 	_plainByteMode = false;
+	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -185,6 +188,7 @@ MacText::MacText(const Common::String &s, MacWindowManager *wm, const MacFont *m
 	_macFontMode = true;
 	_encodeType = encodeType;
 	_plainByteMode = true;
+	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -211,6 +215,7 @@ MacText::MacText(const Common::U32String &s, MacWindowManager *wm, const Font *f
 	_macFontMode = false;
 	_encodeType = Common::kUtf8;
 	_plainByteMode = false;
+	_lineSpacing = 0;
 
 	if (font) {
 		_defaultFormatting = MacFontRun(_wm, font, 0, font->getFontHeight(), 0, 0, 0);
@@ -900,7 +905,7 @@ int MacText::getLineWidth(int line, bool enforce, int col) {
 			hastext = true;
 		}
 
-		height = MAX(height, _textLines[line].chunks[i].getFont()->getFontHeight());
+		height = MAX(height, _textLines[line].chunks[i].getFont()->getFontHeight()) + _lineSpacing;
 	}
 
 	if (!hastext && _textLines.size() > 1)
@@ -1061,6 +1066,15 @@ void MacText::resize(int w, int h) {
 	setMaxWidth(_maxWidth);
 }
 
+void MacText::setLineSpacing(int linespacing) {
+	_lineSpacing = linespacing;
+	recalcDims();
+	updateCursorPos();
+	_fullRefresh = true;
+	render();
+	_contentIsDirty = true;
+}
+
 void MacText::appendText(const Common::U32String &str, int fontId, int fontSize, int fontSlant, bool skipAdd) {
 	appendText(str, fontId, fontSize, fontSlant, 0, 0, 0, skipAdd);
 }
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index b1ad93a37c..6d98470abc 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -194,9 +194,14 @@ public:
 	void appendText(const Common::U32String &str, const Font *font, uint16 r = 0, uint16 g = 0, uint16 b = 0, bool skipAdd = false);
 
 	int getTextFont() { return _defaultFormatting.fontId; }
-	int getTextSize() { return _defaultFormatting.fontSize; }
+
+	// because currently, we are counting linespacing as font height
+	int getTextSize() { return _defaultFormatting.fontSize - _lineSpacing; }
 	int getTextColor() { return _defaultFormatting.fgcolor; }
 
+	int getLineSpacing() { return _lineSpacing; }
+	void setLineSpacing(int linespacing);
+
 private:
 	void appendText_(const Common::U32String &strWithFont, uint oldLen);
 	void deletePreviousCharInternal(int *row, int *col);
@@ -316,6 +321,7 @@ protected:
 
 	int _textMaxWidth;
 	int _textMaxHeight;
+	int _lineSpacing;
 
 	ManagedSurface *_surface;
 


Commit: 1492a06a843f6cc9a31326efd88e51f427d8f8c7
    https://github.com/scummvm/scummvm/commit/1492a06a843f6cc9a31326efd88e51f427d8f8c7
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
GRAPHICS: MACGUI: amend interLinear for mactext

Changed paths:
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index ced166d31a..df182144f5 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -109,7 +109,6 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager
 	_macFontMode = true;
 	_encodeType = Common::kUtf8;
 	_plainByteMode = false;
-	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -135,7 +134,6 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager
 	_macFontMode = true;
 	_encodeType = encodeType;
 	_plainByteMode = true;
-	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -162,7 +160,6 @@ MacText::MacText(const Common::U32String &s, MacWindowManager *wm, const MacFont
 	_macFontMode = true;
 	_encodeType = Common::kUtf8;
 	_plainByteMode = false;
-	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -188,7 +185,6 @@ MacText::MacText(const Common::String &s, MacWindowManager *wm, const MacFont *m
 	_macFontMode = true;
 	_encodeType = encodeType;
 	_plainByteMode = true;
-	_lineSpacing = 0;
 
 	if (macFont) {
 		_defaultFormatting = MacFontRun(_wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0);
@@ -215,7 +211,6 @@ MacText::MacText(const Common::U32String &s, MacWindowManager *wm, const Font *f
 	_macFontMode = false;
 	_encodeType = Common::kUtf8;
 	_plainByteMode = false;
-	_lineSpacing = 0;
 
 	if (font) {
 		_defaultFormatting = MacFontRun(_wm, font, 0, font->getFontHeight(), 0, 0, 0);
@@ -905,7 +900,7 @@ int MacText::getLineWidth(int line, bool enforce, int col) {
 			hastext = true;
 		}
 
-		height = MAX(height, _textLines[line].chunks[i].getFont()->getFontHeight()) + _lineSpacing;
+		height = MAX(height, _textLines[line].chunks[i].getFont()->getFontHeight());
 	}
 
 	if (!hastext && _textLines.size() > 1)
@@ -955,6 +950,9 @@ int MacText::getLineHeight(int line) {
 void MacText::setInterLinear(int interLinear) {
 	_interLinear = interLinear;
 	recalcDims();
+	_fullRefresh = true;
+	render();
+	_contentIsDirty = true;
 }
 
 void MacText::recalcDims() {
@@ -1066,15 +1064,6 @@ void MacText::resize(int w, int h) {
 	setMaxWidth(_maxWidth);
 }
 
-void MacText::setLineSpacing(int linespacing) {
-	_lineSpacing = linespacing;
-	recalcDims();
-	updateCursorPos();
-	_fullRefresh = true;
-	render();
-	_contentIsDirty = true;
-}
-
 void MacText::appendText(const Common::U32String &str, int fontId, int fontSize, int fontSlant, bool skipAdd) {
 	appendText(str, fontId, fontSize, fontSlant, 0, 0, 0, skipAdd);
 }
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index 6d98470abc..22a50d0bd6 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -196,12 +196,9 @@ public:
 	int getTextFont() { return _defaultFormatting.fontId; }
 
 	// because currently, we are counting linespacing as font height
-	int getTextSize() { return _defaultFormatting.fontSize - _lineSpacing; }
+	int getTextSize() { return _defaultFormatting.fontSize; }
 	int getTextColor() { return _defaultFormatting.fgcolor; }
 
-	int getLineSpacing() { return _lineSpacing; }
-	void setLineSpacing(int linespacing);
-
 private:
 	void appendText_(const Common::U32String &strWithFont, uint oldLen);
 	void deletePreviousCharInternal(int *row, int *col);
@@ -243,6 +240,8 @@ public:
 	Common::U32String cutSelection();
 	const SelectedText *getSelectedText() { return &_selectedText; }
 
+	int getLineSpacing() { return _interLinear; }
+
 	/**
 	 * set the selection of mactext
 	 * @param pos pos of selection, 0 represent first, -1 represent the end of text
@@ -321,7 +320,6 @@ protected:
 
 	int _textMaxWidth;
 	int _textMaxHeight;
-	int _lineSpacing;
 
 	ManagedSurface *_surface;
 


Commit: 8c70bab234e0cdd3fab7702f59de9fa90bf02c1d
    https://github.com/scummvm/scummvm/commit/8c70bab234e0cdd3fab7702f59de9fa90bf02c1d
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: implement linespacing for text castmember, set line spacing default to 1 in D4

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h
    engines/director/lingo/lingo-object.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index ad9d4344e8..db1392b171 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -569,6 +569,9 @@ TextCastMember::TextCastMember(Cast *cast, uint16 castId, Common::SeekableReadSt
 	_bgpalinfo1 = _bgpalinfo2 = _bgpalinfo3 = 0;
 	_fgpalinfo1 = _fgpalinfo2 = _fgpalinfo3 = 0xff;
 
+	// seems like the line spacing is default to 1 in D4
+	_lineSpacing = g_director->getVersion() >= 400 ? 1 : 0;
+
 	if (version < kFileVer400) {
 		_flags1 = flags1; // region: 0 - auto, 1 - matte, 2 - disabled
 		_borderSize = static_cast<SizeType>(stream.readByte());
@@ -790,11 +793,12 @@ void TextCastMember::setText(const char *text) {
 	}
 }
 
+// D4 dictionary book said this is line spacing
 int TextCastMember::getTextHeight() {
 	if (_widget)
-		return ((Graphics::MacText *)_widget)->getTextHeight();
+		return ((Graphics::MacText *)_widget)->getLineSpacing();
 	else
-		warning("TextCastMember::getTextHeight: getting text height when there is no widget, returning 0");
+		warning("TextCastMember::getTextHeight: getting text line spacing when there is no widget, returning 0");
 	return 0;
 }
 
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 73fdf4d75d..8881512773 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -259,6 +259,7 @@ public:
 	uint16 _fgpalinfo1, _fgpalinfo2, _fgpalinfo3;
 	ButtonType _buttonType;
 	bool _editable;
+	int _lineSpacing;
 
 	Common::String _ftext;
 	Common::String _ptext;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 96d30afd49..f85f4035c8 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -958,19 +958,21 @@ bool TextCastMember::setField(int field, const Datum &d) {
 
 			_textAlign = align;
 			_modified = true;
-		}
+	}
 		return true;
 	case kTheTextFont:
 		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
 		return false;
 	case kTheTextHeight:
-		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_lineSpacing = d.asInt();
+		_modified = true;
 		return false;
 	case kTheTextSize:
 		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
 		return false;
 	case kTheTextStyle:
-		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_textSlant = d.asInt();
+		_modified = true;
 		return false;
 	default:
 		break;


Commit: 56fad1585bd2f61c93239e51a079baab338e4919
    https://github.com/scummvm/scummvm/commit/56fad1585bd2f61c93239e51a079baab338e4919
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: implement setting text size for text cast member

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index db1392b171..cf63b27bf5 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -815,6 +815,15 @@ Common::String TextCastMember::getText() {
 	return _ptext;
 }
 
+void TextCastMember::setTextSize(int textSize) {
+	if (_widget) {
+		((Graphics::MacText *)_widget)->setTextSize(textSize);
+		((Graphics::MacText *)_widget)->draw();
+	} else {
+		warning("TextCastMember::setTextSize: unprocessed setting text size for cast member %d %s", _castId, numToCastNum(_castId));
+	}
+}
+
 bool TextCastMember::isEditable() {
 	return _editable;
 }
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 8881512773..618231d608 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -239,7 +239,9 @@ public:
 	bool setChunkField(int field, int start, int end, const Datum &value);
 
 	int getTextHeight();
+
 	int getTextSize();
+	void setTextSize(int textSize);
 
 	SizeType _borderSize;
 	SizeType _gutterSize;
diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index df182144f5..36b9260719 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -347,6 +347,18 @@ void MacText::setColors(uint32 fg, uint32 bg) {
 		setTextColor(fg, i);
 }
 
+void MacText::setTextSize(int textSize) {
+	for (uint i = 0; i < _textLines.size(); i++) {
+		for (uint j = 0; j < _textLines[i].chunks.size(); j++) {
+			_textLines[i].chunks[j].fontSize = textSize;
+		}
+	}
+
+	_fullRefresh = true;
+	render();
+	_contentIsDirty = true;
+}
+
 void MacText::setTextColor(uint32 color, uint32 line) {
 	if (line >= _textLines.size()) {
 		warning("MacText::setTextColor(): line %d is out of bounds", line);
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index 22a50d0bd6..c141ca2728 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -197,6 +197,8 @@ public:
 
 	// because currently, we are counting linespacing as font height
 	int getTextSize() { return _defaultFormatting.fontSize; }
+	void setTextSize(int textSize);
+
 	int getTextColor() { return _defaultFormatting.fgcolor; }
 
 private:


Commit: 42aa4739f854499cfdd7b1b79bf7db3d2b495faf
    https://github.com/scummvm/scummvm/commit/42aa4739f854499cfdd7b1b79bf7db3d2b495faf
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: implement chunk field operations for text cast member

Changed paths:
    engines/director/castmember.cpp
    engines/director/lingo/lingo-object.cpp
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index cf63b27bf5..3201d87395 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -798,7 +798,7 @@ int TextCastMember::getTextHeight() {
 	if (_widget)
 		return ((Graphics::MacText *)_widget)->getLineSpacing();
 	else
-		warning("TextCastMember::getTextHeight: getting text line spacing when there is no widget, returning 0");
+		return _lineSpacing;
 	return 0;
 }
 
@@ -807,7 +807,7 @@ int TextCastMember::getTextSize() {
 	if (_widget)
 		return ((Graphics::MacText *)_widget)->getTextSize();
 	else
-		warning("TextCastMember::getTextSize: getting text size when there is no widget, returning 0");
+		return _fontSize;
 	return 0;
 }
 
@@ -820,7 +820,8 @@ void TextCastMember::setTextSize(int textSize) {
 		((Graphics::MacText *)_widget)->setTextSize(textSize);
 		((Graphics::MacText *)_widget)->draw();
 	} else {
-		warning("TextCastMember::setTextSize: unprocessed setting text size for cast member %d %s", _castId, numToCastNum(_castId));
+		_fontSize = textSize;
+		_modified = true;
 	}
 }
 
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index f85f4035c8..b7a9f14890 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -961,14 +961,15 @@ bool TextCastMember::setField(int field, const Datum &d) {
 	}
 		return true;
 	case kTheTextFont:
-		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_fontId = d.asInt();
+		_modified = true;
 		return false;
 	case kTheTextHeight:
 		_lineSpacing = d.asInt();
 		_modified = true;
 		return false;
 	case kTheTextSize:
-		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		setTextSize(d.asInt());
 		return false;
 	case kTheTextStyle:
 		_textSlant = d.asInt();
@@ -1000,19 +1001,19 @@ Datum TextCastMember::getChunkField(int field, int start, int end) {
 
 	switch (field) {
 	case kTheForeColor:
-		warning("TextCastMember::getChunkField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = getForeColor();
 		break;
 	case kTheTextFont:
-		warning("TextCastMember::getChunkField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = _fontId;
 		break;
 	case kTheTextHeight:
-		warning("TextCastMember::getChunkField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = _lineSpacing;
 		break;
 	case kTheTextSize:
-		warning("TextCastMember::getChunkField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = _fontSize;
 		break;
 	case kTheTextStyle:
-		warning("TextCastMember::getChunkField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		d.u.i = _textSlant;
 		break;
 	default:
 		break;
@@ -1022,21 +1023,27 @@ Datum TextCastMember::getChunkField(int field, int start, int end) {
 }
 
 bool TextCastMember::setChunkField(int field, int start, int end, const Datum &d) {
+	uint color = 0;
 	switch (field) {
 	case kTheForeColor:
-		warning("TextCastMember::setChunkField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		color = d.asInt();
+		setColors(&color, nullptr);
 		return false;
 	case kTheTextFont:
-		warning("TextCastMember::setChunkField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_fontId = d.asInt();
+		_modified = true;
 		return false;
 	case kTheTextHeight:
-		warning("TextCastMember::setChunkField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_lineSpacing = d.asInt();
+		_modified = true;
 		return false;
 	case kTheTextSize:
-		warning("TextCastMember::setChunkField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_fontSize = d.asInt();
+		_modified = true;
 		return false;
 	case kTheTextStyle:
-		warning("TextCastMember::setChunkField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		_textSlant = d.asInt();
+		_modified = true;
 		return false;
 	default:
 		break;
diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 36b9260719..d1b623699b 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -395,7 +395,23 @@ void MacText::getChunkPosFromIndex(int index, uint &lineNum, uint &chunkNum, uin
 	offset = 0;
 }
 
+void setTextColorCallback(MacFontRun &macFontRun, int color) {
+	macFontRun.fgcolor = color;
+}
+
 void MacText::setTextColor(uint32 color, uint32 start, uint32 end) {
+	setTextChunks(start, end, color, setTextColorCallback);
+}
+
+void setTextSizeCallback(MacFontRun &macFontRun, int textSize) {
+	macFontRun.fontSize = textSize;
+}
+
+void MacText::setTextSize(int textSize, int start, int end) {
+	setTextChunks(start, end, textSize, setTextSizeCallback);
+}
+
+void MacText::setTextChunks(int start, int end, int param, void (*callback)(MacFontRun &, int)) {
 	if (_textLines.empty())
 		return;
 	if (start > end)
@@ -426,8 +442,6 @@ void MacText::setTextColor(uint32 color, uint32 start, uint32 end) {
 		endCol++;
 	}
 
-	uint col = _wm->findBestColor(color);
-	// after spliting, we are going to modify the colors now
 	for (uint i = startRow; i <= endRow; i++) {
 		uint from, to;
 		if (i == startRow && i == endRow) {
@@ -444,7 +458,7 @@ void MacText::setTextColor(uint32 color, uint32 start, uint32 end) {
 			to = _textLines[i].chunks.size();
 		}
 		for (uint j = from; j < to; j++) {
-			_textLines[i].chunks[j].fgcolor = col;
+			callback(_textLines[i].chunks[j], param);
 		}
 	}
 
@@ -453,6 +467,34 @@ void MacText::setTextColor(uint32 color, uint32 start, uint32 end) {
 	_contentIsDirty = true;
 }
 
+// this maybe need to amend
+// currently, we just return the text size of first character.
+int MacText::getTextSize(int start, int end) {
+	if (_textLines.empty())
+		return _defaultFormatting.fontSize;
+	if (start > end)
+		SWAP(start, end);
+
+	uint startRow, startCol;
+	uint offset;
+
+	getChunkPosFromIndex(start, startRow, startCol, offset);
+	return _textLines[startRow].chunks[startCol].fontSize;
+}
+
+uint MacText::getTextColor(int start, int end) {
+	if (_textLines.empty())
+		return _defaultFormatting.fontSize;
+	if (start > end)
+		SWAP(start, end);
+
+	uint startRow, startCol;
+	uint offset;
+
+	getChunkPosFromIndex(start, startRow, startCol, offset);
+	return _textLines[startRow].chunks[startCol].fgcolor;
+}
+
 void MacText::setDefaultFormatting(uint16 fontId, byte textSlant, uint16 fontSize,
 		uint16 palinfo1, uint16 palinfo2, uint16 palinfo3) {
 	_defaultFormatting.setValues(_defaultFormatting.wm, fontId, textSlant, fontSize, palinfo1, palinfo2, palinfo3);
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index c141ca2728..3d11ce08a2 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -199,9 +199,15 @@ public:
 	int getTextSize() { return _defaultFormatting.fontSize; }
 	void setTextSize(int textSize);
 
-	int getTextColor() { return _defaultFormatting.fgcolor; }
+	int getTextSize(int start, int end);
+	void setTextSize(int textSize, int start, int end);
+
+	uint getTextColor() { return _defaultFormatting.fgcolor; }
+	uint getTextColor(int start, int end);
 
 private:
+	void setTextChunks(int start, int end, int param, void (*callback)(MacFontRun &, int));
+
 	void appendText_(const Common::U32String &strWithFont, uint oldLen);
 	void deletePreviousCharInternal(int *row, int *col);
 	void insertTextFromClipboard();


Commit: 6e2a8fc08f08a4e31843e37b19814078e1ba249a
    https://github.com/scummvm/scummvm/commit/6e2a8fc08f08a4e31843e37b19814078e1ba249a
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
GRAPHICS: MACGUI: implement setting text slant and text fontId of text chunks

Changed paths:
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index d1b623699b..3c0f1eed0c 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -400,7 +400,8 @@ void setTextColorCallback(MacFontRun &macFontRun, int color) {
 }
 
 void MacText::setTextColor(uint32 color, uint32 start, uint32 end) {
-	setTextChunks(start, end, color, setTextColorCallback);
+	uint col = _wm->findBestColor(color);
+	setTextChunks(start, end, col, setTextColorCallback);
 }
 
 void setTextSizeCallback(MacFontRun &macFontRun, int textSize) {
@@ -467,24 +468,44 @@ void MacText::setTextChunks(int start, int end, int param, void (*callback)(MacF
 	_contentIsDirty = true;
 }
 
+void setTextFontCallback(MacFontRun &macFontRun, int fontId) {
+	macFontRun.fontId = fontId;
+}
+
+void MacText::setTextFont(int start, int end, int fontId) {
+	setTextChunks(start, end, fontId, setTextFontCallback);
+}
+
+void setTextSlantCallback(MacFontRun &macFontRun, int textSlant) {
+	macFontRun.textSlant = textSlant;
+}
+
+void MacText::setTextSlant(int start, int end, int textSlant) {
+	setTextChunks(start, end, textSlant, setTextSlantCallback);
+}
+
 // this maybe need to amend
 // currently, we just return the text size of first character.
 int MacText::getTextSize(int start, int end) {
-	if (_textLines.empty())
-		return _defaultFormatting.fontSize;
-	if (start > end)
-		SWAP(start, end);
+	return getTextChunks(start, end).fontSize;
+}
 
-	uint startRow, startCol;
-	uint offset;
+uint MacText::getTextColor(int start, int end) {
+	return getTextChunks(start, end).fgcolor;
+}
 
-	getChunkPosFromIndex(start, startRow, startCol, offset);
-	return _textLines[startRow].chunks[startCol].fontSize;
+int MacText::getTextFont(int start, int end) {
+	return getTextChunks(start, end).fontId;
 }
 
-uint MacText::getTextColor(int start, int end) {
+int MacText::getTextSlant(int start, int end) {
+	return getTextChunks(start, end).textSlant;
+}
+
+// only getting the first chunk for the selected area
+MacFontRun MacText::getTextChunks(int start, int end) {
 	if (_textLines.empty())
-		return _defaultFormatting.fontSize;
+		return _defaultFormatting;
 	if (start > end)
 		SWAP(start, end);
 
@@ -492,7 +513,7 @@ uint MacText::getTextColor(int start, int end) {
 	uint offset;
 
 	getChunkPosFromIndex(start, startRow, startCol, offset);
-	return _textLines[startRow].chunks[startCol].fgcolor;
+	return _textLines[startRow].chunks[startCol];
 }
 
 void MacText::setDefaultFormatting(uint16 fontId, byte textSlant, uint16 fontSize,
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index 3d11ce08a2..dd2906264e 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -205,7 +205,14 @@ public:
 	uint getTextColor() { return _defaultFormatting.fgcolor; }
 	uint getTextColor(int start, int end);
 
+	int getTextFont(int start, int end);
+	void setTextFont(int start, int end, int fontId);
+
+	int getTextSlant(int start, int end);
+	void setTextSlant(int start, int end, int textSlant);
+
 private:
+	MacFontRun getTextChunks(int start, int end);
 	void setTextChunks(int start, int end, int param, void (*callback)(MacFontRun &, int));
 
 	void appendText_(const Common::U32String &strWithFont, uint oldLen);


Commit: dc41917a74cb5b872a8169edfd2d5191ba1afc9c
    https://github.com/scummvm/scummvm/commit/dc41917a74cb5b872a8169edfd2d5191ba1afc9c
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: implement text chunk fields operations

Changed paths:
    engines/director/lingo/lingo-object.cpp
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index b7a9f14890..7064440a18 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -36,6 +36,7 @@
 #include "director/lingo/xlibs/palxobj.h"
 #include "director/lingo/xlibs/flushxobj.h"
 #include "director/lingo/xlibs/winxobj.h"
+#include "graphics/macgui/mactext.h"
 
 namespace Director {
 
@@ -999,21 +1000,38 @@ bool TextCastMember::hasChunkField(int field) {
 Datum TextCastMember::getChunkField(int field, int start, int end) {
 	Datum d;
 
+	Graphics::MacText *macText = ((Graphics::MacText *)_widget);
+	if (!_widget)
+		warning("TextCastMember::getChunkField getting chunk field when there is no linked widget, returning the default value");
+
 	switch (field) {
 	case kTheForeColor:
-		d.u.i = getForeColor();
+		if (_widget)
+			d.u.i = macText->getTextColor(start, end);
+		else
+			d.u.i = getForeColor();
 		break;
 	case kTheTextFont:
-		d.u.i = _fontId;
+		if (_widget)
+			d.u.i = macText->getTextFont(start, end);
+		else
+			d.u.i = _fontId;
 		break;
 	case kTheTextHeight:
+		warning("TextCastMember::getChunkField getting text height(line spacing) is not implemented yet, returning the default one");
 		d.u.i = _lineSpacing;
 		break;
 	case kTheTextSize:
-		d.u.i = _fontSize;
+		if (_widget)
+			d.u.i = macText->getTextSize(start, end);
+		else
+			d.u.i = _fontSize;
 		break;
 	case kTheTextStyle:
-		d.u.i = _textSlant;
+		if (_widget)
+			d.u.i = macText->getTextSlant(start, end);
+		else
+			d.u.i = _textSlant;
 		break;
 	default:
 		break;
@@ -1023,28 +1041,30 @@ Datum TextCastMember::getChunkField(int field, int start, int end) {
 }
 
 bool TextCastMember::setChunkField(int field, int start, int end, const Datum &d) {
-	uint color = 0;
+	Graphics::MacText *macText = ((Graphics::MacText *)_widget);
+	if (!_widget)
+		warning("TextCastMember::setChunkField setting chunk field when there is no linked widget");
+
 	switch (field) {
 	case kTheForeColor:
-		color = d.asInt();
-		setColors(&color, nullptr);
-		return false;
+		if (_widget)
+			macText->setTextColor(d.asInt(), start, end);
+		return true;
 	case kTheTextFont:
-		_fontId = d.asInt();
-		_modified = true;
-		return false;
+		if (_widget)
+			macText->setTextFont(d.asInt(), start, end);
+		return true;
 	case kTheTextHeight:
-		_lineSpacing = d.asInt();
-		_modified = true;
+		warning("TextCastMember::setChunkField setting text height(line spacing) is not implemented yet");
 		return false;
 	case kTheTextSize:
-		_fontSize = d.asInt();
-		_modified = true;
-		return false;
+		if (_widget)
+			macText->setTextSize(d.asInt(), start, end);
+		return true;
 	case kTheTextStyle:
-		_textSlant = d.asInt();
-		_modified = true;
-		return false;
+		if (_widget)
+			macText->setTextSlant(d.asInt(), start, end);
+		return true;
 	default:
 		break;
 	}
diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 3c0f1eed0c..f4c361cf71 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -472,7 +472,7 @@ void setTextFontCallback(MacFontRun &macFontRun, int fontId) {
 	macFontRun.fontId = fontId;
 }
 
-void MacText::setTextFont(int start, int end, int fontId) {
+void MacText::setTextFont(int fontId, int start, int end) {
 	setTextChunks(start, end, fontId, setTextFontCallback);
 }
 
@@ -480,7 +480,7 @@ void setTextSlantCallback(MacFontRun &macFontRun, int textSlant) {
 	macFontRun.textSlant = textSlant;
 }
 
-void MacText::setTextSlant(int start, int end, int textSlant) {
+void MacText::setTextSlant(int textSlant, int start, int end) {
 	setTextChunks(start, end, textSlant, setTextSlantCallback);
 }
 
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index dd2906264e..4733131ebf 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -206,10 +206,10 @@ public:
 	uint getTextColor(int start, int end);
 
 	int getTextFont(int start, int end);
-	void setTextFont(int start, int end, int fontId);
+	void setTextFont(int fontId, int start, int end);
 
 	int getTextSlant(int start, int end);
-	void setTextSlant(int start, int end, int textSlant);
+	void setTextSlant(int textSlant, int start, int end);
 
 private:
 	MacFontRun getTextChunks(int start, int end);


Commit: 4add08636543b5cf5bc486bf4b07e594111259e2
    https://github.com/scummvm/scummvm/commit/4add08636543b5cf5bc486bf4b07e594111259e2
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: create a stub for fplay

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-builtins.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 9baceed2f3..1a631622a1 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -163,6 +163,7 @@ static struct BuiltinProto {
 	{ "pause",			LB::b_pause,		0, 0, false, 200, CBLTIN },	// D2 c
 	{ "play",			LB::b_play,			0, 2, false, 200, CBLTIN },	// D2 c
 	{ "playAccel",		LB::b_playAccel,	-1,0, false, 200, CBLTIN },	// D2
+	{"fplay",			LB::b_fplay,		-1,0, false, 200, CBLTIN },                      // D2
 		// play done													// D2
 	{ "preLoad",		LB::b_preLoad,		-1,0, false, 300, CBLTIN },	//		D3.1 c
 	{ "preLoadCast",	LB::b_preLoadCast,	-1,0, false, 300, CBLTIN },	//		D3.1 c
@@ -2401,6 +2402,12 @@ void LB::b_version(int nargs) {
 	g_lingo->push(res);
 }
 
+void LB::b_fplay(int nargs) {
+	for (int i = 0; i < nargs; i++)
+		g_lingo->pop();
+	warning("STUB: b_fplay");
+}
+
 ///////////////////
 // References
 ///////////////////
diff --git a/engines/director/lingo/lingo-builtins.h b/engines/director/lingo/lingo-builtins.h
index 4c00207411..816b867fd2 100644
--- a/engines/director/lingo/lingo-builtins.h
+++ b/engines/director/lingo/lingo-builtins.h
@@ -188,6 +188,8 @@ void b_version(int nargs);
 void b_cast(int nargs);
 void b_script(int nargs);
 
+void b_fplay(int nargs);
+
 void b_numberofchars(int nargs);
 void b_numberofitems(int nargs);
 void b_numberoflines(int nargs);


Commit: d8d43958e8051a7183181c8c1c1375174d0711bb
    https://github.com/scummvm/scummvm/commit/d8d43958e8051a7183181c8c1c1375174d0711bb
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: use initialRect for sprite dims when ink type is copy

Changed paths:
    engines/director/sprite.cpp


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 7446f5a74b..a966c06489 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -292,6 +292,11 @@ void Sprite::setCast(CastMemberID memberID) {
 				_width = dims.width();
 				_height = dims.height();
 			}
+			// for ink copy sprites, we use the original dims
+			if (_ink == kInkTypeCopy) {
+				_width = dims.width();
+				_height = dims.height();
+			}
 		} else if (_cast->_type != kCastShape && _cast->_type != kCastText) {
 			_width = dims.width();
 			_height = dims.height();


Commit: 6c8d4f33674d6a8af41bb96efb5554b882211040
    https://github.com/scummvm/scummvm/commit/6c8d4f33674d6a8af41bb96efb5554b882211040
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: force to modify sprite dims when we are setting cast though lingo

Changed paths:
    engines/director/channel.cpp
    engines/director/sprite.cpp
    engines/director/sprite.h


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index d6b3753ff5..a17ad26400 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -289,7 +289,7 @@ Common::Rect Channel::getBbox(bool unstretched) {
 }
 
 void Channel::setCast(CastMemberID memberID) {
-	_sprite->setCast(memberID);
+	_sprite->setCast(memberID, true);
 	_width = _sprite->_width;
 	_height = _sprite->_height;
 	replaceWidget();
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index a966c06489..6070808a25 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -261,7 +261,7 @@ void Sprite::setPattern(uint16 pattern) {
 	}
 }
 
-void Sprite::setCast(CastMemberID memberID) {
+void Sprite::setCast(CastMemberID memberID, bool forceDims) {
 	CastMember *member = _movie->getCastMember(memberID);
 	_castId = memberID;
 
@@ -288,10 +288,6 @@ void Sprite::setCast(CastMemberID memberID) {
 		Common::Rect dims = _cast->getInitialRect();
 		// strange logic here, need to be fixed
 		if (_cast->_type == kCastBitmap) {
-			if (_width >= dims.width() || _height >= dims.height()) {
-				_width = dims.width();
-				_height = dims.height();
-			}
 			// for ink copy sprites, we use the original dims
 			if (_ink == kInkTypeCopy) {
 				_width = dims.width();
@@ -301,6 +297,12 @@ void Sprite::setCast(CastMemberID memberID) {
 			_width = dims.width();
 			_height = dims.height();
 		}
+
+		// if we are setting the cast though lingo, then we modify the sprites dims to suit for cast member
+		if (forceDims) {
+			_width = dims.width();
+			_height = dims.height();
+		}
 	} else {
 		warning("Sprite::setCast(): %s has null member", memberID.asString().c_str());
 	}
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index 233cae70e8..bdb10101c7 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -74,7 +74,7 @@ public:
 	uint16 getPattern();
 	void setPattern(uint16 pattern);
 
-	void setCast(CastMemberID memberID);
+	void setCast(CastMemberID memberID, bool forceDims = false);
 	bool isQDShape();
 	Graphics::Surface *getQDMatte();
 	void createQDMatte();


Commit: 629ee4bfa3614271832902fb4380fa14d630ca33
    https://github.com/scummvm/scummvm/commit/629ee4bfa3614271832902fb4380fa14d630ca33
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: Don't skip the compression when _bitsPerPixel == 1

Changed paths:
    engines/director/images.cpp


diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index 864db611c7..19be183ad1 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -182,7 +182,8 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) {
 	Common::Array<int> pixels;
 	// If the stream has exactly the required number of bits for this image,
 	// we assume it is uncompressed.
-	if ((stream.size() == _pitch * _surface->h * _bitsPerPixel / 8) || (g_director->getVersion() == 200 && stream.size() >= _surface->h * _surface->w * (_bitsPerPixel / 8))) {
+	// logic above does not fit the situation when _bitsPerPixel == 1, need to fix.
+	if ((stream.size() == _pitch * _surface->h * _bitsPerPixel / 8) || (_bitsPerPixel != 1 && g_director->getVersion() == 200 && stream.size() >= _surface->h * _surface->w * _bitsPerPixel / 8)) {
 		debugC(6, kDebugImages, "Skipping compression");
 		for (int i = 0; i < stream.size(); i++) {
 			pixels.push_back((int)stream.readByte());


Commit: b152fc82aacb8e39ec10aaf47f5a662acea037bd
    https://github.com/scummvm/scummvm/commit/b152fc82aacb8e39ec10aaf47f5a662acea037bd
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: amend setting sprites dims.

Changed paths:
    engines/director/sprite.cpp


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 6070808a25..5678afe366 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -288,6 +288,14 @@ void Sprite::setCast(CastMemberID memberID, bool forceDims) {
 		Common::Rect dims = _cast->getInitialRect();
 		// strange logic here, need to be fixed
 		if (_cast->_type == kCastBitmap) {
+			// i'm not sure about whether to use original dims though comparing with the current one. or we decide it by ink type
+			// for now, we have only met one scaling situation in warlock stambul dancing girl.
+			// at that situation, we are using sprite dims to guide us scaling the cast. And the ink type for that is bkgnd transparent4
+			// maybe there is an flag to indicate the sprite is scaling or not?
+			if (_width >= dims.width() || _height >= dims.height()) {
+				_width = dims.width();
+				_height = dims.height();
+			}
 			// for ink copy sprites, we use the original dims
 			if (_ink == kInkTypeCopy) {
 				_width = dims.width();


Commit: 1b6f29b63a2d16bd10245e0fd30b53188f0264e6
    https://github.com/scummvm/scummvm/commit/1b6f29b63a2d16bd10245e0fd30b53188f0264e6
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: clean the surface after playing transitions

Changed paths:
    engines/director/transitions.cpp


diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index de1d18485f..26ed005723 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -531,6 +531,11 @@ void Window::playTransition(uint16 transDuration, uint8 transArea, uint8 transCh
 
 		g_lingo->executePerFrameHook(t.frame, i);
 	}
+
+	// re-render the surface to clean the tracks when of transitions
+	render(true, _composeSurface);
+	_contentIsDirty = true;
+	g_director->draw();
 }
 
 static int getLog2(int n) {


Commit: d92c06617b50ab370eb6b63c61d0d9ea499e694c
    https://github.com/scummvm/scummvm/commit/d92c06617b50ab370eb6b63c61d0d9ea499e694c
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: fixing createQDMatte

Changed paths:
    engines/director/sprite.cpp


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 5678afe366..1a255528b6 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -123,22 +123,13 @@ void Sprite::createQDMatte() {
 	tmp.create(_width, _height, g_director->_pixelformat);
 	tmp.clear(g_director->_wm->_colorWhite);
 
-	MacShape *ms = new MacShape();
-
-	ms->ink = _ink;
-	ms->spriteType = _spriteType;
-	ms->foreColor = _foreColor;
-	ms->backColor = _backColor;
-	ms->lineSize = _thickness & 0x3;
-	ms->pattern = getPattern();
-
 	Common::Rect srcRect(_width, _height);
 
 	Common::Rect fillAreaRect((int)srcRect.width(), (int)srcRect.height());
-	Graphics::MacPlotData plotFill(&tmp, nullptr, &g_director->getPatterns(), ms->pattern, 0, 0, 1, ms->backColor);
+	Graphics::MacPlotData plotFill(&tmp, nullptr, &g_director->getPatterns(), getPattern(), 0, 0, 1, _backColor);
 
-	Common::Rect strokeRect(MAX((int)srcRect.width() - ms->lineSize, 0), MAX((int)srcRect.height() - ms->lineSize, 0));
-	Graphics::MacPlotData plotStroke(&tmp, nullptr, &g_director->getPatterns(), 1, 0, 0, ms->lineSize, ms->backColor);
+	Common::Rect strokeRect(MAX((int)srcRect.width() - _thickness & 0x3, 0), MAX((int)srcRect.height() - _thickness & 0x3, 0));
+	Graphics::MacPlotData plotStroke(&tmp, nullptr, &g_director->getPatterns(), 1, 0, 0, _thickness & 0x3, _backColor);
 
 	switch (_spriteType) {
 	case kRectangleSprite:


Commit: 4ba52620e5c550c77c4e091915a60f7f1ee990ff
    https://github.com/scummvm/scummvm/commit/4ba52620e5c550c77c4e091915a60f7f1ee990ff
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: delete creating quick matte.

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


diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 1a255528b6..736755a7e7 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -52,7 +52,6 @@ Sprite::Sprite(Frame *frame) {
 	_ink = kInkTypeCopy;
 	_trails = 0;
 
-	_matte = nullptr;
 	_cast = nullptr;
 
 	_thickness = 0;
@@ -72,7 +71,6 @@ Sprite::Sprite(Frame *frame) {
 }
 
 Sprite::~Sprite() {
-	delete _matte;
 }
 
 bool Sprite::isQDShape() {
@@ -118,77 +116,6 @@ bool Sprite::isActive() {
 			|| _movie->getScriptContext(kCastScript, _castId) != nullptr;
 }
 
-void Sprite::createQDMatte() {
-	Graphics::ManagedSurface tmp;
-	tmp.create(_width, _height, g_director->_pixelformat);
-	tmp.clear(g_director->_wm->_colorWhite);
-
-	Common::Rect srcRect(_width, _height);
-
-	Common::Rect fillAreaRect((int)srcRect.width(), (int)srcRect.height());
-	Graphics::MacPlotData plotFill(&tmp, nullptr, &g_director->getPatterns(), getPattern(), 0, 0, 1, _backColor);
-
-	Common::Rect strokeRect(MAX((int)srcRect.width() - _thickness & 0x3, 0), MAX((int)srcRect.height() - _thickness & 0x3, 0));
-	Graphics::MacPlotData plotStroke(&tmp, nullptr, &g_director->getPatterns(), 1, 0, 0, _thickness & 0x3, _backColor);
-
-	switch (_spriteType) {
-	case kRectangleSprite:
-		Graphics::drawFilledRect(fillAreaRect, g_director->_wm->_colorBlack, g_director->_wm->getDrawPixel(), &plotFill);
-		// fall through
-	case kOutlinedRectangleSprite:
-		Graphics::drawRect(strokeRect, g_director->_wm->_colorBlack, g_director->_wm->getDrawPixel(), &plotStroke);
-		break;
-	case kRoundedRectangleSprite:
-		Graphics::drawRoundRect(fillAreaRect, 12, g_director->_wm->_colorBlack, true, g_director->_wm->getDrawPixel(), &plotFill);
-		// fall through
-	case kOutlinedRoundedRectangleSprite:
-		Graphics::drawRoundRect(strokeRect, 12, g_director->_wm->_colorBlack, false, g_director->_wm->getDrawPixel(), &plotStroke);
-		break;
-	case kOvalSprite:
-		Graphics::drawEllipse(fillAreaRect.left, fillAreaRect.top, fillAreaRect.right, fillAreaRect.bottom, g_director->_wm->_colorBlack, true, g_director->_wm->getDrawPixel(), &plotFill);
-		// fall through
-	case kOutlinedOvalSprite:
-		Graphics::drawEllipse(strokeRect.left, strokeRect.top, strokeRect.right, strokeRect.bottom, g_director->_wm->_colorBlack, false, g_director->_wm->getDrawPixel(), &plotStroke);
-		break;
-	case kLineTopBottomSprite:
-		Graphics::drawLine(strokeRect.left, strokeRect.top, strokeRect.right, strokeRect.bottom, g_director->_wm->_colorBlack, g_director->_wm->getDrawPixel(), &plotStroke);
-		break;
-	case kLineBottomTopSprite:
-		Graphics::drawLine(strokeRect.left, strokeRect.bottom, strokeRect.right, strokeRect.top, g_director->_wm->_colorBlack, g_director->_wm->getDrawPixel(), &plotStroke);
-		break;
-	default:
-		warning("Sprite:createQDMatte Expected shape type but got type %d", _spriteType);
-	}
-
-	Graphics::Surface managedSurface;
-	managedSurface.create(_width, _height, g_director->_pixelformat);
-	managedSurface.copyFrom(tmp);
-
-	_matte = new Graphics::FloodFill(&managedSurface, g_director->_wm->_colorWhite, 0, true);
-
-	for (int yy = 0; yy < managedSurface.h; yy++) {
-		_matte->addSeed(0, yy);
-		_matte->addSeed(managedSurface.w - 1, yy);
-	}
-
-	for (int xx = 0; xx < managedSurface.w; xx++) {
-		_matte->addSeed(xx, 0);
-		_matte->addSeed(xx, managedSurface.h - 1);
-	}
-
-	_matte->fillMask();
-	tmp.free();
-	managedSurface.free();
-}
-
-Graphics::Surface *Sprite::getQDMatte() {
-	if (!isQDShape() || _ink != kInkTypeMatte)
-		return nullptr;
-	if (!_matte)
-		createQDMatte();
-	return _matte ? _matte->getMask() : nullptr;
-}
-
 bool Sprite::shouldHilite() {
 	if (!isActive())
 		return false;
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index bdb10101c7..d40e1b1619 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -76,8 +76,6 @@ public:
 
 	void setCast(CastMemberID memberID, bool forceDims = false);
 	bool isQDShape();
-	Graphics::Surface *getQDMatte();
-	void createQDMatte();
 
 	Frame *_frame;
 	Score *_score;
@@ -98,8 +96,6 @@ public:
 	uint16 _pattern;
 	CastMember *_cast;
 
-	Graphics::FloodFill *_matte; // matte for quickdraw shape
-
 	byte _thickness;
 	Common::Point _startPoint;
 	int16 _width;


Commit: fcd87033566ebadba53072a8307ef845561ec00f
    https://github.com/scummvm/scummvm/commit/fcd87033566ebadba53072a8307ef845561ec00f
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: regard 0 as the default palette

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 1c529ba9bb..d9de5ef4ff 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -451,7 +451,9 @@ void Score::renderFrame(uint16 frameId, RenderMode mode) {
 		renderSprites(frameId, mode);
 
 	int currentPalette = _frames[frameId]->_palette.paletteId;
-	if (!_puppetPalette && currentPalette != 0 && currentPalette != _lastPalette) {
+	if (!_puppetPalette && currentPalette != _lastPalette) {
+		if (currentPalette == 0)
+			currentPalette = g_director->getCurrentMovie()->getCast()->_defaultPalette;
 		_lastPalette = currentPalette;
 		g_director->setPalette(resolvePaletteId(currentPalette));
 	}


Commit: 2ef52a07cb0f658b35fee42f2f617e9799e2fae2
    https://github.com/scummvm/scummvm/commit/2ef52a07cb0f658b35fee42f2f617e9799e2fae2
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: amend the way we are parsing palette for D2

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


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 20afc41677..5932bf354c 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -322,7 +322,7 @@ void Cast::loadCast() {
 
 			debugC(2, kDebugLoading, "****** Loading Palette CLUT, #%d", clutList[i]);
 			PaletteV4 p = loadPalette(*pal);
-			g_director->addPalette(clutList[i], p.palette, p.length);
+			g_director->addPalette(clutList[i] & 0xff, p.palette, p.length);
 			delete pal;
 		}
 	}
@@ -508,9 +508,12 @@ void Cast::loadCastChildren() {
 			// TODO: Verify how palettes work in >D4 versions
 			if (_version >= kFileVer400 && _version < kFileVer500 && member->_children.size() == 1) {
 				member->_palette = g_director->getPalette(member->_children[0].index);
-			} else if (_version < kFileVer400) {
+			} else if (_version >= kFileVer300 && _version < kFileVer400) {
 				// D3 palettes are always kept in this ascending order
 				member->_palette = g_director->getPalette((++p)->_value.id);
+			} else if (_version < kFileVer300) {
+				// for D2, we shall use the castId to get the palette
+				member->_palette = g_director->getPalette(member->getID());
 			} else {
 				warning("Cast::loadSpriteChildren(): Expected 1 child for palette cast, got %d", member->_children.size());
 			}
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 3ecb7b76f4..08d9249536 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -97,9 +97,9 @@ public:
 	Common::String getVideoPath(int castId);
 
 	void dumpScript(const char *script, ScriptType type, uint16 id);
+	PaletteV4 loadPalette(Common::SeekableReadStreamEndian &stream);
 
 private:
-	PaletteV4 loadPalette(Common::SeekableReadStreamEndian &stream);
 	void loadScriptText(Common::SeekableReadStreamEndian &stream, uint16 id);
 	void loadFontMap(Common::SeekableReadStreamEndian &stream);
 	void loadFontMapV4(Common::SeekableReadStreamEndian &stream);


Commit: 0d7c1a51b2c1020fdc354d0975841614d0f54900
    https://github.com/scummvm/scummvm/commit/0d7c1a51b2c1020fdc354d0975841614d0f54900
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-08T02:25:11+02:00

Commit Message:
DIRECTOR: amend resolvePaletteId.

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index d9de5ef4ff..1d06e8b4a1 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -99,7 +99,10 @@ int Score::getCurrentPalette() {
 
 int Score::resolvePaletteId(int id) {
 	// TODO: Palette ID should be a CastMemberID to allow for palettes in different casts
-	if (id > 0) {
+	// 255 represent system palette in D2
+	if (id == 255) {
+		id = g_director->getCurrentMovie()->getCast()->_defaultPalette;
+	} else if (id > 0) {
 		CastMember *member = _movie->getCastMember(CastMemberID(id, 0));
 		id = (member && member->_type == kCastPalette) ? ((PaletteCastMember *)member)->getPaletteId() : 0;
 	}
@@ -452,8 +455,6 @@ void Score::renderFrame(uint16 frameId, RenderMode mode) {
 
 	int currentPalette = _frames[frameId]->_palette.paletteId;
 	if (!_puppetPalette && currentPalette != _lastPalette) {
-		if (currentPalette == 0)
-			currentPalette = g_director->getCurrentMovie()->getCast()->_defaultPalette;
 		_lastPalette = currentPalette;
 		g_director->setPalette(resolvePaletteId(currentPalette));
 	}




More information about the Scummvm-git-logs mailing list