home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff369.lzh / VaxTerm / src / font.c next >
C/C++ Source or Header  |  1990-08-15  |  5KB  |  176 lines

  1. #include <exec/types.h>
  2. #include <exec/libraries.h>
  3. #include <exec/io.h>
  4. #include <hardware/blit.h>
  5. #include <graphics/gfx.h>
  6. #include <graphics/rastport.h>
  7. #include <graphics/text.h>
  8. #include <libraries/diskfont.h>
  9. #include <libraries/dos.h>
  10. #include <devices/keymap.h>
  11. #include <proto/exec.h>
  12. #include <proto/diskfont.h>
  13.  
  14. #include "main.h"
  15.  
  16. struct chardef {
  17.     WORD offset;
  18.     WORD charbitwidth;
  19.     };
  20.  
  21. struct Library *DiskfontBase,*GfxBase;
  22.  
  23. struct TextAttr fonts[FONTS] = {
  24.  { (STRPTR)"ascii.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  25.  { (STRPTR)"supplemental.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  26.  { (STRPTR)"graphics.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  27.  { (STRPTR)"british.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  28.  { (STRPTR)"dutch.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  29.  { (STRPTR)"finnish.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  30.  { (STRPTR)"french.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  31.  { (STRPTR)"french_canadian.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  32.  { (STRPTR)"german.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  33.  { (STRPTR)"italian.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  34.  { (STRPTR)"norwegian.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  35.  { (STRPTR)"spanish.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  36.  { (STRPTR)"swedish.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  37.  { (STRPTR)"swiss.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  38.  { (STRPTR)"technical.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
  39.  { (STRPTR)"display_controls.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT }
  40.  };
  41.  
  42. openfonts(register struct console *con)
  43. {
  44. register USHORT cnt;
  45. for (cnt = 0; cnt < FONTS; cnt++) con->font[cnt] = NULL;
  46. if ((GfxBase = OpenLibrary("graphics.library",0)) != NULL) {
  47.     if ((DiskfontBase = OpenLibrary("diskfont.library",0)) != NULL) {
  48.         for (cnt = 0; cnt < FONTS; cnt++) {
  49.             if ((con->font[cnt]=OpenDiskFont(&fonts[cnt])) == NULL) {
  50.                 closefonts(con);
  51.                 return(-1);
  52.                 }
  53.             }
  54.         SetFont(con->rp,con->font[DISPLAY_CONTROLS]);
  55.         return(0);
  56.         }
  57.     CloseLibrary(GfxBase);
  58.     }
  59. return(-1);
  60. }
  61.  
  62. closefonts(register struct console *con)
  63. {
  64. register USHORT cnt;
  65. for (cnt = 0; cnt < FONTS; cnt++)
  66.     if (con->font[cnt] != NULL) CloseFont(con->font[cnt]);
  67. CloseLibrary(DiskfontBase);
  68. CloseLibrary(GfxBase);
  69. return(0);
  70. }
  71.  
  72. setlset(register struct console *con,USHORT set)
  73. {
  74. register struct TextFont *sf,*df;
  75. register UBYTE *scp,*dcp,cnt1;
  76. register WORD smod,dmod;
  77. register UBYTE cnt2;
  78. register WORD *opt;
  79.  
  80. con->lset = set;
  81. if (con->nstat & NATIONAL) cnt2 = con->mset[set];
  82. else cnt2 = con->gset[set];
  83. if (cnt2 == DISPLAY_CONTROLS) {
  84.     con->tstat |= DCONTLO;
  85.     cnt2 = ASCII;
  86.     }
  87. else con->tstat &= (MASK - DCONTLO);
  88. sf = con->font[cnt2];
  89. df = con->font[DISPLAY_CONTROLS];
  90. cnt1 = sf->tf_HiChar - sf->tf_LoChar + 1;
  91. smod = sf->tf_Modulo;
  92. dmod = df->tf_Modulo;
  93. while (cnt1--) {
  94.     scp = (UBYTE *)sf->tf_CharData;
  95.     opt = (WORD *)sf->tf_CharLoc;
  96.     opt += cnt1 * 2;
  97.     scp += *opt >> 3;
  98.     dcp = (UBYTE *)df->tf_CharData;
  99.     opt = (WORD *)df->tf_CharLoc;
  100.     opt += (cnt1 + FIRSTLCHAR) * 2;
  101.     dcp += *opt >> 3;
  102.     cnt2 = YSIZE;
  103.     do {
  104.         *dcp = *scp;
  105.         scp += smod;
  106.         dcp += dmod;
  107.         } while (--cnt2);
  108.     }
  109. return(0);
  110. }
  111.  
  112. setrset(register struct console *con,USHORT set)
  113. {
  114. register struct TextFont *sf,*df;
  115. register UBYTE *scp,*dcp,cnt1;
  116. register WORD smod,dmod;
  117. register UBYTE cnt2;
  118. register WORD *opt;
  119.  
  120. con->rset = set;
  121. if (con->nstat & NATIONAL) cnt2 = con->mset[set];
  122. else cnt2 = con->gset[set];
  123. if (cnt2 == DISPLAY_CONTROLS) {
  124.     con->tstat |= DCONTHI;
  125.     cnt2 = SUPPLEMENTAL;
  126.     }
  127. else con->tstat &= (MASK - DCONTHI);
  128. sf = con->font[cnt2];
  129. df = con->font[DISPLAY_CONTROLS];
  130. cnt1 = sf->tf_HiChar - sf->tf_LoChar + 1;
  131. smod = sf->tf_Modulo;
  132. dmod = df->tf_Modulo;
  133. while (cnt1--) {
  134.     scp = (UBYTE *)sf->tf_CharData;
  135.     opt = (WORD *)sf->tf_CharLoc;
  136.     opt += cnt1 * 2;
  137.     scp += *opt >> 3;
  138.     dcp = (UBYTE *)df->tf_CharData;
  139.     opt = (WORD *)df->tf_CharLoc;
  140.     opt += (cnt1 + FIRSTRCHAR) * 2;
  141.     dcp += *opt >> 3;
  142.     cnt2 = YSIZE;
  143.     do {
  144.         *dcp = *scp;
  145.         scp += smod;
  146.         dcp += dmod;
  147.         } while (--cnt2);
  148.     }
  149. return(0);
  150. }
  151.  
  152. cset(char c)
  153. {
  154. switch (c) {
  155.     case 'B': return(ASCII);
  156.     case '<': return(SUPPLEMENTAL);
  157.     case '0': return(GRAPHICS);
  158.     case 'A': return(BRITISH);
  159.     case '4': return(DUTCH);
  160.     case '5':
  161.     case 'C': return(FINNISH);
  162.     case 'R': return(FRENCH);
  163.     case 'Q': return(FRENCH_CANADIAN);
  164.     case 'K': return(GERMAN);
  165.     case 'Y': return(ITALIAN);
  166.     case '6':
  167.     case 'E': return(NORWEGIAN);
  168.     case 'Z': return(SPANISH);
  169.     case '7':
  170.     case 'H': return(SWEDISH);
  171.     case '=': return(SWISS);
  172.     default: ;
  173.     }
  174. return(0);
  175. }
  176.