/*---------------- TESTPROGRAMM FUER VEKTORFONTHANDLER -----------------*/

#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/dos.h>
#include <exec/ports.h>
#include <exec/memory.h>

/*---- Strukturdefinition der Message ----*/ 
struct VFontMess
{
  struct Node *ln_Succ;
  struct Node *ln_Pred;
  UBYTE ln_Type;
  BYTE ln_Pri;
  char *ln_Name;
  struct MsgPort *mn_ReplyPort;
  UWORD mn_Length;
  struct RastPort *rp;
  struct VekFont *VFont;
  long xs,ys;
  long wi,hi,spc;
  long Flags;
  char *String;
  long Len,DrawMode;
};
/*---- Strukturdefinition Vektorfont ----*/
struct VekFont
{
  short EdX,EdY;
  USHORT FKenn;
  UBYTE LoChar,HiChar;
  short VBase;
  long Reserved[4];
};

/*---- Globale Variablen  ----*/
struct MsgPort *ReplyPort=0L,*MPort=0L;
struct IntuitionBase *IntuitionBase=0L;
struct GfxBase *GfxBase=0L;
char OutString[]="Beispieltext";
char VFName[]="df0:VektorFonts/Topaz.vek";
struct VekFont *VBuff=0L;
int VFLen=0L;

main()
{
struct Window *wn=0L;
struct IntuiMessage *imes;
ULONG flags=ACTIVATE|WINDOWCLOSE,datei=0L;
ULONG iflags=CLOSEWINDOW|MOUSEBUTTONS;
USHORT class,code;

  if(OpenLibs() > 0)                                 goto abbruch;
  if(!(wn=OpenAWindow(0,0,640,200,"",flags,iflags))) goto abbruch;
  if(!LoadVFont(VFName))                             goto abbruch;
  if(!InitPorts())                                   goto abbruch;
  FOREVER
  {
    Wait(1<<wn->UserPort->mp_SigBit);
    while(imes=GetMsg(wn->UserPort))
    {
      class=imes->Class;
      code=imes->Code;
      ReplyMsg(imes);
      switch(class)
      {
        case CLOSEWINDOW:
          goto abbruch;
        case MOUSEBUTTONS:
          if(imes->Code != SELECTDOWN) break;
          SetAPen(wn->RPort,1);
          WriteVekText(wn->RPort,VBuff,wn->MouseX,wn->MouseY,30,50,4,
                       OutString,JAM1);
      }
    }
  }
abbruch:
  if(wn) CloseWindow(wn);
  if(VBuff) FreeMem(VBuff,VFLen);
  CloseLibs();
}
/*--------------------------- Text schreiben ----------------------------*/
/*   edp.fu */
WriteVekText(rp,font,xs,ys,wi,hi,spc,string,drmd)
struct RastPort *rp;
struct VekFont *font;
short xs,ys,wi,hi,spc;
char *string,drmd;
{
struct VFontMess VMess;

  /* Massagestruktur initialisieren */
  VMess.ln_Type=NT_MESSAGE;
  VMess.mn_ReplyPort=ReplyPort;
  VMess.mn_Length=0L;

  VMess.rp=rp;              /* Ausgaberastport */
  VMess.VFont=font;         /* Zeiger auf Vektorfont */
  VMess.String=string;      /* Zeichenkette */
  VMess.xs=xs;              /* X-Koordinate */
  VMess.ys=ys;              /* Y-Koordinate */
  VMess.wi=wi;              /* Fontbreite */
  VMess.hi=hi;              /* Fonthöhe   */
  VMess.spc=spc;            /* Zeichenabstand */
  VMess.Flags=0;            /* Flaggenregister auf 0 */
  VMess.Len=strlen(string); /* Anzahl Ausgabezeichen */
  VMess.DrawMode=drmd;      /* Zeichenmodus */

  PutMsg(MPort,&VMess);     /* Message abschicken */
  WaitPort(ReplyPort);      /* Auf Antwort warten */
  GetMsg(ReplyPort);        /* Antwort abholen    */
  return(VMess.Flags);      /* Flagsvariable zurückgeben (Fehler ?) */
}
/*---------------------- Messageports initialisieren --------------------*/
/*   edp.fu */
InitPorts()
{
  MPort=FindPort("vekfport-t0");      /* Handlerport suchen */
  if(MPort==0) return(0);             /* Handler wurde nicht gefunden */
  ReplyPort=FindPort("vekfport-t1");  /* Antwortport suchen */
  ReplyPort->mp_SigTask=FindTask(0);  /* Antwortport eigene Task zuweisen */
  return(1);
}
/*---------------------------- Lade Vektorfont --------------------------*/
/*   edp.fu */
LoadVFont(name)
char *name;
{
struct FileInfoBlock finfo;
struct FileLock *lockp=0L;
ULONG datei=0L;

  /*---- Filelaenge feststellen -----*/
  if(!(lockp=Lock(name,ACCESS_READ))) return(0);
  if(!Examine(lockp,&finfo))           
  {
    UnLock(lockp);
    return(0);
  }
  VFLen=finfo.fib_Size;
  UnLock(lockp);

  /*---- Speicher besorgen und File laden -----*/
  if(VFLen > 0)
  {
    if(!(VBuff=AllocMem(VFLen,MEMF_PUBLIC))) return(0);
    datei=Open(name,MODE_OLDFILE);
    Read(datei,VBuff,VFLen);
    Close(datei);
  }
  return(VFLen);
}
/*-------------------------- Libraries öffnen --------------------------*/
/*   edp.fu */
OpenLibs()
{
  if(!(IntuitionBase=OpenLibrary("intuition.library",0L))) return(1);
  if(!(GfxBase=OpenLibrary("graphics.library",0L)))        return(2);
  return(0);
}
/*-------------------------- Libraries schließen ------------------------*/
/*   edp.fu */
CloseLibs()
{
  if(IntuitionBase) CloseLibrary(IntuitionBase);
  if(GfxBase)       CloseLibrary(GfxBase);
}
/*------------------------------ Window öffnen  ------------------------*/
OpenAWindow(x,y,w,h,name,flags,iflags)
short x,y,w,h;
char *name;
ULONG flags,iflags;
{
struct NewWindow NewWindow;
struct Window *wn;

  NewWindow.LeftEdge=x;        
  NewWindow.TopEdge=y;
  NewWindow.Width=w;           
  NewWindow.Height=h;
  NewWindow.DetailPen=0;       
  NewWindow.BlockPen=1;
  NewWindow.Title=name;        
  NewWindow.Flags=flags;
  NewWindow.IDCMPFlags=iflags;
  NewWindow.FirstGadget=NULL;  
  NewWindow.CheckMark=NULL;
  NewWindow.Type=WBENCHSCREEN;
  NewWindow.Screen=IntuitionBase->ActiveScreen;
  NewWindow.BitMap=0L;
  NewWindow.MinWidth=NewWindow.MinHeight=10;
  NewWindow.MaxWidth=640; 
  NewWindow.MaxHeight=256;

  return(OpenWindow(&NewWindow));
}





