home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / PRINTING / DVIPS54.ZIP / DVIPS / MAKEFONT.C < prev    next >
C/C++ Source or Header  |  1990-11-25  |  4KB  |  158 lines

  1. /*
  2.  *   This software is Copyright 1988 by Radical Eye Software.
  3.  *   All Rights Reserved.
  4.  */
  5. #include "structures.h"
  6. extern int quiet ;
  7. extern int filter ;
  8. extern int system() ;
  9. extern char *mfmode ;
  10. /*
  11.  *   Calculate magstep values.
  12.  */
  13. static int
  14. magstep(n, bdpi)
  15. register int n, bdpi ;
  16. {
  17.    register float t ;
  18.    int neg = 0 ;
  19.  
  20.    if (n < 0) {
  21.       neg = 1 ;
  22.       n = -n ;
  23.    }
  24.    if (n & 1) {
  25.       n &= ~1 ;
  26.       t = 1.095445115 ;
  27.    } else
  28.       t = 1.0 ;
  29.    while (n > 8) {
  30.       n -= 8 ;
  31.       t = t * 2.0736 ;
  32.    }
  33.    while (n > 0) {
  34.       n -= 2 ;
  35.       t = t * 1.2 ;
  36.    }
  37.    if (neg)
  38.       return((int)(0.5 + bdpi / t)) ;
  39.    else
  40.       return((int)(0.5 + bdpi * t)) ;
  41. }
  42. char *command = "MakeTeXPK %n %d %b %m" ;
  43. /*
  44.  *   This routine tries to create a font by executing a command, and
  45.  *   then opening the font again if possible.
  46.  */
  47. static char buf[125] ;
  48. void
  49. makefont(name, dpi, bdpi)
  50.    char *name ;
  51.    int dpi, bdpi ;
  52. {
  53.    register char *p, *q ;
  54.    register int m, n ;
  55. #ifdef MSDOS
  56.    double t;
  57. #endif
  58.  
  59.    for (p=command, q=buf; *p; p++)
  60.       if (*p != '%')
  61.          *q++ = *p ;
  62.       else {
  63.          switch (*++p) {
  64. case 'n' : case 'N' :
  65.             (void)strcpy(q, name) ;
  66.             break ;
  67. case 'd' : case 'D' :
  68.             (void)sprintf(q, "%d", dpi) ;
  69.             break ;
  70. case 'b' : case 'B' :
  71.             (void)sprintf(q, "%d", bdpi) ;
  72.             break ;
  73. case 'm' : case 'M' :
  74. /*
  75.  *   Here we want to return a string.  If we can find some integer
  76.  *   m such that floor(0.5 + bdpi * 1.2 ^ (m/2)) = dpi, we write out
  77.  *      magstep(m/2)
  78.  *   where m/2 is a decimal number; else we write out
  79.  *      dpi/bdpi
  80.  *   We do this for the very slight improvement in accuracy that
  81.  *   magstep() gives us over the rounded dpi/bdpi.
  82.  */
  83.             m = 0 ;
  84.             if (dpi < bdpi) {
  85.                while (1) {
  86.                   m-- ;
  87.                   n = magstep(m, bdpi) ;
  88.                   if (n == dpi)
  89.                      break ;
  90.                   if (n < dpi || m < -40) {
  91.                      m = 9999 ;
  92.                      break ;
  93.                   }
  94.                }
  95.             } else if (dpi > bdpi) {
  96.                while (1) {
  97.                   m++ ;
  98.                   n = magstep(m, bdpi) ;
  99.                   if (n == dpi)
  100.                      break ;
  101.                   if (n > dpi || m > 40) {
  102.                      m = 9999 ;
  103.                      break ;
  104.                   }
  105.                }
  106.             }
  107. #ifdef MSDOS
  108. /* write out magnification as decimal number */
  109.             if (m == 9999) {
  110.                (void)sprintf(q, "%d", dpi/bdpi) ;
  111.             } else {
  112.         if (m < 0) 
  113.             n = -m;
  114.         else
  115.             n = m;
  116.         if (n & 1) {
  117.             n &= ~1 ;
  118.             t = 1.095445115 ;
  119.            } else
  120.             t = 1.0 ;
  121.         while (n > 0) {
  122.             n -= 2 ;
  123.             t = t * 1.2 ;
  124.         }
  125.         if (m < 0)
  126.             t = 1 / t ;
  127.         (void)sprintf(q, "%12.9f", t) ;
  128.             }
  129. #else
  130.             if (m == 9999) {
  131.                (void)sprintf(q, "%d+%d/%d", dpi/bdpi, dpi%bdpi, bdpi) ;
  132.             } else if (m >= 0) {
  133.                (void)sprintf(q, "magstep\\(%d.%d\\)", m/2, (m&1)*5) ;
  134.             } else {
  135.                (void)sprintf(q, "magstep\\(-%d.%d\\)", (-m)/2, (m&1)*5) ;
  136.             }
  137. #endif
  138.             break ;
  139. case 0 :    *q = 0 ;
  140.             break ;
  141. default:    *q++ = *p ;
  142.             *q = 0 ;
  143.             break ;
  144.          }
  145.          q += strlen(q) ;
  146.       }
  147.    *q = 0 ;
  148.    if (mfmode) {
  149.       strcpy(q, " ") ;
  150.       strcat(q, mfmode) ;
  151.    }
  152.    if (filter)
  153.       (void)strcat(buf, quiet ? " >/dev/null" : " 1>&2") ;
  154.    if (! quiet)
  155.       (void)fprintf(stderr, "- %s\n", buf) ;
  156.    (void)system(buf) ;
  157. }
  158.