DIRECTOR: Encapsulated tile access and implement override by VWTL

This commit is contained in:
Eugene Sandulenko 2022-06-15 00:37:23 +02:00
parent a2a37604ce
commit b7735a6326
No known key found for this signature in database
GPG Key ID: 014D387312D34F08
7 changed files with 68 additions and 15 deletions

View File

@ -1370,7 +1370,7 @@ void Cast::loadVWTL(Common::SeekableReadStreamEndian &stream) {
uint16 castLibId = 0; // default for pre-D5
uint16 memberId;
for (int i = 0; i < NUMTILEPATTERNS; i++) {
for (int i = 0; i < kNumBuiltinTiles; i++) {
stream.readUint32(); // unused
if (_version >= kFileVer500)
@ -1380,9 +1380,9 @@ void Cast::loadVWTL(Common::SeekableReadStreamEndian &stream) {
r = Movie::readRect(stream);
_patterns[i].bitmapId.castLib = castLibId;
_patterns[i].bitmapId.member = memberId;
_patterns[i].rect = r;
_tiles[i].bitmapId.castLib = castLibId;
_tiles[i].bitmapId.member = memberId;
_tiles[i].rect = r;
debugC(2, kDebugLoading, "Cast::loadCastDataVWCR(): entry %d - %u:%u [%d, %d, %d, %d]", i, castLibId, memberId,
r.left, r.top, r.right, r.bottom);

View File

@ -142,6 +142,7 @@ public:
Common::Rect _movieRect;
uint16 _stageColor;
int _defaultPalette;
TilePatternEntry _tiles[kNumBuiltinTiles];
LingoArchive *_lingoArchive;
@ -157,8 +158,6 @@ private:
Common::HashMap<uint16, CastMemberInfo *> _castsInfo;
Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _castsNames;
Common::HashMap<uint16, int> _castsScriptIds;
TilePatternEntry _patterns[NUMTILEPATTERNS];
};
} // End of namespace Director

View File

@ -124,9 +124,17 @@ struct MacShape {
int lineSize;
uint pattern;
Image::ImageDecoder *tile;
Common::Rect *tileRect;
Graphics::MacPlotData *pd;
};
struct PatternTile {
Image::ImageDecoder *img;
Common::Rect rect;
};
const int SCALE_THRESHOLD = 0x100;
class DirectorEngine : public ::Engine {
@ -178,6 +186,8 @@ public:
uint16 getPaletteColorCount() const { return _currentPaletteLength; }
void loadPatterns();
Image::ImageDecoder *getTile(int num);
const Common::Rect &getTileRect(int num);
uint32 transformColor(uint32 color);
Graphics::MacPatterns &getPatterns();
void setCursor(DirectorCursor type);
@ -236,10 +246,8 @@ private:
Graphics::MacPatterns _director3Patterns;
Graphics::MacPatterns _director3QuickDrawPatterns;
public:
Image::ImageDecoder *_builtinTiles[kNumBuiltinTiles];
PatternTile _builtinTiles[kNumBuiltinTiles];
private:
Common::HashMap<int, PaletteV4> _loadedPalettes;
Graphics::ManagedSurface *_surface;

View File

@ -24,6 +24,9 @@
#include "graphics/macgui/macwindowmanager.h"
#include "director/director.h"
#include "director/cast.h"
#include "director/castmember.h"
#include "director/movie.h"
#include "director/images.h"
namespace Director {
@ -51,13 +54,17 @@ void DirectorEngine::loadPatterns() {
for (int i = 0; i < ARRAYSIZE(director3QuickDrawPatterns); i++)
_director3QuickDrawPatterns.push_back(director3QuickDrawPatterns[i]);
// We must set it here for correct work of BITDDecoder.
// It is set later in Director properly
_pixelformat = Graphics::PixelFormat::createFormatCLUT8();
for (int i = 0; i < ARRAYSIZE(builtinTiles); i++) {
Common::MemoryReadStream stream(builtinTiles[i].ptr, builtinTiles[i].size);
_builtinTiles[i] = new BITDDecoder(builtinTiles[i].w, builtinTiles[i].h, 8, builtinTiles[i].w, macPalette, kFileVer300);
_builtinTiles[i]->loadStream(stream);
_builtinTiles[i].img = new BITDDecoder(builtinTiles[i].w, builtinTiles[i].h, 8, builtinTiles[i].w, macPalette, kFileVer300);
_builtinTiles[i].img->loadStream(stream);
_builtinTiles[i].rect = Common::Rect(0, 0, builtinTiles[i].w, builtinTiles[i].h);
}
}
@ -66,6 +73,40 @@ Graphics::MacPatterns &DirectorEngine::getPatterns() {
return _director3QuickDrawPatterns;
}
Image::ImageDecoder *DirectorEngine::getTile(int num) {
TilePatternEntry *tile = &getCurrentMovie()->getCast()->_tiles[num];
if (tile->bitmapId.isNull())
return _builtinTiles[num].img;
CastMember *member = getCurrentMovie()->getCastMember(tile->bitmapId);
if (!member) {
warning("BUILDBOT: DirectorEngine::getTile(%d) VWTL refers to non-existing cast %s", num,
tile->bitmapId.asString().c_str());
return _builtinTiles[num].img;
}
if (member->_type != kCastBitmap) {
warning("BUILDBOT: DirectorEngine::getTile(%d) VWTL refers to incorrect cast %s type %s", num,
tile->bitmapId.asString().c_str(), castTypeToString(member->_type).c_str());
return _builtinTiles[num].img;
}
return ((BitmapCastMember *)member)->_img;
}
const Common::Rect &DirectorEngine::getTileRect(int num) {
TilePatternEntry *tile = &getCurrentMovie()->getCast()->_tiles[num];
if (tile->bitmapId.isNull())
return _builtinTiles[num].rect;
return tile->rect;
}
void DirectorEngine::loadDefaultPalettes() {
_loadedPalettes[kClutSystemMac] = PaletteV4(kClutSystemMac, macPalette, 256);
_loadedPalettes[kClutRainbow] = PaletteV4(kClutRainbow, rainbowPalette, 256);

View File

@ -212,6 +212,8 @@ MacShape *Sprite::getShape() {
shape->backColor = _backColor;
shape->lineSize = _thickness & 0x3;
shape->pattern = getPattern();
shape->tile = nullptr;
shape->tileRect = nullptr;
if (g_director->getVersion() >= 300 && shape->spriteType == kCastMemberSprite) {
if (!_cast) {
@ -439,10 +441,10 @@ void Sprite::setCast(CastMemberID memberID) {
* 1. The cast member's type
* 2. The sprite's type
* If the two types do not align, the sprite should not render.
*
*
* Before D4, you needed to manually set a sprite's type along
* with its castNum.
*
*
* Starting in D4, setting a sprite's castNum also set its type
* to an appropriate default.
*/

View File

@ -101,9 +101,10 @@ void Window::testFontScaling() {
x = 10;
for (int i = 0; i < kNumBuiltinTiles; i++) {
surface.blitFrom(g_director->_builtinTiles[i]->getSurface(), Common::Point(x, 250));
Image::ImageDecoder *tile = g_director->getTile(i);
surface.blitFrom(tile->getSurface(), Common::Point(x, 250));
x += g_director->_builtinTiles[i]->getSurface()->w + 10;
x += tile->getSurface()->w + 10;
}
g_system->copyRectToScreen(surface.getPixels(), surface.pitch, 0, 0, w, h); // testing fonts

View File

@ -382,6 +382,8 @@ struct CastMemberID {
return member != c.member || castLib != c.castLib;
}
bool isNull() { return member == 0 && castLib == 0; }
Common::String asString() const;
};