;/* AvailFonts.c - Execute me to compile me with Lattice 5.10a
LC -cfistq -v -y -j73 AvailFonts.c
Blink FROM LIB:c.o,AvailFonts.o TO AvailFonts LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit ;*/
#include <exec/types.h>
#include <dos/rdargs.h>
#include <dos/dosextens.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <graphics/text.h>
#include <graphics/displayinfo.h>
#include <graphics/regions.h>
#include <graphics/gfx.h>
#include <libraries/diskfont.h>
#include <utility/tagitem.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/layers_protos.h>
#include <clib/alib_stdio_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/diskfont_protos.h>
#include <clib/utility_protos.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); }
#endif
UBYTE *vers = "\0$VER: AvailFonts 36.3";
void MainLoop(void);
ULONG StrLen(UBYTE *);
struct stringstruct {
UBYTE *string;
LONG charcount;
WORD stringwidth;
};
UBYTE *alphabetstring = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
struct stringstruct fname, fheight, XDPI, YDPI, entrynum;
struct Library *DiskfontBase, *IntuitionBase, *LayersBase, *GfxBase, *UtilityBase;
struct Window *mywin;
struct RastPort *mycliprp, myrp;
struct Rectangle myrect;
struct Region *new_region, *old_region;
struct DrawInfo *mydrawinfo;
struct AvailFontsHeader *afh;
LONG fontheight, alphabetcharcount;
WORD stringwidth;
void main(int argc, char **argv)
{
struct TextFont *defaultfont = NULL;
struct TextAttr defaultfontattr = { "topaz.font", 9, 0, 0 };
LONG afsize, afshortage, cliprectside;
fname.string = "Font Name: ";
fheight.string = "Font Height: ";
XDPI.string = "X DPI: ";
YDPI.string = "Y DPI: ";
entrynum.string = "Entry #: ";
if (DiskfontBase = OpenLibrary("diskfont.library", 37L)) /* Open the libraries. */
{
if (IntuitionBase = OpenLibrary("intuition.library", 37L))
{
if (GfxBase = OpenLibrary("graphics.library", 37L))
{
if (LayersBase = OpenLibrary("layers.library", 37L))
{
if (UtilityBase = OpenLibrary("utility.library", 37L))
{
if (mywin = OpenWindowTags(NULL, /* Open that window. */
WA_SmartRefresh,TRUE,
WA_SizeGadget, FALSE,
WA_CloseGadget, TRUE,
WA_IDCMP, IDCMP_CLOSEWINDOW,
WA_DragBar, TRUE,
WA_DepthGadget, TRUE,
WA_Title, (ULONG)"AvailFonts() example",
TAG_END))
{
myrp = *(mywin->RPort); /* A structure assign: clone my window's Rastport. */
/* RastPort. This RastPort will be used to render */
/* the font specs, not the actual font sample. */
if (mydrawinfo = GetScreenDrawInfo(mywin->WScreen))
{
SetFont(&myrp, mydrawinfo->dri_Font);
myrect.MinX = mywin->BorderLeft; /* LAYOUT THE WINDOW */
myrect.MinY = mywin->BorderTop;
myrect.MaxX = mywin->Width - (mywin->BorderRight + 1);
myrect.MaxY = mywin->Height - (mywin->BorderBottom + 1);
cliprectside = (myrect.MaxX - myrect.MinX) / 20;
fname.charcount = StrLen(fname.string);
fheight.charcount = StrLen(fheight.string);
XDPI.charcount = StrLen(XDPI.string);
YDPI.charcount = StrLen(YDPI.string);
entrynum.charcount = StrLen(entrynum.string);
alphabetcharcount = StrLen(alphabetstring);
fontheight = (myrp.Font->tf_YSize) + 2;
if (fontheight > ((myrect.MaxY - myrect.MinY) / 6)) /* If the default screen */
{ /* font is more than one- */
defaultfont = OpenFont(&defaultfontattr); /* sixth the size of the */
SetFont(&myrp, defaultfont); /* window, use topaz-9. */
fontheight = (myrp.Font->tf_YSize) + 2;
}
fname.stringwidth = TextLength(&myrp, (STRPTR)fname.string, fname.charcount);
fheight.stringwidth = TextLength(&myrp, (STRPTR)fheight.string, fheight.charcount);
XDPI.stringwidth = TextLength(&myrp, (STRPTR)XDPI.string, XDPI.charcount);
YDPI.stringwidth = TextLength(&myrp, (STRPTR)YDPI.string, YDPI.charcount);
entrynum.stringwidth =
TextLength(&myrp, (STRPTR)entrynum.string, entrynum.charcount);
stringwidth = fname.stringwidth; /* What is the largest string length? */
stringwidth =
(fheight.stringwidth > stringwidth) ? fheight.stringwidth : stringwidth;
stringwidth = (XDPI.stringwidth > stringwidth) ? XDPI.stringwidth : stringwidth;
stringwidth = (YDPI.stringwidth > stringwidth) ? YDPI.stringwidth : stringwidth;
stringwidth =
(entrynum.stringwidth > stringwidth) ? entrynum.stringwidth : stringwidth;
stringwidth += mywin->BorderLeft;
if (stringwidth < ((myrect.MaxX - myrect.MinX) >> 1)) /* If the stringwidth is */
{ /* more than half the viewing*/
SetAPen(&myrp, mydrawinfo->dri_Pens[TEXTPEN]); /* area, quit because the */
SetDrMd(&myrp, JAM2); /* font is just too big. */
Move(&myrp, myrect.MinX + 8 + stringwidth - fname.stringwidth,
myrect.MinY + 4 + (myrp.Font->tf_Baseline));
Text(&myrp, fname.string, fname.charcount);
Move(&myrp, myrect.MinX + 8 + stringwidth - fheight.stringwidth,
myrp.cp_y + fontheight);
Text(&myrp, fheight.string, fheight.charcount);
Move(&myrp, myrect.MinX + 8 + stringwidth - XDPI.stringwidth,
myrp.cp_y + fontheight);
Text(&myrp, XDPI.string, XDPI.charcount);
Move(&myrp, myrect.MinX + 8 + stringwidth - YDPI.stringwidth,
myrp.cp_y + fontheight);
Text(&myrp, YDPI.string, YDPI.charcount);
Move(&myrp, myrect.MinX + 8 + stringwidth - entrynum.stringwidth,
myrp.cp_y + fontheight);
Text(&myrp, entrynum.string, entrynum.charcount);
myrect.MinX = myrect.MinX + cliprectside;
myrect.MaxX = myrect.MaxX - cliprectside;
myrect.MinY = myrect.MinY + (5 * fontheight) + 8;
myrect.MaxY = myrect.MaxY - 8;
SetAPen(&myrp, mydrawinfo->dri_Pens[SHINEPEN]); /* Draw a box around */
Move(&myrp, myrect.MinX - 1, myrect.MaxY + 1); /* the cliprect. */
Draw(&myrp, myrect.MaxX + 1, myrect.MaxY + 1);
Draw(&myrp, myrect.MaxX + 1, myrect.MinY - 1);
SetAPen(&myrp, mydrawinfo->dri_Pens[SHADOWPEN]);
Draw(&myrp, myrect.MinX - 1, myrect.MinY - 1);
Draw(&myrp, myrect.MinX - 1, myrect.MaxY);
SetAPen(&myrp, mydrawinfo->dri_Pens[TEXTPEN]);
/* Fill up a buffer with a list of the available fonts */
afsize = AvailFonts((STRPTR)afh, 0L, AFF_MEMORY|AFF_DISK|AFF_SCALED|AFF_TAGGED);
do
{
afh = (struct AvailFontsHeader *) AllocMem(afsize, 0);
if (afh)
{
afshortage = AvailFonts((STRPTR)afh, afsize,
AFF_MEMORY|AFF_DISK|AFF_SCALED|AFF_TAGGED);
if (afshortage)
{
FreeMem(afh, afsize);
afsize += afshortage;
afh = (struct AvailFontsHeader *)(-1L);
}
}
} while (afshortage && afh);
if (afh)
{
/* This is for the layers.library clipping region that gets attached to */
/* the window. This prevents the application from unnecessarily */
/* rendering beyond the bounds of the inner part of the window. For */
/* more information on clipping, see the Layers chapter of this manual. */
if (new_region = NewRegion()) /* More layers stuff */
{
if (OrRectRegion(new_region, &myrect));/* Even more layers stuff */
{
/* Obtain a pointer to the window's rastport and set up some of */
/* the rastport attributes. This example obtains the text pen */
/* for the window's screen using the GetScreenDrawInfo() function. */
mycliprp = mywin->RPort;
SetAPen(mycliprp, mydrawinfo->dri_Pens[TEXTPEN]);
MainLoop();
}
DisposeRegion(new_region);
}
FreeMem(afh, afsize);
}
}
FreeScreenDrawInfo(mywin->WScreen, mydrawinfo);
}
CloseWindow(mywin);
}
CloseLibrary(UtilityBase);
}
CloseLibrary(LayersBase);
}
CloseLibrary(GfxBase);
}
CloseLibrary(IntuitionBase);
}
CloseLibrary(DiskfontBase);
}
}
void MainLoop(void)
{
UWORD x;
struct Task *mytask;
struct IntuiMessage *mymsg;
BOOL aok = TRUE;
struct TAvailFonts *afont;
struct TextFont *myfont;
UBYTE buf[8];
ULONG dpi;
mytask = FindTask(NULL);
afont = (struct TAvailFonts *)&(afh[1]);
for (x = 0; (x < afh->afh_NumEntries); x++)
{
if (aok)
{
if (myfont = OpenDiskFont(&(afont->taf_Attr)))
{
SetAPen(&myrp, mydrawinfo->dri_Pens[BACKGROUNDPEN]); /* Print the TextFont attributes. */
RectFill( &myrp, stringwidth, mywin->BorderTop + 4,
mywin->Width - (mywin->BorderRight + 1), myrect.MinY - 2 );
SetAPen(&myrp, mydrawinfo->dri_Pens[TEXTPEN]);
Move( &myrp, stringwidth + mywin->BorderLeft,
mywin->BorderTop + 4 + (myrp.Font->tf_Baseline) );
Text( &myrp, (UBYTE *)myfont->tf_Message.mn_Node.ln_Name,
StrLen((UBYTE *)myfont->tf_Message.mn_Node.ln_Name) );
Move(&myrp, stringwidth + mywin->BorderLeft, myrp.cp_y + fontheight); /* Print the */
sprintf(buf, "%d\0", myfont->tf_YSize); /* font's Y Size. */
Text(&myrp, buf, StrLen(buf));
Move(&myrp, stringwidth + mywin->BorderLeft, myrp.cp_y + fontheight); /* Print the X DPI */
dpi = GetTagData( TA_DeviceDPI, 0L,
((struct TextFontExtension *)(myfont->tf_Extension))->tfe_Tags);
if (dpi)
{
sprintf(buf, "%d\0", ((dpi & 0xFFFF0000)>>16));
Text(&myrp, buf, StrLen(buf));
}
else Text(&myrp, "nil", 3L);
Move(&myrp, stringwidth + mywin->BorderLeft, myrp.cp_y + fontheight); /* Print the Y DPI */
if (dpi)
{
sprintf(buf, "%d\0", (dpi & 0x0000FFFF));
Text(&myrp, buf, StrLen(buf));
}
else Text(&myrp, "nil", 3L);
Move(&myrp, stringwidth + mywin->BorderLeft, myrp.cp_y + fontheight); /* Print the */
sprintf(buf, "%d\0", x); /* entrynum. */
Text(&myrp, buf, StrLen(buf));
SetFont(mycliprp, myfont);
old_region = InstallClipRegion(mywin->WLayer, new_region); /* Install clipping rectangle */
SetRast(mycliprp, mydrawinfo->dri_Pens[BACKGROUNDPEN]);
Move( mycliprp, myrect.MinX, myrect.MaxY - (myfont->tf_YSize - myfont->tf_Baseline) );
Text(mycliprp, alphabetstring, alphabetcharcount);
Delay(100);
new_region = InstallClipRegion(mywin->WLayer, old_region); /* Remove clipping rectangle */
while (mymsg = (struct IntuiMessage *)GetMsg(mywin->UserPort))
{
aok = FALSE;
x = afh->afh_NumEntries;
ReplyMsg((struct Message *)mymsg);
}
if (mytask->tc_SigRecvd & SIGBREAKF_CTRL_C) /* Did the user hit CTRL-C (the shell */
{ /* window has to receive the CTRL-C)? */
aok = FALSE;
x = afh->afh_NumEntries;
VPrintf("Ctrl-C Break\n", NULL);
}
CloseFont(myfont);
}
}
afont++;
}
}
ULONG StrLen(UBYTE *string)
{
ULONG x = 0L;
while (string[x++]);
return(--x);
}