PEGASUS: Add ability to draw masked surfaces

This commit is contained in:
Matthew Hoops 2011-10-31 23:20:54 -04:00
parent 74d08a1543
commit 0d6dbfa2cb
2 changed files with 32 additions and 0 deletions

View File

@ -205,6 +205,37 @@ void Surface::copyToCurrentPortTransparent(const Common::Rect &srcRect, const Co
}
}
void Surface::copyToCurrentPortMasked(const Common::Rect &srcRect, const Common::Rect &dstRect, const Surface *mask) const {
Graphics::Surface *screen = ((PegasusEngine *)g_engine)->_gfx->getCurSurface();
byte *src = (byte *)_surface->getBasePtr(srcRect.left, srcRect.top);
byte *dst = (byte *)screen->getBasePtr(dstRect.left, dstRect.top);
int lineSize = srcRect.width() * _surface->format.bytesPerPixel;
for (int y = 0; y < srcRect.height(); y++) {
byte *maskSrc = (byte *)mask->getSurface()->getBasePtr(0, y);
for (int x = 0; x < srcRect.width(); x++) {
if (g_system->getScreenFormat().bytesPerPixel == 2) {
uint16 color = READ_UINT16(maskSrc);
if (!isTransparent(color))
memcpy(dst, src, 2);
} else if (g_system->getScreenFormat().bytesPerPixel == 4) {
uint32 color = READ_UINT32(maskSrc);
if (!isTransparent(color))
memcpy(dst, src, 4);
}
src += g_system->getScreenFormat().bytesPerPixel;
maskSrc += g_system->getScreenFormat().bytesPerPixel;
dst += g_system->getScreenFormat().bytesPerPixel;
}
src += _surface->pitch - lineSize;
dst += screen->pitch - lineSize;
}
}
void Surface::copyToCurrentPortTransparentGlow(const Common::Rect &srcRect, const Common::Rect &dstRect) const {
// This is the same as copyToCurrentPortTransparent(), but turns the red value of each
// pixel all the way up.

View File

@ -70,6 +70,7 @@ public:
void copyToCurrentPortTransparent(const Common::Rect &) const;
void copyToCurrentPort(const Common::Rect &, const Common::Rect &) const;
void copyToCurrentPortTransparent(const Common::Rect &, const Common::Rect &) const;
void copyToCurrentPortMasked(const Common::Rect &, const Common::Rect &, const Surface *) const;
void copyToCurrentPortTransparentGlow(const Common::Rect &, const Common::Rect &) const;
void scaleTransparentCopy(const Common::Rect &, const Common::Rect &) const;
void scaleTransparentCopyGlow(const Common::Rect &, const Common::Rect &) const;