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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: TextFormat.h,v 1.4 2007/01/01 18:44:29 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1993-1996 Sam Leffler
  4.  * Copyright (c) 1993-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 _TextFormat_
  27. #define _TextFormat_
  28. /*
  29.  * Simple Text To PostScript Conversion Support.
  30.  */
  31. #include "Str.h"
  32. #include "FaxConfig.h"
  33. typedef long TextCoord; // local coordinates
  34. class TextFont {
  35. private:
  36.     enum { maxaliases = 10 }; // max no of aliases to find a font
  37.     fxStr family; // font family name
  38.     fxStr setproc; // PostScript setfont procedure
  39.     fxStr showproc; // PostScript show procedure
  40.     TextCoord widths[256]; // width table
  41.     static fxStr fontMap; // location of Fontmap file
  42.     static fxStr fontPath; // path for afm files
  43.     static u_int fontID; // font identifier number
  44.     friend class TextFormat;
  45.     void loadFixedMetrics(TextCoord w);
  46.     FILE* openAFMFile(fxStr& pathname);
  47.     bool getAFMLine(FILE* fp, char* buf, int bsize);
  48.     static bool decodeFontName(const char*, fxStr&, fxStr&);
  49. public:
  50.     TextFont(const char*);
  51.     ~TextFont();
  52.     static bool findFont(const char* name);
  53.     void defFont(FILE*, TextCoord pointSize, bool useISO8859) const;
  54.     void setfont(FILE*) const;
  55.     TextCoord show(FILE*, const char*, int len) const;
  56.     TextCoord show(FILE*, const fxStr&) const;
  57.     TextCoord strwidth(const char*) const;
  58.     TextCoord charwidth(const char c) const;
  59.     const char* getFamily(void) const;
  60.     bool readMetrics(TextCoord pointsize, bool useISO8859, fxStr& emsg);
  61. };
  62. /*
  63.  * we have to use const u_char
  64.  */
  65. inline TextCoord TextFont::charwidth(const char c) const { return widths[(u_char) c]; }
  66. inline const char* TextFont::getFamily(void) const  { return family; }
  67. class FontDict;
  68. class OfftArray;
  69. class TextFormat : public FaxConfig {
  70. public:
  71.     enum { // page orientation
  72. LANDSCAPE,
  73. PORTRAIT
  74.     };
  75.     enum { // page collation
  76. FORWARD,
  77. REVERSE
  78.     };
  79. private:
  80.     bool gaudy; // emit gaudy headers
  81.     bool landscape; // horizontal landscape mode output
  82.     bool useISO8859; // use the ISO 8859-1 character encoding
  83.     bool reverse; // page reversal flag
  84.     bool wrapLines; // wrap/truncate lines
  85.     bool headers; // emit page headers
  86.     bool workStarted; // formatting work begun
  87.     FILE* output; // output file stream
  88.     FILE* tf; // temporary output file
  89.     OfftArray* pageOff; // page offset table
  90.     int firstPageNum; // starting page number
  91.     fxStr curFile; // current input filename (for header)
  92.     fxStr modDate; // last modification date for input file
  93.     fxStr modTime; // last modification time for input file
  94.     fxStr title; // document title information
  95.     FontDict* fonts; // font dictionary
  96.     TextFont* curFont; // current font for imaging text
  97.     float physPageHeight; // physical page height (inches)
  98.     float physPageWidth; // physical page width (inches)
  99.     TextCoord pointSize; // font point size in big points
  100.     TextCoord lm, rm; // left, right margins in local coordinates
  101.     TextCoord tm, bm; // top, bottom margin in local coordinates
  102.     TextCoord lineHeight; // inter-line spacing
  103.     bool boc; // at beginning of a column
  104.     bool bop; // at beginning of a page
  105.     bool bol; // at beginning of a line
  106.     bool bot; // at beginning of a text string
  107.     int numcol; // number of text columns
  108.     int column; // current text column # (1..numcol)
  109.     TextCoord col_margin; // inter-column margin
  110.     TextCoord col_width; // column width in local coordinates
  111.     int level; // PS string parenthesis level
  112.     TextCoord outline; // page and column outline linewidth
  113.     TextCoord pageHeight; // page height in local coordinates
  114.     int pageNum; // current page number
  115.     TextCoord pageWidth; // page width in local coordinates
  116.     TextCoord right_x; // column width (right hand side x)
  117.     int tabStop; // n-column tab stop
  118.     TextCoord tabWidth; // tab stop width in local units
  119.     TextCoord x, y; // current coordinate
  120.     TextCoord xoff; // current x offset on line
  121.     void putISOPrologue(void);
  122.     void emitPrologue(void);
  123.     void emitTrailer(void);
  124.     void Copy_Block(off_t ,off_t);
  125. protected:
  126.     virtual void emitClientComments(FILE*);
  127.     virtual void emitClientPrologue(FILE*);
  128.     virtual void warning(const char* fmt ...) const;
  129.     virtual void error(const char* fmt ...) const;
  130.     virtual void fatal(const char* fmt ...) const;
  131.     virtual void setupConfig(void);
  132.     virtual bool setConfigItem(const char* tag, const char* value);
  133.     virtual void configError(const char* fmt ...);
  134.     virtual void configTrace(const char* fmt ...);
  135. public:
  136.     TextFormat();
  137.     virtual ~TextFormat();
  138.     virtual void resetConfig(void);
  139.     static TextCoord inch(const char*);
  140.     void setNumberOfColumns(u_int n);
  141.     void setPageHeaders(bool);
  142.     bool getPageHeaders(void) const;
  143.     void setLineWrapping(bool);
  144.     bool getLineWrapping(void) const;
  145.     void setISO8859(bool);
  146.     bool getISO8859(void) const;
  147.     bool setTextFont(const char* fontName);
  148.     void setGaudyHeaders(bool);
  149.     bool setPageMargins(const char*);
  150.     void setPageMargins(TextCoord l, TextCoord r, TextCoord b, TextCoord t);
  151.     void setOutlineMargin(TextCoord);
  152.     void setTextPointSize(TextCoord);
  153.     TextCoord getTextPointSize(void) const;
  154.     void setPageOrientation(u_int);
  155.     bool setPageSize(const char*);
  156.     void setPageWidth(float);
  157.     void setPageHeight(float);
  158.     void setPageCollation(u_int);
  159.     void setTextLineHeight(TextCoord);
  160.     TextCoord getTextLineHeight(void) const;
  161.     void setTitle(const char*);
  162.     void setFilename(const char*);
  163.     void setModTimeAndDate(time_t);
  164.     void setModTime(const char*);
  165.     void setModDate(const char*);
  166.     void setOutputFile(FILE*);
  167.     FILE* getOutputFile(void);
  168.     void flush(void);
  169.     void beginFormatting(FILE* output);
  170.     void endFormatting(bool skiptrailer = false);
  171.     void beginFile(void);
  172.     void formatFile(const char*);
  173.     void formatFile(FILE*);
  174.     void endFile(void);
  175.     void format(FILE*);
  176.     void format(const char*, u_int cc);
  177.     void newPage(void);
  178.     void newCol(void);
  179.     void beginCol(void);
  180.     void endCol(void);
  181.     void endPage(void);
  182.     void beginLine();
  183.     void endLine(void);
  184.     void beginText(void);
  185.     void endTextLine(void);
  186.     void endTextCol(void);
  187.     void closeStrings(const char* cmd);
  188.     TextFont* addFont(const char* name, const char* family);
  189.     const TextFont* getFont(void) const;
  190.     const TextFont* getFont(const char* name) const;
  191.     void setFont(TextFont*);
  192.     void setFont(const char*);
  193.     void setFontPath(const char*);
  194.     void hrMove(TextCoord);
  195.     TextCoord getXOff(void) const;
  196.     TextCoord getRHS(void) const;
  197.     void reserveVSpace(TextCoord);
  198. };
  199. inline bool TextFormat::getLineWrapping(void) const { return wrapLines; }
  200. inline bool TextFormat::getPageHeaders(void) const { return headers; }
  201. inline TextCoord TextFormat::getTextPointSize(void) const { return pointSize; }
  202. inline TextCoord TextFormat::getXOff(void) const { return xoff; }
  203. inline TextCoord TextFormat::getRHS(void) const { return right_x; }
  204. inline TextCoord TextFormat::getTextLineHeight(void) const { return lineHeight; }
  205. inline bool TextFormat::getISO8859(void) const { return useISO8859; }
  206. inline const TextFont* TextFormat::getFont(void) const { return curFont; }
  207. inline FILE* TextFormat::getOutputFile(void) { return tf; }
  208. #endif /* _TextFormat_ */