home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / printer / dvi2pcl.lha / loadtfmfile.c < prev    next >
C/C++ Source or Header  |  1992-11-25  |  3KB  |  94 lines

  1. /* $Log:    loadtfmfile.c,v $
  2.  * Revision 0.8  92/11/23  19:46:48  19:46:48  bt (Bo Thide')
  3.  * Fixed resolution bug. Portable downloading. Added/changed options. PJXL color support
  4.  * 
  5.  * Revision 0.7  92/11/13  02:41:33  02:41:33  bt (Bo Thide')
  6.  * More bug fixes and improvements. Support for PaintJet XL
  7.  * 
  8.  * Revision 0.6  92/11/10  21:47:49  21:47:49  bt (Bo Thide')
  9.  * Bug fixes. Added -R option. Better font handling.
  10.  * 
  11.  * Revision 0.5  92/11/09  16:25:37  16:25:37  bt (Bo Thide')
  12.  * Rewrite of dospecial.c. Extended \special support
  13.  * 
  14.  * Revision 0.4  92/11/08  02:45:52  02:45:52  bt (Bo Thide')
  15.  * Changed to portable bit manipulations. Replaced strrstr for non-POSIX compliant C. Fixed numerous bugs. Added support for more \special's.
  16.  * 
  17.  * Revision 0.3  92/08/24  12:43:20  12:43:20  bt (Bo Thide')
  18.  * Fixed 8 bit (dc font) support.
  19.  * 
  20.  * Revision 0.2  92/08/23  17:28:58  17:28:58  bt (Bo Thide')
  21.  * Source cleaned up.  Changed certain function calls.  Removed globals.
  22.  * 
  23.  * Revision 0.1  92/08/22  23:58:48  23:58:48  bt (Bo Thide')
  24.  * First Release.
  25.  *  */
  26.  
  27. #include <stdio.h>
  28. #include "globals.h"
  29. #include "macros.h"
  30.  
  31. static char rcsid[] = "$Header: loadtfmfile.c,v 0.8 92/11/23 19:46:48 bt Exp $";
  32.  
  33.  
  34. /*
  35.  * This procedure will extract information from the tfm file which is
  36.  * necessary to know abut printer resident fonts.
  37.  */
  38. loadtfmfile()
  39. {
  40.     byte    *w_index;
  41.     char    tfmbuf[2048];
  42.     char    tfmname[NAMELENGTH];
  43.     int    i;
  44.     int    *width;
  45.     long    *t;
  46.     long    *tfmbase;
  47.     double    x, z;
  48.     double    pxlconv;
  49.     charfmt    *c;
  50.     tfmfmt  *tfm;
  51.     FILE    *tfmfile;
  52.     extern FILE *opentfmfile();
  53.  
  54.     tfm = (tfmfmt *) tfmbuf;
  55.     tfmbase = (long *) tfmbuf;
  56.     t = tfmbase;
  57.     tfmfile = opentfmfile(tfmname);
  58.     if(verbose)
  59.         fprintf(stderr,"loadtfmfile: Trying to load %s\n",tfmname);
  60.     while(!feof(tfmfile))
  61.         *t++ = (long)getw(tfmfile);
  62.     fclose(tfmfile);
  63.     if(font->checksum != tfm->cs)
  64.         fprintf(stderr,"loadtfmfile: Checksum mismatch between\n%s and the .dvi file\n", tfmname);
  65.     z = (double)font->scaled_size/(double)FIX;
  66.     pxlconv = (double)(font->design_size * font->dir_size)/(65536.0*SCALE);
  67.     width = (int *)(tfmbase + tfm->lh + tfm->ec - tfm->bc + 7);
  68.     w_index = tfmbuf + 4 * (tfm->lh + 6);
  69.     c = font->chr;
  70. #ifdef DEBUG2
  71.     fprintf(stderr,"loadtfmfile: pxlconv=%g,tfm->bc=%d,tfm->ec=%d,tfm->lh = %d\n",pxlconv,tfm->bc,tfm->ec,tfm->lh);
  72. #endif
  73.     for(i = 0 ; i < tfm->bc ; i++) { 
  74.         c->tfm_width = 0;
  75.         c->pxl_width = 0;
  76.         c++;
  77.     }
  78.     for(i = tfm->bc; i <= tfm->ec; i++) { 
  79.         x = *(width + *w_index);
  80.         c->tfm_width = x*z;
  81.         c->pxl_width = round(x*pxlconv);
  82.         c++;
  83.         w_index += 4;
  84. #ifdef DEBUG2
  85.         fprintf(stderr,"loadtfmfile: pxlconv=%d,tfm->bc=%d,tfm->ec=%d,c->pxl_width = %d\n",pxlconv,tfm->bc,tfm->ec,c->pxl_width);
  86. #endif
  87.     }
  88.     for(i = tfm->ec + 1 ; i <= 255; i++) { 
  89.         c->tfm_width = 0;
  90.         c->pxl_width = 0;
  91.         c++;
  92.     }
  93. }
  94.