aboutsummaryrefslogtreecommitdiff
path: root/common/iff_container.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2013-01-06 11:20:52 -0800
committerJohannes Schickel2013-01-06 11:20:52 -0800
commit988596b347c7508b83f30e336add33047b49dd5f (patch)
tree604678b7d9476dc1755f5ef5ff4668b7aefd3a69 /common/iff_container.cpp
parent3e025a8c55fce06ab4dd5a615e46fa6a9b9a6fb3 (diff)
parentbefa207bfa3709c7292252654a5bb9384d950a02 (diff)
downloadscummvm-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.cpp47
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