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