Path: utzoo!attcan!uunet!portal!cup.portal.com!FelineGrace
From: FelineGrace@cup.portal.com (Dana B Bourgeois)
Newsgroups: comp.sys.amiga.tech
Subject: Re: back to dual playfields under Intuition
Message-ID: <22679@cup.portal.com>
Date: 30 Sep 89 07:31:24 GMT
References: <20125@usc.edu> <20136@usc.edu> <3806@blake.acs.washington.edu>
Distribution: na
Organization: The Portal System (TM)
Lines: 260

[[ line-eater food ]]

Here is the example from the 1.2 Enhancer Manual.  Had a couple extra
hours and typed it in.  Enjoy!

Dana Bourgeois @ cup.portal.com
/********************************************************************

* Example program for Dual-Playfield Screens

*

* copyright Commodore-Amiga, Inc., Sept. 1986. use at will

* author: jim mackraz(amiga!jimm)
*********************************************************************

* Turn the workbench into dual playfield.

* You can use the same trick for your own screens,
* which is the recommended method for creating duall-playfield
* screens. (Please don't really do this to the Workbench.)
*
* Start with a new, single-playfield screen
* (don't set DUALPF in NewScreen.ViewModes)
* Allocate a second palyfield, set up a rastport for
* rendering into it, and install it into your open screen
* as shown here.  Intuition will never know about or use your
* second playfiled for its rendering(menus, gadgets, etc.).
* Be sure to remove evidence of your deed before CloseScreen().
*/

#define printf kprintf


struct Remember	*rememberkey=NULL;
struct Window	*getNewWind();

struct IntuitionBase	*IntuitionBase;
struct GfxBase		*GfxBase;

ULONG iflg=CLOSEWINDOW;

main()
{
	struct Intuimessage *msg;
	struct Window *window=NULL;
	WORD exitval=0;

/* hold data from *msg */
	ULONG class;

/* specific for this test */
	struct Screen *wbscreen;
	struct RasInfo *rinfo2=NULL; /* second playfield rasinfo*/
	struct BitMap *bmap2=NULL;   /* and bitmap              */
	struct RasPort *rport2=NULL; /* for rendering into bmap2*/
	BOOL it_is_done=FALSE;       /* success flag            */
	int counter=0;               /* for timing the visuals  */

	if(!(IntuitionBAse=(struct IntuitionBase*)
		OpenLibrary("intuition.library",0)))

	{
		printf("NO INTUITION LIBRARY 0);

		exitval=1;
		goto EXITING;
	}

	if(!(GfxBase=(struct GfxBase *)
		OpenLibrary("graphics.library",0)))

	{
		printf("NO GRAPHICS LIBRARY0);
		exitval=2;
		goto EXITING;
	}

/* get a window on the workbench */
	window=getNewWindow(320,20,300,50,flg,iflg);
	if(window==NULL)
	{
		printf("test:can't get window.0);
		exitval=1;
		goto EXITING;
	}

/*----- Add a second playfield for WorkBench-----*/

	wbscreen=window -> WScreen;	/*find it */

/* allocate seconde palyfield's rasinfo, bitmap, and bitplane */
	if(!rinfo2=(struct RasInfo *)
		AllocMem(sizeof(struct RasInfo),
		MEMF_PUBLIC|MEMF_CLEAR)))
	{
		printf("alloc rasinfo failed0);
		goto EXITING;
	}

	if(!(bmap2=struct BitMap *)
		AllocMem(sizeof(struct BitMap),
		MEMF_PUBLIC|MEMF_CLEAR)))
	{
		printf("aloc bitmap failed0);
		goto EXITING;
	}

	InitBitMap(bmap2,1,wbscreen -> Width,wbscreen -> Height);

/* we'll use 1 plane. */
	if (!(bmap2 -> Planes[0]=
		(UWORD *) AllocRaster(wbscreen -> Width,
		wbscreen -> Height)))
	{
		printf("alloc raster failed0);
		goto EXITING;
	}

/* get a tastport, and set it up for rendering into bmap2 */
	if(!(rport2=(struct RastPort *)
		AllocMem(sizeof(struct RastPort), MEMF_PUBLIC)))
	{
		printf("alloc rastport failed0);
		goto EXITING;
	}

	InitRastPort(rport2);
	rport2 -> BitMap=bmap2;

	SetRAst(rport2,0);

/* manhandle viewport: install second playfield and change modes */
	Forbid();
	rinfo2 -> BitMap=bmap2;/*install my bitmap in my rasinfo */

	wbscreen -> ViewPort.Modes | =DUALPF;
		/* convert viewport */

	it_is_done=TRUE;

	Permit();

/* set my foreground color */
	SetRGB4(&wbscreen->ViewPort,9,0,0xF,0);
/* color 9 is color 1 for second playfield of hi-res viewport */

/* put viewport changed into effect */
	MakeScreen(wbscreen);
	RethinkDisplay();

	drawSomething(rport2);

	printf("test program ok0);

	FOREVER
	{
		if ((msg=(struct IntuiMessage *) 
			GetMsg(window->UserPort))==NULL)
		{
			Wait(1<UserPort->
				UserPort->mp_SigBit);
			continue;
		}

		class=msg->Class;
		ReplyMsg(msg);
		switch(class)
		{
		case CLOSEWINDOW:
			printf("event CLOSEWINDOW0);
			goto EXITING;
		default:
			printf("unknown event class%1x0,class);
		}
	}

EXITING:
/* clean up dual-playfield trick */
	if(it_is_done)
	{
		Forbid();
		wbscreen->ViewPort.RasInfo->Next=NULL;
		wbscreen->ViewPort.Modes &= DUALPF;
		Permit();
		MakeScreen(wbscreen);
		RethinkDisplay();
	}

	if(rport2)FreeMem(rport2,sizeof(struct RastPort));
	if(bmap2)
	{
		if(bmap2->Planes[0])
		{
			FreeRaster(bmap2->Planes[0],wbscreen->Width,
				 wbscreen->Height);
		}
		FreeMem(bmap2,sizeof(struct BitMap));
	}
	if(rinfo2)FreeMem(rinfo2,sizeof(struct RasInfo));

	if(window)CloseWindow(window);
	if(GfxBase)CloseLibrary(GfxBase);
	if(IntuitionBase)CloseLibrary(IntuitionBase);

	exit(exitval);
}

drawSomething(rp)
struct RastPort *rp;
{
	int width, height;
	int r,c;

	width=rp->BitMap->BytesPerRow*8;
	height=rp->BitMap->Rows;

	SetAPen(rp,1);

	for(r=0;r