summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipsk/makefont.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/dvipsk/makefont.c
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipsk/makefont.c')
-rw-r--r--Build/source/texk/dvipsk/makefont.c309
1 files changed, 309 insertions, 0 deletions
diff --git a/Build/source/texk/dvipsk/makefont.c b/Build/source/texk/dvipsk/makefont.c
new file mode 100644
index 00000000000..39c9fdd9735
--- /dev/null
+++ b/Build/source/texk/dvipsk/makefont.c
@@ -0,0 +1,309 @@
+/*
+ * This software is Copyright 1988 by Radical Eye Software.
+ */
+#include "dvips.h"
+#include <math.h>
+#include "protos.h"
+extern int quiet ;
+extern int filter ;
+extern int dontmakefont ;
+extern Boolean secure ;
+extern char *mfmode ;
+#ifdef OS2
+#include <stdlib.h>
+#endif
+#if !defined(WIN32)
+extern char *getenv();
+extern int system();
+#endif
+#if defined MSDOS || defined OS2
+extern char *mfjobname ;
+extern FILE *mfjobfile ;
+extern char *pkpath ;
+extern int actualdpi ;
+extern int vactualdpi ;
+/*
+ * Write mfjob file
+ */
+void
+mfjobout P2C(char *, font, double, mag)
+{
+ if (mfjobfile == (FILE *)NULL) {
+ char pkout[128];
+ char *p;
+ int i;
+ for (p=pkpath, i=0; *p && *p!=PATHSEP && i<127; p++) {
+ if (*p=='%') {
+ p++;
+ switch(*p) { /* convert %x codes to mfjob @y codes */
+ case 'b':
+ sprintf(pkout+i,"%d",actualdpi);
+ break;
+ case 'd':
+ strcpy(pkout+i,"@Rr");
+ break;
+ case 'f':
+ strcpy(pkout+i,"@f");
+ break;
+ case 'p':
+ strcpy(pkout+i,"pk");
+ break;
+ case 'm':
+ strcpy(pkout+i, mfmode ? mfmode : "default");
+ break;
+ case '%':
+ strcpy(pkout+i,"%");
+ break;
+ default:
+ sprintf(pkout+i, "%%%c", *p) ;
+ fprintf(stderr,"Unknown option %%%c in pk path\n",*p);
+ }
+ i += strlen(pkout+i);
+ }
+ else
+ pkout[i++] = *p;
+ }
+ /* *p='\0'; Could some DOS person explain to me what this does? */
+ pkout[i] = 0 ;
+ mfjobfile = fopen(mfjobname,"w");
+ if (mfjobfile == (FILE *)NULL)
+ return;
+ fprintf(mfjobfile,"input[dvidrv];\n{\ndriver=dvips;\n");
+ if (actualdpi == vactualdpi)
+ fprintf(mfjobfile,"mode=%s[%d];\n",mfmode,actualdpi);
+ else
+ fprintf(mfjobfile,"mode=%s[%d %d];\n",mfmode,actualdpi,vactualdpi);
+ fprintf(mfjobfile,"output=pk[%s];\n",pkout);
+ }
+ fprintf(mfjobfile,"{font=%s; mag=%f;}\n",font,mag);
+ (void)fprintf(stderr,
+ "Appending {font=%s; mag=%f;} to %s\n",font,mag,mfjobname) ;
+}
+#endif
+/*
+ * Calculate magstep values.
+ */
+static int
+magstep P2C(register int, n, register int, bdpi)
+{
+ register float t ;
+ int neg = 0 ;
+
+ if (n < 0) {
+ neg = 1 ;
+ n = -n ;
+ }
+ if (n & 1) {
+ n &= ~1 ;
+ t = 1.095445115 ;
+ } else
+ t = 1.0 ;
+ while (n > 8) {
+ n -= 8 ;
+ t = t * 2.0736 ;
+ }
+ while (n > 0) {
+ n -= 2 ;
+ t = t * 1.2 ;
+ }
+ if (neg)
+ return((int)floor(0.5 + bdpi / t)) ;
+ else
+ return((int)floor(0.5 + bdpi * t)) ;
+}
+#ifdef MAKEPKCMD
+static char *defcommand = MAKEPKCMD " %n %d %b %m" ;
+#else
+#ifdef OS2
+static char *doscommand = "command /c MakeTeXP %n %d %b %m" ;
+static char *os2command = "MakeTeXP %n %d %b %m" ;
+#define defcommand ( _osmode==OS2_MODE ? os2command : doscommand )
+#else
+#ifdef MSDOS
+static char *defcommand = "command /c MakeTeXP %n %d %b %m" ;
+#else
+#ifdef VMCMS
+static char *defcommand = "EXEC MakeTeXPK %n %d %b %m" ;
+#else
+#ifdef ATARIST
+static char *defcommand = "maketexp %n %d %b %m" ;
+#else
+static char *defcommand = "MakeTeXPK %n %d %b %m" ;
+#endif
+#endif
+#endif
+#endif
+#endif
+char *command = 0 ;
+/*
+ * This routine tries to create a font by executing a command, and
+ * then opening the font again if possible.
+ */
+static char buf[125] ;
+void
+makefont P3C(char *, name, int, dpi, int, bdpi)
+{
+ register char *p, *q ;
+ register int m, n ;
+ int modegiven = 0 ;
+#if defined MSDOS || defined OS2 || defined(ATARIST)
+ double t;
+#endif
+
+ if (command == 0)
+ if (secure == 0 && (command=getenv("MAKETEXPK")))
+ command = newstring(command) ;
+ else
+ command = defcommand ;
+ for (p=command, q=buf; *p; p++)
+ if (*p != '%')
+ *q++ = *p ;
+ else {
+ switch (*++p) {
+case 'n' : case 'N' :
+ (void)strcpy(q, name) ;
+ break ;
+case 'd' : case 'D' :
+ (void)sprintf(q, "%d", dpi) ;
+ break ;
+case 'b' : case 'B' :
+ (void)sprintf(q, "%d", bdpi) ;
+ break ;
+case 'o' : case 'O' :
+ (void)sprintf(q, "%s", mfmode ? mfmode : "default") ;
+ modegiven = 1 ;
+ break ;
+case 'm' : case 'M' :
+/*
+ * Here we want to return a string. If we can find some integer
+ * m such that floor(0.5 + bdpi * 1.2 ^ (m/2)) = dpi, we write out
+ * magstep(m/2)
+ * where m/2 is a decimal number; else we write out
+ * dpi/bdpi
+ * We do this for the very slight improvement in accuracy that
+ * magstep() gives us over the rounded dpi/bdpi.
+ */
+ m = 0 ;
+ if (dpi < bdpi) {
+ while (1) {
+ m-- ;
+ n = magstep(m, bdpi) ;
+ if (n == dpi)
+ break ;
+ if (n < dpi || m < -40) {
+ m = 9999 ;
+ break ;
+ }
+ }
+ } else if (dpi > bdpi) {
+ while (1) {
+ m++ ;
+ n = magstep(m, bdpi) ;
+ if (n == dpi)
+ break ;
+ if (n > dpi || m > 40) {
+ m = 9999 ;
+ break ;
+ }
+ }
+ }
+#if defined MSDOS || defined OS2
+/* write out magnification as decimal number */
+ if (m == 9999) {
+ t = (double)dpi/bdpi;
+ } else {
+ if (m < 0)
+ n = -m;
+ else
+ n = m;
+ if (n & 1) {
+ n &= ~1 ;
+ t = 1.095445115 ;
+ } else
+ t = 1.0 ;
+ while (n > 0) {
+ n -= 2 ;
+ t = t * 1.2 ;
+ }
+ if (m < 0)
+ t = 1 / t ;
+ }
+ (void)sprintf(q, "%12.9f", t) ;
+#else
+#ifndef ATARIST
+ if (m == 9999) {
+#else
+ {
+#endif
+ (void)sprintf(q, "%d+%d/%d", dpi/bdpi, dpi%bdpi, bdpi) ;
+ } else if (m >= 0) {
+ (void)sprintf(q, "magstep\\(%d.%d\\)", m/2, (m&1)*5) ;
+ } else {
+ (void)sprintf(q, "magstep\\(-%d.%d\\)", (-m)/2, (m&1)*5) ;
+ }
+#endif
+ break ;
+case 0 : *q = 0 ;
+ break ;
+default: *q++ = *p ;
+ *q = 0 ;
+ break ;
+ }
+ q += strlen(q) ;
+ }
+ *q = 0 ;
+ if (mfmode && !modegiven) {
+ strcpy(q, " ") ;
+ strcat(q, mfmode) ;
+ }
+#ifdef OS2
+ if ((_osmode == OS2_MODE) && filter)
+ (void)strcat(buf, quiet ? " >nul" : " 1>&2") ;
+#else
+#ifndef VMCMS /* no filters and no need to print to stderr */
+#ifndef MVSXA
+#ifndef MSDOS
+#ifndef ATARIST
+ if (filter)
+ (void)strcat(buf, quiet ? " >/dev/null" : " 1>&2") ;
+#endif
+#endif
+#endif
+#endif
+#endif
+
+#if defined MSDOS || defined OS2
+ if (! quiet && mfjobname == (char *)NULL)
+ (void)fprintf(stderr, "- %s\n", buf) ;
+ if (dontmakefont == 0) {
+ if (mfjobname != (char *)NULL)
+ mfjobout(name,t);
+ else
+ (void)system(buf) ;
+ }
+#else
+ if (! quiet)
+ (void)fprintf(stderr, "- %s\n", buf) ;
+ if (dontmakefont == 0)
+ (void)system(buf) ;
+#endif
+ else {
+ static FILE *fontlog = 0 ;
+
+ if (fontlog == 0) {
+ fontlog = fopen("missfont.log", "a") ;
+ if (fontlog != 0) {
+ (void)fprintf(stderr,
+#ifndef VMCMS
+ "Appending font creation commands to missfont.log\n") ;
+#else
+ "\nMissing font data will be passed to DVIPS EXEC via MISSFONT LOG\n");
+#endif
+ }
+ }
+ if (fontlog != 0) {
+ (void)fprintf(fontlog, "%s\n", buf) ;
+ (void)fflush(fontlog) ;
+ }
+ }
+}