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 >
Wrap
C/C++ Source or Header
|
1990-08-15
|
5KB
|
176 lines
#include <exec/types.h>
#include <exec/libraries.h>
#include <exec/io.h>
#include <hardware/blit.h>
#include <graphics/gfx.h>
#include <graphics/rastport.h>
#include <graphics/text.h>
#include <libraries/diskfont.h>
#include <libraries/dos.h>
#include <devices/keymap.h>
#include <proto/exec.h>
#include <proto/diskfont.h>
#include "main.h"
struct chardef {
WORD offset;
WORD charbitwidth;
};
struct Library *DiskfontBase,*GfxBase;
struct TextAttr fonts[FONTS] = {
{ (STRPTR)"ascii.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"supplemental.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"graphics.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"british.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"dutch.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"finnish.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"french.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"french_canadian.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"german.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"italian.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"norwegian.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"spanish.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"swedish.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"swiss.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"technical.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT },
{ (STRPTR)"display_controls.font",YSIZE,FS_NORMAL,FPF_DISKFONT|FPF_TALLDOT }
};
openfonts(register struct console *con)
{
register USHORT cnt;
for (cnt = 0; cnt < FONTS; cnt++) con->font[cnt] = NULL;
if ((GfxBase = OpenLibrary("graphics.library",0)) != NULL) {
if ((DiskfontBase = OpenLibrary("diskfont.library",0)) != NULL) {
for (cnt = 0; cnt < FONTS; cnt++) {
if ((con->font[cnt]=OpenDiskFont(&fonts[cnt])) == NULL) {
closefonts(con);
return(-1);
}
}
SetFont(con->rp,con->font[DISPLAY_CONTROLS]);
return(0);
}
CloseLibrary(GfxBase);
}
return(-1);
}
closefonts(register struct console *con)
{
register USHORT cnt;
for (cnt = 0; cnt < FONTS; cnt++)
if (con->font[cnt] != NULL) CloseFont(con->font[cnt]);
CloseLibrary(DiskfontBase);
CloseLibrary(GfxBase);
return(0);
}
setlset(register struct console *con,USHORT set)
{
register struct TextFont *sf,*df;
register UBYTE *scp,*dcp,cnt1;
register WORD smod,dmod;
register UBYTE cnt2;
register WORD *opt;
con->lset = set;
if (con->nstat & NATIONAL) cnt2 = con->mset[set];
else cnt2 = con->gset[set];
if (cnt2 == DISPLAY_CONTROLS) {
con->tstat |= DCONTLO;
cnt2 = ASCII;
}
else con->tstat &= (MASK - DCONTLO);
sf = con->font[cnt2];
df = con->font[DISPLAY_CONTROLS];
cnt1 = sf->tf_HiChar - sf->tf_LoChar + 1;
smod = sf->tf_Modulo;
dmod = df->tf_Modulo;
while (cnt1--) {
scp = (UBYTE *)sf->tf_CharData;
opt = (WORD *)sf->tf_CharLoc;
opt += cnt1 * 2;
scp += *opt >> 3;
dcp = (UBYTE *)df->tf_CharData;
opt = (WORD *)df->tf_CharLoc;
opt += (cnt1 + FIRSTLCHAR) * 2;
dcp += *opt >> 3;
cnt2 = YSIZE;
do {
*dcp = *scp;
scp += smod;
dcp += dmod;
} while (--cnt2);
}
return(0);
}
setrset(register struct console *con,USHORT set)
{
register struct TextFont *sf,*df;
register UBYTE *scp,*dcp,cnt1;
register WORD smod,dmod;
register UBYTE cnt2;
register WORD *opt;
con->rset = set;
if (con->nstat & NATIONAL) cnt2 = con->mset[set];
else cnt2 = con->gset[set];
if (cnt2 == DISPLAY_CONTROLS) {
con->tstat |= DCONTHI;
cnt2 = SUPPLEMENTAL;
}
else con->tstat &= (MASK - DCONTHI);
sf = con->font[cnt2];
df = con->font[DISPLAY_CONTROLS];
cnt1 = sf->tf_HiChar - sf->tf_LoChar + 1;
smod = sf->tf_Modulo;
dmod = df->tf_Modulo;
while (cnt1--) {
scp = (UBYTE *)sf->tf_CharData;
opt = (WORD *)sf->tf_CharLoc;
opt += cnt1 * 2;
scp += *opt >> 3;
dcp = (UBYTE *)df->tf_CharData;
opt = (WORD *)df->tf_CharLoc;
opt += (cnt1 + FIRSTRCHAR) * 2;
dcp += *opt >> 3;
cnt2 = YSIZE;
do {
*dcp = *scp;
scp += smod;
dcp += dmod;
} while (--cnt2);
}
return(0);
}
cset(char c)
{
switch (c) {
case 'B': return(ASCII);
case '<': return(SUPPLEMENTAL);
case '0': return(GRAPHICS);
case 'A': return(BRITISH);
case '4': return(DUTCH);
case '5':
case 'C': return(FINNISH);
case 'R': return(FRENCH);
case 'Q': return(FRENCH_CANADIAN);
case 'K': return(GERMAN);
case 'Y': return(ITALIAN);
case '6':
case 'E': return(NORWEGIAN);
case 'Z': return(SPANISH);
case '7':
case 'H': return(SWEDISH);
case '=': return(SWISS);
default: ;
}
return(0);
}