home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / util / loadfont.c < prev    next >
C/C++ Source or Header  |  1994-07-10  |  9KB  |  337 lines

  1. /*
  2. **    This file generated by localize 2.9 (AmigaDOS 2.1) from util/loadfont.c
  3. */
  4. #include "defines.h"
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9. #include "globals.h"
  10. #include "textypes.h"
  11. #include "pkcom.h"
  12.  
  13. #include "flmt.h"
  14. #include "new_font.h"
  15. #include "dvihand.h"
  16.  
  17. #include "globals.i"
  18. #include "loadfont.i"
  19. #include "new_font.i"
  20.  
  21.  
  22. /*
  23.  * Fuer die locale-Library:
  24.  *
  25.  * Hier duerfen *nur* die MSG_#? Nummern eingebunden werden!
  26.  * Achtung:
  27.  * Es muss/sollte 'multiple-include' erlaubt sein!
  28.  */
  29. #include "local.i"
  30.  
  31. #undef  CATCOMP_ARRAY
  32. #undef  CATCOMP_BLOCK
  33. #undef  CATCOMP_STRINGS
  34. #define CATCOMP_NUMBERS
  35. #include "localstr.h"
  36.  
  37.  
  38.  
  39.  
  40. static FILE        *pkfile;
  41. static struct Font *fnt;
  42.  
  43. static void      badpk    (int sn);
  44. static shalfword __inline pkbyte(void);
  45. static integer   __inline pkquad(void);
  46. static integer   pktrio    (void);
  47.  
  48.  
  49.  
  50. /*---------------------------------------------------------------------------*/
  51. #if 0
  52. /*
  53.  *   A chardesc describes an individual character.  Before the fonts are
  54.  *   downloaded, the flags indicate that the character has already been used
  55.  *   with the following meanings:
  56.  */
  57. typedef struct {
  58.    integer TFMwidth ;
  59.    shalfword pixelwidth ;
  60.    quarterword *packptr ;
  61.    quarterword flags ;
  62. } chardesctype ;
  63. #define EXISTS (1)
  64. #define PREVPAGE (2)
  65. #define THISPAGE (4)
  66. #define TOOBIG (8) /* not used at the moment */
  67. #define REPACKED (16)
  68. #define BIGCHAR (32)
  69. #define STATUSFLAGS (EXISTS|REPACKED|BIGCHAR)
  70. /*
  71.  *   A fontdesc describes a font.  The name, area, and scalename are located in
  72.  *   the string pool. The nextsize pointer is used to link fonts that are used
  73.  *   in included psfiles and differ only in scaledsize.  Such fonts also have
  74.  *   a non-NULL scalename that gives the scaledsize as found in the included
  75.  *   file.  The psflag indicates that the font has been used in an included
  76.  *   psfile.  It can be 0, PREVPAGE, THISPAGE, or EXISTS.
  77.  */
  78. typedef struct tfd {
  79.    integer checksum, scaledsize, designsize, thinspace ;
  80.    halfword dpi, loadeddpi ;
  81.    halfword alreadyscaled ;
  82.    halfword psname ;
  83.    halfword loaded ;
  84.    halfword maxchars ;
  85.    char *name, *area ;
  86.    struct resfont *resfont ;
  87.    struct tft *localfonts ;
  88.    struct tfd *next ;
  89.    struct tfd *nextsize;
  90.    char *scalename;
  91.    quarterword psflag;
  92.    chardesctype chardesc[256] ;
  93. } fontdesctype ;
  94.  
  95. /*  A fontmap associates a fontdesc with a font number.
  96.  */
  97. typedef struct tft {
  98.    integer fontnum ;
  99.    fontdesctype *desc ;
  100.    struct tft *next ;
  101. } fontmaptype ;
  102. #endif
  103. /*---------------------------------------------------------------------------*/
  104.  
  105.  
  106.  
  107.  
  108.  
  109. /*
  110.  *   Now we have some routines to get stuff from the PK file.
  111.  *   Subroutine pkbyte returns the next byte.
  112.  */
  113.  
  114. static void badpk(int sn)
  115. {
  116.    char name[PATH_SIZE+PK_NAME_SIZE];
  117.    char strbuf[50];
  118.    
  119.    strbuf[sizeof(strbuf)-1] = '\0';
  120.    strncpy(strbuf, GetTeXString(sn), sizeof(strbuf)-1);
  121.  
  122.    get_full_name(name, fnt);
  123.    (void)sprintf(m_string,GetTeXString(MSG_BAD_PK_FILE),name,strbuf) ;
  124.  
  125.    if (*strbuf == '!') {
  126.      FatalStr(10,m_string);
  127.    }
  128.    else {
  129.      WarningStr(m_string);
  130.    }
  131. }
  132.  
  133. static shalfword __inline pkbyte()
  134. {
  135.    register shalfword i ;
  136.  
  137.    if ((i=getc(pkfile))==EOF) badpk(MSG_UNEXPECTED_EOF_IN_PK);
  138.    return(i);
  139. }
  140.  
  141. #if 0
  142. static integer __inline pkquad()
  143. {
  144.    register integer i ;
  145.  
  146.    i = pkbyte() ;
  147.    if (i > 127)
  148.       i -= 256 ;
  149.    i = i * 256 + pkbyte() ;
  150.    i = i * 256 + pkbyte() ;
  151.    i = i * 256 + pkbyte() ;
  152.    return(i) ;
  153. }
  154. #endif
  155.  
  156. static integer __inline pkquad()
  157. {
  158.   integer i;
  159.   
  160.   if (fread(&i, sizeof(i), 1, pkfile) != 1) badpk(MSG_UNEXPECTED_EOF_IN_PK);
  161.   return i;
  162. }
  163.  
  164. static integer pktrio()
  165. {
  166.    register integer i ;
  167.  
  168.    i = pkbyte() ;
  169.    i = i * 256 + pkbyte() ;
  170.    i = i * 256 + pkbyte() ;
  171.    return(i) ;
  172. }
  173.  
  174.  
  175.  
  176. /*
  177.  *   Now our loadfont routine.  We return an integer indicating the
  178.  *   highest character code in the font, so we know how much space
  179.  *   to reserve for the character.  (It's returned in the font
  180.  *   structure, along with everything else.)
  181.  */
  182. void loadfont(struct Font *curfnt, FILE *PKfile)
  183. {
  184.    shalfword i ;
  185.    shalfword cmd ;
  186.    integer k ;
  187.    integer length = 0 ;
  188.    shalfword cc = 0 ;
  189.    quarterword *tempr ;
  190.    long offset;        /* offset in the internal mem */
  191.    struct Chars *cd_base, *cd;
  192.    int maxcc = 0 ;
  193.  
  194.  
  195.    pkfile = PKfile;
  196.    fnt = curfnt;
  197.  
  198. /*
  199.  *   We clear out some pointers:
  200.  */
  201.  
  202.    cd = cd_base = curfnt->common->ch;
  203.  
  204. #if 0  /* dies wird nun schon in LoadFont() gemacht! */
  205.    for (i=0; i<NPXLCHARS; i++) {
  206.      cd->pixelwidth  = 0;
  207.      cd->packed_data = -1;    /* NIL pointer in internal memory */
  208.      cd->unpacked    = NULL;
  209.      cd++;
  210.    }
  211. #endif
  212.    
  213.    curfnt->common->maxchars = NPXLCHARS; /* just in case we return before the end */
  214.  
  215.    if (pkbyte() != PK_PRE) badpk(MSG_EXPECTED_PRE_IN_PK);
  216.    if (pkbyte() != 89)     badpk(MSG_WRONG_ID_IN_PK);
  217.  
  218.    for(i=pkbyte(); i>0; i--) (void)pkbyte();    /* skip comment */
  219.  
  220. #if 0
  221.    k = (integer)(alpha * (real)pkquad()) ;    /* design size */
  222.    if (k > curfnt->designsize + fsizetol ||
  223.        k < curfnt->designsize - fsizetol) {
  224.       (void)sprintf(errbuf,"Design size mismatch in font %s", name) ;
  225.       error(errbuf) ;
  226.    }
  227. #else
  228.    (void)pkquad();                /* design size */
  229. #endif
  230.  
  231.    k = pkquad() ;                /* checksum */
  232.    if (k && curfnt->chksum)
  233.       if (k!=curfnt->chksum) {
  234.          badpk(MSG_CHECKSUM_MISS_IN_PK);
  235.        }
  236.  
  237.    /* hppp: horizontal pixel per point, vppp: ... */
  238.    (void) pkquad() ; /* assume that hppp is correct in the PK file */
  239.    (void) pkquad() ; /* assume that vppp is correct in the PK file */
  240.  
  241. /*
  242.  *   Now we get down to the serious business of reading character definitions.
  243.  */
  244.    while ((cmd=pkbyte())!= PK_POST) {
  245.      if (cmd < 240) {
  246.        switch (cmd & 7) {                    /* flag */
  247.      case 0:
  248.      case 1:
  249.      case 2:
  250.      case 3:                /***************** short form **/
  251.             length = (cmd & 7) * 256 + pkbyte() - 3 ;        /* pl */
  252.             cc = pkbyte() ;                    /* cc */
  253.             cd = cd_base+cc ;
  254. #if 0
  255.             if (nosmallchars || curfnt->dpi != curfnt->loadeddpi)
  256.                cd->flags |= BIGCHAR ;
  257. #endif
  258.             /* cd->TFMwidth = scalewidth(pktrio(), scaledsize) ; */    /* tfm */
  259.             curfnt->common->fnt_group->tfmw[cc] = pktrio();    /* tfm */
  260.             cd->pixelwidth = pkbyte() ;                /* dm */
  261.             break ;
  262.      case 4:
  263.      case 5:
  264.      case 6:                /***************** extendet short form **/
  265.             length = (cmd & 3) * 65536 + pkbyte() * 256 ;
  266.             length = length + pkbyte() - 4 ;            /* pl */
  267.             cc = pkbyte() ;                    /* cc */
  268.             cd = cd_base+cc ;
  269.             /* cd->TFMwidth = scalewidth(pktrio(), scaledsize) ; */    /* tfm */
  270.             curfnt->common->fnt_group->tfmw[cc] = pktrio();    /* tfm */
  271. #if 0
  272.             cd->flags |= BIGCHAR ;
  273. #endif
  274.             i = pkbyte() ;
  275.             cd->pixelwidth = i * 256 + pkbyte() ;        /* dm */
  276.             break ;
  277.      case 7:                /***************** long form **/
  278.             length = pkquad() - 11 ;
  279.             cc = pkquad() ;                    /* cc */
  280.             if (cc<0 || cc>255) badpk(MSG_CHAR_CODE_OUT_OF_RANGE_IN_PK) ;
  281.             cd = cd_base + cc ;
  282. #if 0
  283.             cd->flags |= BIGCHAR ;
  284. #endif
  285.             /* cd->TFMwidth = scalewidth(pkquad(), scaledsize) ; */    /* tfm */
  286.             curfnt->common->fnt_group->tfmw[cc] = pkquad();    /* tfm */
  287.             cd->pixelwidth = (pkquad() + 32768) >> 16 ;        /* dx */
  288.             /* k = */ (void)pkquad() ;                /* dy */
  289.        }    /* end switch */
  290.  
  291.        if (cc > maxcc) maxcc = cc ;
  292.        if (length <= 0) badpk(MSG_PACKET_LENGTH_SMALL_IN_PK) ;
  293.  
  294.        /* save the pk part of one char into mem (with cmd/width/height/xoff/yoff) */
  295.  
  296.        offset = alloc_char(length*sizeof(char));
  297.        if (offset == -1) Fatal (8, MSG_NO_MEM_FOR_CHAR,156);
  298.        cd->packed_data = offset;
  299.  
  300.        tempr = (char *)(curfnt->common->ch_start_bm + offset);
  301.        *tempr++ = cmd;
  302.        /** for (length--; length>0; length--) *tempr++ = pkbyte() ; **/
  303.        /**/
  304.        if (fread(tempr,1,length-1,pkfile) != length-1) {
  305.      badpk(MSG_UNEXPECTED_EOF_IN_PK);
  306.        }
  307.        /**/
  308.      }
  309.      else {
  310.          k = 0;
  311.          switch (cmd) {
  312.        case PK_XXX4:
  313.              k = pkbyte() ;
  314.              if (k > 127) k -= 256;
  315.        case PK_XXX3:
  316.              k = k * 256 + pkbyte() ;
  317.        case PK_XXX2:
  318.              k = k * 256 + pkbyte() ;
  319.        case PK_XXX1:
  320.              k = k * 256 + pkbyte() ;
  321.              while (k-- > 0) /* i = */ (void)pkbyte() ;
  322.              /* koennte man ein fread einsetzen */
  323.              break ;
  324.        case PK_YYY:
  325.              /* k = */ (void)pkquad();
  326.              break;
  327.        case PK_NO_OP:
  328.              break;
  329.        default:
  330.              badpk(MSG_UNEXPECTED_COMM_IN_PK) ;
  331.          }
  332.       }
  333.    }
  334.  
  335.    curfnt->common->maxchars = maxcc + 1 ;
  336. }
  337.