home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computerworld 1996 March
/
Computerworld_1996-03_cd.bin
/
idg_cd3
/
grafika
/
fraktaly
/
frasr192
/
framain2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-08
|
55KB
|
1,697 lines
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#ifndef XFRACT
#include <io.h>
#include <dos.h>
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <ctype.h>
#include "prototyp.h"
#include "fractype.h"
#include "helpdefs.h"
#if 0
/* makes a handly list of jul-man pairs, not for release */
static void julman()
{
FILE *fp;
int i;
fp = dir_fopen(workdir,"toggle.txt","w");
i = -1;
while(fractalspecific[++i].name)
{
if(fractalspecific[i].tojulia != NOFRACTAL && fractalspecific[i].name[0] != '*')
fprintf(fp,"%s %s\n",fractalspecific[i].name,
fractalspecific[fractalspecific[i].tojulia].name);
}
fclose(fp);
}
#endif
/* routines in this module */
int main_menu_switch(int*,int*,int*,char*,int);
int big_while_loop(int *kbdmore, char *stacked, int resumeflag);
static void move_zoombox(int);
char fromtext_flag = 0; /* = 1 if we're in graphics mode */
static int call_line3d(BYTE *pixels, int linelen);
static void note_zoom(void);
static void restore_zoom(void);
static void move_zoombox(int keynum);
static void cmp_line_cleanup(void);
static void _fastcall restore_history_info(int);
static void _fastcall save_history_info(void);
static char far *savezoom;
static int historyptr = -1; /* user pointer into history tbl */
static int saveptr = 0; /* save ptr into history tbl */
static int historyflag; /* are we backing off in history? */
void (*outln_cleanup) (void);
int big_while_loop(int *kbdmore, char *stacked, int resumeflag)
{
int frommandel; /* if julia entered from mandel */
int axmode=0, bxmode, cxmode, dxmode; /* video mode (BIOS ##) */
double ftemp; /* fp temp */
int i; /* temporary loop counters */
int kbdchar;
frommandel = 0;
if(resumeflag)
goto resumeloop;
for(;;) { /* eternal loop */
if (calc_status != 2 || showfile == 0) {
#ifdef XFRACT
if (resizeWindow()) {
calc_status = -1;
}
#endif
far_memcpy((char far *)&videoentry,(char far *)&videotable[adapter],
sizeof(videoentry));
axmode = videoentry.videomodeax; /* video mode (BIOS call) */
bxmode = videoentry.videomodebx; /* video mode (BIOS call) */
cxmode = videoentry.videomodecx; /* video mode (BIOS call) */
dxmode = videoentry.videomodedx; /* video mode (BIOS call) */
dotmode = videoentry.dotmode; /* assembler dot read/write */
xdots = videoentry.xdots; /* # dots across the screen */
ydots = videoentry.ydots; /* # dots down the screen */
colors = videoentry.colors; /* # colors available */
textsafe2 = dotmode / 100;
dotmode %= 100;
sxdots = xdots;
sydots = ydots;
sxoffs = syoffs = 0;
diskvideo = 0; /* set diskvideo flag */
if (dotmode == 11) /* default assumption is disk */
diskvideo = 2;
memcpy(olddacbox,dacbox,256*3); /* save the DAC */
diskisactive = 1; /* flag for disk-video routines */
if (overlay3d) {
unstackscreen(); /* restore old graphics image */
overlay3d = 0;
}
else {
setvideomode(axmode,bxmode,cxmode,dxmode); /* switch video modes */
if (goodmode == 0) {
static FCODE msg[] = {"That video mode is not available with your adapter."};
static FCODE TPlusStr[] = "This video mode requires 'noninterlaced=yes'";
if(TPlusErr) {
stopmsg(0, TPlusStr);
TPlusErr = 0;
}
else {
stopmsg(0,msg);
askvideo = TRUE;
}
initmode = -1;
setvideotext(); /* switch to text mode */
/* goto restorestart; */
return(RESTORESTART);
}
}
diskisactive = 0; /* flag for disk-video routines */
if (savedac || colorpreloaded) {
memcpy(dacbox,olddacbox,256*3); /* restore the DAC */
spindac(0,1);
colorpreloaded = 0;
}
else { /* reset DAC to defaults, which setvideomode has done for us */
if (mapdacbox) { /* but there's a map=, so load that */
far_memcpy((char far *)dacbox,mapdacbox,768);
spindac(0,1);
}
else if ((dotmode == 11 && colors == 256) || !colors) {
/* disk video, setvideomode via bios didn't get it right, so: */
#ifndef XFRACT
ValidateLuts("default"); /* read the default palette file */
#endif
}
colorstate = 0;
}
if (viewwindow) {
ftemp = finalaspectratio
* (double)sydots / (double)sxdots / screenaspect;
if ((xdots = viewxdots) != 0) { /* xdots specified */
if ((ydots = viewydots) == 0) /* calc ydots? */
ydots = (int)((double)xdots * ftemp + 0.5);
}
else
if (finalaspectratio <= screenaspect) {
xdots = (int)((double)sxdots / viewreduction + 0.5);
ydots = (int)((double)xdots * ftemp + 0.5);
}
else {
ydots = (int)((double)sydots / viewreduction + 0.5);
xdots = (int)((double)ydots / ftemp + 0.5);
}
if (xdots > sxdots || ydots > sydots) {
static FCODE msg[] = {"View window too large; using full screen."};
stopmsg(0,msg);
xdots = sxdots;
ydots = sydots;
}
else if (xdots <= sxdots/20 || ydots <= sydots/20) { /* so ssg works */
static FCODE msg[] = {"View window too small; using full screen."};
stopmsg(0,msg);
xdots = sxdots;
ydots = sydots;
}
sxoffs = (sxdots - xdots) / 2;
syoffs = (sydots - ydots) / 3;
}
dxsize = xdots - 1; /* convert just once now */
dysize = ydots - 1;
}
if(savedac == 0)
savedac = 2; /* assume we save next time (except jb) */
else
savedac = 1; /* assume we save next time */
if (initbatch == 0)
lookatmouse = -PAGE_UP; /* mouse left button == pgup */
if(showfile == 0) { /* loading an image */
outln_cleanup = NULL; /* outln routine can set this */
if (display3d) /* set up 3D decoding */
outln = call_line3d;
else if(filetype >= 1) /* old .tga format input file */
outln = outlin16;
else if(comparegif) /* debug 50 */
outln = cmp_line;
else if(pot16bit) { /* .pot format input file */
if (pot_startdisk() < 0)
{ /* pot file failed? */
showfile = 1;
potflag = 0;
pot16bit = 0;
initmode = -1;
calc_status = 2; /* "resume" without 16-bit */
setvideotext();
get_fracttype();
/* goto imagestart; */
return(IMAGESTART);
}
outln = pot_line;
}
else /* regular gif/fra input file */
if(soundflag > 0)
outln = sound_line; /* sound decoding */
else
outln = out_line; /* regular decoding */
if(filetype == 0)
{
if(iit == 2 && usr_floatflag != 0)
if(F4x4Lock()==0)
iit = -1; /* semaphore not free - no iit */
if(debugflag==2224)
{
char buf[80];
sprintf(buf,"iit=%d floatflag=%d",iit,usr_floatflag);
stopmsg(4,(char far *)buf);
}
i = funny_glasses_call(gifview);
if(iit == 2)
F4x4Free(); /* unlock semaphore */
else if(iit == -1)
iit = 2; /* semaphore operating */
}
else
i = funny_glasses_call(tgaview);
if(outln_cleanup) /* cleanup routine defined? */
(*outln_cleanup)();
if(i == 0)
buzzer(0);
else {
calc_status = -1;
if (keypressed()) {
static FCODE msg[] = {"*** load incomplete ***"};
buzzer(1);
while (keypressed()) getakey();
texttempmsg(msg);
}
}
}
zoomoff = 1; /* zooming is enabled */
if (dotmode == 11 || (curfractalspecific->flags&NOZOOM) != 0)
zoomoff = 0; /* for these cases disable zooming */
calcfracinit();
#ifdef XFRACT
schedulealarm(1);
#endif
sxmin = xxmin; /* save 3 corners for zoom.c ref points */
sxmax = xxmax;
sx3rd = xx3rd;
symin = yymin;
symax = yymax;
sy3rd = yy3rd;
if(bf_math)
{
copy_bf(bfsxmin,bfxmin);
copy_bf(bfsxmax,bfxmax);
copy_bf(bfsymin,bfymin);
copy_bf(bfsymax,bfymax);
copy_bf(bfsx3rd,bfx3rd);
copy_bf(bfsy3rd,bfy3rd);
}
save_history_info();
if (display3d || showfile) { /* paranoia: these vars don't get set */
save_system = active_system; /* unless really doing some work, */
} /* so simple <r> + <s> keeps number */
if(showfile == 0) { /* image has been loaded */
showfile = 1;
if (initbatch == 1 && calc_status == 2)
initbatch = -1; /* flag to finish calc before save */
if (loaded3d) /* 'r' of image created with '3' */
display3d = 1; /* so set flag for 'b' command */
}
else { /* draw an image */
diskisactive = 1; /* flag for disk-video routines */
if (initsavetime != 0 /* autosave and resumable? */
&& (curfractalspecific->flags&NORESUME) == 0) {
savebase = readticker(); /* calc's start time */
saveticks = abs(initsavetime);
saveticks *= 1092; /* bios ticks/minute */
if ((saveticks & 65535L) == 0)
++saveticks; /* make low word nonzero */
finishrow = -1;
}
i = calcfract(); /* draw the fractal using "C" */
if (i == 0)
buzzer(0); /* finished!! */
saveticks = 0; /* turn off autosave timer */
if (dotmode == 11 && i == 0) /* disk-video */
{
static FCODE o_msg[] = {"Image has been completed"};
char msg[sizeof(o_msg)];
far_strcpy(msg,o_msg);
dvid_status(0,msg);
}
diskisactive = 0; /* flag for disk-video routines */
}
#ifndef XFRACT
boxcount = 0; /* no zoom box yet */
zwidth = 0;
#else
if (!XZoomWaiting) {
boxcount = 0; /* no zoom box yet */
zwidth = 0;
}
#endif
if (fractype == PLASMA && cpu > 88) {
cyclelimit = 256; /* plasma clouds need quick spins */
daccount = 256;
daclearn = 1;
}
resumeloop: /* return here on failed overlays */
*kbdmore = 1;
while (*kbdmore == 1) { /* loop through command keys */
if (timedsave != 0) {
if (timedsave == 1) { /* woke up for timed save */
getakey(); /* eat the dummy char */
kbdchar = 's'; /* do the save */
resave_flag = 1;
timedsave = 2;
}
else { /* save done, resume */
timedsave = 0;
resave_flag = 2;
kbdchar = ENTER;
}
}
else if (initbatch == 0) { /* not batch mode */
lookatmouse = (zwidth == 0) ? -PAGE_UP : 3;
if (calc_status == 2 && zwidth == 0 && !keypressed()) {
kbdchar = ENTER ; /* no visible reason to stop, continue */
} else { /* wait for a real keystroke */
if (autobrowse && !no_sub_images) kbdchar = 'l';
else
{
#ifndef XFRACT
while (!keypressed());/* { }*/ /* enables help */
#else
waitkeypressed(0);
#endif
kbdchar = getakey();
}
if (kbdchar == ESC || kbdchar == 'm' || kbdchar == 'M') {
if (kbdchar == ESC && escape_exit != 0)
/* don't ask, just get out */
goodbye();
stackscreen();
#ifndef XFRACT
kbdchar = main_menu(1);
#else
if (XZoomWaiting) {
kbdchar = ENTER;
} else {
kbdchar = main_menu(1);
if (XZoomWaiting) {
kbdchar = ENTER;
}
}
#endif
if (kbdchar == '\\' || kbdchar == CTL_BACKSLASH ||
kbdchar == 'h' || kbdchar == 8 ||
check_vidmode_key(0,kbdchar) >= 0)
discardscreen();
else if (kbdchar == 'x' || kbdchar == 'y' ||
kbdchar == 'z' || kbdchar == 'g' ||
kbdchar == 'v' || kbdchar == 2)
fromtext_flag = 1;
else
unstackscreen();
}
}
}
else { /* batch mode, fake next keystroke */
/* initbatch == -1 flag to finish calc before save */
/* initbatch == 0 not in batch mode */
/* initbatch == 1 normal batch mode */
/* initbatch == 2 was 1, now do a save */
/* initbatch == 3 bailout with errorlevel == 2, error occurred, no save */
/* initbatch == 4 bailout with errorlevel == 1, interrupted, try to save */
/* initbatch == 5 was 4, now do a save */
if (initbatch == -1) { /* finish calc */
kbdchar = ENTER;
initbatch = 1;
}
else if (initbatch == 1 || initbatch == 4 ) { /* save-to-disk */
/*
while(keypressed())
getakey();
*/
if (debugflag == 50)
kbdchar = 'r';
else
kbdchar = 's';
if(initbatch == 1) initbatch = 2;
if(initbatch == 4) initbatch = 5;
}
else {
if(calc_status != 4) initbatch = 3; /* bailout with error */
goodbye(); /* done, exit */
}
}
#ifndef XFRACT
if ('A' <= kbdchar && kbdchar <= 'Z')
kbdchar = tolower(kbdchar);
#endif
switch(main_menu_switch(&kbdchar,&frommandel,kbdmore,stacked,axmode))
{
case IMAGESTART:
return(IMAGESTART);
case RESTORESTART:
return(RESTORESTART);
case RESTART:
return(RESTART);
case CONTINUE:
continue;
default:
break;
}
if (zoomoff == 1 && *kbdmore == 1) /* draw/clear a zoom box? */
drawbox(1);
#ifdef XFRACT
if (resizeWindow()) {
calc_status = -1;
}
#endif
}
}
/* return(0); */
}
int main_menu_switch(int *kbdchar, int *frommandel, int *kbdmore, char *stacked, int axmode)
{
int i,k;
static double jxxmin, jxxmax, jyymin, jyymax; /* "Julia mode" entry point */
static double jxx3rd, jyy3rd;
/*
char drive[FILE_MAX_DRIVE];
char dir[FILE_MAX_DIR];
char fname[FILE_MAX_FNAME];
char ext[FILE_MAX_EXT];
*/
switch (*kbdchar)
{
case 't': /* new fractal type */
julibrot = 0;
clear_zoombox();
stackscreen();
if ((i = get_fracttype()) >= 0)
{
discardscreen();
savedac = 0;
save_release = release;
no_mag_calc = 0;
use_old_period = 0;
if (i == 0)
{
initmode = adapter;
*frommandel = 0;
}
else if (initmode < 0) /* it is supposed to be... */
setvideotext(); /* reset to text mode */
return(IMAGESTART);
}
unstackscreen();
break;
case 24: /* Ctl-X, Ctl-Y, CTL-Z do flipping */
case 25:
case 26:
flip_image(*kbdchar);
break;
case 'x': /* invoke options screen */
case 'y':
case 'z': /* type specific parms */
case 'g':
case 'v':
case 2:
if (fromtext_flag == 1)
fromtext_flag = 0;
else
stackscreen();
if (*kbdchar == 'x')
i = get_toggles();
else if (*kbdchar == 'y')
i = get_toggles2();
else if (*kbdchar == 'z')
i = get_fract_params(1);
else if (*kbdchar == 'v')
i = get_view_params(); /* get the parameters */
else if (*kbdchar == 2)
i = get_browse_params();
else
i = get_cmd_string();
unstackscreen();
if (i > 0) /* time to redraw? */
*kbdmore = calc_status = 0;
break;
#ifndef XFRACT
case '@': /* execute commands */
case '2': /* execute commands */
#else
case F2: /* execute commands */
#endif
stackscreen();
i = get_commands();
if (initmode != -1)
{ /* video= was specified */
adapter = initmode;
initmode = -1;
i |= 1;
savedac = 0;
}
else if (colorpreloaded)
{ /* colors= was specified */
spindac(0, 1);
colorpreloaded = 0;
}
else if ((i & 8)) /* reset was specified */
savedac = 0;
if ((i & 4))
{ /* 3d = was specified */
*kbdchar = '3';
unstackscreen();
goto do_3d_transform; /* pretend '3' was keyed */
}
if ((i & 1))
{ /* fractal parameter changed */
discardscreen();
/* backwards_v18();*/ /* moved this to cmdfiles.c */
/* backwards_v19();*/
*kbdmore = calc_status = 0;
}
else
unstackscreen();
break;
case 'f': /* floating pt toggle */
if (usr_floatflag == 0)
usr_floatflag = 1;
else
usr_floatflag = 0;
initmode = adapter;
return(IMAGESTART);
case 'i': /* 3d fractal parms */
if (get_fract3d_params() >= 0) /* get the parameters */
calc_status = *kbdmore = 0; /* time to redraw */
break;
#if 0
case 'w':
/*chk_keys();*/
/*julman();*/
break;
#endif
case 1: /* ^a Ant */
clear_zoombox();
{
int oldtype, err, i;
double oldparm[MAXPARAMS];
oldtype = fractype;
for(i=0;i<MAXPARAMS;i++)
oldparm[i] = param[i];
if (fractype != ANT)
{
fractype = ANT;
curfractalspecific = &fractalspecific[fractype];
load_params(fractype);
}
if (!fromtext_flag)
stackscreen();
fromtext_flag = 0;
if ((err = get_fract_params(2)) >= 0)
{
unstackscreen();
if (ant() >= 0)
calc_status = 0;
}
else
unstackscreen();
fractype = oldtype;
for(i=0;i<MAXPARAMS;i++)
param[i] = oldparm[i];
if (err >= 0)
return(CONTINUE);
}
break;
case 'k': /* ^s is irritating, give user a single key */
case 19: /* ^s RDS */
clear_zoombox();
if (get_rds_params() >= 0)
{
if (do_AutoStereo() >= 0)
calc_status = 0;
return(CONTINUE);
}
break;
case 'a': /* starfield parms */
clear_zoombox();
if (get_starfield_params() >= 0)
{
if (starfield() >= 0)
calc_status = 0;
return(CONTINUE);
}
break;
case 15: /* ctrl-o */
case 'o':
/* must use standard fractal and have a float variant */
if ((fractalspecific[fractype].calctype == StandardFractal
|| fractalspecific[fractype].calctype == calcfroth) &&
(fractalspecific[fractype].isinteger == 0 ||
fractalspecific[fractype].tofloat != NOFRACTAL) &&
!bf_math /* for now no arbitrary precision support */ )
{
clear_zoombox();
Jiim(ORBIT);
}
break;
case SPACE: /* spacebar, toggle mand/julia */
if(bf_math)
break;
if (fractype == CELLULAR)
{
if (nxtscreenflag)
nxtscreenflag = 0; /* toggle flag to stop generation */
else
nxtscreenflag = 1; /* toggle flag to generate next screen */
calc_status = 2;
*kbdmore = 0;
}
else
{
if (curfractalspecific->tojulia != NOFRACTAL
&& param[0] == 0.0 && param[1] == 0.0)
{
/* switch to corresponding Julia set */
int key;
if ((fractype == MANDEL || fractype == MANDELFP) && bf_math == 0)
hasinverse = 1;
else
hasinverse = 0;
clear_zoombox();
Jiim(JIIM);
key = getakey(); /* flush keyboard buffer */
if (key != SPACE)
{
ungetakey(key);
break;
}
fractype = curfractalspecific->tojulia;
curfractalspecific = &fractalspecific[fractype];
if (xcjul == BIG || ycjul == BIG)
{
param[0] = (xxmax + xxmin) / 2;
param[1] = (yymax + yymin) / 2;
}
else
{
param[0] = xcjul;
param[1] = ycjul;
xcjul = ycjul = BIG;
}
jxxmin = sxmin;
jxxmax = sxmax;
jyymax = symax;
jyymin = symin;
jxx3rd = sx3rd;
jyy3rd = sy3rd;
*frommandel = 1;
xxmin = curfractalspecific->xmin;
xxmax = curfractalspecific->xmax;
yymin = curfractalspecific->ymin;
yymax = curfractalspecific->ymax;
xx3rd = xxmin;
yy3rd = yymin;
if (usr_distest == 0 && usr_biomorph != -1 && bitshift != 29)
{
xxmin *= 3.0;
xxmax *= 3.0;
yymin *= 3.0;
yymax *= 3.0;
xx3rd *= 3.0;
yy3rd *= 3.0;
}
zoomoff = 1;
calc_status = 0;
*kbdmore = 0;
}
else if (curfractalspecific->tomandel != NOFRACTAL)
{
/* switch to corresponding Mandel set */
fractype = curfractalspecific->tomandel;
curfractalspecific = &fractalspecific[fractype];
if (*frommandel)
{
xxmin = jxxmin;
xxmax = jxxmax;
yymin = jyymin;
yymax = jyymax;
xx3rd = jxx3rd;
yy3rd = jyy3rd;
}
else
{
xxmin = xx3rd = curfractalspecific->xmin;
xxmax = curfractalspecific->xmax;
yymin = yy3rd = curfractalspecific->ymin;
yymax = curfractalspecific->ymax;
}
SaveC.x = param[0];
SaveC.y = param[1];
param[0] = 0;
param[1] = 0;
zoomoff = 1;
calc_status = 0;
*kbdmore = 0;
}
else
buzzer(2); /* can't switch */
} /* end of else for if == cellular */
break;
case 'j': /* inverse julia toggle */
/* if the inverse types proliferate, something more elegant will be
* needed */
if (fractype == JULIA || fractype == JULIAFP || fractype == INVERSEJULIA)
{
static int oldtype = -1;
if (fractype == JULIA || fractype == JULIAFP)
{
oldtype = fractype;
fractype = INVERSEJULIA;
}
else if (fractype == INVERSEJULIA)
{
if (oldtype != -1)
fractype = oldtype;
else
fractype = JULIA;
}
curfractalspecific = &fractalspecific[fractype];
zoomoff = 1;
calc_status = 0;
*kbdmore = 0;
}
#if 0
else if (fractype == MANDEL || fractype == MANDELFP)
{
clear_zoombox();
Jiim(JIIM);
}
#endif
else
buzzer(2);
break;
case '\\': /* return to prev image */
case CTL_BACKSLASH:
case 'h':
case 8:
if (name_stack_ptr >= 1)
{
/* go back one file if somewhere to go (ie. browsing) */
name_stack_ptr--;
strcpy(browsename, file_name_stack[name_stack_ptr]);
/*
splitpath(browsename, NULL, NULL, fname, ext);
splitpath(readname, drive, dir, NULL, NULL);
makepath(readname, drive, dir, fname, ext);
*/
merge_pathnames(readname,browsename,2);
browsing = TRUE;
no_sub_images = FALSE;
showfile = 0;
if (askvideo)
{
stackscreen(); /* save graphics image */
*stacked = 1;
}
return(RESTORESTART);
}
else if(maxhistory > 0 && bf_math == 0)
{
if(*kbdchar == '\\' || *kbdchar == 'h')
if (--historyptr < 0)
historyptr = maxhistory - 1;
if(*kbdchar == CTL_BACKSLASH || *kbdchar == 8)
if (++historyptr >= maxhistory)
historyptr = 0;
restore_history_info(historyptr);
zoomoff = 1;
initmode = adapter;
if (curfractalspecific->isinteger != 0 &&
curfractalspecific->tofloat != NOFRACTAL)
usr_floatflag = 0;
if (curfractalspecific->isinteger == 0 &&
curfractalspecific->tofloat != NOFRACTAL)
usr_floatflag = 1;
historyflag = 1; /* avoid re-store parms due to rounding errs */
return(IMAGESTART);
}
break;
case 'd': /* shell to MS-DOS */
stackscreen();
#ifndef XFRACT
if (axmode == 0 || axmode > 7)
{
static FCODE dosmsg[] =
{"\
Note: Your graphics image is still squirreled away in your video\n\
adapter's memory. Switching video modes will clobber part of that\n\
image. Sorry - it's the best we could do."};
putstring(0, 0, 7, dosmsg);
movecursor(6, 0);
}
#endif
shell_to_dos();
unstackscreen();
/* calc_status = 0; */
break;
case 'c': /* switch to color cycling */
case '+': /* rotate palette */
case '-': /* rotate palette */
clear_zoombox();
memcpy(olddacbox, dacbox, 256 * 3);
rotate((*kbdchar == 'c') ? 0 : ((*kbdchar == '+') ? 1 : -1));
if (memcmp(olddacbox, dacbox, 256 * 3))
{
colorstate = 1;
save_history_info();
}
return(CONTINUE);
case 'e': /* switch to color editing */
clear_zoombox();
if (dacbox[0][0] != 255 && !reallyega && colors >= 16
&& dotmode != 11)
{
int oldhelpmode;
oldhelpmode = helpmode;
memcpy(olddacbox, dacbox, 256 * 3);
helpmode = HELPXHAIR;
EditPalette();
helpmode = oldhelpmode;
if (memcmp(olddacbox, dacbox, 256 * 3))
{
colorstate = 1;
save_history_info();
}
}
return(CONTINUE);
case 's': /* save-to-disk */
diskisactive = 1; /* flag for disk-video routines */
note_zoom();
savetodisk(savename);
restore_zoom();
diskisactive = 0; /* flag for disk-video routines */
return(CONTINUE);
case '#': /* 3D overlay */
#ifdef XFRACT
case F3: /* 3D overlay */
#endif
clear_zoombox();
overlay3d = 1;
case '3': /* restore-from (3d) */
do_3d_transform:
if (overlay3d)
display3d = 2; /* for <b> command */
else
display3d = 1;
case 'r': /* restore-from */
comparegif = 0;
*frommandel = 0;
if (browsing)
{
browsing = FALSE;
}
if (*kbdchar == 'r')
{
if (debugflag == 50)
{
comparegif = overlay3d = 1;
if (initbatch == 2)
{
stackscreen(); /* save graphics image */
strcpy(readname, savename);
showfile = 0;
return(RESTORESTART);
}
}
else
comparegif = overlay3d = 0;
display3d = 0;
}
stackscreen(); /* save graphics image */
if (overlay3d)
*stacked = 0;
else
*stacked = 1;
if (resave_flag)
{
updatesavename(savename); /* do the pending increment */
resave_flag = started_resaves = 0;
}
showfile = -1;
return(RESTORESTART);
/* RB */
case 'l':
case 'L': /* Look for other files within this view */
if ((zwidth == 0) && (!diskvideo)) /* not zooming & no disk
* video */
{
int oldhelpmode;
oldhelpmode = helpmode;
helpmode = HELPBROWSE;
switch (fgetwindow())
{
case ENTER:
case ENTER_2:
showfile = 0; /* trigger load */
browsing = TRUE; /* but don't ask for the file name as it's
* just been selected */
if (name_stack_ptr == 15)
{ /* about to run off the end of the file
* history stack so shift it all back one to
* make room, lose the 1st one */
int tmp;
for (tmp = 1; tmp < 16; tmp++)
strcpy(file_name_stack[tmp - 1], file_name_stack[tmp]);
name_stack_ptr = 14;
}
name_stack_ptr++;
strcpy(file_name_stack[name_stack_ptr], browsename);
/*
splitpath(browsename, NULL, NULL, fname, ext);
splitpath(readname, drive, dir, NULL, NULL);
makepath(readname, drive, dir, fname, ext);
*/
merge_pathnames(readname,browsename,2);
if (askvideo)
{
stackscreen(); /* save graphics image */
*stacked = 1;
}
return(RESTORESTART); /* hop off and do it!! */
case '\\':
if (name_stack_ptr >= 1)
{
/* go back one file if somewhere to go (ie. browsing) */
name_stack_ptr--;
strcpy(browsename, file_name_stack[name_stack_ptr]);
/*
splitpath(browsename, NULL, NULL, fname, ext);
splitpath(readname, drive, dir, NULL, NULL);
makepath(readname, drive, dir, fname, ext);
*/
merge_pathnames(readname,browsename,2);
browsing = TRUE;
showfile = 0;
if (askvideo)
{
stackscreen();/* save graphics image */
*stacked = 1;
}
return(RESTORESTART);
} /* otherwise fall through and turn off
* browsing */
case ESC:
case 'l': /* turn it off */
case 'L':
browsing = FALSE;
helpmode = oldhelpmode;
break;
case 's':
browsing = FALSE;
helpmode = oldhelpmode;
savetodisk(savename);
break;
default: /* or no files found, leave the state of
* browsing */
break; /* alone */
}
}
else
{
browsing = FALSE;
buzzer(2); /* can't browse if zooming or diskvideo */
}
break;
case 'b': /* make batch file */
make_batch_file();
break;
case 'p': /* print current image */
note_zoom();
Print_Screen();
restore_zoom();
if (!keypressed())
buzzer(0);
else
{
buzzer(1);
getakey();
}
return(CONTINUE);
case ENTER: /* Enter */
case ENTER_2: /* Numeric-Keypad Enter */
#ifdef XFRACT
XZoomWaiting = 0;
#endif
if (zwidth != 0.0)
{ /* do a zoom */
init_pan_or_recalc(0);
*kbdmore = 0;
}
if (calc_status != 4) /* don't restart if image complete */
*kbdmore = 0;
break;
case CTL_ENTER: /* control-Enter */
case CTL_ENTER_2: /* Control-Keypad Enter */
init_pan_or_recalc(1);
*kbdmore = 0;
zoomout(); /* calc corners for zooming out */
break;
case INSERT: /* insert */
setvideotext(); /* force text mode */
return(RESTART);
case LEFT_ARROW: /* cursor left */
case RIGHT_ARROW: /* cursor right */
case UP_ARROW: /* cursor up */
case DOWN_ARROW: /* cursor down */
case LEFT_ARROW_2: /* Ctrl-cursor left */
case RIGHT_ARROW_2: /* Ctrl-cursor right */
case UP_ARROW_2: /* Ctrl-cursor up */
case DOWN_ARROW_2: /* Ctrl-cursor down */
move_zoombox(*kbdchar);
break;
case CTL_HOME: /* Ctrl-home */
if (boxcount && (curfractalspecific->flags & NOROTATE) == 0)
{
i = key_count(CTL_HOME);
if ((zskew -= 0.02 * i) < -0.48)
zskew = -0.48;
}
break;
case CTL_END: /* Ctrl-end */
if (boxcount && (curfractalspecific->flags & NOROTATE) == 0)
{
i = key_count(CTL_END);
if ((zskew += 0.02 * i) > 0.48)
zskew = 0.48;
}
break;
case CTL_PAGE_UP: /* Ctrl-pgup */
if (boxcount)
chgboxi(0, -2 * key_count(CTL_PAGE_UP));
break;
case CTL_PAGE_DOWN: /* Ctrl-pgdn */
if (boxcount)
chgboxi(0, 2 * key_count(CTL_PAGE_DOWN));
break;
case PAGE_UP: /* page up */
if (zoomoff == 1)
if (zwidth == 0)
{ /* start zoombox */
zwidth = zdepth = 1;
zskew = zrotate = 0;
zbx = zby = 0;
find_special_colors();
boxcolor = color_bright;
}
else
resizebox(0 - key_count(PAGE_UP));
break;
case PAGE_DOWN: /* page down */
if (boxcount)
{
if (zwidth >= .999 && zdepth >= 0.999) /* end zoombox */
zwidth = 0;
else
resizebox(key_count(PAGE_DOWN));
}
break;
case CTL_MINUS: /* Ctrl-kpad- */
if (boxcount && (curfractalspecific->flags & NOROTATE) == 0)
zrotate += key_count(CTL_MINUS);
break;
case CTL_PLUS: /* Ctrl-kpad+ */
if (boxcount && (curfractalspecific->flags & NOROTATE) == 0)
zrotate -= key_count(CTL_PLUS);
break;
case CTL_INSERT: /* Ctrl-ins */
boxcolor += key_count(CTL_INSERT);
break;
case CTL_DEL: /* Ctrl-del */
boxcolor -= key_count(CTL_DEL);
break;
case DELETE: /* select video mode from list */
stackscreen();
*kbdchar = select_video_mode(adapter);
if (check_vidmode_key(0, *kbdchar) >= 0) /* picked a new mode? */
discardscreen();
else
unstackscreen();
/* fall through */
default: /* other (maybe a valid Fn key) */
if ((k = check_vidmode_key(0, *kbdchar)) >= 0)
{
adapter = k;
/* if (videotable[adapter].dotmode != 11 Took out so that */
/* || videotable[adapter].colors != colors) DAC is not reset */
/* savedac = 0; when changing video modes */
calc_status = 0;
*kbdmore = 0;
return(CONTINUE);
}
break;
} /* end of the big switch */
return(0);
}
static int call_line3d(BYTE *pixels, int linelen)
{
/* this routine exists because line3d might be in an overlay */
return(line3d(pixels,linelen));
}
static void note_zoom()
{
if (boxcount) { /* save zoombox stuff in far mem before encode (mem reused) */
if ((savezoom = farmemalloc((long)(5*boxcount))) == NULL)
clear_zoombox(); /* not enuf mem so clear the box */
else {
reset_zoom_corners(); /* reset these to overall image, not box */
far_memcpy(savezoom,boxx,boxcount*2);
far_memcpy(savezoom+boxcount*2,boxy,boxcount*2);
far_memcpy(savezoom+boxcount*4,boxvalues,boxcount);
}
}
}
static void restore_zoom()
{
if (boxcount) { /* restore zoombox arrays */
far_memcpy(boxx,savezoom,boxcount*2);
far_memcpy(boxy,savezoom+boxcount*2,boxcount*2);
far_memcpy(boxvalues,savezoom+boxcount*4,boxcount);
farmemfree(savezoom);
drawbox(1); /* get the xxmin etc variables recalc'd by redisplaying */
}
}
/* do all pending movement at once for smooth mouse diagonal moves */
static void move_zoombox(int keynum)
{ int vertical, horizontal, getmore;
if (boxcount == 0)
return;
vertical = horizontal = 0;
getmore = 1;
while (getmore) {
switch (keynum) {
case LEFT_ARROW: /* cursor left */
--horizontal;
break;
case RIGHT_ARROW: /* cursor right */
++horizontal;
break;
case UP_ARROW: /* cursor up */
--vertical;
break;
case DOWN_ARROW: /* cursor down */
++vertical;
break;
case LEFT_ARROW_2: /* Ctrl-cursor left */
horizontal -= 5;
break;
case RIGHT_ARROW_2: /* Ctrl-cursor right */
horizontal += 5;
break;
case UP_ARROW_2: /* Ctrl-cursor up */
vertical -= 5;
break;
case DOWN_ARROW_2: /* Ctrl-cursor down */
vertical += 5;
break;
default:
getmore = 0;
}
if (getmore) {
if (getmore == 2) /* eat last key used */
getakey();
getmore = 2;
keynum = keypressed(); /* next pending key */
}
}
if (horizontal != 0)
moveboxf((double)horizontal/dxsize,0.0);
if (vertical != 0)
moveboxf(0.0,(double)vertical/dysize);
}
/* displays differences between current image file and new image */
static FILE *cmp_fp;
static errcount;
int cmp_line(BYTE *pixels, int linelen)
{
int row,col;
int oldcolor;
if((row = rowcount++) == 0) {
errcount = 0;
cmp_fp = dir_fopen(workdir,"cmperr",(initbatch)?"a":"w");
outln_cleanup = cmp_line_cleanup;
}
if(pot16bit) { /* 16 bit info, ignore odd numbered rows */
if((row & 1) != 0) return(0);
row >>= 1;
}
for(col=0;col<linelen;col++) {
oldcolor=getcolor(col,row);
if(oldcolor==(int)pixels[col])
putcolor(col,row,0);
else {
if(oldcolor==0)
putcolor(col,row,1);
++errcount;
if(initbatch == 0)
fprintf(cmp_fp,"#%5d col %3d row %3d old %3d new %3d\n",
errcount,col,row,oldcolor,pixels[col]);
}
}
return(0);
}
static void cmp_line_cleanup(void)
{
char *timestring;
time_t ltime;
if(initbatch) {
time(<ime);
timestring = ctime(<ime);
timestring[24] = 0; /*clobber newline in time string */
fprintf(cmp_fp,"%s compare to %s has %5d errs\n",
timestring,readname,errcount);
}
fclose(cmp_fp);
}
int pot_line(BYTE *pixels, int linelen)
{
int row,col,saverowcount;
if (rowcount == 0)
if (pot_startdisk() < 0)
return -1;
saverowcount = rowcount;
row = (rowcount >>= 1);
if ((saverowcount & 1) != 0) /* odd line */
row += ydots;
else /* even line */
if (dotmode != 11) /* display the line too */
out_line(pixels,linelen);
for (col = 0; col < xdots; ++col)
writedisk(col+sxoffs,row+syoffs,*(pixels+col));
rowcount = saverowcount + 1;
return(0);
}
void clear_zoombox()
{
zwidth = 0;
drawbox(0);
reset_zoom_corners();
}
void reset_zoom_corners()
{
xxmin = sxmin;
xxmax = sxmax;
xx3rd = sx3rd;
yymax = symax;
yymin = symin;
yy3rd = sy3rd;
if(bf_math)
{
copy_bf(bfxmin,bfsxmin);
copy_bf(bfxmax,bfsxmax);
copy_bf(bfymin,bfsymin);
copy_bf(bfymax,bfsymax);
copy_bf(bfx3rd,bfsx3rd);
copy_bf(bfy3rd,bfsy3rd);
}
}
/*
Function setup287code is called by main() when a 287
or better fpu is detected.
*/
#define ORBPTR(x) fractalspecific[x].orbitcalc
void setup287code()
{
ORBPTR(MANDELFP) = ORBPTR(JULIAFP) = FJuliafpFractal;
ORBPTR(BARNSLEYM1FP) = ORBPTR(BARNSLEYJ1FP) = FBarnsley1FPFractal;
ORBPTR(BARNSLEYM2FP) = ORBPTR(BARNSLEYJ2FP) = FBarnsley2FPFractal;
ORBPTR(MANOWARFP) = ORBPTR(MANOWARJFP) = FManOWarfpFractal;
ORBPTR(MANDELLAMBDAFP) = ORBPTR(LAMBDAFP) = FLambdaFPFractal;
}
int sound_line(BYTE *pixels, int linelen)
{
int i;
for(i=0;i<linelen;i++)
{
putcolor(i,rowcount,pixels[i]);
if(orbit_delay > 0)
sleepms(orbit_delay);
snd((int)(pixels[i]*3000/colors+basehertz));
if(keypressed())
{
nosnd();
return(-1);
}
}
nosnd();
rowcount++;
return(0);
}
/* read keystrokes while = specified key, return 1+count; */
/* used to catch up when moving zoombox is slower than keyboard */
int key_count(int keynum)
{ int ctr;
ctr = 1;
while (keypressed() == keynum) {
getakey();
++ctr;
}
return ctr;
}
static void _fastcall save_history_info()
{
HISTORY current;
if(maxhistory <= 0 || bf_math)
return;
far_memset((void far *)¤t,0,sizeof(HISTORY));
current.fractal_type = (short)fractype ;
current.xmin = xxmin ;
current.xmax = xxmax ;
current.ymin = yymin ;
current.ymax = yymax ;
current.creal = param[0] ;
current.cimag = param[1] ;
current.dparm3 = param[2] ;
current.dparm4 = param[3] ;
current.dparm5 = param[4] ;
current.dparm6 = param[5] ;
current.dparm7 = param[6] ;
current.dparm8 = param[7] ;
current.dparm9 = param[8] ;
current.dparm10 = param[9] ;
current.fillcolor = (short)fillcolor ;
current.potential[0] = potparam[0] ;
current.potential[1] = potparam[1] ;
current.potential[2] = potparam[2] ;
current.rflag = (short)rflag ;
current.rseed = (short)rseed ;
current.inside = (short)inside ;
current.logmap = (short)LogFlag ;
current.invert[0] = inversion[0] ;
current.invert[1] = inversion[1] ;
current.invert[2] = inversion[2] ;
current.decomp = (short)decomp[0]; ;
current.biomorph = (short)biomorph ;
current.symmetry = (short)forcesymmetry ;
current.init3d[0] = (short)init3d[0] ;
current.init3d[1] = (short)init3d[1] ;
current.init3d[2] = (short)init3d[2] ;
current.init3d[3] = (short)init3d[3] ;
current.init3d[4] = (short)init3d[4] ;
current.init3d[5] = (short)init3d[5] ;
current.init3d[6] = (short)init3d[6] ;
current.init3d[7] = (short)init3d[7] ;
current.init3d[8] = (short)init3d[8] ;
current.init3d[9] = (short)init3d[9] ;
current.init3d[10] = (short)init3d[10] ;
current.init3d[11] = (short)init3d[12] ;
current.init3d[12] = (short)init3d[13] ;
current.init3d[13] = (short)init3d[14] ;
current.init3d[14] = (short)init3d[15] ;
current.init3d[15] = (short)init3d[16] ;
current.previewfactor = (short)previewfactor ;
current.xtrans = (short)xtrans ;
current.ytrans = (short)ytrans ;
current.red_crop_left = (short)red_crop_left ;
current.red_crop_right = (short)red_crop_right ;
current.blue_crop_left = (short)blue_crop_left ;
current.blue_crop_right = (short)blue_crop_right ;
current.red_bright = (short)red_bright ;
current.blue_bright = (short)blue_bright ;
current.xadjust = (short)xadjust ;
current.yadjust = (short)yadjust ;
current.eyeseparation = (short)eyeseparation ;
current.glassestype = (short)glassestype ;
current.outside = (short)outside ;
current.x3rd = xx3rd ;
current.y3rd = yy3rd ;
current.stdcalcmode = stdcalcmode ;
current.three_pass = three_pass ;
current.distest = (short)distest ;
current.trigndx[0] = trigndx[0] ;
current.trigndx[1] = trigndx[1] ;
current.trigndx[2] = trigndx[2] ;
current.trigndx[3] = trigndx[3] ;
current.finattract = (short)finattract ;
current.initorbit[0] = initorbit.x ;
current.initorbit[1] = initorbit.y ;
current.useinitorbit = useinitorbit ;
current.periodicity = (short)periodicitycheck ;
current.pot16bit = (short)disk16bit ;
current.release = (short)release ;
current.save_release = (short)save_release ;
current.flag3d = (short)display3d ;
current.ambient = (short)Ambient ;
current.randomize = (short)RANDOMIZE ;
current.haze = (short)haze ;
current.transparent[0] = (short)transparent[0] ;
current.transparent[1] = (short)transparent[1] ;
current.rotate_lo = (short)rotate_lo ;
current.rotate_hi = (short)rotate_hi ;
current.distestwidth = (short)distestwidth ;
current.mxmaxfp = mxmaxfp ;
current.mxminfp = mxminfp ;
current.mymaxfp = mymaxfp ;
current.myminfp = myminfp ;
current.zdots = (short)zdots ;
current.originfp = originfp ;
current.depthfp = depthfp ;
current.heightfp = heightfp ;
current.widthfp = widthfp ;
current.distfp = distfp ;
current.eyesfp = eyesfp ;
current.orbittype = (short)neworbittype ;
current.juli3Dmode = (short)juli3Dmode ;
current.maxfn = maxfn ;
current.major_method = (short)major_method ;
current.minor_method = (short)minor_method ;
current.bailout = bailout ;
current.bailoutest = (short)bailoutest ;
current.iterations = maxit ;
current.old_demm_colors = (short)old_demm_colors;
far_memcpy(current.dac,dacbox,256*3);
switch(fractype)
{
case FORMULA:
case FFORMULA:
far_strncpy(current.filename,FormFileName,80);
far_strncpy(current.itemname,FormName,ITEMNAMELEN+1);
break;
case IFS:
case IFS3D:
far_strncpy(current.filename,IFSFileName,80);
far_strncpy(current.itemname,IFSName,ITEMNAMELEN+1);
break;
case LSYSTEM:
far_strncpy(current.filename,LFileName,80);
far_strncpy(current.itemname,LName,ITEMNAMELEN+1);
break;
default:
*(current.filename) = 0;
*(current.itemname) = 0;
break;
}
if (historyptr == -1) /* initialize the history file */
{
int i;
for (i = 0; i < maxhistory; i++)
history[i] = current;
historyflag = saveptr = historyptr = 0; /* initialize history ptr */
}
else if(historyflag == 1)
historyflag = 0; /* coming from user history command, don't save */
else if(far_memcmp(¤t,&history[saveptr],sizeof(HISTORY)))
{
char msg[80];
if(++saveptr >= maxhistory) /* back to beginning of circular buffer */
saveptr = 0;
if(++historyptr >= maxhistory) /* move user pointer in parallel */
historyptr = 0;
history[saveptr] = current;
sprintf(msg,"saving image in history %d",saveptr);
/* stopmsg(0,msg); */
}
}
static void _fastcall restore_history_info(int i)
{
char msg[80];
sprintf(msg,"restoring msg %d",i);
/* stopmsg(0,msg); */
if(maxhistory <= 0 || bf_math)
return;
invert = 0;
calc_status = 0;
resuming = 0;
fractype = history[i].fractal_type ;
xxmin = history[i].xmin ;
xxmax = history[i].xmax ;
yymin = history[i].ymin ;
yymax = history[i].ymax ;
param[0] = history[i].creal ;
param[1] = history[i].cimag ;
param[2] = history[i].dparm3 ;
param[3] = history[i].dparm4 ;
param[4] = history[i].dparm5 ;
param[5] = history[i].dparm6 ;
param[6] = history[i].dparm7 ;
param[7] = history[i].dparm8 ;
param[8] = history[i].dparm9 ;
param[9] = history[i].dparm10 ;
fillcolor = history[i].fillcolor ;
potparam[0] = history[i].potential[0] ;
potparam[1] = history[i].potential[1] ;
potparam[2] = history[i].potential[2] ;
rflag = history[i].rflag ;
rseed = history[i].rseed ;
inside = history[i].inside ;
LogFlag = history[i].logmap ;
inversion[0] = history[i].invert[0] ;
inversion[1] = history[i].invert[1] ;
inversion[2] = history[i].invert[2] ;
decomp[0] = history[i].decomp ;
usr_biomorph = history[i].biomorph ;
biomorph = history[i].biomorph ;
forcesymmetry = history[i].symmetry ;
init3d[0] = history[i].init3d[0] ;
init3d[1] = history[i].init3d[1] ;
init3d[2] = history[i].init3d[2] ;
init3d[3] = history[i].init3d[3] ;
init3d[4] = history[i].init3d[4] ;
init3d[5] = history[i].init3d[5] ;
init3d[6] = history[i].init3d[6] ;
init3d[7] = history[i].init3d[7] ;
init3d[8] = history[i].init3d[8] ;
init3d[9] = history[i].init3d[9] ;
init3d[10] = history[i].init3d[10] ;
init3d[12] = history[i].init3d[11] ;
init3d[13] = history[i].init3d[12] ;
init3d[14] = history[i].init3d[13] ;
init3d[15] = history[i].init3d[14] ;
init3d[16] = history[i].init3d[15] ;
previewfactor = history[i].previewfactor ;
xtrans = history[i].xtrans ;
ytrans = history[i].ytrans ;
red_crop_left = history[i].red_crop_left ;
red_crop_right = history[i].red_crop_right ;
blue_crop_left = history[i].blue_crop_left ;
blue_crop_right = history[i].blue_crop_right;
red_bright = history[i].red_bright ;
blue_bright = history[i].blue_bright ;
xadjust = history[i].xadjust ;
yadjust = history[i].yadjust ;
eyeseparation = history[i].eyeseparation ;
glassestype = history[i].glassestype ;
outside = history[i].outside ;
xx3rd = history[i].x3rd ;
yy3rd = history[i].y3rd ;
usr_stdcalcmode = history[i].stdcalcmode ;
stdcalcmode = history[i].stdcalcmode ;
three_pass = history[i].three_pass ;
distest = history[i].distest ;
usr_distest = history[i].distest ;
trigndx[0] = history[i].trigndx[0] ;
trigndx[1] = history[i].trigndx[1] ;
trigndx[2] = history[i].trigndx[2] ;
trigndx[3] = history[i].trigndx[3] ;
finattract = history[i].finattract ;
initorbit.x = history[i].initorbit[0] ;
initorbit.y = history[i].initorbit[1] ;
useinitorbit = history[i].useinitorbit ;
periodicitycheck = history[i].periodicity ;
usr_periodicitycheck = history[i].periodicity ;
disk16bit = history[i].pot16bit ;
release = history[i].release ;
save_release = history[i].save_release ;
display3d = history[i].flag3d ;
Ambient = history[i].ambient ;
RANDOMIZE = history[i].randomize ;
haze = history[i].haze ;
transparent[0] = history[i].transparent[0] ;
transparent[1] = history[i].transparent[1] ;
rotate_lo = history[i].rotate_lo ;
rotate_hi = history[i].rotate_hi ;
distestwidth = history[i].distestwidth ;
mxmaxfp = history[i].mxmaxfp ;
mxminfp = history[i].mxminfp ;
mymaxfp = history[i].mymaxfp ;
myminfp = history[i].myminfp ;
zdots = history[i].zdots ;
originfp = history[i].originfp ;
depthfp = history[i].depthfp ;
heightfp = history[i].heightfp ;
widthfp = history[i].widthfp ;
distfp = history[i].distfp ;
eyesfp = history[i].eyesfp ;
neworbittype = history[i].orbittype ;
juli3Dmode = history[i].juli3Dmode ;
maxfn = history[i].maxfn ;
major_method = (enum Major)history[i].major_method ;
minor_method = (enum Minor)history[i].minor_method ;
bailout = history[i].bailout ;
bailoutest = (enum bailouts)history[i].bailoutest ;
maxit = history[i].iterations ;
old_demm_colors = history[i].old_demm_colors;
curfractalspecific = &fractalspecific[fractype];
potflag = (potparam[0] != 0.0);
if (inversion[0] != 0.0)
invert = 3;
usr_floatflag = (char)((curfractalspecific->isinteger) ? 0 : 1);
far_memcpy(dacbox,history[i].dac,256*3);
far_memcpy(olddacbox,history[i].dac,256*3);
if(mapdacbox)
far_memcpy(mapdacbox,history[i].dac,256*3);
spindac(0,1);
if(fractype == JULIBROT || fractype == JULIBROTFP)
savedac = 0;
else
savedac = 1;
switch(fractype)
{
case FORMULA:
case FFORMULA:
far_strncpy(FormFileName,history[i].filename,80);
far_strncpy(FormName, history[i].itemname,ITEMNAMELEN+1);
break;
case IFS:
case IFS3D:
far_strncpy(IFSFileName,history[i].filename,80);
far_strncpy(IFSName ,history[i].itemname,ITEMNAMELEN+1);
break;
case LSYSTEM:
far_strncpy(LFileName,history[i].filename,80);
far_strncpy(LName ,history[i].itemname,ITEMNAMELEN+1);
break;
default:
break;
}
}
void checkfreemem(int secondpass)
{
int oldmaxhistory;
char far *tmp;
static FCODE msg[] =
{" I'm sorry, but you don't have enough free memory \n to run this program.\n\n"};
static FCODE msg2[] = {"To save memory, reduced maxhistory to "};
tmp = farmemalloc(4096L);
oldmaxhistory = maxhistory;
if(secondpass && !history)
{
while(maxhistory >= 0) /* decrease history if necessary */
{
history = (HISTORY far *)
farmemalloc(((unsigned long)maxhistory * sizeof(HISTORY)));
if(history)
break;
maxhistory--;
}
}
if(extraseg == 0 || tmp == NULL)
{
buzzer(2);
#ifndef XFRACT
printf("%Fs",(char far *)msg);
#else
printf("%s",msg);
#endif
exit(1);
}
farmemfree(tmp); /* was just to check for min space */
if(secondpass && maxhistory < oldmaxhistory)
{
#ifndef XFRACT
printf("%Fs%d\n%Fs\n",(char far *)msg2,maxhistory,s_pressanykeytocontinue);
#else
printf("%s%d\n%s\n",(char far *)msg2,maxhistory,s_pressanykeytocontinue);
#endif
getakey();
}
}