1// -*- C++ -*-
2/* Copyright (C) 1989, 1990, 1991, 1992 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, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
20
21
22class vunits {
23  int n;
24public:
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
48extern vunits V0;
49
50
51class hunits {
52  int n;
53public:
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
77extern hunits H0;
78
79extern int get_vunits(vunits *, unsigned char si);
80extern int get_hunits(hunits *, unsigned char si);
81extern int get_vunits(vunits *, unsigned char si, vunits prev_value);
82extern int get_hunits(hunits *, unsigned char si, hunits prev_value);
83
84inline vunits:: vunits() : n(0)
85{
86}
87
88inline units vunits::to_units()
89{
90  return n*vresolution;
91}
92
93inline int vunits::is_zero()
94{
95  return n == 0;
96}
97
98inline 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
106inline 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
114inline vunits operator -(const vunits & x)
115{
116  vunits r;
117  r.n = -x.n;
118  return r;
119}
120
121inline int operator /(const vunits & x, const vunits & y)
122{
123  return x.n/y.n;
124}
125
126inline vunits operator /(const vunits & x, int n)
127{
128  vunits r;
129  r = x;
130  r.n /= n;
131  return r;
132}
133
134inline vunits operator *(const vunits & x, int n)
135{
136  vunits r;
137  r = x;
138  r.n *= n;
139  return r;
140}
141
142inline vunits operator *(int n, const vunits & x)
143{
144  vunits r;
145  r = x;
146  r.n *= n;
147  return r;
148}
149
150inline int operator <(const vunits & x, const vunits & y)
151{
152  return x.n < y.n;
153}
154
155inline int operator >(const vunits & x, const vunits & y)
156{
157  return x.n > y.n;
158}
159
160inline int operator <=(const vunits & x, const vunits & y)
161{
162  return x.n <= y.n;
163}
164
165inline int operator >=(const vunits & x, const vunits & y)
166{
167  return x.n >= y.n;
168}
169
170inline int operator ==(const vunits & x, const vunits & y)
171{
172  return x.n == y.n;
173}
174
175inline int operator !=(const vunits & x, const vunits & y)
176{
177  return x.n != y.n;
178}
179
180
181inline vunits& vunits::operator+=(const vunits & x)
182{
183  n += x.n;
184  return *this;
185}
186
187inline vunits& vunits::operator-=(const vunits & x)
188{
189  n -= x.n;
190  return *this;
191}
192
193inline hunits:: hunits() : n(0)
194{
195}
196
197inline units hunits::to_units()
198{
199  return n*hresolution;
200}
201
202inline int hunits::is_zero()
203{
204  return n == 0;
205}
206
207inline 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
215inline 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
223inline hunits operator -(const hunits & x)
224{
225  hunits r;
226  r = x;
227  r.n = -x.n;
228  return r;
229}
230
231inline int operator /(const hunits & x, const hunits & y)
232{
233  return x.n/y.n;
234}
235
236inline hunits operator /(const hunits & x, int n)
237{
238  hunits r;
239  r = x;
240  r.n /= n;
241  return r;
242}
243
244inline hunits operator *(const hunits & x, int n)
245{
246  hunits r;
247  r = x;
248  r.n *= n;
249  return r;
250}
251
252inline hunits operator *(int n, const hunits & x)
253{
254  hunits r;
255  r = x;
256  r.n *= n;
257  return r;
258}
259
260inline int operator <(const hunits & x, const hunits & y)
261{
262  return x.n < y.n;
263}
264
265inline int operator >(const hunits & x, const hunits & y)
266{
267  return x.n > y.n;
268}
269
270inline int operator <=(const hunits & x, const hunits & y)
271{
272  return x.n <= y.n;
273}
274
275inline int operator >=(const hunits & x, const hunits & y)
276{
277  return x.n >= y.n;
278}
279
280inline int operator ==(const hunits & x, const hunits & y)
281{
282  return x.n == y.n;
283}
284
285inline int operator !=(const hunits & x, const hunits & y)
286{
287  return x.n != y.n;
288}
289
290
291inline hunits& hunits::operator+=(const hunits & x)
292{
293  n += x.n;
294  return *this;
295}
296
297inline hunits& hunits::operator-=(const hunits & x)
298{
299  n -= x.n;
300  return *this;
301}
302
303inline 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
310inline 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
317inline 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
324inline hunits scale(hunits n, double x)
325{
326  hunits r;
327  r.n = int(n.n*x);
328  return r;
329}
330
331inline units scale(units n, double x)
332{
333  return int(n*x);
334}
335
336inline units points_to_units(units n)
337{
338  return scale(n, units_per_inch, 72);
339}
340
341