#include <iffp/ilbmapp.h>
#include <sc:projects/vector_editor/VectorEd.c> // The GUI Window Set-uP.
#include <stdio.h>                             // Lets Follow Tradition
#include <clib/dos_protos.h>                  // I Want To Use WORD's!!
#include <clib/asl_protos.h>                 // Requesters Are Great Things!

/*********************************************************************/
/*             Here Are The Global Definitions                       */
/*********************************************************************/
 
WORD    Load[2],                     // The Loading Buffers
        Screen[200],                //Screen Drawing Aid!
        Main[2000],
        StartPoints[2],            // Two Points To Help With the Move
        Store[2],                 // The Last Two Points That Were Used
        Last[4];                 // Something Esle

int     CurrentPoint=0,           // The Current Point Number
        TotalPoints=0;           // The Total Number of Points

BOOL    Changed=FALSE,
        backdrop=FALSE;

FILE    *SampleOutput;          // The First Sample Output File
struct  Library *IFFParseBase   = NULL;
struct  ILBMInfo  *ilbm;

LONG    ilbmprops[] =
                {
                ID_ILBM, ID_BMHD,
                ID_ILBM, ID_CMAP,
                ID_ILBM, ID_CAMG,
                ID_ILBM, ID_CCRT,
                ID_ILBM, ID_AUTH,
                ID_ILBM, ID_Copyright,
                TAG_DONE
                };
LONG    ilbmcollects[] =
                {
                ID_ILBM, ID_CRNG,
                TAG_DONE
                };

LONG    ilbmstops[] =
                {
                ID_ILBM, ID_BODY,
                TAG_DONE
                };

UWORD Colours [] =  { 
                      0xAAA, 0x000, 0xFFF,
                      0x68B, 0x999, 0xF00,
                      0x0F0, 0x00F
                    };

/*******************************************************************/
/*                   Here Are The ProtoTypes                       */
/*******************************************************************/

int  LoadVan( void );                   // Lets Load Some Van Files
void IDCMP_Handler( void );            // The IDCMP Handler for the GUI
void Cls( void );                     // Clear The screen Anyone?
void Cls2( void);
void Cls3( void );
void Preview( void );
void SaveVan( void );                // Save Our VAN File Thingy   
void cleanup(void);                 // Kill Our IFF Thingy      

/*******************************************************************/
/*                 Main Program Start Here                         */
/*******************************************************************/

main()
{
    
    SetupScreen();                                      // Set Up Our Custom 
    ShowTitle(Scr,FALSE);                              // Hide The Title 
    OpenBackgroundWindow();                           // Open The Debug 
    OpenDebug_StatsWindow();                         // Open Our Main Draw
    Cls2();                                          // Clear The Screen
    IDCMP_Handler();                               // Wait For User Input
    CloseDebug_StatsWindow();                    // Kill The Status Window
    CloseBackgroundWindow();                    // Kill The Main Window
    CloseDownScreen();                         // Kill The Main Screen

}

/*********************************************************************/
/*               Lets Clear The Drawing Area!                        */
/*********************************************************************/

void Cls( void)
{
   SetAPen(BackgroundWnd->RPort,0);
   SetDrMd(BackgroundWnd->RPort,JAM1);
   RectFill(BackgroundWnd->RPort,1,1,511,253);
   SetDrMd(BackgroundWnd->RPort,COMPLEMENT);
}
void Cls2( void)
{
    SetAPen(BackgroundWnd->RPort,1);
    SetBPen(BackgroundWnd->RPort,1);
    RectFill(BackgroundWnd->RPort,1,1,511,253);
}

