home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol12n03.zip / BMF.C < prev    next >
C/C++ Source or Header  |  1992-10-30  |  5KB  |  171 lines

  1. /*-------------------------------------------
  2.    BMF.C -- Easy access to OS/2 bitmap fonts
  3.             (c) Charles Petzold, 1993
  4.   -------------------------------------------*/
  5.  
  6. #define INCL_GPI
  7. #include <os2.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "bmf.h"
  11.  
  12. static PFONTLIST pfl ;
  13.  
  14. PFONTLIST GetAllBitmapFonts (HPS hps)
  15.      {
  16.      HDC          hdc ;
  17.      int          iFace, iSize ;
  18.      LONG         l, lFonts, xRes, yRes ;
  19.      PFONTMETRICS pfm ;
  20.  
  21.                // Check for changed fonts
  22.  
  23.      if (!(QFA_PUBLIC & GpiQueryFontAction (hps, QFA_PUBLIC)) && pfl != NULL)
  24.           return pfl ;
  25.  
  26.                // Clean up old structure if necessary
  27.  
  28.      if (pfl != NULL)
  29.           {
  30.           for (iFace = 0 ; iFace < pfl->iNumFaces ; iFace++)
  31.                free (pfl->faces[iFace].psizes) ;
  32.  
  33.           free (pfl) ;
  34.           }
  35.  
  36.                // Determine the number of fonts
  37.  
  38.      lFonts = 0 ;
  39.      lFonts = GpiQueryFonts (hps, QF_PUBLIC, NULL, &lFonts, 0, NULL) ;
  40.  
  41.      if (lFonts == 0)
  42.           return NULL ;
  43.  
  44.                // Allocate memory for FONTMETRICS structures
  45.  
  46.      pfm = (PFONTMETRICS) calloc (lFonts, sizeof (FONTMETRICS)) ;
  47.  
  48.      if (pfm == NULL)
  49.           return NULL ;
  50.  
  51.                // Get all fonts
  52.  
  53.      GpiQueryFonts (hps, QF_PUBLIC, NULL, &lFonts,
  54.                          sizeof (FONTMETRICS), pfm) ;
  55.  
  56.                // Determine font resolution
  57.  
  58.      hdc = GpiQueryDevice (hps) ;
  59.  
  60.      DevQueryCaps (hdc, CAPS_HORIZONTAL_FONT_RES, 1, &xRes) ;
  61.      DevQueryCaps (hdc, CAPS_VERTICAL_FONT_RES,   1, &yRes) ;
  62.  
  63.                // Allocate memory for FONTLIST structure
  64.  
  65.      pfl = malloc (sizeof (FONTLIST)) ;
  66.      pfl->iNumFaces = 0 ;
  67.  
  68.                // Loop through all fonts
  69.  
  70.      for (l = 0 ; l < lFonts ; l++)
  71.           {
  72.                     // Check if bitmap font at screen resolution
  73.  
  74.           if (!(pfm[l].fsDefn & FM_DEFN_OUTLINE) &&
  75.                 pfm[l].sXDeviceRes == xRes       &&
  76.                 pfm[l].sYDeviceRes == yRes)
  77.                {
  78.                          // Loop through existing facenames
  79.  
  80.                for (iFace = 0 ; iFace < pfl->iNumFaces ; iFace++)
  81.                     if (0 == strcmp (pfl->faces[iFace].szFacename,
  82.                                      pfm[l].szFacename))
  83.                          break ;
  84.  
  85.                          // If new face, reallocate FONTLIST structure
  86.  
  87.                if (iFace == pfl->iNumFaces)
  88.                     {
  89.                     pfl = realloc (pfl, sizeof (FONTLIST) +
  90.                                         pfl->iNumFaces * sizeof (FACES)) ;
  91.  
  92.                     pfl->iNumFaces ++ ;
  93.  
  94.                     strcpy (pfl->faces[iFace].szFacename, pfm[l].szFacename) ;
  95.  
  96.                     pfl->faces[iFace].iNumSizes = 0 ;
  97.                     pfl->faces[iFace].psizes = NULL ;
  98.                     }
  99.  
  100.                iSize = pfl->faces[iFace].iNumSizes ;
  101.  
  102.                pfl->faces[iFace].iNumSizes ++ ;
  103.  
  104.                pfl->faces[iFace].psizes =  realloc (pfl->faces[iFace].psizes,
  105.                               pfl->faces[iFace].iNumSizes * sizeof (SIZES)) ;
  106.  
  107.                          // Store point size and lMatch value
  108.  
  109.                pfl->faces[iFace].psizes[iSize].iPointSize =
  110.                                    pfm[l].sNominalPointSize / 10 ;
  111.  
  112.                pfl->faces[iFace].psizes[iSize].lMatch = pfm[l].lMatch ;
  113.                }
  114.           }
  115.  
  116.                // Clean up
  117.  
  118.      free (pfm) ;
  119.  
  120.      return pfl ;
  121.      }
  122.  
  123. LONG CreateBitmapFont (HPS hps, LONG lcid, char * szFacename,
  124.                        int iPointSize, SHORT fsAttributes, SHORT usCodePage)
  125.      {
  126.      FATTRS fat ;
  127.      int    iFace, iSize ;
  128.  
  129.      fat.usRecordLength  = sizeof (FATTRS) ;
  130.      fat.fsSelection     = fsAttributes ;
  131.      fat.lMatch          = 0 ;
  132.      fat.szFacename[0]   = '\0' ;
  133.      fat.idRegistry      = 0 ;
  134.      fat.usCodePage      = usCodePage ;
  135.      fat.lMaxBaselineExt = 0 ;
  136.      fat.lAveCharWidth   = 0 ;
  137.      fat.fsType          = 0 ;
  138.      fat.fsFontUse       = 0 ;
  139.  
  140.                // If fonts have changed, re-enumerate them
  141.  
  142.      GetAllBitmapFonts (hps) ;
  143.  
  144.                // If bitmap fonts are available, loop through faces
  145.  
  146.      if (pfl != NULL)
  147.           for (iFace = 0 ; iFace < pfl->iNumFaces ; iFace++)
  148.  
  149.                          // If a face matches, loop through sizes
  150.  
  151.                if (0 == strcmp (szFacename, pfl->faces[iFace].szFacename))
  152.                     for (iSize = 0 ; iSize < pfl->faces[iFace].iNumSizes ;
  153.                                      iSize++)
  154.  
  155.                                    // If size matches, setup FATTR structure
  156.  
  157.                          if (iPointSize ==
  158.                                    pfl->faces[iFace].psizes[iSize].iPointSize)
  159.                               {
  160.                               strcpy (fat.szFacename,
  161.                                       pfl->faces[iFace].szFacename) ;
  162.  
  163.                               fat.lMatch =
  164.                                    pfl->faces[iFace].psizes[iSize].lMatch ;
  165.                               }
  166.  
  167.                // Create the font
  168.  
  169.      return GpiCreateLogFont (hps, NULL, lcid, &fat) ;
  170.      }
  171.