/***********************************************************************\ * * * Melt -- Yet another screen hack. This is the direct * * result of playing with Tilt too late at night. * * Thank you Leo. * * * * Stephen Coy * * 15407 Garden St. Apt. C * * Sumner, WA 98390 * * uw-beaver!ssc-vax!coy * * * * This program may be freely distributed, modified and * * criticized. Use it as you see fit. * * * * Note: This compiles with Manx using 32-bit ints. If * * you want 16-bit ints you should just have to * * clean up melt(). * * * \***********************************************************************/ #include #include #define DEPTH 2 extern void *OpenLibrary(), *OpenWindow(), *OpenScreen(), *GetMsg(); struct NewScreen scrdef = { 0, 0, 0, 0, DEPTH, 0, 1, NULL, CUSTOMSCREEN, NULL, (UBYTE *) "Help me!", NULL, NULL }; struct NewWindow windef = { 0, 30, 140, 10, -1, -1, CLOSEWINDOW, WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH | ACTIVATE, NULL, NULL, (UBYTE *) "Melt", NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN }; struct Screen *scr; struct Window *win; struct TmpRas tmpras; void *IntuitionBase, *GfxBase; main() { struct Screen *wb; struct RastPort *rp; struct BitMap *wbm, *mbm; long x, y, n; register int i; openstuff(); wb = win->WScreen; scrdef.LeftEdge = wb->LeftEdge; scrdef.TopEdge = wb->TopEdge; scrdef.Width = wb->Width; scrdef.Height = wb->Height; scrdef.ViewModes = wb->ViewPort.Modes; if(!(scr = OpenScreen(&scrdef))) die("Screen open failed!"); ScreenToBack(scr); rp = &scr->RastPort; mbm = rp->BitMap; wbm = win->WScreen->RastPort.BitMap; BltBitMap(wbm, 0L, 0L, mbm, 0L, 0L, (long)scrdef.Width, (long)scrdef.Height, 0xc0L, 0xffL, NULL); ScreenToFront(scr); melt(rp, mbm); closestuff(); } melt(rp, bitmap) struct RastPort *rp; struct BitMap *bitmap; { int class; struct IntuiMessage *message; int x, y, /* start positions */ dx, dy, /* offsets */ u, v; /* size */ int TempA[32]; /* temp buffer */ char mask; /* bit-plane mask for blitter */ FOREVER { message = (struct IntuiMessage *)GetMsg(win->UserPort); if(message != (struct IntuiMessage *)NULL) { class = message->Class; ReplyMsg(message); if(class == CLOSEWINDOW) { return; } } for(mask=1; mask<+(1<Width - 3) + 1; v = RangeRand(scr->Height - 3) + 1; x = RangeRand(scr->Width - 1 - u) + 1; y = RangeRand(scr->Height - 2 - v) + 1; dx = RangeRand(3) - 1; dy = RangeRand(3); /* also try dy = RangeRand(3) - 1; */ BltBitMap(bitmap, x, y, bitmap, x+dx, y+dy, u, v, 0x0c0, mask, TempA); } /* end of for mask */ } /* end of FOREVER */ } /* end of melt */ openstuff() { if(!(IntuitionBase = OpenLibrary("intuition.library", 0L))) { puts("Intuition missing."); exit(100); } if(!(GfxBase = OpenLibrary("graphics.library", 0L))) { puts("Art shop clode."); exit(100); } if(!(win = OpenWindow(&windef))) { puts("Window painted shut."); closestuff(); exit(100); } } die(str) char *str; { puts(str); closestuff(); exit(100); } closestuff() { if(tmpras.RasPtr) FreeRaster(tmpras.RasPtr, 320, 200); if(scr) CloseScreen(scr); if(win) CloseWindow(win); if(GfxBase) CloseLibrary(GfxBase); if(IntuitionBase) CloseLibrary(IntuitionBase); }