#include <intuition/intuitionbase.h>
#include <libraries/diskfont.h>

/* nur fuer Aztec C */
#include <functions.h>

#include <libraries/dos.h>

#define RP font_window->RPort

struct DosBase         *DosBase;
struct DiskfontBase    *DiskfontBase;
struct IntuitionBase   *IntuitionBase;
struct GfxBase         *GfxBase;

struct TextFont *tf;
struct TextAttr textattr;

/* Ein einfaches Workbench Window auf dem die Fonts
   gezeigt werden */
struct NewWindow windowdata =
 {
  20,80,600,80,0,1,CLOSEWINDOW,WINDOWDRAG|WINDOWCLOSE|
  SIMPLE_REFRESH,NULL,NULL,(UBYTE *)"FONT CHECK",NULL,
  NULL,600,80,600,80,WBENCHSCREEN
 };

struct Window *font_window;

LONG str_len(),dm;


main()
 {
  SHORT buf;
  UBYTE *fsp,fstr[30];
  UWORD fheight;
  
  if( (DiskfontBase = (struct DiskfontBase *)
         OpenLibrary("diskfont.library",0L)) == NULL )
                  ende();

  if( (IntuitionBase = (struct IntuitionBase *)
         OpenLibrary("intuition.library",0L)) == NULL )
                  ende();

  if( (GfxBase = (struct GfxBase *)
         OpenLibrary("graphics.library",0L)) == NULL )
                  ende();

  fsp = (UBYTE *)&fstr[0];

/****************************************************
 * Einige Abfragen und initialisieren der TextAttr  *
 * Struktur.                                        */

  printf("\n\n Fontname ? :");
  scanf("%s",fsp);

  textattr.ta_Name = fsp;

  printf("\n\n Fonthöhe ? :");
  scanf("%d",&buf);
  fheight = (UWORD)buf;

  textattr.ta_YSize = fheight;
  
  printf("\n\n DRAW MODE");
  printf("\n 0 = JAM1  1 = JAM2");
  printf("  2 = COMPLEMENT 4 = INVERSID\n");
  scanf("%ld",&dm); 

/* Oeffnen des Ausgabewindows */  
  font_window = (struct Window *)
                          OpenWindow(&windowdata);
  if(!font_window)ende();


/**************************************************
 * Style und Flags hier auf NULL gesetzt.         */

  textattr.ta_Style = (UBYTE)NULL;
  textattr.ta_Flags = (UBYTE)NULL;


/**************************************************
 * Eigentlich benutzt OpenDiskFont() auch den     *
 * Speicher, doch zur Verdeutlichung wird zuerst  *
 * mit OpenFont() geprueft ob der gewuenschte Font*
 * im Speicher liegt. Ist das nicht der Fall,     *
 * wird OpenDiskFont() versucht                   */

  if(tf = (struct TextFont *)OpenFont(&textattr))
    printf("\n %s ist im Speicher und benutzbar\n",
                                    textattr.ta_Name);
  else
   {
    printf("\n im Speicher ist %s nicht !!",
                                    textattr.ta_Name);
    printf("\n Schauen wir auf die Diskette.\n");
  
    if(tf = (struct TextFont *) 
                   OpenDiskFont(&textattr))
     printf
         ("\n UFF! in der FONTS: Directory gefunden");
    else
     {
      printf("\n Auch auf der Diskette kein %s",
                                     textattr.ta_Name);
      ende();
     }
    printf("\n\nADIEU !!\n");
   }

/****************************************************
 * Ist der Font gefunden wird er in mehreren Arten  *
 * gezeigt.                                         */

  SetFont(RP,tf);

  SetDrMd(RP,dm);
  SetAPen(RP,2L);
  SetBPen(RP,3L);

  Move(RP,10L,25L);
  Text(RP,"abcde",5L);

  Move(RP,200L,25L);
  Text(RP,textattr.ta_Name,str_len((char *)textattr.ta_Name));

  SetSoftStyle(RP,FSF_ITALIC,255L);    
  Move(RP,200L,40L);
  Text(RP,"abcde",5L);

  SetSoftStyle(RP,FSF_BOLD,255L);    
  Move(RP,10L,40L);
  Text(RP,"abcde",5L);

  SetSoftStyle(RP,FSF_UNDERLINED,255L);    
  Move(RP,100L,25L);
  Text(RP,"abcde",5L);

  SetSoftStyle(RP,FSF_BOLD|FSF_UNDERLINED,255L);    
  Move(RP,100L,40L);
  Text(RP,"abcde",5L);

 /* Der Task gibt den Fontzugriff auf */
  CloseFont(tf);
 
 /* Das Programm wartet, bis das Close-Gadget des
      Windows angeklickt wird */
  while(font_window->MessageKey->Class != CLOSEWINDOW);

/****************************************************
 * Der Font wird wieder aus dem System entfernt.    *
 * Benutzt man diese Funktion nicht, so verbleibt   *
 * der gewuenschte Font, als Systemfont, im Speicher*
 * auch wenn dieses Progamm beendet ist.            *
 * Startet man das Programm dann wieder und verlangt*
 * denselben Font, so erhaelt man die Meldung, daß  *
 * sich dieser im Speicher befindet.                */

  RemFont(tf);

/* Probieren sie es aus !!!                         *
 ****************************************************/

  ende();
  return(NULL);
}

LONG str_len(s)
 char *s;
  {
  char *cp = s;
   
  while(*cp++);
  return(cp-s-1);
 }

ende()
{
 if(GfxBase)        CloseLibrary(GfxBase);
 if(IntuitionBase)  CloseLibrary(IntuitionBase);
 if(DiskfontBase)   CloseLibrary(DiskfontBase);
 if(font_window)    CloseWindow(font_window);
 return(NULL);
}
