22 #ifndef SCUMM_SMUSH_REBEL_ANIM_RA1_H 23 #define SCUMM_SMUSH_REBEL_ANIM_RA1_H 25 #include "common/endian.h" 26 #include "common/stream.h" 43 : _data(data), _offset(0), _endOffset(size) {}
46 : _data(data), _offset(startOffset), _endOffset(endOffset) {
47 if (_offset > _endOffset)
52 if (_data ==
nullptr || _offset + 8 > _endOffset)
55 const uint32 size = READ_BE_UINT32(_data + _offset + 4);
56 const uint32 dataOffset = _offset + 8;
57 if (size > _endOffset - dataOffset) {
62 chunk.tag = READ_BE_UINT32(_data + _offset);
64 chunk.offset = _offset;
65 chunk.dataOffset = dataOffset;
66 chunk.endOffset = dataOffset + size;
67 chunk.nextOffset = chunk.endOffset + (size & 1);
68 if (chunk.nextOffset > _endOffset)
69 chunk.nextOffset = _endOffset;
70 chunk.data = _data + dataOffset;
72 _offset = (uint32)chunk.nextOffset;
85 : _stream(stream), _endOffset(endOffset) {}
88 if (_stream.pos() + 8 > _endOffset)
91 const int64 chunkOffset = _stream.pos();
92 const uint32 tag = _stream.readUint32BE();
93 const uint32 size = _stream.readUint32BE();
94 const int64 dataOffset = _stream.pos();
95 const int64 endOffset = dataOffset + size;
96 if (endOffset < dataOffset || endOffset > _endOffset)
101 chunk.offset = chunkOffset;
102 chunk.dataOffset = dataOffset;
103 chunk.endOffset = endOffset;
104 chunk.nextOffset = endOffset + (size & 1);
105 if (chunk.nextOffset > _endOffset)
106 chunk.nextOffset = _endOffset;
107 chunk.data =
nullptr;
112 _stream.seek(chunk.nextOffset, SEEK_SET);
123 : _stream(stream), _remaining(remaining) {}
126 while (_remaining > 1) {
127 if ((_stream.pos() & 1) && _remaining > 0) {
128 const byte pad = _stream.readByte();
132 _stream.seek(-1, SEEK_CUR);
136 if (_remaining < 8) {
137 _stream.skip(_remaining);
142 const int64 chunkOffset = _stream.pos();
143 chunk.tag = _stream.readUint32BE();
144 chunk.size = _stream.readUint32BE();
145 chunk.offset = chunkOffset;
146 chunk.dataOffset = _stream.pos();
147 chunk.endOffset = chunk.dataOffset + chunk.size;
148 chunk.nextOffset = chunk.endOffset;
149 chunk.data =
nullptr;
153 if (_remaining == 1) {
161 return _remaining >= 8 && chunk.size <= (uint32)(_remaining - 8);
165 const int32 consumed = fits(chunk) ? (int32)chunk.size + 8 : _remaining;
166 _remaining -= consumed;
167 _stream.seek(chunk.endOffset, SEEK_SET);
Definition: anim_ra1.h:30
Definition: anim_ra1.h:40
Definition: anim_ra1.h:82
Definition: anim_ra1.h:120