1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
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 2, 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 COPYING. If not, write to the Free Software
19 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
20
21
22 class vunits {
23 int n;
24 public:
25 vunits();
26 vunits(units);
27 units to_units();
28 int is_zero();
29 vunits& operator+=(const vunits&);
30 vunits& operator-=(const vunits&);
31 friend inline vunits scale(vunits n, units x, units y); // scale n by x/y
32 friend inline vunits scale(vunits n, vunits x, vunits y);
33 friend inline vunits operator +(const vunits&, const vunits&);
34 friend inline vunits operator -(const vunits&, const vunits&);
35 friend inline vunits operator -(const vunits&);
36 friend inline int operator /(const vunits&, const vunits&);
37 friend inline vunits operator /(const vunits&, int);
38 friend inline vunits operator *(const vunits&, int);
39 friend inline vunits operator *(int, const vunits&);
40 friend inline int operator <(const vunits&, const vunits&);
41 friend inline int operator >(const vunits&, const vunits&);
42 friend inline int operator <=(const vunits&, const vunits&);
43 friend inline int operator >=(const vunits&, const vunits&);
44 friend inline int operator ==(const vunits&, const vunits&);
45 friend inline int operator !=(const vunits&, const vunits&);
46 };
47
48 extern vunits V0;
49
50
51 class hunits {
52 int n;
53 public:
54 hunits();
55 hunits(units);
56 units to_units();
57 int is_zero();
58 hunits& operator+=(const hunits&);
59 hunits& operator-=(const hunits&);
60 friend inline hunits scale(hunits n, units x, units y); // scale n by x/y
61 friend inline hunits scale(hunits n, double x);
62 friend inline hunits operator +(const hunits&, const hunits&);
63 friend inline hunits operator -(const hunits&, const hunits&);
64 friend inline hunits operator -(const hunits&);
65 friend inline int operator /(const hunits&, const hunits&);
66 friend inline hunits operator /(const hunits&, int);
67 friend inline hunits operator *(const hunits&, int);
68 friend inline hunits operator *(int, const hunits&);
69 friend inline int operator <(const hunits&, const hunits&);
70 friend inline int operator >(const hunits&, const hunits&);
71 friend inline int operator <=(const hunits&, const hunits&);
72 friend inline int operator >=(const hunits&, const hunits&);
73 friend inline int operator ==(const hunits&, const hunits&);
74 friend inline int operator !=(const hunits&, const hunits&);
75 };
76
77 extern hunits H0;
78
79 extern int get_vunits(vunits *, unsigned char si);
80 extern int get_hunits(hunits *, unsigned char si);
81 extern int get_vunits(vunits *, unsigned char si, vunits prev_value);
82 extern int get_hunits(hunits *, unsigned char si, hunits prev_value);
83
vunits()84 inline vunits:: vunits() : n(0)
85 {
86 }
87
to_units()88 inline units vunits::to_units()
89 {
90 return n*vresolution;
91 }
92
is_zero()93 inline int vunits::is_zero()
94 {
95 return n == 0;
96 }
97
98 inline vunits operator +(const vunits & x, const vunits & y)
99 {
100 vunits r;
101 r = x;
102 r.n += y.n;
103 return r;
104 }
105
106 inline vunits operator -(const vunits & x, const vunits & y)
107 {
108 vunits r;
109 r = x;
110 r.n -= y.n;
111 return r;
112 }
113
114 inline vunits operator -(const vunits & x)
115 {
116 vunits r;
117 r.n = -x.n;
118 return r;
119 }
120
121 inline int operator /(const vunits & x, const vunits & y)
122 {
123 return x.n/y.n;
124 }
125
126 inline vunits operator /(const vunits & x, int n)
127 {
128 vunits r;
129 r = x;
130 r.n /= n;
131 return r;
132 }
133
134 inline vunits operator *(const vunits & x, int n)
135 {
136 vunits r;
137 r = x;
138 r.n *= n;
139 return r;
140 }
141
142 inline vunits operator *(int n, const vunits & x)
143 {
144 vunits r;
145 r = x;
146 r.n *= n;
147 return r;
148 }
149
150 inline int operator <(const vunits & x, const vunits & y)
151 {
152 return x.n < y.n;
153 }
154
155 inline int operator >(const vunits & x, const vunits & y)
156 {
157 return x.n > y.n;
158 }
159
160 inline int operator <=(const vunits & x, const vunits & y)
161 {
162 return x.n <= y.n;
163 }
164
165 inline int operator >=(const vunits & x, const vunits & y)
166 {
167 return x.n >= y.n;
168 }
169
170 inline int operator ==(const vunits & x, const vunits & y)
171 {
172 return x.n == y.n;
173 }
174
175 inline int operator !=(const vunits & x, const vunits & y)
176 {
177 return x.n != y.n;
178 }
179
180
181 inline vunits& vunits::operator+=(const vunits & x)
182 {
183 n += x.n;
184 return *this;
185 }
186
187 inline vunits& vunits::operator-=(const vunits & x)
188 {
189 n -= x.n;
190 return *this;
191 }
192
hunits()193 inline hunits:: hunits() : n(0)
194 {
195 }
196
to_units()197 inline units hunits::to_units()
198 {
199 return n*hresolution;
200 }
201
is_zero()202 inline int hunits::is_zero()
203 {
204 return n == 0;
205 }
206
207 inline hunits operator +(const hunits & x, const hunits & y)
208 {
209 hunits r;
210 r = x;
211 r.n += y.n;
212 return r;
213 }
214
215 inline hunits operator -(const hunits & x, const hunits & y)
216 {
217 hunits r;
218 r = x;
219 r.n -= y.n;
220 return r;
221 }
222
223 inline hunits operator -(const hunits & x)
224 {
225 hunits r;
226 r = x;
227 r.n = -x.n;
228 return r;
229 }
230
231 inline int operator /(const hunits & x, const hunits & y)
232 {
233 return x.n/y.n;
234 }
235
236 inline hunits operator /(const hunits & x, int n)
237 {
238 hunits r;
239 r = x;
240 r.n /= n;
241 return r;
242 }
243
244 inline hunits operator *(const hunits & x, int n)
245 {
246 hunits r;
247 r = x;
248 r.n *= n;
249 return r;
250 }
251
252 inline hunits operator *(int n, const hunits & x)
253 {
254 hunits r;
255 r = x;
256 r.n *= n;
257 return r;
258 }
259
260 inline int operator <(const hunits & x, const hunits & y)
261 {
262 return x.n < y.n;
263 }
264
265 inline int operator >(const hunits & x, const hunits & y)
266 {
267 return x.n > y.n;
268 }
269
270 inline int operator <=(const hunits & x, const hunits & y)
271 {
272 return x.n <= y.n;
273 }
274
275 inline int operator >=(const hunits & x, const hunits & y)
276 {
277 return x.n >= y.n;
278 }
279
280 inline int operator ==(const hunits & x, const hunits & y)
281 {
282 return x.n == y.n;
283 }
284
285 inline int operator !=(const hunits & x, const hunits & y)
286 {
287 return x.n != y.n;
288 }
289
290
291 inline hunits& hunits::operator+=(const hunits & x)
292 {
293 n += x.n;
294 return *this;
295 }
296
297 inline hunits& hunits::operator-=(const hunits & x)
298 {
299 n -= x.n;
300 return *this;
301 }
302
scale(hunits n,units x,units y)303 inline hunits scale(hunits n, units x, units y)
304 {
305 hunits r;
306 r.n = scale(n.n, x, y);
307 return r;
308 }
309
scale(vunits n,units x,units y)310 inline vunits scale(vunits n, units x, units y)
311 {
312 vunits r;
313 r.n = scale(n.n, x, y);
314 return r;
315 }
316
scale(vunits n,vunits x,vunits y)317 inline vunits scale(vunits n, vunits x, vunits y)
318 {
319 vunits r;
320 r.n = scale(n.n, x.n, y.n);
321 return r;
322 }
323
scale(hunits n,double x)324 inline hunits scale(hunits n, double x)
325 {
326 hunits r;
327 r.n = int(n.n*x);
328 return r;
329 }
330
scale(units n,double x)331 inline units scale(units n, double x)
332 {
333 return int(n*x);
334 }
335
points_to_units(units n)336 inline units points_to_units(units n)
337 {
338 return scale(n, units_per_inch, 72);
339 }
340
341