2 * Copyright (c) 2014 - 2015 Steffen (Daode) Nurpmeso <sdaoden@users.sf.net>.
4 * Copyright (C) 1989 - 1992 Free Software Foundation, Inc.
5 * Written by James Clark (jjc@jclark.com)
7 * This 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
12 * This 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
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.
25 #include "troff-config.h"
29 friend inline vunits
scale(vunits n
, units x
, units y
); // scale n by x/y
30 friend inline vunits
scale(vunits n
, vunits x
, vunits y
);
31 friend inline vunits
operator +(const vunits
&, const vunits
&);
32 friend inline vunits
operator -(const vunits
&, const vunits
&);
33 friend inline vunits
operator -(const vunits
&);
34 friend inline int operator /(const vunits
&, const vunits
&);
35 friend inline vunits
operator /(const vunits
&, int);
36 friend inline vunits
operator *(const vunits
&, int);
37 friend inline vunits
operator *(int, const vunits
&);
38 friend inline int operator <(const vunits
&, const vunits
&);
39 friend inline int operator >(const vunits
&, 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
&);
52 vunits
& operator+=(const vunits
&);
53 vunits
& operator-=(const vunits
&);
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
&);
83 hunits
& operator+=(const hunits
&);
84 hunits
& operator-=(const hunits
&);
89 extern int get_vunits(vunits
*, unsigned char si
);
90 extern int get_hunits(hunits
*, unsigned char si
);
91 extern int get_vunits(vunits
*, unsigned char si
, vunits prev_value
);
92 extern int get_hunits(hunits
*, unsigned char si
, hunits prev_value
);
94 inline vunits:: vunits() : n(0)
98 inline units
vunits::to_units()
100 return n
*vresolution
;
103 inline int vunits::is_zero()
108 inline vunits
operator +(const vunits
& x
, const vunits
& y
)
116 inline vunits
operator -(const vunits
& x
, const vunits
& y
)
124 inline vunits
operator -(const vunits
& x
)
131 inline int operator /(const vunits
& x
, const vunits
& y
)
136 inline vunits
operator /(const vunits
& x
, int n
)
144 inline vunits
operator *(const vunits
& x
, int n
)
152 inline vunits
operator *(int n
, const vunits
& x
)
160 inline int operator <(const vunits
& x
, const vunits
& y
)
165 inline int operator >(const vunits
& x
, const vunits
& y
)
170 inline int operator <=(const vunits
& x
, const vunits
& y
)
175 inline int operator >=(const vunits
& x
, const vunits
& y
)
180 inline int operator ==(const vunits
& x
, const vunits
& y
)
185 inline int operator !=(const vunits
& x
, const vunits
& y
)
191 inline vunits
& vunits::operator+=(const vunits
& x
)
197 inline vunits
& vunits::operator-=(const vunits
& x
)
203 inline hunits:: hunits() : n(0)
207 inline units
hunits::to_units()
209 return n
*hresolution
;
212 inline int hunits::is_zero()
217 inline hunits
operator +(const hunits
& x
, const hunits
& y
)
225 inline hunits
operator -(const hunits
& x
, const hunits
& y
)
233 inline hunits
operator -(const hunits
& x
)
241 inline int operator /(const hunits
& x
, const hunits
& y
)
246 inline hunits
operator /(const hunits
& x
, int n
)
254 inline hunits
operator *(const hunits
& x
, int n
)
262 inline hunits
operator *(int n
, const hunits
& x
)
270 inline int operator <(const hunits
& x
, const hunits
& y
)
275 inline int operator >(const hunits
& x
, const hunits
& y
)
280 inline int operator <=(const hunits
& x
, const hunits
& y
)
285 inline int operator >=(const hunits
& x
, const hunits
& y
)
290 inline int operator ==(const hunits
& x
, const hunits
& y
)
295 inline int operator !=(const hunits
& x
, const hunits
& y
)
300 inline hunits
& hunits::operator+=(const hunits
& x
)
306 inline hunits
& hunits::operator-=(const hunits
& x
)
312 inline hunits
scale(hunits n
, units x
, units y
)
315 r
.n
= scale(n
.n
, x
, y
);
319 inline vunits
scale(vunits n
, units x
, units y
)
322 r
.n
= scale(n
.n
, x
, y
);
326 inline vunits
scale(vunits n
, vunits x
, vunits y
)
329 r
.n
= scale(n
.n
, x
.n
, y
.n
);
333 inline hunits
scale(hunits n
, double x
)
340 inline units
scale(units n
, double x
)
345 inline units
points_to_units(units n
)
347 return scale(n
, units_per_inch
, 72);