source: trunk/libdjvu/ZPCodec.cpp @ 269

Last change on this file since 269 was 206, checked in by Eugene Romanenko, 14 years ago

DJVU plugin: djvulibre updated to version 3.5.19

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