void Cls3( void)
{
        SetAPen(BackgroundWnd->RPort,0);
        SetBPen(BackgroundWnd->RPort,0);
        RectFill(BackgroundWnd->RPort,1,1,511,253);
}
void LoadILBM( void )
{

UBYTE ilbmname[200];
struct FileRequester *Requester;
struct EasyStruct To_Deep =
{
     sizeof (struct EasyStruct),
     0,
     "Error Message",
     "This Program Only Uses 1 Bitplane Bitmaps!",
     "Ok",
};  

struct EasyStruct To_Big =
{
       sizeof (struct EasyStruct),
       0,
       "Error Message",
       "This Program Only Uses Bitmaps of 256 x 512\n" 
       "or Less!. Try Scaling It With ADPRO.",
       "Ok",
};        

 struct TagItem MyTags[4];
 MyTags[0].ti_Tag=ASL_Hail;
 MyTags[0].ti_Data=(unsigned long)"Please Select An IFF Image\0";
 MyTags[1].ti_Tag=ASL_Window;
 MyTags[1].ti_Data=(unsigned long)BackgroundWnd;
 MyTags[2].ti_Tag=ASL_Dir;
 MyTags[2].ti_Data=(unsigned long)"work:\0";
 MyTags[3].ti_Tag=TAG_DONE;   
 Requester = AllocAslRequest(ASL_FileRequest,MyTags);
 if(!AslRequest(Requester,NULL))
    {
     DisplayBeep(0);
    }
   strcpy(ilbmname,Requester->fr_Drawer);
   strcat(ilbmname,"/");    
   strcat(ilbmname,Requester->fr_File);   
   IFFParseBase = OpenLibrary("iffparse.library",0);
ilbm = (struct ILBMInfo *)AllocMem(sizeof(struct ILBMInfo),MEMF_PUBLIC|MEMF_CLEAR);

    ilbm->ParseInfo.propchks    = ilbmprops;     //Stick In The THings
    ilbm->ParseInfo.collectchks = ilbmcollects; //To Our ILBM 
    ilbm->ParseInfo.stopchks    = ilbmstops;   //Structure!
    ilbm->windef        = (struct NewWindow *)BackgroundWnd;  
    ilbm->ParseInfo.iff = AllocIFF();
    backdrop=TRUE;                                            

        queryilbm(ilbm,ilbmname);
        if(ilbm->Bmhd.nPlanes<2 && ilbm->Bmhd.w<=512 && ilbm->Bmhd.h<=256)
           {
        ilbm->scr       = Scr;
        ilbm->win       = BackgroundWnd;
        ilbm->wrp       = BackgroundWnd->RPort;
        ilbm->srp       = &Scr->RastPort;
        ilbm->vp        = &Scr->ViewPort;
                Cls2();
                loadilbm(ilbm, ilbmname);
                LoadRGB4(&Scr->ViewPort, Colours,8);
                Cls3();
            }
       if(ilbm->Bmhd.nPlanes>1)
        {       
            EasyRequest( BackgroundWnd, &To_Deep, 0, 0 );
        }
        if(ilbm->Bmhd.w>512 || ilbm->Bmhd.h>256 )
        {
            EasyRequest( BackgroundWnd, &To_Big, 0, 0 );
        }
                closeifile((struct ParseInfo *)ilbm);
                unloadilbm(ilbm);       
}

void cleanup()
   {
   if(ilbm)
        {
        if(ilbm->ParseInfo.iff)
           {
             FreeIFF(ilbm->ParseInfo.iff);
           }
        FreeMem(ilbm,sizeof(struct ILBMInfo));
        }
   if(IFFParseBase)     CloseLibrary(IFFParseBase);
   }

/*******************************************************************/
/*            Right Onto Saving The Vector                         */
/*******************************************************************/


