home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / d / dvips551.zip / DVIPS.ZIP / MAKEFONT.C < prev    next >
C/C++ Source or Header  |  1993-02-13  |  7KB  |  287 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. #ifdef MSDOS
  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';
  65.       mfjobfile =  fopen(mfjobname,"w");
  66.       if (mfjobfile == (FILE *)NULL)
  67.          return;
  68.       fprintf(mfjobfile,"input[dvidrv];\n{\ndriver=dvips;\n");
  69.       if (actualdpi == vactualdpi)
  70.          fprintf(mfjobfile,"mode=%s[%d];\n",mfmode,actualdpi);
  71.       else
  72.          fprintf(mfjobfile,"mode=%s[%d %d];\n",mfmode,actualdpi,vactualdpi);
  73.       fprintf(mfjobfile,"output=pk[%s];\n",pkout);
  74.    }
  75.    fprintf(mfjobfile,"{font=%s; mag=%f;}\n",font,mag);
  76.    (void)fprintf(stderr,
  77.         "Appending {font=%s; mag=%f;} to %s\n",font,mag,mfjobname) ;
  78. }
  79. #endif
  80. /*
  81.  *   Calculate magstep values.
  82.  */
  83. static int
  84. magstep(n, bdpi)
  85. register int n, bdpi ;
  86. {
  87.    register float t ;
  88.    int neg = 0 ;
  89.  
  90.    if (n < 0) {
  91.       neg = 1 ;
  92.       n = -n ;
  93.    }
  94.    if (n & 1) {
  95.       n &= ~1 ;
  96.       t = 1.095445115 ;
  97.    } else
  98.       t = 1.0 ;
  99.    while (n > 8) {
  100.       n -= 8 ;
  101.       t = t * 2.0736 ;
  102.    }
  103.    while (n > 0) {
  104.       n -= 2 ;
  105.       t = t * 1.2 ;
  106.    }
  107.    if (neg)
  108.       return((int)(0.5 + bdpi / t)) ;
  109.    else
  110.       return((int)(0.5 + bdpi * t)) ;
  111. }
  112. #ifdef MAKEPKCMD
  113. static char *defcommand = MAKEPKCMD " %n %d %b %m" ;
  114. #else
  115. #ifdef MSDOS
  116. #ifdef __EMX__
  117. static char *doscommand = "command /c MakeTeXP %n %d %b %m" ;
  118. static char *os2command = "cmd /c MakeTeXP %n %d %b %m" ;
  119. #define defcommand ( _osmode==OS2_MODE ? os2command : doscommand )
  120. #else
  121. static char *defcommand = "command /c MakeTeXP %n %d %b %m" ;
  122. #endif
  123. #else
  124. #ifdef VMCMS
  125. static char *defcommand = "EXEC MakeTeXPK %n %d %b %m" ;
  126. #else
  127. static char *defcommand = "MakeTeXPK %n %d %b %m" ;
  128. #endif
  129. #endif
  130. #endif
  131. char *command = 0 ;
  132. /*
  133.  *   This routine tries to create a font by executing a command, and
  134.  *   then opening the font again if possible.
  135.  */
  136. static char buf[125] ;
  137. void
  138. makefont(name, dpi, bdpi)
  139.    char *name ;
  140.    int dpi, bdpi ;
  141. {
  142.    register char *p, *q ;
  143.    register int m, n ;
  144. #ifdef MSDOS
  145.    double t;
  146. #endif
  147.  
  148.    if (command == 0)
  149.       if (secure == 0 && (command=getenv("MAKETEXPK")))
  150.          command = newstring(command) ;
  151.       else 
  152.          command = defcommand ;
  153.    for (p=command, q=buf; *p; p++)
  154.       if (*p != '%')
  155.          *q++ = *p ;
  156.       else {
  157.          switch (*++p) {
  158. case 'n' : case 'N' :
  159.             (void)strcpy(q, name) ;
  160.             break ;
  161. case 'd' : case 'D' :
  162.             (void)sprintf(q, "%d", dpi) ;
  163.             break ;
  164. case 'b' : case 'B' :
  165.             (void)sprintf(q, "%d", bdpi) ;
  166.             break ;
  167. case 'm' : case 'M' :
  168. /*
  169.  *   Here we want to return a string.  If we can find some integer
  170.  *   m such that floor(0.5 + bdpi * 1.2 ^ (m/2)) = dpi, we write out
  171.  *      magstep(m/2)
  172.  *   where m/2 is a decimal number; else we write out
  173.  *      dpi/bdpi
  174.  *   We do this for the very slight improvement in accuracy that
  175.  *   magstep() gives us over the rounded dpi/bdpi.
  176.  */
  177.             m = 0 ;
  178.             if (dpi < bdpi) {
  179.                while (1) {
  180.                   m-- ;
  181.                   n = magstep(m, bdpi) ;
  182.                   if (n == dpi)
  183.                      break ;
  184.                   if (n < dpi || m < -40) {
  185.                      m = 9999 ;
  186.                      break ;
  187.                   }
  188.                }
  189.             } else if (dpi > bdpi) {
  190.                while (1) {
  191.                   m++ ;
  192.                   n = magstep(m, bdpi) ;
  193.                   if (n == dpi)
  194.                      break ;
  195.                   if (n > dpi || m > 40) {
  196.                      m = 9999 ;
  197.                      break ;
  198.                   }
  199.                }
  200.             }
  201. #ifdef MSDOS
  202. /* write out magnification as decimal number */
  203.             if (m == 9999) {
  204.                t = (double)dpi/bdpi;
  205.             } else {
  206.                if (m < 0)
  207.                     n = -m;
  208.                else
  209.                     n = m;
  210.                if (n & 1) {
  211.                     n &= ~1 ;
  212.                     t = 1.095445115 ;
  213.                } else
  214.                     t = 1.0 ;
  215.                while (n > 0) {
  216.                     n -= 2 ;
  217.                     t = t * 1.2 ;
  218.                }
  219.                if (m < 0)
  220.                     t = 1 / t ;
  221.             }
  222.             (void)sprintf(q, "%12.9f", t) ;
  223. #else
  224.             if (m == 9999) {
  225.                (void)sprintf(q, "%d+%d/%d", dpi/bdpi, dpi%bdpi, bdpi) ;
  226.             } else if (m >= 0) {
  227.                (void)sprintf(q, "magstep\\(%d.%d\\)", m/2, (m&1)*5) ;
  228.             } else {
  229.                (void)sprintf(q, "magstep\\(-%d.%d\\)", (-m)/2, (m&1)*5) ;
  230.             }
  231. #endif
  232.             break ;
  233. case 0 :    *q = 0 ;
  234.             break ;
  235. default:    *q++ = *p ;
  236.             *q = 0 ;
  237.             break ;
  238.          }
  239.          q += strlen(q) ;
  240.       }
  241.    *q = 0 ;
  242.    if (mfmode) {
  243.       strcpy(q, " ") ;
  244.       strcat(q, mfmode) ;
  245.    }
  246. #ifndef VMCMS   /* no filters and no need to print to stderr */
  247. #ifndef MSDOS
  248. #ifndef MVSXA
  249.    if (filter)
  250.       (void)strcat(buf, quiet ? " >/dev/null" : " 1>&2") ;
  251. #endif
  252. #endif
  253. #endif
  254. #ifdef MSDOS
  255.    if (! quiet && mfjobname == (char *)NULL)
  256.       (void)fprintf(stderr, "- %s\n", buf) ;
  257.    if (dontmakefont == 0) {
  258.       if (mfjobname != (char *)NULL)
  259.          mfjobout(name,t);
  260.       else
  261.          (void)system(buf) ;
  262.    }
  263. #else
  264.    if (! quiet)
  265.       (void)fprintf(stderr, "- %s\n", buf) ;
  266.    if (dontmakefont == 0)
  267.       (void)system(buf) ;
  268. #endif
  269.    else {
  270.       static FILE *fontlog = 0 ;
  271.  
  272.       if (fontlog == 0) {
  273.          fontlog = fopen("missfont.log", "a") ;
  274.          if (fontlog != 0) {
  275.             (void)fprintf(stderr,
  276. #ifndef VMCMS
  277.                   "Appending font creation commands to missfont.log\n") ;
  278. #else
  279.   "\nMissing font data will be passed to DVIPS EXEC via MISSFONT LOG\n");
  280. #endif
  281.          }
  282.       }
  283.       if (fontlog != 0)
  284.          (void)fprintf(fontlog, "%s\n", buf) ;
  285.    }
  286. }
  287.