diff options
Diffstat (limited to 'engines/sci/scicore/decompressor.h')
-rw-r--r-- | engines/sci/scicore/decompressor.h | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/engines/sci/scicore/decompressor.h b/engines/sci/scicore/decompressor.h new file mode 100644 index 0000000000..3f8bd147c3 --- /dev/null +++ b/engines/sci/scicore/decompressor.h @@ -0,0 +1,179 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCI_SCICORE_DECOMPRESSOR_H +#define SCI_SCICORE_DECOMPRESSOR_H + +#include "common/file.h" + +namespace Sci { +enum ResourceCompression { + kCompUnknown = -1, + kCompNone = 0, + kCompLZW, + kCompHuffman, + kComp3, // LZW-like compression used in SCI01 and SCI1 + kComp3View, // Comp3 + view Post-processing + kComp3Pic, // Comp3 + pic Post-processing + kCompDCL, + kCompSTACpack // ? Used in SCI32 +}; +//---------------------------------------------- +// Base class for decompressors +// Simply copies nPacked bytes from src to dest +//---------------------------------------------- +class Decompressor { +public: + Decompressor(){} + ~Decompressor(){} + + //! get a number of bits from _src stream + /** @param n - number of bits to get + @return (uint32) n-bits number + */ + virtual int unpack(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); + +protected: + //! Initialize decompressor + /** @param src - source stream to read from + @param dest - destination stream to write to + @param nPacked - size of packed data + @param nUnpacket - size of unpacked data + @return (int) 0 on success, non-zero on error + */ + virtual void init(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); //! get one bit from _src stream + /** @return (bool) bit; + */ + virtual bool getBit(); + //! get a number of bits from _src stream + /** @param n - number of bits to get + @return (uint32) n-bits number + */ + virtual uint32 getBits(int n); + //! put byte to _dest stream + /** @param b - byte to put + */ + virtual void putByte(byte b); + virtual void fetchBits(); + + uint32 _dwBits; + byte _nBits; + + uint32 _szPacked; + uint32 _szUnpacked; + uint32 _dwRead; + uint32 _dwWrote; + + Common::ReadStream *_src; + Common::WriteStream *_dest; +}; + +//---------------------------------------------- +// Huffman decompressor +//---------------------------------------------- +class DecompressorHuffman : public Decompressor { +public: + int unpack(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); + +protected: + int16 getc2(); + + byte *_nodes; +}; + +//---------------------------------------------- +// LZW-like decompressor for SCI01/SCI1 +// TODO: Needs clean-up of post-processing fncs +//---------------------------------------------- +class DecompressorComp3 : public Decompressor { +public: + DecompressorComp3(int nCompression) { + _compression = nCompression; + } + void init(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, uint32 nUnpacked); + int unpack(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); + +protected: + // actual unpacking procedure + int doUnpack(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); + // functions to post-process view and pic resources + void decode_rle(byte **rledata, byte **pixeldata, byte *outbuffer, int size); + int rle_size(byte *rledata, int dsize); + void pic_reorder(byte *inbuffer, byte *outbuffer, int dsize); + void build_cel_headers(byte **seeker, byte **writer, int celindex, int *cc_lengths, int max); + void view_reorder(byte *inbuffer, byte *outbuffer); + + struct tokenlist { + byte data; + uint16 next; + } _tokens[0x1004]; + byte _stak[0x1014]; + byte _lastchar; + uint16 _stakptr; + uint16 _numbits, _lastbits; + uint16 _curtoken, _endtoken; + int _compression; +}; + +//---------------------------------------------- +// LZW 9-12 bits decompressor for SCI0 +// TODO : Needs clean-up of doUnpack() +//---------------------------------------------- +class DecompressorLZW : public Decompressor { +public: +// void init(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, uint32 nUnpacked); + int unpack(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); + +protected: + int doUnpack(byte *src, byte *dest, int length, int complength); + +}; + +//---------------------------------------------- +// DCL decompressor for SCI1.1 +// TODO : Needs clean-up of doUnpack() +//---------------------------------------------- +class DecompressorDCL : public Decompressor { +public: +// void init(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, uint32 nUnpacked); + int unpack(Common::ReadStream *src, Common::WriteStream *dest, uint32 nPacked, + uint32 nUnpacked); + +protected: + int unpackDCL(byte *src, byte *dest, int length, int complength); + int getbits(struct bit_read_struct *inp, int bits); + int huffman_lookup(struct bit_read_struct *inp, int *tree); + +}; + +} // End of namespace Sci + +#endif // SCI_SCICORE_DECOMPRESSOR_H
\ No newline at end of file |