1 /* $NetBSD: box.h,v 1.1.1.1 2016/01/13 18:41:49 christos Exp $ */ 2 3 // -*- C++ -*- 4 /* Copyright (C) 1989, 1990, 1991, 1992, 2004, 2005 5 Free Software Foundation, Inc. 6 Written by James Clark (jjc@jclark.com) 7 8 This file is part of groff. 9 10 groff is free software; you can redistribute it and/or modify it under 11 the terms of the GNU General Public License as published by the Free 12 Software Foundation; either version 2, or (at your option) any later 13 version. 14 15 groff is distributed in the hope that it will be useful, but WITHOUT ANY 16 WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 18 for more details. 19 20 You should have received a copy of the GNU General Public License along 21 with groff; see the file COPYING. If not, write to the Free Software 22 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 23 24 class list_box; 25 26 class box { 27 private: 28 static int next_uid; 29 public: 30 int spacing_type; 31 const int uid; 32 box(); 33 virtual void debug_print() = 0; 34 virtual ~box(); 35 void top_level(); 36 virtual int compute_metrics(int); 37 virtual void compute_subscript_kern(); 38 virtual void compute_skew(); 39 virtual void output(); 40 void extra_space(); 41 virtual list_box *to_list_box(); 42 virtual int is_simple(); 43 virtual int is_char(); 44 virtual int left_is_italic(); 45 virtual int right_is_italic(); 46 virtual void handle_char_type(int, int); 47 enum { FOUND_NOTHING = 0, FOUND_MARK = 1, FOUND_LINEUP = 2 }; 48 void set_spacing_type(char *type); 49 virtual void hint(unsigned); 50 virtual void check_tabs(int); 51 }; 52 53 class box_list { 54 private: 55 int maxlen; 56 public: 57 box **p; 58 int len; 59 60 box_list(box *); 61 ~box_list(); 62 void append(box *); 63 void list_check_tabs(int); 64 void list_debug_print(const char *sep); 65 friend class list_box; 66 }; 67 68 // declarations to avoid friend name injection problems 69 box *make_script_box(box *, box *, box *); 70 box *make_mark_box(box *); 71 box *make_lineup_box(box *); 72 73 class list_box : public box { 74 int is_script; 75 box_list list; 76 int sty; 77 public: 78 list_box(box *); 79 void debug_print(); 80 int compute_metrics(int); 81 void compute_subscript_kern(); 82 void output(); 83 void check_tabs(int); 84 void append(box *); 85 list_box *to_list_box(); 86 void handle_char_type(int, int); 87 void compute_sublist_width(int n); 88 friend box *make_script_box(box *, box *, box *); 89 friend box *make_mark_box(box *); 90 friend box *make_lineup_box(box *); 91 }; 92 93 enum alignment { LEFT_ALIGN, RIGHT_ALIGN, CENTER_ALIGN }; 94 95 class column : public box_list { 96 alignment align; 97 int space; 98 public: 99 column(box *); 100 void set_alignment(alignment); 101 void set_space(int); 102 void debug_print(const char *); 103 104 friend class matrix_box; 105 friend class pile_box; 106 }; 107 108 class pile_box : public box { 109 column col; 110 public: 111 pile_box(box *); 112 int compute_metrics(int); 113 void output(); 114 void debug_print(); 115 void check_tabs(int); set_alignment(alignment a)116 void set_alignment(alignment a) { col.set_alignment(a); } set_space(int n)117 void set_space(int n) { col.set_space(n); } append(box * p)118 void append(box *p) { col.append(p); } 119 }; 120 121 class matrix_box : public box { 122 private: 123 int len; 124 int maxlen; 125 column **p; 126 public: 127 matrix_box(column *); 128 ~matrix_box(); 129 void append(column *); 130 int compute_metrics(int); 131 void output(); 132 void check_tabs(int); 133 void debug_print(); 134 }; 135 136 class pointer_box : public box { 137 protected: 138 box *p; 139 public: 140 pointer_box(box *); 141 ~pointer_box(); 142 int compute_metrics(int); 143 void compute_subscript_kern(); 144 void compute_skew(); 145 void debug_print() = 0; 146 void check_tabs(int); 147 }; 148 149 class vcenter_box : public pointer_box { 150 public: 151 vcenter_box(box *); 152 int compute_metrics(int); 153 void output(); 154 void debug_print(); 155 }; 156 157 class simple_box : public box { 158 public: 159 int compute_metrics(int); 160 void compute_subscript_kern(); 161 void compute_skew(); 162 void output() = 0; 163 void debug_print() = 0; 164 int is_simple(); 165 }; 166 167 class quoted_text_box : public simple_box { 168 char *text; 169 public: 170 quoted_text_box(char *); 171 ~quoted_text_box(); 172 void debug_print(); 173 void output(); 174 }; 175 176 class half_space_box : public simple_box { 177 public: 178 half_space_box(); 179 void output(); 180 void debug_print(); 181 }; 182 183 class space_box : public simple_box { 184 public: 185 space_box(); 186 void output(); 187 void debug_print(); 188 }; 189 190 class tab_box : public box { 191 int disabled; 192 public: 193 tab_box(); 194 void output(); 195 void debug_print(); 196 void check_tabs(int); 197 }; 198 199 class size_box : public pointer_box { 200 private: 201 char *size; 202 public: 203 size_box(char *, box *); 204 ~size_box(); 205 int compute_metrics(int); 206 void output(); 207 void debug_print(); 208 }; 209 210 class font_box : public pointer_box { 211 private: 212 char *f; 213 public: 214 font_box(char *, box *); 215 ~font_box(); 216 int compute_metrics(int); 217 void output(); 218 void debug_print(); 219 }; 220 221 class fat_box : public pointer_box { 222 public: 223 fat_box(box *); 224 int compute_metrics(int); 225 void output(); 226 void debug_print(); 227 }; 228 229 class vmotion_box : public pointer_box { 230 private: 231 int n; // up is >= 0 232 public: 233 vmotion_box(int, box *); 234 int compute_metrics(int); 235 void output(); 236 void debug_print(); 237 }; 238 239 class hmotion_box : public pointer_box { 240 int n; 241 public: 242 hmotion_box(int, box *); 243 int compute_metrics(int); 244 void output(); 245 void debug_print(); 246 }; 247 248 box *split_text(char *); 249 box *make_delim_box(char *, box *, char *); 250 box *make_sqrt_box(box *); 251 box *make_prime_box(box *); 252 box *make_over_box(box *, box *); 253 box *make_small_over_box(box *, box *); 254 box *make_limit_box(box *, box *, box *); 255 box *make_accent_box(box *, box *); 256 box *make_uaccent_box(box *, box *); 257 box *make_overline_box(box *); 258 box *make_underline_box(box *); 259 box *make_special_box(char *, box *); 260 261 void set_space(int); 262 int set_gsize(const char *); 263 void set_gfont(const char *); 264 void set_grfont(const char *); 265 void set_gbfont(const char *); 266 const char *get_gfont(); 267 const char *get_grfont(); 268 const char *get_gbfont(); 269 void start_string(); 270 void output_string(); 271 void do_text(const char *); 272 void restore_compatibility(); 273 void set_script_reduction(int n); 274 void set_minimum_size(int n); 275 void set_param(const char *name, int value); 276 277 void set_char_type(const char *type, char *ch); 278 279 void init_char_table(); 280 void init_extensible(); 281 void define_extensible(const char *name, const char *ext, const char *top = 0, 282 const char *mid = 0, const char *bot = 0); 283