/*
*
*
*     IFSout.h - Header file for the Iterated Function System
*                uses IFS to create a IFS-Construction Image
*     Released to the Public Domain - 1990 The Software Glen Company
*
*
*/

#include <stdio.h>
#include <exec/libraries.h>
#include <graphics/display.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <math.h>
#include <limits.h>

UBYTE stxt[NUMSTRS][GSTRLEN];          /* For the String Gadget Text    */

struct   GfxBase       *GfxBase;       /* Export the library pointers   */
struct   IntuitionBase *IntuitionBase;
struct   RastPort      *rp;            /* Graphics structures           */
struct   ViewPort      *vp;

struct TextAttr StdFont = {
       "topaz.font",                   /* Standard system font */
       8,    0,    0
};

struct   Window        *w, *adjwin;    /* Intuition structures        */ 
struct   Screen        *screen;
struct   IntuiMessage  *message;

struct Gadget gads[NUMGADS];       

struct Image PImages[NUMPROPS];        /* dummy AUTOKNOB Images are required */
struct PropInfo PInfos[NUMPROPS];      /* These get copies of TPropInfo  */

struct StringInfo SInfo[NUMSTRS];

struct IntuiText StrngText[NUMSTRS]  = {
      {2, 0, JAM2, -30, 0, NULL, "WN= ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "A = ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "B = ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "C = ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "D = ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "E = ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "F = ", NULL},
      {2, 0, JAM2, -30, 0, NULL, "% = ", NULL}
};

struct IntuiText MenuItemText[3][7] = {
   {
      {0, 1, JAM2, 0, 0, NULL, "About...", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Save IFS", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Get  IFS", NULL},
      {0, 1, JAM2, 0, 0, NULL, "To WB   ", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Quit    ", NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
   },