void Preview( void )
{
    int x;
        SampleOutput = fopen("T:Temp.Van","w+b");
       CurrentPoint=0;
       fputc(Load[0]/2,SampleOutput);
       fputc(Load[1],SampleOutput);

while(CurrentPoint!=TotalPoints)
{
       fputc(Main[x]/2,SampleOutput);
       fputc(Main[x+1],SampleOutput);
       CurrentPoint++;    
       x=x+2;
}
  fputc(255,SampleOutput);
  fputc(255,SampleOutput);
  fputc(255,SampleOutput);
  fputc(255,SampleOutput);
  fclose(SampleOutput);
  Execute("c:ViewVector >nil:",0,0);
  Execute("Delete T:Temp.van >nil:",0,0);
}
void SaveVan(void)
{
  
struct FileRequester *Requester;
struct TagItem MyTags[4];
        
        char    File_Name[200];
int     x=0;
MyTags[0].ti_Tag=ASL_Hail;
MyTags[0].ti_Data=(unsigned long)"Please Type Save File Name\0";
MyTags[1].ti_Tag=ASL_Window;
MyTags[1].ti_Data=(unsigned long)BackgroundWnd;
MyTags[2].ti_Tag=ASL_Dir;
MyTags[2].ti_Data=(unsigned long)"Vectors:\0";
MyTags[3].ti_Tag=TAG_DONE;

Requester = AllocAslRequest(ASL_FileRequest,MyTags);
if(!AslRequest(Requester,NULL))
        {
            DisplayBeep(0);
        }

        strcpy(File_Name,Requester->fr_Drawer);
        strcat(File_Name,"");
        strcat(File_Name,Requester->fr_File);

        SampleOutput = fopen(File_Name,"w+b");
       CurrentPoint=0;
       fputc(Load[0]/2,SampleOutput);
       fputc(Load[1],SampleOutput);

while(CurrentPoint!=TotalPoints)
{
       fputc(Main[x]/2,SampleOutput);
       fputc(Main[x+1],SampleOutput);
       CurrentPoint++;    
       x=x+2;
}
  fputc(255,SampleOutput);
  fputc(255,SampleOutput);
  fputc(255,SampleOutput);
  fputc(255,SampleOutput);
  fclose(SampleOutput);
      }  
/***************************************************************/
/*                 HUGE IDCMP Handler For All Events           */
/***************************************************************/

