[Scummvm-git-logs] scummvm master -> 3b4c416fbfd0d13890cd0e9a69620e807ebc2cc3

npjg nathanael.gentrydb8 at gmail.com
Wed Jul 8 16:50:43 UTC 2020


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:
4b86de7d25 DIRECTOR: Check when we should apply fore/back colour
3b4c416fbf DIRECTOR: Apply fore/back colours to basic inks


Commit: 4b86de7d2547a754e058a7ea7bf0fa867444b039
    https://github.com/scummvm/scummvm/commit/4b86de7d2547a754e058a7ea7bf0fa867444b039
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-08T12:49:22-04:00

Commit Message:
DIRECTOR: Check when we should apply fore/back colour

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


diff --git a/engines/director/director.h b/engines/director/director.h
index 227b3a506a..4cad6fb065 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -108,6 +108,7 @@ struct DirectorPlotData {
 	Common::Point srcPoint;
 
 	bool ignoreSrc;
+	bool applyColor;
 	InkType ink;
 	int numColors;
 	uint backColor;
@@ -118,6 +119,7 @@ struct DirectorPlotData {
 	DirectorPlotData(Graphics::MacWindowManager *wm, Graphics::ManagedSurface *s, Graphics::ManagedSurface *ds, Common::Rect &dr, InkType i, uint b, uint f, uint n) :
 		src(s), dst(ds), ink(i), backColor(b), foreColor(f), destRect(dr), macPlot(nullptr), numColors(n), _wm(wm) {
 		ignoreSrc = false;
+		applyColor = false;
 	}
 };
 
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index 37358f1317..a8907fbd19 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -143,12 +143,49 @@ void Stage::mergeDirtyRects() {
 	}
 }
 