   {   
      {0, 1, JAM2, 0, 0, NULL, "Zoom to Fit  ", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Zoom Out X 2 ", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Adjust Func  ", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Add Another  ", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Erase Current", NULL},
      {0, 1, JAM2, 0, 0, NULL, "Erase All    ", NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
   },
   
   {
      {0, 1, JAM2, CHECKWIDTH, 0, NULL, "Boxes  ", NULL},
      {0, 1, JAM2, CHECKWIDTH, 0, NULL, "Numbers", NULL},
      {0, 1, JAM2, CHECKWIDTH, 0, NULL, "Pause  ", NULL},
      {0, 1, JAM2, CHECKWIDTH, 0, NULL, "BlkGrnd", NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
   }
};

struct MenuItem MenuItem[3][7] = {
   {
      {&MenuItem[0][1], 0,  0, 64, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[0][0], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[0][2], 0, 20, 64, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[0][1], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[0][3], 0, 40, 64, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP,
          0, (APTR)&MenuItemText[0][2], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[0][4], 0, 60, 64, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP,
          0, (APTR)&MenuItemText[0][3], NULL, NULL, NULL, 0xFFFF},
      {NULL,            0, 80, 64, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP,
          0, (APTR)&MenuItemText[0][4], NULL, NULL, NULL, 0xFFFF},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
      },
   {
      {&MenuItem[1][1], 0,  0, 104, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[1][0], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[1][2], 0, 20, 104, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[1][1], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[1][3], 0, 40, 104, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[1][2], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[1][4], 0, 60, 104, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[1][3], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[1][5], 0, 80, 104, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[1][4], NULL, NULL, NULL, 0xFFFF},
      {NULL,            0,100, 104, 10, ITEMTEXT|ITEMENABLED|HIGHCOMP, 
          0, (APTR)&MenuItemText[1][5], NULL, NULL, NULL, 0xFFFF},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}

      },
      
      {
      {&MenuItem[2][1], 0,  0, 56+CHECKWIDTH, 10, 
        ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|MENUTOGGLE,
          0, (APTR)&MenuItemText[2][0], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[2][2], 0, 20, 56+CHECKWIDTH, 10, 
        ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|CHECKED|MENUTOGGLE, 
          0, (APTR)&MenuItemText[2][1], NULL, NULL, NULL, 0xFFFF},
      {&MenuItem[2][3], 0, 40, 56+CHECKWIDTH, 10, 
        ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|MENUTOGGLE, 
          0, (APTR)&MenuItemText[2][2], NULL, NULL, NULL, 0xFFFF},
      {NULL,            0, 60, 56+CHECKWIDTH, 10, 
        ITEMTEXT|ITEMENABLED|HIGHCOMP|CHECKIT|CHECKED|MENUTOGGLE,
          0, (APTR)&MenuItemText[2][3], NULL, NULL, NULL, 0xFFFF},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
      {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
      }
   };


struct Menu Menu[3] = {
   {&Menu[1],   0,  0, 60,  0, MENUENABLED, "Project", &MenuItem[0][0]},
   {&Menu[2],  81,  0, 76,  0, MENUENABLED, "Functions", &MenuItem[1][0]},
   {NULL,     171,  0, 60,  0, MENUENABLED, "Control", &MenuItem[2][0]}
   };


struct PropInfo TPropInfo = {
   AUTOKNOB | FREEHORIZ,  /* Flags */
   0, 0,            /* Pots:  Horiz, Vert: both start at 0 */
   0x00D4, 0x00D4,  /* Bodies: Horiz is 1/300, Vert is 1/300 */
   0, 0, 0, 0, 0, 0 /* System usage stuff */
};


/* this is the template for the Gadget of a horizonal */
/* Proportional Gadget */

struct Gadget TPropGadget = {
   NULL,                      /* pointer to NextGadget      */
   110, GADSIZE, (WIDTH/4), GADSIZE,  /* Select Box L T W H         */
   GADGHCOMP,                 /* Flags                      */
   GADGIMMEDIATE | RELVERIFY | FOLLOWMOUSE,   /* Activation flags           */
   PROPGADGET,                /* Type                       */
   NULL,                      /* pointer to Image filled in later */
   NULL,                      /* no pointer to SelectRender filled later    */
   NULL,                      /* no pointer to GadgetText   */
   0,                         /* no MutualExclude           */
   NULL,                      /* SpecialInfo proportional data filled later */
   0,                         /* no ID                      */
   NULL                       /* no pointer to special data */
};

struct Gadget ZoomGadget = {
   NULL,                      /* pointer to NextGadget      */
   340, (2*GADSIZE), (2*GADSIZE), 80,  /* Select Box L T W H        	*/
   GADGHCOMP,                 /* Flags                      */
   GADGIMMEDIATE | RELVERIFY | FOLLOWMOUSE,   /* Activation flags 	*/
   PROPGADGET,                /* Type                       */
   NULL,                      /* pointer to Image filled in later */
   NULL,                      /* no pointer to SelectRender */
   NULL,                      /* no pointer to GadgetText   */
   0,                         /* no MutualExclude           */
   NULL,                      /* SpecialInfo proportional filled in later*/
   0,                         /* no ID                      */
   NULL                       /* no pointer to special data */
};

struct Gadget CenterGadget = {
   NULL,                      /* pointer to NextGadget      */
   440, GADSIZE*2, (WIDTH/4), 80,  /* Select Box L T W H         */
   GADGHCOMP,                 /* Flags                      */
   GADGIMMEDIATE | RELVERIFY | FOLLOWMOUSE,   /* Activation flags           */
   PROPGADGET,                /* Type                       */
   NULL,                      /* pointer to Image filled in later */
   NULL,                      /* no pointer to SelectRender */
   NULL,                      /* no pointer to GadgetText   */
   0,                         /* no MutualExclude           */
   NULL,                      /* SpecialInfo proportional filled in later*/
   0,                         /* no ID                      */
   NULL                       /* no pointer to special data */
};

struct Gadget TStrngGadget = {
   NULL,                      /* pointer to NextGadget      */
   40, GADSIZE, 50, GADSIZE,  /* Select Box L T W H         */
   GADGHCOMP,                 /* Flags                      */
   RELVERIFY | ENDGADGET,     /* Activation flags           */
   STRGADGET,                 /* Type                       */
   NULL,                      /* pointer to Image filled in later */
   NULL,                      /* no pointer to SelectRender filled later    */
   NULL,                      /* no pointer to GadgetText   */
   0,                         /* no MutualExclude           */
   NULL,                      /* SpecialInfo proportional data filled later */
   0,                         /* no ID                      */
   NULL                       /* no pointer to special data filled in later*/
};

/* This is the text for the About requester */
#define TXT01   ""
#define TXT02   "         AMIGA IFSOUT V1.5"
#define TXT03   "Public Domain by Software Glen Co."
#define TXT04   "An Iterated Function System Viewer"
#define TXT05   ""
#define TXT06   "I would be interested in any new &"
#define TXT07   "interesting functions you find.   "
#define TXT08   ""
#define TXT09   " Glen Fullmer"
#define TXT10   " email fullmer@alfalfa.sps.mot.com"
#define TXT11   ""
#define TXT12   ""
#define TXT13	"Algorithm from FRACTALS EVERYWHERE"
#define TXT14 	"               by Michael Barnsley"

struct IntuiText ReqText14 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   133,          /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT14,
   NULL          /* next */
};
struct IntuiText ReqText13 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   123,          /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT13,
   &ReqText14    /* next */
};
struct IntuiText ReqText12 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   113,          /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT12,
   &ReqText13    /* next */
};
struct IntuiText ReqText11 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   103,          /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT11,
   &ReqText12    /* next */
};
struct IntuiText ReqText10 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   93,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT10,
   &ReqText11    /* next */
};
struct IntuiText ReqText9 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   83,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT09,
   &ReqText10    /* next */
};
struct IntuiText ReqText8 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   73,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT08,
   &ReqText9     /* next */
};
struct IntuiText ReqText7 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   63,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT07,
   &ReqText8     /* next */
};
struct IntuiText ReqText6 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   53,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT06,
   &ReqText7     /* next */
};
struct IntuiText ReqText5 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   43,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT05,
   &ReqText6     /* next */
};
struct IntuiText ReqText4 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   33,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT04,
   &ReqText5     /* next */
};
struct IntuiText ReqText3 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   23,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT03,
   &ReqText4     /* next */
};
struct IntuiText ReqText2 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   13,           /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT02,
   &ReqText3     /* next */
};
struct IntuiText ReqText1 = {
   0,            /* Front Pen */
   1,            /* Back pen */
   JAM2,         /* Draw Mode */
   5,            /* Left Edge */
   3,            /* Top */
   &StdFont,     /* pointer to TextFont */
   TXT01,
   &ReqText2     /* next */
};


