diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/dvipsk/makefont.c | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (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.c | 309 |
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) ; + } + } +} |