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