home *** CD-ROM | disk | FTP | other *** search
- /*
- non-windows main driver of Fractint for Windows -
- */
-
-
- #define PUTTHEMHERE 1 /* stuff common external arrays here */
-
- void win_cmdfiles();
-
- /* from MSC's <dos.h> */
- #define FP_SEG(fp) (*((unsigned _far *)&(fp)+1))
- #define FP_OFF(fp) (*((unsigned _far *)&(fp)))
-
- #include "fractint.h"
- #include "fractype.h"
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <search.h>
- #include <string.h>
- #include <float.h>
- #include <ctype.h>
- #include <time.h>
-
- int cmp_line(), pot_line();
-
- LPSTR win_lpCmdLine;
-
- extern int time_to_restart;
- extern int time_to_reinit;
- extern int time_to_quit;
- extern int time_to_load;
- extern int time_to_save;
- extern int time_to_print;
- extern int time_to_cycle;
-
- extern char FileName[];
- char string004[2];
-
- unsigned char textcolor[27];
-
- extern int xdots, ydots, colors, maxiter;
- extern int ytop, ybottom, xleft, xright;
-
- int fractype;
- extern int invert;
-
- double ftemp, xxmin, xxmax, yymin, yymax;
- long fudge;
- double xfudge;
-
- long xvalue, yvalue;
- extern long lm, linitx, linity;
- int maxit, bitshift;
- extern int color, row, col;
-
- int calc_status; /* -1 no fractal */
- /* 0 parms changed, recalc reqd */
- /* 1 actively calculating */
- /* 2 interrupted, resumable */
- /* 3 interrupted, not resumable */
- /* 4 completed */
-
- extern int reset_periodicity;
- extern int cpu;
- extern int kbdcount;
- extern int max_kbdcount;
- extern int show_orbit;
- extern int orbit_ptr;
- extern int periodicitycheck;
- extern int debugflag;
- int integerfractal;
- extern int distest;
- int oktoprint = 0;
- extern int bitshiftless1;
- char usr_stdcalcmode, stdcalcmode;
- int usr_distest;
- int usr_floatflag, usr_periodicitycheck;
-
- long creal, cimag;
- long delx, dely, delx2, dely2, delmin;
- long xmin, xmax, ymin, ymax, x3rd, y3rd;
- double dxsize, dysize; /* xdots-1, ydots-1 */
- double delxx, delyy, delxx2, delyy2, ddelmin, xx3rd, yy3rd;
- double param[4];
- double potparam[3];
- int diskvideo, savedac;
- long calctime;
- int mode7text, textsafe;
-
- #define MAXLINE 2048
-
- long far *lx0, far *ly0, far *lx1, far *ly1;
- double far *dx0, far *dy0, far *dx1, far *dy1;
- extern double far *temp_array;
-
- extern unsigned char trigndx[4];
-
- unsigned char dacbox[257][3];
- double plotmx1, plotmx2, plotmy1, plotmy2;
- extern int MPOverflow;
- int dotmode;
- extern int pot16bit;
- int andcolor, resave_flag;
- extern int timer_interval;
- extern int active_ovly;
-
- int extraseg;
- int timedsave = 0;
- int disk16bit = 0;
- extern int initbatch;
- float far initifs3d[32][13];
- float far initifs[32][7];
- extern unsigned char readname[];
- unsigned char MAP_name[40] = "";
- int rowcount;
- int adapter;
- extern int showfile;
- extern int initmode;
- extern int overlay3d;
- extern int display3d;
- extern int filetype;
- int comparegif = 0;
- int diskisactive = 0;
- extern int initsavetime;
- int saveticks = 0;
- int savebase = 0;
- int zwidth = 0;
- extern int (*outln)();
- extern int out_line();
- extern int outlin16();
- static int call_line3d();
- extern int line3d();
- extern int gifview();
- extern int tgaview();
- int hasconfig = 0;
- FILE *dacfile;
- int mapset = 0;
- int reallyega = 0;
- int loadPalette = 0;
- int compiled_by_turboc = 0;
-
- int sxdots,sydots;
- int sxoffs=0,syoffs=0;
- int viewwindow=0;
- float viewreduction=1;
- int viewcrop=1;
- float finalaspectratio;
- int viewxdots=0,viewydots=0;
- extern int filexdots, fileydots, filecolors;
- int frommandel;
-
- int debug_fastupdate; /* debugging - update every pixel if set */
-
- int onthelist[100]; /* list of available fractal types */
- int CountFractalList; /* how many are on the list? */
- extern int CurrentFractal; /* which one is current? */
-
- int Printer_Resolution, Printer_Titleblock, Printer_SFrequency;
- int Printer_SetScreen, Printer_SStyle, Printer_Type;
- int Printer_ColorXlat, Printer_SAngle, LPTnumber;
- int EPSFileType, Print_To_File, Printer_CRLF;
- int video_type, no_color_text;
-
- int Distribution = 30, Offset = 0, Slope = 25;
- long con;
-
- int active_system = WINFRAC; /* running under windows */
- extern int win_display3d, win_overlay3d;
-
- int iit = 0;
- int vesa_detect;
- int far videotable[2];
- int release;
- extern int win_release;
- char busy;
- int started_resaves = 0;
- int gotrealdac = 1;
- void (*outln_cleanup)();
- extern int fpu;
- int svga_type = 0;
- int TranspSymmetry;
-
- compare_fractalnames( const void *element1, const void *element2)
- {
- int i, j, k;
- j = *(int*)element1;
- k = *(int*)element2;
- for (i = 0; i < 100; i++) {
- if (fractalspecific[j].name[i] < fractalspecific[k].name[i])
- return(-1);
- if (fractalspecific[j].name[i] > fractalspecific[k].name[i])
- return(1);
- if (fractalspecific[j].name[i] == 0)
- return(0);
- }
- return(0);
- }
-
- fractint_main()
- {
- int i, k;
- double temp1, temp2;
- double dtemp;
-
- outln_cleanup = NULL; /* outln routine can set this */
-
- CountFractalList = 0;
- for (k = 0; fractalspecific[k].name != NULL; k++)
- if (fractalspecific[k].name[0] != '*' &&
- (fractalspecific[k].flags & WINFRAC) != 0 &&
- CountFractalList < 100)
- onthelist[CountFractalList++] = k;
- qsort(onthelist,CountFractalList,2,compare_fractalnames);
- CurrentFractal = fractype;
-
- lx0 = (long far *)&temp_array[0*MAXLINE];
- ly0 = (long far *)&temp_array[1*MAXLINE];
- lx1 = (long far *)&temp_array[2*MAXLINE];
- ly1 = (long far *)&temp_array[2*MAXLINE];
- dx0 = (double far *)&temp_array[0*MAXLINE];
- dy0 = (double far *)&temp_array[1*MAXLINE];
- dx1 = (double far *)&temp_array[2*MAXLINE];
- dy1 = (double far *)&temp_array[2*MAXLINE];
- extraseg = FP_SEG(dx0);
-
- restoredac(); /* ensure that the palette has been initialized */
-
- win_cmdfiles(); /* SSTOOLS.INI processing */
-
- initmode = 1; /* override SSTOOLS.INI */
-
- release = win_release;
-
- dotmode = 1;
- diskvideo = 0;
- usr_distest = 0;
-
- max_kbdcount=(cpu==386) ? 80 : 30; /* check the keyboard less often */
-
- /* ----- */
-
- debug_fastupdate = 0;
- calc_status = -1;
- resave_flag = 1;
- strcpy(FileName,"Fract001");
- if (showfile != 0) {
- strcpy(readname, FileName);
- }
- else {
- if (strchr(readname,'.') == NULL)
- strcat(readname,".gif");
- strcpy(FileName,readname);
- time_to_load = 1;
- }
-
- if (debugflag == 23232) { /* check for free memory */
- char temp[50];
- sprintf(temp," %d bytes of free stack space",stackavail());
- stopmsg(0,temp);
- }
-
- if (debugflag == 70) fpu = 0;
-
- /* ----- */
-
- time_to_quit = 0;
- if (debugflag == 23232) /* give the Windows stuff control first */
- getakey();
- if (time_to_quit)
- return(0);
-
- reinit:
- time_to_reinit = 0;
-
- savedac = 0; /* don't save the VGA DAC */
-
- for (i = 0; i < 4; i++) {
- if(param[i] != FLT_MAX)
- fractalspecific[fractype].paramvalue[i] = param[i];
- else
- param[i] = fractalspecific[fractype].paramvalue[i];
- }
-
- /* Not used, MCP 8-6-91
- ccreal = param[0]; ccimag = param[1]; */ /* default C-values */
- frommandel = 0;
-
- if (xxmin > xxmax) {
- dtemp = xxmin; xxmin = xxmax; xxmax = dtemp;}
- if (yymin > yymax) {
- dtemp = yymin; yymin = yymax; yymax = dtemp;}
-
- ytop = 0;
- ybottom = ydots-1;
- xleft = 0;
- xright = xdots-1;
- filexdots = xdots;
- fileydots = ydots;
- filecolors = colors;
-
- restart:
- time_to_restart = 0;
-
- if (calc_status == -99)
- calc_status = 2; /* force a recalc */
- else
- calc_status = 0; /* force a restart */
-
- maxit = maxiter;
-
- if (colors == 2 && (fractype == PLASMA || usr_stdcalcmode == 'b'))
- colors = 16; /* 2-color mode just doesn't work on these */
-
- andcolor = colors-1;
-
- debug_fastupdate = 0; /* turn off debug-mode screen updates */
- if (debugflag == 6666)
- debug_fastupdate = 1;
-
- /* compute the (new) screen co-ordinates */
- /* correct a possibly munged-up zoom-box outside the image range */
- if (ytop >= ydots) ytop = ydots-1;
- if (ybottom >= ydots) ybottom = ydots-1;
- if (xleft >= xdots) xleft = xdots-1;
- if (xright >= xdots) xright = xdots-1;
- if (xleft == xright || ytop == ybottom) {
- }
- if (xleft > xright)
- { i = xleft; xleft = xright; xright = i;}
- if (ytop > ybottom)
- { i = ybottom; ybottom = ytop; ytop = i;}
- temp1 = xxmin;
- temp2 = xxmax - xxmin;
- xxmin = temp1 + (temp2 * xleft )/(xdots-1);
- xxmax = temp1 + (temp2 * xright)/(xdots-1);
- temp1 = yymin;
- temp2 = yymax - yymin;
- yymin = temp1 + (temp2 * (ydots - 1 - ybottom)/(ydots-1));
- yymax = temp1 + (temp2 * (ydots - 1 - ytop )/(ydots-1));
- xx3rd = xxmin;
- yy3rd = yymin;
- xleft = 0;
- xright = xdots-1;
- ytop = 0;
- ybottom = ydots-1;
-
- /*
- delxx = (xxmax - xxmin) / (xdots-1);
- delyy = (yymax - yymin) / (ydots-1);
- delxx2 = delyy2 = 0.0;
- ddelmin = fabs(delxx);
- if (fabs(delyy) < ddelmin)
- ddelmin = fabs(delyy);
- */
-
- dxsize = xdots - 1; dysize = ydots - 1;
-
- if (calc_status != 2 && !overlay3d)
- if (!clear_screen(1)) {
- stopmsg(0,"Can't free and re-allocate the image");
- return(0);
- }
-
- dxsize = xdots - 1; dysize = ydots - 1;
- sxdots = xdots; sydots = ydots;
- finalaspectratio = ((float)ydots)/xdots;
-
- calcfracinit();
-
- bitshiftless1 = bitshift - 1;
-
- if (time_to_load)
- goto wait_loop;
-
- if(showfile == 0) { /* loading an image */
- 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 */
- pot_startdisk();
- outln = pot_line;
- }
- else /* regular gif/fra input file */
- outln = out_line;
- if(filetype == 0)
- i = funny_glasses_call(gifview);
- else
- i = funny_glasses_call(tgaview);
- if(i == 0)
- buzzer(0);
- else {
- calc_status = -1;
- }
- }
-
- if(showfile == 0) { /* image has been loaded */
- showfile = 1;
- if (initbatch == 1 && calc_status == 2)
- initbatch = -1; /* flag to finish calc before save */
- if (calc_status == 2) goto try_to_resume;
- }
- else { /* draw an image */
-
- try_to_resume:
-
- diskisactive = 1; /* flag for disk-video routines */
- if (initsavetime != 0 /* autosave and resumable? */
- && (fractalspecific[fractype].flags&NORESUME) == 0) {
- savebase = readticker(); /* calc's start time */
- saveticks = (long)initsavetime * 1092; /* bios ticks/minute */
- if ((saveticks & 65535) == 0)
- ++saveticks; /* make low word nonzero */
- }
- kbdcount = 30; /* ensure that we check the keyboard */
- if ((i = calcfract()) == 0) /* draw the fractal using "C" */
- buzzer(0); /* finished!! */
- saveticks = 0; /* turn off autosave timer */
- diskisactive = 0; /* flag for disk-video routines */
- }
-
- overlay3d = 0; /* turn off overlay3d */
- display3d = 0; /* turn off display3d */
-
- zwidth = 0;
-
- if (!keypressed()) {
- flush_screen();
- buzzer(3);
- getakey();
- }
-
- wait_loop:
-
- for (;;) {
- if (time_to_quit)
- return(0);
- if (time_to_load) {
- strcpy(readname, FileName);
- showfile = 1;
- time_to_load = 0;
- time_to_restart = 0;
- overlay3d = win_overlay3d;
- display3d = win_display3d;
- if (win_load() >= 0) {
- showfile = 0;
- rowcount = 0;
- ytop = 0; /* reset the zoom-box */
- ybottom = ydots-1;
- xleft = 0;
- xright = xdots-1;
- maxiter = maxit;
- time_to_load = 0;
- time_to_restart = 1;
- if (calc_status == 2) {
- calc_status = -99; /* special klooge for restart */
- }
- }
- win_overlay3d = 0;
- win_display3d = 0;
- }
- if (time_to_save) {
- strcpy(readname, FileName);
- if (readname[0] != 0)
- win_save();
- time_to_save = 0;
- if (calc_status == 2) {
- calc_status = -99;
- time_to_restart = 1;
- }
- }
- if (time_to_print) {
- win_print();
- time_to_print = 0;
- }
- if (time_to_cycle) {
- win_cycle();
- }
- if (time_to_reinit)
- goto reinit;
- if(time_to_restart)
- goto restart;
- getakey();
- }
-
- }
-
- /* displays differences between current image file and new image */
- /* Bert - suggest add this to video.asm */
- int cmp_line(unsigned char *pixels, int linelen)
- {
- static errcount;
- static FILE *fp = NULL;
- extern int rowcount;
- int row,col;
- int oldcolor;
- char *timestring;
- time_t ltime;
- if(fp == NULL)
- fp = fopen("cmperr",(initbatch)?"a":"w");
- if((row = rowcount++) == 0)
- errcount = 0;
- 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==pixels[col])
- putcolor(col,row,0);
- else {
- if(oldcolor==0)
- putcolor(col,row,1);
- ++errcount;
- if(initbatch == 0)
- fprintf(fp,"#%5d col %3d row %3d old %3d new %3d\n",
- errcount,col,row,oldcolor,pixels[col]);
- }
- }
- if(row+1 == ydots && initbatch) {
- time(<ime);
- timestring = ctime(<ime);
- timestring[24] = 0; /*clobber newline in time string */
- fprintf(fp,"%s compare to %s has %5d errs\n",timestring,readname,errcount);
- }
- return(0);
- }
-
- int pot_line(unsigned char *pixels, int linelen)
- {
- extern int rowcount;
- int row,col,saverowcount;
- if (rowcount == 0)
- pot_startdisk();
- 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);
- }
-
- static int call_line3d(unsigned char *pixels, int linelen)
- {
- /* this routine exists because line3d might be in an overlay */
- return(line3d(pixels,linelen));
- }
-
- void win_cmdfiles() /* convert lpCmdLine into argc, argv */
- {
- int i, k;
- int argc;
- char *argv[10];
- unsigned char arg[501]; /* max 10 args, 450 chars total */
-
- arg[0] = 0;
- for (i = 0; i < 10; i++)
- argv[i] = &arg[0];
- argc = 1;
- strcpy(&arg[1],"winfract.exe");
- argv[argc-1] = &arg[1];
-
- for (i = 0; i < 460 && win_lpCmdLine[i] != 0; i++)
- arg[20+i] = win_lpCmdLine[i];
- arg[20+i] = 0;
- arg[21+i] = 0;
-
- for (k = 20; arg[k] != 0; k++) {
- while(arg[k] <= ' ' && arg[k] != 0) k++;
- if (arg[k] == 0) break;
- if (argc >= 10) break;
- argc++;
- argv[argc-1] = &arg[k];
- while(arg[k] > ' ')k++;
- arg[k] = 0;
- }
-
- cmdfiles(argc,argv);
-
- }
-