struct IntuiText OKIText = {
   0, 1      , /* FrontPen, BackPen */
   JAM2,       /* DrawMode */
   6, 3,       /* LeftEdge, TopEdge (relative to gadget) */
   &StdFont,   /* pointer to TextFont */
   "OK",       /* pointer to Text */
   NULL        /* no pointer to NextText */
};


struct   NewScreen ns = {
   0, 0,                               /* start position                */
   640, 400, 4,                        /* width, height, depth          */
   0, 1,                               /* detail pen, block pen         */
   HIRES|INTERLACE,                    /* Normal ViewMode               */
   CUSTOMSCREEN,                       /* screen type                   */
   &StdFont,                           /* font to use                   */
   SCREENTITLE,                        /* default title for screen      */
   NULL                                /* pointer to additional gadgets */
};

struct NewWindow nw = {
   0, 0,                               /* start position                */
   WIDTH, HEIGHT,                      /* width, height                 */
   -1, -1,                             /* detail pen, block pen         */
   CLOSEWINDOW|MOUSEBUTTONS|MENUPICK|INTUITICKS,  /* IDCMP flags        */
                                       /* Window flags*/
   WINDOWCLOSE|ACTIVATE|BORDERLESS|SMART_REFRESH|NOCAREREFRESH,
   NULL,                               /* Pointer to FirstGadget        */
   NULL,                               /* pointer to user checkmark     */
   NULL,                               /* window title                  */
   NULL,                               /* pointer to screen (set below) */
   NULL,                               /* pointer to superbitmap        */
   0, 0, 640, 373,                     /* ignored since not sizeable    */
   CUSTOMSCREEN                        /* type of screen desired        */
};

struct NewWindow nadjwin = {
   0, 20,                              /* start position                */
   WIDTH,(((NUMPROPS-2) * GADSIZE)+30),/* width, height                 */
   2,1,                                /* detail pen, block pen         */
   CLOSEWINDOW | GADGETUP,             /* IDCMP flags        */
   WINDOWCLOSE|WINDOWDRAG|SMART_REFRESH|NOCAREREFRESH, /* window flags */
   &gads[NUMGADS-1],                   /* Pointer to FirstGadget        */
   NULL,                               /* pointer to user checkmark     */
   "Coefficients      Adjust              Zoom              Reposition        ",/* window title                  */
   NULL,                               /* pointer to screen (set below) */
   NULL,                               /* pointer to superbitmap        */
   0, 0, 0, 0,                         /* ignored since not sizeable    */
   CUSTOMSCREEN                        /* type of screen desired        */

};
