aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/compression.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2011-11-20 12:14:10 +1100
committerPaul Gilbert2011-11-20 12:14:10 +1100
commitb0611f31895130dcc27bef93bf1d54dfbfc1da43 (patch)
treea6d1a699d1299de5235611820fec1d21903d2646 /engines/m4/compression.cpp
parent90ecc195c1939a073d27c56fe27678764979650b (diff)
downloadscummvm-rg350-b0611f31895130dcc27bef93bf1d54dfbfc1da43.tar.gz
scummvm-rg350-b0611f31895130dcc27bef93bf1d54dfbfc1da43.tar.bz2
scummvm-rg350-b0611f31895130dcc27bef93bf1d54dfbfc1da43.zip
M4: Removed the M4/MADS engine from trunk
Diffstat (limited to 'engines/m4/compression.cpp')
-rw-r--r--engines/m4/compression.cpp190
1 files changed, 0 insertions, 190 deletions
diff --git a/engines/m4/compression.cpp b/engines/m4/compression.cpp
deleted file mode 100644
index 65a25c14e3..0000000000
--- a/engines/m4/compression.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "m4/compression.h"
-#include "m4/m4.h"
-
-#include "common/memstream.h"
-#include "common/textconsole.h"
-
-namespace M4 {
-
-const char *madsPackString = "MADSPACK";
-
-bool MadsPack::isCompressed(Common::SeekableReadStream *stream) {
- // Check whether the passed stream is packed
-
- char tempBuffer[8];
- stream->seek(0);
- if (stream->read(tempBuffer, 8) == 8) {
- if (!strncmp(tempBuffer, madsPackString, 8))
- return true;
- }
-
- return false;
-}
-
-MadsPack::MadsPack(Common::SeekableReadStream *stream) {
- initialize(stream);
-}
-
-MadsPack::MadsPack(const char *resourceName, MadsM4Engine* vm) {
- Common::SeekableReadStream *stream = vm->_resourceManager->get(resourceName);
- initialize(stream);
- vm->_resourceManager->toss(resourceName);
-}
-
-void MadsPack::initialize(Common::SeekableReadStream *stream) {
- if (!MadsPack::isCompressed(stream))
- error("Attempted to decompress a resource that was not MadsPacked");
-
- stream->seek(14);
- _count = stream->readUint16LE();
- _items = new MadsPackEntry[_count];
-
- byte *headerData = new byte[0xA0];
- byte *header = headerData;
- stream->read(headerData, 0xA0);
-
- for (int i = 0; i < _count; ++i, header += 10) {
- // Get header data
- _items[i].hash = READ_LE_UINT16(header);
- _items[i].size = READ_LE_UINT32(header + 2);
- _items[i].compressedSize = READ_LE_UINT32(header + 6);
-
- _items[i].data = new byte[_items[i].size];
- if (_items[i].size == _items[i].compressedSize) {
- // Entry isn't compressed
- stream->read(_items[i].data, _items[i].size);
- } else {
- // Decompress the entry
- byte *compressedData = new byte[_items[i].compressedSize];
- stream->read(compressedData, _items[i].compressedSize);
-
- FabDecompressor fab;
- fab.decompress(compressedData, _items[i].compressedSize, _items[i].data, _items[i].size);
- delete[] compressedData;
- }
- }
-
- delete[] headerData;
- _dataOffset = stream->pos();
-}
-
-Common::SeekableReadStream *MadsPack::getItemStream(int index) {
- return new Common::MemoryReadStream(_items[index].data, _items[index].size, DisposeAfterUse::NO);
-}
-
-MadsPack::~MadsPack() {
- for (int i = 0; i < _count; ++i)
- delete[] _items[i].data;
- delete[] _items;
-}
-
-//--------------------------------------------------------------------------
-
-void FabDecompressor::decompress(const byte *srcData, int srcSize, byte *destData, int destSize) {
- byte copyLen, copyOfsShift, copyOfsMask, copyLenMask;
- unsigned long copyOfs;
- byte *destP;
-
- // Validate that the data starts with the FAB header
- if (strncmp((const char *)srcData, "FAB", 3) != 0)
- error("FabDecompressor - Invalid compressed data");
-
- int shiftVal = srcData[3];
- if ((shiftVal < 10) || (shiftVal > 13))
- error("FabDecompressor - Invalid shift start");
-
- copyOfsShift = 16 - shiftVal;
- copyOfsMask = 0xFF << (shiftVal - 8);
- copyLenMask = (1 << copyOfsShift) - 1;
- copyOfs = 0xFFFF0000;
- destP = destData;
-
- // Initialize data fields
- _srcData = srcData;
- _srcP = _srcData + 6;
- _srcSize = srcSize;
- _bitsLeft = 16;
- _bitBuffer = READ_LE_UINT16(srcData + 4);
-
- for (;;) {
- if (getBit() == 0) {
- if (getBit() == 0) {
- copyLen = ((getBit() << 1) | getBit()) + 2;
- copyOfs = *_srcP++ | 0xFFFFFF00;
- } else {
- copyOfs = (((_srcP[1] >> copyOfsShift) | copyOfsMask) << 8) | _srcP[0];
- copyLen = _srcP[1] & copyLenMask;
- _srcP += 2;
- if (copyLen == 0) {
- copyLen = *_srcP++;
- if (copyLen == 0)
- break;
- else if (copyLen == 1)
- continue;
- else
- copyLen++;
- } else {
- copyLen += 2;
- }
- copyOfs |= 0xFFFF0000;
- }
- while (copyLen-- > 0) {
- if (destP - destData == destSize)
- error("FabDecompressor - Decompressed data exceeded specified size");
-
- *destP = destP[(signed int)copyOfs];
- destP++;
- }
- } else {
- if (_srcP - srcData == srcSize)
- error("FabDecompressor - Passed end of input buffer during decompression");
- if (destP - destData == destSize)
- error("FabDecompressor - Decompressed data exceeded specified size");
-
- *destP++ = *_srcP++;
- }
- }
-
- if (destP - destData != destSize)
- error("FabDecompressor - Decompressed data does not match header decompressed size");
-}
-
-int FabDecompressor::getBit() {
- _bitsLeft--;
- if (_bitsLeft == 0) {
- if (_srcP - _srcData == _srcSize)
- error("FabDecompressor - Passed end of input buffer during decompression");
-
- _bitBuffer = (READ_LE_UINT16(_srcP) << 1) | (_bitBuffer & 1);
- _srcP += 2;
- _bitsLeft = 16;
- }
-
- int bit = _bitBuffer & 1;
- _bitBuffer >>= 1;
- return bit;
-}
-
-} // End of namespace M4