/**************************************************************** * fault fractals, by John M. Olsen ****************************************************************/ #include #include #include #include #include #include #include /* Only one of the following two should be defined. */ /* #define NOCYCLE /* define this to make it not color cycle. */ #define CYCLE /* define this to make it color cycle. */ #define WIDTH 320 #define HEIGHT 200 #define BASE 0 int trash; long mybltsize, offset, minbltsize; void *OpenLibrary(); struct IntuiMessage *GetMsg(), *msg; struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Screen *s, *s1, *OpenScreen(); struct Window *w, *w1, *w2, *w3, *OpenWindow(); BYTE *AllocRaster(); WORD areabuffer[250]; struct TmpRas tmpras; struct AreaInfo myareainfo; struct NewScreen ss = { 0,0,320,200,5,0,1, /* 5 planes */ NULL,CUSTOMSCREEN,NULL,(UBYTE *)" Fractal Brownian Motion", NULL,NULL }; struct NewScreen ss1 = { 0,0,320,200,2,0,1, /* 2 planes */ NULL,CUSTOMSCREEN,NULL,(UBYTE *)" Sneaky Blitter Work Area", NULL,NULL }; struct NewWindow ww = { 0,0,320,200,-1,-1,MOUSEBUTTONS, /* IDCMP */ NOCAREREFRESH | BACKDROP | BORDERLESS | RMBTRAP, NULL,NULL,(UBYTE *)NULL, NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct NewWindow wb = { 0,0,14,10,-1,-1, CLOSEWINDOW, /* IDCMP */ NOCAREREFRESH | WINDOWCLOSE | BORDERLESS | RMBTRAP, NULL,NULL,(UBYTE *)NULL, NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct NewWindow wb1 = { 0,0,14,10,-1,-1, CLOSEWINDOW, /* IDCMP */ NOCAREREFRESH | WINDOWCLOSE | BORDERLESS | RMBTRAP, NULL,NULL,(UBYTE *)NULL, NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct NewWindow ww1 = { 0,0,320,200,-1,-1,MOUSEBUTTONS, /* No IDCMP */ NOCAREREFRESH | BACKDROP | BORDERLESS | RMBTRAP, NULL,NULL,(UBYTE *)NULL, NULL,NULL,0,0,0,0,CUSTOMSCREEN }; short colormap[32] = { 0x000, 0x101, 0x111, 0x212, 0x222, 0x323, 0x333, 0x434, 0x444, 0x545, 0x555, 0x656, 0x666, 0x767, 0x777, 0x878, 0x888, 0x989, 0x999, 0xa9a, 0xaaa, 0xbab, 0xbbb, 0xcbc, 0xccc, 0xdcd, 0xddd, 0xede, 0xeee, 0xfee, 0xfef, 0xfff }; main(argc, argv) char *argv[]; { long count, class, code; struct RastPort *r, *r1; register long x,y; float m,b,theta; setup(); r = w->RPort; r1 = w1->RPort; SetRast(r,(long)BASE); while(1) { if(msg = GetMsg(w->UserPort)) ReplyMsg(msg); if(msg = GetMsg(w1->UserPort)) ReplyMsg(msg); if(msg = GetMsg(w2->UserPort)) { class = msg->Class; ReplyMsg(msg); if(class == CLOSEWINDOW) die(0); } if(msg = GetMsg(w3->UserPort)) { class = msg->Class; ReplyMsg(msg); if(class == CLOSEWINDOW) die(0); } /* draw mask into plane 0 of s1 */ SetRast(r1, 0L); SetAPen(r1, 1L); AreaMove(r1, (long)(rand()%320), (long)(rand()%200)); AreaDraw(r1, (long)(rand()%320), (long)(rand()%200)); AreaDraw(r1, (long)(rand()%320), (long)(rand()%200)); AreaEnd(r1); if(count) fracadd(r,w1->RPort->BitMap->Planes[1], w1->RPort->BitMap->Planes[0]); else fracsub(r,w1->RPort->BitMap->Planes[1], w1->RPort->BitMap->Planes[0]); #ifdef CYCLE FudgeColors(); #endif count = !count; } } setup() { long sec,mic; register long i,j; if(!(GfxBase = OpenLibrary("graphics.library",0L))) die(1); if(!(IntuitionBase = OpenLibrary("intuition.library",0L))) die(1); if(!(s1 = OpenScreen(&ss1))) die(2); ww1.Screen = s1; if(!(w1 = OpenWindow(&ww1))) die(3); wb1.Screen = s1; if(!(w3 = OpenWindow(&wb1))) die(3); if(!(s = OpenScreen(&ss))) die(2); ww.Screen = s; if(!(w = OpenWindow(&ww))) die(3); wb.Screen = s; if(!(w2 = OpenWindow(&wb))) die(3); LoadRGB4(&s->ViewPort, colormap, 32L); InitArea(&myareainfo, areabuffer, 100L); w1->RPort->AreaInfo = &myareainfo; tmpras.RasPtr = (BYTE *) AllocRaster(320L, 200L); tmpras.Size = (long) RASSIZE(320L, 200L); w1->RPort->TmpRas = &tmpras; offset = 10 * w1->RPort->BitMap->BytesPerRow; minbltsize = ((w1->RPort->BitMap->Rows - 10) << 6) | (w1->RPort->BitMap->BytesPerRow >> 1); /* now make the silly title visible. Colors 1,2,3 -> 8,16,24 */ for(i = 0; i < 10; i++) { for(j = 0; j < 320; j++) { SetAPen(&(s->RastPort), (long)(8*ReadPixel(&(s->RastPort),j,i))); WritePixel(&(s->RastPort), j,i); } } CurrentTime(&sec,&mic); srand((int)mic); /* microseconds makes a good random seed. */ } fracadd(r,a,b) struct RastPort *r; PLANEPTR a,b; { register int x, newoff; newoff = offset; mybltsize = ((w1->RPort->BitMap->Rows - 10) << 6) | (w1->RPort->BitMap->BytesPerRow >> 1); OwnBlitter(); for(x = 0; x < 5; x++) /* for each bitplane */ { WaitBlit(); /* plane a = plane x AND plane b */ custom.bltapt = (APTR)(b+newoff); custom.bltbpt = (APTR)(r->BitMap->Planes[x]+newoff); custom.bltdpt = (APTR)(a+newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | ABC | ABNC; custom.bltsize = mybltsize; /* plane x = plane x XOR plane b */ WaitBlit(); custom.bltapt = (APTR)(b+newoff); custom.bltbpt = (APTR)(r->BitMap->Planes[x]+newoff); custom.bltdpt = (APTR)(r->BitMap->Planes[x]+newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | ANBC | NABC | ANBNC | NABNC; custom.bltsize = mybltsize; /* plane b = plane a */ WaitBlit(); custom.bltapt = (APTR)(a+newoff); custom.bltdpt = (APTR)(b+newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | ABC | ANBC | ABNC | ANBNC; custom.bltsize = mybltsize; } /* fill planes with 1 wherever plane b is set to 1, except for title area. */ #ifdef NOCYCLE for(x = 0; x < 5; x++) { WaitBlit(); custom.bltapt = (APTR)(b + offset); custom.bltbpt = (APTR)(r->BitMap->Planes[x] + offset); custom.bltdpt = (APTR)(r->BitMap->Planes[x] + offset); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | A_OR_B; custom.bltsize = minbltsize; } #endif WaitBlit(); DisownBlitter(); } fracsub(r,a,b) struct RastPort *r; PLANEPTR a,b; { register int x,newoff; newoff = offset; mybltsize = ((w1->RPort->BitMap->Rows - 10) << 6) | (w1->RPort->BitMap->BytesPerRow >> 1); OwnBlitter(); for(x = 0; x < 5; x++) /* for each bitplane */ { WaitBlit(); /* plane a = !plane x AND plane b */ custom.bltapt = (APTR)(b+newoff); custom.bltbpt = (APTR)(r->BitMap->Planes[x]+newoff); custom.bltdpt = (APTR)(a+newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | ANBC | ANBNC; custom.bltsize = mybltsize; /* plane x = plane x XOR plane b */ WaitBlit(); custom.bltapt = (APTR)(b+newoff); custom.bltbpt = (APTR)(r->BitMap->Planes[x]+newoff); custom.bltdpt = (APTR)(r->BitMap->Planes[x]+newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | ANBC | NABC | ANBNC | NABNC; custom.bltsize = mybltsize; /* plane b = plane a */ WaitBlit(); custom.bltapt = (APTR)(a+newoff); custom.bltdpt = (APTR)(b+newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | ABC | ANBC | ABNC | ANBNC; custom.bltsize = mybltsize; } /* fill planes with 0 wherever plane a is set to 1 */ #ifdef NOCYCLE for(x = 0; x < 5; x++) { WaitBlit(); custom.bltapt = (APTR)(b + newoff); custom.bltbpt = (APTR)(r->BitMap->Planes[x] + newoff); custom.bltdpt = (APTR)(r->BitMap->Planes[x] + newoff); custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltamod = 0; custom.bltbmod = 0; custom.bltdmod = 0; custom.bltcon1 = 0; custom.bltcon0 = BC0F_SRCA | BC0F_SRCB | BC0F_DEST | NABC | NABNC ; custom.bltsize = mybltsize; } #endif WaitBlit(); DisownBlitter(); } FudgeColors() { short a, i; a = colormap[31]; for(i = 31; i > 0; i--) colormap[i] = colormap[i-1]; colormap[0] = a; LoadRGB4(&s->ViewPort, colormap, 32L); } die(kind) int kind; { while(msg = GetMsg(w->UserPort)) ReplyMsg(msg); while(msg = GetMsg(w1->UserPort)) ReplyMsg(msg); while(msg = GetMsg(w2->UserPort)) ReplyMsg(msg); while(msg = GetMsg(w3->UserPort)) ReplyMsg(msg); if(tmpras.RasPtr) FreeRaster(tmpras.RasPtr, 320L, 200L); if(w2) CloseWindow(w2); if(w3) CloseWindow(w3); if(w1) CloseWindow(w1); if(s1) CloseScreen(s1); if(w) CloseWindow(w); if(s) CloseScreen(s); if(IntuitionBase) CloseLibrary(IntuitionBase); if(GfxBase) CloseLibrary(GfxBase); exit(kind); }