No empty .Rs/.Re
[netbsd-mini2440.git] / gnu / dist / groff / src / preproc / pic / object.h
blob64f5c1d5b6bf7da84bcbfd27f68ddca7aa3a570c
1 /* $NetBSD$ */
3 // -*- C++ -*-
4 /* Copyright (C) 1989, 1990, 1991, 1992, 2002, 2004
5 Free Software Foundation, Inc.
6 Written by James Clark (jjc@jclark.com)
8 This file is part of groff.
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.
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.
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. */
24 struct place;
26 enum object_type {
27 OTHER_OBJECT,
28 BOX_OBJECT,
29 CIRCLE_OBJECT,
30 ELLIPSE_OBJECT,
31 ARC_OBJECT,
32 SPLINE_OBJECT,
33 LINE_OBJECT,
34 ARROW_OBJECT,
35 MOVE_OBJECT,
36 TEXT_OBJECT,
37 BLOCK_OBJECT,
38 MARK_OBJECT
41 struct bounding_box;
43 struct object {
44 object *prev;
45 object *next;
46 object();
47 virtual ~object();
48 virtual position origin();
49 virtual double width();
50 virtual double radius();
51 virtual double height();
52 virtual position north();
53 virtual position south();
54 virtual position east();
55 virtual position west();
56 virtual position north_east();
57 virtual position north_west();
58 virtual position south_east();
59 virtual position south_west();
60 virtual position start();
61 virtual position end();
62 virtual position center();
63 virtual place *find_label(const char *);
64 virtual void move_by(const position &);
65 virtual int blank();
66 virtual void update_bounding_box(bounding_box *);
67 virtual object_type type() = 0;
68 virtual void print();
69 virtual void print_text();
72 typedef position (object::*corner)();
74 struct place {
75 object *obj;
76 double x, y;
79 struct string_list;
81 class path {
82 position pos;
83 corner crn;
84 string_list *label_list;
85 path *ypath;
86 int is_position;
87 public:
88 path(corner = 0);
89 path(position);
90 path(char *, corner = 0);
91 ~path();
92 void append(corner);
93 void append(char *);
94 void set_ypath(path *);
95 int follow(const place &, place *) const;
98 struct object_list {
99 object *head;
100 object *tail;
101 object_list();
102 void append(object *);
103 void wrap_up_block(object_list *);
106 declare_ptable(place)
108 // these go counterclockwise
109 enum direction {
110 RIGHT_DIRECTION,
111 UP_DIRECTION,
112 LEFT_DIRECTION,
113 DOWN_DIRECTION
116 struct graphics_state {
117 double x, y;
118 direction dir;
121 struct saved_state : public graphics_state {
122 saved_state *prev;
123 PTABLE(place) *tbl;
127 struct text_item {
128 text_item *next;
129 char *text;
130 adjustment adj;
131 const char *filename;
132 int lineno;
134 text_item(char *, const char *, int);
135 ~text_item();
138 const unsigned long IS_DOTTED = 01;
139 const unsigned long IS_DASHED = 02;
140 const unsigned long IS_CLOCKWISE = 04;
141 const unsigned long IS_INVISIBLE = 020;
142 const unsigned long HAS_LEFT_ARROW_HEAD = 040;
143 const unsigned long HAS_RIGHT_ARROW_HEAD = 0100;
144 const unsigned long HAS_SEGMENT = 0200;
145 const unsigned long IS_SAME = 0400;
146 const unsigned long HAS_FROM = 01000;
147 const unsigned long HAS_AT = 02000;
148 const unsigned long HAS_WITH = 04000;
149 const unsigned long HAS_HEIGHT = 010000;
150 const unsigned long HAS_WIDTH = 020000;
151 const unsigned long HAS_RADIUS = 040000;
152 const unsigned long HAS_TO = 0100000;
153 const unsigned long IS_CHOPPED = 0200000;
154 const unsigned long IS_DEFAULT_CHOPPED = 0400000;
155 const unsigned long HAS_THICKNESS = 01000000;
156 const unsigned long IS_FILLED = 02000000;
157 const unsigned long IS_DEFAULT_FILLED = 04000000;
158 const unsigned long IS_ALIGNED = 010000000;
159 const unsigned long IS_SHADED = 020000000;
160 const unsigned long IS_OUTLINED = 040000000;
162 struct segment {
163 int is_absolute;
164 position pos;
165 segment *next;
166 segment(const position &, int, segment *);
169 class rectangle_object;
170 class graphic_object;
171 class linear_object;
173 struct object_spec {
174 unsigned long flags;
175 object_type type;
176 object_list oblist;
177 PTABLE(place) *tbl;
178 double dash_width;
179 position from;
180 position to;
181 position at;
182 position by;
183 path *with;
184 text_item *text;
185 double height;
186 double radius;
187 double width;
188 double segment_width;
189 double segment_height;
190 double start_chop;
191 double end_chop;
192 double thickness;
193 double fill;
194 char *shaded;
195 char *outlined;
196 direction dir;
197 segment *segment_list;
198 position segment_pos;
199 int segment_is_absolute;
201 object_spec(object_type);
202 ~object_spec();
203 object *make_object(position *, direction *);
204 graphic_object *make_box(position *, direction *);
205 graphic_object *make_block(position *, direction *);
206 graphic_object *make_text(position *, direction *);
207 graphic_object *make_ellipse(position *, direction *);
208 graphic_object *make_circle(position *, direction *);
209 linear_object *make_line(position *, direction *);
210 linear_object *make_arc(position *, direction *);
211 graphic_object *make_linear(position *, direction *);
212 graphic_object *make_move(position *, direction *);
213 int position_rectangle(rectangle_object *p, position *curpos,
214 direction *dirp);
218 object *make_object(object_spec *, position *, direction *);
220 object *make_mark_object();
221 object *make_command_object(char *, const char *, int);
223 int lookup_variable(const char *name, double *val);
224 void define_variable(const char *name, double val);
226 void print_picture(object *);