Merge from vendor branch OPENSSH:
[dragonfly.git] / contrib / groff-1.19 / src / include / font.h
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992, 2002, 2004
3    Free Software Foundation, Inc.
4      Written by James Clark (jjc@jclark.com)
5
6 This file is part of groff.
7
8 groff is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 groff is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with groff; see the file COPYING.  If not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 typedef void (*FONT_COMMAND_HANDLER)(const char *, const char *,
23                                      const char *, int);
24
25 struct font_kern_list;
26 struct font_char_metric;
27 struct font_widths_cache;
28
29 class font {
30 public:
31   enum {
32     LIG_ff = 1,
33     LIG_fi = 2,
34     LIG_fl = 4,
35     LIG_ffi = 8,
36     LIG_ffl = 16
37     };
38
39   virtual ~font();
40   int contains(int index);
41   int is_special();
42   int get_width(int index, int point_size);
43   int get_height(int index, int point_size);
44   int get_depth(int index, int point_size);
45   int get_space_width(int point_size);
46   int get_character_type(int index);
47   int get_kern(int index1, int index2, int point_size);
48   int get_skew(int index, int point_size, int slant);
49   int has_ligature(int);
50   int get_italic_correction(int index, int point_size);
51   int get_left_italic_correction(int index, int point_size);
52   int get_subscript_correction(int index, int point_size);
53   int get_code(int i);
54   const char *get_special_device_encoding(int index);
55   const char *get_name();
56   const char *get_internal_name();
57
58   static int scan_papersize(const char *, const char **, double *, double *);
59
60   static font *load_font(const char *, int *not_found = 0);
61   static void command_line_font_dir(const char *path);
62   static FILE *open_file(const char *name, char **pathp);
63   static int load_desc();
64   static int name_to_index(const char *);
65   static int number_to_index(int);
66   static FONT_COMMAND_HANDLER
67     set_unknown_desc_command_handler(FONT_COMMAND_HANDLER);
68
69   static int res;
70   static int hor;
71   static int vert;
72   static int unitwidth;
73   static int paperwidth;
74   static int paperlength;
75   static const char *papersize;
76   static int biggestfont;
77   static int spare2;
78   static int sizescale;
79   static int tcommand;
80   static int pass_filenames;
81   static int use_charnames_in_special;
82
83   static const char **font_name_table;
84   static const char **style_table;
85   static const char *family;
86   static int *sizes;
87 private:
88   unsigned ligatures;
89   font_kern_list **kern_hash_table;
90   int space_width;
91   int *ch_index;
92   int nindices;
93   font_char_metric *ch;
94   int ch_used;
95   int ch_size;
96   int special;
97   char *name;
98   char *internalname;
99   double slant;
100   font_widths_cache *widths_cache;
101   static FONT_COMMAND_HANDLER unknown_desc_command_handler;
102
103   enum { KERN_HASH_TABLE_SIZE = 503 };
104
105   void add_entry(int index, const font_char_metric &);
106   void copy_entry(int new_index, int old_index);
107   void add_kern(int index1, int index2, int amount);
108   static int hash_kern(int i1, int i2);
109   void alloc_ch_index(int);
110   void extend_ch();
111   void compact();
112
113   static int scale(int w, int pointsize);
114   static int unit_scale(double *value, char unit);
115   virtual void handle_unknown_font_command(const char *command,
116                                            const char *arg,
117                                            const char *file, int lineno);
118 protected:
119   font(const char *);
120   int load(int *not_found = 0);
121 };