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

npjg nathanael.gentrydb8 at gmail.com
Thu Jul 9 17:32:24 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:
9652a17acf DIRECTOR: Make invert-on-click faster
0bffd5d616 DIRECTOR: Reorganize control of DirectorPlotData


Commit: 9652a17acf690cc6a4844f28a25701e0d7145e78
    https://github.com/scummvm/scummvm/commit/9652a17acf690cc6a4844f28a25701e0d7145e78
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-09T13:31:27-04:00

Commit Message:
DIRECTOR: Make invert-on-click faster

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


diff --git a/engines/director/director.h b/engines/director/director.h
index 118b6d68a8..5b6b32ff56 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -107,7 +107,6 @@ struct DirectorPlotData {
 	Common::Rect &destRect;
 	Common::Point srcPoint;
 
-	bool ignoreSrc;
 	bool manualInk;
 	bool applyColor;
 	InkType ink;
@@ -119,7 +118,6 @@ 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;
 		manualInk = false;
 	}
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 8420b71985..4c333b6726 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -806,11 +806,7 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 
 	dst = (byte *)p->dst->getBasePtr(x, y);
 
-	if (p->ignoreSrc) {
-		// This fast-track mode is currently used only for inversions on click
-		*dst = ~(*dst);
-		return;
-	} else if (p->macPlot) {
+	if (p->macPlot) {
 		// Get the pixel that macDrawPixel will give us, but store it to apply the
 		// ink later.
 		tmpDst = *dst;
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index f49a48bb04..8dee4a9ee9 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -65,10 +65,10 @@ Stage::~Stage() {
 
 void Stage::invertChannel(Channel *channel) {
 	Common::Rect destRect = channel->getBbox();
-	DirectorPlotData pd(_wm, &_surface, &_surface, destRect, kInkTypeMatte, 0, 0, g_director->getPaletteColorCount());
-	pd.ignoreSrc = true;
-
-	inkBlitSurface(&pd, destRect, channel->getMask(true));
+	for (int i = 0; i < destRect.height(); i++) {
+		byte *src = (byte *)_surface->getBasePtr(destRect.left, destRect.top + yy);
+		for (int j = 0; j < destRect.width(); j++, src++)
+			*src = ~(*src);
 }
 
 bool Stage::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {


Commit: 0bffd5d616f854349a0c5714fd2aee60dc1d3324
    https://github.com/scummvm/scummvm/commit/0bffd5d616f854349a0c5714fd2aee60dc1d3324
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-09T13:31:32-04:00

Commit Message:
DIRECTOR: Reorganize control of DirectorPlotData

The Channel is also made into a class.

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


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 1d7b535900..8a61a9b525 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -43,6 +43,23 @@ Channel::Channel(Sprite *sp) {
 	_sprite->updateCast();
 }
 
+DirectorPlotData Channel::getPlotData() {
+	DirectorPlotData pd(g_director->_wm, _sprite->_ink, getBackColor(), getForeColor(), g_director->getPaletteColorCount());
+
+	void *src = getSurface();
+	if (src) {
+		pd.isShape = false;
+		pd.src = src;
+	} else {
+		pd.src = getShape();
+
+		if (pd.src)
+			pd.isShape = true;
+	}
+
+	return pd;
+}
+
 Graphics::ManagedSurface *Channel::getSurface() {
 	if (_sprite->_cast && _sprite->_cast->_widget) {
 		return  _sprite->_cast->_widget->getSurface();
diff --git a/engines/director/channel.h b/engines/director/channel.h
index 9f9b63d849..c5484dc8ab 100644
--- a/engines/director/channel.h
+++ b/engines/director/channel.h
@@ -32,16 +32,20 @@ namespace Director {
 
 class Sprite;
 
-struct MacShape {
-	InkType ink;
-	byte spriteType;
-	byte foreColor;
-	byte backColor;
-	int lineSize;
-	uint pattern;
-};
+class Channel {
+public:
+	Channel(Sprite *sp);
+
+	DirectorPlotData getPlotData();
+	const Graphics::Surface *getMask(bool forceMatte = false);
+	Common::Rect getBbox();
+
+	bool isDirty(Sprite *nextSprite = nullptr);
+	void setClean(Sprite *nextSprite, int spriteId);
+
+	void addDelta(Common::Point pos);
 
-struct Channel {
+public:
 	Sprite *_sprite;
 
 	bool _dirty;
@@ -50,20 +54,14 @@ struct Channel {
 	Common::Point _currentPoint;
 	Common::Point _delta;
 
-	Channel(Sprite *sp);
-	bool isDirty(Sprite *nextSprite = nullptr);
-
-	void addRegistrationOffset(Common::Point &pos);
-	Common::Rect getBbox();
-	Common::Point getPosition();
+private:
+	Graphics::ManagedSurface *getSurface();
 	MacShape *getShape();
+	Common::Point getPosition();
 	uint getForeColor();
 	uint getBackColor();
-	Graphics::ManagedSurface *getSurface();
-	const Graphics::Surface *getMask(bool forceMatte = false);
 
-	void setClean(Sprite *nextSprite, int spriteId);
-	void addDelta(Common::Point pos);
+	void addRegistrationOffset(Common::Point &pos);
 };
 
 } // End of namespace Director
diff --git a/engines/director/director.h b/engines/director/director.h
index 5b6b32ff56..dd873a1a8c 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -98,28 +98,46 @@ struct PaletteV4 {
 	int length;
 };
 
+struct MacShape {
+	InkType ink;
+	byte spriteType;
+	byte foreColor;
+	byte backColor;
+	int lineSize;
+	uint pattern;
+
+	Graphics::MacPlotData *pd;
+};
+
 // An extension of MacPlotData for interfacing with inks and patterns without
 // needing extra surfaces.
 struct DirectorPlotData {
-	Graphics::ManagedSurface *src;
+	Graphics::MacWindowManager *_wm;
 	Graphics::ManagedSurface *dst;
-	Graphics::MacPlotData *macPlot;
-	Common::Rect &destRect;
+	Common::Rect destRect;
 	Common::Point srcPoint;
 
-	bool manualInk;
+	bool isShape;
+	void *src;
+
 	bool applyColor;
+	bool manualInk;
 	InkType ink;
 	int numColors;
 	uint backColor;
 	uint foreColor;
 
-	Graphics::MacWindowManager *_wm;
+	bool setNeedsColor(); // graphics.cpp
 
-	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) {
-		applyColor = false;
+	DirectorPlotData(Graphics::MacWindowManager *w, InkType i, uint b, uint f, uint n) : _wm(w), ink(i), backColor(b), foreColor(f), numColors(n) {
 		manualInk = false;
+
+		applyColor = setNeedsColor();
+	}
+
+	~DirectorPlotData() {
+		if (isShape)
+			delete (MacShape *)src;
 	}
 };
 
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 4c333b6726..76a353a09d 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -806,11 +806,11 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 
 	dst = (byte *)p->dst->getBasePtr(x, y);
 
-	if (p->macPlot) {
+	if (p->isShape) {
 		// Get the pixel that macDrawPixel will give us, but store it to apply the
 		// ink later.
 		tmpDst = *dst;
-		Graphics::macDrawPixel(x, y, color, p->macPlot);
+		Graphics::macDrawPixel(x, y, color, ((MacShape *)p->src)->pd);
 		src = *dst;
 
 		*dst = tmpDst;
@@ -818,7 +818,7 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 			error("Director::inkDrawPixel(): No source surface");
 			return;
 	} else {
-		src = *((const byte *)p->src->getBasePtr(p->srcPoint.x, p->srcPoint.y));
+		src = *((const byte *)((Graphics::ManagedSurface *)p->src)->getBasePtr(p->srcPoint.x, p->srcPoint.y));
 
 		if (p->manualInk) {
 			switch(p->ink) {
@@ -955,4 +955,44 @@ void inkDrawPixel(int x, int y, int color, void *data) {
 	}
 }
 
+bool DirectorPlotData::setNeedsColor() {
+	if (isShape)
+		return false;
+
+	// TODO: Is colour white always last entry in palette?
+	uint numColors = g_director->getPaletteColorCount() - 1;
+
+	if (foreColor == 0 && backColor == numColors)
+		return false;
+
+	switch (ink) {
+	case kInkTypeReverse:
+	case kInkTypeNotReverse:
+	case kInkTypeAddPin:
+	case kInkTypeAdd:
+ 	case kInkTypeSubPin:
+	case kInkTypeLight:
+	case kInkTypeSub:
+	case kInkTypeDark:
+	case kInkTypeBackgndTrans:
+		return false;
+	default:
+		break;
+	}
+
+	if (foreColor != 0) {
+		if (ink != kInkTypeGhost && ink != kInkTypeNotGhost)
+			return true;
+	}
+
+	if (backColor != numColors) {
+		if (ink != kInkTypeTransparent &&
+				ink != kInkTypeNotTrans)
+			return true;
+	}
+
+	return false;
+}
+
+
 }
diff --git a/engines/director/score.h b/engines/director/score.h
index 72120c25ee..ba73d13c6f 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -48,7 +48,7 @@ class Frame;
 struct Label;
 class Movie;
 struct Resource;
-struct Channel;
+class Channel;
 class Sprite;
 class CastMember;
 
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index 8dee4a9ee9..93f98e9555 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -66,9 +66,10 @@ Stage::~Stage() {
 void Stage::invertChannel(Channel *channel) {
 	Common::Rect destRect = channel->getBbox();
 	for (int i = 0; i < destRect.height(); i++) {
-		byte *src = (byte *)_surface->getBasePtr(destRect.left, destRect.top + yy);
+		byte *src = (byte *)_surface.getBasePtr(destRect.left, destRect.top + i);
 		for (int j = 0; j < destRect.width(); j++, src++)
 			*src = ~(*src);
+	}
 }
 
 bool Stage::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
@@ -148,53 +149,17 @@ 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->getBackColor(), channel->getForeColor(), g_director->getPaletteColorCount());
+	DirectorPlotData pd = channel->getPlotData();
+	pd.destRect = destRect;
+	pd.dst = blitTo;
 
-	if (ms) {
-		inkBlitShape(&pd, srcRect, ms);
+	if (pd.isShape) {
+		inkBlitShape(&pd, srcRect);
 	} else if (pd.src) {
-		pd.applyColor = needsAppliedColor(&pd);
 		if (channel->_sprite->_spriteType == kTextSprite) {
 			// Copy colourization is already applied to text by default
 			if (pd.ink != kInkTypeCopy)
@@ -209,7 +174,9 @@ void Stage::inkBlitFrom(Channel *channel, Common::Rect destRect, Graphics::Manag
 	}
 }
 
-void Stage::inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect, MacShape *ms) {
+void Stage::inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect) {
+	MacShape *ms = ((MacShape *)pd->src);
+
 	switch (pd->ink) {
 	case kInkTypeNotTrans:
 	case kInkTypeNotReverse:
@@ -233,42 +200,40 @@ void Stage::inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect, MacShape *
 
 	switch (ms->spriteType) {
 	case kRectangleSprite:
-		pd->macPlot = &plotFill;
+		ms->pd = &plotFill;
 		Graphics::drawFilledRect(fillRect, ms->foreColor, inkDrawPixel, pd);
 		// fall through
 	case kOutlinedRectangleSprite:
-		pd->macPlot = &plotStroke;
+		ms->pd = &plotStroke;
 		Graphics::drawRect(strokeRect, ms->foreColor, inkDrawPixel, pd);
 		break;
 	case kRoundedRectangleSprite:
-		pd->macPlot = &plotFill;
+		ms->pd = &plotFill;
 		Graphics::drawRoundRect(fillRect, 12, ms->foreColor, true, inkDrawPixel, pd);
 		// fall through
 	case kOutlinedRoundedRectangleSprite:
-		pd->macPlot = &plotStroke;
+		ms->pd = &plotStroke;
 		Graphics::drawRoundRect(strokeRect, 12, ms->foreColor, false, inkDrawPixel, pd);
 		break;
 	case kOvalSprite:
-		pd->macPlot = &plotFill;
+		ms->pd = &plotFill;
 		Graphics::drawEllipse(fillRect.left, fillRect.top, fillRect.right, fillRect.bottom, ms->foreColor, true, inkDrawPixel, pd);
 		// fall through
 	case kOutlinedOvalSprite:
-		pd->macPlot = &plotStroke;
+		ms->pd = &plotStroke;
 		Graphics::drawEllipse(strokeRect.left, strokeRect.top, strokeRect.right, strokeRect.bottom, ms->foreColor, false, inkDrawPixel, pd);
 		break;
 	case kLineTopBottomSprite:
-		pd->macPlot = &plotStroke;
+		ms->pd = &plotStroke;
 		Graphics::drawLine(strokeRect.left, strokeRect.top, strokeRect.right, strokeRect.bottom, ms->foreColor, inkDrawPixel, pd);
 		break;
 	case kLineBottomTopSprite:
-		pd->macPlot = &plotStroke;
+		ms->pd = &plotStroke;
 		Graphics::drawLine(strokeRect.left, strokeRect.top, strokeRect.right, strokeRect.bottom, ms->foreColor, inkDrawPixel, pd);
 		break;
 	default:
 		warning("Stage::inkBlitFrom: Expected shape type but got type %d", ms->spriteType);
 	}
-
-	delete ms;
 }
 
 void Stage::inkBlitSurface(DirectorPlotData *pd, Common::Rect &srcRect, const Graphics::Surface *mask) {
diff --git a/engines/director/stage.h b/engines/director/stage.h
index 911053778e..77fe716959 100644
--- a/engines/director/stage.h
+++ b/engines/director/stage.h
@@ -164,7 +164,7 @@ private:
 
 private:
 	void inkBlitFrom(Channel *channel, Common::Rect destRect, Graphics::ManagedSurface *blitTo = nullptr);
-	void inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect, MacShape *ms);
+	void inkBlitShape(DirectorPlotData *pd, Common::Rect &srcRect);
 	void inkBlitSurface(DirectorPlotData *pd, Common::Rect &srcRect, const Graphics::Surface *mask);
 };
 




More information about the Scummvm-git-logs mailing list