jbig2stream.cc

来自「source code: Covert TXT to PDF」· CC 代码 · 共 2,563 行 · 第 1/5 页

CC
2,563
字号
//========================================================================//// JBIG2Stream.cc//// Copyright 2002 Glyph & Cog, LLC////========================================================================#include <aconf.h>#ifdef USE_GCC_PRAGMAS#pragma implementation#endif#include <stdlib.h>#include "GList.h"#include "Error.h"#include "JBIG2Stream.h"//~ share these tables#include "Stream-CCITT.h"//------------------------------------------------------------------------static int contextSize[4] = { 16, 13, 10, 10 };static int refContextSize[2] = { 13, 10 };//------------------------------------------------------------------------// JBIG2ArithmeticDecoderStats//------------------------------------------------------------------------class JBIG2ArithmeticDecoderStats {public:  JBIG2ArithmeticDecoderStats(int contextSizeA);  ~JBIG2ArithmeticDecoderStats();  JBIG2ArithmeticDecoderStats *copy();  void reset();  int getContextSize() { return contextSize; }  void copyFrom(JBIG2ArithmeticDecoderStats *stats);private:  Guchar *cxTab;		// cxTab[cx] = (i[cx] << 1) + mps[cx]  int contextSize;  friend class JBIG2ArithmeticDecoder;};JBIG2ArithmeticDecoderStats::JBIG2ArithmeticDecoderStats(int contextSizeA) {  contextSize = contextSizeA;  cxTab = (Guchar *)gmalloc((1 << contextSize) * sizeof(Guchar));  reset();}JBIG2ArithmeticDecoderStats::~JBIG2ArithmeticDecoderStats() {  gfree(cxTab);}JBIG2ArithmeticDecoderStats *JBIG2ArithmeticDecoderStats::copy() {  JBIG2ArithmeticDecoderStats *stats;  stats = new JBIG2ArithmeticDecoderStats(contextSize);  memcpy(stats->cxTab, cxTab, 1 << contextSize);  return stats;}void JBIG2ArithmeticDecoderStats::reset() {  memset(cxTab, 0, 1 << contextSize);}void JBIG2ArithmeticDecoderStats::copyFrom(		                      JBIG2ArithmeticDecoderStats *stats) {  memcpy(cxTab, stats->cxTab, 1 << contextSize);}//------------------------------------------------------------------------// JBIG2ArithmeticDecoder//------------------------------------------------------------------------class JBIG2ArithmeticDecoder {public:  JBIG2ArithmeticDecoder();  ~JBIG2ArithmeticDecoder();  void setStream(Stream *strA) { str = strA; }  void start();  int decodeBit(Guint context, JBIG2ArithmeticDecoderStats *stats);  int decodeByte(Guint context, JBIG2ArithmeticDecoderStats *stats);  // Returns false for OOB, otherwise sets *<x> and returns true.  GBool decodeInt(int *x, JBIG2ArithmeticDecoderStats *stats);  Guint decodeIAID(Guint codeLen,		   JBIG2ArithmeticDecoderStats *stats);private:  int decodeIntBit(JBIG2ArithmeticDecoderStats *stats);  void byteIn();  static Guint qeTab[47];  static int nmpsTab[47];  static int nlpsTab[47];  static int switchTab[47];  Guint buf0, buf1;  Guint c, a;  int ct;  Guint prev;			// for the integer decoder  Stream *str;};Guint JBIG2ArithmeticDecoder::qeTab[47] = {  0x56010000, 0x34010000, 0x18010000, 0x0AC10000,  0x05210000, 0x02210000, 0x56010000, 0x54010000,  0x48010000, 0x38010000, 0x30010000, 0x24010000,  0x1C010000, 0x16010000, 0x56010000, 0x54010000,  0x51010000, 0x48010000, 0x38010000, 0x34010000,  0x30010000, 0x28010000, 0x24010000, 0x22010000,  0x1C010000, 0x18010000, 0x16010000, 0x14010000,  0x12010000, 0x11010000, 0x0AC10000, 0x09C10000,  0x08A10000, 0x05210000, 0x04410000, 0x02A10000,  0x02210000, 0x01410000, 0x01110000, 0x00850000,  0x00490000, 0x00250000, 0x00150000, 0x00090000,  0x00050000, 0x00010000, 0x56010000};int JBIG2ArithmeticDecoder::nmpsTab[47] = {   1,  2,  3,  4,  5, 38,  7,  8,  9, 10, 11, 12, 13, 29, 15, 16,  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46};int JBIG2ArithmeticDecoder::nlpsTab[47] = {   1,  6,  9, 12, 29, 33,  6, 14, 14, 14, 17, 18, 20, 21, 14, 14,  15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46};int JBIG2ArithmeticDecoder::switchTab[47] = {  1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};JBIG2ArithmeticDecoder::JBIG2ArithmeticDecoder() {  str = NULL;}JBIG2ArithmeticDecoder::~JBIG2ArithmeticDecoder() {}void JBIG2ArithmeticDecoder::start() {  buf0 = (Guint)str->getChar() & 0xff;  buf1 = (Guint)str->getChar() & 0xff;  // INITDEC  c = (buf0 ^ 0xff) << 16;  byteIn();  c <<= 7;  ct -= 7;  a = 0x80000000;}int JBIG2ArithmeticDecoder::decodeBit(Guint context,				      JBIG2ArithmeticDecoderStats *stats) {  int bit;  Guint qe;  int iCX, mpsCX;  iCX = stats->cxTab[context] >> 1;  mpsCX = stats->cxTab[context] & 1;  qe = qeTab[iCX];  a -= qe;  if (c < a) {    if (a & 0x80000000) {      bit = mpsCX;    } else {      // MPS_EXCHANGE      if (a < qe) {	bit = 1 - mpsCX;	if (switchTab[iCX]) {	  stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);	} else {	  stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;	}      } else {	bit = mpsCX;	stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;      }      // RENORMD      do {	if (ct == 0) {	  byteIn();	}	a <<= 1;	c <<= 1;	--ct;      } while (!(a & 0x80000000));    }  } else {    c -= a;    // LPS_EXCHANGE    if (a < qe) {      bit = mpsCX;      stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;    } else {      bit = 1 - mpsCX;      if (switchTab[iCX]) {	stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);      } else {	stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;      }    }    a = qe;    // RENORMD    do {      if (ct == 0) {	byteIn();      }      a <<= 1;      c <<= 1;      --ct;    } while (!(a & 0x80000000));  }  return bit;}int JBIG2ArithmeticDecoder::decodeByte(Guint context,				       JBIG2ArithmeticDecoderStats *stats) {  int byte;  int i;  byte = 0;  for (i = 0; i < 8; ++i) {    byte = (byte << 1) | decodeBit(context, stats);  }  return byte;}GBool JBIG2ArithmeticDecoder::decodeInt(int *x,					JBIG2ArithmeticDecoderStats *stats) {  int s;  Guint v;  int i;  prev = 1;  s = decodeIntBit(stats);  if (decodeIntBit(stats)) {    if (decodeIntBit(stats)) {      if (decodeIntBit(stats)) {	if (decodeIntBit(stats)) {	  if (decodeIntBit(stats)) {	    v = 0;	    for (i = 0; i < 32; ++i) {	      v = (v << 1) | decodeIntBit(stats);	    }	    v += 4436;	  } else {	    v = 0;	    for (i = 0; i < 12; ++i) {	      v = (v << 1) | decodeIntBit(stats);	    }	    v += 340;	  }	} else {	  v = 0;	  for (i = 0; i < 8; ++i) {	    v = (v << 1) | decodeIntBit(stats);	  }	  v += 84;	}      } else {	v = 0;	for (i = 0; i < 6; ++i) {	  v = (v << 1) | decodeIntBit(stats);	}	v += 20;      }    } else {      v = decodeIntBit(stats);      v = (v << 1) | decodeIntBit(stats);      v = (v << 1) | decodeIntBit(stats);      v = (v << 1) | decodeIntBit(stats);      v += 4;    }  } else {    v = decodeIntBit(stats);    v = (v << 1) | decodeIntBit(stats);  }  if (s) {    if (v == 0) {      return gFalse;    }    *x = -(int)v;  } else {    *x = (int)v;  }  return gTrue;}int JBIG2ArithmeticDecoder::decodeIntBit(JBIG2ArithmeticDecoderStats *stats) {  int bit;  bit = decodeBit(prev, stats);  if (prev < 0x100) {    prev = (prev << 1) | bit;  } else {    prev = (((prev << 1) | bit) & 0x1ff) | 0x100;  }  return bit;}Guint JBIG2ArithmeticDecoder::decodeIAID(Guint codeLen,					 JBIG2ArithmeticDecoderStats *stats) {  Guint i;  int bit;  prev = 1;  for (i = 0; i < codeLen; ++i) {    bit = decodeBit(prev, stats);    prev = (prev << 1) | bit;  }  return prev - (1 << codeLen);}void JBIG2ArithmeticDecoder::byteIn() {  if (buf0 == 0xff) {    if (buf1 > 0x8f) {      ct = 8;    } else {      buf0 = buf1;      buf1 = (Guint)str->getChar() & 0xff;      c = c + 0xfe00 - (buf0 << 9);      ct = 7;    }  } else {    buf0 = buf1;    buf1 = (Guint)str->getChar() & 0xff;    c = c + 0xff00 - (buf0 << 8);    ct = 8;  }}//------------------------------------------------------------------------// JBIG2HuffmanTable//------------------------------------------------------------------------#define jbig2HuffmanLOW 0xfffffffd#define jbig2HuffmanOOB 0xfffffffe#define jbig2HuffmanEOT 0xffffffffstruct JBIG2HuffmanTable {  int val;  Guint prefixLen;  Guint rangeLen;		// can also be LOW, OOB, or EOT  Guint prefix;};JBIG2HuffmanTable huffTableA[] = {  {     0, 1,  4,              0x000 },  {    16, 2,  8,              0x002 },  {   272, 3, 16,              0x006 },  { 65808, 3, 32,              0x007 },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableB[] = {  {     0, 1,  0,              0x000 },  {     1, 2,  0,              0x002 },  {     2, 3,  0,              0x006 },  {     3, 4,  3,              0x00e },  {    11, 5,  6,              0x01e },  {    75, 6, 32,              0x03e },  {     0, 6, jbig2HuffmanOOB, 0x03f },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableC[] = {  {     0, 1,  0,              0x000 },  {     1, 2,  0,              0x002 },  {     2, 3,  0,              0x006 },  {     3, 4,  3,              0x00e },  {    11, 5,  6,              0x01e },  {     0, 6, jbig2HuffmanOOB, 0x03e },  {    75, 7, 32,              0x0fe },  {  -256, 8,  8,              0x0fe },  {  -257, 8, jbig2HuffmanLOW, 0x0ff },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableD[] = {  {     1, 1,  0,              0x000 },  {     2, 2,  0,              0x002 },  {     3, 3,  0,              0x006 },  {     4, 4,  3,              0x00e },  {    12, 5,  6,              0x01e },  {    76, 5, 32,              0x01f },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableE[] = {  {     1, 1,  0,              0x000 },  {     2, 2,  0,              0x002 },  {     3, 3,  0,              0x006 },  {     4, 4,  3,              0x00e },  {    12, 5,  6,              0x01e },  {    76, 6, 32,              0x03e },  {  -255, 7,  8,              0x07e },  {  -256, 7, jbig2HuffmanLOW, 0x07f },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableF[] = {  {     0, 2,  7,              0x000 },  {   128, 3,  7,              0x002 },  {   256, 3,  8,              0x003 },  { -1024, 4,  9,              0x008 },  {  -512, 4,  8,              0x009 },  {  -256, 4,  7,              0x00a },  {   -32, 4,  5,              0x00b },  {   512, 4,  9,              0x00c },  {  1024, 4, 10,              0x00d },  { -2048, 5, 10,              0x01c },  {  -128, 5,  6,              0x01d },  {   -64, 5,  5,              0x01e },  { -2049, 6, jbig2HuffmanLOW, 0x03e },  {  2048, 6, 32,              0x03f },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableG[] = {  {  -512, 3,  8,              0x000 },  {   256, 3,  8,              0x001 },  {   512, 3,  9,              0x002 },  {  1024, 3, 10,              0x003 },  { -1024, 4,  9,              0x008 },  {  -256, 4,  7,              0x009 },  {   -32, 4,  5,              0x00a },  {     0, 4,  5,              0x00b },  {   128, 4,  7,              0x00c },  {  -128, 5,  6,              0x01a },  {   -64, 5,  5,              0x01b },  {    32, 5,  5,              0x01c },  {    64, 5,  6,              0x01d },  { -1025, 5, jbig2HuffmanLOW, 0x01e },  {  2048, 5, 32,              0x01f },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableH[] = {  {     0, 2,  1,              0x000 },  {     0, 2, jbig2HuffmanOOB, 0x001 },  {     4, 3,  4,              0x004 },  {    -1, 4,  0,              0x00a },  {    22, 4,  4,              0x00b },  {    38, 4,  5,              0x00c },  {     2, 5,  0,              0x01a },  {    70, 5,  6,              0x01b },  {   134, 5,  7,              0x01c },  {     3, 6,  0,              0x03a },  {    20, 6,  1,              0x03b },  {   262, 6,  7,              0x03c },  {   646, 6, 10,              0x03d },  {    -2, 7,  0,              0x07c },  {   390, 7,  8,              0x07d },  {   -15, 8,  3,              0x0fc },  {    -5, 8,  1,              0x0fd },  {    -7, 9,  1,              0x1fc },  {    -3, 9,  0,              0x1fd },  {   -16, 9, jbig2HuffmanLOW, 0x1fe },  {  1670, 9, 32,              0x1ff },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableI[] = {  {     0, 2, jbig2HuffmanOOB, 0x000 },  {    -1, 3,  1,              0x002 },  {     1, 3,  1,              0x003 },  {     7, 3,  5,              0x004 },  {    -3, 4,  1,              0x00a },  {    43, 4,  5,              0x00b },  {    75, 4,  6,              0x00c },  {     3, 5,  1,              0x01a },  {   139, 5,  7,              0x01b },  {   267, 5,  8,              0x01c },  {     5, 6,  1,              0x03a },  {    39, 6,  2,              0x03b },  {   523, 6,  8,              0x03c },  {  1291, 6, 11,              0x03d },  {    -5, 7,  1,              0x07c },  {   779, 7,  9,              0x07d },  {   -31, 8,  4,              0x0fc },  {   -11, 8,  2,              0x0fd },  {   -15, 9,  2,              0x1fc },  {    -7, 9,  1,              0x1fd },  {   -32, 9, jbig2HuffmanLOW, 0x1fe },  {  3339, 9, 32,              0x1ff },  {     0, 0, jbig2HuffmanEOT, 0     }};JBIG2HuffmanTable huffTableJ[] = {  {    -2, 2,  2,              0x000 },  {     6, 2,  6,              0x001 },  {     0, 2, jbig2HuffmanOOB, 0x002 },  {    -3, 5,  0,              0x018 },  {     2, 5,  0,              0x019 },  {    70, 5,  5,              0x01a },  {     3, 6,  0,              0x036 },

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?