/* This file is part of libmspack. * (C) 2003-2004 Stuart Caie. * * The Quantum method was created by David Stafford, adapted by Microsoft * Corporation. * * libmspack is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License (LGPL) version 2.1 * * For further details, see the file COPYING.LIB distributed with libmspack */ namespace LibMSPackSharp.Compression { public class QTMDStream : CompressionStream { /// /// Decoding window /// public byte[] Window { get; set; } /// /// Window size /// public uint WindowSize { get; set; } /// /// Decompression offset within window /// public uint WindowPosition { get; set; } /// /// Bytes remaining for current frame /// public uint FrameTODO { get; set; } /// /// High: arith coding state /// public ushort High { get; set; } /// /// Low: arith coding state /// public ushort Low { get; set; } /// /// Current: arith coding state /// public ushort Current { get; set; } /// /// Have we started decoding a new frame? /// public byte HeaderRead { get; set; } // Four literal models, each representing 64 symbols /// /// For literals from 0 to 63 (selector = 0) /// public QTMDModel Model0 { get; set; } /// /// For literals from 64 to 127 (selector = 1) /// public QTMDModel Model1 { get; set; } /// /// For literals from 128 to 191 (selector = 2) /// public QTMDModel Model2 { get; set; } /// /// For literals from 129 to 255 (selector = 3) /// public QTMDModel Model3 { get; set; } // Three match models. /// /// For match with fixed length of 3 bytes /// public QTMDModel Model4 { get; set; } /// /// For match with fixed length of 4 bytes /// public QTMDModel Model5 { get; set; } /// /// For variable length match, encoded with model6len model /// public QTMDModel Model6 { get; set; } public QTMDModel Model6Len { get; set; } /// /// Selector model. 0-6 to say literal (0,1,2,3) or match (4,5,6) /// public QTMDModel Model7 { get; set; } // Symbol arrays for all models public QTMDModelSym[] Model0Symbols { get; set; } = new QTMDModelSym[64 + 1]; public QTMDModelSym[] Model1Symbols { get; set; } = new QTMDModelSym[64 + 1]; public QTMDModelSym[] Model2Symbols { get; set; } = new QTMDModelSym[64 + 1]; public QTMDModelSym[] Model3Symbols { get; set; } = new QTMDModelSym[64 + 1]; public QTMDModelSym[] Model4Symbols { get; set; } = new QTMDModelSym[24 + 1]; public QTMDModelSym[] Model5Symbols { get; set; } = new QTMDModelSym[36 + 1]; public QTMDModelSym[] Model6Symbols { get; set; } = new QTMDModelSym[42 + 1]; public QTMDModelSym[] Model6LenSymbols { get; set; } = new QTMDModelSym[27 + 1]; public QTMDModelSym[] Model7Symbols { get; set; } = new QTMDModelSym[7 + 1]; public override Error READ_BYTES(ref int i_ptr, ref int i_end, ref uint bitsLeft, ref uint bitBuffer) { Error error = READ_IF_NEEDED(ref i_ptr, ref i_end); if (error != Error.MSPACK_ERR_OK) return error; byte b0 = InputBuffer[i_ptr++]; error = READ_IF_NEEDED(ref i_ptr, ref i_end); if (error != Error.MSPACK_ERR_OK) return error; byte b1 = InputBuffer[i_ptr++]; INJECT_BITS((uint)((b0 << 8) | b1), 16, ref bitsLeft, ref bitBuffer); return Error.MSPACK_ERR_OK; } public override int HUFF_ERROR() => (int)Error.MSPACK_ERR_OK; } }