home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 1 / FFMCD01.bin / useful / dist / other / pastex / dvips / dvips5519.lha / dvips / makefont.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-04  |  8.0 KB  |  332 lines

  1. /*
  2.  *   This software is Copyright 1988 by Radical Eye Software.
  3.  */
  4. #include "dvips.h"
  5. extern int quiet ;
  6. extern int filter ;
  7. extern int dontmakefont ;
  8. extern int system() ;
  9. extern Boolean secure ;
  10. extern char *getenv(), *newstring() ;
  11. extern char *mfmode ;
  12. #ifdef __EMX__
  13. #include <stdlib.h>
  14. #endif
  15. #if defined MSDOS || defined OS2
  16. extern char *mfjobname ;
  17. extern FILE *mfjobfile ;
  18. extern char *pkpath ;
  19. extern int actualdpi ;
  20. extern int vactualdpi ;
  21. /*
  22.  *  Write mfjob file
  23.  */
  24. void
  25. mfjobout(font,mag)
  26. char *font;
  27. double mag;
  28. {
  29.    if (mfjobfile == (FILE *)NULL) {
  30.       char pkout[128];
  31.       char *p;
  32.       int i;
  33.       for (p=pkpath, i=0; *p && *p!=PATHSEP && i<127; p++) {
  34.          if (*p=='%') {
  35.             p++;
  36.             switch(*p) { /* convert %x codes to mfjob @y codes */
  37.                case 'b':
  38.                   sprintf(pkout+i,"%d",actualdpi);
  39.                   break;
  40.                case 'd':
  41.                   strcpy(pkout+i,"@Rr");
  42.                   break;
  43.                case 'f':
  44.                   strcpy(pkout+i,"@f");
  45.                   break;
  46.                case 'p':
  47.                   strcpy(pkout+i,"pk");
  48.                   break;
  49.                case 'm':
  50.                   strcpy(pkout+i,mfmode);
  51.                   break;
  52.                case '%':
  53.                   strcpy(pkout+i,"%");
  54.                   break;
  55.                default:
  56.                   sprintf(pkout+i, "%%%c", *p) ;
  57.                   fprintf(stderr,"Unknown option %%%c in pk path\n",*p);
  58.             }
  59.             i += strlen(pkout+i);
  60.          }
  61.          else
  62.            pkout[i++] = *p;
  63.       }
  64.       *p='\0'; /* Could some DOS person explain to me what this does? */
  65.       pkout[i] = 0 ;
  66.       mfjobfile =  fopen(mfjobname,"w");
  67.       if (mfjobfile == (FILE *)NULL)
  68.          return;
  69.       fprintf(mfjobfile,"input[dvidrv];\n{\ndriver=dvips;\n");
  70.       if (actualdpi == vactualdpi)
  71.          fprintf(mfjobfile,"mode=%s[%d];\n",mfmode,actualdpi);
  72.       else
  73.          fprintf(mfjobfile,"mode=%s[%d %d];\n",mfmode,actualdpi,vactualdpi);
  74.       fprintf(mfjobfile,"output=pk[%s];\n",pkout);
  75.    }
  76.    fprintf(mfjobfile,"{font=%s; mag=%f;}\n",font,mag);
  77.    (void)fprintf(stderr,
  78.         "Appending {font=%s; mag=%f;} to %s\n",font,mag,mfjobname) ;
  79. }
  80. #endif
  81. /*
  82.  *   Calculate magstep values.
  83.  */
  84. static int
  85. magstep(n, bdpi)
  86. register int n, bdpi ;
  87. {
  88.    register float t ;
  89.    int neg = 0 ;
  90.  
  91.    if (n < 0) {
  92.       neg = 1 ;
  93.       n = -n ;
  94.    }
  95.    if (n & 1) {
  96.       n &= ~1 ;
  97.       t = 1.095445115 ;
  98.    } else
  99.       t = 1.0 ;
  100.    while (n > 8) {
  101.       n -= 8 ;
  102.       t = t * 2.0736 ;
  103.    }
  104.    while (n > 0) {
  105.       n -= 2 ;
  106.       t = t * 1.2 ;
  107.    }
  108.    if (neg)
  109.       return((int)(0.5 + bdpi / t)) ;
  110.    else
  111.       return((int)(0.5 + bdpi * t)) ;
  112. }
  113. #ifdef MAKEPKCMD
  114. static char *defcommand = MAKEPKCMD " %n %d %b %m" ;
  115. #else
  116. #ifdef OS2
  117. static char *defcommand = "MakeTeXP %n %d %b %m" ;
  118. #else
  119. #ifdef MSDOS
  120. #ifdef __EMX__
  121. static char *doscommand = "command /c MakeTeXP %n %d %b %m" ;
  122. static char *os2command = "cmd /c MakeTeXP %n %d %b %m" ;
  123. #define defcommand ( _osmode==OS2_MODE ? os2command : doscommand )
  124. #else
  125. static char *defcommand = "command /c MakeTeXP %n %d %b %m" ;
  126. #endif
  127. #else
  128. #ifdef VMCMS
  129. static char *defcommand = "EXEC MakeTeXPK %n %d %b %m" ;
  130. #else
  131. static char *defcommand = "MakeTeXPK %n %d %b %m" ;
  132. #endif
  133. #endif
  134. #endif
  135. #endif
  136. char *command = 0 ;
  137.  
  138. #if !defined(PASTEX)
  139.  
  140. /*
  141.  *   This routine tries to create a font by executing a command, and
  142.  *   then opening the font again if possible.
  143.  */
  144. static char buf[125] ;
  145. void
  146. makefont(name, dpi, bdpi)
  147.    char *name ;
  148.    int dpi, bdpi ;
  149. {
  150.    register char *p, *q ;
  151.    register int m, n ;
  152. #if defined MSDOS || defined OS2
  153.    double t;
  154. #endif
  155.  
  156.    if (command == 0)
  157.       if (secure == 0 && (command=getenv("MAKETEXPK")))
  158.          command = newstring(command) ;
  159.       else 
  160.          command = defcommand ;
  161.    for (p=command, q=buf; *p; p++)
  162.       if (*p != '%')
  163.          *q++ = *p ;
  164.       else {
  165.          switch (*++p) {
  166. case 'n' : case 'N' :
  167.             (void)strcpy(q, name) ;
  168.             break ;
  169. case 'd' : case 'D' :
  170.             (void)sprintf(q, "%d", dpi) ;
  171.             break ;
  172. case 'b' : case 'B' :
  173.             (void)sprintf(q, "%d", bdpi) ;
  174.             break ;
  175. case 'm' : case 'M' :
  176. /*
  177.  *   Here we want to return a string.  If we can find some integer
  178.  *   m such that floor(0.5 + bdpi * 1.2 ^ (m/2)) = dpi, we write out
  179.  *      magstep(m/2)
  180.  *   where m/2 is a decimal number; else we write out
  181.  *      dpi/bdpi
  182.  *   We do this for the very slight improvement in accuracy that
  183.  *   magstep() gives us over the rounded dpi/bdpi.
  184.  */
  185.             m = 0 ;
  186.             if (dpi < bdpi) {
  187.                while (1) {
  188.                   m-- ;
  189.                   n = magstep(m, bdpi) ;
  190.                   if (n == dpi)
  191.                      break ;
  192.                   if (n < dpi || m < -40) {
  193.                      m = 9999 ;
  194.                      break ;
  195.                   }
  196.                }
  197.             } else if (dpi > bdpi) {
  198.                while (1) {
  199.                   m++ ;
  200.                   n = magstep(m, bdpi) ;
  201.                   if (n == dpi)
  202.                      break ;
  203.                   if (n > dpi || m > 40) {
  204.                      m = 9999 ;
  205.                      break ;
  206.                   }
  207.                }
  208.             }
  209. #if defined MSDOS || defined OS2
  210. /* write out magnification as decimal number */
  211.             if (m == 9999) {
  212.                t = (double)dpi/bdpi;
  213.             } else {
  214.                if (m < 0)
  215.                     n = -m;
  216.                else
  217.                     n = m;
  218.                if (n & 1) {
  219.                     n &= ~1 ;
  220.                     t = 1.095445115 ;
  221.                } else
  222.                     t = 1.0 ;
  223.                while (n > 0) {
  224.                     n -= 2 ;
  225.                     t = t * 1.2 ;
  226.                }
  227.                if (m < 0)
  228.                     t = 1 / t ;
  229.             }
  230.             (void)sprintf(q, "%12.9f", t) ;
  231. #else
  232.             if (m == 9999) {
  233.                (void)sprintf(q, "%d+%d/%d", dpi/bdpi, dpi%bdpi, bdpi) ;
  234.             } else if (m >= 0) {
  235.                (void)sprintf(q, "magstep\\(%d.%d\\)", m/2, (m&1)*5) ;
  236.             } else {
  237.                (void)sprintf(q, "magstep\\(-%d.%d\\)", (-m)/2, (m&1)*5) ;
  238.             }
  239. #endif
  240.             break ;
  241. case 0 :    *q = 0 ;
  242.             break ;
  243. default:    *q++ = *p ;
  244.             *q = 0 ;
  245.             break ;
  246.          }
  247.          q += strlen(q) ;
  248.       }
  249.    *q = 0 ;
  250.    if (mfmode) {
  251.       strcpy(q, " ") ;
  252.       strcat(q, mfmode) ;
  253.    }
  254. #ifndef VMCMS   /* no filters and no need to print to stderr */
  255. #ifndef MSDOS
  256. #ifndef MVSXA
  257.    if (filter)
  258. #ifdef OS2
  259.       (void)strcat(buf, quiet ? " >nul" : " 1>&2") ;
  260. #else
  261.       (void)strcat(buf, quiet ? " >/dev/null" : " 1>&2") ;
  262. #endif
  263. #endif
  264. #endif
  265. #endif
  266. #if defined MSDOS || defined OS2
  267.    if (! quiet && mfjobname == (char *)NULL)
  268.       (void)fprintf(stderr, "- %s\n", buf) ;
  269.    if (dontmakefont == 0) {
  270.       if (mfjobname != (char *)NULL)
  271.          mfjobout(name,t);
  272.       else
  273.          (void)system(buf) ;
  274.    }
  275. #else
  276.    if (! quiet)
  277.       (void)fprintf(stderr, "- %s\n", buf) ;
  278.    if (dontmakefont == 0)
  279.       (void)system(buf) ;
  280. #endif
  281.    else {
  282.       static FILE *fontlog = 0 ;
  283.  
  284.       if (fontlog == 0) {
  285.          fontlog = fopen("missfont.log", "a") ;
  286.          if (fontlog != 0) {
  287.             (void)fprintf(stderr,
  288. #ifndef VMCMS
  289.                   "Appending font creation commands to missfont.log\n") ;
  290. #else
  291.   "\nMissing font data will be passed to DVIPS EXEC via MISSFONT LOG\n");
  292. #endif
  293.          }
  294.       }
  295.       if (fontlog != 0)
  296.          (void)fprintf(fontlog, "%s\n", buf) ;
  297.    }
  298. }
  299.  
  300.  
  301. #else /* PASTEX */
  302.  
  303.  
  304. /* call a ARexx script (name of the script is in the ENV: Variable "CALLMF"    */
  305. /*                            26.06.91 Georg Hessmann    */
  306.  
  307. extern int actualdpi;
  308. extern int vactualdpi;
  309.  
  310. void
  311. makefont(name, dpi, bdpi)
  312.    char *name ;
  313.    int dpi, bdpi ;
  314. {
  315.   char *tmp, com[200];
  316.   long result = 20;
  317.  
  318.   tmp = getenv("CALLMF");
  319.  
  320.   if (tmp != NULL) {
  321.     sprintf(com,"\'%s %s %ld %ld %ld dvips %ld/%s.%ldpk TeX:pk/\'", tmp, 
  322.             name, dpi, actualdpi, vactualdpi, dpi, name, dpi);
  323.     if (! quiet)
  324.       (void)fprintf(stderr, "- %s\n", com) ;
  325.  
  326.     (void)call_rexx(com, &result);
  327.     /* ignore the results */
  328.   }
  329. }
  330.  
  331. #endif /* PASTEX */
  332.