diff options
Diffstat (limited to 'engines/pink/cel_decoder.cpp')
-rw-r--r-- | engines/pink/cel_decoder.cpp | 256 |
1 files changed, 128 insertions, 128 deletions
diff --git a/engines/pink/cel_decoder.cpp b/engines/pink/cel_decoder.cpp index 044a8d00b2..0387873618 100644 --- a/engines/pink/cel_decoder.cpp +++ b/engines/pink/cel_decoder.cpp @@ -29,224 +29,224 @@ namespace Pink { bool CelDecoder::loadStream(Common::SeekableReadStream *stream) { - close(); + close(); - /* uint32 frameSize = */ stream->readUint32LE(); - uint16 frameType = stream->readUint16LE(); + /* uint32 frameSize = */ stream->readUint32LE(); + uint16 frameType = stream->readUint16LE(); - // Check FLC magic number - if (frameType != 0xAF12) { - warning("FlicDecoder::loadStream(): attempted to load non-FLC data (type = 0x%04X)", frameType); - return false; - } + // Check FLC magic number + if (frameType != 0xAF12) { + warning("FlicDecoder::loadStream(): attempted to load non-FLC data (type = 0x%04X)", frameType); + return false; + } - uint16 frameCount = stream->readUint16LE(); - uint16 width = stream->readUint16LE(); - uint16 height = stream->readUint16LE(); - uint16 colorDepth = stream->readUint16LE(); - if (colorDepth != 8) { - warning("FlicDecoder::loadStream(): attempted to load an FLC with a palette of color depth %d. Only 8-bit color palettes are supported", colorDepth); - return false; - } + uint16 frameCount = stream->readUint16LE(); + uint16 width = stream->readUint16LE(); + uint16 height = stream->readUint16LE(); + uint16 colorDepth = stream->readUint16LE(); + if (colorDepth != 8) { + warning("FlicDecoder::loadStream(): attempted to load an FLC with a palette of color depth %d. Only 8-bit color palettes are supported", colorDepth); + return false; + } - addTrack(new CelVideoTrack(stream, frameCount, width, height)); - return true; + addTrack(new CelVideoTrack(stream, frameCount, width, height)); + return true; } int32 CelDecoder::getX(){ - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - if (!track) - return -1; - return track->getX(); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + if (!track) + return -1; + return track->getX(); } int32 CelDecoder::getY() { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - if (!track) - return -1; - return track->getY(); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + if (!track) + return -1; + return track->getY(); } uint16 CelDecoder::getTransparentColourIndex() { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - if (!track) - return 0; - return track->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 0; - return track->getCurrentFrame(); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + if (!track) + return 0; + return track->getCurrentFrame(); } Common::Point CelDecoder::getCenter() { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - if (!track) - return {0,0}; - return track->getCenter(); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + if (!track) + return {0,0}; + return track->getCenter(); } Common::Rect &CelDecoder::getRectangle() { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - return track->getRect(); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + return track->getRect(); } void CelDecoder::setX(int32 x) { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - track->setX(x); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + track->setX(x); } void CelDecoder::setY(int32 y) { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - track->setY(y); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + track->setY(y); } void CelDecoder::skipFrame() { - CelVideoTrack *track = (CelVideoTrack*) getTrack(0); - track->skipFrame(); + CelVideoTrack *track = (CelVideoTrack*) getTrack(0); + track->skipFrame(); } CelDecoder::CelVideoTrack::CelVideoTrack(Common::SeekableReadStream *stream, uint16 frameCount, uint16 width, uint16 height, bool skipHeader) - : FlicVideoTrack(stream, frameCount, width, height, 1), _center(0,0), _transparentColourIndex(0){ - readHeader(); + : FlicVideoTrack(stream, frameCount, width, height, 1), _center(0,0), _transparentColourIndex(0){ + readHeader(); } #define PREFIX_TYPE 0xF100 #define CEL_DATA 3 void CelDecoder::CelVideoTrack::readPrefixChunk() { - _fileStream->seek(0x80); - uint32 chunkSize = _fileStream->readUint32LE(); - uint16 chunkType = _fileStream->readUint16LE(); - if (chunkType != PREFIX_TYPE) - return; - uint32 offset = 6; - - uint32 subchunkSize = _fileStream->readUint32LE(); - uint16 subchunkType = _fileStream->readUint16LE(); - - switch (subchunkType) { - case CEL_DATA: - _fileStream->readUint16LE(); - _center.x = _fileStream->readUint16LE(); - _center.y = _fileStream->readUint16LE(); - break; - default: - error("Unknown subchunk type"); - _fileStream->skip(subchunkSize - 6); - break; - } - _rect = Common::Rect::center(_center.x, _center.y, _surface->w, _surface->h); + _fileStream->seek(0x80); + uint32 chunkSize = _fileStream->readUint32LE(); + uint16 chunkType = _fileStream->readUint16LE(); + if (chunkType != PREFIX_TYPE) + return; + uint32 offset = 6; + + uint32 subchunkSize = _fileStream->readUint32LE(); + uint16 subchunkType = _fileStream->readUint16LE(); + + switch (subchunkType) { + case CEL_DATA: + _fileStream->readUint16LE(); + _center.x = _fileStream->readUint16LE(); + _center.y = _fileStream->readUint16LE(); + break; + default: + error("Unknown subchunk type"); + _fileStream->skip(subchunkSize - 6); + break; + } + _rect = Common::Rect::center(_center.x, _center.y, _surface->w, _surface->h); } void CelDecoder::CelVideoTrack::readHeader() { - _fileStream->readUint16LE(); + _fileStream->readUint16LE(); - _frameDelay = _startFrameDelay = _fileStream->readUint32LE(); + _frameDelay = _startFrameDelay = _fileStream->readUint32LE(); - _fileStream->seek(80); - _offsetFrame1 = _fileStream->readUint32LE(); - _offsetFrame2 = _fileStream->readUint32LE(); + _fileStream->seek(80); + _offsetFrame1 = _fileStream->readUint32LE(); + _offsetFrame2 = _fileStream->readUint32LE(); - if (_offsetFrame1 > 0x80) { - readPrefixChunk(); - } + if (_offsetFrame1 > 0x80) { + readPrefixChunk(); + } - _fileStream->seek(_offsetFrame1); + _fileStream->seek(_offsetFrame1); } int32 CelDecoder::CelVideoTrack::getX() const { - return (_center.x - getWidth() / 2) < 0 ? 0 : _center.x - getWidth() / 2; + return (_center.x - getWidth() / 2) < 0 ? 0 : _center.x - getWidth() / 2; } int32 CelDecoder::CelVideoTrack::getY() const { - return (_center.y - getHeight() / 2) < 0 ? 0 : _center.y - getHeight() / 2; + return (_center.y - getHeight() / 2) < 0 ? 0 : _center.y - getHeight() / 2; } uint16 CelDecoder::CelVideoTrack::getTransparentColourIndex() { - return _transparentColourIndex; + return _transparentColourIndex; } const Graphics::Surface *CelDecoder::CelVideoTrack::getCurrentFrame() { - return _surface; + return _surface; } Common::Point CelDecoder::CelVideoTrack::getCenter() { - return _center; + return _center; } Common::Rect &CelDecoder::CelVideoTrack::getRect() { - return _rect; + return _rect; } #define FRAME_TYPE 0xF1FA void CelDecoder::CelVideoTrack::skipFrame() { - // Read chunk - /*uint32 frameSize = */ _fileStream->readUint32LE(); - uint16 frameType = _fileStream->readUint16LE(); + // Read chunk + /*uint32 frameSize = */ _fileStream->readUint32LE(); + uint16 frameType = _fileStream->readUint16LE(); - switch (frameType) { - case FRAME_TYPE: - handleFrame(); - break; - default: - error("FlicDecoder::decodeFrame(): unknown main chunk type (type = 0x%02X)", frameType); - break; - } + switch (frameType) { + case FRAME_TYPE: + handleFrame(); + break; + default: + error("FlicDecoder::decodeFrame(): unknown main chunk type (type = 0x%02X)", frameType); + break; + } - _curFrame++; - //_nextFrameStartTime += _frameDelay; + _curFrame++; + //_nextFrameStartTime += _frameDelay; - if (_atRingFrame) { - // If we decoded the ring frame, seek to the second frame - _atRingFrame = false; - _fileStream->seek(_offsetFrame2); - } + if (_atRingFrame) { + // If we decoded the ring frame, seek to the second frame + _atRingFrame = false; + _fileStream->seek(_offsetFrame2); + } - if (_curFrame == 0) - _transparentColourIndex = *(byte*)_surface->getBasePtr(0,0); + if (_curFrame == 0) + _transparentColourIndex = *(byte*)_surface->getBasePtr(0,0); } const Graphics::Surface *CelDecoder::CelVideoTrack::decodeNextFrame() { - // Read chunk - /*uint32 frameSize = */ _fileStream->readUint32LE(); - uint16 frameType = _fileStream->readUint16LE(); + // Read chunk + /*uint32 frameSize = */ _fileStream->readUint32LE(); + uint16 frameType = _fileStream->readUint16LE(); - switch (frameType) { - case FRAME_TYPE: - handleFrame(); - break; - default: - error("FlicDecoder::decodeFrame(): unknown main chunk type (type = 0x%02X)", frameType); - break; - } + switch (frameType) { + case FRAME_TYPE: + handleFrame(); + break; + default: + error("FlicDecoder::decodeFrame(): unknown main chunk type (type = 0x%02X)", frameType); + break; + } - _curFrame++; - _nextFrameStartTime += _frameDelay; + _curFrame++; + _nextFrameStartTime += _frameDelay; - if (_atRingFrame) { - // If we decoded the ring frame, seek to the second frame - _atRingFrame = false; - _fileStream->seek(_offsetFrame2); - } + if (_atRingFrame) { + // If we decoded the ring frame, seek to the second frame + _atRingFrame = false; + _fileStream->seek(_offsetFrame2); + } - if (_curFrame == 0) - _transparentColourIndex = *(byte*)_surface->getBasePtr(0,0); + if (_curFrame == 0) + _transparentColourIndex = *(byte*)_surface->getBasePtr(0,0); - return _surface; + return _surface; } void CelDecoder::CelVideoTrack::setX(int32 x) { - _center.x = x ;//+ getWidth() / 2; + _center.x = x ;//+ getWidth() / 2; } void CelDecoder::CelVideoTrack::setY(int32 y) { - _center.y = y;//+ getHeight() / 2; + _center.y = y;//+ getHeight() / 2; } } // End of namepsace Pink |