home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / dvips / tfmload.c < prev    next >
C/C++ Source or Header  |  1994-01-08  |  4KB  |  161 lines

  1. /*
  2.  *   Loads a tfm file.  It marks the characters as undefined.
  3.  */
  4. #include "dvips.h" /* The copyright notice in that file is included too! */
  5. /*
  6.  *   These are the external routines it calls:
  7.  */
  8. #ifdef AMIGA
  9. #include "tfmload_protos.h"
  10. #include "dvips_protos.h"
  11. #include "search_protos.h"
  12. #include "scalewidth_protos.h"
  13. #include "search_protos.h"
  14. #else 
  15. extern void error() ;
  16. extern integer scalewidth() ;
  17. extern FILE *search() ;
  18. #endif
  19. /*
  20.  *   Here are the external variables we use:
  21.  */
  22. extern real conv ;
  23. extern real vconv ;
  24. extern real alpha ;
  25. extern char *tfmpath ;
  26. extern char errbuf[] ;
  27. extern integer fsizetol ;
  28. /*
  29.  *   Our static variables:
  30.  */
  31. FILE *tfmfile ; 
  32. static char name[50] ;
  33.  
  34. /*
  35.  *   Tries to open a tfm file.  Uses cmr10.tfm if unsuccessful,
  36.  *   and complains loudly about it.
  37.  */
  38. void
  39. tfmopen(fd)
  40.         register fontdesctype *fd ;
  41. {
  42.    register char *d, *n ;
  43.  
  44.    d = fd->area ;
  45.    n = fd->name ;
  46.    if (*d==0)
  47.       d = tfmpath ;
  48. #ifdef MVSXA   /* IBM: MVS/XA */
  49.    (void)sprintf(name, "tfm(%s)", n) ;
  50. #else
  51.    (void)sprintf(name, "%s.tfm", n) ;
  52. #endif
  53.    if ((tfmfile=search(d, name, READBIN))==NULL) {
  54.       (void)sprintf(errbuf, "Can't open font metric file %s%s",
  55.              fd->area, name) ;
  56.       error(errbuf) ;
  57.       error("I will use cmr10.tfm instead, so expect bad output.") ;
  58. #ifdef MVSXA   /* IBM: MVS/XA */
  59.       if ((tfmfile=search(d, "tfm(cmr10)", READBIN))==NULL)
  60. #else
  61.       if ((tfmfile=search(d, "cmr10.tfm", READBIN))==NULL)
  62. #endif
  63.          error(
  64.           "! I can't find cmr10.tfm; please reinstall me with proper paths") ;
  65.    }
  66. }
  67.  
  68. shalfword
  69. tfmbyte ()
  70. {
  71. #ifdef AMIGA
  72.   return(shalfword) (getc(tfmfile)) ;
  73. #else
  74.   return(getc(tfmfile)) ;
  75. #endif
  76. }
  77.  
  78. halfword
  79. tfm16 ()
  80. {
  81.   register halfword a ; 
  82.   a = tfmbyte () ; 
  83. #ifdef AMIGA
  84.   return (halfword)( a * 256 + tfmbyte () ) ; 
  85. #else
  86.   return ( a * 256 + tfmbyte () ) ; 
  87. #endif
  88.  
  89. integer
  90. tfm32 ()
  91. {
  92.   register integer a ; 
  93.   a = tfm16 () ; 
  94.   if (a > 32767) a -= 65536 ;
  95.   return ( a * 65536 + tfm16 () ) ; 
  96.  
  97. int
  98. tfmload(curfnt)
  99.         register fontdesctype *curfnt ;
  100. {
  101.    register shalfword i ;
  102.    register integer li ;
  103.    integer scaledsize ;
  104.    shalfword nw, hd ;
  105.    shalfword bc, ec ;
  106.    integer scaled[256] ;
  107.    halfword chardat[256] ;
  108.    int charcount = 0 ;
  109.  
  110.    tfmopen(curfnt) ;
  111. /*
  112.  *   Next, we read the font data from the tfm file, and store it in
  113.  *   our own arrays.
  114.  */
  115.    li = tfm16() ; hd = tfm16() ;
  116.    bc = tfm16() ; ec = tfm16() ;
  117.    nw = tfm16() ;
  118.    li = tfm32() ; li = tfm32() ; li = tfm32() ; li = tfm16() ;
  119.    li = tfm32() ;
  120.    if (li && curfnt->checksum)
  121.       if (li!=curfnt->checksum) {
  122.          (void)sprintf(errbuf,"Checksum mismatch in %s", name) ;
  123.          error(errbuf) ;
  124.        }
  125.    li = (integer)(alpha * (real)tfm32()) ;
  126.    if (li > curfnt->designsize + fsizetol ||
  127.        li < curfnt->designsize - fsizetol) {
  128.       (void)sprintf(errbuf,"Design size mismatch in %s", name) ;
  129.       error(errbuf) ;
  130.    }
  131.    for (i=2; i<hd; i++)
  132.       li = tfm32() ;
  133.    for (i=0; i<256; i++)
  134.       chardat[i] = 256 ;
  135.    for (i=bc; i<=ec; i++) {
  136.       chardat[i] = tfmbyte() ;
  137.       li = tfm16() ;
  138.       li |= tfmbyte() ;
  139.       if (li || chardat[i])
  140.          charcount++ ;
  141.    }
  142.    scaledsize = curfnt->scaledsize ;
  143.    for (i=0; i<nw; i++)
  144.       scaled[i] = scalewidth(tfm32(), scaledsize) ;
  145.    (void)fclose(tfmfile) ;
  146.    for (i=0; i<256; i++)
  147.       if (chardat[i]!= 256) {
  148.          li = scaled[chardat[i]] ;
  149.          curfnt->chardesc[i].TFMwidth = li ;
  150.          if (li >= 0)
  151.             curfnt->chardesc[i].pixelwidth = ((integer)(conv*li+0.5)) ;
  152.          else
  153.             curfnt->chardesc[i].pixelwidth = -((integer)(conv*-li+0.5)) ;
  154.          curfnt->chardesc[i].flags = (curfnt->resfont ? EXISTS : 0) ;
  155.       }
  156.    curfnt->loaded = 1 ;
  157.    return charcount ;
  158. }
  159.