/*----------------------------------------------------------------------------*
 *                                                                            *
 *  AGA-Morph-Main.c V1.2                                                     *
 *                                                                            *
 *----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/

#include <libraries/diskfont.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/pointerclass.h>
#include <datatypes/pictureclass.h>
#include <datatypes/pictureclassext.h>
#include <graphics/gfx.h>
#include <exec/memory.h>
#include <libraries/asl.h>
#include <clib/macros.h>

#include "AGA-Morph-Language.h"
#include "AGA-Morph-Struct.h"

/*----------------------------------------------------------------------------*/

#define GadgetOn(g,w,r) {Pos=RemoveGadget(w,g); (g)->Flags-=((g)->Flags & GFLG_DISABLED); AddGadget(w,g,Pos); RefreshGList(g,w,r,1);}
#define GadgetOff(g,w,r) {Pos=RemoveGadget(w,g); (g)->Flags=((g)->Flags | GFLG_DISABLED); AddGadget(w,g,Pos); RefreshGList(g,w,r,1);}

/*----------------------------------------------------------------------------*/

extern struct AslBase *AslBase;
extern struct DataTypesBase *DataTypesBase;
extern struct DiskfontBase *DiskfontBase;
extern struct DPoint Points;
extern struct Gadget BorderGadget,ChangeSpButton,DPicX,DPicY,EditWindowBar1,
                     EditWindowBar2,Pic2Slider,Pic2Val,Poi2Slider,Poi2Val,
                     PointsButton,ResetSplinesButton,SpLineButton,
                     ViewWindowBar1,ZoomButton;
extern struct GfxBase *GfxBase;
extern struct Image InfoImage,Pic2Slider1r,Poi2Slider1r,RadioOffIm,RadioOnIm;
extern struct IntuiMessage *Mess;
extern struct IntuiText MemoryError;
extern struct IntuitionBase *IntuitionBase;
extern struct MPoint *Point1,*Point2;
extern struct Pic *DisplayP,*EditP,Picture1,Picture2,Picture3;
extern struct PropInfo EditWindowBar1p,EditWindowBar2p,Pic2Sliderp,Poi2Sliderp;
extern struct RastPort *CommandRast,*EditRast,*ViewRast;
extern struct Screen *MorphScreen;
extern struct StringInfo DPicXp,DPicYp,Pic2Valp,Poi2Valp,PointsBp;
extern struct TextAttr NormalFont;
extern struct TextFont *NFont;
extern struct Window *CommandWindow,*EditWindow,*ErrorWindow,*ViewWindow;
extern BYTE Ende;
extern LONG Error,i,j,k,Pos,x,xstart,y,ystart;
extern Object CrossPointer,ArrowPointer;
extern UBYTE DPicXBuf[15],DPicYBuf[15],RedrawView,RedrawEdit,Pic2ValBuf[12],
             Poi2ValBuf[12],MCol;
extern ULONG ArrowBMP[],CrossBMP[],Height,Mode,Overscan,Signals,Width;
extern UWORD Colors[13],*Info,InfoInfo[],*Slider,SliderInfo[],SmallEdit[4],
             SmallView[4],RadioInfo[],*RadioOff,*RadioOn;

struct Pic *DisplayPic(struct Pic *Picture,struct Window *DWin);
struct Pic *DisplaySpinPic(struct Pic *Picture1,struct Pic *Picture2,struct Window *DWin);

/*----------------------------------------------------------------------------*/

int main();
BYTE OpenAll();
void CloseAll(BYTE error);

/*----------------------------------------------------------------------------*/

