Skip to content

Commit

Permalink
DIRECTOR: Add support for background trans, matte ink types
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitry Iskrich authored and sev- committed Aug 3, 2016
1 parent c42f406 commit 961adee
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 4 deletions.
66 changes: 63 additions & 3 deletions engines/director/score.cpp
Expand Up @@ -381,11 +381,11 @@ void Frame::readSprite(Common::SeekableReadStream &stream, uint16 offset, uint16
fieldPosition += 2;
break;
case kSpritePositionWidth:
sprite._width = stream.readUint16BE();
sprite._height = stream.readUint16BE();
fieldPosition += 2;
break;
case kSpritePositionHeight:
sprite._height = stream.readUint16BE();
sprite._width = stream.readUint16BE();
fieldPosition += 2;
break;
default:
Expand Down Expand Up @@ -434,12 +434,72 @@ void Frame::display(Archive &_movie, Graphics::ManagedSurface &surface, Common::
height += y;
y = 0;
}
surface.blitFrom(*img.getSurface(), Common::Point(x, y));

Common::Rect drawRect = Common::Rect(x, y, x + width, y + height);

switch(_sprites[i]->_ink) {
case kInkTypeCopy:
surface.blitFrom(*img.getSurface(), Common::Point(x, y));
break;
case kInkTypeBackgndTrans:
drawBackgndTransSprite(surface, *img.getSurface(), drawRect);
break;
case kInkTypeMatte:
drawMatteSprite(surface, *img.getSurface(), drawRect);
break;
default:
warning("Unhandled ink type %d", _sprites[i]->_ink);
surface.blitFrom(*img.getSurface(), Common::Point(x, y));
break;
}
}
}
g_system->copyRectToScreen(surface.getPixels(), surface.pitch, 0, 0, surface.getBounds().width(), surface.getBounds().height());
}

void Frame::drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect) {
uint8 skipColor = 15; //FIXME is it always white (last entry in pallette) ?
for (int ii = 0; ii < sprite.h; ii++) {
const byte *src = (const byte *)sprite.getBasePtr(0, ii);
byte *dst = (byte *)target.getBasePtr(drawRect.left, drawRect.top + ii);
for (int j = 0; j < drawRect.width(); j++) {
if (*src != skipColor)
*dst = *src;
src++;
dst++;
}
}
}

void Frame::drawMatteSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect) {
//Like background trans, but all white pixels NOT ENCLOSED by coloured pixels are transparent
uint8 skipColor = 15;
for (int ii = 0; ii < sprite.h; ii++) {
const byte *leftSrc = (const byte *)sprite.getBasePtr(0, ii);
byte *leftDst = (byte *)target.getBasePtr(drawRect.left, drawRect.top + ii);
bool skip = true;
for (int j = 0; j < drawRect.width() / 2; j++) {
if ((*leftSrc != skipColor) || !skip) {
*leftDst = *leftSrc;
skip = false;
}
leftSrc++;
leftDst++;
}
skip = true;
const byte *rightSrc = (const byte *)sprite.getBasePtr(sprite.w - 1, ii);
byte *rightDst = (byte *)target.getBasePtr(drawRect.right - 1, drawRect.top + ii);
for (int j = 0; j <= drawRect.width() / 2; j++) {
if ((*rightSrc != skipColor) || !skip) {
*rightDst = *rightSrc;
skip = false;
}
rightSrc--;
rightDst--;
}
}
}

Sprite::Sprite() {
_enabled = false;
_width = 0;
Expand Down
3 changes: 2 additions & 1 deletion engines/director/score.h
Expand Up @@ -163,7 +163,8 @@ class Frame {
private:
void readSprite(Common::SeekableReadStream &stream, uint16 offset, uint16 size);
void readMainChannels(Common::SeekableReadStream &stream, uint16 offset, uint16 size);

void drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect);
void drawMatteSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect);
public:
uint8 _actionId;
uint8 _transFlags;
Expand Down

0 comments on commit 961adee

Please sign in to comment.