[net.sources.mac] How to surround lines with regions

sdh@joevax.UUCP (The Doctor) (08/19/86)

#include <quickdraw.h>
#include <window.h>
#include <event.h>
#include <osutil.h>

/* In this little hack is a routine that will create a rectangular region
 * that surrounds a line, with a 2 pixel leeway on each side.
 * Written by Steve Hawley     8/19/86
 * Aztec C ver 1.06H
 *
 * Note that it is imperative to have the rectangle definition be "proper".
 * This means that left hand side must be less than the right, and the
 * top less than the bottom.
 */

WindowRecord	wRecord;
WindowPtr	myWindow;
EventRecord myEvent;

surrnd_line(x1, y1, x2, y2, region)
int x1, y1, x2, y2;
RgnHandle region;
{
	Rect temprect;
	register int bucket;
	
	/* make the rectangle "proper" */
	
	if (x1 > x2) {
		bucket = x1;
		x1 = x2;
		x2 = bucket;
	}
	if (y1 > y2) {
		bucket = y1;
		y1 = y2;
		y2 = bucket;
	}
	
	SetRect(&temprect, x1, y1, x2, y2); 
	/* define a rectangle that will contain the line */
	InsetRect(&temprect, -2, -2);
	RectRgn(region, &temprect);
	/* expand it 2 pixels on each side.
	 * Note that these three lines could probably have been done as:
	      SetRectRgn(region, x1-2, y1-2, x2+2, y2+2);
	 * but I chose the above for readability. They speed difference
	 * is probably minimal.
	 */
}

main ()
{
	Rect screen;
	RgnHandle r1, r2 ,r3;
	register int i1 = 0, i2 = 0, i3 = 0;
	long ticks;
	
	InitGraf(&thePort);	/* do inits */
	InitWindows();
	FlushEvents(everyEvent,0);
	SetCursor(&arrow);
	HideCursor();
	SetRect(&screen, 10, 40, 502, 340); /*set up window */
	myWindow = NewWindow(&wRecord, &screen, ctop("regions"),
			1,0,(char*)-1,1,(long)0);
	SetPort(myWindow);
	ShowWindow(myWindow);
	/* make 3 new regions */
	r1 = NewRgn();
	r2 = NewRgn();
	r3 = NewRgn();
	
	/* do some magic numbers to define them */
	MoveTo(10,10);
	LineTo(25, 40);
	surrnd_line(10, 10, 25, 40, r1);
	FrameRgn(r1);
	MoveTo(70,5);
	LineTo(30,200);
	surrnd_line(70, 5, 30, 200, r2);
	FrameRgn(r2);
	MoveTo(150, 250);
	LineTo(300,200);
	surrnd_line(150, 250, 300, 200, r3);
	FrameRgn(r3);
	/* make them flash. */
	while(!Button()) {
		Delay(3L, &ticks); /* delay 3 ticks */
		++i1;
		++i2;
		++i3;
		if (i1 > 3) {
			i1 = 0;
			InvertRgn(r1); /* unique rates for all 3 */
				       /* hooray for magic numbers */
		}
		if (i2 > 7) {
			i2 = 0;
			InvertRgn(r2);
		}
		if (i3 > 11) {
			i3 = 0;
			InvertRgn(r3);
		}
	}
}