Mercurial > audlegacy
annotate Plugins/Input/console/libjma/lzmadec.cpp @ 1194:0c0a5ff7b20b trunk
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
author | nenolod |
---|---|
date | Tue, 13 Jun 2006 20:37:25 -0700 |
parents | |
children |
rev | line source |
---|---|
1194
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
1 /* |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
2 Copyright (C) 2005-2006 NSRT Team ( http://nsrt.edgeemu.com ) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
3 Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
4 Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
5 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
6 This library is free software; you can redistribute it and/or |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
7 modify it under the terms of the GNU Lesser General Public |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
8 License version 2.1 as published by the Free Software Foundation. |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
9 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
10 This library is distributed in the hope that it will be useful, |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
13 Lesser General Public License for more details. |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
14 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
18 */ |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
19 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
20 #include "portable.h" |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
21 #include "lzmadec.h" |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
22 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
23 #define RETURN_E_OUTOFMEMORY_IF_FALSE(x) { if (!(x)) return E_OUTOFMEMORY; } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
24 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
25 namespace NCompress { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
26 namespace NLZMA { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
27 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
28 HRESULT CDecoder::SetDictionarySize(UINT32 aDictionarySize) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
29 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
30 if (aDictionarySize > (1 << kDicLogSizeMax)) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
31 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
32 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
33 UINT32 aWindowReservSize = MyMax(aDictionarySize, UINT32(1 << 21)); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
34 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
35 if (m_DictionarySize != aDictionarySize) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
36 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
37 m_OutWindowStream.Create(aDictionarySize, kMatchMaxLen, aWindowReservSize); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
38 m_DictionarySize = aDictionarySize; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
39 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
40 return S_OK; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
41 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
42 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
43 HRESULT CDecoder::SetLiteralProperties( |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
44 UINT32 aLiteralPosStateBits, UINT32 aLiteralContextBits) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
45 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
46 if (aLiteralPosStateBits > 8) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
47 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
48 if (aLiteralContextBits > 8) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
49 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
50 m_LiteralDecoder.Create(aLiteralPosStateBits, aLiteralContextBits); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
51 return S_OK; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
52 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
53 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
54 HRESULT CDecoder::SetPosBitsProperties(UINT32 aNumPosStateBits) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
55 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
56 if (aNumPosStateBits > NLength::kNumPosStatesBitsMax) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
57 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
58 UINT32 aNumPosStates = 1 << aNumPosStateBits; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
59 m_LenDecoder.Create(aNumPosStates); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
60 m_RepMatchLenDecoder.Create(aNumPosStates); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
61 m_PosStateMask = aNumPosStates - 1; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
62 return S_OK; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
63 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
64 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
65 CDecoder::CDecoder(): |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
66 m_DictionarySize((UINT32)-1) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
67 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
68 Create(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
69 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
70 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
71 HRESULT CDecoder::Create() |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
72 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
73 for(int i = 0; i < kNumPosModels; i++) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
74 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
75 RETURN_E_OUTOFMEMORY_IF_FALSE( |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
76 m_PosDecoders[i].Create(kDistDirectBits[kStartPosModelIndex + i])); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
77 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
78 return S_OK; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
79 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
80 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
81 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
82 HRESULT CDecoder::Init(ISequentialInStream *anInStream, |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
83 ISequentialOutStream *anOutStream) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
84 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
85 m_RangeDecoder.Init(anInStream); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
86 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
87 m_OutWindowStream.Init(anOutStream); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
88 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
89 int i; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
90 for(i = 0; i < kNumStates; i++) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
91 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
92 for (UINT32 j = 0; j <= m_PosStateMask; j++) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
93 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
94 m_MainChoiceDecoders[i][j].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
95 m_MatchRepShortChoiceDecoders[i][j].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
96 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
97 m_MatchChoiceDecoders[i].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
98 m_MatchRepChoiceDecoders[i].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
99 m_MatchRep1ChoiceDecoders[i].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
100 m_MatchRep2ChoiceDecoders[i].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
101 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
102 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
103 m_LiteralDecoder.Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
104 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
105 // m_RepMatchLenDecoder.Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
106 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
107 for (i = 0; (UINT32) i < kNumLenToPosStates; i++) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
108 m_PosSlotDecoder[i].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
109 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
110 for(i = 0; i < kNumPosModels; i++) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
111 m_PosDecoders[i].Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
112 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
113 m_LenDecoder.Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
114 m_RepMatchLenDecoder.Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
115 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
116 m_PosAlignDecoder.Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
117 return S_OK; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
118 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
119 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
120 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
121 HRESULT CDecoder::CodeReal(ISequentialInStream *anInStream, |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
122 ISequentialOutStream *anOutStream, |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
123 const UINT64 *anInSize, const UINT64 *anOutSize) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
124 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
125 if (anOutSize == NULL) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
126 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
127 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
128 Init(anInStream, anOutStream); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
129 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
130 CState aState; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
131 aState.Init(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
132 bool aPeviousIsMatch = false; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
133 BYTE aPreviousByte = 0; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
134 UINT32 aRepDistances[kNumRepDistances]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
135 for(UINT32 i = 0 ; i < kNumRepDistances; i++) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
136 aRepDistances[i] = 0; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
137 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
138 UINT64 aNowPos64 = 0; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
139 UINT64 aSize = *anOutSize; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
140 while(aNowPos64 < aSize) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
141 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
142 UINT64 aNext = MyMin(aNowPos64 + (1 << 18), aSize); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
143 while(aNowPos64 < aNext) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
144 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
145 UINT32 aPosState = UINT32(aNowPos64) & m_PosStateMask; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
146 if (m_MainChoiceDecoders[aState.m_Index][aPosState].Decode(&m_RangeDecoder) == (UINT32) kMainChoiceLiteralIndex) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
147 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
148 // aCounts[0]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
149 aState.UpdateChar(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
150 if(aPeviousIsMatch) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
151 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
152 BYTE aMatchByte = m_OutWindowStream.GetOneByte(0 - aRepDistances[0] - 1); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
153 aPreviousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder, |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
154 UINT32(aNowPos64), aPreviousByte, aMatchByte); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
155 aPeviousIsMatch = false; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
156 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
157 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
158 aPreviousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder, |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
159 UINT32(aNowPos64), aPreviousByte); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
160 m_OutWindowStream.PutOneByte(aPreviousByte); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
161 aNowPos64++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
162 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
163 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
164 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
165 aPeviousIsMatch = true; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
166 UINT32 aDistance, aLen; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
167 if(m_MatchChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
168 (UINT32) kMatchChoiceRepetitionIndex) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
169 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
170 if(m_MatchRepChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
171 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
172 if(m_MatchRepShortChoiceDecoders[aState.m_Index][aPosState].Decode(&m_RangeDecoder) == 0) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
173 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
174 aState.UpdateShortRep(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
175 aPreviousByte = m_OutWindowStream.GetOneByte(0 - aRepDistances[0] - 1); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
176 m_OutWindowStream.PutOneByte(aPreviousByte); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
177 aNowPos64++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
178 // aCounts[3 + 4]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
179 continue; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
180 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
181 // aCounts[3 + 0]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
182 aDistance = aRepDistances[0]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
183 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
184 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
185 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
186 if(m_MatchRep1ChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
187 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
188 aDistance = aRepDistances[1]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
189 aRepDistances[1] = aRepDistances[0]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
190 // aCounts[3 + 1]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
191 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
192 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
193 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
194 if (m_MatchRep2ChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
195 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
196 // aCounts[3 + 2]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
197 aDistance = aRepDistances[2]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
198 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
199 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
200 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
201 // aCounts[3 + 3]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
202 aDistance = aRepDistances[3]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
203 aRepDistances[3] = aRepDistances[2]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
204 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
205 aRepDistances[2] = aRepDistances[1]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
206 aRepDistances[1] = aRepDistances[0]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
207 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
208 aRepDistances[0] = aDistance; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
209 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
210 aLen = m_RepMatchLenDecoder.Decode(&m_RangeDecoder, aPosState) + kMatchMinLen; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
211 // aCounts[aLen]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
212 aState.UpdateRep(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
213 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
214 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
215 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
216 aLen = kMatchMinLen + m_LenDecoder.Decode(&m_RangeDecoder, aPosState); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
217 aState.UpdateMatch(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
218 UINT32 aPosSlot = m_PosSlotDecoder[GetLenToPosState(aLen)].Decode(&m_RangeDecoder); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
219 // aCounts[aPosSlot]++; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
220 if (aPosSlot >= (UINT32) kStartPosModelIndex) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
221 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
222 aDistance = kDistStart[aPosSlot]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
223 if (aPosSlot < (UINT32) kEndPosModelIndex) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
224 aDistance += m_PosDecoders[aPosSlot - kStartPosModelIndex].Decode(&m_RangeDecoder); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
225 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
226 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
227 aDistance += (m_RangeDecoder.DecodeDirectBits(kDistDirectBits[aPosSlot] - |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
228 kNumAlignBits) << kNumAlignBits); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
229 aDistance += m_PosAlignDecoder.Decode(&m_RangeDecoder); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
230 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
231 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
232 else |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
233 aDistance = aPosSlot; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
234 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
235 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
236 aRepDistances[3] = aRepDistances[2]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
237 aRepDistances[2] = aRepDistances[1]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
238 aRepDistances[1] = aRepDistances[0]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
239 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
240 aRepDistances[0] = aDistance; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
241 // UpdateStat(aLen, aPosSlot); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
242 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
243 if (aDistance >= aNowPos64) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
244 throw E_INVALIDDATA; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
245 m_OutWindowStream.CopyBackBlock(aDistance, aLen); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
246 aNowPos64 += aLen; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
247 aPreviousByte = m_OutWindowStream.GetOneByte(0 - 1); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
248 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
249 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
250 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
251 return Flush(); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
252 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
253 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
254 HRESULT CDecoder::Code(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
255 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
256 try { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
257 return CodeReal(anInStream, anOutStream, anInSize, anOutSize); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
258 } catch (HRESULT& e) { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
259 return e; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
260 } catch (...) { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
261 return E_FAIL; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
262 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
263 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
264 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
265 HRESULT CDecoder::ReadCoderProperties(ISequentialInStream *anInStream) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
266 { |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
267 UINT32 aNumPosStateBits; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
268 UINT32 aLiteralPosStateBits; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
269 UINT32 aLiteralContextBits; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
270 UINT32 aDictionarySize; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
271 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
272 UINT32 aProcessesedSize; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
273 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
274 BYTE aByte; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
275 RETURN_IF_NOT_S_OK(anInStream->Read(&aByte, sizeof(aByte), &aProcessesedSize)); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
276 if (aProcessesedSize != sizeof(aByte)) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
277 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
278 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
279 aLiteralContextBits = aByte % 9; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
280 BYTE aRemainder = aByte / 9; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
281 aLiteralPosStateBits = aRemainder % 5; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
282 aNumPosStateBits = aRemainder / 5; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
283 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
284 UINT8 uint_buffer[UINT_SIZE]; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
285 RETURN_IF_NOT_S_OK(anInStream->Read(uint_buffer, sizeof(aDictionarySize), &aProcessesedSize)); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
286 aDictionarySize = charp_to_uint(uint_buffer); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
287 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
288 if (aProcessesedSize != sizeof(aDictionarySize)) |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
289 return E_INVALIDARG; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
290 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
291 RETURN_IF_NOT_S_OK(SetDictionarySize(aDictionarySize)); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
292 RETURN_IF_NOT_S_OK(SetLiteralProperties(aLiteralPosStateBits, aLiteralContextBits)); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
293 RETURN_IF_NOT_S_OK(SetPosBitsProperties(aNumPosStateBits)); |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
294 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
295 return S_OK; |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
296 } |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
297 |
0c0a5ff7b20b
[svn] - add libjma (a hopefully portable snapshot of the ZSNES JMA implementation)
nenolod
parents:
diff
changeset
|
298 }} |