Evince
Evince is a document viewer capable of displaying multiple and single page document formats like PDF and Postscript.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Ppmd.h
Go to the documentation of this file.
1 /* Ppmd.h -- PPMD codec common code
2 2017-04-03 : Igor Pavlov : Public domain
3 This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
4 
5 #ifndef __PPMD_H
6 #define __PPMD_H
7 
8 #include "CpuArch.h"
9 
11 
12 #ifdef MY_CPU_32BIT
13  #define PPMD_32BIT
14 #endif
15 
16 #define PPMD_INT_BITS 7
17 #define PPMD_PERIOD_BITS 7
18 #define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS))
19 
20 #define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift))
21 #define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2)
22 #define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob))
23 #define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob))
24 
25 #define PPMD_N1 4
26 #define PPMD_N2 4
27 #define PPMD_N3 4
28 #define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4)
29 #define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4)
30 
31 #pragma pack(push, 1)
32 /* Most compilers works OK here even without #pragma pack(push, 1), but some GCC compilers need it. */
33 
34 /* SEE-contexts for PPM-contexts with masked symbols */
35 typedef struct
36 {
37  UInt16 Summ; /* Freq */
38  Byte Shift; /* Speed of Freq change; low Shift is for fast change */
39  Byte Count; /* Count to next change of Shift */
40 } CPpmd_See;
41 
42 #define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \
43  { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); }
44 
45 typedef struct
46 {
51 } CPpmd_State;
52 
53 #pragma pack(pop)
54 
55 typedef
56  #ifdef PPMD_32BIT
57  CPpmd_State *
58  #else
59  UInt32
60  #endif
62 
63 typedef
64  #ifdef PPMD_32BIT
65  void *
66  #else
67  UInt32
68  #endif
70 
71 typedef
72  #ifdef PPMD_32BIT
73  Byte *
74  #else
75  UInt32
76  #endif
78 
79 #define PPMD_SetAllBitsIn256Bytes(p) \
80  { size_t z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \
81  p[z+7] = p[z+6] = p[z+5] = p[z+4] = p[z+3] = p[z+2] = p[z+1] = p[z+0] = ~(size_t)0; }}
82 
84 
85 #endif