int
main()
{
  if (!(Error=OpenAll()))
  {
    Ende=0;
    do
    {
      if (((LONG)EditP==-1) && (!(ErrorWindow)))
      {
        OnGadget(&ResetSplinesButton,CommandWindow,0);
      }
      else
      {
        OffGadget(&ResetSplinesButton,CommandWindow,0);
      }
      Signals=(1<<CommandWindow->UserPort->mp_SigBit)+
              (1<<ViewWindow->UserPort->mp_SigBit)+
              (1<<EditWindow->UserPort->mp_SigBit);
      if (ErrorWindow)
      {
        Signals+=(1<<ErrorWindow->UserPort->mp_SigBit);
      }
      Wait(Signals);
      while (Mess=(struct IntuiMessage *) GetMsg(CommandWindow->UserPort))
      {
        if (Mess->Class==IDCMP_GADGETUP)
        {
          switch (((struct Gadget *) Mess->IAddress)->GadgetID)
          {
            case 1:
            {
              /* Load Picture 1 */
              LoadPic(&Picture1,Load_Picture_1);
              RethinkSliderView(&Picture1);
              DisplayP=DisplayPic(&Picture1,ViewWindow);
              break;
            }
            case 2:
            {
              /* Load Picture 2 */
              LoadPic(&Picture2,Load_Picture_2);
              RethinkSliderView(&Picture2);
              DisplayP=DisplayPic(&Picture2,ViewWindow);
              break;
            }
            case 3:
            {
              /* Load Points */
              LoadPoints();
              RedrawEdit=TRUE;
              if (PointsButton.Flags & GFLG_SELECTED) RedrawView=TRUE;
              break;
            }
            case 4:
            {
              /* Save Picture */
              RethinkSliderView(&Picture3);
              DisplayP=DisplayPic(&Picture3,ViewWindow);
              SavePic(&Picture3,Save_Picture);
              break;
            }
            case 5:
            {
              /* Save Points */
              SavePoints();
              break;
            }
            case 6:
            {
              /* Change Points 1 */
              RethinkSliderEdit(&Picture1);
              EditP=DisplayPic(&Picture1,EditWindow);
              break;
            }
            case 7:
            {
              /* Change Points 2 */
              RethinkSliderEdit(&Picture2);
              EditP=DisplayPic(&Picture2,EditWindow);
              break;
            }
            case 8:
            {
              /* Change Spline */
              RethinkSliderSpinEdit();
              EditP=DisplaySpinPic(&Picture1,&Picture2,EditWindow);
              break;
            }
            case 9:
            {
              /* Add Point */
              Pos=MAX(0,MIN(Points.NumPoints,PointsBp.LongInt));
              if (Pos==0)
              {
                Point1=Points.First;
                if (Points.First=(struct MPoint *)AllocVec(sizeof(struct MPoint),0))
                {
                  Points.NumPoints++;
                  (Points.First)->Next=Point1;
                  (Points.First)->P.x1=0;
                  (Points.First)->P.y1=0;
                  (Points.First)->P.x2=0;
                  (Points.First)->P.y2=0;
                  (Points.First)->P.xs=0;
                  (Points.First)->P.ys=0;
                }
                else
                {
                  Points.First=Point1;
                  ShowError(&MemoryError);
                }
              }
              else
              {
                Point1=Points.First;
                for (i=1;i<Pos;i++)
                {
                  Point1=Point1->Next;
                }
                Point2=Point1->Next;
                if (Point1->Next=(struct MPoint *)AllocVec(sizeof(struct MPoint),0))
                {
                  (Point1->Next)->Next=Point2;
                  (Point1->Next)->P.x1=0;
                  (Point1->Next)->P.y1=0;
                  (Point1->Next)->P.x2=0;
                  (Point1->Next)->P.y2=0;
                  (Point1->Next)->P.xs=0;
                  (Point1->Next)->P.ys=0;
                  Points.NumPoints++;
                }
                else
                {
                  ShowError(&MemoryError);
                  Point1->Next=Point2;
                }
              }
              PointsBp.LongInt=Pos+1;
              RedrawEdit=TRUE;
              if (PointsButton.Flags & GFLG_SELECTED) RedrawView=TRUE;
              RethinkSelectedPoint();
              break;
            }
            case 10:
            {
              /* Delete Point */
              Pos=MIN(Points.NumPoints,PointsBp.LongInt);
              if (Pos>1)
              {
                Point1=Points.First;
                for (i=0;i<Pos-2;i++)
                {
                  Point1=Point1->Next;
                }
                Point2=(Point1->Next)->Next;
                FreeVec(Point1->Next);
                Point1->Next=Point2;
                Points.NumPoints--;
              }
              else
              {
                Pos=1;
                Point1=(Points.First)->Next;
                FreeVec(Points.First);
                Points.First=Point1;
                Points.NumPoints--;
              }
              PointsBp.LongInt=Pos;
              RethinkSelectedPoint();
              RedrawEdit=TRUE;
              if (PointsButton.Flags & GFLG_SELECTED) RedrawView=TRUE;
              break;
            }
            case 11:
            {
              /* % of 2nd Pic.: (Slider) */
              Pos=RemoveGadget(CommandWindow,&Pic2Val);
              Pic2Valp.LongInt=(Pic2Sliderp.HorizPot*100)/65535;
              if (Pic2Valp.LongInt==100)
              {
                Pic2ValBuf[0]=48+1;
                Pic2ValBuf[1]=48;
                Pic2ValBuf[2]=48;
                Pic2ValBuf[3]=0;
                Pic2Valp.NumChars=4;
              }
              else
              {
                if (Pic2Valp.LongInt>9)
                {
                  Pic2ValBuf[0]=48+Pic2Valp.LongInt/10;
                  Pic2ValBuf[1]=48+Pic2Valp.LongInt%10;
                  Pic2ValBuf[2]=0;
                  Pic2Valp.NumChars=3;
                }
                else
                {
                  Pic2ValBuf[0]=48+Pic2Valp.LongInt;
                  Pic2ValBuf[1]=0;
                  Pic2Valp.NumChars=2;
                }
              }
              for (i=0;i<4;i++)
              {
                Pic2ValBuf[i+4]=Pic2ValBuf[i];
                Pic2ValBuf[i+8]=Pic2ValBuf[i];
              }
              AddGadget(CommandWindow,&Pic2Val,Pos);
              RefreshGList(&Pic2Val,CommandWindow,0,1);
              break;
            }
            case 12:
            {
              /* % of 2nd Pic.: (Value) */
              NewModifyProp(&Pic2Slider,CommandWindow,0,
                            FREEHORIZ | PROPNEWLOOK | PROPBORDERLESS,
                            (Pic2Valp.LongInt*65535)/100,0,649,MAXBODY,1);
              break;
            }
            case 13:
            {
              /* % of 2nd Poi.: (Slider) */
              Pos=RemoveGadget(CommandWindow,&Poi2Val);
              Poi2Valp.LongInt=(Poi2Sliderp.HorizPot*100)/65535;
              if (Poi2Valp.LongInt==100)
              {
                Poi2ValBuf[0]=48+1;
                Poi2ValBuf[1]=48;
                Poi2ValBuf[2]=48;
                Poi2ValBuf[3]=0;
                Poi2Valp.NumChars=4;
              }
              else
              {
                if (Poi2Valp.LongInt>9)
                {
                  Poi2ValBuf[0]=48+Poi2Valp.LongInt/10;
                  Poi2ValBuf[1]=48+Poi2Valp.LongInt%10;
                  Poi2ValBuf[2]=0;
                  Poi2Valp.NumChars=3;
                }
                else
                {
                  Poi2ValBuf[0]=48+Poi2Valp.LongInt;
                  Poi2ValBuf[1]=0;
                  Poi2Valp.NumChars=2;
                }
              }
              for (i=0;i<4;i++)
              {
                Poi2ValBuf[i+4]=Poi2ValBuf[i];
                Poi2ValBuf[i+8]=Poi2ValBuf[i];
              }
              AddGadget(CommandWindow,&Poi2Val,Pos);
              RefreshGList(&Poi2Val,CommandWindow,0,1);
              break;
            }
            case 14:
            {
              /* % of 2nd Poi.: (Value) */
              NewModifyProp(&Poi2Slider,CommandWindow,0,
                            FREEHORIZ | PROPNEWLOOK | PROPBORDERLESS,
                            (Poi2Valp.LongInt*65535)/100,0,649,MAXBODY,1);
              break;
            }
            case 15:
            {
              /* Spline On/Off */
              if (SpLineButton.Flags & GFLG_SELECTED)
              {
                GadgetOn(&ChangeSpButton,CommandWindow,0);
              }
              else
              {
                GadgetOff(&ChangeSpButton,CommandWindow,0);
              }
              break;
            }
            case 16:
            {
              /* Render Picture */
              Render(DPicXp.LongInt,DPicYp.LongInt,Poi2Valp.LongInt,Pic2Valp.LongInt);
              DisplayP=DisplayPic(&Picture3,ViewWindow);
              break;
            }
            case 17:
            {
              /* Show Picture 1 */
              RethinkSliderView(&Picture1);
              DisplayP=DisplayPic(&Picture1,ViewWindow);
              break;
            }
            case 18:
            {
              /* Show Picture 2 */
              RethinkSliderView(&Picture2);
              DisplayP=DisplayPic(&Picture2,ViewWindow);
              break;
            }
            case 19:
            {
              /* Show Rendered Picture */
              RethinkSliderView(&Picture3);
              DisplayP=DisplayPic(&Picture3,ViewWindow);
              break;
            }
            case 20:
            {
              /* AGA-Morph V1.2 Info */
              ShowInfo();
              break;
            }
            case 21:
            {
              /* 4xZoom On/Off */
              RedrawView=TRUE;
              RedrawEdit=TRUE;
              break;
            }
            case 22:
            {
              /* Quit */
              Ende=1;
              break;
            }
            case 23:
            {
              /* Dest. Pic. (X) */
              Pos=RemoveGadget(CommandWindow,&DPicX);
              DPicXp.LongInt=MAX(DPicXp.LongInt,1);
              if (DPicXp.LongInt==0)
              {
                DPicXp.NumChars=1;
                DPicXBuf[0]=48+0;
                DPicXBuf[1]=0;
              }
              else
              {
                DPicXp.NumChars=0;
                k=DPicXp.LongInt;
                j=1000000000;
                for (i=9;i>=0;i--)
                {
                  if (DPicXp.LongInt>=j)
                  {
                    DPicXBuf[DPicXp.NumChars]=48+k/j;
                    DPicXp.NumChars++;
                    k=k%j;
                  }
                  j=j/10;
                }
                DPicXBuf[DPicXp.NumChars]=0;
              }
              AddGadget(CommandWindow,&DPicX,Pos);
              RefreshGList(&DPicX,CommandWindow,0,1);
              break;
            }
            case 24:
            {
              /* Dest. Pic. (Y) */
              Pos=RemoveGadget(CommandWindow,&DPicY);
              DPicYp.LongInt=MAX(DPicYp.LongInt,1);
              if (DPicYp.LongInt==0)
              {
                DPicYp.NumChars=1;
                DPicYBuf[0]=48+0;
                DPicYBuf[1]=0;
              }
              else
              {
                DPicYp.NumChars=0;
                k=DPicYp.LongInt;
                j=1000000000;
                for (i=9;i>=0;i--)
                {
                  if (DPicYp.LongInt>=j)
                  {
                    DPicYBuf[DPicYp.NumChars]=48+k/j;
                    DPicYp.NumChars++;
                    k=k%j;
                  }
                  j=j/10;
                }
                DPicYBuf[DPicYp.NumChars]=0;
              }
              AddGadget(CommandWindow,&DPicY,Pos);
              RefreshGList(&DPicY,CommandWindow,0,1);
              break;
            }
            case 25:
            {
              /* Selected Point: */
              RethinkSelectedPoint();
              RedrawEdit=TRUE;
              if (PointsButton.Flags & GFLG_SELECTED) RedrawView=TRUE;
              break;
            }
            case 26:
            {
              /* Delete All */
              DeletePoints();
              if (Picture1.r) FreeVec(Picture1.r);
              if (Picture1.g) FreeVec(Picture1.g);
              if (Picture1.b) FreeVec(Picture1.b);
              Picture1.width=0;
              Picture1.height=0;
              if (Picture2.r) FreeVec(Picture2.r);
              if (Picture2.g) FreeVec(Picture2.g);
              if (Picture2.b) FreeVec(Picture2.b);
              Picture2.width=0;
              Picture2.height=0;
              if (Picture3.r) FreeVec(Picture3.r);
              if (Picture3.g) FreeVec(Picture3.g);
              if (Picture3.b) FreeVec(Picture3.b);
              Picture3.width=0;
              Picture3.height=0;
              RedrawEdit=TRUE;
              RedrawView=TRUE;
              break;
            }
            case 27:
            {
              /* Reset Splines */
              Point1=Points.First;
              while (Point1)
              {
                Point1->P.xs=(Point1->P.x1+Point1->P.x2)/2;
                Point1->P.ys=(Point1->P.y1+Point1->P.y2)/2;
                Point1=Point1->Next;
              }
              if ((LONG)EditP==-1) RedrawEdit=TRUE;
              break;
            }
            case 28:
            {
              /* Points On/Off */
              RedrawView=TRUE;
              break;
            }
            case 29:
            {
              /* Change Color */
              MCol++;
              if (MCol==7) MCol=0;
              MouseColors(MCol);
              break;
            }
          }
        }
        else if (Mess->Class==IDCMP_VANILLAKEY)
        {
          if ((char)Mess->Code==' ')
          {
            MCol++;
            if (MCol==7) MCol=0;
            MouseColors(MCol);
          }
          if (((BYTE)Mess->Code==27) && ((LONG)EditP==-1))
          {
            Point1=Points.First;
            while (Point1)
            {
              Point1->P.xs=(Point1->P.x1+Point1->P.x2)/2;
              Point1->P.ys=(Point1->P.y1+Point1->P.y2)/2;
              Point1=Point1->Next;
            }
            RedrawEdit=TRUE;
          }
        }
        ReplyMsg((struct Message *) Mess);
      }
      while (Mess=(struct IntuiMessage *) GetMsg(ViewWindow->UserPort))
      {
        if ((Mess->Class==IDCMP_GADGETUP) || (Mess->Class==IDCMP_NEWSIZE))
        {
          RedrawView=TRUE;
        }
        ReplyMsg((struct Message *) Mess);
      }
      while (Mess=(struct IntuiMessage *) GetMsg(EditWindow->UserPort))
      {
        if ((Mess->Class==IDCMP_GADGETUP) || (Mess->Class==IDCMP_NEWSIZE))
        {
          RedrawEdit=TRUE;
        }
        else if (Mess->Class==IDCMP_MOUSEBUTTONS)
        {
          if (Mess->Code==SELECTUP)
          {
            if (EditP)
            {
              if (PointsBp.LongInt)
              {
                Point1=Points.First;
                for (i=1;i<PointsBp.LongInt;i++)
                {
                  Point1=Point1->Next;
                }
                if (EditP==(struct Pic *)-1)
                {
                  x=MAX(Picture1.width,Picture2.width);
                  y=MAX(Picture1.height,Picture2.height);
                }
                else
                {
                  x=EditP->width;
                  y=EditP->height;
                }
                if (ZoomButton.Flags & GFLG_SELECTED)
                {
                  if (EditWindow->GZZWidth<=4*x)
                  {
                    xstart=((4*x-EditWindow->GZZWidth)*EditWindowBar1p.HorizPot)/65535;
                  }
                  else
                  {
                    xstart=0;
                  }
                  if (EditWindow->GZZHeight<=4*y)
                  {
                    ystart=((4*y-EditWindow->GZZHeight)*EditWindowBar2p.VertPot)/65535;
                  }
                  else
                  {
                    ystart=0;
                  }
                  j=2;
                  xstart=xstart >> 2;
                  ystart=ystart >> 2;
                }
                else
                {
                  if (EditWindow->GZZWidth<=x)
                  {
                    xstart=((x-EditWindow->GZZWidth)*EditWindowBar1p.HorizPot)/65535;
                  }
                  else
                  {
                    xstart=0;
                  }
                  if (EditWindow->GZZHeight<=y)
                  {
                    ystart=((y-EditWindow->GZZHeight)*EditWindowBar2p.VertPot)/65535;
                  }
                  else
                  {
                    ystart=0;
                  }
                  j=0;
                }
                if (EditP==&Picture1)
                {
                  Point1->P.x1=(EditWindow->GZZMouseX >> j)+xstart;
                  Point1->P.y1=(EditWindow->GZZMouseY >> j)+ystart;
                }
                else if (EditP==&Picture2)
                {
                  Point1->P.x2=(EditWindow->GZZMouseX >> j)+xstart;
                  Point1->P.y2=(EditWindow->GZZMouseY >> j)+ystart;
                }
                else
                {
                  Point1->P.xs=(EditWindow->GZZMouseX >> j)+xstart;
                  Point1->P.ys=(EditWindow->GZZMouseY >> j)+ystart;
                }
                RedrawEdit=TRUE;
              }
            }
          }
        }
        ReplyMsg((struct Message *) Mess);
      }
      if (RedrawEdit)
      {
        if (EditP==(struct Pic *)-1)
        {
          RethinkSliderSpinEdit();
          EditP=DisplaySpinPic(&Picture1,&Picture2,EditWindow);
        }
        else
        {
          RethinkSliderEdit(EditP);
          EditP=DisplayPic(EditP,EditWindow);
        }
        RedrawEdit=FALSE;
      }
      if (RedrawView)
      {
        RethinkSliderView(DisplayP);
        DisplayP=DisplayPic(DisplayP,ViewWindow);
        RedrawView=FALSE;
      }
      if (ErrorWindow)
      {
        while (Mess=(struct IntuiMessage *) GetMsg(ErrorWindow->UserPort))
        {
          if (Mess->Class==IDCMP_GADGETUP) Ende=2;
          ReplyMsg((struct Message *) Mess);
        }
        if (Ende==2)
        {
          CloseWindow(ErrorWindow);
          ErrorWindow=0;
          EnableAll();
          Ende=0;
        }
      }
    }
    while (!(Ende));
  }
  DeletePoints();
  CloseAll(Error);
  return(0);
}

