source: trunk/libdjvu/ZPCodec.cpp @ 199

Last change on this file since 199 was 17, checked in by Eugene Romanenko, 16 years ago

update makefiles, remove absolute paths, update djvulibre to version 3.5.17

File size: 54.3 KB
Line 
1//C-  -*- C++ -*-
2//C- -------------------------------------------------------------------
3//C- DjVuLibre-3.5
4//C- Copyright (c) 2002  Leon Bottou and Yann Le Cun.
5//C- Copyright (c) 2001  AT&T
6//C-
7//C- This software is subject to, and may be distributed under, the
8//C- GNU General Public License, Version 2. The license should have
9//C- accompanied the software or you may obtain a copy of the license
10//C- from the Free Software Foundation at http://www.fsf.org .
11//C-
12//C- This program is distributed in the hope that it will be useful,
13//C- but WITHOUT ANY WARRANTY; without even the implied warranty of
14//C- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15//C- GNU General Public License for more details.
16//C-
17//C- DjVuLibre-3.5 is derived from the DjVu(r) Reference Library
18//C- distributed by Lizardtech Software.  On July 19th 2002, Lizardtech
19//C- Software authorized us to replace the original DjVu(r) Reference
20//C- Library notice by the following text (see doc/lizard2002.djvu):
21//C-
22//C-  ------------------------------------------------------------------
23//C- | DjVu (r) Reference Library (v. 3.5)
24//C- | Copyright (c) 1999-2001 LizardTech, Inc. All Rights Reserved.
25//C- | The DjVu Reference Library is protected by U.S. Pat. No.
26//C- | 6,058,214 and patents pending.
27//C- |
28//C- | This software is subject to, and may be distributed under, the
29//C- | GNU General Public License, Version 2. The license should have
30//C- | accompanied the software or you may obtain a copy of the license
31//C- | from the Free Software Foundation at http://www.fsf.org .
32//C- |
33//C- | The computer code originally released by LizardTech under this
34//C- | license and unmodified by other parties is deemed "the LIZARDTECH
35//C- | ORIGINAL CODE."  Subject to any third party intellectual property
36//C- | claims, LizardTech grants recipient a worldwide, royalty-free,
37//C- | non-exclusive license to make, use, sell, or otherwise dispose of
38//C- | the LIZARDTECH ORIGINAL CODE or of programs derived from the
39//C- | LIZARDTECH ORIGINAL CODE in compliance with the terms of the GNU
40//C- | General Public License.   This grant only confers the right to
41//C- | infringe patent claims underlying the LIZARDTECH ORIGINAL CODE to
42//C- | the extent such infringement is reasonably necessary to enable
43//C- | recipient to make, have made, practice, sell, or otherwise dispose
44//C- | of the LIZARDTECH ORIGINAL CODE (or portions thereof) and not to
45//C- | any greater extent that may be necessary to utilize further
46//C- | modifications or combinations.
47//C- |
48//C- | The LIZARDTECH ORIGINAL CODE is provided "AS IS" WITHOUT WARRANTY
49//C- | OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
50//C- | TO ANY WARRANTY OF NON-INFRINGEMENT, OR ANY IMPLIED WARRANTY OF
51//C- | MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
52//C- +------------------------------------------------------------------
53//
54// $Id: ZPCodec.cpp,v 1.10 2004/08/06 14:49:34 leonb Exp $
55// $Name:  $
56
57#ifdef HAVE_CONFIG_H
58# include "config.h"
59#endif
60#if NEED_GNUG_PRAGMAS
61# pragma implementation
62#endif
63
64// From: Leon Bottou, 1/31/2002
65// Almost equal to my initial code.
66
67#include "ZPCodec.h"
68#include "ByteStream.h"
69#include "GException.h"
70#include <stdlib.h>
71#include <assert.h>
72#include <math.h>
73#include <stdio.h>
74
75
76#ifdef HAVE_NAMESPACES
77namespace DJVU {
78# ifdef NOT_DEFINED // Just to fool emacs c++ mode
79}
80#endif
81#endif
82
83////////////////////////////////////////////////////////////////
84// CODER SPECIFICATION
85////////////////////////////////////////////////////////////////
86
87
88#ifndef ZPCODER
89#ifndef ZCODER
90#define ZPCODER
91#endif
92#endif
93#ifdef ZCODER
94
95// The ZCODER option is provided for documentation purposes only. The ZCODER
96// might come dangerously close to U.S. patent 5059976 (Mitsubishi).  This is
97// why we always use the ZPCODER, although it usually produces 1% larger files.
98#warning "The ZCODER may infringe non-LizardTech patent(s)."
99#warning "You should use the ZPCODER instead."
100#endif
101
102
103////////////////////////////////////////////////////////////////
104// ZP CODER DEFAULT ADAPTATION TABLE
105////////////////////////////////////////////////////////////////
106
107
108// See ZPCodec::ZPCodec to see how this
109// default table is modified when not
110// using the DjVu compatibility mode.
111
112
113static ZPCodec::Table default_ztable[256] = 
114{
115#ifdef ZPCODER
116  /* This table has been designed for the ZPCoder
117   * by running the following command in file 'zptable.sn':
118   * (fast-crude (steady-mat 0.0035  0.0002) 260)))
119   */
120  { 0x8000,  0x0000,  84, 145 },    /* 000: p=0.500000 (    0,    0) */
121  { 0x8000,  0x0000,   3,   4 },    /* 001: p=0.500000 (    0,    0) */
122  { 0x8000,  0x0000,   4,   3 },    /* 002: p=0.500000 (    0,    0) */
123  { 0x6bbd,  0x10a5,   5,   1 },    /* 003: p=0.465226 (    0,    0) */
124  { 0x6bbd,  0x10a5,   6,   2 },    /* 004: p=0.465226 (    0,    0) */
125  { 0x5d45,  0x1f28,   7,   3 },    /* 005: p=0.430708 (    0,    0) */
126  { 0x5d45,  0x1f28,   8,   4 },    /* 006: p=0.430708 (    0,    0) */
127  { 0x51b9,  0x2bd3,   9,   5 },    /* 007: p=0.396718 (    0,    0) */
128  { 0x51b9,  0x2bd3,  10,   6 },    /* 008: p=0.396718 (    0,    0) */
129  { 0x4813,  0x36e3,  11,   7 },    /* 009: p=0.363535 (    0,    0) */
130  { 0x4813,  0x36e3,  12,   8 },    /* 010: p=0.363535 (    0,    0) */
131  { 0x3fd5,  0x408c,  13,   9 },    /* 011: p=0.331418 (    0,    0) */
132  { 0x3fd5,  0x408c,  14,  10 },    /* 012: p=0.331418 (    0,    0) */
133  { 0x38b1,  0x48fd,  15,  11 },    /* 013: p=0.300585 (    0,    0) */
134  { 0x38b1,  0x48fd,  16,  12 },    /* 014: p=0.300585 (    0,    0) */
135  { 0x3275,  0x505d,  17,  13 },    /* 015: p=0.271213 (    0,    0) */
136  { 0x3275,  0x505d,  18,  14 },    /* 016: p=0.271213 (    0,    0) */
137  { 0x2cfd,  0x56d0,  19,  15 },    /* 017: p=0.243438 (    0,    0) */
138  { 0x2cfd,  0x56d0,  20,  16 },    /* 018: p=0.243438 (    0,    0) */
139  { 0x2825,  0x5c71,  21,  17 },    /* 019: p=0.217391 (    0,    0) */
140  { 0x2825,  0x5c71,  22,  18 },    /* 020: p=0.217391 (    0,    0) */
141  { 0x23ab,  0x615b,  23,  19 },    /* 021: p=0.193150 (    0,    0) */
142  { 0x23ab,  0x615b,  24,  20 },    /* 022: p=0.193150 (    0,    0) */
143  { 0x1f87,  0x65a5,  25,  21 },    /* 023: p=0.170728 (    0,    0) */
144  { 0x1f87,  0x65a5,  26,  22 },    /* 024: p=0.170728 (    0,    0) */
145  { 0x1bbb,  0x6962,  27,  23 },    /* 025: p=0.150158 (    0,    0) */
146  { 0x1bbb,  0x6962,  28,  24 },    /* 026: p=0.150158 (    0,    0) */
147  { 0x1845,  0x6ca2,  29,  25 },    /* 027: p=0.131418 (    0,    0) */
148  { 0x1845,  0x6ca2,  30,  26 },    /* 028: p=0.131418 (    0,    0) */
149  { 0x1523,  0x6f74,  31,  27 },    /* 029: p=0.114460 (    0,    0) */
150  { 0x1523,  0x6f74,  32,  28 },    /* 030: p=0.114460 (    0,    0) */
151  { 0x1253,  0x71e6,  33,  29 },    /* 031: p=0.099230 (    0,    0) */
152  { 0x1253,  0x71e6,  34,  30 },    /* 032: p=0.099230 (    0,    0) */
153  { 0x0fcf,  0x7404,  35,  31 },    /* 033: p=0.085611 (    0,    0) */
154  { 0x0fcf,  0x7404,  36,  32 },    /* 034: p=0.085611 (    0,    0) */
155  { 0x0d95,  0x75d6,  37,  33 },    /* 035: p=0.073550 (    0,    0) */
156  { 0x0d95,  0x75d6,  38,  34 },    /* 036: p=0.073550 (    0,    0) */
157  { 0x0b9d,  0x7768,  39,  35 },    /* 037: p=0.062888 (    0,    0) */
158  { 0x0b9d,  0x7768,  40,  36 },    /* 038: p=0.062888 (    0,    0) */
159  { 0x09e3,  0x78c2,  41,  37 },    /* 039: p=0.053539 (    0,    0) */
160  { 0x09e3,  0x78c2,  42,  38 },    /* 040: p=0.053539 (    0,    0) */
161  { 0x0861,  0x79ea,  43,  39 },    /* 041: p=0.045365 (    0,    0) */
162  { 0x0861,  0x79ea,  44,  40 },    /* 042: p=0.045365 (    0,    0) */
163  { 0x0711,  0x7ae7,  45,  41 },    /* 043: p=0.038272 (    0,    0) */
164  { 0x0711,  0x7ae7,  46,  42 },    /* 044: p=0.038272 (    0,    0) */
165  { 0x05f1,  0x7bbe,  47,  43 },    /* 045: p=0.032174 (    0,    0) */
166  { 0x05f1,  0x7bbe,  48,  44 },    /* 046: p=0.032174 (    0,    0) */
167  { 0x04f9,  0x7c75,  49,  45 },    /* 047: p=0.026928 (    0,    0) */
168  { 0x04f9,  0x7c75,  50,  46 },    /* 048: p=0.026928 (    0,    0) */
169  { 0x0425,  0x7d0f,  51,  47 },    /* 049: p=0.022444 (    0,    0) */
170  { 0x0425,  0x7d0f,  52,  48 },    /* 050: p=0.022444 (    0,    0) */
171  { 0x0371,  0x7d91,  53,  49 },    /* 051: p=0.018636 (    0,    0) */
172  { 0x0371,  0x7d91,  54,  50 },    /* 052: p=0.018636 (    0,    0) */
173  { 0x02d9,  0x7dfe,  55,  51 },    /* 053: p=0.015421 (    0,    0) */
174  { 0x02d9,  0x7dfe,  56,  52 },    /* 054: p=0.015421 (    0,    0) */
175  { 0x0259,  0x7e5a,  57,  53 },    /* 055: p=0.012713 (    0,    0) */
176  { 0x0259,  0x7e5a,  58,  54 },    /* 056: p=0.012713 (    0,    0) */
177  { 0x01ed,  0x7ea6,  59,  55 },    /* 057: p=0.010419 (    0,    0) */
178  { 0x01ed,  0x7ea6,  60,  56 },    /* 058: p=0.010419 (    0,    0) */
179  { 0x0193,  0x7ee6,  61,  57 },    /* 059: p=0.008525 (    0,    0) */
180  { 0x0193,  0x7ee6,  62,  58 },    /* 060: p=0.008525 (    0,    0) */
181  { 0x0149,  0x7f1a,  63,  59 },    /* 061: p=0.006959 (    0,    0) */
182  { 0x0149,  0x7f1a,  64,  60 },    /* 062: p=0.006959 (    0,    0) */
183  { 0x010b,  0x7f45,  65,  61 },    /* 063: p=0.005648 (    0,    0) */
184  { 0x010b,  0x7f45,  66,  62 },    /* 064: p=0.005648 (    0,    0) */
185  { 0x00d5,  0x7f6b,  67,  63 },    /* 065: p=0.004506 (    0,    0) */
186  { 0x00d5,  0x7f6b,  68,  64 },    /* 066: p=0.004506 (    0,    0) */
187  { 0x00a5,  0x7f8d,  69,  65 },    /* 067: p=0.003480 (    0,    0) */
188  { 0x00a5,  0x7f8d,  70,  66 },    /* 068: p=0.003480 (    0,    0) */
189  { 0x007b,  0x7faa,  71,  67 },    /* 069: p=0.002602 (    0,    0) */
190  { 0x007b,  0x7faa,  72,  68 },    /* 070: p=0.002602 (    0,    0) */
191  { 0x0057,  0x7fc3,  73,  69 },    /* 071: p=0.001843 (    0,    0) */
192  { 0x0057,  0x7fc3,  74,  70 },    /* 072: p=0.001843 (    0,    0) */
193  { 0x003b,  0x7fd7,  75,  71 },    /* 073: p=0.001248 (    0,    0) */
194  { 0x003b,  0x7fd7,  76,  72 },    /* 074: p=0.001248 (    0,    0) */
195  { 0x0023,  0x7fe7,  77,  73 },    /* 075: p=0.000749 (    0,    0) */
196  { 0x0023,  0x7fe7,  78,  74 },    /* 076: p=0.000749 (    0,    0) */
197  { 0x0013,  0x7ff2,  79,  75 },    /* 077: p=0.000402 (    0,    0) */
198  { 0x0013,  0x7ff2,  80,  76 },    /* 078: p=0.000402 (    0,    0) */
199  { 0x0007,  0x7ffa,  81,  77 },    /* 079: p=0.000153 (    0,    0) */
200  { 0x0007,  0x7ffa,  82,  78 },    /* 080: p=0.000153 (    0,    0) */
201  { 0x0001,  0x7fff,  81,  79 },    /* 081: p=0.000027 (    0,    0) */
202  { 0x0001,  0x7fff,  82,  80 },    /* 082: p=0.000027 (    0,    0) */
203  { 0x5695,  0x0000,   9,  85 },    /* 083: p=0.411764 (    2,    3) */
204  { 0x24ee,  0x0000,  86, 226 },    /* 084: p=0.199988 (    1,    0) */
205  { 0x8000,  0x0000,   5,   6 },    /* 085: p=0.500000 (    3,    3) */
206  { 0x0d30,  0x0000,  88, 176 },    /* 086: p=0.071422 (    4,    0) */
207  { 0x481a,  0x0000,  89, 143 },    /* 087: p=0.363634 (    1,    2) */
208  { 0x0481,  0x0000,  90, 138 },    /* 088: p=0.024388 (   13,    0) */
209  { 0x3579,  0x0000,  91, 141 },    /* 089: p=0.285711 (    1,    3) */
210  { 0x017a,  0x0000,  92, 112 },    /* 090: p=0.007999 (   41,    0) */
211  { 0x24ef,  0x0000,  93, 135 },    /* 091: p=0.199997 (    1,    5) */
212  { 0x007b,  0x0000,  94, 104 },    /* 092: p=0.002611 (  127,    0) */
213  { 0x1978,  0x0000,  95, 133 },    /* 093: p=0.137929 (    1,    8) */
214  { 0x0028,  0x0000,  96, 100 },    /* 094: p=0.000849 (  392,    0) */
215  { 0x10ca,  0x0000,  97, 129 },    /* 095: p=0.090907 (    1,   13) */
216  { 0x000d,  0x0000,  82,  98 },    /* 096: p=0.000276 ( 1208,    0) */
217  { 0x0b5d,  0x0000,  99, 127 },    /* 097: p=0.061537 (    1,   20) */
218  { 0x0034,  0x0000,  76,  72 },    /* 098: p=0.001102 ( 1208,    1) */
219  { 0x078a,  0x0000, 101, 125 },    /* 099: p=0.040815 (    1,   31) */
220  { 0x00a0,  0x0000,  70, 102 },    /* 100: p=0.003387 (  392,    1) */
221  { 0x050f,  0x0000, 103, 123 },    /* 101: p=0.027397 (    1,   47) */
222  { 0x0117,  0x0000,  66,  60 },    /* 102: p=0.005912 (  392,    2) */
223  { 0x0358,  0x0000, 105, 121 },    /* 103: p=0.018099 (    1,   72) */
224  { 0x01ea,  0x0000, 106, 110 },    /* 104: p=0.010362 (  127,    1) */
225  { 0x0234,  0x0000, 107, 119 },    /* 105: p=0.011940 (    1,  110) */
226  { 0x0144,  0x0000,  66, 108 },    /* 106: p=0.006849 (  193,    1) */
227  { 0x0173,  0x0000, 109, 117 },    /* 107: p=0.007858 (    1,  168) */
228  { 0x0234,  0x0000,  60,  54 },    /* 108: p=0.011925 (  193,    2) */
229  { 0x00f5,  0x0000, 111, 115 },    /* 109: p=0.005175 (    1,  256) */
230  { 0x0353,  0x0000,  56,  48 },    /* 110: p=0.017995 (  127,    2) */
231  { 0x00a1,  0x0000,  69, 113 },    /* 111: p=0.003413 (    1,  389) */
232  { 0x05c5,  0x0000, 114, 134 },    /* 112: p=0.031249 (   41,    1) */
233  { 0x011a,  0x0000,  65,  59 },    /* 113: p=0.005957 (    2,  389) */
234  { 0x03cf,  0x0000, 116, 132 },    /* 114: p=0.020618 (   63,    1) */
235  { 0x01aa,  0x0000,  61,  55 },    /* 115: p=0.009020 (    2,  256) */
236  { 0x0285,  0x0000, 118, 130 },    /* 116: p=0.013652 (   96,    1) */
237  { 0x0286,  0x0000,  57,  51 },    /* 117: p=0.013672 (    2,  168) */
238  { 0x01ab,  0x0000, 120, 128 },    /* 118: p=0.009029 (  146,    1) */
239  { 0x03d3,  0x0000,  53,  47 },    /* 119: p=0.020710 (    2,  110) */
240  { 0x011a,  0x0000, 122, 126 },    /* 120: p=0.005961 (  222,    1) */
241  { 0x05c5,  0x0000,  49,  41 },    /* 121: p=0.031250 (    2,   72) */
242  { 0x00ba,  0x0000, 124,  62 },    /* 122: p=0.003925 (  338,    1) */
243  { 0x08ad,  0x0000,  43,  37 },    /* 123: p=0.046979 (    2,   47) */
244  { 0x007a,  0x0000,  72,  66 },    /* 124: p=0.002586 (  514,    1) */
245  { 0x0ccc,  0x0000,  39,  31 },    /* 125: p=0.069306 (    2,   31) */
246  { 0x01eb,  0x0000,  60,  54 },    /* 126: p=0.010386 (  222,    2) */
247  { 0x1302,  0x0000,  33,  25 },    /* 127: p=0.102940 (    2,   20) */
248  { 0x02e6,  0x0000,  56,  50 },    /* 128: p=0.015695 (  146,    2) */
249  { 0x1b81,  0x0000,  29, 131 },    /* 129: p=0.148935 (    2,   13) */
250  { 0x045e,  0x0000,  52,  46 },    /* 130: p=0.023648 (   96,    2) */
251  { 0x24ef,  0x0000,  23,  17 },    /* 131: p=0.199999 (    3,   13) */
252  { 0x0690,  0x0000,  48,  40 },    /* 132: p=0.035533 (   63,    2) */
253  { 0x2865,  0x0000,  23,  15 },    /* 133: p=0.218748 (    2,    8) */
254  { 0x09de,  0x0000,  42, 136 },    /* 134: p=0.053434 (   41,    2) */
255  { 0x3987,  0x0000, 137,   7 },    /* 135: p=0.304346 (    2,    5) */
256  { 0x0dc8,  0x0000,  38,  32 },    /* 136: p=0.074626 (   41,    3) */
257  { 0x2c99,  0x0000,  21, 139 },    /* 137: p=0.241378 (    2,    7) */
258  { 0x10ca,  0x0000, 140, 172 },    /* 138: p=0.090907 (   13,    1) */
259  { 0x3b5f,  0x0000,  15,   9 },    /* 139: p=0.312499 (    3,    7) */
260  { 0x0b5d,  0x0000, 142, 170 },    /* 140: p=0.061537 (   20,    1) */
261  { 0x5695,  0x0000,   9,  85 },    /* 141: p=0.411764 (    2,    3) */
262  { 0x078a,  0x0000, 144, 168 },    /* 142: p=0.040815 (   31,    1) */
263  { 0x8000,  0x0000, 141, 248 },    /* 143: p=0.500000 (    2,    2) */
264  { 0x050f,  0x0000, 146, 166 },    /* 144: p=0.027397 (   47,    1) */
265  { 0x24ee,  0x0000, 147, 247 },    /* 145: p=0.199988 (    0,    1) */
266  { 0x0358,  0x0000, 148, 164 },    /* 146: p=0.018099 (   72,    1) */
267  { 0x0d30,  0x0000, 149, 197 },    /* 147: p=0.071422 (    0,    4) */
268  { 0x0234,  0x0000, 150, 162 },    /* 148: p=0.011940 (  110,    1) */
269  { 0x0481,  0x0000, 151,  95 },    /* 149: p=0.024388 (    0,   13) */
270  { 0x0173,  0x0000, 152, 160 },    /* 150: p=0.007858 (  168,    1) */
271  { 0x017a,  0x0000, 153, 173 },    /* 151: p=0.007999 (    0,   41) */
272  { 0x00f5,  0x0000, 154, 158 },    /* 152: p=0.005175 (  256,    1) */
273  { 0x007b,  0x0000, 155, 165 },    /* 153: p=0.002611 (    0,  127) */
274  { 0x00a1,  0x0000,  70, 156 },    /* 154: p=0.003413 (  389,    1) */
275  { 0x0028,  0x0000, 157, 161 },    /* 155: p=0.000849 (    0,  392) */
276  { 0x011a,  0x0000,  66,  60 },    /* 156: p=0.005957 (  389,    2) */
277  { 0x000d,  0x0000,  81, 159 },    /* 157: p=0.000276 (    0, 1208) */
278  { 0x01aa,  0x0000,  62,  56 },    /* 158: p=0.009020 (  256,    2) */
279  { 0x0034,  0x0000,  75,  71 },    /* 159: p=0.001102 (    1, 1208) */
280  { 0x0286,  0x0000,  58,  52 },    /* 160: p=0.013672 (  168,    2) */
281  { 0x00a0,  0x0000,  69, 163 },    /* 161: p=0.003387 (    1,  392) */
282  { 0x03d3,  0x0000,  54,  48 },    /* 162: p=0.020710 (  110,    2) */
283  { 0x0117,  0x0000,  65,  59 },    /* 163: p=0.005912 (    2,  392) */
284  { 0x05c5,  0x0000,  50,  42 },    /* 164: p=0.031250 (   72,    2) */
285  { 0x01ea,  0x0000, 167, 171 },    /* 165: p=0.010362 (    1,  127) */
286  { 0x08ad,  0x0000,  44,  38 },    /* 166: p=0.046979 (   47,    2) */
287  { 0x0144,  0x0000,  65, 169 },    /* 167: p=0.006849 (    1,  193) */
288  { 0x0ccc,  0x0000,  40,  32 },    /* 168: p=0.069306 (   31,    2) */
289  { 0x0234,  0x0000,  59,  53 },    /* 169: p=0.011925 (    2,  193) */
290  { 0x1302,  0x0000,  34,  26 },    /* 170: p=0.102940 (   20,    2) */
291  { 0x0353,  0x0000,  55,  47 },    /* 171: p=0.017995 (    2,  127) */
292  { 0x1b81,  0x0000,  30, 174 },    /* 172: p=0.148935 (   13,    2) */
293  { 0x05c5,  0x0000, 175, 193 },    /* 173: p=0.031249 (    1,   41) */
294  { 0x24ef,  0x0000,  24,  18 },    /* 174: p=0.199999 (   13,    3) */
295  { 0x03cf,  0x0000, 177, 191 },    /* 175: p=0.020618 (    1,   63) */
296  { 0x2b74,  0x0000, 178, 222 },    /* 176: p=0.235291 (    4,    1) */
297  { 0x0285,  0x0000, 179, 189 },    /* 177: p=0.013652 (    1,   96) */
298  { 0x201d,  0x0000, 180, 218 },    /* 178: p=0.173910 (    6,    1) */
299  { 0x01ab,  0x0000, 181, 187 },    /* 179: p=0.009029 (    1,  146) */
300  { 0x1715,  0x0000, 182, 216 },    /* 180: p=0.124998 (    9,    1) */
301  { 0x011a,  0x0000, 183, 185 },    /* 181: p=0.005961 (    1,  222) */
302  { 0x0fb7,  0x0000, 184, 214 },    /* 182: p=0.085105 (   14,    1) */
303  { 0x00ba,  0x0000,  69,  61 },    /* 183: p=0.003925 (    1,  338) */
304  { 0x0a67,  0x0000, 186, 212 },    /* 184: p=0.056337 (   22,    1) */
305  { 0x01eb,  0x0000,  59,  53 },    /* 185: p=0.010386 (    2,  222) */
306  { 0x06e7,  0x0000, 188, 210 },    /* 186: p=0.037382 (   34,    1) */
307  { 0x02e6,  0x0000,  55,  49 },    /* 187: p=0.015695 (    2,  146) */
308  { 0x0496,  0x0000, 190, 208 },    /* 188: p=0.024844 (   52,    1) */
309  { 0x045e,  0x0000,  51,  45 },    /* 189: p=0.023648 (    2,   96) */
310  { 0x030d,  0x0000, 192, 206 },    /* 190: p=0.016529 (   79,    1) */
311  { 0x0690,  0x0000,  47,  39 },    /* 191: p=0.035533 (    2,   63) */
312  { 0x0206,  0x0000, 194, 204 },    /* 192: p=0.010959 (  120,    1) */
313  { 0x09de,  0x0000,  41, 195 },    /* 193: p=0.053434 (    2,   41) */
314  { 0x0155,  0x0000, 196, 202 },    /* 194: p=0.007220 (  183,    1) */
315  { 0x0dc8,  0x0000,  37,  31 },    /* 195: p=0.074626 (    3,   41) */
316  { 0x00e1,  0x0000, 198, 200 },    /* 196: p=0.004750 (  279,    1) */
317  { 0x2b74,  0x0000, 199, 243 },    /* 197: p=0.235291 (    1,    4) */
318  { 0x0094,  0x0000,  72,  64 },    /* 198: p=0.003132 (  424,    1) */
319  { 0x201d,  0x0000, 201, 239 },    /* 199: p=0.173910 (    1,    6) */
320  { 0x0188,  0x0000,  62,  56 },    /* 200: p=0.008284 (  279,    2) */
321  { 0x1715,  0x0000, 203, 237 },    /* 201: p=0.124998 (    1,    9) */
322  { 0x0252,  0x0000,  58,  52 },    /* 202: p=0.012567 (  183,    2) */
323  { 0x0fb7,  0x0000, 205, 235 },    /* 203: p=0.085105 (    1,   14) */
324  { 0x0383,  0x0000,  54,  48 },    /* 204: p=0.019021 (  120,    2) */
325  { 0x0a67,  0x0000, 207, 233 },    /* 205: p=0.056337 (    1,   22) */
326  { 0x0547,  0x0000,  50,  44 },    /* 206: p=0.028571 (   79,    2) */
327  { 0x06e7,  0x0000, 209, 231 },    /* 207: p=0.037382 (    1,   34) */
328  { 0x07e2,  0x0000,  46,  38 },    /* 208: p=0.042682 (   52,    2) */
329  { 0x0496,  0x0000, 211, 229 },    /* 209: p=0.024844 (    1,   52) */
330  { 0x0bc0,  0x0000,  40,  34 },    /* 210: p=0.063636 (   34,    2) */
331  { 0x030d,  0x0000, 213, 227 },    /* 211: p=0.016529 (    1,   79) */
332  { 0x1178,  0x0000,  36,  28 },    /* 212: p=0.094593 (   22,    2) */
333  { 0x0206,  0x0000, 215, 225 },    /* 213: p=0.010959 (    1,  120) */
334  { 0x19da,  0x0000,  30,  22 },    /* 214: p=0.139999 (   14,    2) */
335  { 0x0155,  0x0000, 217, 223 },    /* 215: p=0.007220 (    1,  183) */
336  { 0x24ef,  0x0000,  26,  16 },    /* 216: p=0.199998 (    9,    2) */
337  { 0x00e1,  0x0000, 219, 221 },    /* 217: p=0.004750 (    1,  279) */
338  { 0x320e,  0x0000,  20, 220 },    /* 218: p=0.269229 (    6,    2) */
339  { 0x0094,  0x0000,  71,  63 },    /* 219: p=0.003132 (    1,  424) */
340  { 0x432a,  0x0000,  14,   8 },    /* 220: p=0.344827 (    6,    3) */
341  { 0x0188,  0x0000,  61,  55 },    /* 221: p=0.008284 (    2,  279) */
342  { 0x447d,  0x0000,  14, 224 },    /* 222: p=0.349998 (    4,    2) */
343  { 0x0252,  0x0000,  57,  51 },    /* 223: p=0.012567 (    2,  183) */
344  { 0x5ece,  0x0000,   8,   2 },    /* 224: p=0.434782 (    4,    3) */
345  { 0x0383,  0x0000,  53,  47 },    /* 225: p=0.019021 (    2,  120) */
346  { 0x8000,  0x0000, 228,  87 },    /* 226: p=0.500000 (    1,    1) */
347  { 0x0547,  0x0000,  49,  43 },    /* 227: p=0.028571 (    2,   79) */
348  { 0x481a,  0x0000, 230, 246 },    /* 228: p=0.363634 (    2,    1) */
349  { 0x07e2,  0x0000,  45,  37 },    /* 229: p=0.042682 (    2,   52) */
350  { 0x3579,  0x0000, 232, 244 },    /* 230: p=0.285711 (    3,    1) */
351  { 0x0bc0,  0x0000,  39,  33 },    /* 231: p=0.063636 (    2,   34) */
352  { 0x24ef,  0x0000, 234, 238 },    /* 232: p=0.199997 (    5,    1) */
353  { 0x1178,  0x0000,  35,  27 },    /* 233: p=0.094593 (    2,   22) */
354  { 0x1978,  0x0000, 138, 236 },    /* 234: p=0.137929 (    8,    1) */
355  { 0x19da,  0x0000,  29,  21 },    /* 235: p=0.139999 (    2,   14) */
356  { 0x2865,  0x0000,  24,  16 },    /* 236: p=0.218748 (    8,    2) */
357  { 0x24ef,  0x0000,  25,  15 },    /* 237: p=0.199998 (    2,    9) */
358  { 0x3987,  0x0000, 240,   8 },    /* 238: p=0.304346 (    5,    2) */
359  { 0x320e,  0x0000,  19, 241 },    /* 239: p=0.269229 (    2,    6) */
360  { 0x2c99,  0x0000,  22, 242 },    /* 240: p=0.241378 (    7,    2) */
361  { 0x432a,  0x0000,  13,   7 },    /* 241: p=0.344827 (    3,    6) */
362  { 0x3b5f,  0x0000,  16,  10 },    /* 242: p=0.312499 (    7,    3) */
363  { 0x447d,  0x0000,  13, 245 },    /* 243: p=0.349998 (    2,    4) */
364  { 0x5695,  0x0000,  10,   2 },    /* 244: p=0.411764 (    3,    2) */
365  { 0x5ece,  0x0000,   7,   1 },    /* 245: p=0.434782 (    3,    4) */
366  { 0x8000,  0x0000, 244,  83 },    /* 246: p=0.500000 (    2,    2) */
367  { 0x8000,  0x0000, 249, 250 },    /* 247: p=0.500000 (    1,    1) */
368  { 0x5695,  0x0000,  10,   2 },    /* 248: p=0.411764 (    3,    2) */
369  { 0x481a,  0x0000,  89, 143 },    /* 249: p=0.363634 (    1,    2) */
370  { 0x481a,  0x0000, 230, 246 },    /* 250: p=0.363634 (    2,    1) */
371#endif
372#ifdef ZCODER
373  /* This table has been designed for the ZCoder
374   * by running the following command in file 'ztable2.sn':
375   * (fast-crude (steady-mat 0.0035  0.0002) 260)))
376   */
377  { 0x8000,  0x0000,  84, 139 },    /* 000: p=0.500000 (    0,    0) */
378  { 0x8000,  0x0000,   3,   4 },    /* 001: p=0.500000 (    0,    0) */
379  { 0x8000,  0x0000,   4,   3 },    /* 002: p=0.500000 (    0,    0) */
380  { 0x7399,  0x10a5,   5,   1 },    /* 003: p=0.465226 (    0,    0) */
381  { 0x7399,  0x10a5,   6,   2 },    /* 004: p=0.465226 (    0,    0) */
382  { 0x6813,  0x1f28,   7,   3 },    /* 005: p=0.430708 (    0,    0) */
383  { 0x6813,  0x1f28,   8,   4 },    /* 006: p=0.430708 (    0,    0) */
384  { 0x5d65,  0x2bd3,   9,   5 },    /* 007: p=0.396718 (    0,    0) */
385  { 0x5d65,  0x2bd3,  10,   6 },    /* 008: p=0.396718 (    0,    0) */
386  { 0x5387,  0x36e3,  11,   7 },    /* 009: p=0.363535 (    0,    0) */
387  { 0x5387,  0x36e3,  12,   8 },    /* 010: p=0.363535 (    0,    0) */
388  { 0x4a73,  0x408c,  13,   9 },    /* 011: p=0.331418 (    0,    0) */
389  { 0x4a73,  0x408c,  14,  10 },    /* 012: p=0.331418 (    0,    0) */
390  { 0x421f,  0x48fe,  15,  11 },    /* 013: p=0.300562 (    0,    0) */
391  { 0x421f,  0x48fe,  16,  12 },    /* 014: p=0.300562 (    0,    0) */
392  { 0x3a85,  0x5060,  17,  13 },    /* 015: p=0.271166 (    0,    0) */
393  { 0x3a85,  0x5060,  18,  14 },    /* 016: p=0.271166 (    0,    0) */
394  { 0x339b,  0x56d3,  19,  15 },    /* 017: p=0.243389 (    0,    0) */
395  { 0x339b,  0x56d3,  20,  16 },    /* 018: p=0.243389 (    0,    0) */
396  { 0x2d59,  0x5c73,  21,  17 },    /* 019: p=0.217351 (    0,    0) */
397  { 0x2d59,  0x5c73,  22,  18 },    /* 020: p=0.217351 (    0,    0) */
398  { 0x27b3,  0x615e,  23,  19 },    /* 021: p=0.193091 (    0,    0) */
399  { 0x27b3,  0x615e,  24,  20 },    /* 022: p=0.193091 (    0,    0) */
400  { 0x22a1,  0x65a7,  25,  21 },    /* 023: p=0.170683 (    0,    0) */
401  { 0x22a1,  0x65a7,  26,  22 },    /* 024: p=0.170683 (    0,    0) */
402  { 0x1e19,  0x6963,  27,  23 },    /* 025: p=0.150134 (    0,    0) */
403  { 0x1e19,  0x6963,  28,  24 },    /* 026: p=0.150134 (    0,    0) */
404  { 0x1a0f,  0x6ca3,  29,  25 },    /* 027: p=0.131397 (    0,    0) */
405  { 0x1a0f,  0x6ca3,  30,  26 },    /* 028: p=0.131397 (    0,    0) */
406  { 0x167b,  0x6f75,  31,  27 },    /* 029: p=0.114441 (    0,    0) */
407  { 0x167b,  0x6f75,  32,  28 },    /* 030: p=0.114441 (    0,    0) */
408  { 0x1353,  0x71e6,  33,  29 },    /* 031: p=0.099214 (    0,    0) */
409  { 0x1353,  0x71e6,  34,  30 },    /* 032: p=0.099214 (    0,    0) */
410  { 0x108d,  0x7403,  35,  31 },    /* 033: p=0.085616 (    0,    0) */
411  { 0x108d,  0x7403,  36,  32 },    /* 034: p=0.085616 (    0,    0) */
412  { 0x0e1f,  0x75d7,  37,  33 },    /* 035: p=0.073525 (    0,    0) */
413  { 0x0e1f,  0x75d7,  38,  34 },    /* 036: p=0.073525 (    0,    0) */
414  { 0x0c01,  0x7769,  39,  35 },    /* 037: p=0.062871 (    0,    0) */
415  { 0x0c01,  0x7769,  40,  36 },    /* 038: p=0.062871 (    0,    0) */
416  { 0x0a2b,  0x78c2,  41,  37 },    /* 039: p=0.053524 (    0,    0) */
417  { 0x0a2b,  0x78c2,  42,  38 },    /* 040: p=0.053524 (    0,    0) */
418  { 0x0895,  0x79ea,  43,  39 },    /* 041: p=0.045374 (    0,    0) */
419  { 0x0895,  0x79ea,  44,  40 },    /* 042: p=0.045374 (    0,    0) */
420  { 0x0737,  0x7ae7,  45,  41 },    /* 043: p=0.038280 (    0,    0) */
421  { 0x0737,  0x7ae7,  46,  42 },    /* 044: p=0.038280 (    0,    0) */
422  { 0x060b,  0x7bbe,  47,  43 },    /* 045: p=0.032175 (    0,    0) */
423  { 0x060b,  0x7bbe,  48,  44 },    /* 046: p=0.032175 (    0,    0) */
424  { 0x050b,  0x7c75,  49,  45 },    /* 047: p=0.026926 (    0,    0) */
425  { 0x050b,  0x7c75,  50,  46 },    /* 048: p=0.026926 (    0,    0) */
426  { 0x0431,  0x7d10,  51,  47 },    /* 049: p=0.022430 (    0,    0) */
427  { 0x0431,  0x7d10,  52,  48 },    /* 050: p=0.022430 (    0,    0) */
428  { 0x0379,  0x7d92,  53,  49 },    /* 051: p=0.018623 (    0,    0) */
429  { 0x0379,  0x7d92,  54,  50 },    /* 052: p=0.018623 (    0,    0) */
430  { 0x02dd,  0x7dff,  55,  51 },    /* 053: p=0.015386 (    0,    0) */
431  { 0x02dd,  0x7dff,  56,  52 },    /* 054: p=0.015386 (    0,    0) */
432  { 0x025b,  0x7e5b,  57,  53 },    /* 055: p=0.012671 (    0,    0) */
433  { 0x025b,  0x7e5b,  58,  54 },    /* 056: p=0.012671 (    0,    0) */
434  { 0x01ef,  0x7ea7,  59,  55 },    /* 057: p=0.010414 (    0,    0) */
435  { 0x01ef,  0x7ea7,  60,  56 },    /* 058: p=0.010414 (    0,    0) */
436  { 0x0195,  0x7ee6,  61,  57 },    /* 059: p=0.008529 (    0,    0) */
437  { 0x0195,  0x7ee6,  62,  58 },    /* 060: p=0.008529 (    0,    0) */
438  { 0x0149,  0x7f1b,  63,  59 },    /* 061: p=0.006935 (    0,    0) */
439  { 0x0149,  0x7f1b,  64,  60 },    /* 062: p=0.006935 (    0,    0) */
440  { 0x010b,  0x7f46,  65,  61 },    /* 063: p=0.005631 (    0,    0) */
441  { 0x010b,  0x7f46,  66,  62 },    /* 064: p=0.005631 (    0,    0) */
442  { 0x00d5,  0x7f6c,  67,  63 },    /* 065: p=0.004495 (    0,    0) */
443  { 0x00d5,  0x7f6c,  68,  64 },    /* 066: p=0.004495 (    0,    0) */
444  { 0x00a5,  0x7f8d,  69,  65 },    /* 067: p=0.003484 (    0,    0) */
445  { 0x00a5,  0x7f8d,  70,  66 },    /* 068: p=0.003484 (    0,    0) */
446  { 0x007b,  0x7faa,  71,  67 },    /* 069: p=0.002592 (    0,    0) */
447  { 0x007b,  0x7faa,  72,  68 },    /* 070: p=0.002592 (    0,    0) */
448  { 0x0057,  0x7fc3,  73,  69 },    /* 071: p=0.001835 (    0,    0) */
449  { 0x0057,  0x7fc3,  74,  70 },    /* 072: p=0.001835 (    0,    0) */
450  { 0x0039,  0x7fd8,  75,  71 },    /* 073: p=0.001211 (    0,    0) */
451  { 0x0039,  0x7fd8,  76,  72 },    /* 074: p=0.001211 (    0,    0) */
452  { 0x0023,  0x7fe7,  77,  73 },    /* 075: p=0.000740 (    0,    0) */
453  { 0x0023,  0x7fe7,  78,  74 },    /* 076: p=0.000740 (    0,    0) */
454  { 0x0013,  0x7ff2,  79,  75 },    /* 077: p=0.000402 (    0,    0) */
455  { 0x0013,  0x7ff2,  80,  76 },    /* 078: p=0.000402 (    0,    0) */
456  { 0x0007,  0x7ffa,  81,  77 },    /* 079: p=0.000153 (    0,    0) */
457  { 0x0007,  0x7ffa,  82,  78 },    /* 080: p=0.000153 (    0,    0) */
458  { 0x0001,  0x7fff,  81,  79 },    /* 081: p=0.000027 (    0,    0) */
459  { 0x0001,  0x7fff,  82,  80 },    /* 082: p=0.000027 (    0,    0) */
460  { 0x620b,  0x0000,   9,  85 },    /* 083: p=0.411764 (    2,    3) */
461  { 0x294a,  0x0000,  86, 216 },    /* 084: p=0.199988 (    1,    0) */
462  { 0x8000,  0x0000,   5,   6 },    /* 085: p=0.500000 (    3,    3) */
463  { 0x0db3,  0x0000,  88, 168 },    /* 086: p=0.071422 (    4,    0) */
464  { 0x538e,  0x0000,  89, 137 },    /* 087: p=0.363634 (    1,    2) */
465  { 0x0490,  0x0000,  90, 134 },    /* 088: p=0.024388 (   13,    0) */
466  { 0x3e3e,  0x0000,  91, 135 },    /* 089: p=0.285711 (    1,    3) */
467  { 0x017c,  0x0000,  92, 112 },    /* 090: p=0.007999 (   41,    0) */
468  { 0x294a,  0x0000,  93, 133 },    /* 091: p=0.199997 (    1,    5) */
469  { 0x007c,  0x0000,  94, 104 },    /* 092: p=0.002611 (  127,    0) */
470  { 0x1b75,  0x0000,  95, 131 },    /* 093: p=0.137929 (    1,    8) */
471  { 0x0028,  0x0000,  96, 100 },    /* 094: p=0.000849 (  392,    0) */
472  { 0x12fc,  0x0000,  97, 129 },    /* 095: p=0.097559 (    1,   12) */
473  { 0x000d,  0x0000,  82,  98 },    /* 096: p=0.000276 ( 1208,    0) */
474  { 0x0cfb,  0x0000,  99, 125 },    /* 097: p=0.067795 (    1,   18) */
475  { 0x0034,  0x0000,  76,  72 },    /* 098: p=0.001102 ( 1208,    1) */
476  { 0x08cd,  0x0000, 101, 123 },    /* 099: p=0.046511 (    1,   27) */
477  { 0x00a0,  0x0000,  70, 102 },    /* 100: p=0.003387 (  392,    1) */
478  { 0x05de,  0x0000, 103, 119 },    /* 101: p=0.031249 (    1,   41) */
479  { 0x0118,  0x0000,  66,  60 },    /* 102: p=0.005912 (  392,    2) */
480  { 0x03e9,  0x0000, 105, 117 },    /* 103: p=0.020942 (    1,   62) */
481  { 0x01ed,  0x0000, 106, 110 },    /* 104: p=0.010362 (  127,    1) */
482  { 0x0298,  0x0000, 107, 115 },    /* 105: p=0.013937 (    1,   94) */
483  { 0x0145,  0x0000,  66, 108 },    /* 106: p=0.006849 (  193,    1) */
484  { 0x01b6,  0x0000, 109, 113 },    /* 107: p=0.009216 (    1,  143) */
485  { 0x0237,  0x0000,  60,  54 },    /* 108: p=0.011925 (  193,    2) */
486  { 0x0121,  0x0000,  65, 111 },    /* 109: p=0.006097 (    1,  217) */
487  { 0x035b,  0x0000,  56,  48 },    /* 110: p=0.017995 (  127,    2) */
488  { 0x01f9,  0x0000,  59,  53 },    /* 111: p=0.010622 (    2,  217) */
489  { 0x05de,  0x0000, 114, 130 },    /* 112: p=0.031249 (   41,    1) */
490  { 0x02fc,  0x0000,  55,  49 },    /* 113: p=0.016018 (    2,  143) */
491  { 0x03e9,  0x0000, 116, 128 },    /* 114: p=0.020942 (   62,    1) */
492  { 0x0484,  0x0000,  51,  45 },    /* 115: p=0.024138 (    2,   94) */
493  { 0x0298,  0x0000, 118, 126 },    /* 116: p=0.013937 (   94,    1) */
494  { 0x06ca,  0x0000,  47,  39 },    /* 117: p=0.036082 (    2,   62) */
495  { 0x01b6,  0x0000, 120, 124 },    /* 118: p=0.009216 (  143,    1) */
496  { 0x0a27,  0x0000,  41, 121 },    /* 119: p=0.053434 (    2,   41) */
497  { 0x0121,  0x0000,  66, 122 },    /* 120: p=0.006097 (  217,    1) */
498  { 0x0e57,  0x0000,  37,  31 },    /* 121: p=0.074626 (    3,   41) */
499  { 0x01f9,  0x0000,  60,  54 },    /* 122: p=0.010622 (  217,    2) */
500  { 0x0f25,  0x0000,  37,  29 },    /* 123: p=0.078651 (    2,   27) */
501  { 0x02fc,  0x0000,  56,  50 },    /* 124: p=0.016018 (  143,    2) */
502  { 0x1629,  0x0000,  33, 127 },    /* 125: p=0.112902 (    2,   18) */
503  { 0x0484,  0x0000,  52,  46 },    /* 126: p=0.024138 (   94,    2) */
504  { 0x1ee8,  0x0000,  27,  21 },    /* 127: p=0.153845 (    3,   18) */
505  { 0x06ca,  0x0000,  48,  40 },    /* 128: p=0.036082 (   62,    2) */
506  { 0x200f,  0x0000,  27,  19 },    /* 129: p=0.159089 (    2,   12) */
507  { 0x0a27,  0x0000,  42, 132 },    /* 130: p=0.053434 (   41,    2) */
508  { 0x2dae,  0x0000,  21,  15 },    /* 131: p=0.218748 (    2,    8) */
509  { 0x0e57,  0x0000,  38,  32 },    /* 132: p=0.074626 (   41,    3) */
510  { 0x4320,  0x0000,  15,   7 },    /* 133: p=0.304346 (    2,    5) */
511  { 0x11a0,  0x0000, 136, 164 },    /* 134: p=0.090907 (   13,    1) */
512  { 0x620b,  0x0000,   9,  85 },    /* 135: p=0.411764 (    2,    3) */
513  { 0x0bbe,  0x0000, 138, 162 },    /* 136: p=0.061537 (   20,    1) */
514  { 0x8000,  0x0000, 135, 248 },    /* 137: p=0.500000 (    2,    2) */
515  { 0x07f3,  0x0000, 140, 160 },    /* 138: p=0.042104 (   30,    1) */
516  { 0x294a,  0x0000, 141, 247 },    /* 139: p=0.199988 (    0,    1) */
517  { 0x053e,  0x0000, 142, 158 },    /* 140: p=0.027971 (   46,    1) */
518  { 0x0db3,  0x0000, 143, 199 },    /* 141: p=0.071422 (    0,    4) */
519  { 0x0378,  0x0000, 144, 156 },    /* 142: p=0.018604 (   70,    1) */
520  { 0x0490,  0x0000, 145, 167 },    /* 143: p=0.024388 (    0,   13) */
521  { 0x024d,  0x0000, 146, 154 },    /* 144: p=0.012384 (  106,    1) */
522  { 0x017c,  0x0000, 147, 101 },    /* 145: p=0.007999 (    0,   41) */
523  { 0x0185,  0x0000, 148, 152 },    /* 146: p=0.008197 (  161,    1) */
524  { 0x007c,  0x0000, 149, 159 },    /* 147: p=0.002611 (    0,  127) */
525  { 0x0100,  0x0000,  68, 150 },    /* 148: p=0.005405 (  245,    1) */
526  { 0x0028,  0x0000, 151, 155 },    /* 149: p=0.000849 (    0,  392) */
527  { 0x01c0,  0x0000,  62,  56 },    /* 150: p=0.009421 (  245,    2) */
528  { 0x000d,  0x0000,  81, 153 },    /* 151: p=0.000276 (    0, 1208) */
529  { 0x02a7,  0x0000,  58,  52 },    /* 152: p=0.014256 (  161,    2) */
530  { 0x0034,  0x0000,  75,  71 },    /* 153: p=0.001102 (    1, 1208) */
531  { 0x0403,  0x0000,  54,  46 },    /* 154: p=0.021472 (  106,    2) */
532  { 0x00a0,  0x0000,  69, 157 },    /* 155: p=0.003387 (    1,  392) */
533  { 0x0608,  0x0000,  48,  42 },    /* 156: p=0.032110 (   70,    2) */
534  { 0x0118,  0x0000,  65,  59 },    /* 157: p=0.005912 (    2,  392) */
535  { 0x0915,  0x0000,  44,  38 },    /* 158: p=0.047945 (   46,    2) */
536  { 0x01ed,  0x0000, 161, 165 },    /* 159: p=0.010362 (    1,  127) */
537  { 0x0db4,  0x0000,  40,  32 },    /* 160: p=0.071428 (   30,    2) */
538  { 0x0145,  0x0000,  65, 163 },    /* 161: p=0.006849 (    1,  193) */
539  { 0x1417,  0x0000,  34,  26 },    /* 162: p=0.102940 (   20,    2) */
540  { 0x0237,  0x0000,  59,  53 },    /* 163: p=0.011925 (    2,  193) */
541  { 0x1dd6,  0x0000,  30, 166 },    /* 164: p=0.148935 (   13,    2) */
542  { 0x035b,  0x0000,  55,  47 },    /* 165: p=0.017995 (    2,  127) */
543  { 0x294a,  0x0000,  24,  18 },    /* 166: p=0.199999 (   13,    3) */
544  { 0x11a0,  0x0000, 169, 195 },    /* 167: p=0.090907 (    1,   13) */
545  { 0x31a3,  0x0000, 170, 212 },    /* 168: p=0.235291 (    4,    1) */
546  { 0x0bbe,  0x0000, 171, 193 },    /* 169: p=0.061537 (    1,   20) */
547  { 0x235a,  0x0000, 172, 208 },    /* 170: p=0.173910 (    6,    1) */
548  { 0x07f3,  0x0000, 173, 191 },    /* 171: p=0.042104 (    1,   30) */
549  { 0x18b3,  0x0000, 174, 206 },    /* 172: p=0.124998 (    9,    1) */
550  { 0x053e,  0x0000, 175, 189 },    /* 173: p=0.027971 (    1,   46) */
551  { 0x1073,  0x0000, 176, 204 },    /* 174: p=0.085105 (   14,    1) */
552  { 0x0378,  0x0000, 177, 187 },    /* 175: p=0.018604 (    1,   70) */
553  { 0x0b35,  0x0000, 178, 200 },    /* 176: p=0.058822 (   21,    1) */
554  { 0x024d,  0x0000, 179, 185 },    /* 177: p=0.012384 (    1,  106) */
555  { 0x0778,  0x0000, 180, 198 },    /* 178: p=0.039603 (   32,    1) */
556  { 0x0185,  0x0000, 181, 183 },    /* 179: p=0.008197 (    1,  161) */
557  { 0x04ed,  0x0000, 182, 194 },    /* 180: p=0.026315 (   49,    1) */
558  { 0x0100,  0x0000,  67,  59 },    /* 181: p=0.005405 (    1,  245) */
559  { 0x0349,  0x0000, 184, 192 },    /* 182: p=0.017621 (   74,    1) */
560  { 0x02a7,  0x0000,  57,  51 },    /* 183: p=0.014256 (    2,  161) */
561  { 0x022e,  0x0000, 186, 190 },    /* 184: p=0.011730 (  112,    1) */
562  { 0x0403,  0x0000,  53,  45 },    /* 185: p=0.021472 (    2,  106) */
563  { 0x0171,  0x0000,  64, 188 },    /* 186: p=0.007767 (  170,    1) */
564  { 0x0608,  0x0000,  47,  41 },    /* 187: p=0.032110 (    2,   70) */
565  { 0x0283,  0x0000,  58,  52 },    /* 188: p=0.013513 (  170,    2) */
566  { 0x0915,  0x0000,  43,  37 },    /* 189: p=0.047945 (    2,   46) */
567  { 0x03cc,  0x0000,  54,  48 },    /* 190: p=0.020349 (  112,    2) */
568  { 0x0db4,  0x0000,  39,  31 },    /* 191: p=0.071428 (    2,   30) */
569  { 0x05b6,  0x0000,  50,  42 },    /* 192: p=0.030434 (   74,    2) */
570  { 0x1417,  0x0000,  33,  25 },    /* 193: p=0.102940 (    2,   20) */
571  { 0x088a,  0x0000,  44, 196 },    /* 194: p=0.045161 (   49,    2) */
572  { 0x1dd6,  0x0000,  29, 197 },    /* 195: p=0.148935 (    2,   13) */
573  { 0x0c16,  0x0000,  40,  34 },    /* 196: p=0.063291 (   49,    3) */
574  { 0x294a,  0x0000,  23,  17 },    /* 197: p=0.199999 (    3,   13) */
575  { 0x0ce2,  0x0000,  40,  32 },    /* 198: p=0.067307 (   32,    2) */
576  { 0x31a3,  0x0000, 201, 243 },    /* 199: p=0.235291 (    1,    4) */
577  { 0x1332,  0x0000,  36, 202 },    /* 200: p=0.098590 (   21,    2) */
578  { 0x235a,  0x0000, 203, 239 },    /* 201: p=0.173910 (    1,    6) */
579  { 0x1adc,  0x0000,  30,  24 },    /* 202: p=0.135134 (   21,    3) */
580  { 0x18b3,  0x0000, 205, 237 },    /* 203: p=0.124998 (    1,    9) */
581  { 0x1be7,  0x0000,  30,  22 },    /* 204: p=0.139999 (   14,    2) */
582  { 0x1073,  0x0000, 207, 235 },    /* 205: p=0.085105 (    1,   14) */
583  { 0x294a,  0x0000,  26,  16 },    /* 206: p=0.199998 (    9,    2) */
584  { 0x0b35,  0x0000, 209, 231 },    /* 207: p=0.058822 (    1,   21) */
585  { 0x3a07,  0x0000,  20, 210 },    /* 208: p=0.269229 (    6,    2) */
586  { 0x0778,  0x0000, 211, 229 },    /* 209: p=0.039603 (    1,   32) */
587  { 0x4e30,  0x0000,  14,   8 },    /* 210: p=0.344827 (    6,    3) */
588  { 0x04ed,  0x0000, 213, 225 },    /* 211: p=0.026315 (    1,   49) */
589  { 0x4fa6,  0x0000,  14, 214 },    /* 212: p=0.349998 (    4,    2) */
590  { 0x0349,  0x0000, 215, 223 },    /* 213: p=0.017621 (    1,   74) */
591  { 0x6966,  0x0000,   8,   2 },    /* 214: p=0.434782 (    4,    3) */
592  { 0x022e,  0x0000, 217, 221 },    /* 215: p=0.011730 (    1,  112) */
593  { 0x8000,  0x0000, 218,  87 },    /* 216: p=0.500000 (    1,    1) */
594  { 0x0171,  0x0000,  63, 219 },    /* 217: p=0.007767 (    1,  170) */
595  { 0x538e,  0x0000, 220, 246 },    /* 218: p=0.363634 (    2,    1) */
596  { 0x0283,  0x0000,  57,  51 },    /* 219: p=0.013513 (    2,  170) */
597  { 0x3e3e,  0x0000, 222, 244 },    /* 220: p=0.285711 (    3,    1) */
598  { 0x03cc,  0x0000,  53,  47 },    /* 221: p=0.020349 (    2,  112) */
599  { 0x294a,  0x0000, 224, 242 },    /* 222: p=0.199997 (    5,    1) */
600  { 0x05b6,  0x0000,  49,  41 },    /* 223: p=0.030434 (    2,   74) */
601  { 0x1b75,  0x0000, 226, 240 },    /* 224: p=0.137929 (    8,    1) */
602  { 0x088a,  0x0000,  43, 227 },    /* 225: p=0.045161 (    2,   49) */
603  { 0x12fc,  0x0000, 228, 238 },    /* 226: p=0.097559 (   12,    1) */
604  { 0x0c16,  0x0000,  39,  33 },    /* 227: p=0.063291 (    3,   49) */
605  { 0x0cfb,  0x0000, 230, 234 },    /* 228: p=0.067795 (   18,    1) */
606  { 0x0ce2,  0x0000,  39,  31 },    /* 229: p=0.067307 (    2,   32) */
607  { 0x08cd,  0x0000, 112, 232 },    /* 230: p=0.046511 (   27,    1) */
608  { 0x1332,  0x0000,  35, 233 },    /* 231: p=0.098590 (    2,   21) */
609  { 0x0f25,  0x0000,  38,  30 },    /* 232: p=0.078651 (   27,    2) */
610  { 0x1adc,  0x0000,  29,  23 },    /* 233: p=0.135134 (    3,   21) */
611  { 0x1629,  0x0000,  34, 236 },    /* 234: p=0.112902 (   18,    2) */
612  { 0x1be7,  0x0000,  29,  21 },    /* 235: p=0.139999 (    2,   14) */
613  { 0x1ee8,  0x0000,  28,  22 },    /* 236: p=0.153845 (   18,    3) */
614  { 0x294a,  0x0000,  25,  15 },    /* 237: p=0.199998 (    2,    9) */
615  { 0x200f,  0x0000,  28,  20 },    /* 238: p=0.159089 (   12,    2) */
616  { 0x3a07,  0x0000,  19, 241 },    /* 239: p=0.269229 (    2,    6) */
617  { 0x2dae,  0x0000,  22,  16 },    /* 240: p=0.218748 (    8,    2) */
618  { 0x4e30,  0x0000,  13,   7 },    /* 241: p=0.344827 (    3,    6) */
619  { 0x4320,  0x0000,  16,   8 },    /* 242: p=0.304346 (    5,    2) */
620  { 0x4fa6,  0x0000,  13, 245 },    /* 243: p=0.349998 (    2,    4) */
621  { 0x620b,  0x0000,  10,   2 },    /* 244: p=0.411764 (    3,    2) */
622  { 0x6966,  0x0000,   7,   1 },    /* 245: p=0.434782 (    3,    4) */
623  { 0x8000,  0x0000, 244,  83 },    /* 246: p=0.500000 (    2,    2) */
624  { 0x8000,  0x0000, 249, 250 },    /* 247: p=0.500000 (    1,    1) */
625  { 0x620b,  0x0000,  10,   2 },    /* 248: p=0.411764 (    3,    2) */
626  { 0x538e,  0x0000,  89, 137 },    /* 249: p=0.363634 (    1,    2) */
627  { 0x538e,  0x0000, 220, 246 },    /* 250: p=0.363634 (    2,    1) */
628#endif
629};
630
631
632
633////////////////////////////////////////////////////////////////
634// CONSTRUCTOR/DESTRUCTOR
635////////////////////////////////////////////////////////////////
636
637class ZPCodec::Encode : public ZPCodec
638{
639public:
640  Encode(GP<ByteStream> gbs, const bool djvucompat);
641  virtual ~Encode();
642private:
643  void init(void); 
644};
645
646ZPCodec::Encode::Encode(GP<ByteStream> gbs, const bool djvucompat)
647: ZPCodec(gbs,true,djvucompat)
648{
649  init();
650  // Codebit counter
651#ifdef ZPCODEC_BITCOUNT
652  bitcount = 0;
653#endif
654}
655
656ZPCodec::Encode::~Encode()
657{
658  eflush();
659}
660 
661class ZPCodec::Decode : public ZPCodec
662{
663public:
664  Decode(GP<ByteStream> gbs, const bool djvucompat);
665  virtual ~Decode();
666private:
667  void init(void); 
668};
669
670ZPCodec::Decode::Decode(GP<ByteStream> gbs, const bool djvucompat)
671: ZPCodec(gbs,false,djvucompat)
672{
673  init();
674  // Codebit counter
675#ifdef ZPCODEC_BITCOUNT
676  bitcount = 0;
677#endif
678}
679 
680ZPCodec::Decode::~Decode() {}
681
682ZPCodec::ZPCodec(GP<ByteStream> xgbs, const bool xencoding, const bool djvucompat)
683: gbs(xgbs), bs(xgbs), encoding(xencoding), fence(0), subend(0), buffer(0), nrun(0)
684{
685  // Create machine independent ffz table
686  for (int i=0; i<256; i++)
687    {
688      ffzt[i]=0;
689      for (int j=i; j&0x80; j<<=1)
690        ffzt[i] += 1;
691    }
692  // Initialize table
693  newtable(default_ztable);
694  // Patch table table (and lose DjVu compatibility).
695  if (!djvucompat)
696    {
697      for (int j=0; j<256; j++)
698        {
699          unsigned short a = 0x10000-p[j];
700          while (a>=0x8000)  a=(unsigned short)(a<<1);
701          if (m[j]>0 && a+p[j]>=0x8000 && a>=m[j])
702            {
703              BitContext x = default_ztable[j].dn;
704              BitContext y = default_ztable[x].dn;
705              dn[j] = y;
706            }
707        }
708    }
709}
710
711ZPCodec::~ZPCodec() {}
712
713GP<ZPCodec>
714ZPCodec::create(GP<ByteStream> gbs, const bool encoding, const bool djvucompat)
715{
716  GP<ZPCodec> retval;
717  if(encoding)
718  {
719    retval=new ZPCodec::Encode(gbs,djvucompat);
720  }else
721  {
722    retval=new ZPCodec::Decode(gbs,djvucompat);
723  }
724  return retval;
725}
726
727////////////////////////////////////////////////////////////////
728// Z CODER DECODE ALGORITHM
729////////////////////////////////////////////////////////////////
730
731
732
733void 
734ZPCodec::Decode::init(void)
735{
736  assert(sizeof(unsigned int)==4);
737  assert(sizeof(unsigned short)==2);
738  a = 0;
739  /* Read first 16 bits of code */
740  if (! bs->read((void*)&byte, 1))
741    byte = 0xff;
742  code = (byte<<8);
743  if (! bs->read((void*)&byte, 1))
744    byte = 0xff;
745  code = code | byte;
746  /* Preload buffer */
747  delay = 25;
748  scount = 0;
749  preload();
750  /* Compute initial fence */
751  fence = code;
752  if (code >= 0x8000)
753    fence = 0x7fff;
754}
755
756
757void
758ZPCodec::preload(void)
759{
760  while (scount<=24)
761    {
762      if (bs->read((void*)&byte, 1) < 1) 
763        {
764          byte = 0xff;
765          if (--delay < 1)
766            G_THROW( ByteStream::EndOfFile );
767        }
768      buffer = (buffer<<8) | byte;
769      scount += 8;
770    }
771}
772
773
774inline int
775ZPCodec::ffz(unsigned int x)
776{
777  // DO NOT DEFINE FASTBSR :
778  // Test shows that it hardly helps on a PPro,
779  // and rumors are that BSR is very slow on PPlain.
780#if defined(FASTBSR) && defined(_MSC_VER) && defined(_M_IX86)
781  int r;
782  __asm  { 
783        mov  ebx, x
784        xor  ebx, 0xffff
785        mov  eax, -1
786        bsr  eax, ebx
787        mov  r, eax
788  }
789  return 15 - r;
790#elif defined(FASTBSR) && defined(__GNUC__) && defined(__i386__)
791  int r, dummy;
792  __asm__ const ( "movl %2,%1\n\t"
793                  "xorl $0xffff, %1\n\t"
794                  "movl $-1, %0\n\t"
795                  "bsrl %1, %0"
796                  : "=&q" (r), "=q" (dummy) : "rm" (x) );
797  return 15 - r;
798#else
799  return (x>=0xff00) ? (ffzt[x&0xff]+8) : (ffzt[(x>>8)&0xff]);
800#endif
801}
802
803
804int 
805ZPCodec::decode_sub(BitContext &ctx, unsigned int z)
806{
807  /* Save bit */
808  int bit = (ctx & 1);
809  /* Avoid interval reversion */
810#ifdef ZPCODER
811  unsigned int d = 0x6000 + ((z+a)>>2);
812  if (z > d) 
813    z = d;
814#endif
815#ifdef ZCODER
816  if (z >= 0x8000)
817    z = 0x4000 + (z>>1);
818#endif
819  /* Test MPS/LPS */
820  if (z > code)
821    {
822      /* LPS branch */
823      z = 0x10000 - z;
824      a = a + z;
825      code = code + z;
826      /* LPS adaptation */
827      ctx = dn[ctx];
828      /* LPS renormalization */
829      int shift = ffz(a);
830      scount -= shift;
831      a = (unsigned short)(a<<shift);
832      code = (unsigned short)(code<<shift) | ((buffer>>scount) & ((1<<shift)-1));
833#ifdef ZPCODEC_BITCOUNT
834      bitcount += shift;
835#endif
836      if (scount<16) preload();
837      /* Adjust fence */
838      fence = code;
839      if (code >= 0x8000)
840        fence = 0x7fff;
841      return bit ^ 1;
842    }
843  else
844    {
845      /* MPS adaptation */
846      if (a >= m[ctx])
847        ctx = up[ctx];
848      /* MPS renormalization */
849      scount -= 1;
850      a = (unsigned short)(z<<1);
851      code = (unsigned short)(code<<1) | ((buffer>>scount) & 1);
852#ifdef ZPCODEC_BITCOUNT
853      bitcount += 1;
854#endif
855      if (scount<16) preload();
856      /* Adjust fence */
857      fence = code;
858      if (code >= 0x8000)
859        fence = 0x7fff;
860      return bit;
861    }
862}
863
864
865int 
866ZPCodec::decode_sub_simple(int mps, unsigned int z)
867{
868  /* Test MPS/LPS */
869  if (z > code)
870    {
871      /* LPS branch */
872      z = 0x10000 - z;
873      a = a + z;
874      code = code + z;
875      /* LPS renormalization */
876      int shift = ffz(a);
877      scount -= shift;
878      a = (unsigned short)(a<<shift);
879      code = (unsigned short)(code<<shift) | ((buffer>>scount) & ((1<<shift)-1));
880#ifdef ZPCODEC_BITCOUNT
881      bitcount += shift;
882#endif
883      if (scount<16) preload();
884      /* Adjust fence */
885      fence = code;
886      if (code >= 0x8000)
887        fence = 0x7fff;
888      return mps ^ 1;
889    }
890  else
891    {
892      /* MPS renormalization */
893      scount -= 1;
894      a = (unsigned short)(z<<1);
895      code = (unsigned short)(code<<1) | ((buffer>>scount) & 1);
896#ifdef ZPCODEC_BITCOUNT
897      bitcount += 1;
898#endif
899      if (scount<16) preload();
900      /* Adjust fence */
901      fence = code;
902      if (code >= 0x8000)
903        fence = 0x7fff;
904      return mps;
905    }
906}
907
908
909int 
910ZPCodec::decode_sub_nolearn(int mps, unsigned int z)
911{
912#ifdef ZPCODER
913  unsigned int d = 0x6000 + ((z+a)>>2);
914  if (z > d) 
915        z = d;
916#endif
917#ifdef ZCODER
918  if (z >= 0x8000)
919    z = 0x4000 + (z>>1);
920#endif
921  /* Test MPS/LPS */
922  if (z > code)
923    {
924      /* LPS branch */
925      z = 0x10000 - z;
926      a = a + z;
927      code = code + z;
928      /* LPS renormalization */
929      int shift = ffz(a);
930      scount -= shift;
931      a = (unsigned short)(a<<shift);
932      code = (unsigned short)(code<<shift) | ((buffer>>scount) & ((1<<shift)-1));
933#ifdef ZPCODEC_BITCOUNT
934      bitcount += shift;
935#endif
936      if (scount<16) preload();
937      /* Adjust fence */
938      fence = code;
939      if (code >= 0x8000)
940        fence = 0x7fff;
941      return mps ^ 1;
942    }
943  else
944    {
945      /* MPS renormalization */
946      scount -= 1;
947      a = (unsigned short)(z<<1);
948      code = (unsigned short)(code<<1) | ((buffer>>scount) & 1);
949#ifdef ZPCODEC_BITCOUNT
950      bitcount += 1;
951#endif
952      if (scount<16) preload();
953      /* Adjust fence */
954      fence = code;
955      if (code >= 0x8000)
956        fence = 0x7fff;
957      return mps;
958    }
959}
960
961
962
963
964
965////////////////////////////////////////////////////////////////
966// Z CODER ENCODE ALGORITHM
967////////////////////////////////////////////////////////////////
968
969
970
971
972void 
973ZPCodec::Encode::init(void)
974{
975  assert(sizeof(unsigned int)==4);
976  assert(sizeof(unsigned short)==2);
977  a = 0;
978  scount = 0;
979  byte = 0;
980  delay = 25;
981  subend = 0;
982  buffer = 0xffffff;
983  nrun = 0;
984}
985
986void
987ZPCodec::outbit(int bit)
988{
989  if (delay > 0)
990    {
991      if (delay < 0xff) // delay=0xff suspends emission forever
992        delay -= 1;
993    }
994  else
995    {
996      /* Insert a bit */
997      byte = (byte<<1) | bit;
998      /* Output a byte */
999      if (++scount == 8)
1000        {
1001          if (!encoding)
1002            G_THROW( ERR_MSG("ZPCodec.no_encoding") );
1003          if (bs->write((void*)&byte, 1) != 1)
1004            G_THROW( ERR_MSG("ZPCodec.write_error") );
1005          scount = 0;
1006          byte = 0;
1007        }
1008    }
1009}
1010
1011void 
1012ZPCodec::zemit(int b)
1013{
1014  /* Shift new bit into 3bytes buffer */
1015  buffer = (buffer<<1) + b;
1016  /* Examine bit going out of the 3bytes buffer */
1017  b = (buffer >> 24);
1018  buffer = (buffer & 0xffffff);
1019  /* The following lines have been changed in order to emphazise the
1020   * similarity between this bit counting and the scheme of Witten, Neal & Cleary
1021   * (WN&C).  Corresponding changes have been made in outbit and eflush.
1022   * Variable 'nrun' is similar to the 'bits_to_follow' in the W&N code.
1023   */
1024  switch(b)
1025    {
1026      /* Similar to WN&C upper renormalization */
1027    case 1:
1028      outbit(1);
1029      while (nrun-- > 0)
1030        outbit(0);
1031      nrun = 0;
1032      break;
1033      /* Similar to WN&C lower renormalization */
1034    case 0xff:
1035      outbit(0);
1036      while (nrun-- > 0)
1037        outbit(1);
1038      nrun = 0;
1039      break;
1040      /* Similar to WN&C central renormalization */
1041    case 0:
1042      nrun += 1;
1043      break;
1044    default:
1045      assert(0);
1046    }
1047  /* Code bit counter */
1048#ifdef ZPCODEC_BITCOUNT
1049  bitcount += 1;
1050#endif
1051}
1052
1053void 
1054ZPCodec::eflush()
1055{
1056  /* adjust subend */
1057  if (subend > 0x8000)
1058    subend = 0x10000;
1059  else if (subend > 0)
1060    subend = 0x8000;
1061  /* zemit many mps bits */
1062  while (buffer != 0xffffff  || subend )
1063    {
1064      zemit(1 - (subend>>15) );
1065      subend = (unsigned short)(subend<<1);
1066    }
1067  /* zemit pending run */
1068  outbit(1);
1069  while (nrun-- > 0)
1070    outbit(0);
1071  nrun = 0;
1072  /* zemit 1 until full byte */
1073  while (scount > 0)
1074    outbit(1);
1075  /* prevent further emission */
1076  delay = 0xff;
1077}
1078
1079void 
1080ZPCodec::encode_mps(BitContext &ctx, unsigned int z)
1081{
1082  /* Avoid interval reversion */
1083#ifdef ZPCODER
1084  unsigned int d = 0x6000 + ((z+a)>>2);
1085  if (z > d) 
1086    z = d;
1087#endif
1088#ifdef ZCODER
1089  if (z >= 0x8000)
1090    z = 0x4000 + (z>>1);
1091#endif
1092  /* Adaptation */
1093  if (a >= m[ctx])
1094    ctx = up[ctx];
1095  /* Code MPS */
1096  a = z;
1097  /* Export bits */
1098  if (a >= 0x8000)
1099    {
1100      zemit(1 - (subend>>15) );
1101      subend = (unsigned short)(subend<<1);
1102      a = (unsigned short)(a<<1);
1103    }
1104}
1105
1106
1107void 
1108ZPCodec::encode_lps(BitContext &ctx, unsigned int z)
1109{
1110  /* Avoid interval reversion */
1111#ifdef ZPCODER
1112  unsigned int d = 0x6000 + ((z+a)>>2);
1113  if (z > d) 
1114    z = d;
1115#endif
1116#ifdef ZCODER
1117  if (z >= 0x8000)
1118    z = 0x4000 + (z>>1);
1119#endif
1120  /* Adaptation */
1121  ctx = dn[ctx];
1122  /* Code LPS */
1123  z = 0x10000 - z;
1124  subend += z;
1125  a += z;
1126  /* Export bits */
1127  while (a >= 0x8000)
1128    {
1129      zemit(1 - (subend>>15) );
1130      subend = (unsigned short)(subend<<1);
1131      a = (unsigned short)(a<<1);
1132    }
1133}
1134
1135
1136void 
1137ZPCodec::encode_mps_simple(unsigned int z)
1138{
1139  /* Code MPS */
1140  a = z;
1141  /* Export bits */
1142  if (a >= 0x8000)
1143    {
1144      zemit(1 - (subend>>15) );
1145      subend = (unsigned short)(subend<<1);
1146      a = (unsigned short)(a<<1);
1147    }
1148}
1149
1150void 
1151ZPCodec::encode_lps_simple(unsigned int z)
1152{
1153  /* Code LPS */
1154  z = 0x10000 - z;
1155  subend += z;
1156  a += z;
1157  /* Export bits */
1158  while (a >= 0x8000)
1159    {
1160      zemit(1 - (subend>>15) );
1161      subend = (unsigned short)(subend<<1);
1162      a = (unsigned short)(a<<1);
1163    }
1164}
1165
1166
1167void 
1168ZPCodec::encode_mps_nolearn(unsigned int z)
1169{
1170#ifdef ZPCODER
1171  unsigned int d = 0x6000 + ((z+a)>>2);
1172  if (z > d) 
1173    z = d;
1174#endif
1175#ifdef ZCODER
1176  if (z >= 0x8000)
1177    z = 0x4000 + (z>>1);
1178#endif
1179  /* Code MPS */
1180  a = z;
1181  /* Export bits */
1182  if (a >= 0x8000)
1183    {
1184      zemit(1 - (subend>>15) );
1185      subend = (unsigned short)(subend<<1);
1186      a = (unsigned short)(a<<1);
1187    }
1188}
1189
1190
1191void 
1192ZPCodec::encode_lps_nolearn(unsigned int z)
1193{
1194#ifdef ZPCODER
1195  unsigned int d = 0x6000 + ((z+a)>>2);
1196  if (z > d) 
1197    z = d;
1198#endif
1199#ifdef ZCODER
1200  if (z >= 0x8000)
1201    z = 0x4000 + (z>>1);
1202#endif
1203  /* Code LPS */
1204  z = 0x10000 - z;
1205  subend += z;
1206  a += z;
1207  /* Export bits */
1208  while (a >= 0x8000)
1209    {
1210      zemit(1 - (subend>>15) );
1211      subend = (unsigned short)(subend<<1);
1212      a = (unsigned short)(a<<1);
1213    }
1214}
1215
1216
1217
1218
1219
1220
1221////////////////////////////////////////////////////////////////
1222// TABLE AND PARAMETER MANAGEMENT
1223////////////////////////////////////////////////////////////////
1224
1225
1226
1227
1228void 
1229ZPCodec::newtable(ZPCodec::Table *table)
1230{
1231  for (int i=0; i<256; i++)
1232    {
1233      p[i]  = table[i].p;
1234      m[i]  = table[i].m;
1235      up[i] = table[i].up;
1236      dn[i] = table[i].dn;
1237    }
1238}
1239
1240static float 
1241p_to_plps(unsigned short p)
1242{
1243  float fplps;
1244  float fp = (float)(p) / (float)(0x10000);
1245  const float log2 = (float)0.69314718055994530942;
1246#ifdef ZCODER
1247  fplps = fp - (fp+0.5) * log(fp+0.5) + (fp-0.5)*log2;
1248#endif
1249#ifdef ZPCODER
1250  if (fp <= (1.0/6.0) )
1251    fplps = fp * 2 * log2;
1252  else
1253    fplps = (float)((1.5*fp-0.25) - (1.5*fp+0.25)*log(1.5*fp+0.25) + (0.5*fp-0.25)*log2);
1254#endif
1255  return fplps;
1256}
1257
1258
1259BitContext
1260ZPCodec::state(float prob1)
1261{
1262  // Return a state representing 'prob1' in the steady chain
1263  // FixMe: This is quite slow!
1264  int mps = (prob1 <= 0.5 ? 0 : 1);
1265  float plps = (float)(mps ? 1.0 - prob1 : prob1);
1266  // Locate steady chain (ordered, decreasing)
1267  int sz = 0;
1268  int lo = (mps ? 1 : 2);
1269  while (p[lo+sz+sz+2] < p[lo+sz+sz]) sz+=1;
1270  // Bisection
1271  while (sz > 1)
1272    {
1273      int nsz = sz >> 1;
1274      float nplps = p_to_plps( p[lo+nsz+nsz] );
1275      if (nplps < plps)
1276        { sz=nsz; }
1277      else
1278        { lo=lo+nsz+nsz; sz=sz-nsz; }
1279    }
1280  // Choose closest one
1281  float f1 = p_to_plps(p[lo])-plps;
1282  float f2 = plps-p_to_plps(p[lo+2]);
1283  return (f1<f2) ? lo : lo+2;
1284}
1285
1286
1287#ifdef HAVE_NAMESPACES
1288}
1289# ifndef NOT_USING_DJVU_NAMESPACE
1290using namespace DJVU;
1291# endif
1292#endif
Note: See TracBrowser for help on using the repository browser.