home *** CD-ROM | disk | FTP | other *** search
/ Mega A/V / mega_av.zip / mega_av / GRAPHUTL / WINS1651.ZIP / MAINFRAC.C < prev    next >
C/C++ Source or Header  |  1991-08-06  |  15KB  |  589 lines

  1. /*
  2.    non-windows main driver of Fractint for Windows -
  3. */
  4.  
  5.  
  6. #define PUTTHEMHERE 1        /* stuff common external arrays here */
  7.  
  8. void win_cmdfiles();
  9.  
  10. /* from MSC's <dos.h> */
  11. #define FP_SEG(fp) (*((unsigned _far *)&(fp)+1))
  12. #define FP_OFF(fp) (*((unsigned _far *)&(fp)))
  13.  
  14. #include "fractint.h"
  15. #include "fractype.h"
  16. #include <windows.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <search.h>
  20. #include <string.h>
  21. #include <float.h>
  22. #include <ctype.h>
  23. #include <time.h>
  24.  
  25. int cmp_line(), pot_line();
  26.  
  27. LPSTR win_lpCmdLine;
  28.  
  29. extern int time_to_restart;
  30. extern int time_to_reinit;
  31. extern int time_to_quit;
  32. extern int time_to_load;
  33. extern int time_to_save;
  34. extern int time_to_print;
  35. extern int time_to_cycle;
  36.  
  37. extern char FileName[];
  38. char string004[2];
  39.  
  40. unsigned char textcolor[27];
  41.  
  42. extern int xdots, ydots, colors, maxiter;
  43. extern int ytop, ybottom, xleft, xright;
  44.  
  45. int fractype;
  46. extern int invert;
  47.  
  48. double ftemp, xxmin, xxmax, yymin, yymax;
  49. long fudge;
  50. double xfudge;
  51.  
  52. long xvalue, yvalue;
  53. extern long lm, linitx, linity;
  54. int maxit, bitshift;
  55. extern int color, row, col;
  56.  
  57. int calc_status; /* -1 no fractal            */
  58.          /*  0 parms changed, recalc reqd   */
  59.          /*  1 actively calculating        */
  60.          /*  2 interrupted, resumable        */
  61.          /*  3 interrupted, not resumable   */
  62.          /*  4 completed            */
  63.  
  64. extern int reset_periodicity;
  65. extern int cpu;
  66. extern int kbdcount;
  67. extern int max_kbdcount;
  68. extern int show_orbit;
  69. extern int orbit_ptr;
  70. extern int periodicitycheck;
  71. extern int debugflag;
  72. int integerfractal;
  73. extern int distest;
  74. int oktoprint = 0;
  75. extern int bitshiftless1;
  76. char usr_stdcalcmode, stdcalcmode;
  77. int  usr_distest;
  78. int usr_floatflag, usr_periodicitycheck;
  79.  
  80. long creal, cimag;
  81. long delx, dely, delx2, dely2, delmin;
  82. long xmin, xmax, ymin, ymax, x3rd, y3rd;
  83. double  dxsize, dysize;        /* xdots-1, ydots-1        */
  84. double delxx, delyy, delxx2, delyy2, ddelmin, xx3rd, yy3rd;
  85. double param[4];
  86. double potparam[3];
  87. int diskvideo, savedac;
  88. long calctime;
  89. int mode7text, textsafe;
  90.  
  91. #define MAXLINE  2048
  92.  
  93. long   far *lx0, far *ly0, far *lx1, far *ly1;
  94. double far *dx0, far *dy0, far *dx1, far *dy1;
  95. extern double far *temp_array;
  96.  
  97. extern unsigned char trigndx[4];
  98.  
  99. unsigned char dacbox[257][3];
  100. double plotmx1, plotmx2, plotmy1, plotmy2;
  101. extern int MPOverflow;
  102. int dotmode;
  103. extern int pot16bit;
  104. int andcolor, resave_flag;
  105. extern int timer_interval;
  106. extern int active_ovly;
  107.  
  108. int extraseg;
  109. int timedsave = 0;
  110. int disk16bit = 0;
  111. extern int initbatch;
  112. float far initifs3d[32][13];
  113. float far initifs[32][7];
  114. extern unsigned char readname[];
  115. unsigned char MAP_name[40] = "";
  116. int rowcount;
  117. int adapter;
  118. extern int showfile;
  119. extern int initmode;
  120. extern int overlay3d;
  121. extern int display3d;
  122. extern int filetype;
  123. int comparegif = 0;
  124. int diskisactive = 0;
  125. extern int initsavetime;
  126. int saveticks = 0;
  127. int savebase = 0;
  128. int zwidth = 0;
  129. extern int (*outln)();
  130. extern int out_line();
  131. extern int outlin16();
  132. static int call_line3d();
  133. extern int line3d();
  134. extern int gifview();
  135. extern int tgaview();
  136. int hasconfig = 0;
  137. FILE *dacfile;
  138. int mapset = 0;
  139. int reallyega = 0;
  140. int loadPalette = 0;
  141. int compiled_by_turboc = 0;
  142.  
  143. int     sxdots,sydots;
  144. int     sxoffs=0,syoffs=0;
  145. int     viewwindow=0;
  146. float   viewreduction=1;
  147. int     viewcrop=1;
  148. float   finalaspectratio;
  149. int     viewxdots=0,viewydots=0;
  150. extern int filexdots, fileydots, filecolors;
  151. int frommandel;
  152.  
  153. int debug_fastupdate;        /* debugging - update every pixel if set */
  154.  
  155. int onthelist[100];        /* list of available fractal types */
  156. int CountFractalList;           /* how many are on the list? */
  157. extern int CurrentFractal;        /* which one is current? */
  158.  
  159. int Printer_Resolution, Printer_Titleblock, Printer_SFrequency;
  160. int Printer_SetScreen, Printer_SStyle, Printer_Type;
  161. int Printer_ColorXlat, Printer_SAngle, LPTnumber;
  162. int EPSFileType, Print_To_File, Printer_CRLF;
  163. int video_type, no_color_text;
  164.  
  165. int Distribution = 30, Offset = 0, Slope = 25;
  166. long con;
  167.  
  168. int active_system = WINFRAC;    /* running under windows */
  169. extern int win_display3d, win_overlay3d;
  170.  
  171. int iit = 0;
  172. int vesa_detect;
  173. int far videotable[2];
  174. int release;
  175. extern int win_release;
  176. char busy;
  177. int started_resaves = 0;
  178. int gotrealdac = 1;
  179. void    (*outln_cleanup)();
  180. extern int fpu;
  181. int svga_type = 0;
  182. int TranspSymmetry;
  183.  
  184. compare_fractalnames( const void *element1, const void *element2)
  185. {
  186. int i, j, k;
  187.     j = *(int*)element1;
  188.     k = *(int*)element2;
  189. for (i = 0; i < 100; i++) {
  190.     if (fractalspecific[j].name[i] < fractalspecific[k].name[i])
  191.         return(-1);
  192.     if (fractalspecific[j].name[i] > fractalspecific[k].name[i])
  193.         return(1);
  194.     if (fractalspecific[j].name[i] == 0)
  195.         return(0);
  196.     }
  197. return(0);
  198. }
  199.  
  200. fractint_main()
  201. {
  202. int i, k;
  203. double temp1, temp2;
  204. double dtemp;
  205.  
  206. outln_cleanup = NULL;        /* outln routine can set this */
  207.  
  208. CountFractalList = 0;
  209. for (k = 0; fractalspecific[k].name != NULL; k++)
  210.    if (fractalspecific[k].name[0] != '*' &&
  211.        (fractalspecific[k].flags & WINFRAC) != 0 &&
  212.        CountFractalList < 100) 
  213.             onthelist[CountFractalList++] = k;
  214. qsort(onthelist,CountFractalList,2,compare_fractalnames);
  215. CurrentFractal = fractype;
  216.  
  217. lx0 = (long far *)&temp_array[0*MAXLINE];
  218. ly0 = (long far *)&temp_array[1*MAXLINE];
  219. lx1 = (long far *)&temp_array[2*MAXLINE];
  220. ly1 = (long far *)&temp_array[2*MAXLINE];
  221. dx0 = (double far *)&temp_array[0*MAXLINE];
  222. dy0 = (double far *)&temp_array[1*MAXLINE];
  223. dx1 = (double far *)&temp_array[2*MAXLINE];
  224. dy1 = (double far *)&temp_array[2*MAXLINE];
  225. extraseg = FP_SEG(dx0);
  226.  
  227. restoredac();        /* ensure that the palette has been initialized */
  228.  
  229. win_cmdfiles();                /* SSTOOLS.INI processing */
  230.  
  231. initmode = 1;                           /* override SSTOOLS.INI */
  232.  
  233. release = win_release;
  234.  
  235. dotmode = 1;
  236. diskvideo = 0;
  237. usr_distest = 0;
  238.  
  239. max_kbdcount=(cpu==386) ? 80 : 30; /* check the keyboard less often */
  240.  
  241. /* ----- */
  242.  
  243. debug_fastupdate = 0;
  244. calc_status = -1;
  245. resave_flag = 1;
  246. strcpy(FileName,"Fract001");
  247. if (showfile != 0) {
  248.     strcpy(readname, FileName);
  249.     }
  250. else {
  251.     if (strchr(readname,'.') == NULL)
  252.      strcat(readname,".gif");
  253.     strcpy(FileName,readname);
  254.     time_to_load = 1;
  255.     }
  256.  
  257. if (debugflag == 23232) {   /* check for free memory */
  258.    char temp[50];
  259.    sprintf(temp," %d bytes of free stack space",stackavail());
  260.    stopmsg(0,temp);
  261.    }
  262.  
  263. if (debugflag == 70) fpu = 0;
  264.  
  265. /* ----- */
  266.  
  267. time_to_quit = 0;
  268. if (debugflag == 23232) /* give the Windows stuff control first */
  269.     getakey(); 
  270. if (time_to_quit)
  271.     return(0);
  272.  
  273. reinit:
  274.     time_to_reinit = 0;
  275.  
  276.     savedac = 0;             /* don't save the VGA DAC */
  277.  
  278.     for (i = 0; i < 4; i++) {
  279.         if(param[i] != FLT_MAX)
  280.             fractalspecific[fractype].paramvalue[i] = param[i];
  281.         else
  282.             param[i] = fractalspecific[fractype].paramvalue[i];
  283.         }
  284.  
  285. /*  Not used, MCP 8-6-91
  286.     ccreal = param[0]; ccimag = param[1]; */ /* default C-values */
  287.     frommandel = 0;
  288.  
  289.     if (xxmin > xxmax) {
  290.        dtemp = xxmin; xxmin = xxmax; xxmax = dtemp;} 
  291.     if (yymin > yymax) {
  292.        dtemp = yymin; yymin = yymax; yymax = dtemp;} 
  293.  
  294.     ytop    = 0;
  295.     ybottom = ydots-1;
  296.     xleft   = 0;
  297.     xright  = xdots-1;
  298.     filexdots = xdots;
  299.     fileydots = ydots;
  300.     filecolors = colors;
  301.  
  302. restart:
  303.     time_to_restart = 0;
  304.  
  305.     if (calc_status == -99)
  306.         calc_status = 2;            /* force a recalc */
  307.     else
  308.         calc_status = 0;            /* force a restart */
  309.  
  310.     maxit = maxiter;
  311.  
  312.     if (colors == 2 && (fractype == PLASMA || usr_stdcalcmode == 'b'))
  313.         colors = 16;         /* 2-color mode just doesn't work on these */
  314.  
  315.     andcolor = colors-1;
  316.  
  317.     debug_fastupdate = 0;    /* turn off debug-mode screen updates */
  318.     if (debugflag == 6666)
  319.         debug_fastupdate = 1;
  320.  
  321.     /* compute the (new) screen co-ordinates */
  322.     /* correct a possibly munged-up zoom-box outside the image range */
  323.     if (ytop    >= ydots) ytop    = ydots-1;
  324.     if (ybottom >= ydots) ybottom = ydots-1;
  325.     if (xleft   >= xdots) xleft   = xdots-1;
  326.     if (xright  >= xdots) xright  = xdots-1;
  327.     if (xleft == xright || ytop == ybottom) {
  328.         }
  329.     if (xleft > xright)
  330.         { i = xleft; xleft = xright; xright = i;}
  331.     if (ytop > ybottom)
  332.         { i = ybottom; ybottom = ytop; ytop = i;}
  333.     temp1 = xxmin;
  334.     temp2 = xxmax - xxmin;
  335.     xxmin = temp1 + (temp2 * xleft )/(xdots-1);
  336.     xxmax = temp1 + (temp2 * xright)/(xdots-1);
  337.     temp1 = yymin;
  338.     temp2 = yymax - yymin;
  339.     yymin = temp1 + (temp2 * (ydots - 1 - ybottom)/(ydots-1));
  340.     yymax = temp1 + (temp2 * (ydots - 1 - ytop   )/(ydots-1));
  341.     xx3rd = xxmin;
  342.     yy3rd = yymin;
  343.     xleft   = 0;
  344.     xright  = xdots-1;
  345.     ytop    = 0;
  346.     ybottom = ydots-1;
  347.  
  348. /*
  349.     delxx = (xxmax - xxmin) / (xdots-1);
  350.     delyy = (yymax - yymin) / (ydots-1);
  351.     delxx2 = delyy2 = 0.0;
  352.     ddelmin = fabs(delxx);
  353.     if (fabs(delyy) < ddelmin)
  354.         ddelmin = fabs(delyy);
  355. */
  356.  
  357.     dxsize = xdots - 1;  dysize = ydots - 1;
  358.  
  359.     if (calc_status != 2 && !overlay3d)
  360.         if (!clear_screen(1)) {
  361.             stopmsg(0,"Can't free and re-allocate the image");
  362.             return(0);
  363.             }
  364.  
  365.     dxsize = xdots - 1;  dysize = ydots - 1;
  366.     sxdots = xdots;  sydots = ydots;
  367.     finalaspectratio = ((float)ydots)/xdots;
  368.  
  369.     calcfracinit();
  370.  
  371.     bitshiftless1 = bitshift - 1;
  372.  
  373.     if (time_to_load)
  374.         goto wait_loop;
  375.  
  376.       if(showfile == 0) {        /* loading an image */
  377.      if (display3d)         /* set up 3D decoding */
  378.         outln = call_line3d;
  379.      else if(filetype >= 1)     /* old .tga format input file */
  380.         outln = outlin16;
  381.      else if(comparegif)        /* debug 50 */
  382.         outln = cmp_line;
  383.      else if(pot16bit) {        /* .pot format input file */
  384.         pot_startdisk();
  385.         outln = pot_line;
  386.         }
  387.      else                /* regular gif/fra input file */
  388.         outln = out_line;
  389.      if(filetype == 0)
  390.         i = funny_glasses_call(gifview);
  391.      else
  392.         i = funny_glasses_call(tgaview);
  393.      if(i == 0)
  394.         buzzer(0);
  395.      else {
  396.         calc_status = -1;
  397.         }
  398.      }
  399.  
  400.       if(showfile == 0) {        /* image has been loaded */
  401.      showfile = 1;
  402.      if (initbatch == 1 && calc_status == 2)
  403.         initbatch = -1; /* flag to finish calc before save */
  404.      if (calc_status == 2) goto try_to_resume;
  405.      }
  406.       else {                /* draw an image */
  407.  
  408. try_to_resume:
  409.  
  410.      diskisactive = 1;        /* flag for disk-video routines */
  411.      if (initsavetime != 0        /* autosave and resumable? */
  412.        && (fractalspecific[fractype].flags&NORESUME) == 0) {
  413.         savebase = readticker(); /* calc's start time */
  414.         saveticks = (long)initsavetime * 1092; /* bios ticks/minute */
  415.         if ((saveticks & 65535) == 0)
  416.            ++saveticks; /* make low word nonzero */
  417.         }
  418.          kbdcount = 30;                 /* ensure that we check the keyboard */
  419.      if ((i = calcfract()) == 0)    /* draw the fractal using "C" */
  420.         buzzer(0); /* finished!! */
  421.          saveticks = 0;         /* turn off autosave timer */
  422.          diskisactive = 0;        /* flag for disk-video routines */
  423.      }
  424.  
  425.     overlay3d = 0;      /* turn off overlay3d */
  426.     display3d = 0;      /* turn off display3d */
  427.  
  428.     zwidth = 0;
  429.  
  430.     if (!keypressed()) {
  431.         flush_screen();
  432.         buzzer(3);
  433.         getakey();
  434.         }
  435.  
  436. wait_loop:
  437.  
  438. for (;;) {
  439.     if (time_to_quit)
  440.          return(0);
  441.     if (time_to_load) {
  442.         strcpy(readname, FileName);
  443.         showfile = 1;
  444.         time_to_load = 0;
  445.         time_to_restart = 0;
  446.         overlay3d = win_overlay3d;
  447.         display3d = win_display3d;
  448.         if (win_load() >= 0) {
  449.             showfile = 0;
  450.             rowcount = 0;
  451.             ytop    = 0;        /* reset the zoom-box */
  452.             ybottom = ydots-1;
  453.             xleft   = 0;
  454.             xright  = xdots-1;
  455.             maxiter = maxit;
  456.             time_to_load = 0;
  457.             time_to_restart = 1;
  458.             if (calc_status == 2) {
  459.                 calc_status = -99;      /* special klooge for restart */
  460.                 }
  461.             }
  462.         win_overlay3d = 0;
  463.         win_display3d = 0;
  464.         }
  465.     if (time_to_save) {
  466.         strcpy(readname, FileName);
  467.         if (readname[0] != 0)
  468.             win_save();
  469.         time_to_save = 0;
  470.         if (calc_status == 2) {
  471.             calc_status = -99;
  472.             time_to_restart = 1;
  473.             }
  474.         }
  475.     if (time_to_print) {
  476.         win_print();
  477.         time_to_print = 0;
  478.         }
  479.     if (time_to_cycle) {
  480.        win_cycle();
  481.        }
  482.     if (time_to_reinit)
  483.          goto reinit;
  484.     if(time_to_restart)
  485.          goto restart;
  486.     getakey();
  487.     }
  488.  
  489. }
  490.  
  491. /* displays differences between current image file and new image */
  492. /* Bert - suggest add this to video.asm */
  493. int cmp_line(unsigned char *pixels, int linelen)
  494. {
  495.    static errcount;
  496.    static FILE *fp = NULL;
  497.    extern int rowcount;
  498.    int row,col;
  499.    int oldcolor;
  500.    char *timestring;
  501.    time_t ltime;
  502.    if(fp == NULL)
  503.       fp = fopen("cmperr",(initbatch)?"a":"w");
  504.    if((row = rowcount++) == 0)
  505.       errcount = 0;
  506.    if(pot16bit) { /* 16 bit info, ignore odd numbered rows */
  507.       if((row & 1) != 0) return(0);
  508.       row >>= 1;
  509.       }
  510.    for(col=0;col<linelen;col++) {
  511.       oldcolor=getcolor(col,row);
  512.       if(oldcolor==pixels[col])
  513.      putcolor(col,row,0);
  514.       else {
  515.      if(oldcolor==0)
  516.         putcolor(col,row,1);
  517.      ++errcount;
  518.      if(initbatch == 0)
  519.         fprintf(fp,"#%5d col %3d row %3d old %3d new %3d\n",
  520.            errcount,col,row,oldcolor,pixels[col]);
  521.      }
  522.       }
  523.    if(row+1 == ydots && initbatch) {
  524.       time(<ime);
  525.       timestring = ctime(<ime);
  526.       timestring[24] = 0; /*clobber newline in time string */
  527.       fprintf(fp,"%s compare to %s has %5d errs\n",timestring,readname,errcount);
  528.       }
  529.    return(0);
  530. }
  531.  
  532. int pot_line(unsigned char *pixels, int linelen)
  533. {
  534.    extern int rowcount;
  535.    int row,col,saverowcount;
  536.    if (rowcount == 0)
  537.       pot_startdisk();
  538.    saverowcount = rowcount;
  539.    row = (rowcount >>= 1);
  540.    if ((saverowcount & 1) != 0) /* odd line */
  541.       row += ydots;
  542.    else             /* even line */
  543.       if (dotmode != 11) /* display the line too */
  544.      out_line(pixels,linelen);
  545.    for (col = 0; col < xdots; ++col)
  546.       writedisk(col+sxoffs,row+syoffs,*(pixels+col));
  547.    rowcount = saverowcount + 1;
  548.    return(0);
  549. }
  550.  
  551. static int call_line3d(unsigned char *pixels, int linelen)
  552. {
  553.    /* this routine exists because line3d might be in an overlay */
  554.    return(line3d(pixels,linelen));
  555. }
  556.  
  557. void win_cmdfiles()   /* convert lpCmdLine into argc, argv */
  558. {
  559. int i, k;
  560. int argc;
  561. char *argv[10];
  562. unsigned char arg[501];   /* max 10 args, 450 chars total */
  563.  
  564. arg[0] = 0;
  565. for (i = 0; i < 10; i++)
  566.    argv[i] = &arg[0];
  567. argc = 1;
  568. strcpy(&arg[1],"winfract.exe");
  569. argv[argc-1] = &arg[1];
  570.  
  571. for (i = 0; i < 460 && win_lpCmdLine[i] != 0; i++)
  572.    arg[20+i] = win_lpCmdLine[i];
  573. arg[20+i] = 0;
  574. arg[21+i] = 0;
  575.  
  576. for (k = 20; arg[k] != 0; k++) {
  577.     while(arg[k] <= ' ' && arg[k] != 0) k++;
  578.     if (arg[k] == 0) break;
  579.     if (argc >= 10) break;
  580.     argc++;
  581.     argv[argc-1] = &arg[k];
  582.     while(arg[k] > ' ')k++;
  583.     arg[k] = 0;
  584.     }
  585.  
  586. cmdfiles(argc,argv);
  587.  
  588. }
  589.