/*----------------------------------------------------------------------------*/

BYTE
OpenAll()
{
  struct ScreenModeRequester *req;
  Width=640;
  Height=480;
  Mode=VGAPRODUCT_KEY;
  if (!(DataTypesBase=(struct DataTypesBase *) OpenLibrary("datatypes.library",39))) return (13);
  if (!(AslBase=(struct AslBase *) OpenLibrary("asl.library",39))) return(12);
  if (!(Slider=(UWORD *) AllocVec(16728,MEMF_CHIP))) return(11);
  CopyMem(&SliderInfo[0],Slider,120);
  Pic2Slider1r.ImageData=Slider;
  Poi2Slider1r.ImageData=Slider;
  RadioOff=Slider+60;
  RadioOn=Slider+116;
  CopyMem(&RadioInfo[0],RadioOff,224);
  RadioOnIm.ImageData=RadioOn;
  RadioOffIm.ImageData=RadioOff;
  Info=Slider+172;
  CopyMem(&InfoInfo[0],Info,16384);
  InfoImage.ImageData=Info;
  if (!(DiskfontBase=(struct DiskfontBase *) OpenLibrary("diskfont.library",39))) return(10);
  if (!(IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",39))) return(9);
  if (!(NFont=(struct TextFont *) OpenDiskFont(&NormalFont))) return(8);
  if (!(GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",39))) return(7);
  if (!(req=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
                                                              ASLSM_TitleText,            Select_Screen_Mode,
                                                              ASLSM_InitialDisplayID,     EURO72PRODUCT_KEY,
                                                              ASLSM_InitialDisplayWidth,  640,
                                                              ASLSM_InitialDisplayHeight, 400,
                                                              ASLSM_DoWidth,              TRUE,
                                                              ASLSM_DoHeight,             TRUE,
                                                              ASLSM_DoOverscanType,       TRUE,
                                                              ASLSM_MinWidth,             640,
                                                              ASLSM_MinHeight,            400,
                                                              TAG_END))) return(6);
  if (AslRequest(req,0))
  {
    Width=MAX(640,req->sm_DisplayWidth);
    Height=MAX(400,req->sm_DisplayHeight);
    Mode=req->sm_DisplayID;
    Overscan=req->sm_OverscanType;
  }
  FreeAslRequest(req);
  if (!(MorphScreen=(struct Screen *) OpenScreenTags(NULL,
                                                     SA_Left,       0,
                                                     SA_Top,        0,
                                                     SA_Width,      Width,
                                                     SA_Height,     Height,
                                                     SA_Depth,      8,
                                                     SA_Pens,       Colors,
                                                     SA_Title,      Morph_Title,
                                                     SA_Type,       CUSTOMSCREEN,
                                                     SA_DisplayID,  Mode,
                                                     SA_Font,       &NormalFont,
                                                     SA_AutoScroll, TRUE,
                                                     SA_Overscan,   Overscan,
                                                     TAG_END))) return(6);
  MCol=0;
  MouseColors(MCol);
  SetPalette();
  if (!(CrossPointer=NewObject(0,POINTERCLASS,POINTERA_WordWidth,   2,
                                              POINTERA_BitMap,      &CrossBMP,
                                              POINTERA_XOffset,     -10,
                                              POINTERA_YOffset,     -10,
                                              POINTERA_XResolution, POINTERXRESN_HIRES,
                                              POINTERA_YResolution, POINTERYRESN_HIGH,
                                              TAG_END))) return(5);
  if (!(ArrowPointer=NewObject(0,POINTERCLASS,POINTERA_WordWidth,   2,
                                              POINTERA_BitMap,      &ArrowBMP,
                                              POINTERA_XOffset,     0,
                                              POINTERA_YOffset,     0,
                                              POINTERA_XResolution, POINTERXRESN_HIRES,
                                              POINTERA_YResolution, POINTERYRESN_HIGH,
                                              TAG_END))) return(4);
  if (!(EditWindow=(struct Window *) OpenWindowTags(NULL,
                                                    WA_Left,          0,
                                                    WA_Top,           11,
                                                    WA_Width,         (Width/2),
                                                    WA_Height,        (Height-11-159),
                                                    WA_Title,         Edit_Window,
                                                    WA_CustomScreen,  MorphScreen,
                                                    WA_MinWidth,      120,
                                                    WA_MinHeight,     26,
                                                    WA_MaxWidth,      Width,
                                                    WA_MaxHeight,     Height,
                                                    WA_Zoom,          SmallEdit,
                                                    WA_Gadgets,       &EditWindowBar1,
                                                    WA_SizeGadget,    TRUE,
                                                    WA_DragBar,       TRUE,
                                                    WA_DepthGadget,   TRUE,
                                                    WA_Activate,      TRUE,
                                                    WA_GimmeZeroZero, TRUE,
                                                    WA_Pointer,       CrossPointer,
                                                    WA_SizeBRight,    TRUE,
                                                    WA_SizeBBottom,   TRUE,
                                                    WA_IDCMP,         IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_GADGETUP,
                                                    TAG_END))) return(3);
  EditRast=EditWindow->RPort;
  if (!(ViewWindow=(struct Window *) OpenWindowTags(NULL,
                                                    WA_Left,          (Width/2),
                                                    WA_Top,           11,
                                                    WA_Width,         (Width/2),
                                                    WA_Height,        (Height-11-159),
                                                    WA_Title,         View_Window,
                                                    WA_CustomScreen,  MorphScreen,
                                                    WA_MinWidth,      120,
                                                    WA_MinHeight,     26,
                                                    WA_MaxWidth,      Width,
                                                    WA_MaxHeight,     Height,
                                                    WA_Zoom,          SmallView,
                                                    WA_Gadgets,       &ViewWindowBar1,
                                                    WA_SizeGadget,    TRUE,
                                                    WA_DragBar,       TRUE,
                                                    WA_DepthGadget,   TRUE,
                                                    WA_Activate,      TRUE,
                                                    WA_GimmeZeroZero, TRUE,
                                                    WA_Pointer,       ArrowPointer,
                                                    WA_SizeBRight,    TRUE,
                                                    WA_SizeBBottom,   TRUE,
                                                    WA_IDCMP,         IDCMP_NEWSIZE | IDCMP_GADGETUP,
                                                    TAG_END))) return(2);
  ViewRast=ViewWindow->RPort;
  if (!(CommandWindow=(struct Window *) OpenWindowTags(NULL,
                                                       WA_Left,          (Width-640)/2,
                                                       WA_Top,           (Height-159),
                                                       WA_Width,         640,
                                                       WA_Height,        159,
                                                       WA_Title,         Command_Window,
                                                       WA_CustomScreen,  MorphScreen,
                                                       WA_Gadgets,       &BorderGadget,
                                                       WA_DragBar,       TRUE,
                                                       WA_DepthGadget,   TRUE,
                                                       WA_Activate,      TRUE,
                                                       WA_GimmeZeroZero, TRUE,
                                                       WA_Pointer,       ArrowPointer,
                                                       WA_IDCMP,         IDCMP_GADGETUP | IDCMP_VANILLAKEY,
                                                       TAG_END))) return(1);
  CommandRast=CommandWindow->RPort;
  return(0);
}

/*----------------------------------------------------------------------------*/

void
CloseAll(BYTE error)
{
  switch(error)
  {
    case 1:
    {
      puts(Command_Error);
      break;
    }
    case 2:
    {
      puts(View_Error);
      break;
    }
    case 3:
    {
      puts(Edit_Error);
      break;
    }
    case 4:
    {
      puts(Arrow_Pointer_Error);
      break;
    };
    case 5:
    {
      puts(Cross_Pointer_Error);
      break;
    }
    case 6:
    {
      puts(Screen_Error);
      break;
    }
    case 7:
    {
      puts(Graphics_Error);
      break;
    }
    case 8:
    {
      puts(Font_Error);
      break;
    }
    case 9:
    {
      puts(Intuition_Error);
      break;
    }
    case 10:
    {
      puts(Diskfont_Error);
      break;
    }
    case 11:
    {
      puts(Memory_Error);
      break;
    }
    case 12:
    {
      puts(Asl_Error);
      break;
    }
    case 13:
    {
      puts(Datatypes_Error);
      break;
    }
  }
  if (Picture1.r) FreeVec(Picture1.r);
  if (Picture1.g) FreeVec(Picture1.g);
  if (Picture1.b) FreeVec(Picture1.b);
  if (Picture2.r) FreeVec(Picture2.r);
  if (Picture2.g) FreeVec(Picture2.g);
  if (Picture2.b) FreeVec(Picture2.b);
  if (Picture3.r) FreeVec(Picture3.r);
  if (Picture3.g) FreeVec(Picture3.g);
  if (Picture3.b) FreeVec(Picture3.b);
  if (error<1) CloseWindow(CommandWindow);
  if (error<2) CloseWindow(ViewWindow);
  if (error<3) CloseWindow(EditWindow);
  if (error<4) DisposeObject(ArrowPointer);
  if (error<5) DisposeObject(CrossPointer);
  if (error<6) CloseScreen(MorphScreen);
  if (error<7) CloseLibrary(GfxBase);
  if (error<8) CloseFont(NFont);
  if (error<9) CloseLibrary(IntuitionBase);
  if (error<10) CloseLibrary(DiskfontBase);
  if (error<11) FreeVec(Slider);
  if (error<12) CloseLibrary(AslBase);
  if (error<13) CloseLibrary(DataTypesBase);
}

/*----------------------------------------------------------------------------*/

/* End of Text */
