aboutsummaryrefslogtreecommitdiff
path: root/engines/director/frame.cpp
diff options
context:
space:
mode:
authorstevenhoefel2017-03-12 00:18:03 +1100
committerstevenhoefel2017-03-12 00:18:03 +1100
commitfba1368267c470f66099bb833359b9d7fec6273e (patch)
treec1c87f7244562aefb86f7a93102d8320bdafaa83 /engines/director/frame.cpp
parent145d60b663d94796e031872b5782fa4a8609f86a (diff)
downloadscummvm-rg350-fba1368267c470f66099bb833359b9d7fec6273e.tar.gz
scummvm-rg350-fba1368267c470f66099bb833359b9d7fec6273e.tar.bz2
scummvm-rg350-fba1368267c470f66099bb833359b9d7fec6273e.zip
DIRECTOR: pre-load cast members.
Diffstat (limited to 'engines/director/frame.cpp')
-rw-r--r--engines/director/frame.cpp120
1 files changed, 16 insertions, 104 deletions
diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 7690a47893..b629e43705 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -563,18 +563,17 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
break;
}
} else {
- if (!_vm->getCurrentScore()->_casts.contains(_sprites[i]->_castId)) {
- if (!_vm->getSharedCasts()->contains(_sprites[i]->_castId)) {
+ if (!_vm->getCurrentScore()->_castTypes.contains(_sprites[i]->_castId)) {
+ if (!_vm->getSharedCastTypes()->contains(_sprites[i]->_castId)) {
warning("Cast id %d not found", _sprites[i]->_castId);
continue;
} else {
warning("Getting cast id %d from shared cast", _sprites[i]->_castId);
- cast = _vm->getSharedCasts()->getVal(_sprites[i]->_castId);
+ castType = _vm->getSharedCastTypes()->getVal(_sprites[i]->_castId);
}
} else {
- cast = _vm->getCurrentScore()->_casts[_sprites[i]->_castId];
+ castType = _vm->getCurrentScore()->_castTypes[_sprites[i]->_castId];
}
- castType = cast->type;
}
// this needs precedence to be hit first... D3 does something really tricky with cast IDs for shapes.
@@ -586,34 +585,15 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
} else if (castType == kCastButton) {
renderButton(surface, i, _vm->getVersion() < 4 ? _sprites[i]->_castId + 1024 : cast->children[0].index);
} else {
- Image::ImageDecoder *img = getImageFrom(_sprites[i]->_castId);
-
- if (!img) {
- warning("Image with id %d (%s) not found", _sprites[i]->_castId, numToCastNum(_sprites[i]->_castId));
- continue;
- }
-
- if (!img->getSurface()) {
- warning("Frame::renderSprites: Could not load image %d (%s)", _sprites[i]->_castId, numToCastNum(_sprites[i]->_castId));
- continue;
- }
-
- if (!_sprites[i]->_cast) {
+ if (!_sprites[i]->_bitmapCast) {
warning("No cast ID for sprite %d", i);
continue;
}
- BitmapCast *bitmapCast = static_cast<BitmapCast *>(_sprites[i]->_cast);
- // TODO: might want a quicker way to determine if cast is from Shared Cast.
- if (_vm->getSharedBMP() != NULL && _vm->getSharedBMP()->contains(_sprites[i]->_castId + 1024)) {
- debugC(2, kDebugImages, "Shared cast sprite BMP: id: %d", _sprites[i]->_castId + 1024);
- bitmapCast = static_cast<BitmapCast *>(_vm->getSharedCasts()->getVal(_sprites[i]->_castId));
- }
-
- uint32 regX = bitmapCast->regX;
- uint32 regY = bitmapCast->regY;
- uint32 rectLeft = bitmapCast->initialRect.left;
- uint32 rectTop = bitmapCast->initialRect.top;
+ uint32 regX = _sprites[i]->_bitmapCast->regX;
+ uint32 regY = _sprites[i]->_bitmapCast->regY;
+ uint32 rectLeft = _sprites[i]->_bitmapCast->initialRect.left;
+ uint32 rectTop = _sprites[i]->_bitmapCast->initialRect.top;
int x = _sprites[i]->_startPoint.x - regX + rectLeft;
int y = _sprites[i]->_startPoint.y - regY + rectTop;
@@ -621,9 +601,8 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
int width = _sprites[i]->_width;
Common::Rect drawRect(x, y, x + width, y + height);
-
addDrawRect(i, drawRect);
- inkBasedBlit(surface, *img->getSurface(), i, drawRect);
+ inkBasedBlit(surface, *(_sprites[i]->_bitmapCast->surface), i, drawRect);
}
}
}
@@ -667,15 +646,15 @@ void Frame::renderShape(Graphics::ManagedSurface &surface, uint16 spriteId) {
void Frame::renderButton(Graphics::ManagedSurface &surface, uint16 spriteId, uint16 textId) {
uint16 castId = _sprites[spriteId]->_castId;
- ButtonCast *button = static_cast<ButtonCast *>(_vm->getCurrentScore()->_casts[castId]);
+ ButtonCast *button = _vm->getCurrentScore()->_loadedButtons->getVal(castId);
uint32 rectLeft = button->initialRect.left;
uint32 rectTop = button->initialRect.top;
int x = _sprites[spriteId]->_startPoint.x + rectLeft;
int y = _sprites[spriteId]->_startPoint.y + rectTop;
- int height = button->initialRect.height(); // _sprites[spriteId]->_height;
- int width = button->initialRect.width() + 3; // _sprites[spriteId]->_width;
+ int height = button->initialRect.height();
+ int width = button->initialRect.width() + 3;
Common::Rect textRect(0, 0, width, height);
// pass the rect of the button into the label.
@@ -706,73 +685,6 @@ void Frame::renderButton(Graphics::ManagedSurface &surface, uint16 spriteId, uin
}
}
-Image::ImageDecoder *Frame::getImageFrom(uint16 spriteId) {
- uint16 imgId = spriteId + 1024;
-
- if (_vm->getVersion() >= 4 && _vm->getCurrentScore()->_casts[spriteId]->children.size() > 0)
- imgId = _vm->getCurrentScore()->_casts[spriteId]->children[0].index;
-
- Image::ImageDecoder *img = NULL;
-
- if (_vm->getCurrentScore()->getArchive()->hasResource(MKTAG('D', 'I', 'B', ' '), imgId)) {
- img = new DIBDecoder();
- img->loadStream(*_vm->getCurrentScore()->getArchive()->getResource(MKTAG('D', 'I', 'B', ' '), imgId));
- return img;
- }
-
- if (_vm->getSharedDIB() != NULL && _vm->getSharedDIB()->contains(imgId)) {
- img = new DIBDecoder();
- img->loadStream(*_vm->getSharedDIB()->getVal(imgId));
- return img;
- }
-
- Common::SeekableReadStream *pic = NULL;
- BitmapCast *bc = NULL;
-
- if (_vm->getSharedBMP() != NULL && _vm->getSharedBMP()->contains(imgId)) {
- debugC(4, kDebugImages, "Shared cast BMP: id: %d", imgId);
- pic = _vm->getSharedBMP()->getVal(imgId);
- pic->seek(0); // TODO: this actually gets re-read every loop... we need to rewind it!
- bc = static_cast<BitmapCast *>(_vm->getSharedCasts()->getVal(spriteId));
- } else if (_vm->getCurrentScore()->getArchive()->hasResource(MKTAG('B', 'I', 'T', 'D'), imgId)) {
- pic = _vm->getCurrentScore()->getArchive()->getResource(MKTAG('B', 'I', 'T', 'D'), imgId);
- bc = static_cast<BitmapCast *>(_vm->getCurrentScore()->_casts[spriteId]);
- }
-
- if (pic != NULL && bc != NULL) {
- if (_vm->getVersion() < 4) {
- int w = bc->initialRect.width(), h = bc->initialRect.height();
-
- debugC(4, kDebugImages, "id: %d, w: %d, h: %d, flags: %x, some: %x, unk1: %d, unk2: %d",
- imgId, w, h, bc->flags, bc->someFlaggyThing, bc->unk1, bc->unk2);
- img = new BITDDecoder(w, h);
- } else if (_vm->getVersion() < 6) {
- bc = static_cast<BitmapCast *>(_vm->getCurrentScore()->_casts[spriteId]);
- int w = bc->initialRect.width(), h = bc->initialRect.height();
-
- debugC(4, kDebugImages, "id: %d, w: %d, h: %d, flags: %x, some: %x, unk1: %d, unk2: %d",
- imgId, w, h, bc->flags, bc->someFlaggyThing, bc->unk1, bc->unk2);
- img = new BITDDecoderV4(w, h, bc->bitsPerPixel);
- } else {
- img = new Image::BitmapDecoder();
- }
-
- if (debugChannelSet(8, kDebugLoading)) {
- Common::SeekableReadStream *s = pic;
- byte buf[1024];
- int n = s->read(buf, 1024);
- Common::hexdump(buf, n);
- s->seek(0);
- }
-
- img->loadStream(*pic);
- return img;
- }
-
- warning("Image %d not found", spriteId);
- return img;
-}
-
void Frame::inkBasedBlit(Graphics::ManagedSurface &targetSurface, const Graphics::Surface &spriteSurface, uint16 spriteId, Common::Rect drawRect) {
switch (_sprites[spriteId]->_ink) {
case kInkTypeCopy:
@@ -818,7 +730,7 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteId, Commo
return;
uint16 castId = _sprites[spriteId]->_castId;
- TextCast *textCast = static_cast<TextCast *>(_vm->getCurrentScore()->_casts[castId]);
+ TextCast *textCast = _vm->getCurrentScore()->_loadedText->getVal(castId);
uint32 unk1 = textStream->readUint32();
uint32 strLen = textStream->readUint32();
@@ -906,8 +818,8 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteId, Commo
int x = _sprites[spriteId]->_startPoint.x; // +rectLeft;
int y = _sprites[spriteId]->_startPoint.y; // +rectTop;
- int height = _sprites[spriteId]->_cast->initialRect.height(); //_sprites[spriteId]->_height;
- int width = _sprites[spriteId]->_cast->initialRect.width(); //_sprites[spriteId]->_width;
+ int height = textCast->initialRect.height(); //_sprites[spriteId]->_height;
+ int width = textCast->initialRect.width(); //_sprites[spriteId]->_width;
if (_vm->getVersion() >= 4 && textSize != NULL)
width = textCast->initialRect.right;