diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp index fd13f0d52f5..8237895d97a 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 3a980f611cf..62e32a44a48 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 da6ef1c629f..36986ecca24 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); } }