[comp.sys.amiga] melt.c, another screen hack

coy@ssc-vax.UUCP (03/26/87)

/***********************************************************************\
*									*
*	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 <exec/types.h>
#include <intuition/intuition.h>

#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<<DEPTH)-1; mask*=2) {
	    u = RangeRand(scr->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);
}