File: scalewidth.c

package info (click to toggle)
dvipsk-ja 5.98%2Bp1.7b-1.1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 6,828 kB
  • ctags: 2,174
  • sloc: ansic: 20,418; sh: 10,423; makefile: 300; perl: 283; csh: 47
file content (33 lines) | stat: -rw-r--r-- 1,179 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 *   Code to scale dimensions.  Takes two thirty-two bit integers, multiplies
 *   them, divides them by 2^20, and returns the thirty-two bit result.
 *   The first integer, the width in FIXes, can lie between -2^24 and 2^24-1.
 *   The second integer, the scale factor, can lie between 0 and 2^27-1.
 *
 *   Here, unlike in TeX, we do the arithmetic exactly.  Since the error
 *   in the TeX arithmetic is parts per million, and since dvips makes no
 *   layout decisions, this has no effect.  (TeX stipulates that any
 *   implementation of *TeX* needs to do the arithmetic exactly as
 *   specified in TeX, but drivers need not.)
 *
 *   Since this math is special, we put it in its own file.  It is the only
 *   place in the program where such accuracy is required.
 */
#include "dvips.h" /* The copyright notice in that file is included too! */
#include "protos.h"

integer
scalewidth(register integer a, register integer b)
{
  register integer al, bl ;

  if (a < 0)
     return -scalewidth(-a, b) ;
  if (b < 0)
     return -scalewidth(a, -b) ;
  al = a & 32767 ;
  bl = b & 32767 ;
  a >>= 15 ;
  b >>= 15 ;
  return ( ((al*bl/32768) + a*bl+al*b)/32 + a*b*1024) ;
}