Path: utzoo!attcan!uunet!tut.cis.ohio-state.edu!brutus.cs.uiuc.edu!apple!sun-barr!sun!pepper!cmcmanis
From: cmcmanis%pepper@Sun.COM (Chuck McManis)
Newsgroups: comp.sys.amiga.tech
Subject: Re: Copper Effects In C.
Message-ID: <120748@sun.Eng.Sun.COM>
Date: 10 Aug 89 19:14:42 GMT
References: <7741@charlie.OZ>
Sender: news@sun.Eng.Sun.COM
Reply-To: cmcmanis@sun.UUCP (Chuck McManis)
Organization: Sun Microsystems, Mountain View
Lines: 140

In article <7741@charlie.OZ> (Shane Hyde) writes:
>	I was wondering if there was anyone out there, who could tell me
>how to program copper effects in C on Amy.  The ones I am specifically
>trying to do are color changes midway down the screen.  I don't have any
>docs on the register assignments.  

There are a couple of ways to do this, one is to much with UCopList et al
and the other is to simply set up two viewports with different colors. 
Have the second one start where you want the colors to change. Then you 
can MrgCop()/LoadView() and poof. I wrote a little program that did it 
this way for the Dr. Dobbs article, 'cuz it's short I've included it below.


/* 
 *	dualvp.c - Dual Viewports on the amiga
 *	Written 4/4/89 by C. McManis using Lattice C 5.02
 */

#include 
#include 
#include 
#include 
#include 
#include 

extern struct GfxBase *GfxBase;

char	*TextString = "Amiga Graphics Example";

			/* Viewport 0 colors */
UWORD			colors0[4] = {0xccc, 0x000, 0x0f0, 0x00f},
			/* Viewport 1 colors */
			colors1[4] = {0x0f0, 0xc0c, 0xf00, 0xfff};
void
_main()
{
	struct View	MyView, *OldView;
	struct ViewPort	Vp0, Vp1;
	struct BitMap	Bits;
	struct RasInfo	MyRaster;
    	struct RastPort	rp;
	int		i;

	/* Open the resident graphics library */
	GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
	if (!GfxBase) 
		exit(1);

	OldView = GfxBase->ActiView; /* Save this away */

	/* Initialize the View structures */
	InitView(&MyView);
	InitVPort(&Vp0);
	InitVPort(&Vp1);

	Vp1.Next = NULL;
	Vp0.Next = &Vp1;	/* create a linked list of viewports */
	MyView.ViewPort = &Vp0;	/* With the first one being Vp0 */

	/* Set up some display memory */

	InitBitMap(&Bits, 2, 640, 200); 
	Bits.Planes[0] = (PLANEPTR)
			 AllocMem(2*RASSIZE(640, 200),MEMF_CHIP+MEMF_CLEAR);
	Bits.Planes[1] = Bits.Planes[0] + RASSIZE(640, 200);
	if (!Bits.Planes[0]) 
		goto cleanup;

	MyRaster.BitMap = &Bits;
	MyRaster.RxOffset = 0;
	MyRaster.RyOffset = 0;
	MyRaster.Next = NULL;

	/* Both viewports are looking at the same display memory but have
         * different sets of colors
	 */

	Vp0.RasInfo = &MyRaster;
	Vp0.DWidth  = 320;
	Vp0.DHeight = 175;
	Vp0.ColorMap = (struct ColorMap *)GetColorMap(4);
	LoadRGB4(&Vp0, colors0, 4);
	
	Vp1.RasInfo = &MyRaster;
	Vp1.DWidth  = 640;
	Vp1.DHeight = 20;
	Vp1.DyOffset = 179;
	Vp1.Modes   = HIRES;
	Vp1.ColorMap = (struct ColorMap *)GetColorMap(4);
	LoadRGB4(&Vp1, colors1, 4);

	
	/* Initialize a RastPort so that we can draw into that memory. */
	InitRastPort(&rp);
	rp.BitMap = &Bits;
	SetAPen(&rp, 1);	/* Foreground color */
	SetBPen(&rp, 0);	/* Background color */
	Move(&rp, 3, 12);	/* Move the graphics cursor to (3, 12) */
	/* Write something */
	Text(&rp, TextString, strlen(TextString));
	
	MakeVPort(&MyView, &Vp0); /* Build the copper list for Viewport 0 */
	MakeVPort(&MyView, &Vp1); /* Build the copper list for Viewport 1 */
	MrgCop(&MyView); 	  /* Merge it into the final list */

	LoadView(&MyView);	  /* Show it off */

	/* SPIN FOR A WHILE */
	for (i=0; i<1000000; i++)
		;

	LoadView(OldView); 	  /* Return to the old view */

	
cleanup:
	/* Now give back the memory other tasks may need it */

	if (!Vp0.ColorMap)
		FreeColorMap(Vp0.ColorMap);

	if (!Vp1.ColorMap)
		FreeColorMap(Vp1.ColorMap);

	FreeVPortCopLists(&Vp0);
	FreeVPortCopLists(&Vp1);
	FreeCprList(MyView.LOFCprList);


	if (!Bits.Planes[0]) 
		FreeMem(Bits.Planes[0], 2*RASSIZE(640, 200));

	if (!GfxBase) 
		CloseLibrary(GfxBase);

	exit(0);
}
--Chuck McManis
uucp: {anywhere}!sun!cmcmanis   BIX: cmcmanis  ARPAnet: cmcmanis@sun.com
These opinions are my own and no one elses, but you knew that didn't you.
"A most excellent barbarian ... Genghis Kahn!"