* All affected files: Update postal address of FSF.
[s-roff.git] / src / roff / troff / hvunits.h
blob99e6692eb28b77cc077268cad3f231cfef7ab039
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
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.
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.
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. */
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&);
48 extern vunits V0;
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&);
77 extern hunits H0;
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);
84 inline vunits:: vunits() : n(0)
88 inline units vunits::to_units()
90 return n*vresolution;
93 inline int vunits::is_zero()
95 return n == 0;
98 inline vunits operator +(const vunits & x, const vunits & y)
100 vunits r;
101 r = x;
102 r.n += y.n;
103 return r;
106 inline vunits operator -(const vunits & x, const vunits & y)
108 vunits r;
109 r = x;
110 r.n -= y.n;
111 return r;
114 inline vunits operator -(const vunits & x)
116 vunits r;
117 r.n = -x.n;
118 return r;
121 inline int operator /(const vunits & x, const vunits & y)
123 return x.n/y.n;
126 inline vunits operator /(const vunits & x, int n)
128 vunits r;
129 r = x;
130 r.n /= n;
131 return r;
134 inline vunits operator *(const vunits & x, int n)
136 vunits r;
137 r = x;
138 r.n *= n;
139 return r;
142 inline vunits operator *(int n, const vunits & x)
144 vunits r;
145 r = x;
146 r.n *= n;
147 return r;
150 inline int operator <(const vunits & x, const vunits & y)
152 return x.n < y.n;
155 inline int operator >(const vunits & x, const vunits & y)
157 return x.n > y.n;
160 inline int operator <=(const vunits & x, const vunits & y)
162 return x.n <= y.n;
165 inline int operator >=(const vunits & x, const vunits & y)
167 return x.n >= y.n;
170 inline int operator ==(const vunits & x, const vunits & y)
172 return x.n == y.n;
175 inline int operator !=(const vunits & x, const vunits & y)
177 return x.n != y.n;
181 inline vunits& vunits::operator+=(const vunits & x)
183 n += x.n;
184 return *this;
187 inline vunits& vunits::operator-=(const vunits & x)
189 n -= x.n;
190 return *this;
193 inline hunits:: hunits() : n(0)
197 inline units hunits::to_units()
199 return n*hresolution;
202 inline int hunits::is_zero()
204 return n == 0;
207 inline hunits operator +(const hunits & x, const hunits & y)
209 hunits r;
210 r = x;
211 r.n += y.n;
212 return r;
215 inline hunits operator -(const hunits & x, const hunits & y)
217 hunits r;
218 r = x;
219 r.n -= y.n;
220 return r;
223 inline hunits operator -(const hunits & x)
225 hunits r;
226 r = x;
227 r.n = -x.n;
228 return r;
231 inline int operator /(const hunits & x, const hunits & y)
233 return x.n/y.n;
236 inline hunits operator /(const hunits & x, int n)
238 hunits r;
239 r = x;
240 r.n /= n;
241 return r;
244 inline hunits operator *(const hunits & x, int n)
246 hunits r;
247 r = x;
248 r.n *= n;
249 return r;
252 inline hunits operator *(int n, const hunits & x)
254 hunits r;
255 r = x;
256 r.n *= n;
257 return r;
260 inline int operator <(const hunits & x, const hunits & y)
262 return x.n < y.n;
265 inline int operator >(const hunits & x, const hunits & y)
267 return x.n > y.n;
270 inline int operator <=(const hunits & x, const hunits & y)
272 return x.n <= y.n;
275 inline int operator >=(const hunits & x, const hunits & y)
277 return x.n >= y.n;
280 inline int operator ==(const hunits & x, const hunits & y)
282 return x.n == y.n;
285 inline int operator !=(const hunits & x, const hunits & y)
287 return x.n != y.n;
291 inline hunits& hunits::operator+=(const hunits & x)
293 n += x.n;
294 return *this;
297 inline hunits& hunits::operator-=(const hunits & x)
299 n -= x.n;
300 return *this;
303 inline hunits scale(hunits n, units x, units y)
305 hunits r;
306 r.n = scale(n.n, x, y);
307 return r;
310 inline vunits scale(vunits n, units x, units y)
312 vunits r;
313 r.n = scale(n.n, x, y);
314 return r;
317 inline vunits scale(vunits n, vunits x, vunits y)
319 vunits r;
320 r.n = scale(n.n, x.n, y.n);
321 return r;
324 inline hunits scale(hunits n, double x)
326 hunits r;
327 r.n = int(n.n*x);
328 return r;
331 inline units scale(units n, double x)
333 return int(n*x);
336 inline units points_to_units(units n)
338 return scale(n, units_per_inch, 72);