diff options
-rw-r--r-- | engines/director/score.cpp | 56 | ||||
-rw-r--r-- | engines/director/score.h | 2 |
2 files changed, 39 insertions, 19 deletions
diff --git a/engines/director/score.cpp b/engines/director/score.cpp index 2778cecec2..3863ef75c0 100644 --- a/engines/director/score.cpp +++ b/engines/director/score.cpp @@ -36,6 +36,7 @@ #include "common/events.h" #include "engines/util.h" #include "graphics/managed_surface.h" +#include "image/bmp.h" namespace Director { @@ -1161,19 +1162,7 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) { continue; } - DIBDecoder img; - uint32 imgId = 1024 + _sprites[i]->_castId; - - if (!_vm->_currentScore->getArchive()->hasResource(MKTAG('D', 'I', 'B', ' '), imgId)) { - if (!_vm->getSharedDIB()->contains(imgId)) { - warning("DIB id %d not found", imgId); - continue; - } else { - img.loadStream(*_vm->getSharedDIB()->getVal(imgId)); - } - } else { - img.loadStream(*_vm->_currentScore->getArchive()->getResource(MKTAG('D', 'I', 'B', ' '), imgId)); - } + Image::ImageDecoder *img = getImageFrom(_sprites[i]->_castId); uint32 regX = static_cast<BitmapCast *>(_sprites[i]->_cast)->regX; uint32 regY = static_cast<BitmapCast *>(_sprites[i]->_cast)->regY; @@ -1190,29 +1179,58 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) { switch (_sprites[i]->_ink) { case kInkTypeCopy: - surface.blitFrom(*img.getSurface(), Common::Point(x, y)); + surface.blitFrom(*img->getSurface(), Common::Point(x, y)); break; case kInkTypeBackgndTrans: - drawBackgndTransSprite(surface, *img.getSurface(), drawRect); + drawBackgndTransSprite(surface, *img->getSurface(), drawRect); break; case kInkTypeMatte: - drawMatteSprite(surface, *img.getSurface(), drawRect); + drawMatteSprite(surface, *img->getSurface(), drawRect); break; case kInkTypeGhost: - drawGhostSprite(surface, *img.getSurface(), drawRect); + drawGhostSprite(surface, *img->getSurface(), drawRect); break; case kInkTypeReverse: - drawReverseSprite(surface, *img.getSurface(), drawRect); + drawReverseSprite(surface, *img->getSurface(), drawRect); break; default: warning("Unhandled ink type %d", _sprites[i]->_ink); - surface.blitFrom(*img.getSurface(), Common::Point(x, y)); + surface.blitFrom(*img->getSurface(), Common::Point(x, y)); break; } } } } +Image::ImageDecoder *Frame::getImageFrom(uint16 spriteId) { + uint16 imgId = spriteId + 1024; + Image::ImageDecoder *img; + + if (!_vm->_currentScore->getArchive()->hasResource(MKTAG('D', 'I', 'B', ' '), imgId)) { + img = new DIBDecoder(); + img->loadStream(*_vm->_currentScore->getArchive()->getResource(MKTAG('D', 'I', 'B', ' '), imgId)); + return img; + } + + if (_vm->getSharedDIB()->contains(imgId)) { + img = new DIBDecoder(); + img->loadStream(*_vm->getSharedDIB()->getVal(imgId)); + return img; + } + + if (!_vm->_currentScore->getArchive()->hasResource(MKTAG('B', 'I', 'T', 'D'), imgId)) { + img = new Image::BitmapDecoder(); + img->loadStream(*_vm->_currentScore->getArchive()->getResource(MKTAG('B', 'I', 'T', 'D'), imgId)); + return img; + } + + //TODO Shared bitmaps + + warning("Image %d not found", spriteId); + return img; +} + + void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteID) { warning("STUB: renderText()"); } diff --git a/engines/director/score.h b/engines/director/score.h index 6c6b661d69..9f13df77f6 100644 --- a/engines/director/score.h +++ b/engines/director/score.h @@ -29,6 +29,7 @@ #include "director/resource.h" #include "graphics/managed_surface.h" #include "common/str.h" +#include "image/image_decoder.h" namespace Director { @@ -302,6 +303,7 @@ private: void readPaletteInfo(Common::SeekableSubReadStreamEndian &stream); void readSprite(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size); void readMainChannels(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size); + Image::ImageDecoder *getImageFrom(uint16 spriteID); void drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect); void drawMatteSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect); void drawGhostSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect); |