[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