diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/dxa_player.cpp | 50 | ||||
-rw-r--r-- | graphics/dxa_player.h | 2 | ||||
-rw-r--r-- | graphics/module.mk | 1 | ||||
-rw-r--r-- | graphics/smk_player.cpp | 96 | ||||
-rw-r--r-- | graphics/smk_player.h | 7 |
5 files changed, 82 insertions, 74 deletions
diff --git a/graphics/dxa_player.cpp b/graphics/dxa_player.cpp index 21148be1d1..b0c3f498d7 100644 --- a/graphics/dxa_player.cpp +++ b/graphics/dxa_player.cpp @@ -35,7 +35,7 @@ namespace Graphics { DXAPlayer::DXAPlayer() { - _fd = 0; + _fileStream = 0; _frameBuffer1 = 0; _frameBuffer2 = 0; @@ -66,25 +66,25 @@ DXAPlayer::~DXAPlayer() { } int DXAPlayer::getWidth() { - if (!_fd) + if (!_fileStream) return 0; return _width; } int DXAPlayer::getHeight() { - if (!_fd) + if (!_fileStream) return 0; return _height; } int DXAPlayer::getCurFrame() { - if (!_fd) + if (!_fileStream) return -1; return _frameNum; } int DXAPlayer::getFrameCount() { - if (!_fd) + if (!_fileStream) return 0; return _framesCount; } @@ -99,14 +99,14 @@ bool DXAPlayer::loadFile(const char *filename) { return 0; } - _fd = file; + _fileStream = file; - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); assert(tag == MKID_BE('DEXA')); - uint8 flags = _fd->readByte(); - _framesCount = _fd->readUint16BE(); - frameRate = _fd->readUint32BE(); + uint8 flags = _fileStream->readByte(); + _framesCount = _fileStream->readUint16BE(); + frameRate = _fileStream->readUint32BE(); if (frameRate > 0) _framesPerSec = 1000 / frameRate; @@ -120,8 +120,8 @@ bool DXAPlayer::loadFile(const char *filename) { else _frameTicks = frameRate; - _width = _fd->readUint16BE(); - _height = _fd->readUint16BE(); + _width = _fileStream->readUint16BE(); + _height = _fileStream->readUint16BE(); if (flags & 0x80) { _scaleMode = S_INTERLACED; @@ -156,20 +156,20 @@ bool DXAPlayer::loadFile(const char *filename) { uint32 size; do { - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag != 0) { - size = _fd->readUint32BE(); + size = _fileStream->readUint32BE(); } switch (tag) { case 0: // No more tags break; case MKID_BE('MAXD'): assert(size == 4); - _decompBufferSize = _fd->readUint32BE(); + _decompBufferSize = _fileStream->readUint32BE(); break; default: // Unknown tag - skip it. while (size > 0) { - byte dummy = _fd->readByte(); + byte dummy = _fileStream->readByte(); size--; } break; @@ -184,10 +184,10 @@ bool DXAPlayer::loadFile(const char *filename) { } void DXAPlayer::closeFile() { - if (!_fd) + if (!_fileStream) return; - delete _fd; + delete _fileStream; free(_frameBuffer1); free(_frameBuffer2); @@ -195,7 +195,7 @@ void DXAPlayer::closeFile() { free(_inBuffer); free(_decompBuffer); - _fd = 0; + _fileStream = 0; _inBuffer = 0; _decompBuffer = 0; } @@ -513,18 +513,18 @@ void DXAPlayer::decode13(int size) { void DXAPlayer::decodeNextFrame() { uint32 tag; - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag == MKID_BE('CMAP')) { byte rgb[768]; - _fd->read(rgb, ARRAYSIZE(rgb)); + _fileStream->read(rgb, ARRAYSIZE(rgb)); setPalette(rgb); } - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag == MKID_BE('FRAM')) { - byte type = _fd->readByte(); - uint32 size = _fd->readUint32BE(); + byte type = _fileStream->readByte(); + uint32 size = _fileStream->readUint32BE(); if ((_inBuffer == NULL) || (_inBufferSize < size)) { free(_inBuffer); _inBuffer = (byte *)malloc(size); @@ -533,7 +533,7 @@ void DXAPlayer::decodeNextFrame() { _inBufferSize = size; } - _fd->read(_inBuffer, size); + _fileStream->read(_inBuffer, size); switch (type) { case 2: diff --git a/graphics/dxa_player.h b/graphics/dxa_player.h index dbe39bbcee..27f4752d6a 100644 --- a/graphics/dxa_player.h +++ b/graphics/dxa_player.h @@ -61,7 +61,7 @@ public: DXAPlayer(); virtual ~DXAPlayer(); - Common::SeekableReadStream *_fd; + Common::SeekableReadStream *_fileStream; /** * Returns the width of the video diff --git a/graphics/module.mk b/graphics/module.mk index 70fb75fabe..f080a6555c 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -17,6 +17,7 @@ MODULE_OBJS := \ primitives.o \ scaler.o \ scaler/thumbnail_intern.o \ + smk_player.o \ surface.o \ thumbnail.o \ VectorRenderer.o \ diff --git a/graphics/smk_player.cpp b/graphics/smk_player.cpp index 0ff29ea086..f6d38db48b 100644 --- a/graphics/smk_player.cpp +++ b/graphics/smk_player.cpp @@ -154,7 +154,7 @@ int SmallHuffmanTree::decodeTree(int length) { int r2 = decodeTree(length + 1); return r1+r2+1; -}; +} uint16 SmallHuffmanTree::getCode(BitStream &bs) { uint16 *p = &_tree[0]; @@ -235,7 +235,7 @@ BigHuffmanTree::BigHuffmanTree(BitStream &bs) delete _loBytes; delete _hiBytes; -}; +} void BigHuffmanTree::reset() { _tree[_last[0]] = _tree[_last[1]] = _tree[_last[2]] = 0; @@ -312,7 +312,7 @@ uint32 BigHuffmanTree::getCode(BitStream &bs) { } SMKPlayer::SMKPlayer() - : _currentSMKFrame(0) { + : _currentSMKFrame(0),_fileStream(0) { } SMKPlayer::~SMKPlayer() { @@ -322,49 +322,53 @@ SMKPlayer::~SMKPlayer() { bool SMKPlayer::loadFile(const char *fileName) { closeFile(); - if (!_fileStream.open(fileName)) { + Common::File *file = new Common::File(); + if (!file->open(fileName)) { + delete file; return false; } + _fileStream = file; + // Seek to the first frame _currentSMKFrame = 0; - _header.signature = _fileStream.readUint32BE(); + _header.signature = _fileStream->readUint32BE(); assert(_header.signature == MKID_BE('SMK2') || _header.signature == MKID_BE('SMK4')); - _header.width = _fileStream.readUint32LE(); - _header.height = _fileStream.readUint32LE(); - _header.frames = _fileStream.readUint32LE(); + _header.width = _fileStream->readUint32LE(); + _header.height = _fileStream->readUint32LE(); + _header.frames = _fileStream->readUint32LE(); _framesCount = _header.frames; - _header.frameRate = (int32)_fileStream.readUint32LE(); - _header.flags = _fileStream.readUint32LE(); + _header.frameRate = (int32)_fileStream->readUint32LE(); + _header.flags = _fileStream->readUint32LE(); unsigned int i; for (i = 0; i < 7; ++i) - _header.audioSize[i] = _fileStream.readUint32LE(); + _header.audioSize[i] = _fileStream->readUint32LE(); - _header.treesSize = _fileStream.readUint32LE(); - _header.mMapSize = _fileStream.readUint32LE(); - _header.mClrSize = _fileStream.readUint32LE(); - _header.fullSize = _fileStream.readUint32LE(); - _header.typeSize = _fileStream.readUint32LE(); + _header.treesSize = _fileStream->readUint32LE(); + _header.mMapSize = _fileStream->readUint32LE(); + _header.mClrSize = _fileStream->readUint32LE(); + _header.fullSize = _fileStream->readUint32LE(); + _header.typeSize = _fileStream->readUint32LE(); for (i = 0; i < 7; ++i) - _header.audioRate[i] = _fileStream.readUint32LE(); + _header.audioRate[i] = _fileStream->readUint32LE(); - _header.dummy = _fileStream.readUint32LE(); + _header.dummy = _fileStream->readUint32LE(); _frameSizes = (uint32 *)malloc(_header.frames * sizeof(uint32)); for (i = 0; i < _header.frames; ++i) - _frameSizes[i] = _fileStream.readUint32LE(); + _frameSizes[i] = _fileStream->readUint32LE(); _frameTypes = (uint32 *)malloc(_header.frames * sizeof(uint32)); for (i = 0; i < _header.frames; ++i) - _frameTypes[i] = _fileStream.readByte(); + _frameTypes[i] = _fileStream->readByte(); Common::Array<byte> huffmanTrees; huffmanTrees.resize(_header.treesSize + 2); - _fileStream.read(&huffmanTrees[0], _header.treesSize); + _fileStream->read(&huffmanTrees[0], _header.treesSize); BitStream bs(&huffmanTrees[0], _header.treesSize + 2); @@ -380,18 +384,20 @@ bool SMKPlayer::loadFile(const char *fileName) { } void SMKPlayer::closeFile() { - if (_fileStream.isOpen()) { - delete _MMapTree; - delete _MClrTree; - delete _FullTree; - delete _TypeTree; - - free(_frameSizes); - free(_frameTypes); - free(_image); - free(_palette); - } - _fileStream.close(); + if (!_fileStream) + return; + + delete _MMapTree; + delete _MClrTree; + delete _FullTree; + delete _TypeTree; + + free(_frameSizes); + free(_frameTypes); + free(_image); + free(_palette); + + _fileStream = 0; } void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { @@ -411,7 +417,7 @@ void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { bool SMKPlayer::decodeNextFrame() { uint i; - uint32 startPos = _fileStream.pos(); + uint32 startPos = _fileStream->pos(); _paletteDidChange = false; if (_frameTypes[_currentSMKFrame] & 1) { @@ -426,20 +432,20 @@ bool SMKPlayer::decodeNextFrame() { if (!(_frameTypes[_currentSMKFrame] & (2 << i))) continue; - uint32 len = _fileStream.readUint32LE(); - //uint32 unpackedLen = _fileStream.readUint32LE(); - _fileStream.skip(len - 4); + uint32 len = _fileStream->readUint32LE(); + //uint32 unpackedLen = _fileStream->readUint32LE(); + _fileStream->skip(len - 4); } uint32 frameSize = _frameSizes[_currentSMKFrame] & ~3; - if (_fileStream.pos() - startPos > frameSize) + if (_fileStream->pos() - startPos > frameSize) exit(1); - uint32 frameDataSize = frameSize - (_fileStream.pos() - startPos); + uint32 frameDataSize = frameSize - (_fileStream->pos() - startPos); _frameData = (byte *)malloc(frameDataSize + 2); - _fileStream.read(_frameData, frameDataSize); + _fileStream->read(_frameData, frameDataSize); BitStream bs(_frameData, frameDataSize + 2); @@ -590,7 +596,7 @@ bool SMKPlayer::decodeNextFrame() { } } - _fileStream.seek(startPos + frameSize); + _fileStream->seek(startPos + frameSize); free(_frameData); @@ -598,11 +604,11 @@ bool SMKPlayer::decodeNextFrame() { } void SMKPlayer::unpackPalette() { - uint startPos = _fileStream.pos(); - uint32 len = 4 * _fileStream.readByte(); + uint startPos = _fileStream->pos(); + uint32 len = 4 * _fileStream->readByte(); byte *chunk = (byte *)malloc(len); - _fileStream.read(&chunk[0], len); + _fileStream->read(&chunk[0], len); byte *p = &chunk[0]; byte oldPalette[3*256]; @@ -642,7 +648,7 @@ void SMKPlayer::unpackPalette() { } } - _fileStream.seek(startPos + len); + _fileStream->seek(startPos + len); free(chunk); } diff --git a/graphics/smk_player.h b/graphics/smk_player.h index 38023b18d4..e230a958bd 100644 --- a/graphics/smk_player.h +++ b/graphics/smk_player.h @@ -50,7 +50,9 @@ class BigHuffmanTree; class SMKPlayer { public: SMKPlayer(); - ~SMKPlayer(); + virtual ~SMKPlayer(); + + Common::SeekableReadStream *_fileStream; /** * Returns the width of the video @@ -68,7 +70,7 @@ public: * Returns the current frame number of the video * @return the current frame number of the video */ - uint32 getCurrentFrame() { return _currentSMKFrame; } + uint32 getCurFrame() { return _currentSMKFrame; } /** * Returns the amount of frames in the video @@ -124,7 +126,6 @@ protected: private: void unpackPalette(); - Common::File _fileStream; uint32 _currentSMKFrame; struct { |