G3Decoder.c++
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:7k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: G3Decoder.c++,v 1.2 2006/04/15 07:04:20 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1994-1996 Sam Leffler
  4.  * Copyright (c) 1994-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. /*
  27.  * Group 3 Facsimile Reader Support.
  28.  */
  29. #include "G3Decoder.h"
  30. /*
  31.  * These macros glue the G3Decoder state to
  32.  * the state expected by Frank Cringle's decoder.
  33.  */
  34. #define DECLARE_STATE_EOL()
  35.     uint32 BitAcc; /* bit accumulator */
  36.     int BitsAvail; /* # valid bits in BitAcc */
  37.     int EOLcnt /* # EOL codes recognized */
  38. #define DECLARE_STATE()
  39.     DECLARE_STATE_EOL();
  40.     int a0; /* reference element */
  41.     int RunLength; /* length of current run */
  42.     tiff_runlen_t* pa; /* place to stuff next run */
  43.     tiff_runlen_t* thisrun; /* current row's run array */
  44.     const TIFFFaxTabEnt* TabEnt
  45. #define DECLARE_STATE_2D()
  46.     DECLARE_STATE();
  47.     int b1; /* next change on prev line */
  48.     tiff_runlen_t* pb /* next run in reference line */
  49. /*
  50.  * Load any state that may be changed during decoding.
  51.  */
  52. #define CACHE_STATE() do {
  53.     BitAcc = data;
  54.     BitsAvail = bit;
  55.     EOLcnt = this->EOLcnt;
  56. } while (0)
  57. /*
  58.  * Save state possibly changed during decoding.
  59.  */
  60. #define UNCACHE_STATE() do {
  61.     bit = BitsAvail;
  62.     data = BitAcc;
  63.     this->EOLcnt = EOLcnt;
  64. } while (0)
  65. /*
  66.  * Override default definitions for the TIFF library.
  67.  * We redirect the logic to call nextByte for each
  68.  * input byte we need.  Note that we don't need to check
  69.  * for EOF because the input decoder does a longjmp.
  70.  */
  71. #define NeedBits8(n,eoflab) do {
  72.     if (BitsAvail < (n)) {
  73. BitAcc |= nextByte()<<BitsAvail;
  74. BitsAvail += 8;
  75.     }
  76. } while (0)
  77. #define NeedBits16(n,eoflab) do {
  78.     if (BitsAvail < (n)) {
  79. BitAcc |= nextByte()<<BitsAvail;
  80. if ((BitsAvail += 8) < (n)) {
  81.     BitAcc |= nextByte()<<BitsAvail;
  82.     BitsAvail += 8;
  83. }
  84.     }
  85. } while (0)
  86. #include "tif_fax3.h"
  87. G3Decoder::G3Decoder() {}
  88. G3Decoder::~G3Decoder() {}
  89. void
  90. G3Decoder::setupDecoder(u_int recvFillOrder, bool is2d, bool isg4)
  91. {
  92.     /*
  93.      * The G3 decoding state tables are constructed for
  94.      * data in LSB2MSB bit order.  Received data that
  95.      * is not in this order is reversed using the
  96.      * appropriate byte-wide bit-reversal table.
  97.      */
  98.     is2D = is2d;
  99.     isG4 = isg4;
  100.     bitmap = TIFFGetBitRevTable(recvFillOrder != FILLORDER_LSB2MSB);
  101.     data = 0; // not needed
  102.     bit = 0; // force initial read
  103.     EOLcnt = 0; // no initial EOL
  104.     RTCrun = 0; // reset run count
  105.     RTCrow = -1; // reset RTC row number
  106.     rowref = 0; // reset row count
  107.     curruns = refruns = NULL;
  108. }
  109. void
  110. G3Decoder::setRuns(tiff_runlen_t* cr, tiff_runlen_t* rr, int w)
  111. {
  112.     curruns = cr;
  113.     if ((refruns = rr)) {
  114. refruns[0] = w;
  115. refruns[1] = 0;
  116.     }
  117. }
  118. void G3Decoder::raiseEOF() { siglongjmp(jmpEOF, 1); }
  119. void G3Decoder::raiseRTC() { siglongjmp(jmpRTC, 1); }
  120. /*
  121.  * Decode h rows that are w pixels wide and return
  122.  * the decoded data in raster.
  123.  */
  124. void
  125. G3Decoder::decode(void* raster, u_int w, u_int h)
  126. {
  127.     u_int rowbytes = howmany(w, 8);
  128.     if (curruns == NULL) {
  129. tiff_runlen_t runs[2*4864]; // run arrays for cur+ref rows
  130. setRuns(runs, runs+4864, w);
  131. while (h-- > 0) {
  132.     decodeRow(raster, w);
  133.     if (raster)
  134. raster = (u_char*) raster + rowbytes;
  135. }
  136.     } else {
  137. while (h-- > 0) {
  138.     decodeRow(raster, w);
  139.     if (raster)
  140. raster = (u_char*) raster + rowbytes;
  141. }
  142.     }
  143. }
  144. bool
  145. G3Decoder::isNextRow1D()
  146. {
  147.     DECLARE_STATE_EOL();
  148.     CACHE_STATE();
  149.     SYNC_EOL(Nop);
  150.     bool is1D;
  151.     if (is2D) {
  152. NeedBits8(1, Nop);
  153. is1D = (GetBits(1) != 0); // 1D/2D-encoding tag bit
  154. // NB: we don't clear the tag bit
  155.     } else {
  156. is1D = true;
  157.     }
  158.     // now reset state for next decoded row
  159.     BitAcc = (BitAcc<<1)|1; // EOL bit
  160.     BitsAvail++;
  161.     EOLcnt = 1; // mark state to indicate EOL recognized
  162.     UNCACHE_STATE();
  163.     return (is1D);
  164. }
  165. #define unexpected(table, a0) do {
  166.     invalidCode(table, a0);
  167.     rowgood = false;
  168. } while (0)
  169. #define extension(a0) do {
  170.     invalidCode("2D", a0);
  171.     rowgood = false;
  172. } while (0)
  173. #define prematureEOF(a0) // never happens 'cuz of longjmp
  174. #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
  175. /*
  176.  * Decode a single row of pixels and return
  177.  * the decoded data in the scanline buffer.
  178.  */
  179. bool
  180. G3Decoder::decodeRow(void* scanline, u_int lastx)
  181. {
  182.     DECLARE_STATE_2D();
  183.     bool rowgood = true;
  184.     bool nullrow = false;
  185.     CACHE_STATE();
  186.     a0 = 0;
  187.     RunLength = 0;
  188.     pa = thisrun = curruns;
  189.     bool is1D;
  190.     if (isG4) {
  191. is1D = false;
  192.     } else {
  193. SYNC_EOL(Nop);
  194. if (is2D) {
  195.     NeedBits8(1, Nop);
  196.     is1D = (GetBits(1) != 0); // 1D/2D-encoding tag bit
  197.     ClrBits(1);
  198. } else
  199.     is1D = true;
  200.     }
  201.     if (!is1D) {
  202. pb = refruns;
  203. b1 = *pb++;
  204. #define badlength(a0,lastx) do {
  205.     if (isG4 && RTCrow == -1)
  206. RTCrow = rowref;
  207.     badPixelCount("2D", a0, lastx);
  208.     rowgood = false;
  209. } while (0)
  210. EXPAND2D(Nop2d);
  211.     Nop2d:;
  212. #undef badlength
  213.     } else {
  214. #define badlength(a0,lastx) do {
  215.     nullrow = (a0 == 0);
  216.     if (nullrow && ++RTCrun == 5 && RTCrow == -1)
  217. RTCrow = rowref-4;
  218.     badPixelCount("1D", a0, lastx);
  219.     rowgood = false;
  220. } while (0)
  221. EXPAND1D(Nop1d);
  222.     Nop1d:;
  223. #undef badlength
  224.     }
  225.     if (!nullrow)
  226. RTCrun = 0;
  227.     if (scanline)
  228. _TIFFFax3fillruns((u_char*) scanline, thisrun, pa, lastx);
  229.     if (is2D) {
  230. SETVAL(0); // imaginary change for reference
  231. SWAP(tiff_runlen_t*, curruns, refruns);
  232.     }
  233.     rowref++;
  234.     UNCACHE_STATE();
  235.     return (rowgood);
  236. }
  237. #undef SWAP
  238. #undef prematureEOF
  239. #undef extension
  240. #undef unexpected
  241. /*
  242.  * Return the next decoded byte of page data from
  243.  * the input stream.  The byte is returned in the
  244.  * bit order required by the G3 decoder.
  245.  */
  246. int
  247. G3Decoder::nextByte()
  248. {
  249.     return bitmap[decodeNextByte()];
  250. }
  251. int G3Decoder::decodeNextByte() { raiseEOF(); return (0); }
  252. void G3Decoder::invalidCode(const char*, int) {}
  253. void G3Decoder::badPixelCount(const char*, int, int) {}
  254. void G3Decoder::badDecodingState(const char*, int) {}