[Scummvm-git-logs] scummvm master -> 79057b732077377d6f7eb67190d6ab3b4666f58d
elasota
noreply at scummvm.org
Fri Jul 22 21:33:35 UTC 2022
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
67803eeae3 MTROPOLIS: Fix incorrect single-note volume scale, fix uninit fields
bb609b7048 MTROPOLIS: Convert Miniscript factories to static interfaces to quiet global dtor warnings
79057b7320 MTROPOLIS: Uninit fields cleanup
Commit: 67803eeae3e01d3a35636485704e75f290ec2537
https://github.com/scummvm/scummvm/commit/67803eeae3e01d3a35636485704e75f290ec2537
Author: elasota (ejlasota at gmail.com)
Date: 2022-07-22T17:31:05-04:00
Commit Message:
MTROPOLIS: Fix incorrect single-note volume scale, fix uninit fields
Changed paths:
engines/mtropolis/plugin/standard.cpp
engines/mtropolis/plugin/standard.h
diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index a82cc5f4bf3..31518078438 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -301,7 +301,7 @@ void MidiFilePlayerImpl::onTimer() {
}
MidiNotePlayerImpl::MidiNotePlayerImpl(const Common::SharedPtr<MidiCombinerSource> &outputDriver, uint32 timerRate)
- : _timerRate(timerRate), _durationRemaining(0), _outputDriver(outputDriver), _channel(0), _note(0), _program(0), _initialized(false) {
+ : _timerRate(timerRate), _durationRemaining(0), _outputDriver(outputDriver), _channel(0), _note(0), _program(0), _initialized(false), _volume(100) {
}
MidiNotePlayerImpl::~MidiNotePlayerImpl() {
@@ -332,7 +332,13 @@ void MidiNotePlayerImpl::play(uint8 volume, uint8 channel, uint8 program, uint8
_note = note;
_volume = volume;
- const uint16 hpVolume = volume * 0x3fff / 100;
+ // GM volume scale to linear is x^4 so we need the 4th root of the volume, and need to rescale it from 0-100 to 0-0x3f80
+ // = 0x3f80 / sqrt(sqrt(100))
+ const double volumeMultiplier = 5140.5985643697174420974013458299;
+
+ if (volume > 100)
+ volume = 100;
+ uint16 hpVolume = static_cast<uint16>(floor(sqrt(sqrt(volume)) * volumeMultiplier));
_outputDriver->send(MidiDriver_BASE::MIDI_COMMAND_PROGRAM_CHANGE | _channel, program, 0);
_outputDriver->send(MidiDriver_BASE::MIDI_COMMAND_CONTROL_CHANGE | _channel, MidiDriver_BASE::MIDI_CONTROLLER_EXPRESSION, 127);
@@ -1555,7 +1561,7 @@ void MultiMidiPlayer::send(uint32 b) {
_driver->send(b);
}
-CursorModifier::CursorModifier() {
+CursorModifier::CursorModifier() : _applyWhen(Event::create()), _removeWhen(Event::create()), _cursorID(0) {
}
bool CursorModifier::respondsToEvent(const Event &evt) const {
@@ -1590,6 +1596,10 @@ const char *CursorModifier::getDefaultName() const {
return "Cursor Modifier";
}
+STransCtModifier::STransCtModifier() : _enableWhen(Event::create()), _disableWhen(Event::create()),
+ _transitionType(0), _transitionDirection(0), _steps(0), _duration(0), _fullScreen(false) {
+}
+
bool STransCtModifier::load(const PlugInModifierLoaderContext &context, const Data::Standard::STransCtModifier &data) {
if (data.enableWhen.type != Data::PlugInTypeTaggedValue::kEvent ||
data.disableWhen.type != Data::PlugInTypeTaggedValue::kEvent ||
@@ -1712,7 +1722,7 @@ MiniscriptInstructionOutcome STransCtModifier::scriptSetSteps(MiniscriptThread *
return kMiniscriptInstructionOutcomeContinue;
}
-MediaCueMessengerModifier::MediaCueMessengerModifier() : _isActive(false) {
+MediaCueMessengerModifier::MediaCueMessengerModifier() : _isActive(false), _cueSourceType(kCueSourceInteger) {
_mediaCue.sourceModifier = this;
}
@@ -2253,8 +2263,10 @@ bool ObjectReferenceVariableModifier::SaveLoad::loadInternal(Common::ReadStream
return true;
}
-MidiModifier::MidiModifier() : _plugIn(nullptr), _filePlayer(nullptr), _notePlayer(nullptr), _mutedTracks(0),
- _singleNoteChannel(0), _singleNoteNote(0), _runtime(nullptr), _volume(100) {
+
+MidiModifier::MidiModifier() : _executeWhen(Event::create()), _terminateWhen(Event::create()),
+ _mode(kModeFile), _volume(100), _mutedTracks(0), _singleNoteChannel(0), _singleNoteNote(0),
+ _plugIn(nullptr), _filePlayer(nullptr), _notePlayer(nullptr), _runtime(nullptr) {
}
MidiModifier::~MidiModifier() {
@@ -2405,7 +2417,7 @@ MiniscriptInstructionOutcome MidiModifier::writeRefAttributeIndexed(MiniscriptTh
}
result.pod.objectRef = this;
- result.pod.ptrOrOffset = asInteger - 1;
+ result.pod.ptrOrOffset = static_cast<uintptr>(asInteger) - 1;
result.pod.ifc = DynamicValueWriteInterfaceGlue<MuteTrackProxyInterface>::getInstance();
return kMiniscriptInstructionOutcomeContinue;
@@ -2786,7 +2798,7 @@ void ListVariableModifier::debugInspect(IDebugInspectionReport *report) const {
}
#endif
-ListVariableModifier::ListVariableModifier(const ListVariableModifier &other) {
+ListVariableModifier::ListVariableModifier(const ListVariableModifier &other) : _preferredContentType(DynamicValueTypes::kNull) {
if (other._list)
_list = other._list->clone();
}
diff --git a/engines/mtropolis/plugin/standard.h b/engines/mtropolis/plugin/standard.h
index c5481eaae3e..9fd9407cb19 100644
--- a/engines/mtropolis/plugin/standard.h
+++ b/engines/mtropolis/plugin/standard.h
@@ -71,6 +71,8 @@ class STransCtModifier : public Modifier {
public:
static const int32 kMaxDuration = 600000;
+ STransCtModifier();
+
bool load(const PlugInModifierLoaderContext &context, const Data::Standard::STransCtModifier &data);
bool respondsToEvent(const Event &evt) const override;
Commit: bb609b7048abc655af1e95041fd0fc0dc19503ed
https://github.com/scummvm/scummvm/commit/bb609b7048abc655af1e95041fd0fc0dc19503ed
Author: elasota (ejlasota at gmail.com)
Date: 2022-07-22T17:32:16-04:00
Commit Message:
MTROPOLIS: Convert Miniscript factories to static interfaces to quiet global dtor warnings
Changed paths:
engines/mtropolis/miniscript.cpp
engines/mtropolis/miniscript.h
diff --git a/engines/mtropolis/miniscript.cpp b/engines/mtropolis/miniscript.cpp
index 492d5cbd5d0..482bddada5a 100644
--- a/engines/mtropolis/miniscript.cpp
+++ b/engines/mtropolis/miniscript.cpp
@@ -241,25 +241,25 @@ bool MiniscriptInstructionLoader<MiniscriptInstructions::PushString>::loadInstru
return true;
}
-struct IMiniscriptInstructionFactory : public IInterfaceBase {
- virtual bool create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) const = 0;
- virtual void getSizeAndAlignment(size_t &outSize, size_t &outAlignment) const = 0;
+struct SIMiniscriptInstructionFactory {
+ bool (*create)(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr);
+ void (*getSizeAndAlignment)(size_t &outSize, size_t &outAlignment);
};
template<class T>
-class MiniscriptInstructionFactory : public IMiniscriptInstructionFactory {
+class MiniscriptInstructionFactory {
public:
- bool create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) const override;
- void getSizeAndAlignment(size_t &outSize, size_t &outAlignment) const override;
+ static bool create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr);
+ static void getSizeAndAlignment(size_t &outSize, size_t &outAlignment);
- static IMiniscriptInstructionFactory *getInstance();
+ static SIMiniscriptInstructionFactory *getInstance();
private:
- static MiniscriptInstructionFactory<T> _instance;
+ static SIMiniscriptInstructionFactory _instance;
};
template<class T>
-bool MiniscriptInstructionFactory<T>::create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) const {
+bool MiniscriptInstructionFactory<T>::create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) {
if (!MiniscriptInstructionLoader<T>::loadInstruction(dest, instrFlags, instrDataReader))
return false;
@@ -268,18 +268,21 @@ bool MiniscriptInstructionFactory<T>::create(void *dest, uint32 instrFlags, Data
}
template<class T>
-void MiniscriptInstructionFactory<T>::getSizeAndAlignment(size_t &outSize, size_t &outAlignment) const {
+void MiniscriptInstructionFactory<T>::getSizeAndAlignment(size_t &outSize, size_t &outAlignment) {
outSize = sizeof(T);
outAlignment = alignof(T);
}
template<class T>
-inline IMiniscriptInstructionFactory *MiniscriptInstructionFactory<T>::getInstance() {
+inline SIMiniscriptInstructionFactory *MiniscriptInstructionFactory<T>::getInstance() {
return &_instance;
}
template<class T>
-MiniscriptInstructionFactory<T> MiniscriptInstructionFactory<T>::_instance;
+SIMiniscriptInstructionFactory MiniscriptInstructionFactory<T>::_instance = {
+ MiniscriptInstructionFactory<T>::create,
+ MiniscriptInstructionFactory<T>::getSizeAndAlignment
+};
bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::SharedPtr<MiniscriptProgram> &outProgram, Common::SharedPtr<MiniscriptReferences> &outReferences) {
Common::Array<MiniscriptReferences::LocalRef> localRefs;
@@ -312,7 +315,7 @@ bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::Sha
uint16 opcode;
uint16 flags;
size_t pdPosition;
- IMiniscriptInstructionFactory *instrFactory;
+ SIMiniscriptInstructionFactory *instrFactory;
Common::Array<uint8> contents;
};
@@ -344,7 +347,7 @@ bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::Sha
for (size_t i = 0; i < program.numOfInstructions; i++) {
InstructionData &rawInstruction = rawInstructions[i];
- IMiniscriptInstructionFactory *factory = resolveOpcode(rawInstruction.opcode);
+ SIMiniscriptInstructionFactory *factory = resolveOpcode(rawInstruction.opcode);
rawInstruction.instrFactory = factory;
if (!factory)
@@ -401,7 +404,7 @@ bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::Sha
return true;
}
-IMiniscriptInstructionFactory *MiniscriptParser::resolveOpcode(uint16 opcode) {
+SIMiniscriptInstructionFactory *MiniscriptParser::resolveOpcode(uint16 opcode) {
switch (opcode) {
case 0x834:
return MiniscriptInstructionFactory<MiniscriptInstructions::Set>::getInstance();
diff --git a/engines/mtropolis/miniscript.h b/engines/mtropolis/miniscript.h
index 92898f67853..8e05bf1749c 100644
--- a/engines/mtropolis/miniscript.h
+++ b/engines/mtropolis/miniscript.h
@@ -29,7 +29,7 @@ namespace MTropolis {
class MiniscriptThread;
struct MiniscriptStackValue;
-struct IMiniscriptInstructionFactory;
+struct SIMiniscriptInstructionFactory;
bool miniscriptEvaluateTruth(const DynamicValue &value);
@@ -83,7 +83,7 @@ class MiniscriptParser {
public:
static bool parse(const Data::MiniscriptProgram &programData, Common::SharedPtr<MiniscriptProgram> &outProgram, Common::SharedPtr<MiniscriptReferences> &outReferences);
- static IMiniscriptInstructionFactory *resolveOpcode(uint16 opcode);
+ static SIMiniscriptInstructionFactory *resolveOpcode(uint16 opcode);
};
namespace MiniscriptInstructions {
Commit: 79057b732077377d6f7eb67190d6ab3b4666f58d
https://github.com/scummvm/scummvm/commit/79057b732077377d6f7eb67190d6ab3b4666f58d
Author: elasota (ejlasota at gmail.com)
Date: 2022-07-22T17:32:58-04:00
Commit Message:
MTROPOLIS: Uninit fields cleanup
Changed paths:
engines/mtropolis/assets.cpp
engines/mtropolis/assets.h
engines/mtropolis/data.cpp
engines/mtropolis/data.h
engines/mtropolis/element_factory.cpp
engines/mtropolis/element_factory.h
engines/mtropolis/plugin/obsidian.cpp
engines/mtropolis/plugin/obsidian.h
engines/mtropolis/plugin/standard_data.cpp
engines/mtropolis/plugin/standard_data.h
engines/mtropolis/render.cpp
engines/mtropolis/render.h
engines/mtropolis/runtime.cpp
engines/mtropolis/runtime.h
diff --git a/engines/mtropolis/assets.cpp b/engines/mtropolis/assets.cpp
index 102f1553f2f..38f10a3b5dd 100644
--- a/engines/mtropolis/assets.cpp
+++ b/engines/mtropolis/assets.cpp
@@ -116,6 +116,30 @@ size_t CachedAudio::getNumSamples(const AudioMetadata &metadata) const {
}
}
+MToonMetadata::FrameDef::FrameDef() : dataOffset(0), compressedSize(0), decompressedSize(0), decompressedBytesPerRow(0), isKeyFrame(false) {
+}
+
+bool MToonMetadata::FrameDef::load(AssetLoaderContext &context, const Data::MToonAsset::FrameDef &data) {
+ compressedSize = data.compressedSize;
+ dataOffset = data.dataOffset;
+ decompressedBytesPerRow = data.decompressedBytesPerRow;
+ decompressedSize = data.decompressedSize;
+ isKeyFrame = (data.keyframeFlag != 0);
+ if (!data.rect1.toScummVMRect(rect))
+ return false;
+
+ return true;
+}
+
+MToonMetadata::FrameRangeDef::FrameRangeDef() : startFrame(0), endFrame(0) {
+}
+
+MToonMetadata::MToonMetadata() : imageFormat(kImageFormatWindows), bitsPerPixel(0), codecID(0), encodingFlags(0) {
+}
+
+CachedMToon::RleFrame::RleFrame() : version(0), width(0), height(0), isKeyframe(0) {
+}
+
CachedMToon::CachedMToon() : _isRLETemporalCompressed(false) {
}
@@ -334,7 +358,7 @@ void CachedMToon::loadRLEFrames(const Common::Array<uint8> &data) {
// so we need to ignore it and derive size from the frameDef instead.
uint32 numDWords = (frameDef.compressedSize - 20) / 2;
rleFrame.data16.resize(numDWords);
- memcpy(&rleFrame.data16[0], &data[baseOffset + 20], numDWords * 2);
+ memcpy(&rleFrame.data16[0], &data[baseOffset + 20], static_cast<size_t>(numDWords) * 2u);
uint16 *i16 = &rleFrame.data16[0];
if (_metadata->imageFormat == MToonMetadata::kImageFormatWindows) {
@@ -630,6 +654,12 @@ const Common::SharedPtr<MToonMetadata>& CachedMToon::getMetadata() const {
return _metadata;
}
+
+
+AudioMetadata::AudioMetadata() : encoding(kEncodingUncompressed), durationMSec(0),
+ sampleRate(0), channels(0), bitsPerSample(0), isBigEndian(false) {
+}
+
bool AudioAsset::load(AssetLoaderContext &context, const Data::AudioAsset &data) {
_assetID = data.assetID;
@@ -799,7 +829,7 @@ const Common::SharedPtr<Graphics::Surface> &CachedImage::optimize(Runtime *runti
return _optimizedSurface;
}
-ImageAsset::ImageAsset() {
+ImageAsset::ImageAsset() : _colorDepth(kColorDepthMode8Bit), _filePosition(0), _size(0), _streamIndex(0), _imageFormat(kImageFormatWindows) {
}
ImageAsset::~ImageAsset() {
@@ -1096,18 +1126,6 @@ const Common::SharedPtr<CachedMToon> &MToonAsset::loadAndCacheMToon(Runtime *run
return _cachedMToon;
}
-bool MToonMetadata::FrameDef::load(AssetLoaderContext &context, const Data::MToonAsset::FrameDef &data) {
- compressedSize = data.compressedSize;
- dataOffset = data.dataOffset;
- decompressedBytesPerRow = data.decompressedBytesPerRow;
- decompressedSize = data.decompressedSize;
- isKeyFrame = (data.keyframeFlag != 0);
- if (!data.rect1.toScummVMRect(rect))
- return false;
-
- return true;
-}
-
bool MToonMetadata::FrameRangeDef::load(AssetLoaderContext &context, const Data::MToonAsset::FrameRangeDef &data) {
name = data.name;
startFrame = data.startFrame;
diff --git a/engines/mtropolis/assets.h b/engines/mtropolis/assets.h
index c1824a19243..cf1836c3bae 100644
--- a/engines/mtropolis/assets.h
+++ b/engines/mtropolis/assets.h
@@ -71,6 +71,7 @@ struct MToonMetadata {
uint16 decompressedBytesPerRow;
bool isKeyFrame;
+ FrameDef();
bool load(AssetLoaderContext &context, const Data::MToonAsset::FrameDef &data);
};
@@ -80,9 +81,12 @@ struct MToonMetadata {
Common::String name;
+ FrameRangeDef();
bool load(AssetLoaderContext &context, const Data::MToonAsset::FrameRangeDef &data);
};
+ MToonMetadata();
+
ImageFormat imageFormat;
Common::Rect rect;
@@ -111,6 +115,8 @@ private:
void optimizeRLE(const Graphics::PixelFormat &targetFormat);
struct RleFrame {
+ RleFrame();
+
uint32 version;
uint32 width;
uint32 height;
@@ -161,6 +167,8 @@ struct AudioMetadata {
kEncodingMace6,
};
+ AudioMetadata();
+
Encoding encoding;
uint32 durationMSec;
uint16 sampleRate;
diff --git a/engines/mtropolis/data.cpp b/engines/mtropolis/data.cpp
index f648c0c5f3f..c043b19a750 100644
--- a/engines/mtropolis/data.cpp
+++ b/engines/mtropolis/data.cpp
@@ -452,6 +452,12 @@ bool InternalTypeTaggedValue::load(DataReader &reader) {
return true;
}
+
+
+PlugInTypeTaggedValue::PlugInTypeTaggedValue() : type(kNull) {
+ memset(&this->value, 0, sizeof(this->value));
+}
+
bool PlugInTypeTaggedValue::load(DataReader &reader) {
if (!reader.readU16(type))
return false;
@@ -566,7 +572,7 @@ DataReadErrorCode ProjectLabelMap::load(DataReader &reader) {
return kDataReadErrorNone;
}
-ProjectLabelMap::LabelTree::LabelTree() : children(nullptr) {
+ProjectLabelMap::LabelTree::LabelTree() : nameLength(0), isGroup(0), id(0), unknown1(0), flags(0), numChildren(0), children(nullptr) {
}
ProjectLabelMap::LabelTree::~LabelTree() {
@@ -623,6 +629,9 @@ DataReadErrorCode ProjectLabelMap::loadLabelTree(LabelTree <, DataReader &read
return kDataReadErrorNone;
}
+ProjectHeader::ProjectHeader() : persistFlags(0), sizeIncludingTag(0), unknown1(0), catalogFilePosition(0) {
+}
+
DataReadErrorCode ProjectHeader::load(DataReader &reader) {
if (_revision != 0) {
return kDataReadErrorUnsupportedRevision;
@@ -847,6 +856,11 @@ DataReadErrorCode GlobalObjectInfo::load(DataReader &reader) {
return kDataReadErrorNone;
}
+
+
+ProjectCatalog::ProjectCatalog() : persistFlags(0), sizeOfStreamAndSegmentDescs(0), unknown1(0), unknown2(0), unknown3(0) {
+}
+
DataReadErrorCode ProjectCatalog::load(DataReader &reader) {
if (_revision != 2 && _revision != 3) {
return kDataReadErrorUnsupportedRevision;
@@ -905,6 +919,15 @@ DataReadErrorCode ProjectCatalog::load(DataReader &reader) {
return kDataReadErrorNone;
}
+StreamHeader::StreamHeader() : marker(0), sizeIncludingTag(0), unknown2(0) {
+ for (char &v : this->name)
+ v = 0;
+ for (uint8 &v : this->projectID)
+ v = 0;
+ for (uint8 &v : this->unknown1)
+ v = 0;
+}
+
DataReadErrorCode StreamHeader::load(DataReader& reader) {
if (_revision != 0)
return kDataReadErrorUnsupportedRevision;
diff --git a/engines/mtropolis/data.h b/engines/mtropolis/data.h
index cee24b6e5b8..cf0f9a6760d 100644
--- a/engines/mtropolis/data.h
+++ b/engines/mtropolis/data.h
@@ -347,6 +347,8 @@ struct PlugInTypeTaggedValue : public Common::NonCopyable {
uint32 asVarRefGUID;
};
+ PlugInTypeTaggedValue();
+
uint16 type;
ValueUnion value;
@@ -374,6 +376,8 @@ protected:
};
struct ProjectHeader : public DataObject {
+ ProjectHeader();
+
uint32 persistFlags;
uint32 sizeIncludingTag;
uint16 unknown1;
@@ -753,6 +757,8 @@ public:
Common::String exportedPath;
};
+ ProjectCatalog();
+
uint32 persistFlags;
uint32 sizeOfStreamAndSegmentDescs;
uint16 unknown1;
@@ -767,6 +773,7 @@ protected:
};
struct StreamHeader : public DataObject {
+ StreamHeader();
uint32 marker;
uint32 sizeIncludingTag;
diff --git a/engines/mtropolis/element_factory.cpp b/engines/mtropolis/element_factory.cpp
index e9ba3334f9f..5692ca60f0e 100644
--- a/engines/mtropolis/element_factory.cpp
+++ b/engines/mtropolis/element_factory.cpp
@@ -29,17 +29,17 @@ ElementLoaderContext::ElementLoaderContext(Runtime *elc_runtime, size_t elc_stre
}
template<typename TElement, typename TElementData>
-class ElementFactory : public IElementFactory {
+class ElementFactory {
public:
- Common::SharedPtr<Element> createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) const override;
- static IElementFactory *getInstance();
+ static Common::SharedPtr<Element> createElement(ElementLoaderContext &context, const Data::DataObject &dataObject);
+ static SIElementFactory *getInstance();
private:
- static ElementFactory<TElement, TElementData> _instance;
+ static SIElementFactory _instance;
};
template<typename TElement, typename TElementData>
-Common::SharedPtr<Element> ElementFactory<TElement, TElementData>::createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) const {
+Common::SharedPtr<Element> ElementFactory<TElement, TElementData>::createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) {
Common::SharedPtr<TElement> element(new TElement());
if (!element->load(context, static_cast<const TElementData &>(dataObject)))
@@ -51,14 +51,16 @@ Common::SharedPtr<Element> ElementFactory<TElement, TElementData>::createElement
}
template<typename TElement, typename TElementData>
-IElementFactory *ElementFactory<TElement, TElementData>::getInstance() {
+SIElementFactory *ElementFactory<TElement, TElementData>::getInstance() {
return &_instance;
}
template<typename TElement, typename TElementData>
-ElementFactory<TElement, TElementData> ElementFactory<TElement, TElementData>::_instance;
+SIElementFactory ElementFactory<TElement, TElementData>::_instance = {
+ ElementFactory<TElement, TElementData>::createElement
+};
-IElementFactory *getElementFactoryForDataObjectType(const Data::DataObjectTypes::DataObjectType dataObjectType) {
+SIElementFactory *getElementFactoryForDataObjectType(const Data::DataObjectTypes::DataObjectType dataObjectType) {
switch (dataObjectType) {
case Data::DataObjectTypes::kGraphicElement:
return ElementFactory<GraphicElement, Data::GraphicElement>::getInstance();
diff --git a/engines/mtropolis/element_factory.h b/engines/mtropolis/element_factory.h
index a98349429ac..20be6800aab 100644
--- a/engines/mtropolis/element_factory.h
+++ b/engines/mtropolis/element_factory.h
@@ -34,11 +34,11 @@ struct ElementLoaderContext {
size_t streamIndex;
};
-struct IElementFactory : public IInterfaceBase {
- virtual Common::SharedPtr<Element> createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) const = 0;
+struct SIElementFactory {
+ Common::SharedPtr<Element> (*createElement)(ElementLoaderContext &context, const Data::DataObject &dataObject);
};
-IElementFactory *getElementFactoryForDataObjectType(Data::DataObjectTypes::DataObjectType dataObjectType);
+SIElementFactory *getElementFactoryForDataObjectType(Data::DataObjectTypes::DataObjectType dataObjectType);
} // End of namespace MTropolis
diff --git a/engines/mtropolis/plugin/obsidian.cpp b/engines/mtropolis/plugin/obsidian.cpp
index a5b4b76f330..31e644cd7e4 100644
--- a/engines/mtropolis/plugin/obsidian.cpp
+++ b/engines/mtropolis/plugin/obsidian.cpp
@@ -30,7 +30,8 @@ namespace MTropolis {
namespace Obsidian {
-MovementModifier::MovementModifier() : _runtime(nullptr) {
+MovementModifier::MovementModifier() : _enableWhen(Event::create()), _disableWhen(Event::create()), _triggerEvent(Event::create()),
+ _moveStartTime(0), _runtime(nullptr) {
}
MovementModifier::~MovementModifier() {
@@ -472,7 +473,7 @@ MiniscriptInstructionOutcome TextWorkModifier::scriptSetLastWord(MiniscriptThrea
return kMiniscriptInstructionOutcomeFailed;
}
-DictionaryModifier::DictionaryModifier() : _plugIn(nullptr) {
+DictionaryModifier::DictionaryModifier() : _plugIn(nullptr), _isIndexResolved(false), _index(0) {
}
bool DictionaryModifier::load(const PlugInModifierLoaderContext &context, const Data::Obsidian::DictionaryModifier &data) {
@@ -534,14 +535,14 @@ void DictionaryModifier::resolveStringIndex() {
const WordGameData::WordBucket &bucket = wordBuckets[strLength];
size_t lowOffsetInclusive = 0;
- size_t highOffsetExclusive = bucket.wordIndexes.size();
+ size_t highOffsetExclusive = bucket._wordIndexes.size();
const char *strChars = _str.c_str();
// Binary search
while (lowOffsetInclusive != highOffsetExclusive) {
const size_t midOffset = (lowOffsetInclusive + highOffsetExclusive) / 2;
- const char *chars = &bucket.chars[bucket.spacing * midOffset];
+ const char *chars = &bucket._chars[bucket._spacing * midOffset];
bool isMidGreater = false;
bool isMidLess = false;
@@ -560,7 +561,7 @@ void DictionaryModifier::resolveStringIndex() {
else if (isMidGreater)
highOffsetExclusive = midOffset;
else {
- _index = bucket.wordIndexes[midOffset] + 1;
+ _index = bucket._wordIndexes[midOffset] + 1;
break;
}
}
@@ -591,12 +592,12 @@ MiniscriptInstructionOutcome DictionaryModifier::scriptSetIndex(MiniscriptThread
if (_index < 1)
_str.clear();
else {
- const size_t indexAdjusted = _index - 1;
+ const size_t indexAdjusted = static_cast<size_t>(_index) - 1;
const Common::Array<WordGameData::SortedWord> &sortedWords = _plugIn->getWordGameData()->getSortedWords();
if (indexAdjusted >= sortedWords.size())
_str.clear();
else
- _str = Common::String(sortedWords[indexAdjusted].chars, sortedWords[indexAdjusted].length);
+ _str = Common::String(sortedWords[indexAdjusted]._chars, sortedWords[indexAdjusted]._length);
}
_isIndexResolved = true;
@@ -612,7 +613,7 @@ const char *DictionaryModifier::getDefaultName() const {
return "Dictionary";
}
-WordMixerModifier::WordMixerModifier() : _matches(0), _result(0) {
+WordMixerModifier::WordMixerModifier() : _matches(0), _result(0), _plugIn(nullptr) {
}
bool WordMixerModifier::load(const PlugInModifierLoaderContext &context, const Data::Obsidian::WordMixerModifier &data) {
@@ -679,10 +680,10 @@ MiniscriptInstructionOutcome WordMixerModifier::scriptSetInput(MiniscriptThread
const WordGameData::WordBucket &bucket = wordBuckets[wordLength];
- size_t numWords = bucket.wordIndexes.size();
+ size_t numWords = bucket._wordIndexes.size();
for (size_t wi = 0; wi < numWords; wi++) {
- const char *wordChars = &bucket.chars[bucket.spacing * wi];
+ const char *wordChars = &bucket._chars[bucket._spacing * wi];
for (bool &b : charIsUsed)
b = false;
@@ -739,8 +740,8 @@ MiniscriptInstructionOutcome WordMixerModifier::scriptSetSearch(MiniscriptThread
if (searchLength < buckets.size()) {
const WordGameData::WordBucket &bucket = buckets[searchLength];
- for (size_t wi = 0; wi < bucket.wordIndexes.size(); wi++) {
- const char *wordChars = &bucket.chars[wi * bucket.spacing];
+ for (size_t wi = 0; wi < bucket._wordIndexes.size(); wi++) {
+ const char *wordChars = &bucket._chars[wi * bucket._spacing];
bool isMatch = true;
for (size_t ci = 0; ci < searchLength; ci++) {
@@ -768,7 +769,7 @@ const char *WordMixerModifier::getDefaultName() const {
return "WordMixer";
}
-XorModModifier::XorModModifier() {
+XorModModifier::XorModModifier() : _enableWhen(Event::create()), _disableWhen(Event::create()), _shapeID(0) {
}
bool XorModModifier::load(const PlugInModifierLoaderContext &context, const Data::Obsidian::XorModModifier &data) {
@@ -1030,6 +1031,13 @@ const Common::SharedPtr<WordGameData>& ObsidianPlugIn::getWordGameData() const {
return _wgData;
}
+
+WordGameData::WordBucket::WordBucket() : _spacing(0) {
+}
+
+WordGameData::SortedWord::SortedWord() : _chars(nullptr), _length(0) {
+}
+
bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBucket *buckets, uint numBuckets, uint alignment, bool backwards) {
_buckets.resize(numBuckets);
@@ -1042,24 +1050,24 @@ bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBu
uint wordLength = i;
uint spacing = (wordLength + alignment) - (wordLength % alignment);
- outBucket.spacing = spacing;
- outBucket.chars.resize(sizeBytes);
+ outBucket._spacing = spacing;
+ outBucket._chars.resize(sizeBytes);
assert(sizeBytes % alignment == 0);
if (sizeBytes > 0) {
if (!stream->seek(inBucket.startAddress, SEEK_SET))
return false;
- stream->read(&outBucket.chars[0], sizeBytes);
+ stream->read(&outBucket._chars[0], sizeBytes);
}
uint numWords = sizeBytes / spacing;
- outBucket.wordIndexes.resize(numWords);
+ outBucket._wordIndexes.resize(numWords);
if (backwards) {
for (size_t wordIndex = 0; wordIndex < numWords / 2; wordIndex++) {
- char *swapA = &outBucket.chars[wordIndex * spacing];
- char *swapB = &outBucket.chars[(numWords - 1 - wordIndex) * spacing];
+ char *swapA = &outBucket._chars[wordIndex * spacing];
+ char *swapB = &outBucket._chars[(numWords - 1 - wordIndex) * spacing];
for (size_t chIndex = 0; chIndex < wordLength; chIndex++) {
char temp = swapA[chIndex];
@@ -1084,9 +1092,9 @@ bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBu
size_t bestBucket = numBuckets;
const char *bestChars = nullptr;
for (size_t bucketIndex = 0; bucketIndex < numBuckets; bucketIndex++) {
- size_t wordOffset = currentWordIndexes[bucketIndex] * _buckets[bucketIndex].spacing;
- if (wordOffset < _buckets[bucketIndex].chars.size()) {
- const char *candidate = &_buckets[bucketIndex].chars[wordOffset];
+ size_t wordOffset = currentWordIndexes[bucketIndex] * _buckets[bucketIndex]._spacing;
+ if (wordOffset < _buckets[bucketIndex]._chars.size()) {
+ const char *candidate = &_buckets[bucketIndex]._chars[wordOffset];
bool isWorse = true;
if (bestChars == nullptr)
isWorse = false;
@@ -1112,11 +1120,11 @@ bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBu
assert(bestChars != nullptr);
const size_t bucketWordIndex = currentWordIndexes[bestBucket];
- _buckets[bestBucket].wordIndexes[bucketWordIndex] = wordIndex;
+ _buckets[bestBucket]._wordIndexes[bucketWordIndex] = wordIndex;
currentWordIndexes[bestBucket]++;
- _sortedWords[wordIndex].chars = bestChars;
- _sortedWords[wordIndex].length = bestBucket;
+ _sortedWords[wordIndex]._chars = bestChars;
+ _sortedWords[wordIndex]._length = bestBucket;
}
return !stream->err();
diff --git a/engines/mtropolis/plugin/obsidian.h b/engines/mtropolis/plugin/obsidian.h
index e966fbc9615..6e261cf0eb1 100644
--- a/engines/mtropolis/plugin/obsidian.h
+++ b/engines/mtropolis/plugin/obsidian.h
@@ -272,14 +272,18 @@ struct WordGameLoadBucket {
class WordGameData {
public:
struct WordBucket {
- Common::Array<char> chars;
- Common::Array<uint16> wordIndexes;
- uint32 spacing;
+ WordBucket();
+
+ Common::Array<char> _chars;
+ Common::Array<uint16> _wordIndexes;
+ uint32 _spacing;
};
struct SortedWord {
- const char *chars;
- uint length;
+ SortedWord();
+
+ const char *_chars;
+ uint _length;
};
bool load(Common::SeekableReadStream *stream, const WordGameLoadBucket *buckets, uint numBuckets, uint alignment, bool backwards);
diff --git a/engines/mtropolis/plugin/standard_data.cpp b/engines/mtropolis/plugin/standard_data.cpp
index b9c5852f890..5f18d9f2f4d 100644
--- a/engines/mtropolis/plugin/standard_data.cpp
+++ b/engines/mtropolis/plugin/standard_data.cpp
@@ -80,6 +80,9 @@ DataReadErrorCode ObjectReferenceVariableModifier::load(PlugIn &plugIn, const Pl
return kDataReadErrorNone;
}
+MidiModifier::MidiModifier() : embeddedFlag(0) {
+}
+
DataReadErrorCode MidiModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
if (prefix.plugInRevision != 1 && prefix.plugInRevision != 2)
return kDataReadErrorUnsupportedRevision;
@@ -117,7 +120,10 @@ DataReadErrorCode MidiModifier::load(PlugIn &plugIn, const PlugInModifier &prefi
return kDataReadErrorNone;
}
-ListVariableModifier::ListVariableModifier() : values(nullptr) {
+ListVariableModifier::ListVariableModifier() : unknown1(0), contentsType(0),
+ havePersistentData(false), numValues(0), values(nullptr), persistentValuesGarbled(false) {
+ for (uint8 &v : unknown2)
+ v = 0;
}
ListVariableModifier::~ListVariableModifier() {
diff --git a/engines/mtropolis/plugin/standard_data.h b/engines/mtropolis/plugin/standard_data.h
index 259ba5339b6..bf250848f6c 100644
--- a/engines/mtropolis/plugin/standard_data.h
+++ b/engines/mtropolis/plugin/standard_data.h
@@ -118,6 +118,8 @@ struct MidiModifier : public PlugInModifierData {
SingleNotePart singleNote;
};
+ MidiModifier();
+
PlugInTypeTaggedValue executeWhen;
PlugInTypeTaggedValue terminateWhen;
diff --git a/engines/mtropolis/render.cpp b/engines/mtropolis/render.cpp
index c96001aa083..083265167a2 100644
--- a/engines/mtropolis/render.cpp
+++ b/engines/mtropolis/render.cpp
@@ -99,6 +99,9 @@ MacFontFormatting::MacFontFormatting() : fontID(0), fontFlags(0), size(12) {
MacFontFormatting::MacFontFormatting(uint16 mff_fontID, uint8 mff_fontFlags, uint16 mff_size) : fontID(mff_fontID), fontFlags(mff_fontFlags), size(mff_size) {
}
+MacFormattingSpan::MacFormattingSpan() : spanStart(0) {
+}
+
WindowParameters::WindowParameters(Runtime *wp_runtime, int32 wp_x, int32 wp_y, int16 wp_width, int16 wp_height, const Graphics::PixelFormat &wp_format)
: runtime(wp_runtime), x(wp_x), y(wp_y), width(wp_width), height(wp_height), format(wp_format) {
}
diff --git a/engines/mtropolis/render.h b/engines/mtropolis/render.h
index 953ab150562..1d3ba7b7a7d 100644
--- a/engines/mtropolis/render.h
+++ b/engines/mtropolis/render.h
@@ -71,6 +71,8 @@ struct MacFontFormatting {
};
struct MacFormattingSpan {
+ MacFormattingSpan();
+
uint16 spanStart;
MacFontFormatting formatting;
};
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index a9ad04109e5..69d7c796fad 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -3731,6 +3731,19 @@ const Common::KeyState &KeyboardInputEvent::getKeyState() const {
Runtime::SceneStackEntry::SceneStackEntry() {
}
+Runtime::Teardown::Teardown() : onlyRemoveChildren(false) {
+}
+
+
+Runtime::ConsumeMessageTaskData::ConsumeMessageTaskData() : consumer(nullptr) {
+}
+
+Runtime::ConsumeCommandTaskData::ConsumeCommandTaskData() : structural(nullptr) {
+}
+
+Runtime::UpdateMouseStateTaskData::UpdateMouseStateTaskData() : mouseDown(false) {
+}
+
SceneTransitionHooks::~SceneTransitionHooks() {
}
@@ -6108,6 +6121,9 @@ void KeyboardEventSignaller::removeReceiver(IKeyboardEventReceiver *receiver) {
}
}
+MediaCueState::MediaCueState() : minTime(0), maxTime(0), sourceModifier(nullptr), triggerTiming(kTriggerTimingStart) {
+}
+
void MediaCueState::checkTimestampChange(Runtime *runtime, uint32 oldTS, uint32 newTS, bool continuousTimestamps, bool canTriggerDuring) {
bool entersRange = (static_cast<int32>(oldTS) < minTime && static_cast<int32>(newTS) >= minTime);
bool exitsRange = (static_cast<int32>(oldTS) <= maxTime && static_cast<int32>(newTS) > maxTime);
@@ -6133,6 +6149,13 @@ void MediaCueState::checkTimestampChange(Runtime *runtime, uint32 oldTS, uint32
send.sendFromMessenger(runtime, sourceModifier, incomingData, nullptr);
}
+
+Project::LabelSuperGroup::LabelSuperGroup() : firstRootNodeIndex(0), numRootNodes(0), numTotalNodes(0), superGroupID(0) {
+}
+
+Project::LabelTree::LabelTree() : firstChildIndex(0), numChildren(0), id(0) {
+}
+
Project::Segment::Segment() : weakStream(nullptr) {
}
@@ -6876,7 +6899,7 @@ void Project::loadContextualObject(size_t streamIndex, ChildLoaderStack &stack,
if (topContext.containerUnion.filteredElements.filterFunc(dataObjectType)) {
const Data::StructuralDef &structuralDef = static_cast<const Data::StructuralDef &>(dataObject);
- IElementFactory *elementFactory = getElementFactoryForDataObjectType(dataObjectType);
+ SIElementFactory *elementFactory = getElementFactoryForDataObjectType(dataObjectType);
if (!elementFactory) {
error("No element factory defined for structural object");
}
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 0920532a01a..4703efc4735 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -1029,14 +1029,8 @@ struct DynamicValueWriteFuncHelper {
proxy.pod.objectRef = obj;
proxy.pod.ifc = DynamicValueWriteInterfaceGlue<DynamicValueWriteFuncHelper<TClass, TWriteMethod> >::getInstance();
}
-
-private:
- static DynamicValueWriteFuncHelper _instance;
};
-template<class TClass, MiniscriptInstructionOutcome (TClass::*TWriteMethod)(MiniscriptThread *thread, const DynamicValue &dest)>
-DynamicValueWriteFuncHelper<TClass, TWriteMethod> DynamicValueWriteFuncHelper<TClass, TWriteMethod>::_instance;
-
struct DynamicValueWriteObjectHelper {
static MiniscriptInstructionOutcome write(MiniscriptThread *thread, const DynamicValue &value, void *objectRef, uintptr ptrOrOffset);
static MiniscriptInstructionOutcome refAttrib(MiniscriptThread *thread, DynamicValueWriteProxy &proxy, void *objectRef, uintptr ptrOrOffset, const Common::String &attrib);
@@ -1085,13 +1079,6 @@ private:
static bool isElementFilter(Structural *section);
};
-struct Message {
- Message();
-
- Event evt;
- DynamicValue data;
-};
-
enum MessageDestination {
kMessageDestNone = 0,
@@ -1626,6 +1613,8 @@ private:
};
struct Teardown {
+ Teardown();
+
Common::WeakPtr<Structural> structural;
bool onlyRemoveChildren;
};
@@ -1644,20 +1633,29 @@ private:
};
struct ConsumeMessageTaskData {
+ ConsumeMessageTaskData();
+
IMessageConsumer *consumer;
Common::SharedPtr<MessageProperties> message;
};
struct ConsumeCommandTaskData {
+ ConsumeCommandTaskData();
+
Structural *structural;
Common::SharedPtr<MessageProperties> message;
};
struct UpdateMouseStateTaskData {
+ UpdateMouseStateTaskData();
+
bool mouseDown;
};
struct UpdateMousePositionTaskData {
+ UpdateMousePositionTaskData() : x(0), y(0) {
+ }
+
int32 x;
int32 y;
};
@@ -2195,6 +2193,7 @@ struct MediaCueState {
MessengerSendSpec send;
DynamicValue incomingData;
+ MediaCueState();
void checkTimestampChange(Runtime *runtime, uint32 oldTS, uint32 newTS, bool continuousTimestamps, bool canTriggerDuring);
};
@@ -2239,6 +2238,8 @@ public:
private:
struct LabelSuperGroup {
+ LabelSuperGroup();
+
size_t firstRootNodeIndex;
size_t numRootNodes;
size_t numTotalNodes;
@@ -2248,6 +2249,8 @@ private:
};
struct LabelTree {
+ LabelTree();
+
size_t firstChildIndex;
size_t numChildren;
More information about the Scummvm-git-logs
mailing list