summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipsk/scalewidth.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/dvipsk/scalewidth.c
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipsk/scalewidth.c')
-rw-r--r--Build/source/texk/dvipsk/scalewidth.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/Build/source/texk/dvipsk/scalewidth.c b/Build/source/texk/dvipsk/scalewidth.c
new file mode 100644
index 00000000000..dab197a9290
--- /dev/null
+++ b/Build/source/texk/dvipsk/scalewidth.c
@@ -0,0 +1,36 @@
+/*
+ * 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! */
+/*
+ * The external declarations:
+ */
+#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);
+}