From fba1368267c470f66099bb833359b9d7fec6273e Mon Sep 17 00:00:00 2001 From: stevenhoefel Date: Sun, 12 Mar 2017 00:18:03 +1100 Subject: DIRECTOR: pre-load cast members. --- engines/director/frame.cpp | 120 ++++++--------------------------------------- 1 file changed, 16 insertions(+), 104 deletions(-) (limited to 'engines/director/frame.cpp') 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(_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(_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(_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(_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(_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(_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(_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; -- cgit v1.2.3