[Scummvm-git-logs] scummvm master -> c5b8d31f16e9c39072e5d5702a535aa0e1a6df1c
sev-
noreply at scummvm.org
Tue Jun 14 23:01:21 UTC 2022
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b7735a6326 DIRECTOR: Encapsulated tile access and implement override by VWTL
c5b8d31f16 DIRECTOR: Implement tile pattern drawing. Not yet referenced.
Commit: b7735a632643459dc5f84d29f37a9ded7aad95ea
https://github.com/scummvm/scummvm/commit/b7735a632643459dc5f84d29f37a9ded7aad95ea
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-06-15T01:01:05+02:00
Commit Message:
DIRECTOR: Encapsulated tile access and implement override by VWTL
Changed paths:
engines/director/cast.cpp
engines/director/cast.h
engines/director/director.h
engines/director/graphics.cpp
engines/director/sprite.cpp
engines/director/tests.cpp
engines/director/types.h
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 2edfa977f70..9ee9e06191a 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -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);
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 71d7d3fd005..16b476cc1e8 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -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
diff --git a/engines/director/director.h b/engines/director/director.h
index e9d93db2dc7..125d018e328 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -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;
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 7dcc07b0608..b84d5171262 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -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);
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 36241f934cb..b3281250997 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -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.
*/
diff --git a/engines/director/tests.cpp b/engines/director/tests.cpp
index be5e5d9840e..f5d83286fdd 100644
--- a/engines/director/tests.cpp
+++ b/engines/director/tests.cpp
@@ -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
diff --git a/engines/director/types.h b/engines/director/types.h
index 33c9d27cbf8..e346ac19a85 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -382,6 +382,8 @@ struct CastMemberID {
return member != c.member || castLib != c.castLib;
}
+ bool isNull() { return member == 0 && castLib == 0; }
+
Common::String asString() const;
};
Commit: c5b8d31f16e9c39072e5d5702a535aa0e1a6df1c
https://github.com/scummvm/scummvm/commit/c5b8d31f16e9c39072e5d5702a535aa0e1a6df1c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-06-15T01:01:05+02:00
Commit Message:
DIRECTOR: Implement tile pattern drawing. Not yet referenced.
Changed paths:
engines/director/director.h
engines/director/graphics.cpp
diff --git a/engines/director/director.h b/engines/director/director.h
index 125d018e328..1fea005e835 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -125,7 +125,7 @@ struct MacShape {
uint pattern;
Image::ImageDecoder *tile;
- Common::Rect *tileRect;
+ const Common::Rect *tileRect;
Graphics::MacPlotData *pd;
};
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index b84d5171262..1d19f4d0fd5 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -202,6 +202,13 @@ void inkDrawPixel(int x, int y, int src, void *data) {
dst = (T)p->dst->getBasePtr(x, y);
if (p->ms) {
+ if (p->ms->tile) {
+ int x1 = p->ms->tileRect->left + (p->ms->pd->fillOriginX + x) % p->ms->tileRect->width();
+ int y1 = p->ms->tileRect->top + (p->ms->pd->fillOriginY + y) % p->ms->tileRect->height();
+
+ *dst = p->ms->tile->getSurface()->getPixel(x1, y1);
+ return;
+ }
// Get the pixel that macDrawPixel will give us, but store it to apply the
// ink later
tmpDst = *dst;
More information about the Scummvm-git-logs
mailing list