void IDCMP_Handler( void )
{
    
 struct IntuiMessage *imsg;                       // For The BackGround WinD
 struct MenuItem         *n;
 struct EasyStruct AboutPage =                  // This is My ABOUT Requester
 {
        sizeof (struct EasyStruct),
        0,
       "Information",
       "Main Keys\n"
       "\n"
       "9     - Hides/Shows The Title bar        \n"
       "0     - Hides/Shows The ToolBox          \n"
       "8     - Hides/Shows The Status Window    \n"
       "a     - Loads A Backdrop Picture In.     \n"
       "q     - CLS just now                     \n" 
       "\n\nThis Was Written For Big Time By Cray-1",
       "Totaly PopTastic!",
};


struct EasyStruct Quit_No_Yes =
{
        sizeof (struct EasyStruct),
        0,
        "Vector_Editor Information",
        "Are You Sure You Want To Quit?",
        "Yes|No",
};

struct EasyStruct Not_Saved =
{
        sizeof (struct EasyStruct),
        0,
        "Vector_Editor Information",
        "Current Project Not Saved\n"
        "Are You Sure You Want To Load New Project",
        "Discard|Save|Cancel",
};

 int x,                  // The Current X Cord
     y,                 // The Current Y Cord
     xpos,             // The Updating ONLY When Mouse Pressed X Cord
     ypos,            // The Updating ONLY When Mouse Pressed Y Cord 
     clicked=0,      // How Many Times Have We Clicked?
     quit,         // Result Of EasyRequest At  Quit!
     Result;
     
 BOOL   terminated = FALSE,          // Is The Window Closed?
        ButtonDown = FALSE,         // Is The Mouse Button Pressed?
        first = TRUE,              // Is This The First Press?
        TitleUp = FALSE,          // Is The Title Bar Showing?
        ToolBoxUp = FALSE,       // Is The ToolBox Showing?
        StatShow = TRUE;        // Is The StatusBox Showing?


while(!terminated)
{
Wait(1 <<BackgroundWnd->UserPort->mp_SigBit);     
while((!terminated) && (imsg = GT_GetIMsg(BackgroundWnd->UserPort)))
      {    
        switch(imsg->Class) /* Types of IDCMP Messages */
         {                                            
          case IDCMP_GADGETUP:
               break;
                                                     
          case IDCMP_REFRESHWINDOW:
                GT_BeginRefresh(BackgroundWnd);
                GT_EndRefresh(BackgroundWnd,TRUE);
               break;

/*************************************************************************
*                   What Happens When The Mouse Moves                    *
*************************************************************************/

          case IDCMP_MOUSEMOVE:
                xpos=imsg->MouseX;
                ypos=imsg->MouseY;
                if(ButtonDown)
                  {
                    x=imsg->MouseX;
                    y=imsg->MouseY;
                    if(!backdrop) SetAPen(BackgroundWnd->RPort,0);
                    if(backdrop) SetAPen(BackgroundWnd->RPort,0);
                    Move(BackgroundWnd->RPort,Last[0],Last[1]); 
                    SetDrMd(BackgroundWnd->RPort,COMPLEMENT);  
                    Draw(BackgroundWnd->RPort,Last[2],Last[3]);  
                    if(!backdrop) SetAPen(BackgroundWnd->RPort,1);
                    if(backdrop) SetAPen(BackgroundWnd->RPort,5);
                    Move(BackgroundWnd->RPort,Store[0],Store[1]); 
                    SetDrMd(BackgroundWnd->RPort,COMPLEMENT); 
                    Draw(BackgroundWnd->RPort,x,y);     
                    
                    Last[0]=Store[0];     //Move Last Line Drawen Into Last
                    Last[1]=Store[1];    //Buffer To Be Cleared Away.
                    Last[2]=x;
                    Last[3]=y;
                    
                   }
                if(StatShow)
                 {
                  GT_SetGadgetAttrs(Debug_StatsGadgets[0],
                                    Debug_StatsWnd, NULL,
                                    GTNM_Number,imsg->MouseX/2,
                                    TAG_END);

                  GT_SetGadgetAttrs(Debug_StatsGadgets[1],
                                    Debug_StatsWnd, NULL,
                                    GTNM_Number,imsg->MouseY,
                                    TAG_END);                               
                 }             
                break;  

/************************************************************************
*                When A Button Of Some Kind Is Pressed                  *
************************************************************************/
             
          case IDCMP_MOUSEBUTTONS:
                switch(imsg->Code) /* Switch For Mouse Buttons */
                 {

/************************************************************************
*                     The LEFT Button Is Now Down                       *
************************************************************************/

                  case SELECTDOWN:
                        ButtonDown=TRUE; 
                        if(first)
                         {
                          Changed=TRUE;
                          Store[0]=xpos;   //Store The Xpos For The Ftime
                          Store[1]=ypos;  //Store The Ypos For The First
                          Load[0]=xpos;
                          Load[1]=ypos;
                          Main[CurrentPoint]=xpos;            //Update buffer
                          Main[CurrentPoint+1]=ypos;         //Update Buffer
                          TotalPoints++;                    //Update Buffer
                          CurrentPoint=CurrentPoint+2;     //Update Buffer
                          
                          Move(BackgroundWnd->RPort,Store[0],Store[1]);  
                          break;
                        }
                        if(!first) 
                         { 
                          Screen[clicked]=x;      //Place Where Last Line
                          Screen[clicked+1]=y;   //Place Where Last Line
                          Store[0]=x;           //Store Where The Last 
                          Store[1]=y;          //Store Where The Last Line  
                          clicked=clicked+2;
                         } 
                       break;

/************************************************************************
*                The Left Mouse Button Is Now Back Up                   *
************************************************************************/
                    
                  case SELECTUP:
                        Last[0]=0;
                        Last[1]=0;
                        Last[2]=0;
                        Last[3]=0;
                        ButtonDown=FALSE;
                        first=FALSE;
              
                        Main[CurrentPoint]=x;
                        Main[CurrentPoint+1]=y;
                        TotalPoints++;
                        CurrentPoint=CurrentPoint+2;                             
                         
                       break;
                 }
                break;

/************************************************************************
*                      KeyBoard Input Detected                          *
************************************************************************/
                               
          case IDCMP_VANILLAKEY:
                switch(imsg->Code) /* Switch For KeyCodes */
                 {

             /**********************************************
             *                    "8"                      *
             **********************************************/

                   case    57:
                            if(TitleUp)
                             {
                              ShowTitle(Scr,FALSE);
                              TitleUp=FALSE;
                              break;
                             }
                            if(!TitleUp)
                             {
                              ShowTitle(Scr,TRUE);
                              TitleUp=TRUE;
                              break;
                             }

             /**********************************************
             *                    "9"                      *
             **********************************************/
                                 
                   case  56:
                          if(StatShow)
                           {
                            CloseDebug_StatsWindow();
                            StatShow=FALSE;
                            break;
                           }

                          if(!StatShow)
                           {
                            OpenDebug_StatsWindow();
                            StatShow=TRUE;
                            break;
                           }

             /**********************************************
             *                    "0"                      *
             **********************************************/       

                   case 48:
                        break;

             /**********************************************
             *                    "w"                      *
             **********************************************/           

                   case 119:
                       break;

             /**********************************************
             *                    "q"                      *
             **********************************************/

                   case 113:
                       Cls();
                       break;
                       
             /**********************************************
             *                    "+"                      *
             **********************************************/
                
                case    61:

                        
             /**********************************************
             *                    "a"                      *
             **********************************************/
             
                 case      97:
                         LoadILBM();
                         
                         break;

             /**********************************************
             *                    "-"                      *
             **********************************************/                
              case      45:
                        Cls();
                        SetAPen(BackgroundWnd->RPort,3);                     
                        break;
              
                 } //End of First Switch!!!
                break;

/************************************************************************
*                       Window Is Now Inactive                          *
************************************************************************/
                        
        case IDCMP_INACTIVEWINDOW:
               ActivateWindow(BackgroundWnd);
     
/* Right This Line Will Really Pissoff Anyone That Tries To MultiTask While\ Using ThisIn Finished Version it will be activated on a IDCMP_ACTIVEWINDOW ..but I would have to do it for all windows and cant be bothered just now! :-)
*/
          
               break;         
                                             
/************************************************************************
*                        Menu is Now Being Used                         *
************************************************************************/


          case IDCMP_MENUPICK:
                if(StatShow)
                 {
                  GT_SetGadgetAttrs(Debug_StatsGadgets[7],
                  Debug_StatsWnd, NULL,
                  GTNM_Number,imsg->Code,
                  TAG_END);
                 }
                switch(imsg->Code) /* Switch For Menu Codes */
                 {

        /**************************************************
        *                    QUIT                         *
        **************************************************/

                  case 63680:
                     quit =  EasyRequest( BackgroundWnd, &Quit_No_Yes, 0, 0);
                     if(quit==1)terminated=TRUE;  // User Responded With YES
                     if(quit==0)DisplayBeep(0);  // User Responded With NO
                      break;

        /**************************************************
        *               About / Information               *
        **************************************************/                            

                  case 63488:
                       EasyRequest( BackgroundWnd, &AboutPage, 0, 0 );
                       break;

        /**************************************************
        *            Load BigTime Van File                *
        **************************************************/                                   

                case    4161:
                        //BT Word File
                        break;
                        
                case    101:
                        //Cobra V File
                        break;
                        
                               
                  case 65:
                if(Changed)
                   {
                Result = EasyRequest( BackgroundWnd, &Not_Saved, 0, 0);
                   if(Result==2) // BUTTON 2
                      {
                      SaveVan();
                      }
                   if(Result==1)  //BUTTON 1
                      {
                       Changed=FALSE;
                       LoadVan();
                       break;
                      }
                   if(Result==0) //BUTTON 3
                      {
                       Changed=TRUE;
                       break;
                      }
                   }
                if(!Changed)
                   {
                   LoadVan();
                   break;
                   }
                                    
        /**************************************************
        *           Load Corba Access File                *
        **************************************************/

                  case 63489:
                       LoadILBM();
                       break;
                 
                  case 63552:
                       //autotrace
                       break;
        /**************************************************
        *           Save Big Time Van File                *
        **************************************************/                                    

                        case 2177:
                        //save word van!
                        break;
                        
                  case 129:
                       SaveVan();
                       break;

        /**************************************************
        *           Save Cobra Access V File              *
        **************************************************/                                    

                  case 6:
                       break;

        /**************************************************
        *               Show ToolBox Window               *
        **************************************************/                                    

                  case 7:
                       break;

        /**************************************************
        *           Show Debug Status Thingy              *
        **************************************************/                                   

                  case 8:
                       break;
        /**************************************************
        *           View A Preview Of Animation           *
        **************************************************/

                  case 63616:
                       Preview();
                    // Jump To ASm Code!
                       break;                                    

                 }
               break;

/************************************************************************
*     Even Though There isnt One, Clicked On The Close Window Gadget    *
************************************************************************/                                

          case IDCMP_CLOSEWINDOW:
                terminated=TRUE;
               break;
               
            }/* End of MAIN IDCMP Switch!!! */
       GT_ReplyIMsg(imsg);
          }
     }
    }

