home *** CD-ROM | disk | FTP | other *** search
/ Computerworld 1996 March / Computerworld_1996-03_cd.bin / idg_cd3 / grafika / fraktaly / wins1821 / mainfrac.c < prev    next >
C/C++ Source or Header  |  1996-02-13  |  16KB  |  609 lines

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