diff options
author | Filippos Karapetis | 2019-12-28 13:21:23 +0200 |
---|---|---|
committer | Filippos Karapetis | 2019-12-28 13:22:18 +0200 |
commit | 0ae3cbc2e8dca79ee75f235469ed26715efb0ace (patch) | |
tree | 4cc9cde49f83366d3486ee2d7deb3160c9ba7221 /engines | |
parent | 9cbedc03f9b9e9e44abc457e60ade4b9d14f8938 (diff) | |
download | scummvm-rg350-0ae3cbc2e8dca79ee75f235469ed26715efb0ace.tar.gz scummvm-rg350-0ae3cbc2e8dca79ee75f235469ed26715efb0ace.tar.bz2 scummvm-rg350-0ae3cbc2e8dca79ee75f235469ed26715efb0ace.zip |
STARTREK: Reduce usage of SharedPtr, and simplify bitmap related calls
Diffstat (limited to 'engines')
-rw-r--r-- | engines/startrek/actors.cpp | 20 | ||||
-rw-r--r-- | engines/startrek/bitmap.cpp | 16 | ||||
-rw-r--r-- | engines/startrek/bitmap.h | 6 | ||||
-rw-r--r-- | engines/startrek/graphics.cpp | 15 | ||||
-rw-r--r-- | engines/startrek/graphics.h | 6 | ||||
-rw-r--r-- | engines/startrek/intro.cpp | 12 | ||||
-rw-r--r-- | engines/startrek/menu.cpp | 24 | ||||
-rw-r--r-- | engines/startrek/room.cpp | 2 | ||||
-rw-r--r-- | engines/startrek/rooms/demon4.cpp | 24 | ||||
-rw-r--r-- | engines/startrek/rooms/demon6.cpp | 7 | ||||
-rw-r--r-- | engines/startrek/space.cpp | 28 | ||||
-rw-r--r-- | engines/startrek/space.h | 4 | ||||
-rw-r--r-- | engines/startrek/sprite.cpp | 5 | ||||
-rw-r--r-- | engines/startrek/sprite.h | 1 | ||||
-rw-r--r-- | engines/startrek/startrek.cpp | 6 | ||||
-rw-r--r-- | engines/startrek/startrek.h | 4 | ||||
-rw-r--r-- | engines/startrek/textbox.cpp | 2 |
17 files changed, 93 insertions, 89 deletions
diff --git a/engines/startrek/actors.cpp b/engines/startrek/actors.cpp index fa35468cd3..80704d7ac3 100644 --- a/engines/startrek/actors.cpp +++ b/engines/startrek/actors.cpp @@ -717,19 +717,19 @@ Bitmap *StarTrekEngine::loadAnimationFrame(const Common::String &filename, Fixed && (c == 'm' || c == 's' || c == 'k' || c == 'r')) { if (c == 'm') { // Mccoy has the "base" animations for all crewmen - bitmapToReturn = _gfx->loadBitmap(filename); + bitmapToReturn = new Bitmap(loadBitmapFile(filename)); } else { // All crewman other than mccoy copy the animation frames from mccoy, change // the colors of the uniforms, and load an "xor" file to redraw the face. // TODO: The ".$bm" extension is a "virtual file"? Caches the changes to the // file made here? - // bitmapToReturn = _gfx->loadBitmap(filename + ".$bm"); + // bitmapToReturn = new Bitmap(loadBitmapFile(filename + ".$bm")); if (bitmapToReturn == nullptr) { Common::String mccoyFilename = filename; mccoyFilename.setChar('m', 0); - Bitmap *bitmap = _gfx->loadBitmap(mccoyFilename); + Bitmap *bitmap = new Bitmap(loadBitmapFile(mccoyFilename)); uint16 width = bitmap->width; uint16 height = bitmap->height; @@ -796,7 +796,7 @@ Bitmap *StarTrekEngine::loadAnimationFrame(const Common::String &filename, Fixed } else { // TODO: when loading a bitmap, it passes a different argument than is standard to // the "file loading with cache" function... - bitmapToReturn = _gfx->loadBitmap(filename); + bitmapToReturn = new Bitmap(loadBitmapFile(filename)); } if (scale != 1.0) { @@ -1035,7 +1035,7 @@ void StarTrekEngine::showInventoryIcons(bool showItem) { _itemIconSprite.pos.y = 10; _itemIconSprite.drawPriority = 15; _itemIconSprite.drawPriority2 = 8; - _itemIconSprite.setBitmap(_gfx->loadBitmap(itemFilename)); + _itemIconSprite.setBitmap(loadBitmapFile(itemFilename)); _inventoryIconSprite.pos.x = 46; } @@ -1046,7 +1046,7 @@ void StarTrekEngine::showInventoryIcons(bool showItem) { _inventoryIconSprite.drawMode = 2; _inventoryIconSprite.drawPriority = 15; _inventoryIconSprite.drawPriority2 = 8; - _inventoryIconSprite.setBitmap(_gfx->loadBitmap("inv00")); + _inventoryIconSprite.setBitmap(loadBitmapFile("inv00")); } bool StarTrekEngine::isObjectUnusable(int object, int action) { @@ -1163,7 +1163,7 @@ int StarTrekEngine::showInventoryMenu(int x, int y, bool restoreMouse) { itemSprites[i].pos.y = itemPositions[i].y; itemSprites[i].drawPriority = 15; itemSprites[i].drawPriority2 = 8; - itemSprites[i].setBitmap(_gfx->loadBitmap(itemNames[i])); + itemSprites[i].setBitmap(loadBitmapFile(itemNames[i])); } chooseMousePositionFromSprites(itemSprites, numItems, -1, 4); @@ -1183,11 +1183,11 @@ int StarTrekEngine::showInventoryMenu(int x, int y, bool restoreMouse) { itemIndex = getMenuButtonAt(itemSprites, numItems, mousePos.x, mousePos.y); if (itemIndex != lastItemIndex) { if (lastItemIndex != -1) { - drawMenuButtonOutline(itemSprites[lastItemIndex].bitmap, 0); + drawMenuButtonOutline(itemSprites[lastItemIndex].bitmap.get(), 0); itemSprites[lastItemIndex].bitmapChanged = true; } if (itemIndex != -1) { - drawMenuButtonOutline(itemSprites[itemIndex].bitmap, 15); + drawMenuButtonOutline(itemSprites[itemIndex].bitmap.get(), 15); itemSprites[itemIndex].bitmapChanged = true; } lastItemIndex = itemIndex; @@ -1266,7 +1266,7 @@ exitWithoutSelection: _sound->playSoundEffectIndex(0x10); if (lastItemIndex >= 0) - drawMenuButtonOutline(itemSprites[lastItemIndex].bitmap, 0); + drawMenuButtonOutline(itemSprites[lastItemIndex].bitmap.get(), 0); for (int i = 0; i < numItems; i++) itemSprites[i].dontDrawNextFrame(); diff --git a/engines/startrek/bitmap.cpp b/engines/startrek/bitmap.cpp index 9fa1d36f40..dee8f67154 100644 --- a/engines/startrek/bitmap.cpp +++ b/engines/startrek/bitmap.cpp @@ -27,7 +27,7 @@ namespace StarTrek { -Bitmap::Bitmap(FileStream stream) { +Bitmap::Bitmap(Common::MemoryReadStreamEndian *stream, bool closeStream) { xoffset = stream->readUint16(); yoffset = stream->readUint16(); width = stream->readUint16(); @@ -36,17 +36,11 @@ Bitmap::Bitmap(FileStream stream) { pixelsArraySize = width * height; pixels = new byte[pixelsArraySize]; stream->read(pixels, width * height); -} -Bitmap::Bitmap(Common::MemoryReadStreamEndian *stream) { - xoffset = stream->readUint16(); - yoffset = stream->readUint16(); - width = stream->readUint16(); - height = stream->readUint16(); - - pixelsArraySize = width * height; - pixels = new byte[pixelsArraySize]; - stream->read(pixels, width * height); + if (closeStream) { + delete stream; + stream = nullptr; + } } Bitmap::Bitmap(const Bitmap &bitmap) { diff --git a/engines/startrek/bitmap.h b/engines/startrek/bitmap.h index 6385d191fa..6eef47622b 100644 --- a/engines/startrek/bitmap.h +++ b/engines/startrek/bitmap.h @@ -29,9 +29,6 @@ namespace StarTrek { -// FIXME: Eventually get rid of Common::SharedPtr and dispose of file streams properly -typedef Common::SharedPtr<Common::MemoryReadStreamEndian> FileStream; - struct Bitmap { int16 xoffset; int16 yoffset; @@ -39,8 +36,7 @@ struct Bitmap { int16 height; byte *pixels; - Bitmap(FileStream stream); - Bitmap(Common::MemoryReadStreamEndian *stream); + Bitmap(Common::MemoryReadStreamEndian *stream, bool closeStream = true); Bitmap(const Bitmap &bitmap); Bitmap(int w, int h); ~Bitmap(); diff --git a/engines/startrek/graphics.cpp b/engines/startrek/graphics.cpp index c782bc5ed6..1bef521b9e 100644 --- a/engines/startrek/graphics.cpp +++ b/engines/startrek/graphics.cpp @@ -62,18 +62,21 @@ Graphics::Graphics(StarTrekEngine *vm) : _vm(vm), _egaMode(false) { _paletteFadeLevel = 0; _lockedMousePos = Common::Point(-1, -1); + _backgroundImage = nullptr; } Graphics::~Graphics() { delete[] _egaData; delete[] _palData; delete[] _lutData; + delete _backgroundImage; delete _font; } void Graphics::setBackgroundImage(Common::String imageName) { - _backgroundImage = SharedPtr<Bitmap>(loadBitmap(imageName)); + delete _backgroundImage; + _backgroundImage = new Bitmap(_vm->loadBitmapFile(imageName)); } void Graphics::drawBitmapToBackground(const Common::Rect &origRect, const Common::Rect &drawRect, Bitmap *bitmap) { @@ -238,15 +241,13 @@ byte Graphics::getPriValue(int x, int y) { return b >> 4; } -Bitmap *Graphics::loadBitmap(Common::String basename) { - return new Bitmap(SharedPtr<Common::MemoryReadStreamEndian>(_vm->loadFile(basename + ".BMP"))); -} - Common::Point Graphics::getMousePos() { return _vm->_system->getEventManager()->getMousePos(); } -void Graphics::setMouseBitmap(Bitmap *bitmap) { +void Graphics::setMouseBitmap(Common::String bitmapName) { + Bitmap *bitmap = new Bitmap(_vm->loadBitmapFile(bitmapName)); + CursorMan.pushCursor( bitmap->pixels, bitmap->width, @@ -255,6 +256,8 @@ void Graphics::setMouseBitmap(Bitmap *bitmap) { bitmap->yoffset, 0 ); + + delete bitmap; } void Graphics::popMouseBitmap() { diff --git a/engines/startrek/graphics.h b/engines/startrek/graphics.h index 7b4bb06882..8f8656ded3 100644 --- a/engines/startrek/graphics.h +++ b/engines/startrek/graphics.h @@ -84,14 +84,12 @@ public: void setPri(byte val); byte getPriValue(int x, int y); - Bitmap *loadBitmap(String basename); - Common::Point getMousePos(); /** * Changes the mouse bitmap. The change won't take effect until drawAllSprites is * called again. */ - void setMouseBitmap(Bitmap *bitmap); + void setMouseBitmap(Common::String bitmapName); void popMouseBitmap(); void toggleMouse(bool visible); @@ -166,7 +164,7 @@ private: int16 _paletteFadeLevel; Common::Rect _screenRect; - SharedPtr<Bitmap> _backgroundImage; + Bitmap *_backgroundImage; Sprite *_sprites[MAX_SPRITES]; int _numSprites; diff --git a/engines/startrek/intro.cpp b/engines/startrek/intro.cpp index dd791cb747..26f23557f9 100644 --- a/engines/startrek/intro.cpp +++ b/engines/startrek/intro.cpp @@ -40,7 +40,6 @@ void StarTrekEngine::playIntro() { planetR3.field1e = 3; planetR3.funcPtr1 = 0; planetR3.funcPtr2 = 0; - planetR3.bitmapOffset = 0; _gfx->clearScreenAndPriBuffer(); _gfx->fadeoutScreen(); @@ -57,7 +56,7 @@ void StarTrekEngine::playIntro() { Sprite subtitleSprite; _gfx->addSprite(&subtitleSprite); subtitleSprite.setXYAndPriority(0, 0, 12); - subtitleSprite.setBitmap(_gfx->loadBitmap("blank")); + subtitleSprite.setBitmap(loadBitmapFile("blank")); subtitleSprite.drawPriority2 = 16; int index = 12; @@ -151,7 +150,7 @@ void StarTrekEngine::playIntro() { loadSubtitleSprite(2, &subtitleSprite); planetR3.field22 = 2000; planetR3.field24 = 10000 / _starfieldPointDivisor; - planetR3.shpFile = SharedPtr<Common::MemoryReadStreamEndian>(loadFile("planet.shp")); + planetR3.bitmap = new Bitmap(loadFile("planet.shp")); initIntroR3ObjectToMove(&planetR3, 6, 10000, 6, 10000, 0); addR3(&planetR3); initIntroR3ObjectToMove(&_enterpriseR3, -15, 250, 15, 500, 18); @@ -164,7 +163,8 @@ void StarTrekEngine::playIntro() { break; case 366: - planetR3.shpFile.reset(); + delete planetR3.bitmap; + planetR3.bitmap = nullptr; delR3(&planetR3); break; @@ -232,10 +232,10 @@ void StarTrekEngine::initIntroR3ObjectToMove(R3 *r3, int16 srcAngle, int16 srcDe void StarTrekEngine::loadSubtitleSprite(int index, Sprite *sprite) { if (_showSubtitles) { if (index == -1) - sprite->setBitmap(_gfx->loadBitmap("blank")); + sprite->setBitmap(loadBitmapFile("blank")); else { Common::String file = Common::String::format("tittxt%02d", index); - sprite->setBitmap(_gfx->loadBitmap(file)); + sprite->setBitmap(loadBitmapFile(file)); } } } diff --git a/engines/startrek/menu.cpp b/engines/startrek/menu.cpp index 72531c8554..cb1c290cc8 100644 --- a/engines/startrek/menu.cpp +++ b/engines/startrek/menu.cpp @@ -159,7 +159,7 @@ void StarTrekEngine::chooseMousePositionFromSprites(Sprite *sprites, int numSpri } -void StarTrekEngine::drawMenuButtonOutline(SharedPtr<Bitmap> bitmap, byte color) { +void StarTrekEngine::drawMenuButtonOutline(Bitmap *bitmap, byte color) { int lineWidth = bitmap->width - 2; int offsetToBottom = (bitmap->height - 3) * bitmap->width; @@ -188,7 +188,7 @@ void StarTrekEngine::showOptionsMenu(int x, int y) { _mouseControllingShip = false; Common::Point oldMousePos = _gfx->getMousePos(); - _gfx->setMouseBitmap(_gfx->loadBitmap("options")); + _gfx->setMouseBitmap("options"); loadMenuButtons("options", x, y); uint32 disabledButtons = 0; @@ -307,7 +307,7 @@ int StarTrekEngine::showActionMenu() { bool addEventBack = false; int action = ACTION_WALK; - menuSprite.setBitmap(_gfx->loadBitmap("action")); + menuSprite.setBitmap(loadBitmapFile("action")); int menuWidth = menuSprite.bitmap->width; int menuHeight = menuSprite.bitmap->height; @@ -376,7 +376,7 @@ mousePosChanged: { bitmapName = "walk"; } - _gfx->setMouseBitmap(_gfx->loadBitmap(bitmapName)); + _gfx->setMouseBitmap(bitmapName); if (lockMousePoint.x != -1) _gfx->lockMousePosition(lockMousePoint.x, lockMousePoint.y); @@ -523,7 +523,7 @@ void StarTrekEngine::loadMenuButtons(String mnuFilename, int xpos, int ypos) { } bitmapBasename[10] = '\0'; - _activeMenu->sprites[i].setBitmap(_gfx->loadBitmap(bitmapBasename)); + _activeMenu->sprites[i].setBitmap(loadBitmapFile(bitmapBasename)); _activeMenu->sprites[i].pos.x = stream->readUint16() + xpos; _activeMenu->sprites[i].pos.y = stream->readUint16() + ypos; _activeMenu->retvals[i] = stream->readUint16(); @@ -555,7 +555,7 @@ void StarTrekEngine::setVisibleMenuButtons(uint32 bits) { if ((bits & spriteBitmask) == 0 || sprite->drawMode != 0) { if ((bits & spriteBitmask) == 0 && sprite->drawMode == 2) { if (i == _activeMenu->selectedButton) { - drawMenuButtonOutline(sprite->bitmap, 0x00); + drawMenuButtonOutline(sprite->bitmap.get(), 0x00); _activeMenu->selectedButton = -1; } @@ -592,7 +592,7 @@ void StarTrekEngine::disableMenuButtons(uint32 bits) { if (_activeMenu->selectedButton != -1 && (_activeMenu->disabledButtons & (1 << _activeMenu->selectedButton))) { Sprite *sprite = &_activeMenu->sprites[_activeMenu->selectedButton]; - drawMenuButtonOutline(sprite->bitmap, 0x00); + drawMenuButtonOutline(sprite->bitmap.get(), 0x00); sprite->bitmapChanged = true; _activeMenu->selectedButton = -1; @@ -622,12 +622,12 @@ int StarTrekEngine::handleMenuEvents(uint32 ticksUntilClickingEnabled, bool inTe if (buttonIndex != _activeMenu->selectedButton) { if (_activeMenu->selectedButton != -1) { Sprite &spr = _activeMenu->sprites[_activeMenu->selectedButton]; - drawMenuButtonOutline(spr.bitmap, 0x00); + drawMenuButtonOutline(spr.bitmap.get(), 0x00); spr.bitmapChanged = true; } if (buttonIndex != -1) { Sprite &spr = _activeMenu->sprites[buttonIndex]; - drawMenuButtonOutline(spr.bitmap, 0xda); + drawMenuButtonOutline(spr.bitmap.get(), 0xda); spr.bitmapChanged = true; } _activeMenu->selectedButton = buttonIndex; @@ -835,7 +835,7 @@ rclick: void StarTrekEngine::unloadMenuButtons() { if (_activeMenu->selectedButton != -1) - drawMenuButtonOutline(_activeMenu->sprites[_activeMenu->selectedButton].bitmap, 0x00); + drawMenuButtonOutline(_activeMenu->sprites[_activeMenu->selectedButton].bitmap.get(), 0x00); for (int i = 0; i < _activeMenu->numButtons; i++) { Sprite *sprite = &_activeMenu->sprites[i]; @@ -921,7 +921,7 @@ void StarTrekEngine::chooseMouseBitmapForAction(int action, bool withRedOutline) break; } - _gfx->setMouseBitmap(_gfx->loadBitmap(bitmapName)); + _gfx->setMouseBitmap(bitmapName); } void StarTrekEngine::showQuitGamePrompt(int x, int y) { @@ -1134,7 +1134,7 @@ lclick: if (!spriteLoaded) { _gfx->addSprite(&someSprite); someSprite.setXYAndPriority(3, 168, 15); - someSprite.setBitmap(_gfx->loadBitmap(Common::String::format("turbo%d", clickedArea))); + someSprite.setBitmap(loadBitmapFile(Common::String::format("turbo%d", clickedArea))); spriteLoaded = true; } } else { diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp index 84688acddc..45fd2b2d84 100644 --- a/engines/startrek/room.cpp +++ b/engines/startrek/room.cpp @@ -601,7 +601,7 @@ void Room::showBitmapFor5Ticks(const Common::String &bmpName, int priority) { Sprite sprite; _vm->_gfx->addSprite(&sprite); sprite.setXYAndPriority(0, 0, priority); - sprite.setBitmap(_vm->_gfx->loadBitmap(bmpName)); + sprite.setBitmap(_vm->loadBitmapFile(bmpName)); _vm->_gfx->drawAllSprites(); diff --git a/engines/startrek/rooms/demon4.cpp b/engines/startrek/rooms/demon4.cpp index 46ae5c8f4c..0028ad7a18 100644 --- a/engines/startrek/rooms/demon4.cpp +++ b/engines/startrek/rooms/demon4.cpp @@ -393,25 +393,25 @@ bool Room::demon4ShowSunPuzzle() { _vm->_gfx->addSprite(&sprites[i]); } - sprites[0].setBitmap(_vm->_gfx->loadBitmap("levery")); - sprites[1].setBitmap(_vm->_gfx->loadBitmap("leverr")); - sprites[2].setBitmap(_vm->_gfx->loadBitmap("leverb")); + sprites[0].setBitmap(_vm->loadBitmapFile("levery")); + sprites[1].setBitmap(_vm->loadBitmapFile("leverr")); + sprites[2].setBitmap(_vm->loadBitmapFile("leverb")); - SharedPtr<Bitmap> lightyBitmap = SharedPtr<Bitmap>(_vm->_gfx->loadBitmap("lighty")); - SharedPtr<Bitmap> lightrBitmap = SharedPtr<Bitmap>(_vm->_gfx->loadBitmap("lightr")); - SharedPtr<Bitmap> lightbBitmap = SharedPtr<Bitmap>(_vm->_gfx->loadBitmap("lightb")); + Bitmap *lightyBitmap = new Bitmap(_vm->loadBitmapFile("lighty")); + Bitmap *lightrBitmap = new Bitmap(_vm->loadBitmapFile("lightr")); + Bitmap *lightbBitmap = new Bitmap(_vm->loadBitmapFile("lightb")); for (int i = 3; i < 9; i++) - sprites[i].bitmap = lightyBitmap; + sprites[i].setBitmap(lightyBitmap); for (int i = 9; i < 15; i++) - sprites[i].bitmap = lightrBitmap; + sprites[i].setBitmap(lightrBitmap); for (int i = 15; i < 21; i++) - sprites[i].bitmap = lightbBitmap; + sprites[i].setBitmap(lightbBitmap); Sprite doneButtonSprite; _vm->_gfx->addSprite(&doneButtonSprite); doneButtonSprite.setXYAndPriority(0x104, 0x64, 2); - doneButtonSprite.setBitmap(_vm->_gfx->loadBitmap("donebutt")); + doneButtonSprite.setBitmap(_vm->loadBitmapFile("donebutt")); // BUGFIX: use draw mode 2 so the entire button is clickable (not just non-transparent // pixels) doneButtonSprite.drawMode = 2; @@ -532,6 +532,10 @@ done: _vm->_gfx->copyBackgroundScreen(); _vm->_gfx->forceDrawAllSprites(); + delete lightbBitmap; + delete lightrBitmap; + delete lightyBitmap; + return solved; } diff --git a/engines/startrek/rooms/demon6.cpp b/engines/startrek/rooms/demon6.cpp index 38e274ef41..038f66dea8 100644 --- a/engines/startrek/rooms/demon6.cpp +++ b/engines/startrek/rooms/demon6.cpp @@ -466,7 +466,7 @@ int Room::demon6ShowCase(int visible) { sprites[i].pos.y = spritePositions[i].y; sprites[i].drawPriority = 2; sprites[i].bitmapChanged = true; - sprites[i].setBitmap(_vm->_gfx->loadBitmap(Common::String::format("stlitem%d", i))); + sprites[i].setBitmap(_vm->loadBitmapFile(Common::String::format("stlitem%d", i))); } Sprite buttonSprite; @@ -478,7 +478,7 @@ int Room::demon6ShowCase(int visible) { buttonSprite.pos.y = 0x19; buttonSprite.drawPriority = 2; buttonSprite.bitmapChanged = true; - buttonSprite.setBitmap(_vm->_gfx->loadBitmap("donebutt")); + buttonSprite.setBitmap(_vm->loadBitmapFile("donebutt")); _vm->_gfx->addSprite(&buttonSprite); _vm->_gfx->forceDrawAllSprites(); @@ -579,8 +579,7 @@ int Room::demon6ShowCaseProcessSelection(Sprite *sprites, Sprite *clickedSprite, _vm->_gfx->drawAllSprites(); _vm->_gfx->delSprite(clickedSprite); clickedSprite->bitmap.reset(); - int i = clickedSprite - sprites; - visible ^= (0x10 >> i); + visible ^= (0x10 >> (clickedSprite - sprites)); return visible; } diff --git a/engines/startrek/space.cpp b/engines/startrek/space.cpp index 65f11f30ff..6da45f7170 100644 --- a/engines/startrek/space.cpp +++ b/engines/startrek/space.cpp @@ -116,7 +116,7 @@ void StarTrekEngine::drawStarfield() { file->seek(fileOffset, SEEK_SET); - Bitmap *bitmap = new Bitmap(file); + Bitmap *bitmap = new Bitmap(file, false); if (!drawRect.isEmpty()) _gfx->drawBitmapToBackground(starRect, drawRect, bitmap); delete bitmap; @@ -238,9 +238,7 @@ void StarTrekEngine::drawR3Shape(R3 *r3) { // TODO: call it } - if (r3->shpFile != nullptr) { - r3->shpFile->seek(r3->bitmapOffset, SEEK_SET); - SharedPtr<Bitmap> bitmap(new Bitmap(r3->shpFile)); + if (r3->bitmap != nullptr) { double dbl68 = ((double)r3->field24 * _starfieldPointDivisor) / r3->field36.z; double dbl70 = 1.0 / dbl68; @@ -278,24 +276,24 @@ void StarTrekEngine::drawR3Shape(R3 *r3) { r3->field98 = dbl48; // dbl30, (bitmap->xoffset + 2), r3->field58, - double tmp = r3->field58 - (double)(bitmap->xoffset + 2) * dbl30; + double tmp = r3->field58 - (double)(r3->bitmap->xoffset + 2) * dbl30; // dbl20, (bitmap->yoffset + 2), tmp - double dbl10 = tmp - (double)(bitmap->yoffset + 2) * dbl20; + double dbl10 = tmp - (double)(r3->bitmap->yoffset + 2) * dbl20; // dbl28, (bitmap->xoffset + 2), r3->field5a - tmp = r3->field5a - (double)(bitmap->xoffset + 2) * dbl28; + tmp = r3->field5a - (double)(r3->bitmap->xoffset + 2) * dbl28; // dbl18, (bitmap->yoffset + 2), tmp - double dbl8 = tmp - (double)(bitmap->yoffset + 2) * dbl18; + double dbl8 = tmp - (double)(r3->bitmap->yoffset + 2) * dbl18; // dbl60, r3->field58, bitmap->xoffset + 2 - tmp = (bitmap->xoffset + 2) - dbl60 * r3->field58; + tmp = (r3->bitmap->xoffset + 2) - dbl60 * r3->field58; double dbl40 = tmp - dbl50 * r3->field5a; - tmp = (bitmap->yoffset + 2) - dbl58 * r3->field58; + tmp = (r3->bitmap->yoffset + 2) - dbl58 * r3->field58; double dbl38 = tmp - dbl48 * r3->field5a; - double dbl3e4 = bitmap->width + 2; - double dbl3ec = bitmap->height + 2; + double dbl3e4 = r3->bitmap->width + 2; + double dbl3ec = r3->bitmap->height + 2; double thing[8]; tmp = 1.0 * dbl30; @@ -424,8 +422,8 @@ void StarTrekEngine::drawR3Shape(R3 *r3) { Bitmap tmpBitmap(256, 249); byte *otherBuffer = new byte[256 * 256]; - int16 bitmapWidth = bitmap->width; - int16 bitmapHeight = bitmap->height; + int16 bitmapWidth = r3->bitmap->width; + int16 bitmapHeight = r3->bitmap->height; if (bitmapHeight > 245) error("Shape height too big in drawR3Shape!"); @@ -447,7 +445,7 @@ void StarTrekEngine::drawR3Shape(R3 *r3) { if (r3->field1e == 2) { // TODO } else - _gfx->copyRectBetweenBitmaps(&tmpBitmap, 2, 2, bitmap.get(), 0, 0, bitmapWidth, bitmapHeight); + _gfx->copyRectBetweenBitmaps(&tmpBitmap, 2, 2, r3->bitmap, 0, 0, bitmapWidth, bitmapHeight); byte *bgPixels = _gfx->getBackgroundPixels() + shpImageTop * SCREEN_WIDTH; diff --git a/engines/startrek/space.h b/engines/startrek/space.h index 06e08b05ea..d8fe6798dd 100644 --- a/engines/startrek/space.h +++ b/engines/startrek/space.h @@ -170,8 +170,8 @@ struct R3 { int32 field54; // 0x54 (used for sorting by draw priority?) int16 field58; // 0x58 int16 field5a; // 0x5a - FileStream shpFile; // 0x68 - int16 bitmapOffset; // 0x6a + Bitmap *bitmap; // 0x68 (was: shpFile) + // 0x6a (was: bitmapOffset) double field80; // 0x80 double field88; // 0x88 double field90; // 0x90 diff --git a/engines/startrek/sprite.cpp b/engines/startrek/sprite.cpp index 8b042f2525..51a97ee89f 100644 --- a/engines/startrek/sprite.cpp +++ b/engines/startrek/sprite.cpp @@ -37,6 +37,11 @@ void Sprite::setBitmap(Bitmap *b) { bitmapChanged = true; } +void Sprite::setBitmap(Common::MemoryReadStreamEndian *stream) { + bitmap = SharedPtr<Bitmap>(new Bitmap(stream)); + bitmapChanged = true; +} + void Sprite::setXYAndPriority(int16 x, int16 y, int16 priority) { pos.x = x; pos.y = y; diff --git a/engines/startrek/sprite.h b/engines/startrek/sprite.h index 5c9792be6a..73ba1c4541 100644 --- a/engines/startrek/sprite.h +++ b/engines/startrek/sprite.h @@ -62,6 +62,7 @@ struct Sprite : Common::Serializable { Sprite(); void setBitmap(Bitmap *b); + void setBitmap(Common::MemoryReadStreamEndian *stream); void setXYAndPriority(int16 x, int16 y, int16 priority); void dontDrawNextFrame(); diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp index cd9ec63a34..6a312f3dd0 100644 --- a/engines/startrek/startrek.cpp +++ b/engines/startrek/startrek.cpp @@ -135,7 +135,7 @@ Common::Error StarTrekEngine::run() { initGraphics(SCREEN_WIDTH, SCREEN_HEIGHT); initializeEventsAndMouse(); - _gfx->setMouseBitmap(_gfx->loadBitmap("pushbtn")); + _gfx->setMouseBitmap("pushbtn"); _gfx->toggleMouse(true); bool shouldPlayIntro = true; @@ -511,6 +511,10 @@ Common::MemoryReadStreamEndian *StarTrekEngine::loadFile(Common::String filename return new Common::MemoryReadStreamEndian(data, size, bigEndian); } +Common::MemoryReadStreamEndian *StarTrekEngine::loadBitmapFile(Common::String baseName) { + return loadFile(baseName + ".BMP"); +} + Common::MemoryReadStreamEndian *StarTrekEngine::loadFileWithParams(Common::String filename, bool unk1, bool unk2, bool unk3) { return loadFile(filename); } diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h index 1c21201661..34feebe4ea 100644 --- a/engines/startrek/startrek.h +++ b/engines/startrek/startrek.h @@ -242,6 +242,8 @@ public: void cleanupBridge() {}; // TODO Common::MemoryReadStreamEndian *loadFile(Common::String filename, int fileIndex = 0); + Common::MemoryReadStreamEndian *loadBitmapFile(Common::String baseName); + /** * TODO: Figure out what the extra parameters are, and if they're important. */ @@ -570,7 +572,7 @@ public: * Draws or removes the outline on menu buttons when the cursor hovers on them, or leaves * them. */ - void drawMenuButtonOutline(SharedPtr<Bitmap> bitmap, byte color); + void drawMenuButtonOutline(Bitmap *bitmap, byte color); void showOptionsMenu(int x, int y); /** * Show the "action selection" menu, ie. look, talk, etc. diff --git a/engines/startrek/textbox.cpp b/engines/startrek/textbox.cpp index 4e5acfe6fa..2e213a7c39 100644 --- a/engines/startrek/textbox.cpp +++ b/engines/startrek/textbox.cpp @@ -310,7 +310,7 @@ int StarTrekEngine::showText(TextGetterFunc textGetter, uintptr var, int xoffset Common::Point oldMousePos = _gfx->getMousePos(); _gfx->warpMouse(xoffset + 0xde, yoffset - 0x08); - _gfx->setMouseBitmap(_gfx->loadBitmap("pushbtn")); + _gfx->setMouseBitmap("pushbtn"); bool tmpMouseControllingShip = _mouseControllingShip; _mouseControllingShip = false; |