/***************************************************************************************************/
/*                                  For Loading VAN Files Into Memory                              */
/***************************************************************************************************/
 
int LoadVan( void )
{
   char File_Name[200];
   
   WORD           FirstByte,
                  SecondByte;
        
   BOOL        First=TRUE,
               dead=FALSE;
         
   struct FileRequester *Requester;
   struct TagItem MyTags[4];
   
   FILE         *Open_Van;
   
  // TotalFrames=0; //
   backdrop=FALSE; 
   MyTags[0].ti_Tag=ASL_Hail;
   MyTags[0].ti_Data=(unsigned long)"Please Select Van For Loading.\0";
   MyTags[1].ti_Tag=ASL_Window;
   MyTags[1].ti_Data=(unsigned long)BackgroundWnd;
   MyTags[2].ti_Tag=ASL_Dir;
   MyTags[2].ti_Data=(unsigned long)"Vectors:\0";
   MyTags[3].ti_Tag=TAG_DONE;
   
   Requester = AllocAslRequest(ASL_FileRequest,MyTags);
   if(!AslRequest(Requester,NULL))
           {
               DisplayBeep(0);
           }

   strcpy(File_Name,Requester->fr_Drawer);
   strcat(File_Name,""); // Really Have To Take The Time And Remove Usless Crap Like This!
   strcat(File_Name,Requester->fr_File);

   Open_Van = fopen(File_Name,"rb");
    if(Open_Van==0)
    {
        DisplayBeep(0);
        dead=TRUE;
    }
 CurrentPoint=0;
 TotalPoints=0;
while(!dead)
{
    
    FirstByte = fgetc(Open_Van);
    SecondByte = fgetc(Open_Van);
    
 if(SecondByte==255 && FirstByte==255)   
    {                                     
     dead=TRUE;
     break;
    }    
 if(First)
  {
    Load[0]=FirstByte*2;
    Load[1]=SecondByte;
  }
 if(!First)
  {
    Main[CurrentPoint]=FirstByte*2;    
    Main[CurrentPoint+1]=SecondByte;
   TotalPoints++;
   CurrentPoint=CurrentPoint+2;
  } 
  First=FALSE;
}
   Cls2();
   SetAPen(BackgroundWnd->RPort,6);
   Move(BackgroundWnd->RPort,Load[0],Load[1]);
   PolyDraw(BackgroundWnd->RPort,TotalPoints,Main); 
   return(0);
}