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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: G3Decoder.h,v 1.1.1.1 2005/11/11 21:32:02 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. #ifndef _G3Decoder_
  27. #define _G3Decoder_
  28. /*
  29.  * Group 3 Facsimile Decoder Support.
  30.  */
  31. #include "Types.h"
  32. extern "C" {
  33. #include <setjmp.h>
  34. }
  35. #include "tiffio.h"
  36. class G3Decoder {
  37. private:
  38.     bool is2D; // whether or not data is 2d-encoded
  39.     bool isG4; // whether or not data is MMR
  40.     uint32 data; // current input/output byte
  41.     int bit; // current bit in input/output byte
  42.     int EOLcnt; // EOL code recognized during decoding (1/0)
  43.     int RTCrun; // count of consecutive zero-length rows
  44.     int rowref; // reference count of rows decoded
  45.     int RTCrow; // row number of start of RTC
  46.     int decoderFd; // file descriptor for decoding pipe (ECM)
  47.     bool isECM; // whether to read input data from the modem or the pipe
  48.     tiff_runlen_t* refruns; // runs for reference line
  49.     tiff_runlen_t* curruns; // runs for current line
  50.     const u_char* bitmap; // bit reversal table
  51. protected:
  52.     G3Decoder();
  53.     void raiseEOF();
  54.     void raiseRTC();
  55.     const u_char* getBitmap();
  56.     virtual int nextByte();
  57.     virtual int decodeNextByte();
  58.     virtual void invalidCode(const char* type, int x);
  59.     virtual void badPixelCount(const char* type, int got, int expected);
  60.     virtual void badDecodingState(const char* type, int x);
  61. public:
  62.     // XXX these should be private; see below for why they're public
  63.     sigjmp_buf jmpEOF; // non-local goto on EOF
  64.     sigjmp_buf jmpRTC; // non-local goto on RTC
  65.     virtual ~G3Decoder();
  66.     void setupDecoder(u_int fillorder, bool is2D, bool isG4);
  67.     void setRuns(tiff_runlen_t*, tiff_runlen_t*, int);
  68.     tiff_runlen_t* lastRuns();
  69.     void decode(void* raster, u_int w, u_int h);
  70.     bool decodeRow(void* scanline, u_int w);
  71.     bool isNextRow1D();
  72.     int getPendingBits() const;
  73.     bool seenRTC() const;
  74.     int getRTCRow() const;
  75.     int getReferenceRow() const;
  76.     int getDecoderFd() const;
  77.     void setDecoderFd(int);
  78.     bool getIsECM() const;
  79.     void setIsECM(bool);
  80. };
  81. /*
  82.  * NB: These should be inline public methods but because we
  83.  *     cannot depend on the compiler actually doing the inline
  84.  *     we use #defines instead--if the sigsetjmp is done in
  85.  *     the context of an out-of-line routine, then the saved
  86.  *     frame pointer, pc, etc. will be wrong.
  87.  */
  88. #define EOFraised() (sigsetjmp(jmpEOF, 0) != 0)
  89. #define RTCraised() (sigsetjmp(jmpRTC, 0) != 0)
  90. inline tiff_runlen_t* G3Decoder::lastRuns() { return is2D ? refruns : curruns; }
  91. inline const u_char* G3Decoder::getBitmap() { return bitmap; }
  92. inline int G3Decoder::getPendingBits() const { return bit; }
  93. inline bool G3Decoder::seenRTC() const { return (RTCrow != -1); }
  94. inline int G3Decoder::getRTCRow() const { return RTCrow; }
  95. inline int G3Decoder::getReferenceRow() const { return rowref; }
  96. inline int G3Decoder::getDecoderFd() const { return decoderFd; }
  97. inline void G3Decoder::setDecoderFd(int fd) { decoderFd = fd; }
  98. inline bool G3Decoder::getIsECM() const { return isECM; }
  99. inline void G3Decoder::setIsECM(bool ecm) { isECM = ecm; }
  100. #endif /* _G3Decoder_ */