/************************************************************************
*  Version 3.00  MANDELBROT - Self-Squared Dragon Generator  29-May-86  *
*  Commodore Amiga             The Constants                    MAND.H  *
*************************************************************************
*         Copyright (c) 1986, Robert S. French and R. J. Mical          *
* --------------------------------------------------------------------- *
*  This program has been placed in the public domain.  A limited        *
*  license is hereby granted for the unlimited use and distribution of  *
*  this program, provided it is not used for commercial or profit-      *
*  making purposes.  Thank you.                                         *
*************************************************************************
*  Author information:            | Name:   R. J. Mical                 *
*                                 | USnail: Commodore-Amiga, Inc.       *
*  Name:   Robert S. French       |         983 University Avenue       *
*  USnail: 2740 Frankfort Avenue  |         Los Gatos, CA  95030        *
*          Louisville, KY  40206  \-------------------------------------*
*  Phone:  (502) 897-5096              UUCP: ihnp4!ptsfa!well!french    *
*  ARPA:   French#Robert%d@LLL-MFE or RFrench@MIT-MULTICS               *
*************************************************************************
*  Please send any comments, suggestions, or bugs to one of the above   *
*  addresses.                                                           *
************************************************************************/

/*-------------------*/
/* Lots of includes! */

#include <exec/types.h>
#include <exec/tasks.h>
#include <exec/libraries.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <devices/keymap.h>
#include <devices/printer.h>
#include <graphics/copper.h>
#include <graphics/display.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <graphics/view.h>
#include <graphics/gels.h>
#include <graphics/regions.h>
#include <hardware/blit.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <ctype.h>
#include <stdio.h>
#include <libraries/dos.h>
#include <workbench/workbench.h>

/* One of these MUST be defined! */

#define MANX
/*
#define LATTICE
*/

/* Define for double precision (slow!) */

/*
#define DOUBLEPREC
*/

/*-------------------*/
/* Misc. definitions */

#define VERSION "3.00"
#define MOD_DATE "May 29, 1986"
#define TEMPNAME "Mandelbrot.temp.file"
#define HELPNAME "Mandelbrot_help"

#define EVER ;;
#define MAXX 640
#define MAXY 400
#define MAXMY 100
#define STARTY 0
#define PROCESS_STACKSIZE 6000

#ifdef DOUBLEPREC

#define FLOATSTRUCT double
#define CNVFLT(x) (x)
#define MAKEFP(x) (x)
#define FP(x) (x)
#define FIEEE(x) (double)(x)
#define ADD(x,y) ((x)+(y))
#define SUB(x,y) ((y)-(x))
#define MUL(x,y) ((x)*(y))
#define DIV(x,y) ((y)/(x))
#define FLT(x) (double)(x)
#define FIX(x) (int)(x)
#define CNVSNG(x) (float)(x)

#ifdef LATTICE
#define PERCFLT "%16.14lf"
#endif
#ifdef MANX
#define PERCFLT "%f"
#endif

#else

#define FLOATSTRUCT union kludge
#define CNVFLT(x) cnvf(x)
#define MAKEFP(x) x.i
#define FP(x) x.f
#define FIEEE(x) SPFieee(x)
#define ADD(x,y) SPAdd(x,y)
#define SUB(x,y) SPSub(x,y)
#define MUL(x,y) SPMul(x,y)
#define DIV(x,y) SPDiv(x,y)
#define FLT(x) SPFlt(x)
#define FIX(x) SPFix(x)
#define CNVSNG(x) (x)
#define PERCFLT "%8.6f"

/*---------------------------------*/
/* Fast-Floating-Point Definitions */

extern   int     SPFix();
extern   int     SPFlt();
extern   int     SPCmp();
extern   int     SPTst();
extern   int     SPAbs();
extern   int     SPNeg();
extern   int     SPAdd();
extern   int     SPSub();
extern   int     SPMul();
extern   int     SPDiv();
 
extern   int     SPAtan();
extern   int     SPSin();
extern   int     SPCos();
extern   int     SPTan();
extern   int     SPSincos();
extern   int     SPSinh();
extern   int     SPCosh();
extern   int     SPTanh();
extern   int     SPExp();
extern   int     SPLog();
extern   int     SPPow();
extern   int     SPSqrt();
extern   int     SPTieee();
extern   int     SPFieee();

#endif

extern double atof();

