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

npjg nathanael.gentrydb8 at gmail.com
Tue Jul 7 01:23:56 UTC 2020


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

Summary:
47fba684d9 DIRECTOR: Make source pixel not a pointer
558156c54f DIRECTOR: Render implicit mattes with not* inks
fbc201ef90 DIRECTOR: Condition arithmetic inks all at once
c67407afd8 DIRECTOR: Add foreground colour to plot data
ca9213014a DIRECTOR: Fix D4 shape cast loading


Commit: 47fba684d94f4a802145ebecddcae03533bfd8bb
    https://github.com/scummvm/scummvm/commit/47fba684d94f4a802145ebecddcae03533bfd8bb
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-06T21:23:02-04:00

Commit Message:
DIRECTOR: Make source pixel not a pointer

Changed paths:
    engines/director/graphics.cpp


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 5e4325303a..fd13f0d52f 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -799,10 +799,10 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 	if (!p->destRect.contains(x, y))
 		return;
 
-	const byte *src;
 	byte *dst;
+	byte src;
 
-	byte tmpSrc, tmpDst;
+	byte tmpDst;
 
 	dst = (byte *)p->dst->getBasePtr(x, y);
 
@@ -815,95 +815,94 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 		// ink later.
 		tmpDst = *dst;
 		Graphics::macDrawPixel(x, y, color, p->macPlot);
-		tmpSrc = *dst;
+		src = *dst;
 
 		if (p->ink == kInkTypeReverse)
-			tmpSrc = 0;
+			src = 0;
 
 		*dst = tmpDst;
