DIRECTOR: Render implicit mattes with not* inks

This commit is contained in:
Nathanael Gentry 2020-07-06 12:00:57 -04:00
parent 47fba684d9
commit 558156c54f
3 changed files with 12 additions and 10 deletions

View File

@ -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: {

View File

@ -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.

View File

@ -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);
}
}