object.h revision 104862
1// -*- C++ -*- 2/* Copyright (C) 1989, 1990, 1991, 1992, 2002 Free Software Foundation, Inc. 3 Written by James Clark (jjc@jclark.com) 4 5This file is part of groff. 6 7groff is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12groff is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License along 18with groff; see the file COPYING. If not, write to the Free Software 19Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 20 21struct place; 22 23enum object_type { 24 OTHER_OBJECT, 25 BOX_OBJECT, 26 CIRCLE_OBJECT, 27 ELLIPSE_OBJECT, 28 ARC_OBJECT, 29 SPLINE_OBJECT, 30 LINE_OBJECT, 31 ARROW_OBJECT, 32 MOVE_OBJECT, 33 TEXT_OBJECT, 34 BLOCK_OBJECT, 35 MARK_OBJECT 36 }; 37 38struct bounding_box; 39 40struct object { 41 object *prev; 42 object *next; 43 object(); 44 virtual ~object(); 45 virtual position origin(); 46 virtual double width(); 47 virtual double radius(); 48 virtual double height(); 49 virtual position north(); 50 virtual position south(); 51 virtual position east(); 52 virtual position west(); 53 virtual position north_east(); 54 virtual position north_west(); 55 virtual position south_east(); 56 virtual position south_west(); 57 virtual position start(); 58 virtual position end(); 59 virtual position center(); 60 virtual place *find_label(const char *); 61 virtual void move_by(const position &); 62 virtual int blank(); 63 virtual void update_bounding_box(bounding_box *); 64 virtual object_type type() = 0; 65 virtual void print(); 66 virtual void print_text(); 67}; 68 69typedef position (object::*corner)(); 70 71struct place { 72 object *obj; 73 double x, y; 74}; 75 76struct string_list; 77 78class path { 79 position pos; 80 corner crn; 81 string_list *label_list; 82 path *ypath; 83 int is_position; 84public: 85 path(corner = 0); 86 path(position); 87 path(char *, corner = 0); 88 ~path(); 89 void append(corner); 90 void append(char *); 91 void set_ypath(path *); 92 int follow(const place &, place *) const; 93}; 94 95struct object_list { 96 object *head; 97 object *tail; 98 object_list(); 99 void append(object *); 100 void wrap_up_block(object_list *); 101}; 102 103declare_ptable(place) 104 105// these go counterclockwise 106enum direction { 107 RIGHT_DIRECTION, 108 UP_DIRECTION, 109 LEFT_DIRECTION, 110 DOWN_DIRECTION 111 }; 112 113struct graphics_state { 114 double x, y; 115 direction dir; 116}; 117 118struct saved_state : public graphics_state { 119 saved_state *prev; 120 PTABLE(place) *tbl; 121}; 122 123 124struct text_item { 125 text_item *next; 126 char *text; 127 adjustment adj; 128 const char *filename; 129 int lineno; 130 131 text_item(char *, const char *, int); 132 ~text_item(); 133}; 134 135const unsigned long IS_DOTTED = 01; 136const unsigned long IS_DASHED = 02; 137const unsigned long IS_CLOCKWISE = 04; 138const unsigned long IS_INVISIBLE = 020; 139const unsigned long HAS_LEFT_ARROW_HEAD = 040; 140const unsigned long HAS_RIGHT_ARROW_HEAD = 0100; 141const unsigned long HAS_SEGMENT = 0200; 142const unsigned long IS_SAME = 0400; 143const unsigned long HAS_FROM = 01000; 144const unsigned long HAS_AT = 02000; 145const unsigned long HAS_WITH = 04000; 146const unsigned long HAS_HEIGHT = 010000; 147const unsigned long HAS_WIDTH = 020000; 148const unsigned long HAS_RADIUS = 040000; 149const unsigned long HAS_TO = 0100000; 150const unsigned long IS_CHOPPED = 0200000; 151const unsigned long IS_DEFAULT_CHOPPED = 0400000; 152const unsigned long HAS_THICKNESS = 01000000; 153const unsigned long IS_FILLED = 02000000; 154const unsigned long IS_DEFAULT_FILLED = 04000000; 155const unsigned long IS_ALIGNED = 010000000; 156const unsigned long IS_SHADED = 020000000; 157const unsigned long IS_OUTLINED = 040000000; 158 159struct segment { 160 int is_absolute; 161 position pos; 162 segment *next; 163 segment(const position &, int, segment *); 164}; 165 166struct rectangle_object; 167struct graphic_object; 168struct linear_object; 169 170struct object_spec { 171 unsigned long flags; 172 object_type type; 173 object_list oblist; 174 PTABLE(place) *tbl; 175 double dash_width; 176 position from; 177 position to; 178 position at; 179 position by; 180 path *with; 181 text_item *text; 182 double height; 183 double radius; 184 double width; 185 double segment_width; 186 double segment_height; 187 double start_chop; 188 double end_chop; 189 double thickness; 190 double fill; 191 char *shaded; 192 char *outlined; 193 direction dir; 194 segment *segment_list; 195 position segment_pos; 196 int segment_is_absolute; 197 198 object_spec(object_type); 199 ~object_spec(); 200 object *make_object(position *, direction *); 201 graphic_object *make_box(position *, direction *); 202 graphic_object *make_block(position *, direction *); 203 graphic_object *make_text(position *, direction *); 204 graphic_object *make_ellipse(position *, direction *); 205 graphic_object *make_circle(position *, direction *); 206 linear_object *make_line(position *, direction *); 207 linear_object *make_arc(position *, direction *); 208 graphic_object *make_linear(position *, direction *); 209 graphic_object *make_move(position *, direction *); 210 int position_rectangle(rectangle_object *p, position *curpos, 211 direction *dirp); 212}; 213 214 215object *make_object(object_spec *, position *, direction *); 216 217object *make_mark_object(); 218object *make_command_object(char *, const char *, int); 219 220int lookup_variable(const char *name, double *val); 221void define_variable(const char *name, double val); 222 223void print_picture(object *); 224 225