22 #ifndef MTROPOLIS_DATA_H 23 #define MTROPOLIS_DATA_H 25 #include "common/array.h" 26 #include "common/data-io.h" 27 #include "common/endian.h" 28 #include "common/error.h" 29 #include "common/hashmap.h" 30 #include "common/hash-str.h" 31 #include "common/ptr.h" 32 #include "common/stream.h" 33 #include "common/rect.h" 34 #include "common/xpfloat.h" 36 #include "mtropolis/core.h" 64 static inline bool isLittleEndian(MTropolis::Data::DataFormat dataFormat) {
65 return dataFormat != MTropolis::Data::kDataFormatMacintosh;
71 static const uint kMaxSize = 10;
73 static inline uint computeSize(MTropolis::Data::DataFormat dataFormat) {
74 if (dataFormat == MTropolis::Data::kDataFormatMacintosh)
76 else if (dataFormat == MTropolis::Data::kDataFormatWindows)
82 static inline void encode(MTropolis::Data::DataFormat dataFormat, byte *data,
const Common::XPFloat &value) {
83 if (dataFormat == MTropolis::Data::kDataFormatMacintosh) {
86 }
else if (dataFormat == MTropolis::Data::kDataFormatWindows) {
87 uint64 doubleBits = 0;
88 bool overflowed =
false;
89 value.toDoubleBitsSafe(doubleBits, overflowed);
94 static inline void decode(MTropolis::Data::DataFormat dataFormat,
const byte *data,
Common::XPFloat &value) {
95 if (dataFormat == MTropolis::Data::kDataFormatMacintosh) {
98 }
else if (dataFormat == MTropolis::Data::kDataFormatWindows) {
99 uint64 doubleBits = 0;
101 value = value.fromDoubleBits(doubleBits);
115 struct PlugInModifier;
116 struct PlugInModifierData;
134 kProjectFormatUnknown,
136 kProjectFormatMacintosh,
137 kProjectFormatWindows,
138 kProjectFormatNeutral,
141 enum DataReadErrorCode {
142 kDataReadErrorNone = 0,
144 kDataReadErrorUnsupportedRevision,
145 kDataReadErrorReadFailed,
146 kDataReadErrorUnrecognized,
147 kDataReadErrorPlugInNotFound,
151 kModifierFlagLast = 0x2,
154 enum TextAlignmentCode {
155 kTextAlignmentCodeLeft = 0,
156 kTextAlignmentCodeCenter = 1,
157 kTextAlignmentCodeRight = 0xffff,
161 namespace DataObjectTypes {
163 enum DataObjectType : uint {
166 kProjectLabelMap = 0x22,
167 kProjectCatalog = 0x3e8,
168 kStreamHeader = 0x3e9,
169 kProjectHeader = 0x3ea,
170 kPresentationSettings = 0x3ec,
173 kGlobalObjectInfo = 0x17,
177 kProjectStructuralDef = 0x2,
178 kSectionStructuralDef = 0x3,
179 kSubsectionStructuralDef = 0x21,
181 kGraphicElement = 0x8,
186 kTextLabelElement = 0x15,
188 kAVIMovieElement = 0x25,
189 kAliasModifier = 0x27,
190 kChangeSceneModifier = 0x136,
191 kReturnModifier = 0x140,
192 kSoundEffectModifier = 0x1a4,
193 kSimpleMotionModifier = 0x1fe,
194 kDragMotionModifier = 0x208,
195 kPathMotionModifierV1 = 0x21c,
196 kPathMotionModifierV2 = 0x21b,
197 kVectorMotionModifier = 0x226,
198 kSceneTransitionModifier = 0x26c,
199 kElementTransitionModifier = 0x276,
200 kSharedSceneModifier = 0x29a,
201 kIfMessengerModifier = 0x2bc,
202 kBehaviorModifier = 0x2c6,
203 kMessengerModifier = 0x2da,
204 kSetModifier = 0x2df,
205 kTimerMessengerModifier = 0x2e4,
206 kCollisionDetectionMessengerModifier = 0x2ee,
207 kBoundaryDetectionMessengerModifier = 0x2f8,
208 kKeyboardMessengerModifier = 0x302,
209 kTextStyleModifier = 0x32a,
210 kGraphicModifier = 0x334,
211 kImageEffectModifier = 0x384,
212 kMiniscriptModifier = 0x3c0,
213 kCursorModifierV1 = 0x3ca,
214 kGradientModifier = 0x4b0,
215 kColorTableModifier = 0x4c4,
216 kSoundFadeModifier = 0x4ce,
217 kSaveAndRestoreModifier = 0x4d8,
219 kCompoundVariableModifier = 0x2c7,
220 kBooleanVariableModifier = 0x321,
221 kIntegerVariableModifier = 0x322,
222 kIntegerRangeVariableModifier = 0x324,
223 kVectorVariableModifier = 0x327,
224 kPointVariableModifier = 0x326,
225 kFloatingPointVariableModifier = 0x328,
226 kStringVariableModifier = 0x329,
227 kObjectReferenceVariableModifierV1 = 0x33e,
228 kDebris = 0xfffffffe,
229 kPlugInModifier = 0xffffffff,
233 kColorTableAsset = 0x1e,
237 kAVIMovieAsset = 0x24,
239 kAssetDataChunk = 0xffff,
242 bool isValidSceneRootElement(DataObjectType type);
243 bool isVisualElement(DataObjectType type);
244 bool isNonVisualElement(DataObjectType type);
245 bool isStructural(DataObjectType type);
246 bool isElement(DataObjectType type);
247 bool isModifier(DataObjectType type);
248 bool isAsset(DataObjectType type);
252 namespace StructuralFlags {
253 enum StructuralFlags {
256 kNoMoreSiblings = 0x8,
265 bool readU8(uint8 &value);
266 bool readU16(uint16 &value);
267 bool readU32(uint32 &value);
268 bool readU64(uint64 &value);
269 bool readS8(int8 &value);
270 bool readS16(int16 &value);
271 bool readS32(int32 &value);
272 bool readS64(int64 &value);
273 bool readF32(
float &value);
274 bool readF64(
double &value);
278 bool readMultiple(T &...values);
280 bool read(
void *dest,
size_t size);
287 template<
size_t TSize>
288 bool readChars(
char (&arr)[TSize]);
290 template<
size_t TSize>
291 bool readBytes(uint8 (&arr)[TSize]);
293 bool seek(int64 pos);
294 bool skip(
size_t count);
297 inline int64 tellGlobal()
const {
return _globalPosition + tell(); }
299 DataFormat getDataFormat()
const;
301 void setPermitDamagedStrings(
bool permit);
304 bool checkErrorAndReset();
307 DataFormat _dataFormat;
308 int64 _globalPosition;
310 bool _permitDamagedStrings;
314 bool DataReader::readMultiple(T &...values) {
318 if (!read(buffer, actualSize))
331 bool toScummVMRectUnchecked(
Common::Rect &outRect)
const;
385 uint16 signAndExponent;
414 kIntegerRange = 0x11,
417 kIncomingData = 0x1b,
418 kVariableReference = 0x1c,
462 kIncomingData = 0x6e,
463 kVariableReference = 0x73,
503 DataReadErrorCode load(DataObjectTypes::DataObjectType type, uint16 revision,
DataReader &reader);
505 uint16 getRevision()
const;
506 DataObjectTypes::DataObjectType getType()
const;
509 virtual DataReadErrorCode load(
DataReader &reader) = 0;
511 DataObjectTypes::DataObjectType _type;
519 uint32 sizeIncludingTag;
521 uint32 catalogFilePosition;
524 DataReadErrorCode load(
DataReader &reader)
override;
536 kExpandedInEditor = 0x80000000,
566 uint32 numSuperGroups;
567 uint32 nextAvailableID;
575 DataReadErrorCode load(
DataReader &reader)
override;
582 uint32 sizeIncludingTag;
589 DataReadErrorCode load(
DataReader &reader)
override;
595 kFlag1LimitOnePerSegment = 2,
622 uint32 totalNameSizePlus22;
630 DataReadErrorCode load(
DataReader &reader)
override;
637 uint32 sizeIncludingTag;
641 DataReadErrorCode load(
DataReader &reader)
override;
648 uint32 sizeIncludingTag;
651 DataReadErrorCode load(
DataReader &reader)
override;
657 uint32 structuralFlags;
664 uint32 sizeIncludingTag;
672 DataReadErrorCode load(
DataReader &reader)
override;
678 uint32 sizeIncludingTag;
689 DataReadErrorCode load(
DataReader &reader)
override;
695 uint32 structuralFlags;
696 uint32 sizeIncludingTag;
705 DataReadErrorCode load(
DataReader &reader)
override;
708 namespace ElementFlags {
711 kNotDirectToScreen = 0x00001000,
712 kHidden = 0x00008000,
713 kPaused = 0x00010000,
714 kExpandedInEditor = 0x00800000,
715 kCacheBitmap = 0x02000000,
716 kSelectedInEditor = 0x10000000,
721 namespace AnimationFlags {
723 enum AnimationFlags {
724 kAlternate = 0x10000000,
726 kPlayEveryFrame = 0x02000000,
731 namespace SceneTransitionTypes {
733 enum SceneTransitionType {
735 kPatternDissolve = 0x0406,
736 kRandomDissolve = 0x0410,
746 namespace SceneTransitionDirections {
748 enum SceneTransitionDirection {
761 uint32 sizeIncludingTag;
769 uint32 streamLocator;
775 DataReadErrorCode load(
DataReader &reader)
override;
782 uint32 sizeIncludingTag;
791 uint32 streamLocator;
797 DataReadErrorCode load(
DataReader &reader)
override;
804 uint32 sizeIncludingTag;
835 DataReadErrorCode load(
DataReader &reader)
override;
839 enum SoundFlags : uint {
840 kPaused = 0x40000000,
847 uint32 sizeIncludingTag;
863 DataReadErrorCode load(
DataReader &reader)
override;
870 uint32 sizeIncludingTag;
883 uint32 animationFlags;
886 uint32 streamLocator;
894 DataReadErrorCode load(
DataReader &reader)
override;
901 uint32 sizeIncludingTag;
906 uint32 animationFlags;
912 uint32 rateTimes100000;
913 uint32 streamLocator;
919 DataReadErrorCode load(
DataReader &reader)
override;
926 uint32 sizeIncludingTag;
927 uint16 numGlobalModifiers;
931 DataReadErrorCode load(
DataReader &reader)
override;
940 uint16 segmentIndexPlusOne;
958 uint32 sizeOfStreamAndSegmentDescs;
967 DataReadErrorCode load(
DataReader &reader)
override;
974 uint32 sizeIncludingTag;
981 DataReadErrorCode load(
DataReader &reader)
override;
986 kBehaviorFlagSwitchable = 1,
991 uint32 modifierFlags;
992 uint32 sizeIncludingTag;
999 Point editorLayoutPosition;
1000 uint16 lengthOfName;
1002 uint32 behaviorFlags;
1010 DataReadErrorCode load(
DataReader &reader)
override;
1036 uint32 sizeOfInstructions;
1037 uint32 numOfInstructions;
1038 uint32 numLocalRefs;
1039 uint32 numAttributes;
1045 DataFormat dataFormat;
1054 uint32 modifierFlags;
1055 uint32 sizeIncludingTag;
1060 Point editorLayoutPosition;
1061 uint16 lengthOfName;
1079 DataReadErrorCode load(
DataReader &reader)
override;
1092 DataReadErrorCode load(
DataReader &reader)
override;
1102 uint16 fadeToVolume;
1103 uint8 codedDuration[4];
1107 DataReadErrorCode load(
DataReader &reader)
override;
1121 uint8 lengthOfFilePath;
1122 uint8 lengthOfFileName;
1123 uint8 lengthOfVariableName;
1124 uint8 lengthOfVariableString;
1132 DataReadErrorCode load(
DataReader &reader)
override;
1135 enum MessageFlags : uint {
1136 kMessageFlagNoRelay = 0x20000000,
1137 kMessageFlagNoCascade = 0x40000000,
1138 kMessageFlagNoImmediate = 0x80000000,
1147 uint32 messageFlags;
1152 uint8 unknown11[10];
1154 uint8 withSourceLength;
1155 uint8 withStringLength;
1161 DataReadErrorCode load(
DataReader &reader)
override;
1174 uint8 sourceNameLength;
1175 uint8 targetNameLength;
1176 uint8 sourceStringLength;
1177 uint8 targetStringLength;
1186 DataReadErrorCode load(
DataReader &reader)
override;
1192 uint32 modifierFlags;
1193 uint32 sizeIncludingTag;
1194 uint16 aliasIndexPlusOne;
1198 uint32 lengthOfName;
1200 Point editorLayoutPosition;
1207 DataReadErrorCode load(
DataReader &reader)
override;
1211 enum ChangeSceneFlags : uint {
1212 kChangeSceneFlagNextScene = 0x80000000,
1213 kChangeSceneFlagPrevScene = 0x40000000,
1214 kChangeSceneFlagSpecificScene = 0x20000000,
1215 kChangeSceneFlagAddToReturnList = 0x10000000,
1216 kChangeSceneFlagAddToDestList = 0x08000000,
1217 kChangeSceneFlagWrapAround = 0x04000000,
1223 uint32 changeSceneFlags;
1225 uint32 targetSectionGUID;
1226 uint32 targetSubsectionGUID;
1227 uint32 targetSceneGUID;
1230 DataReadErrorCode load(
DataReader &reader)
override;
1236 static const uint32 kSpecialAssetIDSystemBeep = 0xffffffffu;
1241 Event terminateWhen;
1248 DataReadErrorCode load(
DataReader &reader)
override;
1255 uint32 messageFlags;
1259 uint8 unknown13[10];
1261 uint8 withSourceLength;
1262 uint8 withStringLength;
1274 kFrameFlagPlaySequentially = 1,
1283 bool load(
DataReader &reader,
bool haveMessageSpec);
1287 kFlagReverse = 0x00100000,
1288 kFlagLoop = 0x10000000,
1289 kFlagAlternate = 0x02000000,
1290 kFlagStartAtBeginning = 0x08000000,
1299 Event terminateWhen;
1304 uint32 frameDurationTimes10Million;
1308 bool havePointDefMessageSpecs;
1313 DataReadErrorCode load(
DataReader &reader)
override;
1322 Event terminateWhen;
1324 uint16 directionFlags;
1326 uint32 delayMSecTimes4800;
1330 DataReadErrorCode load(
DataReader &reader)
override;
1343 uint8 constrainHorizontal;
1344 uint8 constrainVertical;
1345 uint8 constrainToParent;
1353 kConstrainToParent = 0x10,
1354 kConstrainVertical = 0x20,
1355 kConstrainHorizontal = 0x40,
1368 Rect constraintMargin;
1372 DataReadErrorCode load(
DataReader &reader)
override;
1384 uint8 vecSourceLength;
1385 uint8 vecStringLength;
1391 DataReadErrorCode load(
DataReader &reader)
override;
1401 uint16 transitionType;
1409 DataReadErrorCode load(
DataReader &reader)
override;
1415 enum TransitionType {
1416 kTransitionTypeRectangularIris = 0x03e8,
1417 kTransitionTypeOvalIris = 0x03f2,
1418 kTransitionTypeZoom = 0x044c,
1419 kTransitionTypeFade = 0x2328,
1423 kRevealTypeReveal = 0,
1424 kRevealTypeConceal = 1,
1432 uint16 transitionType;
1439 DataReadErrorCode load(
DataReader &reader)
override;
1450 uint32 subsectionGUID;
1454 DataReadErrorCode load(
DataReader &reader)
override;
1462 uint32 messageFlags;
1470 uint8 withSourceLength;
1471 uint8 withStringLength;
1478 DataReadErrorCode load(
DataReader &reader)
override;
1487 kTimerFlagLooping = 0x10000000,
1490 uint32 messageAndTimerFlags;
1493 Event terminateWhen;
1501 uint8 hundredthsOfSeconds;
1505 uint8 withSourceLength;
1506 uint8 withStringLength;
1512 DataReadErrorCode load(
DataReader &reader)
override;
1519 kDetectTopEdge = 0x1000,
1520 kDetectBottomEdge = 0x0800,
1521 kDetectLeftEdge = 0x0400,
1522 kDetectRightEdge = 0x0200,
1523 kDetectExiting = 0x0100,
1524 kWhileDetected = 0x0080,
1528 uint16 messageFlagsHigh;
1536 uint8 withSourceLength;
1537 uint8 withStringLength;
1543 DataReadErrorCode load(
DataReader &reader)
override;
1549 enum ModifierFlags {
1550 kDetectLayerInFront = 0x10000000,
1551 kDetectLayerBehind = 0x08000000,
1552 kSendToCollidingElement = 0x02000000,
1553 kSendToOnlyFirstCollidingElement = 0x00200000,
1555 kDetectionModeMask = 0x01c00000,
1556 kDetectionModeFirstContact = 0x01400000,
1557 kDetectionModeWhileInContact = 0x01000000,
1558 kDetectionModeExiting = 0x00800000,
1560 kNoCollideWithParent = 0x00100000,
1564 uint32 messageAndModifierFlags;
1572 uint8 withSourceLength;
1573 uint8 withStringLength;
1579 DataReadErrorCode load(
DataReader &reader)
override;
1583 enum KeyStateFlags {
1584 kOnDown = 0x10000000,
1586 kOnRepeat = 0x8000000,
1588 kKeyStateMask = (kOnDown | kOnUp | kOnRepeat),
1619 uint32 messageFlagsAndKeyStates;
1621 uint16 keyModifiers;
1629 uint8 withSourceLength;
1630 uint8 withStringLength;
1636 DataReadErrorCode load(
DataReader &reader)
override;
1655 uint16 lengthOfFontFamilyName;
1660 DataReadErrorCode load(
DataReader &reader)
override;
1676 uint8 unknown4_1[6];
1677 uint8 unknown4_2[26];
1681 uint8 unknown5_1[4];
1682 uint8 unknown5_2[22];
1701 uint16 numPolygonPoints;
1707 DataReadErrorCode load(
DataReader &reader)
override;
1715 kTypeSelectedBevels = 2,
1716 kTypeDeselectedBevels = 3,
1732 DataReadErrorCode load(
DataReader &reader)
override;
1744 DataReadErrorCode load(
DataReader &reader)
override;
1761 bool hasMacOnlyPart;
1765 DataReadErrorCode load(
DataReader &reader)
override;
1772 uint32 modifierFlags;
1773 uint32 sizeIncludingTag;
1778 Point editorLayoutPosition;
1779 uint16 lengthOfName;
1786 DataReadErrorCode load(
DataReader &reader)
override;
1797 DataReadErrorCode load(
DataReader &reader)
override;
1808 DataReadErrorCode load(
DataReader &reader)
override;
1819 DataReadErrorCode load(
DataReader &reader)
override;
1830 DataReadErrorCode load(
DataReader &reader)
override;
1842 DataReadErrorCode load(
DataReader &reader)
override;
1853 DataReadErrorCode load(
DataReader &reader)
override;
1860 uint32 lengthOfString;
1865 DataReadErrorCode load(
DataReader &reader)
override;
1873 Event setToSourcesParentWhen;
1876 DataReadErrorCode load(
DataReader &reader)
override;
1887 uint32 modifierFlags;
1889 char modifierName[17];
1892 uint16 plugInRevision;
1894 Point editorLayoutPosition;
1895 uint16 lengthOfName;
1899 uint32 subObjectSize;
1904 DataReadErrorCode load(
DataReader &reader)
override;
1910 uint32 persistFlags;
1911 uint32 sizeIncludingTag;
1914 DataReadErrorCode load(
DataReader &reader)
override;
1920 uint32 persistFlags;
1921 uint32 sizeIncludingTag;
1929 DataReadErrorCode load(
DataReader &reader)
override;
1934 uint8 unknown5_1[66];
1940 uint8 unknown3_1[32];
1952 uint32 persistFlags;
1953 uint32 assetAndDataCombinedSize;
1956 uint8 unknown1_1[4];
1957 uint16 extFileNameLength;
1959 uint32 movieDataPos;
1961 uint32 movieDataSize;
1970 DataReadErrorCode load(
DataReader &reader)
override;
1979 uint16 extFileNameLength;
1985 DataReadErrorCode load(
DataReader &reader)
override;
1999 uint8 unknown11[18];
2000 uint8 unknown12_1[2];
2017 uint32 persistFlags;
2018 uint32 assetAndDataCombinedSize;
2023 uint8 bitsPerSample;
2026 uint8 codedDuration[4];
2028 uint32 cuePointDataSize;
2029 uint16 numCuePoints;
2031 uint32 filePosition;
2042 DataReadErrorCode load(
DataReader &reader)
override;
2061 uint32 persistFlags;
2070 uint16 bitsPerPixel;
2075 uint32 filePosition;
2083 DataReadErrorCode load(
DataReader &reader)
override;
2088 uint8 unknown10[88];
2092 uint8 unknown11[54];
2120 uint32 compressedSize;
2128 uint16 bitsPerPixel;
2130 uint16 decompressedBytesPerRow;
2131 uint32 decompressedSize;
2148 kEncodingFlag_TemporalCompression = 0x80,
2149 kEncodingFlag_HasRanges = 0x20000000,
2150 kEncodingFlag_Trimming = 0x08,
2157 uint32 sizeIncludingTag;
2159 uint32 numFrameRanges;
2173 uint32 frameDataPosition;
2174 uint32 sizeOfFrameData;
2177 uint32 mtoonHeader[2];
2180 uint32 encodingFlags;
2185 uint16 bitsPerPixel;
2187 uint8 unknown4_1[8];
2188 uint32 codecDataSize;
2189 Point registrationPoint;
2206 DataReadErrorCode load(
DataReader &reader)
override;
2236 uint32 persistFlags;
2237 uint32 sizeIncludingTag;
2245 uint8 pitchBigEndian[2];
2267 DataReadErrorCode load(
DataReader &reader)
override;
2274 uint32 sizeIncludingTag;
2278 DataReadErrorCode load(
DataReader &reader)
override;
2283 virtual PlugIn &getPlugIn()
const = 0;
2297 template<
size_t TSize>
2298 inline bool DataReader::readBytes(uint8(&arr)[TSize]) {
2299 return this->read(arr, TSize);
2302 template<
size_t TSize>
2303 inline bool DataReader::readChars(
char (&arr)[TSize]) {
2304 return this->read(arr, TSize);
Definition: data-io.h:167
Definition: runtime.h:1198
Definition: noncopyable.h:39
Definition: algorithm.h:29
Definition: data-io.h:121