/******************************************************
 *                                                    *
 * Dieses Programm initialisiert einen Font und linkt *
 * ihn direkt in das System, unter Zuhilfenahme       *
 * von AddFont(). Als Zeichen seiner Existenz ist     *
 * eine Window-Titlebar mit dem Fontnamen auf dem     *
 * WorkbenchScreen zu sehen. Solange das Close-Gadget *
 * nicht betaetigt wird, ist dieser Font fuer alle    *
 * Tasks benutzbar. Nach dessen Betaetigung wird der  *
 * Font entfernt und aller Speicher, der benutzt      *
 * wurde, wieder freigegeben.                         *
 * Das Programmm muss mit 'RUN ADDMYFONT' gestartet   *
 * werden, damit das CLI weiter zur Eingabe zur       *
 * Verfuegung steht.                                  *
 ******************************************************/

#include <exec/types.h>
#include <exec/memory.h>

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

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


struct IntuitionBase   *IntuitionBase;
struct GfxBase         *GfxBase;
struct TextFont        *tf;
struct Window          *cleanup_w;
struct NewWindow nw =
 { 0,20,240,10,-1,-1,CLOSEWINDOW,WINDOWDRAG|WINDOWDEPTH
   |WINDOWCLOSE,NULL,NULL,NULL,NULL,NULL,0,0,0,0,
   WBENCHSCREEN };

/* Das Aussehen des Fonts */
UWORD cdat[] = { 0xe00f, 0x803f, 0xffe4, 0x63e0,
                 0x3019, 0x803c, 0x01b4, 0x9080,
                 0x1821, 0x8030, 0x032c, 0x9080,
                 0x0c60, 0x0c60, 0x0624, 0x6080,
                 0x06c0, 0x3060, 0x0c00, 0x0000,
                 0x0380, 0x1fc0, 0xff12, 0x93c0,
                 0x06c0, 0x00c0, 0x300c, 0x7080,
                 0x0c60, 0x0180, 0xe00c, 0x1100,
                 0x1830, 0xc301, 0x8012, 0x63c0,
                 0x3018, 0xc603, 0x00c0, 0x0000,
                 0xe00e, 0x7c0f, 0xffc0, 0x0000,
                 0x0000, 0x0000, 0x0000, 0x0000,
                 0x0000, 0x0000, 0x0000, 0x0000,
                 0x0000, 0x0000, 0x0000, 0x0000,
                 0x0000, 0x0000, 0x0000, 0x0000 
               };

/* Lage der einzelnen Zeichen */
UWORD cloc[] = { 0x0000, 0x000f, 0x000f, 0x000d,
                 0x001c, 0x000e, 0x002a, 0x0011 };

/* Breite der einzelnen Zeichen */
UWORD cspc[] = { 17,15,16,19 };

UWORD cker[] = { 2,2,2,2 };

char  fontname[32];

main()
 {
  LONG err;
  UWORD i,*ptr;

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

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

/* Die TextFont Struktur wird in einen Speicherblock
   gelegt, der allen Tasks zugaenglich ist (MEMF_PUBLIC)*/ 
  tf = (struct TextFont *)AllocMem(
               (LONG)( sizeof(struct TextFont) )
                                        ,MEMF_PUBLIC);

  if(!tf){printf("\nMEM - FAULT\n");ende();}
      
  str_copy("my.font",fontname);/* Der Name des Fonts */

 /* Nun folgt die Initialisierung der TextFont-Struktur.
    Die ersten 7 Elemente koennen auch bei Ihren Fonts
    so belassen werden. */ 
  tf->tf_Message.mn_Node.ln_Succ = NULL;
  tf->tf_Message.mn_Node.ln_Pred = NULL;
  tf->tf_Message.mn_Node.ln_Type = NT_FONT;
  tf->tf_Message.mn_Node.ln_Pri  = NULL;
  tf->tf_Message.mn_Node.ln_Name = fontname; 
  tf->tf_Message.mn_ReplyPort    = NULL;
  tf->tf_Message.mn_Length       = (UWORD)
                         ( sizeof(struct TextFont) +
                           sizeof(cdat) +
                           sizeof(cloc) +
                           sizeof(cspc) +
                           sizeof(cker) );
 /* Ab hier den eigenen Font definieren */
  tf->tf_YSize     = 14;
  tf->tf_Style     = NULL;
  tf->tf_Flags     = FPF_PROPORTIONAL|FPF_DESIGNED;
  tf->tf_XSize     = 19;
  tf->tf_Baseline  = 12;
  tf->tf_BoldSmear = 1;
  tf->tf_Accessors = NULL;       /* bleibt gleich */
  tf->tf_LoChar    = 88;
  tf->tf_HiChar    = 90;
  tf->tf_CharData  = (APTR)cdat; /* bleibt gleich */
  tf->tf_Modulo    = 8;
  tf->tf_CharLoc   = (APTR)cloc; /* bleibt gleich */
  tf->tf_CharSpace = (APTR)cspc; /* bleibt gleich */
  tf->tf_CharKern  = (APTR)cker; /* bleibt gleich */

  AddFont(tf);

  nw.Title = (UBYTE *)fontname;

  cleanup_w = (struct Window *)OpenWindow(&nw);
  if(!cleanup_w)ende();

 /* Wait() bewirkt dass der Task im Pause-Zustand
    ist und nicht bremsend auf Anderes wirkt. */
  Wait(1L<<cleanup_w->UserPort->mp_SigBit);

  RemFont(tf);

  ende();
}

ende()
{
 if(cleanup_w)      CloseWindow(cleanup_w);
 if(GfxBase)        CloseLibrary(GfxBase);
 if(IntuitionBase)   CloseLibrary(IntuitionBase);
 if(tf)             
       FreeMem(tf,(long)sizeof(struct TextFont));
 exit(1L);
}

str_copy(a,b)
char *a,*b;
{
while(*b++ = *a++);
}
