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