aboutsummaryrefslogtreecommitdiff
path: root/lib/UnrarXLib/coder.cpp
blob: d556f0e18c872ef141943617f5945db1c89d8865 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47


inline unsigned int RangeCoder::GetChar()
{
  return(UnpackRead->GetChar());
}


void RangeCoder::InitDecoder(Unpack *UnpackRead)
{
  RangeCoder::UnpackRead=UnpackRead;

  low=code=0;
  range=uint(-1);
  for (int i=0;i < 4;i++)
    code=(code << 8) | GetChar();
}


#define ARI_DEC_NORMALIZE(code,low,range,read)                             \
{                                                                          \
  while ((low^(low+range))<TOP || (range<BOT && ((range=-low&(BOT-1)),1))) \
  {                                                                        \
    code=(code << 8) | read->GetChar();                                    \
    range <<= 8;                                                           \
    low <<= 8;                                                             \
  }                                                                        \
}


inline int RangeCoder::GetCurrentCount() 
{
  return (code-low)/(range /= SubRange.scale);
}


inline uint RangeCoder::GetCurrentShiftCount(uint SHIFT) 
{
  return (code-low)/(range >>= SHIFT);
}


inline void RangeCoder::Decode()
{
  low += range*SubRange.LowCount;
  range *= SubRange.HighCount-SubRange.LowCount;
}