home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / xfig2.8 / part03 / font.c < prev    next >
C/C++ Source or Header  |  1990-07-02  |  4KB  |  161 lines

  1. /* 
  2.  *    FIG : Facility for Interactive Generation of figures
  3.  *
  4.  *    Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
  5.  *    January 1985.
  6.  *    1st revision : Aug 1985.
  7.  *
  8.  *    %W%    %G%
  9. */
  10.  
  11. #include "const.h"
  12. #include "fig.h"
  13. #include "resources.h"
  14. #include "font.h"
  15. #include "psfonts.h"
  16.  
  17. PIX_FONT        bold_font;
  18. PIX_FONT        roman_font;
  19. PIX_FONT        button_font;
  20.  
  21. extern    struct _fstruct fontnames[NUMFONTS];
  22. extern    appresStruct    appres;
  23.  
  24. XFontStruct *XLoadQueryFont();
  25. #define MAXNAMES 30
  26.  
  27. static struct {
  28.     char *fn;
  29.     int s;
  30.     } flist[MAXNAMES];
  31.  
  32. init_font()
  33.     {
  34.     struct    xfont *newfont, *nf;
  35.     int    f,count,i,p,ss;
  36.     char    **fontlist,**fname;
  37.  
  38.     if( appres.boldFont == NULL || *appres.boldFont == NULL)
  39.         appres.boldFont = BOLD_FONT;
  40.     if( appres.normalFont == NULL || *appres.normalFont == NULL)
  41.         appres.normalFont = NORMAL_FONT;
  42.     
  43.     roman_font = XLoadQueryFont(tool_d, appres.normalFont);
  44.     if ((bold_font = XLoadQueryFont(tool_d, appres.boldFont)) ==0)
  45.         {
  46.         fprintf(stderr,"Can't load font: %s, using %s\n",
  47.             appres.boldFont,appres.normalFont);
  48.         bold_font = XLoadQueryFont(tool_d, appres.normalFont);
  49.         }
  50.     button_font = XLoadQueryFont(tool_d, NORMAL_FONT);
  51.  
  52.     for (i=0; i<0x10; i++)
  53.         {
  54.         gc_font[i] = -1;
  55.         gc_fontsize[i] = 0;
  56.         }
  57.  
  58.     /* Now initialize the font structure for the X fonts corresponding
  59.        to the Postscript fonts for the canvas */
  60.  
  61.     for (f=0; f < NUMFONTS; f++)
  62.         {
  63.         nf = NULL;
  64.         if (fontlist = XListFonts(tool_d, fontnames[f].template, MAXNAMES, &count))
  65.         {
  66.         fname = fontlist;    /* go through the list finding point sizes */
  67.         p=0;
  68.         while (count--)
  69.             {
  70.             ss = parsesize(*fname);    /* get the point size from the name */
  71.             flist[p].fn = *fname++;    /* save name of this size font */
  72.             flist[p++].s = ss;        /* and save size */
  73.             }
  74.         for (ss=4; ss<=40; ss++)
  75.             {
  76.             for (i=0; i<p; i++)
  77.             if (flist[i].s == ss)
  78.                 break;
  79.             if (i<p && flist[i].s == ss)
  80.             {
  81.             newfont = (struct xfont *) malloc(sizeof(struct xfont));
  82.             if (nf==NULL)
  83.                 fontnames[f].xfontlist = newfont;
  84.             else
  85.                 nf-> next = newfont;
  86.             nf = newfont;        /* keep current ptr */
  87.             nf->size = ss;        /* store the size here */
  88.             nf->fid = NULL;        /* haven't loaded the font yet */
  89.             nf->fstruct = NULL;    /* ditto */
  90.             nf->fname = flist[i].fn;    /* keep actual name */
  91.             nf->next = NULL;
  92.             }
  93.             }
  94.         }
  95.         } /* next font, f */
  96.     }
  97.  
  98. /* parse the point size of font 'name' */
  99. /* e.g. -adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1 */
  100.  
  101. int
  102. parsesize(name)
  103. char *name;
  104.     {
  105.     int s;
  106.     char *np;
  107.  
  108.     for (np = name; *(np+1); np++)
  109.         if (*np=='-' && *(np+1)=='-')    /* look for the -- */
  110.             break;
  111.     s=0;
  112.     if (*(np+1))
  113.         {
  114.         np += 2;    /* point past the -- */
  115.         s = atoi(np);    /* get the point size */
  116.         }
  117.     else 
  118.         fprintf(stderr,"Can't parse '%s'\n",name);
  119.     return s;
  120.     }
  121.  
  122. /* Lookup an X font corresponding to a Postscript font style that is close in size */
  123.  
  124. PIX_FONT
  125. lookfont(f,s)
  126. int f,s;
  127.     {
  128.     struct    xfont *xf;
  129.     XFontStruct *fontst;
  130.  
  131.     if (f<0)            /* use font 0 for default font (-1) */
  132.         f=0;
  133.     if (s<0)
  134.         s=DEF_PRINTFONTSIZE;    /* default font size */
  135.     xf = fontnames[f].xfontlist;    /* go through the linked list looking for match */
  136.     if (xf == NULL)
  137.         return roman_font;    /* use a default font */
  138.     while (1)
  139.         {
  140.         if (s <= xf->size)    /* exact or larger point size */
  141.             break;
  142.         if (xf->next != NULL)    /* keep ptr to last if not found */
  143.             xf = xf->next;
  144.         else
  145.             break;        /* not found, use largest point size in the list */
  146.         }
  147.     if (xf->fid == NULL)        /* if the font is not yet loaded, load it */
  148.         {
  149.         if (appres.DEBUG)
  150.             fprintf(stderr,"Loading font %s\n",xf->fname);
  151.         if (fontst = XLoadQueryFont(tool_d, xf->fname))    /* load it */
  152.             {
  153.             xf->fid = fontst->fid;        /* save the id */
  154.             xf->fstruct = fontst;        /* and the XFontStruct ptr */
  155.             }
  156.         else
  157.             fprintf(stderr,"What!!?!?! Can't find font %s\n",xf->fname);
  158.         }
  159.     return xf->fstruct;
  160.     }
  161.