aboutsummaryrefslogtreecommitdiff
path: root/graphics/smk_player.cpp
diff options
context:
space:
mode:
authorTravis Howell2008-12-14 23:41:48 +0000
committerTravis Howell2008-12-14 23:41:48 +0000
commit9c20a533bb121d97088e19ce620b1172b16fa8a1 (patch)
treef8a5832a9cf36e1f55690712da16284f50c8028a /graphics/smk_player.cpp
parent41499091b051ae1327b5d35e9593525fd6e749dd (diff)
downloadscummvm-rg350-9c20a533bb121d97088e19ce620b1172b16fa8a1.tar.gz
scummvm-rg350-9c20a533bb121d97088e19ce620b1172b16fa8a1.tar.bz2
scummvm-rg350-9c20a533bb121d97088e19ce620b1172b16fa8a1.zip
Enable Smacker support, and switch later HE games to Smacker support (since they aren't supported yet).
svn-id: r35368
Diffstat (limited to 'graphics/smk_player.cpp')
-rw-r--r--graphics/smk_player.cpp96
1 files changed, 51 insertions, 45 deletions
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);
}