diff options
author | Thomas Fach-Pedersen | 2014-05-16 21:58:49 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2016-09-29 22:21:00 +0200 |
commit | 2e3fd7cf050e24b9f6363b1a38c6ff45847c6d6f (patch) | |
tree | 225c2535e8f6ac3dd21ccc082c9d7e0d9573380f /engines/bladerunner/decompress_lzo.cpp | |
parent | c48dfb70718f971a76049061a1c2f8bc2f37bb46 (diff) | |
download | scummvm-rg350-2e3fd7cf050e24b9f6363b1a38c6ff45847c6d6f.tar.gz scummvm-rg350-2e3fd7cf050e24b9f6363b1a38c6ff45847c6d6f.tar.bz2 scummvm-rg350-2e3fd7cf050e24b9f6363b1a38c6ff45847c6d6f.zip |
BLADERUNNER: Start port to scummvm engine
Just shows the splash for now. VQA decoder partially ported but without
audio and some minor special features.
Diffstat (limited to 'engines/bladerunner/decompress_lzo.cpp')
-rw-r--r-- | engines/bladerunner/decompress_lzo.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/engines/bladerunner/decompress_lzo.cpp b/engines/bladerunner/decompress_lzo.cpp new file mode 100644 index 0000000000..147d11d56e --- /dev/null +++ b/engines/bladerunner/decompress_lzo.cpp @@ -0,0 +1,143 @@ +/* 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 "bladerunner/decompress_lzo.h" + +namespace BladeRunner { + +static inline +uint32 decode_count(const uint8 **pp) { + uint32 v = 0; + for (;!**pp;(*pp)++) + v += 255; + + v += **pp; + (*pp)++; + + return v; +} + +static inline +void copy(uint8 **dst, const uint8 **src, int count) { + assert(count > 0); + + uint8 *d = *dst; + const uint8 *s = *src; + + *dst += count; + *src += count; + + do { *d++ = *s++; } while (--count); +} + +int decompress_lzo1x(const uint8 *in, size_t inLen, uint8 *out, size_t *outLen) { + uint32 t; + uint8 *op; + const uint8 *ip, *m_pos; + const uint8 * const ip_end = in + inLen; + + *outLen = 0; + + op = out; + ip = in; + + if (*ip > 17) { + t = *ip++ - 17; + if (t < 4) + goto match_next; + copy(&op, &ip, t); + goto first_literal_run; + } + + for (;;) { + t = *ip++; + if (t >= 16) + goto match; + + if (t == 0) + t = 15 + decode_count(&ip); + copy(&op, &ip, t + 3); + +first_literal_run: + t = *ip++; + if (t >= 16) + goto match; + m_pos = op - 0x0801 - (t >> 2) - (*ip++ << 2); + copy(&op, &m_pos, 3); + goto match_done; + + for (;;) { +match: + if (t >= 64) + { + m_pos = op - 1 - ((t >> 2) & 7) - (*ip++ << 3); + t = (t >> 5) - 1; + goto copy_match; + } + else if (t >= 32) + { + t &= 31; + if (t == 0) + t = 31 + decode_count(&ip); + m_pos = op - 1 - (ip[0] >> 2) - (ip[1] << 6); + ip += 2; + } + else if (t >= 16) + { + m_pos = op - ((t & 8) << 11); + t &= 7; + if (t == 0) + t = 7 + decode_count(&ip); + m_pos -= (ip[0] >> 2) + (ip[1] << 6); + ip += 2; + if (m_pos == op) + goto eof_found; + m_pos -= 0x4000; + } + else + { + m_pos = op - 1 - (t >> 2) - (*ip++ << 2); + copy(&op, &m_pos, 2); + goto match_done; + } + +copy_match: + copy(&op, &m_pos, t + 2); + +match_done: + t = ip[-2] & 3; + if (t == 0) + break; + +match_next: + assert(t > 0 && t <= 3); + copy(&op, &ip, t); + t = *ip++; + } + } + +eof_found: + *outLen = op - out; + return ip != ip_end; +} + +}; // End of namespace BladeRunner |