[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