Files
sibo-playground/code/SIBOSDK/demo/fonts.c
T
2026-07-06 18:01:36 +01:00

219 lines
5.0 KiB
C

/*
FONTS.C - Display fonts
This program was used to produce the font displays in the Window Server
Reference manual.
*/
#include <plib.h>
#include <wlib.h>
#define MINX 2
#define MINY 2
#define WIDTH 160
LOCAL_D INT FontID;
LOCAL_D INT CurrentY,CurrentX;
LOCAL_D G_FONT_INFO FontInfo;
LOCAL_C VOID DrawSideLines(INT y1,INT dy)
{
gDrawLine(0,y1,0,y1+dy+1);
gDrawLine(WIDTH-1,y1,WIDTH-1,y1+dy+1);
}
LOCAL_C VOID PrintHexNumber(INT x,INT y,UINT n)
{
TEXT buf[5];
gPrintText(x,y,&buf[0],p_gtob(&buf[0],n,16));
}
LOCAL_C VOID CDECL PrintLine(INT style,INT final,TEXT *fmt,...)
{
INT height,ascent,len;
P_RECT box;
G_GC gc;
TEXT b[80];
height=FontInfo.height;
ascent=FontInfo.ascent;
if (style&G_STY_DOUBLE)
{
height<<=1;
ascent<<=1;
}
if (CurrentX==MINX)
DrawSideLines(CurrentY,height+1);
gc.font=FontID;
gc.style=style;
gSetGC(0,G_GC_MASK_FONT|G_GC_MASK_STYLE,&gc);
len=p_atob(&b[0],fmt,&fmt+1);
box.tl.x=CurrentX;
box.br.x=WIDTH-MINX;
box.tl.y=CurrentY;
box.br.y=box.tl.y+height;
if (box.br.x>box.tl.x)
gPrintBoxText(&box,ascent,G_TEXT_ALIGN_LEFT,0,&b[0],len);
if (final)
{
CurrentY+=height+1;
CurrentX=MINX;
}
else
CurrentX+=gTextWidth(FontID,style,&b[0],len);
}
LOCAL_C VOID SaveFontCodes(VOID)
{
INT x,y,dx,dy,xo,yo,yy;
INT bitmap;
W_OPEN_BIT_SEG bit;
G_GC gc;
P_RECT rect;
TEXT name[32];
dx=18;
dy=FontInfo.height+1;
xo=FontInfo.numeric_width+(MINX+5);
yo=FontInfo.ascent+(MINY+3);
bit.size.x=dx*16+xo+MINX;
bit.size.y=dy*16+yo+MINY;
bitmap=gCreateBit(0,&bit);
gCreateTempGC0(bitmap);
gc.font=FontID;
gSetGC(0,G_GC_MASK_FONT,&gc);
rect.tl.x=rect.tl.y=0;
rect.br=bit.size;
gClrRect(&rect,G_TRMODE_CLR);
gDrawBox(&rect);
rect.tl.x=xo-2;
rect.tl.y=yo-2;
gDrawBox(&rect);
for (x=0;x<16;x++)
PrintHexNumber(x*dx+xo,FontInfo.ascent+1,x);
name[0]=0;
for (y=0;y<16;y++)
{
PrintHexNumber(3,yy=y*dy+yo+FontInfo.ascent,y);
for (x=0;x<16;x++)
{
gPrintText(x*dx+xo,yy,&name[0],1);
name[0]++;
}
}
gFreeTempGC();
p_atos(&name[0],"rem::fcode%d.pic",FontID-WS_FONT_BASE);
gSaveBit(&name[0],bitmap);
wFree(bitmap);
}
LOCAL_C VOID DrawFontStyles(VOID)
{
P_RECT rect;
CurrentY=MINY;
CurrentX=MINX;
rect.tl.x=rect.tl.y=0;
rect.br.x=WIDTH;
rect.br.y=1000;
gClrRect(&rect,G_TRMODE_CLR);
gDrawLine(0,0,WIDTH,0);
DrawSideLines(0,MINY);
PrintLine(G_STY_NORMAL,FALSE,"Normal text (%d) ",FontInfo.height);
PrintLine(G_STY_BOLD,TRUE,"Bold text");
PrintLine(G_STY_ITALIC,FALSE,"Italic text ");
PrintLine(G_STY_MONO,TRUE,"Mono text");
PrintLine(G_STY_DOUBLE,FALSE,"Double height ");
PrintLine(G_STY_DOUBLE|G_STY_BOLD,TRUE,"Double bold");
gDrawLine(0,CurrentY,WIDTH,CurrentY);
}
LOCAL_C VOID SaveFontStyles(VOID)
{
INT bitmap;
W_OPEN_BIT_SEG bit;
TEXT name[32];
bit.size.x=WIDTH;
bit.size.y=CurrentY+1;
bitmap=gCreateBit(0,&bit);
gCreateTempGC0(bitmap);
DrawFontStyles();
gFreeTempGC();
p_atos(&name[0],"rem::font%d.pic",FontID-WS_FONT_BASE);
gSaveBit(&name[0],bitmap);
wFree(bitmap);
}
LOCAL_C VOID SetFont(INT fid)
{
gFontInfo(FontID=fid,0,&FontInfo);
}
LOCAL_C VOID HandleKeyPress(INT code)
{
INT i;
if (code=='\r')
p_exit(0);
if ('0'<=code && code<'6')
{
SetFont(code-'0'+WS_FONT_BASE);
DrawFontStyles();
}
if (code=='s')
{
wSetBusyMsg("Saving",W_CORNER_TOP_LEFT);
SaveFontStyles();
wCancelBusyMsg();
wInfoMsg("Styles bitmap saved");
}
if (code=='a')
{
wSetBusyMsg("Saving",W_CORNER_TOP_LEFT);
for (i=0;i<6;i++)
{
SetFont(i+WS_FONT_BASE);
DrawFontStyles();
SaveFontStyles();
}
wCancelBusyMsg();
wInfoMsg("Bitmaps saved");
}
if (code=='c')
{
wSetBusyMsg("Saving",W_CORNER_TOP_LEFT);
SaveFontCodes();
wCancelBusyMsg();
wInfoMsg("Codes bitmap saved");
}
if (code=='z')
{
wSetBusyMsg("Saving",W_CORNER_TOP_LEFT);
for (i=0;i<6;i++)
{
SetFont(i+WS_FONT_BASE);
SaveFontCodes();
}
wCancelBusyMsg();
wInfoMsg("Bitmaps saved");
}
}
GLDEF_C INT main(VOID)
{
WS_EV event;
wStartup();
SetFont(WS_FONT_BASE);
DrawFontStyles();
for (;;)
{
wGetEventWait(&event);
if (event.type==WM_KEY)
HandleKeyPress(event.p.key.keycode);
}
return(0);
}