home *** CD-ROM | disk | FTP | other *** search
- /* IceFrac.c - Diffusion Limited Aggregation simulator */
- /* Version 2.2 */
- /* (c) 1989 by Lars R. Clausen */
- /* PaletteReq (c) 1989 by Jonathan Potter */
- #include <exec/types.h>
- #include <graphics/gfxbase.h>
- #include <graphics/view.h>
- #include <intuition/intuition.h>
- #include <libraries/iff.h>
- #include <stdio.h>
- #include <hardware/blit.h>
- #include <hardware/dmabits.h>
- #include <math.h>
- #include <PaletteReq.h>
-
- /*#define USEBLIT*/
-
- void *OpenLibrary();
- struct Window *OpenWindow();
- struct Screen *OpenScreen();
- struct IntuiMessage *GetMsg();
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- struct Library *IFFBase = NULL;
- struct Window *w;
- struct Screen *s;
-
- long code=1,ColCount=250,ColJump=250,Planes=5;
- int *BZero = (0xdff002L);
- char ifffile[] = "FracPic001";
- unsigned char MoveBits=224;
- unsigned char TestBits=224;
- int Die=1,XSize=320,YSize=255,A1MinX=2,A1MinY=252,A1MaxX=317,A1MaxY=252;
- int EnterOnEdge=1,A2MinX=-1,A2MinY=127,A2MaxX=160,A2MaxY=127,MaxIt=100,Margin=2;
-
- char UndoBuff[4],XSBuff[4]="320",YSBuff[4]="255",A1XMinBuff[4]="2",
- A1YMinBuff[4]="252",A1XMaxBuff[4]="317",A1YMaxBuff[4]="252",A2XMinBuff[4]="-1",
- A2YMinBuff[4]="127",A2XMaxBuff[4]="160",A2YMaxBuff[4]="127",MIBuff[4]="100",
- MargBuff[4]="2",ColBuff[4]="250";
- char HiRes=0,Lace=0,Pal=1,A2Off=1;
- struct Gadget BigGad = { NULL,0,0,320,255,GADGHNONE,RELVERIFY|FOLLOWMOUSE|
- GADGIMMEDIATE,BOOLGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL};
-
- struct NewScreen ns = {0,0,320,256,5,1,2,NULL,CUSTOMSCREEN,NULL,NULL,NULL,NULL};
-
- struct NewWindow nw = {
- 0,1,320,255,-1,-1,GADGETUP|MOUSEMOVE|VANILLAKEY|GADGETDOWN,NOCAREREFRESH|ACTIVATE|BORDERLESS,
- &BigGad,NULL,NULL, NULL,NULL,0,0,0,0,CUSTOMSCREEN};
-
- short ColorMap[32] = { /* format 0x0RGB */
- /* 0-7 */ 0x0000,0x0FFF,0x0DDF,0x0CCF,0x0AAF,0x099F,0x077F,0x066F ,
- /* 8-15 */ 0x044F,0x046D,0x047B,0x0489,0x0496,0x04B4,0x04D2,0x04F0 ,
- /* 16-23 */ 0x06F0,0x08F0,0x0BF0,0x0DF0,0x0FF0,0x0FD0,0x0FB0,0x0F90 ,
- /* 24-31 */ 0x0F70,0x0F50,0x0F00,0x0F55,0x0F77,0x0F99,0x0FBB,0x0FDD };
-
- SHORT GadPairs[6][10]={{-1,-1,49,-1,49,9,-1,9,-1,-1},{-2,-2,33,-2,33,9,-2,9,-2,-2},
- {0,0,4,0,4,4,0,4,0,0},{-1,-1,25,-1,25,9,-1,9,-1,-1},{-1,-1,34,-1,34,9,-1,9,-1,-1},
- {-1,-1,149,-1,149,9,-1,9,-1,-1}};
- struct Border Gad6Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[0],NULL};
- struct Border Gad4Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[1],NULL};
- struct Border Gad4Bordb={0,0,3,0,JAM2,5,(SHORT *)GadPairs[4],NULL};
- struct Border MiniBord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[2],NULL};
- struct Border Gad3Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[3],NULL};
- struct Border Gad13Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[5],NULL};
- struct IntuiText GadText[8]=
- {{1,0,JAM1,1,1,NULL,(UBYTE *)"Regrow",NULL},
- {1,0,JAM1,5,1,NULL,(UBYTE *)"Go On",NULL},
- {1,0,JAM1,1,1,NULL,(UBYTE *)"Cancel",NULL},
- {11,0,JAM1,1,1,NULL,(UBYTE *)"Die",NULL},
- {11,0,JAM1,1,1,NULL,(UBYTE *)"Edge",NULL},
- {1,0,JAM1,1,1,NULL,(UBYTE *)"Make",NULL},
- {1,0,JAM1,1,1,NULL,(UBYTE *)"Make",NULL},
- {1,0,JAM1,1,1,NULL,(UBYTE *)" Change Colors",NULL}};
- struct StringInfo StrInfo[13]=
- {{(UBYTE *)&XSBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&YSBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A1XMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A1YMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A1XMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A1YMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A2XMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A2YMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A2XMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&A2YMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&MIBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&MargBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
- {(UBYTE *)&ColBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}};
- struct Gadget DMReqGadget[37] =
- {{NULL,5,152,49,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET|TOGGLESELECT,
- BOOLGADGET,(APTR)&Gad6Bord,NULL,&GadText[0],0,0,0,0},
- {&DMReqGadget[0],105,152,49,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET|TOGGLESELECT
- ,BOOLGADGET,(APTR)&Gad6Bord,NULL,&GadText[2],0,0,1,0},
- {&DMReqGadget[1],68,21,25,9,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|TOGGLESELECT
- ,BOOLGADGET,(APTR)&Gad3Bord,NULL,&GadText[3],0,0,2,0},
- {&DMReqGadget[2],50,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,3,0},
- {&DMReqGadget[3],55,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,4,0},
- {&DMReqGadget[4],60,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,5,0},
- {&DMReqGadget[5],50,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,6,0},
- {&DMReqGadget[6],60,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,7,0},
- {&DMReqGadget[7],50,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,8,0},
- {&DMReqGadget[8],55,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,9,0},
- {&DMReqGadget[9],60,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,10,0},
- {&DMReqGadget[10],115,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,11,0},
- {&DMReqGadget[11],120,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,12,0},
- {&DMReqGadget[12],125,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,13,0},
- {&DMReqGadget[13],115,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,14,0},
- {&DMReqGadget[14],125,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,15,0},
- {&DMReqGadget[15],115,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,16,0},
- {&DMReqGadget[16],120,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,17,0},
- {&DMReqGadget[17],125,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,18,0},
- {&DMReqGadget[18],45,43,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[0],19,0},
- {&DMReqGadget[19],121,43,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[1],20,0},
- {&DMReqGadget[20],7,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[2],21,0},
- {&DMReqGadget[21],45,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[3],22,0},
- {&DMReqGadget[22],83,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[4],23,0},
- {&DMReqGadget[23],121,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[5],24,0},
- {&DMReqGadget[24],7,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[6],25,0},
- {&DMReqGadget[25],45,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[7],26,0},
- {&DMReqGadget[26],83,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[8],27,0},
- {&DMReqGadget[27],121,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[9],28,0},
- {&DMReqGadget[28],83,109,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[10],29,0},
- {&DMReqGadget[29],83,120,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[11],30,0},
- {&DMReqGadget[30],82,130,34,9,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
- TOGGLESELECT,BOOLGADGET,(APTR)&Gad4Bordb,NULL,&GadText[4],0,0,31,0},
- {&DMReqGadget[31],55,152,49,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET|TOGGLESELECT
- ,BOOLGADGET,(APTR)&Gad6Bord,NULL,&GadText[1],0,0,32,0},
- {&DMReqGadget[32],120,65,34,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET
- ,BOOLGADGET,(APTR)&Gad4Bordb,NULL,&GadText[5],0,0,33,0},
- {&DMReqGadget[33],120,87,34,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET
- ,BOOLGADGET,(APTR)&Gad4Bordb,NULL,&GadText[6],0,0,34,0},
- {&DMReqGadget[34],121,54,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
- 0,0,0,(APTR)&StrInfo[12],35,0},
- {&DMReqGadget[35],5,140,149,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&Gad13Bord,
- 0,&GadText[7],0,NULL,36,0},
- };
-
- struct Requester DMReq;
- SHORT ReqBorderPairs[10]={0,0,158,0,158,165,0,165,0,0};
- struct Border DMReqBorder={0,0,1,0,JAM2,5,(SHORT *)&ReqBorderPairs[0],NULL};
- struct IntuiText DMReqText[12]=
- {{1,0,JAM1,4,3,NULL,(UBYTE *)"Move:",NULL},
- {1,0,JAM1,70,3,NULL,(UBYTE *)"Test:",&DMReqText[0]},
- {1,0,JAM1,4,21,NULL,(UBYTE *)"Border:",&DMReqText[1]},
- {1,0,JAM1,4,32,NULL,(UBYTE *)"Size:",&DMReqText[2]},
- {1,0,JAM1,4,43,NULL,(UBYTE *)"X:",&DMReqText[3]},
- {1,0,JAM1,84,43,NULL,(UBYTE *)"Y:",&DMReqText[4]},
- {1,0,JAM1,4,65,NULL,(UBYTE *)"StartArea 1:",&DMReqText[5]},
- {1,0,JAM1,4,87,NULL,(UBYTE *)"StartArea 2:",&DMReqText[6]},
- {1,0,JAM1,4,109,NULL,(UBYTE *)"MaxIt:",&DMReqText[7]},
- {1,0,JAM1,4,120,NULL,(UBYTE *)"Margin:",&DMReqText[8]},
- {1,0,JAM1,4,131,NULL,(UBYTE *)"Enter on:",&DMReqText[9]},
- {1,0,JAM1,4,54,NULL,(UBYTE *)"Color change:",&DMReqText[10]}};
-
- MySetDMRequester()
- {
- InitRequester(&DMReq);
- DMReq.LeftEdge = 50;
- DMReq.TopEdge = 30;
- DMReq.Width = 159;
- DMReq.Height = 166;
- DMReq.RelLeft = -80;
- DMReq.RelTop = -77;
- DMReq.ReqGadget = &DMReqGadget[36];
- DMReq.ReqText = &DMReqText[11];
- DMReq.BackFill = 0;
- DMReq.ReqBorder = &DMReqBorder;
- DMReq.Flags |= POINTREL;
- SetDMRequest(w,&DMReq);
- }
-
- DrawBox(rp,startx,starty,endx,endy)
- struct RastPort *rp;
- long startx,starty,endx,endy;
- {
- if ((startx!=endx)&&(starty!=endy))
- {
- Move(rp,startx,starty);
- Draw(rp,endx,starty);
- Draw(rp,endx,endy);
- Draw(rp,startx,endy);
- Draw(rp,startx,starty+1);
- }
- }
-
- GetSquare(fromx,fromy,nr)
- long fromx,fromy;
- int nr;
- {
- struct IntuiMessage *msg;
- long initx,inity,endx,endy,currx,curry,partx,party,t;
- int invx=0,invy=0,i;
- struct RastPort *rp;
-
- initx=fromx;inity=fromy;
- rp=w->RPort;
- endx=initx;endy=inity;
- WaitPort(w->UserPort);
- msg=(struct IntuiMessage *)GetMsg(w->UserPort);
- SetDrMd(rp,COMPLEMENT);
- for (;msg->Class==MOUSEMOVE;)
- {
- currx=msg->MouseX; curry=msg->MouseY; ReplyMsg(msg);
- if ((invx==1)&&(currx>=initx)&&(currx<endx)) initx=currx;
- if ((invy==1)&&(curry>=inity)&&(curry<endy)) inity=curry;
- if ((invx==1)&&(currx>=initx)&&(currx>=endx)) { invx=0; initx=endx;endx=currx;}
- if ((invy==1)&&(curry>=inity)&&(curry>=endy)) { invy=0; inity=endy;endy=curry;}
- if ((currx>=initx)&&(invx==0)) endx=currx;
- if ((curry>=inity)&&(invy==0)) endy=curry;
- if ((currx<initx)&&(invx==0)) { invx=1; endx=initx; initx=currx;}
- if ((curry<inity)&&(invy==0)) { invy=1; endy=inity; inity=curry;}
- if (currx<initx) initx=currx;
- if (curry<inity) inity=curry;
- DrawBox(rp,initx,inity,endx,endy);
- WaitPort(w->UserPort);
- msg=(struct IntuiMessage *)GetMsg(w->UserPort);
- DrawBox(rp,initx,inity,endx,endy);
- }
- if (nr==1)
- {
- sprintf(&A1XMinBuff[0],"%ld",initx);
- sprintf(&A1XMaxBuff[0],"%ld",endx);
- sprintf(&A1YMinBuff[0],"%ld",inity);
- sprintf(&A1YMaxBuff[0],"%ld",endy);
- }
- else
- {
- sprintf(&A2XMinBuff[0],"%ld",initx);
- sprintf(&A2XMaxBuff[0],"%ld",endx);
- sprintf(&A2YMinBuff[0],"%ld",inity);
- sprintf(&A2YMaxBuff[0],"%ld",endy);
- }
- SetDrMd(w->RPort,JAM1);
- }
-
- int ChangePara()
- {
- struct IntuiMessage *msg;
- struct Gadget *hit;
- int i=2,j=0,tmp;
-
- for (;w->Flags&INREQUEST;WaitPort(w->UserPort))
- {
- msg=GetMsg(w->UserPort);
- if (msg->Class==GADGETDOWN)
- {
- hit = (struct Gadget *)msg->IAddress;
- if ((hit->GadgetID > 32)&&(hit->GadgetID<35))
- {
- do {} while (ClearDMRequest(w)==FALSE);
- do
- {
- ReplyMsg(msg);
- WaitPort(w->UserPort);
- msg=GetMsg(w->UserPort);
- }
- while (msg->Class!=GADGETDOWN);
- GetSquare((long)msg->MouseX,(long)msg->MouseY,hit->GadgetID-32);
- hit->Flags&=!SELECTED;
- SetDMRequest(w,&DMReq);
- Request(&DMReq,w);
- }
- if (hit->GadgetID == 36) palette_request(w,10L,10L,"Change Colors",NULL,Planes);
- ReplyMsg(msg);
- }
- }
- if (!(DMReqGadget[1].Flags&0x0080))
- {
- if (DMReqGadget[32].Flags&0x0080) {j=2;DMReqGadget[32].Flags&=0xFF7F;}
- else {j=1; DMReqGadget[0].Flags&=0xFF7F;}
- if (DMReqGadget[2].Flags&SELECTED) Die=1; else Die=0;
- if (DMReqGadget[3].Flags&SELECTED) MoveBits|=0x01; else MoveBits&=0xFE;
- if (DMReqGadget[4].Flags&SELECTED) MoveBits|=0x02; else MoveBits&=0xFD;
- if (DMReqGadget[5].Flags&SELECTED) MoveBits|=0x04; else MoveBits&=0xFB;
- if (DMReqGadget[6].Flags&SELECTED) MoveBits|=0x08; else MoveBits&=0xF7;
- if (DMReqGadget[7].Flags&SELECTED) MoveBits|=0x10; else MoveBits&=0xEF;
- if (DMReqGadget[8].Flags&SELECTED) MoveBits|=0x20; else MoveBits&=0xDF;
- if (DMReqGadget[9].Flags&SELECTED) MoveBits|=0x40; else MoveBits&=0xBF;
- if (DMReqGadget[10].Flags&SELECTED) MoveBits|=0x80; else MoveBits&=0x7F;
- if (DMReqGadget[11].Flags&SELECTED) TestBits|=0x01; else TestBits&=0xFE;
- if (DMReqGadget[12].Flags&SELECTED) TestBits|=0x02; else TestBits&=0xFD;
- if (DMReqGadget[13].Flags&SELECTED) TestBits|=0x04; else TestBits&=0xFB;
- if (DMReqGadget[14].Flags&SELECTED) TestBits|=0x08; else TestBits&=0xF7;
- if (DMReqGadget[15].Flags&SELECTED) TestBits|=0x10; else TestBits&=0xEF;
- if (DMReqGadget[16].Flags&SELECTED) TestBits|=0x20; else TestBits&=0xDF;
- if (DMReqGadget[17].Flags&SELECTED) TestBits|=0x40; else TestBits&=0xBF;
- if (DMReqGadget[18].Flags&SELECTED) TestBits|=0x80; else TestBits&=0x7F;
- if (j==1) XSize=atoi(&XSBuff[0]);
- if (j==1) { YSize=atoi(&YSBuff[0]); ChangeSize(); ColCount=0;}
- A1MinX=atoi(&A1XMinBuff[0]);
- A1MinY=atoi(&A1YMinBuff[0]);
- A1MaxX=atoi(&A1XMaxBuff[0]);
- A1MaxY=atoi(&A1YMaxBuff[0]);
- A2MinX=atoi(&A2XMinBuff[0]);
- A2MinY=atoi(&A2YMinBuff[0]);
- A2MaxX=atoi(&A2XMaxBuff[0]);
- A2MaxY=atoi(&A2YMaxBuff[0]);
- MaxIt=atoi(&MIBuff[0]);
- Margin=atoi(&MargBuff[0]);
- ColJump=atoi(&ColBuff[0]);
- if (ColJump<1) ColJump=-1;
- if (DMReqGadget[31].Flags&SELECTED) EnterOnEdge=1; else EnterOnEdge=0;
- if (A1MinX<2) A1MinX=2;
- if (A1MinY<2) A1MinY=2;
- if ((A2MinX<2)&&(A2MinX!=-1)) A2MinX=2;
- if (A2MinY<2) A2MinY=2;
- if (A1MaxX>XSize-3) A1MaxX=XSize-3;
- if (A1MaxY>YSize-3) A1MaxY=YSize-3;
- if (A2MaxX>XSize-3) A2MaxX=XSize-3;
- if (A2MaxY>YSize-3) A2MaxY=YSize-3;
- if (A1MinX>XSize-3) A1MinX=XSize-3;
- if (A1MinY>YSize-3) A1MinY=YSize-3;
- if (A2MinX>XSize-3) A2MinX=XSize-3;
- if (A2MinY>YSize-3) A2MinY=YSize-3;
- if (MaxIt<2) MaxIt=2;
- if (Margin>MaxIt) Margin=MaxIt;
- if (Margin<2) Margin=2;
- code++;
- /*printf("Current Blit Code is : %d\n",code);*/
- }
- else
- {
- DMReqGadget[1].Flags&=!SELECTED;
- for (msg=GetMsg(w->UserPort);msg!=NULL;ReplyMsg(msg),
- msg=GetMsg(w->UserPort));
- if (Die==1) DMReqGadget[2].Flags|=SELECTED; else DMReqGadget[2].Flags&=!SELECTED;
- if (MoveBits&1) DMReqGadget[3].Flags|=SELECTED; else DMReqGadget[3].Flags&=!SELECTED;
- if (MoveBits&2) DMReqGadget[4].Flags|=SELECTED; else DMReqGadget[4].Flags&=!SELECTED;
- if (MoveBits&4) DMReqGadget[5].Flags|=SELECTED; else DMReqGadget[5].Flags&=!SELECTED;
- if (MoveBits&8) DMReqGadget[6].Flags|=SELECTED; else DMReqGadget[6].Flags&=!SELECTED;
- if (MoveBits&16) DMReqGadget[7].Flags|=SELECTED; else DMReqGadget[7].Flags&=!SELECTED;
- if (MoveBits&32) DMReqGadget[8].Flags|=SELECTED; else DMReqGadget[8].Flags&=!SELECTED;
- if (MoveBits&64) DMReqGadget[9].Flags|=SELECTED; else DMReqGadget[9].Flags&=!SELECTED;
- if (MoveBits&128) DMReqGadget[10].Flags|=SELECTED; else DMReqGadget[10].Flags&=!SELECTED;
- if (TestBits&1) DMReqGadget[11].Flags|=SELECTED; else DMReqGadget[11].Flags&=!SELECTED;
- if (TestBits&2) DMReqGadget[12].Flags|=SELECTED; else DMReqGadget[12].Flags&=!SELECTED;
- if (TestBits&4) DMReqGadget[13].Flags|=SELECTED; else DMReqGadget[13].Flags&=!SELECTED;
- if (TestBits&8) DMReqGadget[14].Flags|=SELECTED; else DMReqGadget[14].Flags&=!SELECTED;
- if (TestBits&16) DMReqGadget[15].Flags|=SELECTED; else DMReqGadget[15].Flags&=!SELECTED;
- if (TestBits&32) DMReqGadget[16].Flags|=SELECTED; else DMReqGadget[16].Flags&=!SELECTED;
- if (TestBits&64) DMReqGadget[17].Flags|=SELECTED; else DMReqGadget[17].Flags&=!SELECTED;
- if (TestBits&128) DMReqGadget[18].Flags|=SELECTED; else DMReqGadget[18].Flags&=!SELECTED;
- if (EnterOnEdge==1) DMReqGadget[31].Flags|=SELECTED; else DMReqGadget[31].Flags&=!SELECTED;
- j=0;
- }
- sprintf(&A1XMinBuff[0],"%d",A1MinX);
- sprintf(&A2XMinBuff[0],"%d",A2MinX);
- sprintf(&A1YMinBuff[0],"%d",A1MinY);
- sprintf(&A2YMinBuff[0],"%d",A2MinY);
- sprintf(&A1XMaxBuff[0],"%d",A1MaxX);
- sprintf(&A2XMaxBuff[0],"%d",A2MaxX);
- sprintf(&A1YMaxBuff[0],"%d",A1MaxY);
- sprintf(&A2YMaxBuff[0],"%d",A2MaxY);
- sprintf(&MIBuff[0],"%d",MaxIt);
- sprintf(&MargBuff[0],"%d",Margin);
- sprintf(&XSBuff[0],"%d",XSize);
- sprintf(&YSBuff[0],"%d",YSize);
- sprintf(&ColBuff[0],"%ld",ColJump);
- return(j);
- }
-
- ChangeSize()
- {
- if (XSize<10) XSize=10;
- if (YSize<10) YSize=10;
- if (XSize>640) XSize=640;
- if ((Pal)&&(YSize>511)) YSize=511;
- if ((!Pal)&&(YSize>399)) YSize=399;
- if ((XSize<321)&&(HiRes==1))
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- ns.ViewModes&=(!HIRES);
- ns.Width=320;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- nw.Width=320;
- BigGad.Width=nw.Width;
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- HiRes=0;
- }
- if ((XSize>320)&&(XSize<641)&&(HiRes==0))
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- ns.ViewModes|=HIRES;
- ns.Width=640;
- if (Planes==5) ns.Depth=4;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- nw.Width=640;
- BigGad.Width=nw.Width;
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- HiRes=1;
- }
- if (Pal)
- {
- if ((YSize<256)&&(Lace==1))
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- ns.ViewModes&=(!LACE);
- ns.Height=256;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- nw.Height=255;
- BigGad.Height=nw.Height;
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- Lace=0;
- }
- if ((YSize>255)&&(Lace==0))
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- ns.ViewModes|=LACE;
- ns.Height=512;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- nw.Height=511;
- BigGad.Height=nw.Height;
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- Lace=1;
- }
- }
- else
- {
- if ((YSize<200)&&(Lace==1))
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- ns.ViewModes&=(!LACE);
- ns.Height=200;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- nw.Height=199;
- BigGad.Height=nw.Height;
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- Lace=0;
- }
- if ((YSize>199)&&(Lace==0))
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- ns.ViewModes&=LACE;
- ns.Height=400;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- nw.Height=399;
- BigGad.Height=nw.Height;
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- Lace=1;
- }
- }
- }
-
- OpenAll()
- {
- if (!(GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0L)))
- abort(101);
- if (GfxBase->NormalDisplayRows==200) Pal=0;
-
- if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L)))
- abort(102);
-
- if(!(IFFBase = OpenLibrary(IFFNAME,IFFVERSION)))
- abort(103);
- ns.Depth=Planes;
- if (!Pal)
- ns.Height=200;
- if (!(s=(struct Screen *)OpenScreen(&ns)))
- abort(104);
-
- LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
- nw.Screen=s;
- if (!Pal)
- {
- nw.Height=BigGad.Height=YSize=199;
- A1MaxY=A1MinY=197;
- strcpy(A1YMinBuff,"197");
- strcpy(A1YMaxBuff,"197");
- strcpy(YSBuff,"199");
- }
- if (!(w = (struct Window *) OpenWindow(&nw)))
- abort(105);
- MySetDMRequester();
- }
-
- abort(exitcode)
- {
- for (;!ClearDMRequest(w););
- if (w) CloseWindow(w);
- if (s) CloseScreen(s);
- if (IFFBase) CloseLibrary(IFFBase);
- if (GfxBase) CloseLibrary(GfxBase);
- OpenWorkBench();
- if (IntuitionBase) CloseLibrary(IntuitionBase);
- exit(exitcode);
- }
-
- DisplayUsage()
- {
- puts("IceFrac - A Diffusion Limited Aggregation simulator.");
- puts("Usage: IceFrac [-P#planes]");
- puts("1989 By Lars R. Clausen");
- puts("Critics, comments & contributions are welcome.");
- exit(0);
- }
- main(argc,argv)
- int argc;
- char *argv[];
- {
- struct IntuiMessage *msg;
- register int t,maxx,minx,maxy,miny;
- long sec,mic,i,j=2;
- int iffcount=0,alldone=0;
- register long x,y,dir;
-
- if (argc==2)
- {
- if (toupper(argv[1][1])=='P') Planes=atoi(&argv[1][2]);
- else DisplayUsage();
- }
- ColCount=ColJump;
- OpenAll();
- CurrentTime(&sec,&mic);
- sec=mic; mic>>8; mic+=sec;
- srand((int)mic);
- if (!A2Off)
- {
- if (A1MinX>A2MinX) minx=A2MinX-Margin;
- else minx=A1MinX-Margin;
- if (A1MaxX>A2MaxX) maxx=A1MaxX+Margin;
- else maxx=A2MaxX+Margin;
- if (A1MinY>A2MinY) miny=A2MinY-Margin;
- else miny=A1MinY-Margin;
- if (A1MaxY>A2MaxY) maxy=A1MaxY+Margin;
- else maxy=A2MaxY+Margin;
- }
- else
- {
- minx=A1MinX-Margin;
- maxx=A1MaxX+Margin;
- miny=A1MinY-Margin;
- maxy=A1MaxY+Margin;
- }
- if (minx<1) minx=1;
- if (maxx>XSize-2) maxx=XSize-2;
- if (miny<1) miny=1;
- if (maxy>YSize-2) maxy=YSize-2;
- SetAPen(w->RPort,1L);
- RectFill(w->RPort,(long)A1MinX,(long)A1MinY,(long)A1MaxX,(long)A1MaxY);
- if (!A2Off)RectFill(w->RPort,(long)A2MinX,(long)A2MinY,(long)A2MaxX,(long)A2MaxY);
- for (;;)
- {
- i=0;
- do
- {
- x=rand()%(maxx-minx)+minx;
- y=rand()%(maxy-miny)+miny;
- if (EnterOnEdge==1)
- {
- if (rand()%(maxx-minx+maxy-miny)<maxy-miny)
- if (rand()%2==1) x=minx;
- else x=maxx;
- else
- if (rand()%2==1) y=miny;
- else y=maxy;
- }
- alldone=0;
- if (i++>=100)
- {
- alldone=1;
- for (x=minx,y=miny;(x<=maxx)&&(alldone==1);x++)
- if (ReadPixel(w->RPort,x,(long)miny)==0) alldone=0;
- x--;
- if (alldone==1)
- {
- for (x=minx,y=miny;(y<=maxy)&&(alldone==1);y++)
- if (ReadPixel(w->RPort,(long)minx,y)==0) alldone=0;
- y--;
- }
- if (alldone==1)
- {
- for (x=maxx,y=miny;(y<=maxy)&&(alldone==1);y++)
- if (ReadPixel(w->RPort,(long)maxx,y)==0) alldone=0;
- y--;
- }
- if (alldone==1)
- {
- for (x=minx,y=maxy;(x<=maxx)&&(alldone==1);x++)
- if (ReadPixel(w->RPort,x,(long)maxy)==0) alldone=0;
- x--;
- }
- printf("Alldone=%d, x=%ld,y=%ld\n",alldone,x,y);
- }
- }
- while (((x<1)||(x>XSize-2)||(y<1)||(y>YSize-2)||(ReadPixel(w->RPort,x,y)!=0))&&(alldone==0));
- for (t=0;t<MaxIt;t++)
- {
- #ifdef USEBLIT
- /* Doesn't work yet */
- printf("Blitting at %ld,%ld - code = %ld\n",x-1,y-1,code);
- BltBitMapRastPort(&s->BitMap,x-1,y-1,&w->RPort,x-1,y,3L,3L,code);
- printf("Done\n");
- if (!(*BZero&(1<<13))) t=MaxIt+10;
- #else
- if ((TestBits&0x01)&&(ReadPixel(w->RPort,x-1,y-1))) t=MaxIt+10;
- if ((TestBits&0x02)&&(ReadPixel(w->RPort,x,y-1))) t=MaxIt+10;
- if ((TestBits&0x04)&&(ReadPixel(w->RPort,x+1,y-1))) t=MaxIt+10;
- if ((TestBits&0x08)&&(ReadPixel(w->RPort,x-1,y))) t=MaxIt+10;
- if ((TestBits&0x10)&&(ReadPixel(w->RPort,x+1,y))) t=MaxIt+10;
- if ((TestBits&0x20)&&(ReadPixel(w->RPort,x-1,y+1))) t=MaxIt+10;
- if ((TestBits&0x40)&&(ReadPixel(w->RPort,x,y+1))) t=MaxIt+10;
- if ((TestBits&0x80)&&(ReadPixel(w->RPort,x+1,y+1))) t=MaxIt+10;
- #endif
- if (t==MaxIt+10)
- {
- if (x+Margin>maxx) maxx=x+Margin;
- if (x-Margin<minx) minx=x-Margin;
- if (y+Margin>maxy) maxy=y+Margin;
- if (y-Margin<miny) miny=y-Margin;
- if (maxx>XSize-2) maxx=XSize-2;
- if (maxy>YSize-2) maxy=YSize-2;
- if (miny<1) miny=1;
- if (minx<1) minx=1;
- if (ColJump>-1) SetAPen(w->RPort,(long)ColCount++/ColJump);
- if (ColCount>ColJump*(1<<Planes)) ColCount=0;
- if (ColCount/ColJump==0) ColCount+=ColJump;
- WritePixel(w->RPort,x,y);
- }
- else
- {
- dir=rand()%8;
- if ((dir==0)&&(MoveBits&0x08)) x--;
- if ((dir==1)&&(MoveBits&0x10)) x++;
- if ((dir==2)&&(MoveBits&0x02)) y--;
- if ((dir==3)&&(MoveBits&0x40)) y++;
- if ((dir==4)&&(MoveBits&0x20)) { y++; x--; }
- if ((dir==5)&&(MoveBits&0x80)) { y++; x++; }
- if ((dir==6)&&(MoveBits&0x01)) { y--; x--; }
- if ((dir==7)&&(MoveBits&0x04)) { y--; x++; }
- if (Die)
- if ((x<=1)||(y<=1)||(x>=XSize-2)||(y>=YSize-2))
- {
- t=MaxIt;
- }
- }
- }
- if (alldone) WaitPort(w->UserPort);
- alldone=0;
- if (w->Flags&INREQUEST)
- if ((j=ChangePara())!=0)
- {
- if (j==1)
- {
- SetAPen(w->RPort,1L);
- Move(w->RPort,0L,0L);
- ClearScreen(w->RPort);
- if (A2MinX==-1) A2Off=1; else A2Off=0;
- RectFill(w->RPort,(long)A1MinX,(long)A1MinY,(long)A1MaxX,(long)A1MaxY);
- if (!A2Off)
- {
- RectFill(w->RPort,(long)A2MinX,(long)A2MinY,(long)A2MaxX,(long)A2MaxY);
- if (A1MinX>A2MinX) minx=A2MinX-Margin;
- else minx=A1MinX-Margin;
- if (A1MaxX>A2MaxX) maxx=A1MaxX+Margin;
- else maxx=A2MaxX+Margin;
- if (A1MinY>A2MinY) miny=A2MinY-Margin;
- else miny=A1MinY-Margin;
- if (A1MaxY>A2MaxY) maxy=A1MaxY+Margin;
- else maxy=A2MaxY+Margin;
- }
- else
- {
- minx=A1MinX-Margin;
- maxx=A1MaxX+Margin;
- miny=A1MinY-Margin;
- maxy=A1MaxY+Margin;
- }
- if (minx<1) minx=1;
- if (maxx>XSize-2) maxx=XSize-2;
- if (miny<1) miny=1;
- if (maxy>YSize-2) maxy=YSize-2;
- }
- }
- if (msg=GetMsg(w->UserPort))/* User messages */
- {
- if (msg->Class==VANILLAKEY)
- {
- if (msg->Code==27) abort(0);
- if (msg->Code==32)
- {
- if (!SaveBitMap(ifffile,&s->BitMap,0L,1L))
- puts("Error in saving picture");
- ifffile[10]++;
- if (ifffile[10]==58)
- {
- ifffile[9]++;
- ifffile[10]=48;
- if (ifffile[9]==58)
- {
- ifffile[9]=48;
- ifffile[8]++;
- }
- }
- }
- ReplyMsg(msg);
- }
- }
- }
- abort(0);
- }
-