You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kviewshell/plugins/djvu/libdjvu/ZPCodec.cpp

1293 lines
53 KiB

//C- -*- C++ -*-
//C- -------------------------------------------------------------------
//C- DjVuLibre-3.5
//C- Copyright (c) 2002 Leon Bottou and Yann Le Cun.
//C- Copyright (c) 2001 AT&T
//C-
//C- This software is subject to, and may be distributed under, the
//C- GNU General Public License, Version 2. The license should have
//C- accompanied the software or you may obtain a copy of the license
//C- from the Free Software Foundation at http://www.fsf.org .
//C-
//C- This program is distributed in the hope that it will be useful,
//C- but WITHOUT ANY WARRANTY; without even the implied warranty of
//C- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//C- GNU General Public License for more details.
//C-
//C- DjVuLibre-3.5 is derived from the DjVu(r) Reference Library
//C- distributed by Lizardtech Software. On July 19th 2002, Lizardtech
//C- Software authorized us to replace the original DjVu(r) Reference
//C- Library notice by the following text (see doc/lizard2002.djvu):
//C-
//C- ------------------------------------------------------------------
//C- | DjVu (r) Reference Library (v. 3.5)
//C- | Copyright (c) 1999-2001 LizardTech, Inc. All Rights Reserved.
//C- | The DjVu Reference Library is protected by U.S. Pat. No.
//C- | 6,058,214 and patents pending.
//C- |
//C- | This software is subject to, and may be distributed under, the
//C- | GNU General Public License, Version 2. The license should have
//C- | accompanied the software or you may obtain a copy of the license
//C- | from the Free Software Foundation at http://www.fsf.org .
//C- |
//C- | The computer code originally released by LizardTech under this
//C- | license and unmodified by other parties is deemed "the LIZARDTECH
//C- | ORIGINAL CODE." Subject to any third party intellectual property
//C- | claims, LizardTech grants recipient a worldwide, royalty-free,
//C- | non-exclusive license to make, use, sell, or otherwise dispose of
//C- | the LIZARDTECH ORIGINAL CODE or of programs derived from the
//C- | LIZARDTECH ORIGINAL CODE in compliance with the terms of the GNU
//C- | General Public License. This grant only confers the right to
//C- | infringe patent claims underlying the LIZARDTECH ORIGINAL CODE to
//C- | the extent such infringement is reasonably necessary to enable
//C- | recipient to make, have made, practice, sell, or otherwise dispose
//C- | of the LIZARDTECH ORIGINAL CODE (or portions thereof) and not to
//C- | any greater extent that may be necessary to utilize further
//C- | modifications or combinations.
//C- |
//C- | The LIZARDTECH ORIGINAL CODE is provided "AS IS" WITHOUT WARRANTY
//C- | OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
//C- | TO ANY WARRANTY OF NON-INFRINGEMENT, OR ANY IMPLIED WARRANTY OF
//C- | MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
//C- +------------------------------------------------------------------
//
// $Id: ZPCodec.cpp,v 1.10 2004/08/06 14:49:34 leonb Exp $
// $Name: release_3_5_15 $
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#if NEED_GNUG_PRAGMAS
# pragma implementation
#endif
// From: Leon Bottou, 1/31/2002
// Almost equal to my initial code.
#include "ZPCodec.h"
#include "ByteStream.h"
#include "GException.h"
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include <stdio.h>
#ifdef HAVE_NAMESPACES
namespace DJVU {
# ifdef NOT_DEFINED // Just to fool emacs c++ mode
}
#endif
#endif
////////////////////////////////////////////////////////////////
// CODER SPECIFICATION
////////////////////////////////////////////////////////////////
#ifndef ZPCODER
#ifndef ZCODER
#define ZPCODER
#endif
#endif
#ifdef ZCODER
// The ZCODER option is provided for documentation purposes only. The ZCODER
// might come dangerously close to U.S. patent 5059976 (Mitsubishi). This is
// why we always use the ZPCODER, although it usually produces 1% larger files.
#warning "The ZCODER may infringe non-LizardTech patent(s)."
#warning "You should use the ZPCODER instead."
#endif
////////////////////////////////////////////////////////////////
// ZP CODER DEFAULT ADAPTATION TABLE
////////////////////////////////////////////////////////////////
// See ZPCodec::ZPCodec to see how this
// default table is modified when not
// using the DjVu compatibility mode.
static ZPCodec::Table default_ztable[256] =
{
#ifdef ZPCODER
/* This table has been designed for the ZPCoder
* by running the following command in file 'zptable.sn':
* (fast-crude (steady-mat 0.0035 0.0002) 260)))
*/
{ 0x8000, 0x0000, 84, 145 }, /* 000: p=0.500000 ( 0, 0) */
{ 0x8000, 0x0000, 3, 4 }, /* 001: p=0.500000 ( 0, 0) */
{ 0x8000, 0x0000, 4, 3 }, /* 002: p=0.500000 ( 0, 0) */
{ 0x6bbd, 0x10a5, 5, 1 }, /* 003: p=0.465226 ( 0, 0) */
{ 0x6bbd, 0x10a5, 6, 2 }, /* 004: p=0.465226 ( 0, 0) */
{ 0x5d45, 0x1f28, 7, 3 }, /* 005: p=0.430708 ( 0, 0) */
{ 0x5d45, 0x1f28, 8, 4 }, /* 006: p=0.430708 ( 0, 0) */
{ 0x51b9, 0x2bd3, 9, 5 }, /* 007: p=0.396718 ( 0, 0) */
{ 0x51b9, 0x2bd3, 10, 6 }, /* 008: p=0.396718 ( 0, 0) */
{ 0x4813, 0x36e3, 11, 7 }, /* 009: p=0.363535 ( 0, 0) */
{ 0x4813, 0x36e3, 12, 8 }, /* 010: p=0.363535 ( 0, 0) */
{ 0x3fd5, 0x408c, 13, 9 }, /* 011: p=0.331418 ( 0, 0) */
{ 0x3fd5, 0x408c, 14, 10 }, /* 012: p=0.331418 ( 0, 0) */
{ 0x38b1, 0x48fd, 15, 11 }, /* 013: p=0.300585 ( 0, 0) */
{ 0x38b1, 0x48fd, 16, 12 }, /* 014: p=0.300585 ( 0, 0) */
{ 0x3275, 0x505d, 17, 13 }, /* 015: p=0.271213 ( 0, 0) */
{ 0x3275, 0x505d, 18, 14 }, /* 016: p=0.271213 ( 0, 0) */
{ 0x2cfd, 0x56d0, 19, 15 }, /* 017: p=0.243438 ( 0, 0) */
{ 0x2cfd, 0x56d0, 20, 16 }, /* 018: p=0.243438 ( 0, 0) */
{ 0x2825, 0x5c71, 21, 17 }, /* 019: p=0.217391 ( 0, 0) */
{ 0x2825, 0x5c71, 22, 18 }, /* 020: p=0.217391 ( 0, 0) */
{ 0x23ab, 0x615b, 23, 19 }, /* 021: p=0.193150 ( 0, 0) */
{ 0x23ab, 0x615b, 24, 20 }, /* 022: p=0.193150 ( 0, 0) */
{ 0x1f87, 0x65a5, 25, 21 }, /* 023: p=0.170728 ( 0, 0) */
{ 0x1f87, 0x65a5, 26, 22 }, /* 024: p=0.170728 ( 0, 0) */
{ 0x1bbb, 0x6962, 27, 23 }, /* 025: p=0.150158 ( 0, 0) */
{ 0x1bbb, 0x6962, 28, 24 }, /* 026: p=0.150158 ( 0, 0) */
{ 0x1845, 0x6ca2, 29, 25 }, /* 027: p=0.131418 ( 0, 0) */
{ 0x1845, 0x6ca2, 30, 26 }, /* 028: p=0.131418 ( 0, 0) */
{ 0x1523, 0x6f74, 31, 27 }, /* 029: p=0.114460 ( 0, 0) */
{ 0x1523, 0x6f74, 32, 28 }, /* 030: p=0.114460 ( 0, 0) */
{ 0x1253, 0x71e6, 33, 29 }, /* 031: p=0.099230 ( 0, 0) */
{ 0x1253, 0x71e6, 34, 30 }, /* 032: p=0.099230 ( 0, 0) */
{ 0x0fcf, 0x7404, 35, 31 }, /* 033: p=0.085611 ( 0, 0) */
{ 0x0fcf, 0x7404, 36, 32 }, /* 034: p=0.085611 ( 0, 0) */
{ 0x0d95, 0x75d6, 37, 33 }, /* 035: p=0.073550 ( 0, 0) */
{ 0x0d95, 0x75d6, 38, 34 }, /* 036: p=0.073550 ( 0, 0) */
{ 0x0b9d, 0x7768, 39, 35 }, /* 037: p=0.062888 ( 0, 0) */
{ 0x0b9d, 0x7768, 40, 36 }, /* 038: p=0.062888 ( 0, 0) */
{ 0x09e3, 0x78c2, 41, 37 }, /* 039: p=0.053539 ( 0, 0) */
{ 0x09e3, 0x78c2, 42, 38 }, /* 040: p=0.053539 ( 0, 0) */
{ 0x0861, 0x79ea, 43, 39 }, /* 041: p=0.045365 ( 0, 0) */
{ 0x0861, 0x79ea, 44, 40 }, /* 042: p=0.045365 ( 0, 0) */
{ 0x0711, 0x7ae7, 45, 41 }, /* 043: p=0.038272 ( 0, 0) */
{ 0x0711, 0x7ae7, 46, 42 }, /* 044: p=0.038272 ( 0, 0) */
{ 0x05f1, 0x7bbe, 47, 43 }, /* 045: p=0.032174 ( 0, 0) */
{ 0x05f1, 0x7bbe, 48, 44 }, /* 046: p=0.032174 ( 0, 0) */
{ 0x04f9, 0x7c75, 49, 45 }, /* 047: p=0.026928 ( 0, 0) */
{ 0x04f9, 0x7c75, 50, 46 }, /* 048: p=0.026928 ( 0, 0) */
{ 0x0425, 0x7d0f, 51, 47 }, /* 049: p=0.022444 ( 0, 0) */
{ 0x0425, 0x7d0f, 52, 48 }, /* 050: p=0.022444 ( 0, 0) */
{ 0x0371, 0x7d91, 53, 49 }, /* 051: p=0.018636 ( 0, 0) */
{ 0x0371, 0x7d91, 54, 50 }, /* 052: p=0.018636 ( 0, 0) */
{ 0x02d9, 0x7dfe, 55, 51 }, /* 053: p=0.015421 ( 0, 0) */
{ 0x02d9, 0x7dfe, 56, 52 }, /* 054: p=0.015421 ( 0, 0) */
{ 0x0259, 0x7e5a, 57, 53 }, /* 055: p=0.012713 ( 0, 0) */
{ 0x0259, 0x7e5a, 58, 54 }, /* 056: p=0.012713 ( 0, 0) */
{ 0x01ed, 0x7ea6, 59, 55 }, /* 057: p=0.010419 ( 0, 0) */
{ 0x01ed, 0x7ea6, 60, 56 }, /* 058: p=0.010419 ( 0, 0) */
{ 0x0193, 0x7ee6, 61, 57 }, /* 059: p=0.008525 ( 0, 0) */
{ 0x0193, 0x7ee6, 62, 58 }, /* 060: p=0.008525 ( 0, 0) */
{ 0x0149, 0x7f1a, 63, 59 }, /* 061: p=0.006959 ( 0, 0) */
{ 0x0149, 0x7f1a, 64, 60 }, /* 062: p=0.006959 ( 0, 0) */
{ 0x010b, 0x7f45, 65, 61 }, /* 063: p=0.005648 ( 0, 0) */
{ 0x010b, 0x7f45, 66, 62 }, /* 064: p=0.005648 ( 0, 0) */
{ 0x00d5, 0x7f6b, 67, 63 }, /* 065: p=0.004506 ( 0, 0) */
{ 0x00d5, 0x7f6b, 68, 64 }, /* 066: p=0.004506 ( 0, 0) */
{ 0x00a5, 0x7f8d, 69, 65 }, /* 067: p=0.003480 ( 0, 0) */
{ 0x00a5, 0x7f8d, 70, 66 }, /* 068: p=0.003480 ( 0, 0) */
{ 0x007b, 0x7faa, 71, 67 }, /* 069: p=0.002602 ( 0, 0) */
{ 0x007b, 0x7faa, 72, 68 }, /* 070: p=0.002602 ( 0, 0) */
{ 0x0057, 0x7fc3, 73, 69 }, /* 071: p=0.001843 ( 0, 0) */
{ 0x0057, 0x7fc3, 74, 70 }, /* 072: p=0.001843 ( 0, 0) */
{ 0x003b, 0x7fd7, 75, 71 }, /* 073: p=0.001248 ( 0, 0) */
{ 0x003b, 0x7fd7, 76, 72 }, /* 074: p=0.001248 ( 0, 0) */
{ 0x0023, 0x7fe7, 77, 73 }, /* 075: p=0.000749 ( 0, 0) */
{ 0x0023, 0x7fe7, 78, 74 }, /* 076: p=0.000749 ( 0, 0) */
{ 0x0013, 0x7ff2, 79, 75 }, /* 077: p=0.000402 ( 0, 0) */
{ 0x0013, 0x7ff2, 80, 76 }, /* 078: p=0.000402 ( 0, 0) */
{ 0x0007, 0x7ffa, 81, 77 }, /* 079: p=0.000153 ( 0, 0) */
{ 0x0007, 0x7ffa, 82, 78 }, /* 080: p=0.000153 ( 0, 0) */
{ 0x0001, 0x7fff, 81, 79 }, /* 081: p=0.000027 ( 0, 0) */
{ 0x0001, 0x7fff, 82, 80 }, /* 082: p=0.000027 ( 0, 0) */
{ 0x5695, 0x0000, 9, 85 }, /* 083: p=0.411764 ( 2, 3) */
{ 0x24ee, 0x0000, 86, 226 }, /* 084: p=0.199988 ( 1, 0) */
{ 0x8000, 0x0000, 5, 6 }, /* 085: p=0.500000 ( 3, 3) */
{ 0x0d30, 0x0000, 88, 176 }, /* 086: p=0.071422 ( 4, 0) */
{ 0x481a, 0x0000, 89, 143 }, /* 087: p=0.363634 ( 1, 2) */
{ 0x0481, 0x0000, 90, 138 }, /* 088: p=0.024388 ( 13, 0) */
{ 0x3579, 0x0000, 91, 141 }, /* 089: p=0.285711 ( 1, 3) */
{ 0x017a, 0x0000, 92, 112 }, /* 090: p=0.007999 ( 41, 0) */
{ 0x24ef, 0x0000, 93, 135 }, /* 091: p=0.199997 ( 1, 5) */
{ 0x007b, 0x0000, 94, 104 }, /* 092: p=0.002611 ( 127, 0) */
{ 0x1978, 0x0000, 95, 133 }, /* 093: p=0.137929 ( 1, 8) */
{ 0x0028, 0x0000, 96, 100 }, /* 094: p=0.000849 ( 392, 0) */
{ 0x10ca, 0x0000, 97, 129 }, /* 095: p=0.090907 ( 1, 13) */
{ 0x000d, 0x0000, 82, 98 }, /* 096: p=0.000276 ( 1208, 0) */
{ 0x0b5d, 0x0000, 99, 127 }, /* 097: p=0.061537 ( 1, 20) */
{ 0x0034, 0x0000, 76, 72 }, /* 098: p=0.001102 ( 1208, 1) */
{ 0x078a, 0x0000, 101, 125 }, /* 099: p=0.040815 ( 1, 31) */
{ 0x00a0, 0x0000, 70, 102 }, /* 100: p=0.003387 ( 392, 1) */
{ 0x050f, 0x0000, 103, 123 }, /* 101: p=0.027397 ( 1, 47) */
{ 0x0117, 0x0000, 66, 60 }, /* 102: p=0.005912 ( 392, 2) */
{ 0x0358, 0x0000, 105, 121 }, /* 103: p=0.018099 ( 1, 72) */
{ 0x01ea, 0x0000, 106, 110 }, /* 104: p=0.010362 ( 127, 1) */
{ 0x0234, 0x0000, 107, 119 }, /* 105: p=0.011940 ( 1, 110) */
{ 0x0144, 0x0000, 66, 108 }, /* 106: p=0.006849 ( 193, 1) */
{ 0x0173, 0x0000, 109, 117 }, /* 107: p=0.007858 ( 1, 168) */
{ 0x0234, 0x0000, 60, 54 }, /* 108: p=0.011925 ( 193, 2) */
{ 0x00f5, 0x0000, 111, 115 }, /* 109: p=0.005175 ( 1, 256) */
{ 0x0353, 0x0000, 56, 48 }, /* 110: p=0.017995 ( 127, 2) */
{ 0x00a1, 0x0000, 69, 113 }, /* 111: p=0.003413 ( 1, 389) */
{ 0x05c5, 0x0000, 114, 134 }, /* 112: p=0.031249 ( 41, 1) */
{ 0x011a, 0x0000, 65, 59 }, /* 113: p=0.005957 ( 2, 389) */
{ 0x03cf, 0x0000, 116, 132 }, /* 114: p=0.020618 ( 63, 1) */
{ 0x01aa, 0x0000, 61, 55 }, /* 115: p=0.009020 ( 2, 256) */
{ 0x0285, 0x0000, 118, 130 }, /* 116: p=0.013652 ( 96, 1) */
{ 0x0286, 0x0000, 57, 51 }, /* 117: p=0.013672 ( 2, 168) */
{ 0x01ab, 0x0000, 120, 128 }, /* 118: p=0.009029 ( 146, 1) */
{ 0x03d3, 0x0000, 53, 47 }, /* 119: p=0.020710 ( 2, 110) */
{ 0x011a, 0x0000, 122, 126 }, /* 120: p=0.005961 ( 222, 1) */
{ 0x05c5, 0x0000, 49, 41 }, /* 121: p=0.031250 ( 2, 72) */
{ 0x00ba, 0x0000, 124, 62 }, /* 122: p=0.003925 ( 338, 1) */
{ 0x08ad, 0x0000, 43, 37 }, /* 123: p=0.046979 ( 2, 47) */
{ 0x007a, 0x0000, 72, 66 }, /* 124: p=0.002586 ( 514, 1) */
{ 0x0ccc, 0x0000, 39, 31 }, /* 125: p=0.069306 ( 2, 31) */
{ 0x01eb, 0x0000, 60, 54 }, /* 126: p=0.010386 ( 222, 2) */
{ 0x1302, 0x0000, 33, 25 }, /* 127: p=0.102940 ( 2, 20) */
{ 0x02e6, 0x0000, 56, 50 }, /* 128: p=0.015695 ( 146, 2) */
{ 0x1b81, 0x0000, 29, 131 }, /* 129: p=0.148935 ( 2, 13) */
{ 0x045e, 0x0000, 52, 46 }, /* 130: p=0.023648 ( 96, 2) */
{ 0x24ef, 0x0000, 23, 17 }, /* 131: p=0.199999 ( 3, 13) */
{ 0x0690, 0x0000, 48, 40 }, /* 132: p=0.035533 ( 63, 2) */
{ 0x2865, 0x0000, 23, 15 }, /* 133: p=0.218748 ( 2, 8) */
{ 0x09de, 0x0000, 42, 136 }, /* 134: p=0.053434 ( 41, 2) */
{ 0x3987, 0x0000, 137, 7 }, /* 135: p=0.304346 ( 2, 5) */
{ 0x0dc8, 0x0000, 38, 32 }, /* 136: p=0.074626 ( 41, 3) */
{ 0x2c99, 0x0000, 21, 139 }, /* 137: p=0.241378 ( 2, 7) */
{ 0x10ca, 0x0000, 140, 172 }, /* 138: p=0.090907 ( 13, 1) */
{ 0x3b5f, 0x0000, 15, 9 }, /* 139: p=0.312499 ( 3, 7) */
{ 0x0b5d, 0x0000, 142, 170 }, /* 140: p=0.061537 ( 20, 1) */
{ 0x5695, 0x0000, 9, 85 }, /* 141: p=0.411764 ( 2, 3) */
{ 0x078a, 0x0000, 144, 168 }, /* 142: p=0.040815 ( 31, 1) */
{ 0x8000, 0x0000, 141, 248 }, /* 143: p=0.500000 ( 2, 2) */
{ 0x050f, 0x0000, 146, 166 }, /* 144: p=0.027397 ( 47, 1) */
{ 0x24ee, 0x0000, 147, 247 }, /* 145: p=0.199988 ( 0, 1) */
{ 0x0358, 0x0000, 148, 164 }, /* 146: p=0.018099 ( 72, 1) */
{ 0x0d30, 0x0000, 149, 197 }, /* 147: p=0.071422 ( 0, 4) */
{ 0x0234, 0x0000, 150, 162 }, /* 148: p=0.011940 ( 110, 1) */
{ 0x0481, 0x0000, 151, 95 }, /* 149: p=0.024388 ( 0, 13) */
{ 0x0173, 0x0000, 152, 160 }, /* 150: p=0.007858 ( 168, 1) */
{ 0x017a, 0x0000, 153, 173 }, /* 151: p=0.007999 ( 0, 41) */
{ 0x00f5, 0x0000, 154, 158 }, /* 152: p=0.005175 ( 256, 1) */
{ 0x007b, 0x0000, 155, 165 }, /* 153: p=0.002611 ( 0, 127) */
{ 0x00a1, 0x0000, 70, 156 }, /* 154: p=0.003413 ( 389, 1) */
{ 0x0028, 0x0000, 157, 161 }, /* 155: p=0.000849 ( 0, 392) */
{ 0x011a, 0x0000, 66, 60 }, /* 156: p=0.005957 ( 389, 2) */
{ 0x000d, 0x0000, 81, 159 }, /* 157: p=0.000276 ( 0, 1208) */
{ 0x01aa, 0x0000, 62, 56 }, /* 158: p=0.009020 ( 256, 2) */
{ 0x0034, 0x0000, 75, 71 }, /* 159: p=0.001102 ( 1, 1208) */
{ 0x0286, 0x0000, 58, 52 }, /* 160: p=0.013672 ( 168, 2) */
{ 0x00a0, 0x0000, 69, 163 }, /* 161: p=0.003387 ( 1, 392) */
{ 0x03d3, 0x0000, 54, 48 }, /* 162: p=0.020710 ( 110, 2) */
{ 0x0117, 0x0000, 65, 59 }, /* 163: p=0.005912 ( 2, 392) */
{ 0x05c5, 0x0000, 50, 42 }, /* 164: p=0.031250 ( 72, 2) */
{ 0x01ea, 0x0000, 167, 171 }, /* 165: p=0.010362 ( 1, 127) */
{ 0x08ad, 0x0000, 44, 38 }, /* 166: p=0.046979 ( 47, 2) */
{ 0x0144, 0x0000, 65, 169 }, /* 167: p=0.006849 ( 1, 193) */
{ 0x0ccc, 0x0000, 40, 32 }, /* 168: p=0.069306 ( 31, 2) */
{ 0x0234, 0x0000, 59, 53 }, /* 169: p=0.011925 ( 2, 193) */
{ 0x1302, 0x0000, 34, 26 }, /* 170: p=0.102940 ( 20, 2) */
{ 0x0353, 0x0000, 55, 47 }, /* 171: p=0.017995 ( 2, 127) */
{ 0x1b81, 0x0000, 30, 174 }, /* 172: p=0.148935 ( 13, 2) */
{ 0x05c5, 0x0000, 175, 193 }, /* 173: p=0.031249 ( 1, 41) */
{ 0x24ef, 0x0000, 24, 18 }, /* 174: p=0.199999 ( 13, 3) */
{ 0x03cf, 0x0000, 177, 191 }, /* 175: p=0.020618 ( 1, 63) */
{ 0x2b74, 0x0000, 178, 222 }, /* 176: p=0.235291 ( 4, 1) */
{ 0x0285, 0x0000, 179, 189 }, /* 177: p=0.013652 ( 1, 96) */
{ 0x201d, 0x0000, 180, 218 }, /* 178: p=0.173910 ( 6, 1) */
{ 0x01ab, 0x0000, 181, 187 }, /* 179: p=0.009029 ( 1, 146) */
{ 0x1715, 0x0000, 182, 216 }, /* 180: p=0.124998 ( 9, 1) */
{ 0x011a, 0x0000, 183, 185 }, /* 181: p=0.005961 ( 1, 222) */
{ 0x0fb7, 0x0000, 184, 214 }, /* 182: p=0.085105 ( 14, 1) */
{ 0x00ba, 0x0000, 69, 61 }, /* 183: p=0.003925 ( 1, 338) */
{ 0x0a67, 0x0000, 186, 212 }, /* 184: p=0.056337 ( 22, 1) */
{ 0x01eb, 0x0000, 59, 53 }, /* 185: p=0.010386 ( 2, 222) */
{ 0x06e7, 0x0000, 188, 210 }, /* 186: p=0.037382 ( 34, 1) */
{ 0x02e6, 0x0000, 55, 49 }, /* 187: p=0.015695 ( 2, 146) */
{ 0x0496, 0x0000, 190, 208 }, /* 188: p=0.024844 ( 52, 1) */
{ 0x045e, 0x0000, 51, 45 }, /* 189: p=0.023648 ( 2, 96) */
{ 0x030d, 0x0000, 192, 206 }, /* 190: p=0.016529 ( 79, 1) */
{ 0x0690, 0x0000, 47, 39 }, /* 191: p=0.035533 ( 2, 63) */
{ 0x0206, 0x0000, 194, 204 }, /* 192: p=0.010959 ( 120, 1) */
{ 0x09de, 0x0000, 41, 195 }, /* 193: p=0.053434 ( 2, 41) */
{ 0x0155, 0x0000, 196, 202 }, /* 194: p=0.007220 ( 183, 1) */
{ 0x0dc8, 0x0000, 37, 31 }, /* 195: p=0.074626 ( 3, 41) */
{ 0x00e1, 0x0000, 198, 200 }, /* 196: p=0.004750 ( 279, 1) */
{ 0x2b74, 0x0000, 199, 243 }, /* 197: p=0.235291 ( 1, 4) */
{ 0x0094, 0x0000, 72, 64 }, /* 198: p=0.003132 ( 424, 1) */
{ 0x201d, 0x0000, 201, 239 }, /* 199: p=0.173910 ( 1, 6) */
{ 0x0188, 0x0000, 62, 56 }, /* 200: p=0.008284 ( 279, 2) */
{ 0x1715, 0x0000, 203, 237 }, /* 201: p=0.124998 ( 1, 9) */
{ 0x0252, 0x0000, 58, 52 }, /* 202: p=0.012567 ( 183, 2) */
{ 0x0fb7, 0x0000, 205, 235 }, /* 203: p=0.085105 ( 1, 14) */
{ 0x0383, 0x0000, 54, 48 }, /* 204: p=0.019021 ( 120, 2) */
{ 0x0a67, 0x0000, 207, 233 }, /* 205: p=0.056337 ( 1, 22) */
{ 0x0547, 0x0000, 50, 44 }, /* 206: p=0.028571 ( 79, 2) */
{ 0x06e7, 0x0000, 209, 231 }, /* 207: p=0.037382 ( 1, 34) */
{ 0x07e2, 0x0000, 46, 38 }, /* 208: p=0.042682 ( 52, 2) */
{ 0x0496, 0x0000, 211, 229 }, /* 209: p=0.024844 ( 1, 52) */
{ 0x0bc0, 0x0000, 40, 34 }, /* 210: p=0.063636 ( 34, 2) */
{ 0x030d, 0x0000, 213, 227 }, /* 211: p=0.016529 ( 1, 79) */
{ 0x1178, 0x0000, 36, 28 }, /* 212: p=0.094593 ( 22, 2) */
{ 0x0206, 0x0000, 215, 225 }, /* 213: p=0.010959 ( 1, 120) */
{ 0x19da, 0x0000, 30, 22 }, /* 214: p=0.139999 ( 14, 2) */
{ 0x0155, 0x0000, 217, 223 }, /* 215: p=0.007220 ( 1, 183) */
{ 0x24ef, 0x0000, 26, 16 }, /* 216: p=0.199998 ( 9, 2) */
{ 0x00e1, 0x0000, 219, 221 }, /* 217: p=0.004750 ( 1, 279) */
{ 0x320e, 0x0000, 20, 220 }, /* 218: p=0.269229 ( 6, 2) */
{ 0x0094, 0x0000, 71, 63 }, /* 219: p=0.003132 ( 1, 424) */
{ 0x432a, 0x0000, 14, 8 }, /* 220: p=0.344827 ( 6, 3) */
{ 0x0188, 0x0000, 61, 55 }, /* 221: p=0.008284 ( 2, 279) */
{ 0x447d, 0x0000, 14, 224 }, /* 222: p=0.349998 ( 4, 2) */
{ 0x0252, 0x0000, 57, 51 }, /* 223: p=0.012567 ( 2, 183) */
{ 0x5ece, 0x0000, 8, 2 }, /* 224: p=0.434782 ( 4, 3) */
{ 0x0383, 0x0000, 53, 47 }, /* 225: p=0.019021 ( 2, 120) */
{ 0x8000, 0x0000, 228, 87 }, /* 226: p=0.500000 ( 1, 1) */
{ 0x0547, 0x0000, 49, 43 }, /* 227: p=0.028571 ( 2, 79) */
{ 0x481a, 0x0000, 230, 246 }, /* 228: p=0.363634 ( 2, 1) */
{ 0x07e2, 0x0000, 45, 37 }, /* 229: p=0.042682 ( 2, 52) */
{ 0x3579, 0x0000, 232, 244 }, /* 230: p=0.285711 ( 3, 1) */
{ 0x0bc0, 0x0000, 39, 33 }, /* 231: p=0.063636 ( 2, 34) */
{ 0x24ef, 0x0000, 234, 238 }, /* 232: p=0.199997 ( 5, 1) */
{ 0x1178, 0x0000, 35, 27 }, /* 233: p=0.094593 ( 2, 22) */
{ 0x1978, 0x0000, 138, 236 }, /* 234: p=0.137929 ( 8, 1) */
{ 0x19da, 0x0000, 29, 21 }, /* 235: p=0.139999 ( 2, 14) */
{ 0x2865, 0x0000, 24, 16 }, /* 236: p=0.218748 ( 8, 2) */
{ 0x24ef, 0x0000, 25, 15 }, /* 237: p=0.199998 ( 2, 9) */
{ 0x3987, 0x0000, 240, 8 }, /* 238: p=0.304346 ( 5, 2) */
{ 0x320e, 0x0000, 19, 241 }, /* 239: p=0.269229 ( 2, 6) */
{ 0x2c99, 0x0000, 22, 242 }, /* 240: p=0.241378 ( 7, 2) */
{ 0x432a, 0x0000, 13, 7 }, /* 241: p=0.344827 ( 3, 6) */
{ 0x3b5f, 0x0000, 16, 10 }, /* 242: p=0.312499 ( 7, 3) */
{ 0x447d, 0x0000, 13, 245 }, /* 243: p=0.349998 ( 2, 4) */
{ 0x5695, 0x0000, 10, 2 }, /* 244: p=0.411764 ( 3, 2) */
{ 0x5ece, 0x0000, 7, 1 }, /* 245: p=0.434782 ( 3, 4) */
{ 0x8000, 0x0000, 244, 83 }, /* 246: p=0.500000 ( 2, 2) */
{ 0x8000, 0x0000, 249, 250 }, /* 247: p=0.500000 ( 1, 1) */
{ 0x5695, 0x0000, 10, 2 }, /* 248: p=0.411764 ( 3, 2) */
{ 0x481a, 0x0000, 89, 143 }, /* 249: p=0.363634 ( 1, 2) */
{ 0x481a, 0x0000, 230, 246 }, /* 250: p=0.363634 ( 2, 1) */
#endif
#ifdef ZCODER
/* This table has been designed for the ZCoder
* by running the following command in file 'ztable2.sn':
* (fast-crude (steady-mat 0.0035 0.0002) 260)))
*/
{ 0x8000, 0x0000, 84, 139 }, /* 000: p=0.500000 ( 0, 0) */
{ 0x8000, 0x0000, 3, 4 }, /* 001: p=0.500000 ( 0, 0) */
{ 0x8000, 0x0000, 4, 3 }, /* 002: p=0.500000 ( 0, 0) */
{ 0x7399, 0x10a5, 5, 1 }, /* 003: p=0.465226 ( 0, 0) */
{ 0x7399, 0x10a5, 6, 2 }, /* 004: p=0.465226 ( 0, 0) */
{ 0x6813, 0x1f28, 7, 3 }, /* 005: p=0.430708 ( 0, 0) */
{ 0x6813, 0x1f28, 8, 4 }, /* 006: p=0.430708 ( 0, 0) */
{ 0x5d65, 0x2bd3, 9, 5 }, /* 007: p=0.396718 ( 0, 0) */
{ 0x5d65, 0x2bd3, 10, 6 }, /* 008: p=0.396718 ( 0, 0) */
{ 0x5387, 0x36e3, 11, 7 }, /* 009: p=0.363535 ( 0, 0) */
{ 0x5387, 0x36e3, 12, 8 }, /* 010: p=0.363535 ( 0, 0) */
{ 0x4a73, 0x408c, 13, 9 }, /* 011: p=0.331418 ( 0, 0) */
{ 0x4a73, 0x408c, 14, 10 }, /* 012: p=0.331418 ( 0, 0) */
{ 0x421f, 0x48fe, 15, 11 }, /* 013: p=0.300562 ( 0, 0) */
{ 0x421f, 0x48fe, 16, 12 }, /* 014: p=0.300562 ( 0, 0) */
{ 0x3a85, 0x5060, 17, 13 }, /* 015: p=0.271166 ( 0, 0) */
{ 0x3a85, 0x5060, 18, 14 }, /* 016: p=0.271166 ( 0, 0) */
{ 0x339b, 0x56d3, 19, 15 }, /* 017: p=0.243389 ( 0, 0) */
{ 0x339b, 0x56d3, 20, 16 }, /* 018: p=0.243389 ( 0, 0) */
{ 0x2d59, 0x5c73, 21, 17 }, /* 019: p=0.217351 ( 0, 0) */
{ 0x2d59, 0x5c73, 22, 18 }, /* 020: p=0.217351 ( 0, 0) */
{ 0x27b3, 0x615e, 23, 19 }, /* 021: p=0.193091 ( 0, 0) */
{ 0x27b3, 0x615e, 24, 20 }, /* 022: p=0.193091 ( 0, 0) */
{ 0x22a1, 0x65a7, 25, 21 }, /* 023: p=0.170683 ( 0, 0) */
{ 0x22a1, 0x65a7, 26, 22 }, /* 024: p=0.170683 ( 0, 0) */
{ 0x1e19, 0x6963, 27, 23 }, /* 025: p=0.150134 ( 0, 0) */
{ 0x1e19, 0x6963, 28, 24 }, /* 026: p=0.150134 ( 0, 0) */
{ 0x1a0f, 0x6ca3, 29, 25 }, /* 027: p=0.131397 ( 0, 0) */
{ 0x1a0f, 0x6ca3, 30, 26 }, /* 028: p=0.131397 ( 0, 0) */
{ 0x167b, 0x6f75, 31, 27 }, /* 029: p=0.114441 ( 0, 0) */
{ 0x167b, 0x6f75, 32, 28 }, /* 030: p=0.114441 ( 0, 0) */
{ 0x1353, 0x71e6, 33, 29 }, /* 031: p=0.099214 ( 0, 0) */
{ 0x1353, 0x71e6, 34, 30 }, /* 032: p=0.099214 ( 0, 0) */
{ 0x108d, 0x7403, 35, 31 }, /* 033: p=0.085616 ( 0, 0) */
{ 0x108d, 0x7403, 36, 32 }, /* 034: p=0.085616 ( 0, 0) */
{ 0x0e1f, 0x75d7, 37, 33 }, /* 035: p=0.073525 ( 0, 0) */
{ 0x0e1f, 0x75d7, 38, 34 }, /* 036: p=0.073525 ( 0, 0) */
{ 0x0c01, 0x7769, 39, 35 }, /* 037: p=0.062871 ( 0, 0) */
{ 0x0c01, 0x7769, 40, 36 }, /* 038: p=0.062871 ( 0, 0) */
{ 0x0a2b, 0x78c2, 41, 37 }, /* 039: p=0.053524 ( 0, 0) */
{ 0x0a2b, 0x78c2, 42, 38 }, /* 040: p=0.053524 ( 0, 0) */
{ 0x0895, 0x79ea, 43, 39 }, /* 041: p=0.045374 ( 0, 0) */
{ 0x0895, 0x79ea, 44, 40 }, /* 042: p=0.045374 ( 0, 0) */
{ 0x0737, 0x7ae7, 45, 41 }, /* 043: p=0.038280 ( 0, 0) */
{ 0x0737, 0x7ae7, 46, 42 }, /* 044: p=0.038280 ( 0, 0) */
{ 0x060b, 0x7bbe, 47, 43 }, /* 045: p=0.032175 ( 0, 0) */
{ 0x060b, 0x7bbe, 48, 44 }, /* 046: p=0.032175 ( 0, 0) */
{ 0x050b, 0x7c75, 49, 45 }, /* 047: p=0.026926 ( 0, 0) */
{ 0x050b, 0x7c75, 50, 46 }, /* 048: p=0.026926 ( 0, 0) */
{ 0x0431, 0x7d10, 51, 47 }, /* 049: p=0.022430 ( 0, 0) */
{ 0x0431, 0x7d10, 52, 48 }, /* 050: p=0.022430 ( 0, 0) */
{ 0x0379, 0x7d92, 53, 49 }, /* 051: p=0.018623 ( 0, 0) */
{ 0x0379, 0x7d92, 54, 50 }, /* 052: p=0.018623 ( 0, 0) */
{ 0x02dd, 0x7dff, 55, 51 }, /* 053: p=0.015386 ( 0, 0) */
{ 0x02dd, 0x7dff, 56, 52 }, /* 054: p=0.015386 ( 0, 0) */
{ 0x025b, 0x7e5b, 57, 53 }, /* 055: p=0.012671 ( 0, 0) */
{ 0x025b, 0x7e5b, 58, 54 }, /* 056: p=0.012671 ( 0, 0) */
{ 0x01ef, 0x7ea7, 59, 55 }, /* 057: p=0.010414 ( 0, 0) */
{ 0x01ef, 0x7ea7, 60, 56 }, /* 058: p=0.010414 ( 0, 0) */
{ 0x0195, 0x7ee6, 61, 57 }, /* 059: p=0.008529 ( 0, 0) */
{ 0x0195, 0x7ee6, 62, 58 }, /* 060: p=0.008529 ( 0, 0) */
{ 0x0149, 0x7f1b, 63, 59 }, /* 061: p=0.006935 ( 0, 0) */
{ 0x0149, 0x7f1b, 64, 60 }, /* 062: p=0.006935 ( 0, 0) */
{ 0x010b, 0x7f46, 65, 61 }, /* 063: p=0.005631 ( 0, 0) */
{ 0x010b, 0x7f46, 66, 62 }, /* 064: p=0.005631 ( 0, 0) */
{ 0x00d5, 0x7f6c, 67, 63 }, /* 065: p=0.004495 ( 0, 0) */
{ 0x00d5, 0x7f6c, 68, 64 }, /* 066: p=0.004495 ( 0, 0) */
{ 0x00a5, 0x7f8d, 69, 65 }, /* 067: p=0.003484 ( 0, 0) */
{ 0x00a5, 0x7f8d, 70, 66 }, /* 068: p=0.003484 ( 0, 0) */
{ 0x007b, 0x7faa, 71, 67 }, /* 069: p=0.002592 ( 0, 0) */
{ 0x007b, 0x7faa, 72, 68 }, /* 070: p=0.002592 ( 0, 0) */
{ 0x0057, 0x7fc3, 73, 69 }, /* 071: p=0.001835 ( 0, 0) */
{ 0x0057, 0x7fc3, 74, 70 }, /* 072: p=0.001835 ( 0, 0) */
{ 0x0039, 0x7fd8, 75, 71 }, /* 073: p=0.001211 ( 0, 0) */
{ 0x0039, 0x7fd8, 76, 72 }, /* 074: p=0.001211 ( 0, 0) */
{ 0x0023, 0x7fe7, 77, 73 }, /* 075: p=0.000740 ( 0, 0) */
{ 0x0023, 0x7fe7, 78, 74 }, /* 076: p=0.000740 ( 0, 0) */
{ 0x0013, 0x7ff2, 79, 75 }, /* 077: p=0.000402 ( 0, 0) */
{ 0x0013, 0x7ff2, 80, 76 }, /* 078: p=0.000402 ( 0, 0) */
{ 0x0007, 0x7ffa, 81, 77 }, /* 079: p=0.000153 ( 0, 0) */
{ 0x0007, 0x7ffa, 82, 78 }, /* 080: p=0.000153 ( 0, 0) */
{ 0x0001, 0x7fff, 81, 79 }, /* 081: p=0.000027 ( 0, 0) */
{ 0x0001, 0x7fff, 82, 80 }, /* 082: p=0.000027 ( 0, 0) */
{ 0x620b, 0x0000, 9, 85 }, /* 083: p=0.411764 ( 2, 3) */
{ 0x294a, 0x0000, 86, 216 }, /* 084: p=0.199988 ( 1, 0) */
{ 0x8000, 0x0000, 5, 6 }, /* 085: p=0.500000 ( 3, 3) */
{ 0x0db3, 0x0000, 88, 168 }, /* 086: p=0.071422 ( 4, 0) */
{ 0x538e, 0x0000, 89, 137 }, /* 087: p=0.363634 ( 1, 2) */
{ 0x0490, 0x0000, 90, 134 }, /* 088: p=0.024388 ( 13, 0) */
{ 0x3e3e, 0x0000, 91, 135 }, /* 089: p=0.285711 ( 1, 3) */
{ 0x017c, 0x0000, 92, 112 }, /* 090: p=0.007999 ( 41, 0) */
{ 0x294a, 0x0000, 93, 133 }, /* 091: p=0.199997 ( 1, 5) */
{ 0x007c, 0x0000, 94, 104 }, /* 092: p=0.002611 ( 127, 0) */
{ 0x1b75, 0x0000, 95, 131 }, /* 093: p=0.137929 ( 1, 8) */
{ 0x0028, 0x0000, 96, 100 }, /* 094: p=0.000849 ( 392, 0) */
{ 0x12fc, 0x0000, 97, 129 }, /* 095: p=0.097559 ( 1, 12) */
{ 0x000d, 0x0000, 82, 98 }, /* 096: p=0.000276 ( 1208, 0) */
{ 0x0cfb, 0x0000, 99, 125 }, /* 097: p=0.067795 ( 1, 18) */
{ 0x0034, 0x0000, 76, 72 }, /* 098: p=0.001102 ( 1208, 1) */
{ 0x08cd, 0x0000, 101, 123 }, /* 099: p=0.046511 ( 1, 27) */
{ 0x00a0, 0x0000, 70, 102 }, /* 100: p=0.003387 ( 392, 1) */
{ 0x05de, 0x0000, 103, 119 }, /* 101: p=0.031249 ( 1, 41) */
{ 0x0118, 0x0000, 66, 60 }, /* 102: p=0.005912 ( 392, 2) */
{ 0x03e9, 0x0000, 105, 117 }, /* 103: p=0.020942 ( 1, 62) */
{ 0x01ed, 0x0000, 106, 110 }, /* 104: p=0.010362 ( 127, 1) */
{ 0x0298, 0x0000, 107, 115 }, /* 105: p=0.013937 ( 1, 94) */
{ 0x0145, 0x0000, 66, 108 }, /* 106: p=0.006849 ( 193, 1) */
{ 0x01b6, 0x0000, 109, 113 }, /* 107: p=0.009216 ( 1, 143) */
{ 0x0237, 0x0000, 60, 54 }, /* 108: p=0.011925 ( 193, 2) */
{ 0x0121, 0x0000, 65, 111 }, /* 109: p=0.006097 ( 1, 217) */
{ 0x035b, 0x0000, 56, 48 }, /* 110: p=0.017995 ( 127, 2) */
{ 0x01f9, 0x0000, 59, 53 }, /* 111: p=0.010622 ( 2, 217) */
{ 0x05de, 0x0000, 114, 130 }, /* 112: p=0.031249 ( 41, 1) */
{ 0x02fc, 0x0000, 55, 49 }, /* 113: p=0.016018 ( 2, 143) */
{ 0x03e9, 0x0000, 116, 128 }, /* 114: p=0.020942 ( 62, 1) */
{ 0x0484, 0x0000, 51, 45 }, /* 115: p=0.024138 ( 2, 94) */
{ 0x0298, 0x0000, 118, 126 }, /* 116: p=0.013937 ( 94, 1) */
{ 0x06ca, 0x0000, 47, 39 }, /* 117: p=0.036082 ( 2, 62) */
{ 0x01b6, 0x0000, 120, 124 }, /* 118: p=0.009216 ( 143, 1) */
{ 0x0a27, 0x0000, 41, 121 }, /* 119: p=0.053434 ( 2, 41) */
{ 0x0121, 0x0000, 66, 122 }, /* 120: p=0.006097 ( 217, 1) */
{ 0x0e57, 0x0000, 37, 31 }, /* 121: p=0.074626 ( 3, 41) */
{ 0x01f9, 0x0000, 60, 54 }, /* 122: p=0.010622 ( 217, 2) */
{ 0x0f25, 0x0000, 37, 29 }, /* 123: p=0.078651 ( 2, 27) */
{ 0x02fc, 0x0000, 56, 50 }, /* 124: p=0.016018 ( 143, 2) */
{ 0x1629, 0x0000, 33, 127 }, /* 125: p=0.112902 ( 2, 18) */
{ 0x0484, 0x0000, 52, 46 }, /* 126: p=0.024138 ( 94, 2) */
{ 0x1ee8, 0x0000, 27, 21 }, /* 127: p=0.153845 ( 3, 18) */
{ 0x06ca, 0x0000, 48, 40 }, /* 128: p=0.036082 ( 62, 2) */
{ 0x200f, 0x0000, 27, 19 }, /* 129: p=0.159089 ( 2, 12) */
{ 0x0a27, 0x0000, 42, 132 }, /* 130: p=0.053434 ( 41, 2) */
{ 0x2dae, 0x0000, 21, 15 }, /* 131: p=0.218748 ( 2, 8) */
{ 0x0e57, 0x0000, 38, 32 }, /* 132: p=0.074626 ( 41, 3) */
{ 0x4320, 0x0000, 15, 7 }, /* 133: p=0.304346 ( 2, 5) */
{ 0x11a0, 0x0000, 136, 164 }, /* 134: p=0.090907 ( 13, 1) */
{ 0x620b, 0x0000, 9, 85 }, /* 135: p=0.411764 ( 2, 3) */
{ 0x0bbe, 0x0000, 138, 162 }, /* 136: p=0.061537 ( 20, 1) */
{ 0x8000, 0x0000, 135, 248 }, /* 137: p=0.500000 ( 2, 2) */
{ 0x07f3, 0x0000, 140, 160 }, /* 138: p=0.042104 ( 30, 1) */
{ 0x294a, 0x0000, 141, 247 }, /* 139: p=0.199988 ( 0, 1) */
{ 0x053e, 0x0000, 142, 158 }, /* 140: p=0.027971 ( 46, 1) */
{ 0x0db3, 0x0000, 143, 199 }, /* 141: p=0.071422 ( 0, 4) */
{ 0x0378, 0x0000, 144, 156 }, /* 142: p=0.018604 ( 70, 1) */
{ 0x0490, 0x0000, 145, 167 }, /* 143: p=0.024388 ( 0, 13) */
{ 0x024d, 0x0000, 146, 154 }, /* 144: p=0.012384 ( 106, 1) */
{ 0x017c, 0x0000, 147, 101 }, /* 145: p=0.007999 ( 0, 41) */
{ 0x0185, 0x0000, 148, 152 }, /* 146: p=0.008197 ( 161, 1) */
{ 0x007c, 0x0000, 149, 159 }, /* 147: p=0.002611 ( 0, 127) */
{ 0x0100, 0x0000, 68, 150 }, /* 148: p=0.005405 ( 245, 1) */
{ 0x0028, 0x0000, 151, 155 }, /* 149: p=0.000849 ( 0, 392) */
{ 0x01c0, 0x0000, 62, 56 }, /* 150: p=0.009421 ( 245, 2) */
{ 0x000d, 0x0000, 81, 153 }, /* 151: p=0.000276 ( 0, 1208) */
{ 0x02a7, 0x0000, 58, 52 }, /* 152: p=0.014256 ( 161, 2) */
{ 0x0034, 0x0000, 75, 71 }, /* 153: p=0.001102 ( 1, 1208) */
{ 0x0403, 0x0000, 54, 46 }, /* 154: p=0.021472 ( 106, 2) */
{ 0x00a0, 0x0000, 69, 157 }, /* 155: p=0.003387 ( 1, 392) */
{ 0x0608, 0x0000, 48, 42 }, /* 156: p=0.032110 ( 70, 2) */
{ 0x0118, 0x0000, 65, 59 }, /* 157: p=0.005912 ( 2, 392) */
{ 0x0915, 0x0000, 44, 38 }, /* 158: p=0.047945 ( 46, 2) */
{ 0x01ed, 0x0000, 161, 165 }, /* 159: p=0.010362 ( 1, 127) */
{ 0x0db4, 0x0000, 40, 32 }, /* 160: p=0.071428 ( 30, 2) */
{ 0x0145, 0x0000, 65, 163 }, /* 161: p=0.006849 ( 1, 193) */
{ 0x1417, 0x0000, 34, 26 }, /* 162: p=0.102940 ( 20, 2) */
{ 0x0237, 0x0000, 59, 53 }, /* 163: p=0.011925 ( 2, 193) */
{ 0x1dd6, 0x0000, 30, 166 }, /* 164: p=0.148935 ( 13, 2) */
{ 0x035b, 0x0000, 55, 47 }, /* 165: p=0.017995 ( 2, 127) */
{ 0x294a, 0x0000, 24, 18 }, /* 166: p=0.199999 ( 13, 3) */
{ 0x11a0, 0x0000, 169, 195 }, /* 167: p=0.090907 ( 1, 13) */
{ 0x31a3, 0x0000, 170, 212 }, /* 168: p=0.235291 ( 4, 1) */
{ 0x0bbe, 0x0000, 171, 193 }, /* 169: p=0.061537 ( 1, 20) */
{ 0x235a, 0x0000, 172, 208 }, /* 170: p=0.173910 ( 6, 1) */
{ 0x07f3, 0x0000, 173, 191 }, /* 171: p=0.042104 ( 1, 30) */
{ 0x18b3, 0x0000, 174, 206 }, /* 172: p=0.124998 ( 9, 1) */
{ 0x053e, 0x0000, 175, 189 }, /* 173: p=0.027971 ( 1, 46) */
{ 0x1073, 0x0000, 176, 204 }, /* 174: p=0.085105 ( 14, 1) */
{ 0x0378, 0x0000, 177, 187 }, /* 175: p=0.018604 ( 1, 70) */
{ 0x0b35, 0x0000, 178, 200 }, /* 176: p=0.058822 ( 21, 1) */
{ 0x024d, 0x0000, 179, 185 }, /* 177: p=0.012384 ( 1, 106) */
{ 0x0778, 0x0000, 180, 198 }, /* 178: p=0.039603 ( 32, 1) */
{ 0x0185, 0x0000, 181, 183 }, /* 179: p=0.008197 ( 1, 161) */
{ 0x04ed, 0x0000, 182, 194 }, /* 180: p=0.026315 ( 49, 1) */
{ 0x0100, 0x0000, 67, 59 }, /* 181: p=0.005405 ( 1, 245) */
{ 0x0349, 0x0000, 184, 192 }, /* 182: p=0.017621 ( 74, 1) */
{ 0x02a7, 0x0000, 57, 51 }, /* 183: p=0.014256 ( 2, 161) */
{ 0x022e, 0x0000, 186, 190 }, /* 184: p=0.011730 ( 112, 1) */
{ 0x0403, 0x0000, 53, 45 }, /* 185: p=0.021472 ( 2, 106) */
{ 0x0171, 0x0000, 64, 188 }, /* 186: p=0.007767 ( 170, 1) */
{ 0x0608, 0x0000, 47, 41 }, /* 187: p=0.032110 ( 2, 70) */
{ 0x0283, 0x0000, 58, 52 }, /* 188: p=0.013513 ( 170, 2) */
{ 0x0915, 0x0000, 43, 37 }, /* 189: p=0.047945 ( 2, 46) */
{ 0x03cc, 0x0000, 54, 48 }, /* 190: p=0.020349 ( 112, 2) */
{ 0x0db4, 0x0000, 39, 31 }, /* 191: p=0.071428 ( 2, 30) */
{ 0x05b6, 0x0000, 50, 42 }, /* 192: p=0.030434 ( 74, 2) */
{ 0x1417, 0x0000, 33, 25 }, /* 193: p=0.102940 ( 2, 20) */
{ 0x088a, 0x0000, 44, 196 }, /* 194: p=0.045161 ( 49, 2) */
{ 0x1dd6, 0x0000, 29, 197 }, /* 195: p=0.148935 ( 2, 13) */
{ 0x0c16, 0x0000, 40, 34 }, /* 196: p=0.063291 ( 49, 3) */
{ 0x294a, 0x0000, 23, 17 }, /* 197: p=0.199999 ( 3, 13) */
{ 0x0ce2, 0x0000, 40, 32 }, /* 198: p=0.067307 ( 32, 2) */
{ 0x31a3, 0x0000, 201, 243 }, /* 199: p=0.235291 ( 1, 4) */
{ 0x1332, 0x0000, 36, 202 }, /* 200: p=0.098590 ( 21, 2) */
{ 0x235a, 0x0000, 203, 239 }, /* 201: p=0.173910 ( 1, 6) */
{ 0x1adc, 0x0000, 30, 24 }, /* 202: p=0.135134 ( 21, 3) */
{ 0x18b3, 0x0000, 205, 237 }, /* 203: p=0.124998 ( 1, 9) */
{ 0x1be7, 0x0000, 30, 22 }, /* 204: p=0.139999 ( 14, 2) */
{ 0x1073, 0x0000, 207, 235 }, /* 205: p=0.085105 ( 1, 14) */
{ 0x294a, 0x0000, 26, 16 }, /* 206: p=0.199998 ( 9, 2) */
{ 0x0b35, 0x0000, 209, 231 }, /* 207: p=0.058822 ( 1, 21) */
{ 0x3a07, 0x0000, 20, 210 }, /* 208: p=0.269229 ( 6, 2) */
{ 0x0778, 0x0000, 211, 229 }, /* 209: p=0.039603 ( 1, 32) */
{ 0x4e30, 0x0000, 14, 8 }, /* 210: p=0.344827 ( 6, 3) */
{ 0x04ed, 0x0000, 213, 225 }, /* 211: p=0.026315 ( 1, 49) */
{ 0x4fa6, 0x0000, 14, 214 }, /* 212: p=0.349998 ( 4, 2) */
{ 0x0349, 0x0000, 215, 223 }, /* 213: p=0.017621 ( 1, 74) */
{ 0x6966, 0x0000, 8, 2 }, /* 214: p=0.434782 ( 4, 3) */
{ 0x022e, 0x0000, 217, 221 }, /* 215: p=0.011730 ( 1, 112) */
{ 0x8000, 0x0000, 218, 87 }, /* 216: p=0.500000 ( 1, 1) */
{ 0x0171, 0x0000, 63, 219 }, /* 217: p=0.007767 ( 1, 170) */
{ 0x538e, 0x0000, 220, 246 }, /* 218: p=0.363634 ( 2, 1) */
{ 0x0283, 0x0000, 57, 51 }, /* 219: p=0.013513 ( 2, 170) */
{ 0x3e3e, 0x0000, 222, 244 }, /* 220: p=0.285711 ( 3, 1) */
{ 0x03cc, 0x0000, 53, 47 }, /* 221: p=0.020349 ( 2, 112) */
{ 0x294a, 0x0000, 224, 242 }, /* 222: p=0.199997 ( 5, 1) */
{ 0x05b6, 0x0000, 49, 41 }, /* 223: p=0.030434 ( 2, 74) */
{ 0x1b75, 0x0000, 226, 240 }, /* 224: p=0.137929 ( 8, 1) */
{ 0x088a, 0x0000, 43, 227 }, /* 225: p=0.045161 ( 2, 49) */
{ 0x12fc, 0x0000, 228, 238 }, /* 226: p=0.097559 ( 12, 1) */
{ 0x0c16, 0x0000, 39, 33 }, /* 227: p=0.063291 ( 3, 49) */
{ 0x0cfb, 0x0000, 230, 234 }, /* 228: p=0.067795 ( 18, 1) */
{ 0x0ce2, 0x0000, 39, 31 }, /* 229: p=0.067307 ( 2, 32) */
{ 0x08cd, 0x0000, 112, 232 }, /* 230: p=0.046511 ( 27, 1) */
{ 0x1332, 0x0000, 35, 233 }, /* 231: p=0.098590 ( 2, 21) */
{ 0x0f25, 0x0000, 38, 30 }, /* 232: p=0.078651 ( 27, 2) */
{ 0x1adc, 0x0000, 29, 23 }, /* 233: p=0.135134 ( 3, 21) */
{ 0x1629, 0x0000, 34, 236 }, /* 234: p=0.112902 ( 18, 2) */
{ 0x1be7, 0x0000, 29, 21 }, /* 235: p=0.139999 ( 2, 14) */
{ 0x1ee8, 0x0000, 28, 22 }, /* 236: p=0.153845 ( 18, 3) */
{ 0x294a, 0x0000, 25, 15 }, /* 237: p=0.199998 ( 2, 9) */
{ 0x200f, 0x0000, 28, 20 }, /* 238: p=0.159089 ( 12, 2) */
{ 0x3a07, 0x0000, 19, 241 }, /* 239: p=0.269229 ( 2, 6) */
{ 0x2dae, 0x0000, 22, 16 }, /* 240: p=0.218748 ( 8, 2) */
{ 0x4e30, 0x0000, 13, 7 }, /* 241: p=0.344827 ( 3, 6) */
{ 0x4320, 0x0000, 16, 8 }, /* 242: p=0.304346 ( 5, 2) */
{ 0x4fa6, 0x0000, 13, 245 }, /* 243: p=0.349998 ( 2, 4) */
{ 0x620b, 0x0000, 10, 2 }, /* 244: p=0.411764 ( 3, 2) */
{ 0x6966, 0x0000, 7, 1 }, /* 245: p=0.434782 ( 3, 4) */
{ 0x8000, 0x0000, 244, 83 }, /* 246: p=0.500000 ( 2, 2) */
{ 0x8000, 0x0000, 249, 250 }, /* 247: p=0.500000 ( 1, 1) */
{ 0x620b, 0x0000, 10, 2 }, /* 248: p=0.411764 ( 3, 2) */
{ 0x538e, 0x0000, 89, 137 }, /* 249: p=0.363634 ( 1, 2) */
{ 0x538e, 0x0000, 220, 246 }, /* 250: p=0.363634 ( 2, 1) */
#endif
};
////////////////////////////////////////////////////////////////
// CONSTRUCTOR/DESTRUCTOR
////////////////////////////////////////////////////////////////
class ZPCodec::Encode : public ZPCodec
{
public:
Encode(GP<ByteStream> gbs, const bool djvucompat);
virtual ~Encode();
private:
void init(void);
};
ZPCodec::Encode::Encode(GP<ByteStream> gbs, const bool djvucompat)
: ZPCodec(gbs,true,djvucompat)
{
init();
// Codebit counter
#ifdef ZPCODEC_BITCOUNT
bitcount = 0;
#endif
}
ZPCodec::Encode::~Encode()
{
eflush();
}
class ZPCodec::Decode : public ZPCodec
{
public:
Decode(GP<ByteStream> gbs, const bool djvucompat);
virtual ~Decode();
private:
void init(void);
};
ZPCodec::Decode::Decode(GP<ByteStream> gbs, const bool djvucompat)
: ZPCodec(gbs,false,djvucompat)
{
init();
// Codebit counter
#ifdef ZPCODEC_BITCOUNT
bitcount = 0;
#endif
}
ZPCodec::Decode::~Decode() {}
ZPCodec::ZPCodec(GP<ByteStream> xgbs, const bool xencoding, const bool djvucompat)
: gbs(xgbs), bs(xgbs), encoding(xencoding), fence(0), subend(0), buffer(0), nrun(0)
{
// Create machine independent ffz table
for (int i=0; i<256; i++)
{
ffzt[i]=0;
for (int j=i; j&0x80; j<<=1)
ffzt[i] += 1;
}
// Initialize table
newtable(default_ztable);
// Patch table table (and lose DjVu compatibility).
if (!djvucompat)
{
for (int j=0; j<256; j++)
{
unsigned short a = 0x10000-p[j];
while (a>=0x8000) a=(unsigned short)(a<<1);
if (m[j]>0 && a+p[j]>=0x8000 && a>=m[j])
{
BitContext x = default_ztable[j].dn;
BitContext y = default_ztable[x].dn;
dn[j] = y;
}
}
}
}
ZPCodec::~ZPCodec() {}
GP<ZPCodec>
ZPCodec::create(GP<ByteStream> gbs, const bool encoding, const bool djvucompat)
{
GP<ZPCodec> retval;
if(encoding)
{
retval=new ZPCodec::Encode(gbs,djvucompat);
}else
{
retval=new ZPCodec::Decode(gbs,djvucompat);
}
return retval;
}
////////////////////////////////////////////////////////////////
// Z CODER DECODE ALGORITHM
////////////////////////////////////////////////////////////////
void
ZPCodec::Decode::init(void)
{
assert(sizeof(unsigned int)==4);
assert(sizeof(unsigned short)==2);
a = 0;
/* Read first 16 bits of code */
if (! bs->read((void*)&byte, 1))
byte = 0xff;
code = (byte<<8);
if (! bs->read((void*)&byte, 1))
byte = 0xff;
code = code | byte;
/* Preload buffer */
delay = 25;
scount = 0;
preload();
/* Compute initial fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
}
void
ZPCodec::preload(void)
{
while (scount<=24)
{
if (bs->read((void*)&byte, 1) < 1)
{
byte = 0xff;
if (--delay < 1)
G_THROW( ByteStream::EndOfFile );
}
buffer = (buffer<<8) | byte;
scount += 8;
}
}
inline int
ZPCodec::ffz(unsigned int x)
{
// DO NOT DEFINE FASTBSR :
// Test shows that it hardly helps on a PPro,
// and rumors are that BSR is very slow on PPlain.
#if defined(FASTBSR) && defined(_MSC_VER) && defined(_M_IX86)
int r;
__asm {
mov ebx, x
xor ebx, 0xffff
mov eax, -1
bsr eax, ebx
mov r, eax
}
return 15 - r;
#elif defined(FASTBSR) && defined(__GNUC__) && defined(__i386__)
int r, dummy;
__asm__ const ( "movl %2,%1\n\t"
"xorl $0xffff, %1\n\t"
"movl $-1, %0\n\t"
"bsrl %1, %0"
: "=&q" (r), "=q" (dummy) : "rm" (x) );
return 15 - r;
#else
return (x>=0xff00) ? (ffzt[x&0xff]+8) : (ffzt[(x>>8)&0xff]);
#endif
}
int
ZPCodec::decode_sub(BitContext &ctx, unsigned int z)
{
/* Save bit */
int bit = (ctx & 1);
/* Avoid interval reversion */
#ifdef ZPCODER
unsigned int d = 0x6000 + ((z+a)>>2);
if (z > d)
z = d;
#endif
#ifdef ZCODER
if (z >= 0x8000)
z = 0x4000 + (z>>1);
#endif
/* Test MPS/LPS */
if (z > code)
{
/* LPS branch */
z = 0x10000 - z;
a = a + z;
code = code + z;
/* LPS adaptation */
ctx = dn[ctx];
/* LPS renormalization */
int shift = ffz(a);
scount -= shift;
a = (unsigned short)(a<<shift);
code = (unsigned short)(code<<shift) | ((buffer>>scount) & ((1<<shift)-1));
#ifdef ZPCODEC_BITCOUNT
bitcount += shift;
#endif
if (scount<16) preload();
/* Adjust fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
return bit ^ 1;
}
else
{
/* MPS adaptation */
if (a >= m[ctx])
ctx = up[ctx];
/* MPS renormalization */
scount -= 1;
a = (unsigned short)(z<<1);
code = (unsigned short)(code<<1) | ((buffer>>scount) & 1);
#ifdef ZPCODEC_BITCOUNT
bitcount += 1;
#endif
if (scount<16) preload();
/* Adjust fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
return bit;
}
}
int
ZPCodec::decode_sub_simple(int mps, unsigned int z)
{
/* Test MPS/LPS */
if (z > code)
{
/* LPS branch */
z = 0x10000 - z;
a = a + z;
code = code + z;
/* LPS renormalization */
int shift = ffz(a);
scount -= shift;
a = (unsigned short)(a<<shift);
code = (unsigned short)(code<<shift) | ((buffer>>scount) & ((1<<shift)-1));
#ifdef ZPCODEC_BITCOUNT
bitcount += shift;
#endif
if (scount<16) preload();
/* Adjust fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
return mps ^ 1;
}
else
{
/* MPS renormalization */
scount -= 1;
a = (unsigned short)(z<<1);
code = (unsigned short)(code<<1) | ((buffer>>scount) & 1);
#ifdef ZPCODEC_BITCOUNT
bitcount += 1;
#endif
if (scount<16) preload();
/* Adjust fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
return mps;
}
}
int
ZPCodec::decode_sub_nolearn(int mps, unsigned int z)
{
#ifdef ZPCODER
unsigned int d = 0x6000 + ((z+a)>>2);
if (z > d)
z = d;
#endif
#ifdef ZCODER
if (z >= 0x8000)
z = 0x4000 + (z>>1);
#endif
/* Test MPS/LPS */
if (z > code)
{
/* LPS branch */
z = 0x10000 - z;
a = a + z;
code = code + z;
/* LPS renormalization */
int shift = ffz(a);
scount -= shift;
a = (unsigned short)(a<<shift);
code = (unsigned short)(code<<shift) | ((buffer>>scount) & ((1<<shift)-1));
#ifdef ZPCODEC_BITCOUNT
bitcount += shift;
#endif
if (scount<16) preload();
/* Adjust fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
return mps ^ 1;
}
else
{
/* MPS renormalization */
scount -= 1;
a = (unsigned short)(z<<1);
code = (unsigned short)(code<<1) | ((buffer>>scount) & 1);
#ifdef ZPCODEC_BITCOUNT
bitcount += 1;
#endif
if (scount<16) preload();
/* Adjust fence */
fence = code;
if (code >= 0x8000)
fence = 0x7fff;
return mps;
}
}
////////////////////////////////////////////////////////////////
// Z CODER ENCODE ALGORITHM
////////////////////////////////////////////////////////////////
void
ZPCodec::Encode::init(void)
{
assert(sizeof(unsigned int)==4);
assert(sizeof(unsigned short)==2);
a = 0;
scount = 0;
byte = 0;
delay = 25;
subend = 0;
buffer = 0xffffff;
nrun = 0;
}
void
ZPCodec::outbit(int bit)
{
if (delay > 0)
{
if (delay < 0xff) // delay=0xff suspends emission forever
delay -= 1;
}
else
{
/* Insert a bit */
byte = (byte<<1) | bit;
/* Output a byte */
if (++scount == 8)
{
if (!encoding)
G_THROW( ERR_MSG("ZPCodec.no_encoding") );
if (bs->write((void*)&byte, 1) != 1)
G_THROW( ERR_MSG("ZPCodec.write_error") );
scount = 0;
byte = 0;
}
}
}
void
ZPCodec::zemit(int b)
{
/* Shift new bit into 3bytes buffer */
buffer = (buffer<<1) + b;
/* Examine bit going out of the 3bytes buffer */
b = (buffer >> 24);
buffer = (buffer & 0xffffff);
/* The following lines have been changed in order to emphazise the
* similarity between this bit counting and the scheme of Witten, Neal & Cleary
* (WN&C). Corresponding changes have been made in outbit and eflush.
* Variable 'nrun' is similar to the 'bits_to_follow' in the W&N code.
*/
switch(b)
{
/* Similar to WN&C upper renormalization */
case 1:
outbit(1);
while (nrun-- > 0)
outbit(0);
nrun = 0;
break;
/* Similar to WN&C lower renormalization */
case 0xff:
outbit(0);
while (nrun-- > 0)
outbit(1);
nrun = 0;
break;
/* Similar to WN&C central renormalization */
case 0:
nrun += 1;
break;
default:
assert(0);
}
/* Code bit counter */
#ifdef ZPCODEC_BITCOUNT
bitcount += 1;
#endif
}
void
ZPCodec::eflush()
{
/* adjust subend */
if (subend > 0x8000)
subend = 0x10000;
else if (subend > 0)
subend = 0x8000;
/* zemit many mps bits */
while (buffer != 0xffffff || subend )
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
}
/* zemit pending run */
outbit(1);
while (nrun-- > 0)
outbit(0);
nrun = 0;
/* zemit 1 until full byte */
while (scount > 0)
outbit(1);
/* prevent further emission */
delay = 0xff;
}
void
ZPCodec::encode_mps(BitContext &ctx, unsigned int z)
{
/* Avoid interval reversion */
#ifdef ZPCODER
unsigned int d = 0x6000 + ((z+a)>>2);
if (z > d)
z = d;
#endif
#ifdef ZCODER
if (z >= 0x8000)
z = 0x4000 + (z>>1);
#endif
/* Adaptation */
if (a >= m[ctx])
ctx = up[ctx];
/* Code MPS */
a = z;
/* Export bits */
if (a >= 0x8000)
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
a = (unsigned short)(a<<1);
}
}
void
ZPCodec::encode_lps(BitContext &ctx, unsigned int z)
{
/* Avoid interval reversion */
#ifdef ZPCODER
unsigned int d = 0x6000 + ((z+a)>>2);
if (z > d)
z = d;
#endif
#ifdef ZCODER
if (z >= 0x8000)
z = 0x4000 + (z>>1);
#endif
/* Adaptation */
ctx = dn[ctx];
/* Code LPS */
z = 0x10000 - z;
subend += z;
a += z;
/* Export bits */
while (a >= 0x8000)
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
a = (unsigned short)(a<<1);
}
}
void
ZPCodec::encode_mps_simple(unsigned int z)
{
/* Code MPS */
a = z;
/* Export bits */
if (a >= 0x8000)
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
a = (unsigned short)(a<<1);
}
}
void
ZPCodec::encode_lps_simple(unsigned int z)
{
/* Code LPS */
z = 0x10000 - z;
subend += z;
a += z;
/* Export bits */
while (a >= 0x8000)
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
a = (unsigned short)(a<<1);
}
}
void
ZPCodec::encode_mps_nolearn(unsigned int z)
{
#ifdef ZPCODER
unsigned int d = 0x6000 + ((z+a)>>2);
if (z > d)
z = d;
#endif
#ifdef ZCODER
if (z >= 0x8000)
z = 0x4000 + (z>>1);
#endif
/* Code MPS */
a = z;
/* Export bits */
if (a >= 0x8000)
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
a = (unsigned short)(a<<1);
}
}
void
ZPCodec::encode_lps_nolearn(unsigned int z)
{
#ifdef ZPCODER
unsigned int d = 0x6000 + ((z+a)>>2);
if (z > d)
z = d;
#endif
#ifdef ZCODER
if (z >= 0x8000)
z = 0x4000 + (z>>1);
#endif
/* Code LPS */
z = 0x10000 - z;
subend += z;
a += z;
/* Export bits */
while (a >= 0x8000)
{
zemit(1 - (subend>>15) );
subend = (unsigned short)(subend<<1);
a = (unsigned short)(a<<1);
}
}
////////////////////////////////////////////////////////////////
// TABLE AND PARAMETER MANAGEMENT
////////////////////////////////////////////////////////////////
void
ZPCodec::newtable(ZPCodec::Table *table)
{
for (int i=0; i<256; i++)
{
p[i] = table[i].p;
m[i] = table[i].m;
up[i] = table[i].up;
dn[i] = table[i].dn;
}
}
static float
p_to_plps(unsigned short p)
{
float fplps;
float fp = (float)(p) / (float)(0x10000);
const float log2 = (float)0.69314718055994530942;
#ifdef ZCODER
fplps = fp - (fp+0.5) * log(fp+0.5) + (fp-0.5)*log2;
#endif
#ifdef ZPCODER
if (fp <= (1.0/6.0) )
fplps = fp * 2 * log2;
else
fplps = (float)((1.5*fp-0.25) - (1.5*fp+0.25)*log(1.5*fp+0.25) + (0.5*fp-0.25)*log2);
#endif
return fplps;
}
BitContext
ZPCodec::state(float prob1)
{
// Return a state representing 'prob1' in the steady chain
// FixMe: This is quite slow!
int mps = (prob1 <= 0.5 ? 0 : 1);
float plps = (float)(mps ? 1.0 - prob1 : prob1);
// Locate steady chain (ordered, decreasing)
int sz = 0;
int lo = (mps ? 1 : 2);
while (p[lo+sz+sz+2] < p[lo+sz+sz]) sz+=1;
// Bisection
while (sz > 1)
{
int nsz = sz >> 1;
float nplps = p_to_plps( p[lo+nsz+nsz] );
if (nplps < plps)
{ sz=nsz; }
else
{ lo=lo+nsz+nsz; sz=sz-nsz; }
}
// Choose closest one
float f1 = p_to_plps(p[lo])-plps;
float f2 = plps-p_to_plps(p[lo+2]);
return (f1<f2) ? lo : lo+2;
}
#ifdef HAVE_NAMESPACES
}
# ifndef NOT_USING_DJVU_NAMESPACE
using namespace DJVU;
# endif
#endif