#define TOPW2 w2->BorderTop
#define BOTTOMW2 (w2->Height - w2->BorderBottom)
#define LEFTW2 w2->BorderLeft
#define RIGHTW2 (w2->Width - w2->BorderRight)


/* === these definitions are for the color_mode variable ================== */
#define NOT_HOLDANDMODIFY       0x0001
#define INTERLACE_MODE          0x0002
#define HIRES_MODE              0x0004

/* === these definitions are for the menu strips ========================== */
#define ITEM_HEIGHT 10
#define MENU_PROJECT 0  /* first menu */
#define MENU_OPTIONS 1  /* next menu */
#define MENU_ZOOM 2     /* next menu */
#define MENU_COUNT 3

/* for the PROJECT Menu ... */
#define PROJECT_WIDTH   176
#define PROJECT_LEFT    0
#define PROJECT_SAVEPICTURE 0
#define PROJECT_TITLE 1
#define PROJECT_PRINT 2
#define PROJECT_COUNT 3

/* for the OPTIONS Menu ... */
#define OPTIONS_WIDTH   176
#define OPTIONS_LEFT       (-24)
#define OPTIONS_QUARTER 0
#define OPTIONS_FULL    1
#define OPTIONS_REDRAW 2
#define OPTIONS_3D 3

#define OPTIONS_3D_LEFT   130
#define OPTIONS_3D_WIDTH  100
#define OPTIONS_3D_NONE  0
#define OPTIONS_3D_2     1
#define OPTIONS_3D_5     2
#define OPTIONS_3D_10    3
#define OPTIONS_3D_15    4
#define OPTIONS_3D_COUNT 5

#define OPTIONS_GENERATE 4
#define OPTIONS_COLORS 5
#define OPTIONS_ANAL  6

#define OPTIONS_ANAL_LEFT   130
#define OPTIONS_ANAL_WIDTH  100
#define OPTIONS_ANAL_LINES 0
#define OPTIONS_ANAL_DOTS 1
#define OPTIONS_ANAL_COUNT 2

#define OPTIONS_STOP    7
#define OPTIONS_CLOSE   8
#define OPTIONS_COUNT   9

/* for the ZOOM Menu ... */
#define ZOOM_WIDTH   222
#define ZOOM_LEFT       (-60)
#define ZOOM_SETCENTER    0
#define ZOOM_SIZEBOX      1
#define ZOOM_SIZEPROP     2
#define ZOOM_ZOOMIN       3
#define ZOOM_ZOOMIN10     4
#define ZOOM_ZOOMOUT2     5
#define ZOOM_ZOOMOUT10    6
#define ZOOM_COUNT        7

#ifndef INTUITICKS
#define INTUITICKS 0x00400000
#endif

#define COLOR_KNOB_BODY         0x1111

#define COLORWINDOW_WIDTH       208
#define COLORWINDOW_HEIGHT      91

#define DEFAULT_WINDOW_LEFT     (320 - COLORWINDOW_WIDTH)
#define DEFAULT_WINDOW_TOP      (200 - COLORWINDOW_HEIGHT)

#define CHARACTER_WIDTH         8
#define CHARACTER_HEIGHT        8

#define COLOR_BOX_LEFT          7
#define COLOR_BOX_TOP           6
#define COLOR_BOX_RIGHT         (COLOR_BOX_LEFT + 15)
#define COLOR_BOX_BOTTOM        (COLOR_BOX_TOP + 29)
#define COLOR_COLOR_TOP         45
#define COLOR_PROP_LEFT         38
#define COLOR_PROP_TOP          4
#define COLOR_PROP_WIDTH        165
#define COLOR_PROP_HEIGHT       10
#define COLOR_CLUSTER_LEFT      141
#define COLOR_CLUSTER_TOP       41
#define COLOR_CLUSTER_WIDTH     (CHARACTER_WIDTH * 6 + 4)
#define COLOR_CLUSTER_HEIGHT    9
#define COLOR_HSL_TOP           (COLOR_BOX_TOP - 2)
#define COLOR_HSL_LEFT          (COLOR_BOX_RIGHT + 3)

/* GREEN and RED are out of order.  Do you wonder why?  Some day I'll 
 * tell you.  =RJ=
 */
#define COLOR_COPY              32
#define COLOR_RANGE             33
#define COLOR_OK                34
#define COLOR_CANCEL            35
#define COLOR_GREEN             36
#define COLOR_RED               37
#define COLOR_BLUE              38
#define COLOR_HSL_RGB           39
#define COLOR_GADGETS_COUNT     40
