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