aboutsummaryrefslogtreecommitdiff
path: root/engines/pink/cel_decoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/pink/cel_decoder.cpp')
-rw-r--r--engines/pink/cel_decoder.cpp65
1 files changed, 46 insertions, 19 deletions
diff --git a/engines/pink/cel_decoder.cpp b/engines/pink/cel_decoder.cpp
index 7e7a9939e9..82dca7bee3 100644
--- a/engines/pink/cel_decoder.cpp
+++ b/engines/pink/cel_decoder.cpp
@@ -64,15 +64,23 @@ uint32 CelDecoder::getY() {
return track->getY();
}
-Graphics::Surface *CelDecoder::getCurrentFrame() {
+
+uint16 CelDecoder::getTransparentColourIndex() {
+ CelVideoTrack *track = (CelVideoTrack*) getTrack(0);
+ if (!track)
+ return 0;
+ return track->getTransparentColourIndex();
+}
+
+const Graphics::Surface *CelDecoder::getCurrentFrame() {
CelVideoTrack *track = (CelVideoTrack*) getTrack(0);
if (!track)
- return nullptr;
- return nullptr;
+ return 0;
+ return track->getCurrentFrame();
}
CelDecoder::CelVideoTrack::CelVideoTrack(Common::SeekableReadStream *stream, uint16 frameCount, uint16 width, uint16 height, bool skipHeader)
- : FlicVideoTrack(stream, frameCount, width, height, 1) {
+ : FlicVideoTrack(stream, frameCount, width, height, 1), _center(0,0), _transparentColourIndex(0){
readHeader();
}
@@ -86,22 +94,33 @@ void CelDecoder::CelVideoTrack::readPrefixChunk() {
if (chunkType != PREFIX_TYPE)
return;
uint32 offset = 6;
- while (offset < chunkSize) {
- uint32 subchunkSize = _fileStream->readUint32LE();
- uint16 subchunkType = _fileStream->readUint16LE();
- switch (subchunkType) {
- case CEL_DATA:
- _fileStream->skip(2); // Unknown field
- _center.x = _fileStream->readUint16LE();
- _center.y = _fileStream->readUint16LE();
- _fileStream->skip(subchunkSize - 6 - 6);
- break;
- default:
- _fileStream->skip(subchunkSize - 6);
- break;
- }
- offset += subchunkSize;
+
+ uint32 subchunkSize = _fileStream->readUint32LE();
+ uint16 subchunkType = _fileStream->readUint16LE();
+
+ switch (subchunkType) {
+ case CEL_DATA:
+ debug("%u", _fileStream->readUint16LE());
+ _center.x = _fileStream->readUint16LE();
+ _center.y = _fileStream->readUint16LE();
+ debug("stretch x: %u", _fileStream->readUint16LE());
+ debug("stretch y: %u", _fileStream->readUint16LE());
+ debug("rotation x: %u", _fileStream->readUint16LE());
+ debug("rotation y: %u", _fileStream->readUint16LE());
+ debug("rotation z: %u", _fileStream->readUint16LE());
+ debug("current Frame: %u", _fileStream->readUint16LE());
+ debug("next frame offset: %u",_fileStream->readUint32LE());
+ debug("tcolor: %u", _transparentColourIndex = _fileStream->readUint16LE());
+ for (int j = 0; j < 18; ++j) {
+ debug("%u", _fileStream->readUint16LE());
+ }
+ break;
+ default:
+ error("Unknown subchunk type");
+ _fileStream->skip(subchunkSize - 6);
+ break;
}
+
}
void CelDecoder::CelVideoTrack::readHeader() {
@@ -130,4 +149,12 @@ uint32 CelDecoder::CelVideoTrack::getY() const {
return _center.y - getHeight() / 2;
}
+uint16 CelDecoder::CelVideoTrack::getTransparentColourIndex() {
+ return _transparentColourIndex;
+}
+
+const Graphics::Surface *CelDecoder::CelVideoTrack::getCurrentFrame() {
+ return _surface;
+}
+
} // End of namepsace Pink \ No newline at end of file