+bool Stage::needsAppliedColor(DirectorPlotData *pd) {
+	// TODO: Is colour white always last entry in palette?
+	uint numColors = g_director->getPaletteColorCount() - 1;
+
+	if (pd->foreColor == 0 && pd->backColor == numColors)
+		return false;
+
+	switch (pd->ink) {
+	case kInkTypeReverse:
+	case kInkTypeNotReverse:
+	case kInkTypeAddPin:
+	case kInkTypeAdd:
+ 	case kInkTypeSubPin:
+	case kInkTypeLight:
+	case kInkTypeSub:
+	case kInkTypeDark:
+	case kInkTypeBackgndTrans:
+		return false;
+	default:
+		break;
+	}
+
+	if (pd->foreColor != 0) {
+		if (pd->ink != kInkTypeGhost && pd->ink != kInkTypeNotGhost)
+			return true;
+	}
+
+	if (pd->backColor != numColors) {
+		if (pd->ink != kInkTypeTransparent &&
+				pd->ink != kInkTypeNotTrans)
+			return true;
+	}
+
+	return false;
+}
+
 void Stage::inkBlitFrom(Channel *channel, Common::Rect destRect, Graphics::ManagedSurface *blitTo) {
 	Common::Rect srcRect = channel->getBbox();
 	destRect.clip(srcRect);
 
 	MacShape *ms = channel->getShape();
 	DirectorPlotData pd(_wm, channel->getSurface(), blitTo, destRect, channel->_sprite->_ink, channel->_sprite->_backColor, channel->_sprite->_foreColor, g_director->getPaletteColorCount());
+	pd.applyColor = needsAppliedColor(&pd);
 
 	if (ms) {
 		inkBlitShape(&pd, srcRect, ms);
diff --git a/engines/director/stage.h b/engines/director/stage.h
index dfc209829a..8e9684b652 100644
--- a/engines/director/stage.h
+++ b/engines/director/stage.h
@@ -48,6 +48,7 @@ class Stage : public Graphics::MacWindow, public Object<Stage> {
 	~Stage();
 
 	bool render(bool forceRedraw = false, Graphics::ManagedSurface *blitTo = nullptr);
+	bool needsAppliedColor(DirectorPlotData *pd);
 
 	void invertChannel(Channel *channel);
 	void setStageColor(uint stageColor);


Commit: 3b4c416fbfd0d13890cd0e9a69620e807ebc2cc3
    https://github.com/scummvm/scummvm/commit/3b4c416fbfd0d13890cd0e9a69620e807ebc2cc3
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-08T12:50:32-04:00

Commit Message:
DIRECTOR: Apply fore/back colours to basic inks

Note that the colourization of copy-family inks is very inefficient.

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


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index e29515fdff..86b0130f86 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -836,33 +836,64 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 	case kInkTypeMatte:
 	case kInkTypeMask:
 		// Only unmasked pixels make it here, so copy them straight
-	case kInkTypeCopy:
-		*dst = src;
+	case kInkTypeCopy: {
+		if (p->applyColor) {
+			// TODO: Improve the efficiency of this composition
+			byte rSrc, gSrc, bSrc;
+			byte rDst, gDst, bDst;
+			byte rFor, gFor, bFor;
+			byte rBak, gBak, bBak;
+
+			g_director->_wm->decomposeColor(src, rSrc, gSrc, bSrc);
+			g_director->_wm->decomposeColor(*dst, rDst, gDst, bDst);
+			g_director->_wm->decomposeColor(p->foreColor, rFor, gFor, bFor);
+			g_director->_wm->decomposeColor(p->backColor, rBak, gBak, bBak);
+
+			*dst = p->_wm->findBestColor((rSrc | rFor) & (~rSrc | rBak),
+																	 (gSrc | gFor) & (~gSrc | gBak),
+																	 (bSrc | bFor) & (~bSrc | bBak));
+		} else {
+			*dst = src;
+		}
+		break;
+	}
+	case kInkTypeNotCopy:
+		if (p->applyColor) {
+			// TODO: Improve the efficiency of this composition
+			byte rSrc, gSrc, bSrc;
+			byte rDst, gDst, bDst;
+			byte rFor, gFor, bFor;
+			byte rBak, gBak, bBak;
+
+			g_director->_wm->decomposeColor(src, rSrc, gSrc, bSrc);
+			g_director->_wm->decomposeColor(*dst, rDst, gDst, bDst);
+			g_director->_wm->decomposeColor(p->foreColor, rFor, gFor, bFor);
+			g_director->_wm->decomposeColor(p->backColor, rBak, gBak, bBak);
+
+			*dst = p->_wm->findBestColor((~rSrc | rFor) & (rSrc | rBak),
+																	 (~gSrc | gFor) & (gSrc | gBak),
+																	 (~bSrc | bFor) & (bSrc | bBak));
+		} else {
+			*dst = src;
+		}
 		break;
 	case kInkTypeTransparent:
-		// FIXME: Is colour to ignore always white (last entry in pallette)?
-		if (src != p->numColors - 1)
-			*dst &= src;
+		*dst = p->applyColor ? (~src & p->foreColor) | (*dst & src) : (*dst & src);
+		break;
+	case kInkTypeNotTrans:
+		*dst = p->applyColor ? (src & p->foreColor) | (*dst & ~src) : (*dst & ~src);
 		break;
 	case kInkTypeReverse:
-		// TODO: Migrate from Stage to here
 		*dst ^= ~(src);
 		break;
-	case kInkTypeGhost:
-		if (src != p->numColors - 1)
-			*dst = *dst | ~(src);
-		break;
-	case kInkTypeNotCopy:
-		*dst = ~(src);
-		break;
-	case kInkTypeNotTrans:
-		*dst = *dst & ~(src);
-		break;
 	case kInkTypeNotReverse:
-		*dst = *dst ^ src;
+		*dst ^= src;
+		break;
+	case kInkTypeGhost:
+		*dst = p->applyColor ? (src | p->backColor) & (*dst | ~src) : (*dst | ~src);
 		break;
 	case kInkTypeNotGhost:
-		*dst = *dst | src;
+		*dst = p->applyColor ? (~src | p->backColor) & (*dst | src) : *dst | src;
 		break;
 		// Arithmetic ink types
 	default: {
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index a8907fbd19..0c94976d4e 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -185,11 +185,16 @@ void Stage::inkBlitFrom(Channel *channel, Common::Rect destRect, Graphics::Manag
 
 	MacShape *ms = channel->getShape();
 	DirectorPlotData pd(_wm, channel->getSurface(), blitTo, destRect, channel->_sprite->_ink, channel->_sprite->_backColor, channel->_sprite->_foreColor, g_director->getPaletteColorCount());
-	pd.applyColor = needsAppliedColor(&pd);
 
 	if (ms) {
 		inkBlitShape(&pd, srcRect, ms);
 	} else if (pd.src) {
+		if (!(channel->_sprite->_cast &&
+				(channel->_sprite->_cast->_type == kCastText ||
+				 channel->_sprite->_cast->_type == kCastButton))) {
+			pd.applyColor = needsAppliedColor(&pd);
+		}
+
 		inkBlitSurface(&pd, srcRect, channel->getMask());
 	} else {
 		warning("Stage::inkBlitFrom: No source surface");




More information about the Scummvm-git-logs mailing list