/* FRACTINT.H - common structures and values for the FRACTINT routines */ #ifndef C6 #define _fastcall /* _fastcall is a Microsoft C6.00 extension */ #endif #ifdef __TURBOC__ # define _bios_printer(a,b,c) biosprint((a),(c),(b)) # define _bios_serialcom(a,b,c) bioscom((a),(c),(b)) #else # define MK_FP(seg,off) (void far *)( (((long)(seg))<<16) | \ ((unsigned)(off)) ) #endif #define MAXPIXELS 2048 /* Maximum pixel count across/down the screen */ #define SCREENASPECT 0.75 /* Assumed overall screen dimensions, y/x */ struct videoinfo { /* All we need to know about a Video Adapter */ char name[26]; /* Adapter name (IBM EGA, etc) */ char comment[26]; /* Comments (UNTESTED, etc) */ int keynum; /* key number used to invoked this mode */ /* 2-10 = F2-10, 11-40 = S,C,A{F1-F10} */ int videomodeax; /* begin with INT 10H, AX=(this) */ int videomodebx; /* ...and BX=(this) */ int videomodecx; /* ...and CX=(this) */ int videomodedx; /* ...and DX=(this) */ /* NOTE: IF AX==BX==CX==0, SEE BELOW */ int dotmode; /* video access method used by asm code */ /* 1 == BIOS 10H, AH=12,13 (SLOW) */ /* 2 == access like EGA/VGA */ /* 3 == access like MCGA */ /* 4 == Tseng-like SuperVGA*256 */ /* 5 == P'dise-like SuperVGA*256 */ /* 6 == Vega-like SuperVGA*256 */ /* 7 == "Tweaked" IBM-VGA ...*256 */ /* 8 == "Tweaked" SuperVGA ...*256 */ /* 9 == Targa Format */ /* 10 = Hercules */ /* 11 = "disk video" (no screen) */ /* 12 = 8514/A */ /* 13 = CGA 320x200x4, 640x200x2 */ /* 14 = Tandy 1000 */ /* 15 = TRIDENT SuperVGA*256 */ /* 16 = Chips&Tech SuperVGA*256 */ int xdots; /* number of dots across the screen */ int ydots; /* number of dots down the screen */ int colors; /* number of colors available */ }; #define INFO_ID "Fractal" #define FRACTAL_INFO struct fractal_info struct fractal_info /* for saving data in GIF file */ { char info_id[8]; /* Unique identifier for info block */ int iterations; int fractal_type; /* 0=Mandelbrot 1=Julia 2= ... */ double xmin; double xmax; double ymin; double ymax; double creal; double cimag; int videomodeax; int videomodebx; int videomodecx; int videomodedx; int dotmode; int xdots; int ydots; int colors; int version; /* used to be 'future[0]' */ float parm3; float parm4; float potential[3]; int rseed; int rflag; int biomorph; int inside; int logmap; float invert[3]; int decomp[2]; int symmetry; /* version 2 stuff */ int init3d[16]; int previewfactor; int xtrans; int ytrans; int red_crop_left; int red_crop_right; int blue_crop_left; int blue_crop_right; int red_bright; int blue_bright; int xadjust; int eyeseparation; int glassestype; /* version 3 stuff, release 13 */ int outside; /* version 4 stuff, release 14 */ double x3rd; /* 3rd corner */ double y3rd; char stdcalcmode; /* 1/2/g/b */ char useinitorbit; /* init Mandelbrot orbit flag */ int calc_status; /* resumable, finished, etc */ long tot_extend_len; /* total length of extension blocks in .gif file */ int distest; int floatflag; int bailout; long calctime; unsigned char trigndx[4]; /* which trig functions selected */ int finattract; double initorbit[2]; /* init Mandelbrot orbit values */ int periodicity; /* periodicity checking */ /* version 5 stuff, release 15 */ int pot16bit; /* save 16 bit continuous potential info */ float faspectratio; /* finalaspectratio, y/x */ int system; /* 0 for dos, 1 for windows */ int release; /* release number, with 2 decimals implied */ int flag3d; /* stored only for now, for future use */ int transparent[2]; int ambient; int haze; int randomize; /* version 6 stuff, release 15.x */ int rotate_lo; int rotate_hi; int distestwidth; /* version 7 stuff, release 16 */ double dparm3; double dparm4; int future[32]; /* for stuff we haven't thought of yet */ }; #define MAXVIDEOMODES 300 /* maximum entries in fractint.cfg */ #define MAXVIDEOTABLE 40 /* size of the resident video modes table */ #if defined(PUTTHEMHERE) /* this MUST be defined ONLY in FRACTINT.C */ struct videoinfo videoentry; #else extern struct videoinfo videoentry; #endif #define NUMIFS 32 /* number of ifs functions in ifs array */ #define IFSPARM 7 /* number of ifs parameters */ #define IFS3DPARM 13 /* number of ifs 3D parameters */ #define ITEMNAMELEN 18 /* max length of names in .frm/.l/.ifs/.fc */ /* defines for symmetry */ #define NOSYM 0 #define XAXIS_NOPARM -1 #define XAXIS 1 #define YAXIS_NOPARM -2 #define YAXIS 2 #define XYAXIS_NOPARM -3 #define XYAXIS 3 #define ORIGIN_NOPARM -4 #define ORIGIN 4 #define PI_SYM_NOPARM -5 #define PI_SYM 5 #define XAXIS_NOIMAG -6 #define XAXIS_NOREAL 6 #define NOPLOT 99 #define SETUP_SYM 100 /* bitmask defines for fractalspecific flags */ #define NOZOOM 1 /* zoombox not allowed at all */ #define NOGUESS 2 /* solid guessing not allowed */ #define NOTRACE 4 /* boundary tracing not allowed */ #define NOROTATE 8 /* zoombox rotate/stretch not allowed */ #define NORESUME 16 /* can't interrupt and resume */ #define INFCALC 32 /* this type calculates forever */ #define TRIG1 64 /* number of trig functions in formula*/ #define TRIG2 128 #define TRIG3 192 #define TRIG4 256 #define WINFRAC 512 /* supported in WinFrac */ #define PARMS3D 1024 /* uses 3d parameters */ #define AUTOINVERT -123456.789 #define N_ATTR 8 /* max number of attractors */ struct fractalspecificstuff { char *name; /* name of the fractal */ char *param[4]; /* name of the parameters */ float paramvalue[4]; /* default parameter values */ int helptext; /* helpdefs.h HT_xxxx, -1 for none */ int helpformula; /* helpdefs.h HF_xxxx, -1 for none */ int flags; /* constraints, bits defined above */ float xmin; /* default XMIN corner */ float xmax; /* default XMAX corner */ float ymin; /* default YMIN corner */ float ymax; /* default YMAX corner */ int isinteger; /* 1 if integerfractal, 0 otherwise */ int tojulia; /* mandel-to-julia switch */ int tomandel; /* julia-to-mandel switch */ int tofloat; /* integer-to-floating switch */ int symmetry; /* applicable symmetry logic 0 = no symmetry -1 = y-axis symmetry (If No Params) 1 = y-axis symmetry -2 = x-axis symmetry (No Parms) 2 = x-axis symmetry -3 = y-axis AND x-axis (No Parms) 3 = y-axis AND x-axis symmetry -4 = polar symmetry (No Parms) 4 = polar symmetry 5 = PI (sin/cos) symmetry 6 = NEWTON (power) symmetry */ int (*orbitcalc)(); /* function that calculates one orbit */ int (*per_pixel)(); /* once-per-pixel init */ int (*per_image)(); /* once-per-image setup */ int (*calctype)(); /* name of main fractal function */ int orbit_bailout; /* usual bailout value for orbit calc */ }; extern struct fractalspecificstuff far fractalspecific[]; extern struct fractalspecificstuff far *curfractalspecific; #if defined(PUTTHEMHERE) /* this MUST be defined ONLY in FRACTINT.C */ int helpmode; #else extern int helpmode; #endif #define DEFAULTFRACTALTYPE ".gif" #define ALTERNATEFRACTALTYPE ".fra" #include #ifndef _LCOMPLEX_DEFINED struct lcomplex { long x, y; }; #define _LCOMPLEX_DEFINED #endif #ifndef sqr #define sqr(x) ((x)*(x)) #endif #ifndef lsqr #define lsqr(x) (multiply((x),(x),bitshift)) #endif #define CMPLXmod(z) (sqr((z).x)+sqr((z).y)) #define CMPLXconj(z) ((z).y = -((z).y)) #define LCMPLXmod(z) (lsqr((z).x)+lsqr((z).y)) #define LCMPLXconj(z) ((z).y = -((z).y)) typedef struct complex CMPLX; typedef struct lcomplex LCMPLX; /* 3D stuff - formerly in 3d.h */ #ifndef dot_product #define dot_product(v1,v2) ((v1)[0]*(v2)[0]+(v1)[1]*(v2)[1]+(v1)[2]*(v2)[2]) /* TW 7-09-89 */ #endif #define CMAX 4 /* maximum column (4 x 4 matrix) */ #define RMAX 4 /* maximum row (4 x 4 matrix) */ #define DIM 3 /* number of dimensions */ typedef double MATRIX [RMAX] [CMAX]; /* matrix of doubles */ typedef int IMATRIX [RMAX] [CMAX]; /* matrix of ints */ typedef long LMATRIX [RMAX] [CMAX]; /* matrix of longs */ /* A MATRIX is used to describe a transformation from one coordinate system to another. Multiple transformations may be concatenated by multiplying their transformation matrices. */ typedef double VECTOR [DIM]; /* vector of doubles */ typedef int IVECTOR [DIM]; /* vector of ints */ typedef long LVECTOR [DIM]; /* vector of longs */ /* A VECTOR is an array of three coordinates [x,y,z] representing magnitude and direction. A fourth dimension is assumed to always have the value 1, but is not in the data structure */ #define PI 3.14159265358979323846 #define SPHERE init3d[0] /* sphere? 1 = yes, 0 = no */ #define ILLUMINE (FILLTYPE>4) /* illumination model */ /* regular 3D */ #define XROT init3d[1] /* rotate x-axis 60 degrees */ #define YROT init3d[2] /* rotate y-axis 90 degrees */ #define ZROT init3d[3] /* rotate x-axis 0 degrees */ #define XSCALE init3d[4] /* scale x-axis, 90 percent */ #define YSCALE init3d[5] /* scale y-axis, 90 percent */ /* sphere 3D */ #define PHI1 init3d[1] /* longitude start, 180 */ #define PHI2 init3d[2] /* longitude end , 0 */ #define THETA1 init3d[3] /* latitude start,-90 degrees */ #define THETA2 init3d[4] /* latitude stop, 90 degrees */ #define RADIUS init3d[5] /* should be user input */ /* common parameters */ #define ROUGH init3d[6] /* scale z-axis, 30 percent */ #define WATERLINE init3d[7] /* water level */ #define FILLTYPE init3d[8] /* fill type */ #define ZVIEWER init3d[9] /* perspective view point */ #define XSHIFT init3d[10] /* x shift */ #define YSHIFT init3d[11] /* y shift */ #define XLIGHT init3d[12] /* x light vector coordinate */ #define YLIGHT init3d[13] /* y light vector coordinate */ #define ZLIGHT init3d[14] /* z light vector coordinate */ #define LIGHTAVG init3d[15] /* number of points to average */ #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif struct workliststuff /* work list entry for std escape time engines */ { int xxstart; /* screen window for this entry */ int xxstop; int yystart; int yystop; int yybegin; /* start row within window, for 2pass/ssg resume */ int sym; /* if symmetry in window, prevents bad combines */ int pass; /* for 2pass and solid guessing */ }; #define MAXCALCWORK 12 extern unsigned char trigndx[]; extern void (*ltrig0)(), (*ltrig1)(), (*ltrig2)(), (*ltrig3)(); extern void (*dtrig0)(), (*dtrig1)(), (*dtrig2)(), (*dtrig3)(); struct trig_funct_lst { char *name; void (*lfunct)(); void (*dfunct)(); void (*mfunct)(); } ; extern struct trig_funct_lst trigfn[]; /* function prototypes */ extern void buzzer(int); extern int calcfract(void); extern int calcmand(void); extern int check_key(void); extern int complex_mult(CMPLX, CMPLX, CMPLX *); extern int complex_div(CMPLX, CMPLX, CMPLX *); extern int complex_power(CMPLX, int, CMPLX *); extern int cross_product(double [], double [], double []); extern void drawbox(int); extern unsigned int emmallocate(unsigned int); extern void emmclearpage(unsigned int, unsigned int); extern void emmdeallocate(unsigned int); extern unsigned int emmgetfree(void); extern void emmgetpage(unsigned int, unsigned int); extern unsigned char far *emmquery(void); extern far_strlen( char far *); extern far_strcpy( char far *, char far *); extern far_strcmp( char far *, char far *); extern far_stricmp(char far *, char far *); extern far_strnicmp(char far *, char far *,int); extern far_strcat( char far *, char far *); extern far_memset( void far *, char , int); extern far_memcpy( void far *, void far *, int); extern far_memcmp( void far *, void far *, int); extern far_memicmp(void far *, void far *, int); extern unsigned char far *farmemalloc(long); extern void farmemfree(void far *); extern int getakey(void); extern int _fastcall getcolor(int, int); extern void _fastcall putcolor(int, int, int); extern void (_fastcall *plot)(int, int, int); extern void _fastcall symPIplot(int,int,int); extern void _fastcall symPIplot2J(int,int,int); extern void _fastcall symPIplot4J(int,int,int); extern void _fastcall symplot2(int,int,int); extern void _fastcall symplot2Y(int,int,int); extern void _fastcall symplot2J(int,int,int); extern void _fastcall symplot4(int,int,int); extern void _fastcall symplot2basin(int,int,int); extern void _fastcall symplot4basin(int,int,int); extern void _fastcall noplot(int,int,int); extern void _fastcall draw_line(int,int,int,int,int); extern int has_8087(void ); extern void putstring(int,int,int,unsigned char far *); extern int putstringcenter(int,int,int,int,char far *); extern int stopmsg(int,unsigned char far *); extern void identity(MATRIX); extern int Juliafp(void); extern int longvmultpersp(LVECTOR, LMATRIX, LVECTOR, LVECTOR, LVECTOR, int); extern int longpersp(LVECTOR, LVECTOR,int); extern int Lambda(void); extern int Lambdasine(void); extern void mat_mul(MATRIX, MATRIX, MATRIX); extern void main(int, char *[]); extern int Mandelfp(void); extern long multiply(long, long, int); extern long divide(long, long, int); extern int Newton(void); extern int perspective(double *v); extern void cdecl Print_Screen(void); extern void scale(double, double, double, MATRIX); extern void setvideomode(int, int, int, int); extern int Sierpinski(void); extern void spindac(int, int); extern void trans(double, double, double, MATRIX); extern int vmult(VECTOR,MATRIX,VECTOR); extern void xrot(double, MATRIX); extern void yrot(double, MATRIX); extern void zrot(double, MATRIX); extern void (_fastcall *standardplot)(int,int,int); extern void _fastcall plot3dsuperimpose16b(int,int,int); extern void _fastcall plot3dsuperimpose16(int,int,int); extern void _fastcall plot3dsuperimpose256(int,int,int); extern void _fastcall plotIFS3dsuperimpose256(int,int,int); extern void _fastcall plot3dalternate(int,int,int); /* for overlay return stack */ #define ENTER_OVLY(ovlyid)\ extern int active_ovly;\ int prev_ovly;\ prev_ovly = active_ovly;\ active_ovly = ovlyid #define EXIT_OVLY active_ovly = prev_ovly #define OVLY_MISCOVL 1 #define OVLY_CMDFILES 2 #define OVLY_HELP 3 #define OVLY_PROMPTS 4 #define OVLY_LOADFILE 5 #define OVLY_ROTATE 6 #define OVLY_PRINTER 7 #define OVLY_LINE3D 8 #define OVLY_ENCODER 9 #define OVLY_CALCFRAC 10 #define OVLY_INTRO 11 /* keys */ #define INSERT 1082 #define DELETE 1083 #define PAGE_UP 1073 #define PAGE_DOWN 1081 #define CTL_HOME 1119 #define CTL_END 1117 #define LEFT_ARROW 1075 #define RIGHT_ARROW 1077 #define UP_ARROW 1072 #define DOWN_ARROW 1080 #define LEFT_ARROW_2 1115 #define RIGHT_ARROW_2 1116 #define UP_ARROW_2 1141 #define DOWN_ARROW_2 1145 #define HOME 1071 #define END 1079 #define ENTER 13 #define ENTER_2 1013 #define TAB 9 #define ESC 27 #define SPACE 32 #define F1 1059 #define F2 1060 #define F3 1061 #define F4 1062 #define F5 1063 #define F6 1064 #define F7 1065 #define F8 1066 #define F9 1067 #define F10 1068 /* text colors */ #define BLACK 0 #define BLUE 1 #define GREEN 2 #define CYAN 3 #define RED 4 #define MAGENTA 5 #define BROWN 6 /* dirty yellow on cga */ #define WHITE 7 /* use values below this for foreground only, they don't work background */ #define GRAY 8 /* don't use this much - is black on cga */ #define L_BLUE 9 #define L_GREEN 10 #define L_CYAN 11 #define L_RED 12 #define L_MAGENTA 13 #define YELLOW 14 #define L_WHITE 15 #define INVERSE 0x8000 /* when 640x200x2 text or mode 7, inverse */ #define BRIGHT 0x4000 /* when mode 7, bright */ /* and their use: */ extern unsigned char txtcolor[]; #define C_TITLE txtcolor[0]+BRIGHT #define C_TITLE_DEV txtcolor[1] #define C_HELP_HDG txtcolor[2]+BRIGHT #define C_HELP_BODY txtcolor[3] #define C_HELP_INSTR txtcolor[4] #define C_HELP_LINK txtcolor[5]+BRIGHT #define C_HELP_CURLINK txtcolor[6]+INVERSE #define C_PROMPT_BKGRD txtcolor[7] #define C_PROMPT_TEXT txtcolor[8] #define C_PROMPT_LO txtcolor[9] #define C_PROMPT_MED txtcolor[10] #define C_PROMPT_HI txtcolor[11]+BRIGHT #define C_PROMPT_INPUT txtcolor[12]+INVERSE #define C_PROMPT_CHOOSE txtcolor[13]+INVERSE #define C_CHOICE_CURRENT txtcolor[14]+INVERSE #define C_CHOICE_SP_INSTR txtcolor[15] #define C_CHOICE_SP_KEYIN txtcolor[16]+BRIGHT #define C_GENERAL_HI txtcolor[17]+BRIGHT #define C_GENERAL_MED txtcolor[18] #define C_GENERAL_LO txtcolor[19] #define C_GENERAL_INPUT txtcolor[20]+INVERSE #define C_DVID_BKGRD txtcolor[21] #define C_DVID_HI txtcolor[22]+BRIGHT #define C_DVID_LO txtcolor[23] #define C_STOP_ERR txtcolor[24]+BRIGHT #define C_STOP_INFO txtcolor[25]+BRIGHT #define C_TITLE_LOW txtcolor[26] #define C_AUTHDIV1 txtcolor[27]+INVERSE #define C_AUTHDIV2 txtcolor[28]+INVERSE #define C_PRIMARY txtcolor[29] #define C_CONTRIB txtcolor[30] /* structure passed to fullscreen_prompts */ struct fullscreenvalues { int type; /* 'd' for decimal, 's' for string, '*' for comment */ /* 'i' for integer, 'y' for yes=1 no=0 */ /* 0x100+n for string of length n */ /* 'l' for one of a list of strings */ union { double dval; /* when type 'd' or 'f' */ int ival; /* when type is 'i' */ char sval[16]; /* when type is 's' */ char *sbuf; /* when type is 0x100+n */ struct { /* when type is 'l' */ int val; /* selected choice */ int vlen; /* char len per choice */ char **list; /* list of values */ int llen; /* number of values */ } ch; } uval; };