home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / fontutils-0.6-base.tgz / fontutils-0.6-base.tar / fsf / fontutils / include / font.h < prev    next >
C/C++ Source or Header  |  1992-10-04  |  9KB  |  243 lines

  1. /* font.h: operations on fonts independent of a particular file format.  
  2.  
  3. Copyright (C) 1992 Free Software Foundation, Inc.
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #ifndef FONT_LIBRARY_H
  20. #define FONT_LIBRARY_H
  21.  
  22. #include "bitmap.h"
  23. #include "bounding-box.h"
  24. #include "tfm.h"
  25. #include "types.h"
  26.  
  27.  
  28. /* A font is a collection of characters, generally at a particular point
  29.    size and resolution.  The `bitmap_font_type' structure holds
  30.    information that comes entirely from a bitmap file.  */
  31. typedef struct
  32. {
  33.   real design_size;
  34.   string comment;
  35.   unsigned checksum;
  36.   string filename;  
  37. } bitmap_font_type;
  38.  
  39. /* The design size is given in points.  It is not necessarily
  40.    related to the actual dimensions of any of the characters in the
  41.    font; indeed, usually the design size is quite a bit larger than the
  42.    largest characters.  */
  43. #define BITMAP_FONT_DESIGN_SIZE(f) ((f).design_size)
  44.  
  45. /* Sometimes a font comes with a comment identifying its source, who
  46.    owns the trademark, or some such.  */
  47. #define BITMAP_FONT_COMMENT(f) ((f).comment)
  48.  
  49. /* The checksum found in the bitmap file.  */
  50. #define BITMAP_FONT_CHECKSUM(f) ((f).checksum)
  51.  
  52. /* The full pathname for the file that we opened.  */
  53. #define BITMAP_FONT_FILENAME(f) ((f).filename)
  54.  
  55.  
  56. /* Look for a font named FONT_NAME in PK or GF format, at resolution
  57.    DPI.  This ignores any extension in FONT_NAME; it adds `.<dpi>gf' or
  58.    `.<dpi>pk'.  The font is looked for using the PKFONTS, GFFONTS, and
  59.    TEXFONTS environment variables, just as with the TeX software.  If
  60.    the font can't be found, this gives a fatal error.  */
  61. extern bitmap_font_type get_bitmap_font (string font_name, unsigned dpi);
  62.  
  63. /* `close_font', below, works for bitmap fonts, too.  */
  64.  
  65. /* The `font_info_type' holds a `bitmap_font_type', and additional
  66.    information that we get from a font metric file.  */
  67. typedef struct
  68. {
  69.   bitmap_font_type bitmap_font;
  70.   tfm_global_info_type tfm_font;
  71.   string tfm_filename;
  72. } font_info_type;
  73.  
  74. /* The bitmap information that is associated with this font.  */
  75. #define FONT_BITMAP_FONT(f) ((f).bitmap_font)
  76.  
  77. /* The TFM information.  */
  78. #define FONT_TFM_FONT(f) ((f).tfm_font)
  79.  
  80. /* The full pathname for the TFM file that we opened.  */
  81. #define FONT_TFM_FILENAME(f) ((f).tfm_filename)
  82.  
  83. /* The design size is given in points.  It is not necessarily
  84.    related to the actual dimensions of any of the characters in the
  85.    font; indeed, usually the design size is quite a bit larger than the
  86.    largest characters.  */
  87. #define FONT_DESIGN_SIZE(f) BITMAP_FONT_DESIGN_SIZE ((f).bitmap_font)
  88.  
  89. /* Sometimes a font comes with a comment identifying its source, who
  90.    owns the trademark, or some such.  */
  91. #define FONT_COMMENT(f) BITMAP_FONT_COMMENT ((f).bitmap_font)
  92.  
  93.  
  94. /* This calls `get_bitmap_font'; in addition, it looks for FONT_NAME in
  95.    TFM format.  If either the bitmap file or the metric file can't be
  96.    found, this gives a fatal error.  */
  97. extern font_info_type get_font (string font_name, unsigned dpi);
  98.  
  99. /* Close any open files associated with FONT_NAME, whether it was opened
  100.    with `get_bitmap_font' or `get_font'.  */ 
  101. extern void close_font (string font_name);
  102.  
  103. /* A character is a bitmap image, and is therefore at a particular size
  104.    and resolution.  It is also at a particular position in a font.
  105.    Generally, characters also have `side bearings'---extra space at the
  106.    left and/or right of the character.  (In some scripts, there is
  107.    also displacement above and/or below the character, but we don't take
  108.    that into account here.)  */
  109.  
  110. typedef struct
  111. {
  112.   charcode_type code;
  113.   int set_width;
  114.   fix_word tfm_width;
  115.   bounding_box_type bb;
  116.   bitmap_type bitmap;
  117. } char_info_type;
  118.  
  119. /* The character code in our fonts is always between 0 and 255.  */
  120. #define CHARCODE(c) ((c).code)
  121.  
  122. /* The set width is given in pixels; it's the sum of the left side
  123.    bearing, the bitmap's width, and the right side bearing.  */
  124. #define CHAR_SET_WIDTH(c) ((c).set_width)
  125.  
  126. /* The TFM width is the character's true width divided by the design
  127.    size (expressed as a fix_word).  */
  128. #define CHAR_TFM_WIDTH(c) ((c).tfm_width)
  129.  
  130. /* Unlike the font's bounding box, the character bounding box is
  131.    guaranteed to be the tightest possible; i.e., no all-blank rows occur
  132.    at the top or bottom, and no all-blank columns occur at the left or
  133.    right.  */
  134. #define CHAR_BB(c) ((c).bb)
  135.  
  136. /* The pixels.  See `bitmap.h'.  */
  137. #define CHAR_BITMAP(c) ((c).bitmap)
  138.  
  139.  
  140. /* Abbreviations for the width and height of a character's bitmap.  */
  141. #define CHAR_BITMAP_WIDTH(c) BITMAP_WIDTH (CHAR_BITMAP (c))
  142. #define CHAR_BITMAP_HEIGHT(c) BITMAP_HEIGHT (CHAR_BITMAP (c))
  143.  
  144. /* Abbreviations for the parts of the character's bounding box.  */
  145. #define CHAR_MIN_COL(c) MIN_COL (CHAR_BB (c))
  146. #define CHAR_MAX_COL(c) MAX_COL (CHAR_BB (c))
  147. #define CHAR_MIN_ROW(c) MIN_ROW (CHAR_BB (c))
  148. #define CHAR_MAX_ROW(c) MAX_ROW (CHAR_BB (c))
  149.  
  150.  
  151. /* The height of a character is how far it extends above the baseline.  */
  152. #define CHAR_HEIGHT(c) (CHAR_MAX_ROW (c) >= 0 ? CHAR_MAX_ROW (c) : 0)
  153.  
  154. /* The depth is far it extends below the baseline (but as a positive
  155.    number, e.g., if a character's bitmap goes down to row -4, the depth
  156.    is 4).  */
  157. #define CHAR_DEPTH(c) (CHAR_MIN_ROW (c) < 0 ? -CHAR_MIN_ROW (c) : 0)
  158.  
  159.  
  160. /* Abbreviations for the left and right side bearings, unless someone
  161.    else has already defined such macros (in which case they presumably
  162.    don't want ours).  */
  163. #ifndef CHAR_LSB
  164. #define CHAR_LSB CHAR_MIN_COL
  165. #endif
  166. #ifndef CHAR_RSB
  167. #define CHAR_RSB(c) (CHAR_SET_WIDTH (c) - CHAR_MAX_COL (c))
  168. #endif
  169.  
  170. /* Return the character numbered CODE in the font FONT_NAME, or NULL if
  171.    that character doesn't exist in that font.  If `get_font' or
  172.    `get_bitmap_font' has not been previously called on FONT_NAME,
  173.    `get_char' gives a fatal error.  */
  174. extern char_info_type *get_char (string font_name, charcode_type code);
  175.  
  176.  
  177. /* Print a plain text representation of the character C to the file F.  */
  178. extern void print_char (FILE *f, char_info_type c);
  179.  
  180.  
  181. /* Typeset the TEXT in the font FONT_NAME, at a resolution of DPI.  */
  182. extern bitmap_type string_to_bitmap (string text,
  183.                                      string font_name, unsigned dpi);
  184.  
  185. /* A raw character is the byte string that defines the character in the
  186.    font file, in some format.  */
  187.  
  188. typedef enum { pk_format, gf_format } bitmap_format_type;
  189.  
  190. typedef struct
  191. {
  192.   bitmap_format_type bitmap_format;
  193.   charcode_type code;
  194.   one_byte *bytes;
  195.   unsigned allocated;
  196.   unsigned used;
  197.   bounding_box_type bb;
  198.   signed_4_bytes h_escapement;
  199.   fix_word tfm_width;
  200. } raw_char_type;
  201.  
  202. /* CHARCODE works to access the character code of a `raw_char_type'
  203.    variable.  Likewise for the bounding box, horizontal escapement, and
  204.    TFM width.  */
  205.  
  206. /* The file format the character definition was read from.  */
  207. #define RAW_CHAR_BITMAP_FORMAT(rc) ((rc).bitmap_format)
  208.  
  209. /* The bytes in the file that comprise the character definition.  */
  210. #define RAW_CHAR_BYTES(rc) ((rc).bytes)
  211.  
  212. /* The number of allocated bytes to which the buffer points.  */
  213. #define RAW_CHAR_ALLOCATED(rc) ((rc).allocated)
  214.  
  215. /* The number of bytes actually used.  */
  216. #define RAW_CHAR_USED(rc) ((rc).used)
  217.  
  218. /* A convenience macro for the first unused byte.  */
  219. #define RAW_CHAR_UNUSED_START(rc) RAW_CHAR_BYTES (rc)[RAW_CHAR_USED (rc)]
  220.  
  221.  
  222. /* Return the raw character numbered CODE in the font named FONT_NAME,
  223.    or NULL.  The only useful operation on a raw character is to write it
  224.    to an output file with the appropriate format.  */
  225. extern raw_char_type *get_raw_char (string font_name,
  226.                                     charcode_type code);
  227.  
  228. /* Free all allocated storage in the raw character RAW_CHAR, including
  229.    the character itself.  */
  230. extern void free_raw_char (raw_char_type *raw_char);
  231.  
  232. /* Miscellanous constants.  */
  233.  
  234. /* We will only deal with fonts that have at most this many characters,
  235.    although the bitmap formats allow more.  */
  236. #define MAX_CHARCODE 255
  237.  
  238. /* Some font formats have pointers within the file (to other places in
  239.    the file).  The null value for such pointers is -1.  */
  240. #define NULL_BYTE_PTR (-1)
  241.  
  242. #endif /* not FONT_LIBRARY_H */
  243.