diff options
author | Johannes Schickel | 2013-01-06 11:20:52 -0800 |
---|---|---|
committer | Johannes Schickel | 2013-01-06 11:20:52 -0800 |
commit | 988596b347c7508b83f30e336add33047b49dd5f (patch) | |
tree | 604678b7d9476dc1755f5ef5ff4668b7aefd3a69 /common/iff_container.cpp | |
parent | 3e025a8c55fce06ab4dd5a615e46fa6a9b9a6fb3 (diff) | |
parent | befa207bfa3709c7292252654a5bb9384d950a02 (diff) | |
download | scummvm-rg350-988596b347c7508b83f30e336add33047b49dd5f.tar.gz scummvm-rg350-988596b347c7508b83f30e336add33047b49dd5f.tar.bz2 scummvm-rg350-988596b347c7508b83f30e336add33047b49dd5f.zip |
Merge pull request #299 from tomaz82/IFFDecoder
New IFFDecoder
Diffstat (limited to 'common/iff_container.cpp')
-rw-r--r-- | common/iff_container.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/common/iff_container.cpp b/common/iff_container.cpp index 7bcbf86e0f..ffaa5c6d06 100644 --- a/common/iff_container.cpp +++ b/common/iff_container.cpp @@ -22,6 +22,7 @@ #include "common/iff_container.h" #include "common/substream.h" +#include "common/util.h" namespace Common { @@ -75,4 +76,50 @@ void IFFParser::parse(IFFCallback &callback) { } while (!stop); } + +PackBitsReadStream::PackBitsReadStream(Common::ReadStream &input) : _input(&input) { +} + +PackBitsReadStream::~PackBitsReadStream() { +} + +bool PackBitsReadStream::eos() const { + return _input->eos(); +} + +uint32 PackBitsReadStream::read(void *dataPtr, uint32 dataSize) { + byte *out = (byte *)dataPtr; + uint32 left = dataSize; + + uint32 lenR = 0, lenW = 0; + while (left > 0 && !_input->eos()) { + lenR = _input->readByte(); + + if (lenR == 128) { + // no-op + lenW = 0; + } else if (lenR <= 127) { + // literal run + lenR++; + lenW = MIN(lenR, left); + for (uint32 j = 0; j < lenW; j++) { + *out++ = _input->readByte(); + } + for (; lenR > lenW; lenR--) { + _input->readByte(); + } + } else { // len > 128 + // expand run + lenW = MIN((256 - lenR) + 1, left); + byte val = _input->readByte(); + memset(out, val, lenW); + out += lenW; + } + + left -= lenW; + } + + return dataSize - left; +} + } // End of namespace Common |