[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