Update to groff 1.19.2.
[dragonfly.git] / contrib / groff-1.19 / src / roff / troff / hvunits.h
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
84 inline vunits:: vunits() : n(0)
85 {
86 }
87
88 inline units vunits::to_units()
89 {
90   return n*vresolution;
91 }
92
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
193 inline hunits:: hunits() : n(0)
194 {
195 }
196
197 inline units hunits::to_units()
198 {
199   return n*hresolution;
200 }
201
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
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
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
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
324 inline hunits scale(hunits n, double x)
325 {
326   hunits r;
327   r.n = int(n.n*x);
328   return r;
329 }
330
331 inline units scale(units n, double x)
332 {
333   return int(n*x);
334 }
335
336 inline units points_to_units(units n)
337 {
338   return scale(n, units_per_inch, 72);
339 }
340