-		src = &tmpSrc;
 	} else if (!p->src) {
 			error("Director::inkDrawPixel(): No source surface");
 			return;
 	} else {
-		src = (const byte *)p->src->getBasePtr(p->srcPoint.x, p->srcPoint.y);
+		src = *((const byte *)p->src->getBasePtr(p->srcPoint.x, p->srcPoint.y));
 	}
 
 	switch (p->ink) {
 	case kInkTypeBackgndTrans:
-		if (*src == p->backColor)
+		if (src == p->backColor)
 			break;
 		// fall through
 	case kInkTypeMatte:
 	case kInkTypeMask:
 		// Only unmasked pixels make it here, so copy them straight
 	case kInkTypeCopy:
-		*dst = *src;
+		*dst = src;
 		break;
 	case kInkTypeTransparent:
 		// FIXME: Is colour to ignore always white (last entry in pallette)?
-		if (*src != p->numColors - 1)
-			*dst &= *src;
+		if (src != p->numColors - 1)
+			*dst &= src;
 		break;
 	case kInkTypeReverse:
 		// TODO: Migrate from Stage to here
-		*dst ^= ~(*src);
+		*dst ^= ~(src);
 		break;
 	case kInkTypeGhost:
-		if (*src != p->numColors - 1)
-			*dst = *dst | ~(*src);
+		if (src != p->numColors - 1)
+			*dst = *dst | ~(src);
 		break;
 	case kInkTypeNotCopy:
-		if (*src != p->numColors - 1)
-			*dst = ~(*src);
+		if (src != p->numColors - 1)
+			*dst = ~(src);
 		break;
 	case kInkTypeNotTrans:
-		if (*src != p->numColors - 1)
-			*dst = *dst & ~(*src);
+		if (src != p->numColors - 1)
+			*dst = *dst & ~(src);
 		break;
 	case kInkTypeNotReverse:
-		if (*src != p->numColors - 1)
-			*dst = *dst ^ *src;
+		if (src != p->numColors - 1)
+			*dst = *dst ^ src;
 		break;
 	case kInkTypeNotGhost:
-		if (*src != p->numColors - 1)
-			*dst = *dst | *src;
+		if (src != p->numColors - 1)
+			*dst = *dst | src;
 		break;
 		// Arithmetic ink types
 	default: {
 		byte rSrc, gSrc, bSrc;
 		byte rDst, gDst, bDst;
 
-		g_director->_wm->decomposeColor(*src, rSrc, gSrc, bSrc);
+		g_director->_wm->decomposeColor(src, rSrc, gSrc, bSrc);
 		g_director->_wm->decomposeColor(*dst, rDst, gDst, bDst);
 
 		switch (p->ink) {
 		case kInkTypeBlend:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor((rSrc + rDst) / 2, (gSrc + gDst) / 2, (bSrc + bDst) / 2);
 			break;
 		case kInkTypeAddPin:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor(MIN((rSrc + rDst), p->numColors - 1), MIN((gSrc + gDst), p->numColors - 1), MIN((bSrc + bDst), p->numColors - 1));
 			break;
 		case kInkTypeAdd:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor(abs(rSrc + rDst) % p->numColors, abs(gSrc + gDst) % p->numColors, abs(bSrc + bDst) % p->numColors);
 			break;
 		case kInkTypeSubPin:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor(MAX(rSrc - rDst, 0), MAX(gSrc - gDst, 0), MAX(bSrc - bDst, 0));
 			break;
 		case kInkTypeLight:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor(MAX(rSrc, rDst), MAX(gSrc, gDst), MAX(bSrc, bDst));
 			break;
 		case kInkTypeSub:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor(abs(rSrc - rDst) % p->numColors, abs(gSrc - gDst) % p->numColors, abs(bSrc - bDst) % p->numColors);
 			break;
 		case kInkTypeDark:
-			if (*src != p->numColors - 1)
+			if (src != p->numColors - 1)
 				*dst = p->_wm->findBestColor(MIN(rSrc, rDst), MIN(gSrc, gDst), MIN(bSrc, bDst));
 			break;
 		default:


Commit: 558156c54fd266b0d533b453d1643087fd430323
    https://github.com/scummvm/scummvm/commit/558156c54fd266b0d533b453d1643087fd430323
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-06T21:23:02-04:00

Commit Message:
DIRECTOR: Render implicit mattes with not* inks

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


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index fd13f0d52f..8237895d97 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -853,20 +853,16 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 			*dst = *dst | ~(src);
 		break;
 	case kInkTypeNotCopy:
-		if (src != p->numColors - 1)
-			*dst = ~(src);
+		*dst = ~(src);
 		break;
 	case kInkTypeNotTrans:
-		if (src != p->numColors - 1)
-			*dst = *dst & ~(src);
+		*dst = *dst & ~(src);
 		break;
 	case kInkTypeNotReverse:
-		if (src != p->numColors - 1)
-			*dst = *dst ^ src;
+		*dst = *dst ^ src;
 		break;
 	case kInkTypeNotGhost:
-		if (src != p->numColors - 1)
-			*dst = *dst | src;
+		*dst = *dst | src;
 		break;
 		// Arithmetic ink types
 	default: {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 3a980f611c..62e32a44a4 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -70,7 +70,13 @@ const Graphics::Surface *Channel::getMask(bool forceMatte) {
 	if (!_sprite->_cast)
 		return nullptr;
 
-	if (_sprite->_ink == kInkTypeMatte || forceMatte) {
+	bool needsMatte = _sprite->_ink == kInkTypeMatte ||
+		_sprite->_ink == kInkTypeNotCopy ||
+		_sprite->_ink == kInkTypeNotTrans ||
+		_sprite->_ink == kInkTypeNotReverse ||
+		_sprite->_ink == kInkTypeNotGhost;
+
+	if (needsMatte || forceMatte) {
 		// Mattes are only supported in bitmaps for now. Shapes don't need mattes,
 		// as they already have all non-enclosed white pixels transparent.
 		// Matte on text has a trivial enough effect to not worry about implementing.
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index da6ef1c629..36986ecca2 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -216,7 +216,7 @@ void Stage::inkBlitSurface(DirectorPlotData *pd, Common::Rect &srcRect, const Gr
 		const byte *msk = mask ? (const byte *)mask->getBasePtr(pd->srcPoint.x, pd->srcPoint.y) : nullptr;
 
 		for (int j = 0; j < pd->destRect.width(); j++, pd->srcPoint.x++)
-			if (!mask || (msk && (pd->ink == kInkTypeMatte ? !(*msk++) : *msk++)))
+			if (!mask || (msk && (pd->ink == kInkTypeMask ? *msk++ : !(*msk++))))
 				inkDrawPixel(pd->destRect.left + j, pd->destRect.top + i, 0, pd);
 	}
 }


Commit: fbc201ef902d3d12ccee5ba56781d0d3a667f556
    https://github.com/scummvm/scummvm/commit/fbc201ef902d3d12ccee5ba56781d0d3a667f556
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-06T21:23:02-04:00

Commit Message:
DIRECTOR: Condition arithmetic inks all at once

Changed paths:
    engines/director/graphics.cpp


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 8237895d97..e29515fdff 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -866,43 +866,38 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 		break;
 		// Arithmetic ink types
 	default: {
-		byte rSrc, gSrc, bSrc;
-		byte rDst, gDst, bDst;
-
-		g_director->_wm->decomposeColor(src, rSrc, gSrc, bSrc);
-		g_director->_wm->decomposeColor(*dst, rDst, gDst, bDst);
-
-		switch (p->ink) {
-		case kInkTypeBlend:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor((rSrc + rDst) / 2, (gSrc + gDst) / 2, (bSrc + bDst) / 2);
-			break;
-		case kInkTypeAddPin:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor(MIN((rSrc + rDst), p->numColors - 1), MIN((gSrc + gDst), p->numColors - 1), MIN((bSrc + bDst), p->numColors - 1));
-			break;
-		case kInkTypeAdd:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor(abs(rSrc + rDst) % p->numColors, abs(gSrc + gDst) % p->numColors, abs(bSrc + bDst) % p->numColors);
-			break;
-		case kInkTypeSubPin:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor(MAX(rSrc - rDst, 0), MAX(gSrc - gDst, 0), MAX(bSrc - bDst, 0));
-			break;
-		case kInkTypeLight:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor(MAX(rSrc, rDst), MAX(gSrc, gDst), MAX(bSrc, bDst));
-			break;
-		case kInkTypeSub:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor(abs(rSrc - rDst) % p->numColors, abs(gSrc - gDst) % p->numColors, abs(bSrc - bDst) % p->numColors);
-			break;
-		case kInkTypeDark:
-			if (src != p->numColors - 1)
-				*dst = p->_wm->findBestColor(MIN(rSrc, rDst), MIN(gSrc, gDst), MIN(bSrc, bDst));
-			break;
-		default:
-			break;
+		if (src != p->numColors - 1) {
+			byte rSrc, gSrc, bSrc;
+			byte rDst, gDst, bDst;
+
+			g_director->_wm->decomposeColor(src, rSrc, gSrc, bSrc);
+			g_director->_wm->decomposeColor(*dst, rDst, gDst, bDst);
+
+			switch (p->ink) {
+			case kInkTypeBlend:
+					*dst = p->_wm->findBestColor((rSrc + rDst) / 2, (gSrc + gDst) / 2, (bSrc + bDst) / 2);
+				break;
+			case kInkTypeAddPin:
+					*dst = p->_wm->findBestColor(MIN((rSrc + rDst), p->numColors - 1), MIN((gSrc + gDst), p->numColors - 1), MIN((bSrc + bDst), p->numColors - 1));
+				break;
+			case kInkTypeAdd:
+					*dst = p->_wm->findBestColor(abs(rSrc + rDst) % p->numColors, abs(gSrc + gDst) % p->numColors, abs(bSrc + bDst) % p->numColors);
+				break;
+			case kInkTypeSubPin:
+					*dst = p->_wm->findBestColor(MAX(rSrc - rDst, 0), MAX(gSrc - gDst, 0), MAX(bSrc - bDst, 0));
+				break;
+			case kInkTypeLight:
+					*dst = p->_wm->findBestColor(MAX(rSrc, rDst), MAX(gSrc, gDst), MAX(bSrc, bDst));
+				break;
+			case kInkTypeSub:
+					*dst = p->_wm->findBestColor(abs(rSrc - rDst) % p->numColors, abs(gSrc - gDst) % p->numColors, abs(bSrc - bDst) % p->numColors);
+				break;
+			case kInkTypeDark:
+					*dst = p->_wm->findBestColor(MIN(rSrc, rDst), MIN(gSrc, gDst), MIN(bSrc, bDst));
+				break;
+			default:
+				break;
+			}
 		}
 	}
 	}


Commit: c67407afd8f5a4f317c3a0277b37133fbdfc9f6c
    https://github.com/scummvm/scummvm/commit/c67407afd8f5a4f317c3a0277b37133fbdfc9f6c
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-06T21:23:02-04:00

Commit Message:
DIRECTOR: Add foreground colour to plot data

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


diff --git a/engines/director/director.h b/engines/director/director.h
index dc454d27bb..227b3a506a 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -111,11 +111,12 @@ struct DirectorPlotData {
 	InkType ink;
 	int numColors;
 	uint backColor;
+	uint foreColor;
 
 	Graphics::MacWindowManager *_wm;
 
-	DirectorPlotData(Graphics::MacWindowManager *wm, Graphics::ManagedSurface *s, Graphics::ManagedSurface *ds, Common::Rect &dr, InkType i, uint b, uint n) :
-		src(s), dst(ds), ink(i), backColor(b), destRect(dr), macPlot(nullptr), numColors(n), _wm(wm) {
+	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;
 	}
 };
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index 36986ecca2..d45014ad97 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -61,7 +61,7 @@ Stage::~Stage() {
 
 void Stage::invertChannel(Channel *channel) {
 	Common::Rect destRect = channel->getBbox();
-	DirectorPlotData pd(_wm, &_surface, &_surface, destRect, kInkTypeMatte, 0, g_director->getPaletteColorCount());
+	DirectorPlotData pd(_wm, &_surface, &_surface, destRect, kInkTypeMatte, 0, 0, g_director->getPaletteColorCount());
 	pd.ignoreSrc = true;
 
 	inkBlitSurface(&pd, destRect, channel->getMask(true));
@@ -146,7 +146,7 @@ void Stage::inkBlitFrom(Channel *channel, Common::Rect destRect, Graphics::Manag
 	destRect.clip(srcRect);
 
 	MacShape *ms = channel->getShape();
-	DirectorPlotData pd(_wm, channel->getSurface(), blitTo, destRect, channel->_sprite->_ink, channel->_sprite->_backColor, g_director->getPaletteColorCount());
+	DirectorPlotData pd(_wm, channel->getSurface(), blitTo, destRect, channel->_sprite->_ink, channel->_sprite->_backColor, channel->_sprite->_foreColor, g_director->getPaletteColorCount());
 
 	if (ms) {
 		inkBlitShape(&pd, srcRect, ms);


Commit: ca9213014a6f4677efa761706eb70e12fe6bfdce
    https://github.com/scummvm/scummvm/commit/ca9213014a6f4677efa761706eb70e12fe6bfdce
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-06T21:23:02-04:00

Commit Message:
DIRECTOR: Fix D4 shape cast loading

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 62e32a44a4..46cbcf0bc6 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -185,7 +185,7 @@ Common::Point Channel::getPosition() {
 }
 
 MacShape *Channel::getShape() {
-	if (!_sprite->isQDShape())
+	if (!_sprite->isQDShape() && (_sprite->_cast && _sprite->_cast->_type != kCastShape))
 		return nullptr;
 
 	MacShape *shape = new MacShape();
@@ -197,43 +197,32 @@ MacShape *Channel::getShape() {
 	shape->lineSize = _sprite->_thickness & 0x3;
 	shape->pattern = _sprite->getPattern();
 
+	// We have already ahove checked for the proper cast type
 	if (g_director->getVersion() >= 3 && shape->spriteType == kCastMemberSprite) {
-		if (!_sprite->_cast) {
-			warning("Channel::getShape(): kCastMemberSprite has no cast defined");
-			return nullptr;
-		}
-		switch (_sprite->_cast->_type) {
-		case kCastShape:
-			{
-				ShapeCastMember *sc = (ShapeCastMember *)_sprite->_cast;
-				switch (sc->_shapeType) {
-				case kShapeRectangle:
-					shape->spriteType = sc->_fillType ? kRectangleSprite : kOutlinedRectangleSprite;
-					break;
-				case kShapeRoundRect:
-					shape->spriteType = sc->_fillType ? kRoundedRectangleSprite : kOutlinedRoundedRectangleSprite;
-					break;
-				case kShapeOval:
-					shape->spriteType = sc->_fillType ? kOvalSprite : kOutlinedOvalSprite;
-					break;
-				case kShapeLine:
-					shape->spriteType = sc->_lineDirection == 6 ? kLineBottomTopSprite : kLineTopBottomSprite;
-					break;
-				default:
-					break;
-				}
-				if (g_director->getVersion() > 3) {
-					shape->foreColor = sc->_fgCol;
-					shape->backColor = sc->_bgCol;
-					shape->lineSize = sc->_lineThickness;
-					shape->ink = sc->_ink;
-				}
-			}
+		ShapeCastMember *sc = (ShapeCastMember *)_sprite->_cast;
+		switch (sc->_shapeType) {
+		case kShapeRectangle:
+			shape->spriteType = sc->_fillType ? kRectangleSprite : kOutlinedRectangleSprite;
+			break;
+		case kShapeRoundRect:
+			shape->spriteType = sc->_fillType ? kRoundedRectangleSprite : kOutlinedRoundedRectangleSprite;
+			break;
+		case kShapeOval:
+			shape->spriteType = sc->_fillType ? kOvalSprite : kOutlinedOvalSprite;
+			break;
+		case kShapeLine:
+			shape->spriteType = sc->_lineDirection == 6 ? kLineBottomTopSprite : kLineTopBottomSprite;
 			break;
 		default:
-			warning("Channel::getShape(): Unhandled cast type: %d", _sprite->_cast->_type);
 			break;
 		}
+
+		if (g_director->getVersion() > 3) {
+			shape->foreColor = sc->_fgCol;
+			shape->backColor = sc->_bgCol;
+			shape->lineSize = sc->_lineThickness;
+			shape->ink = sc->_ink;
+		}
 	}
 
 	// for outlined shapes, line thickness of 1 means invisible.




More information about the Scummvm-git-logs mailing list