tdn@cmu-cs-spice.ARPA (Thomas Newton) (03/27/85)
This is the source code for the Saddle desk accessory, written in C for the
Megamax C compiler (v2.0, mixed-case toolbox names).
-- Thomas Newton
Thomas.Newton@cmu-cs-spice.ARPA
/*
* Saddle desk accessory
*
* Copyright (c) 1985 Thomas Newton
* May be reproduced freely for personal use
* but not for commercial use, provided
* that this notice remains intact.
*
*/
#include <desk.h>
#include <acc.h>
#include <qd.h>
#include <event.h>
#include <file.h>
#include <win.h>
#include <device.h>
ACC(0x2400, /* Enable control, need time */
2, /* Thirty times per second */
0x0140, /* Activate, update events */
0, /* No menu items */
7, "Saddle ") /* Length and text of title */
#define NIL 0
#define TRUE 1
#define abs(x) ((x)<0?-(x):(x))
/* Constants related to window size */
#define xSize 256
#define ySize 256
#define minXRange 128 /* xSize/2 */
#define minYRange 128 /* ySize/2 */
#define n 36 /* (xSize + YSize)/14 */
/* Globals */
WindowPtr window; /* our window */
Rect windowRect; /* its size */
int x11, y11, x12, y12;
int x21, y21, x22, y22;
int x1, y1, x2, y2, deltaX1, deltaY1, deltaX2, deltaY2;
int i, delay = 0;
int update_lock = 0;
int oldi;
char title[] = "Saddle";
/* Driver routines */
accopen(dctl, pb)
dctlentry *dctl;
paramblockrec *pb;
{
if (!dctl->dCtlWindow) createWindow(dctl);
return 0;
}
accclose(dctl, pb)
dctlentry *dctl;
paramblockrec *pb;
{
DisposeWindow(window);
dctl->dCtlWindow = NIL;
return 0;
}
accctl(dctl, pb)
dctlentry *dctl;
paramblockrec *pb;
{ SetPort(window);
switch (pb->paramunion.CntrlParam.CSCode) {
case accEvent:
handleEvent((EventRecord *) /* We really have an event */
pb->paramunion.CntrlParam.csParam.diskBuff);
break;
case accRun:
update_lock += 1;
if (update_lock == 1) updateSaddle();
update_lock -= 1;
break;
}
return 0;
}
accprime()
{
}
accstatus()
{
}
/* Real routines */
/* Create our window */
createWindow(dctl)
dctlentry *dctl;
{
SetRect(&windowRect, 0, 0, xSize, ySize);
OffsetRect(&windowRect, 128, 50);
window = NewWindow((WindowPeek) NIL, &windowRect, title, TRUE,
RDocProc, (WindowPtr) -1, TRUE, 0);
dctl->dCtlWindow = window;
OffsetRect(&windowRect, -128, -50);
SetPort(window);
((WindowPeek) window)->windowKind = dctl->dCtlRefNum;
}
handleEvent(event)
EventRecord *event;
{
switch (event->what) {
case updateEvt:
updateEvent();
break;
}
}
updateEvent()
{
update_lock += 1;
if (update_lock == 1) {
BeginUpdate(window);
SetPort(window);
if ((i == 0) && (delay > 0)) {
i = n; /* Redraw entire previous saddle */
}
if ((i > 0) && (i <= n)) {
oldi = i;
i = 0;
while (i < oldi) {
DrawSaddle();
}
}
EndUpdate(window);
}
update_lock -= 1;
}
/* Predeclare functions used by updateSaddle() */
int RandomMod();
int min();
int max();
updateSaddle()
{ int flag = NIL;
SetPort(window);
if (i == 0) {
if (delay == 0) {
EraseRect(&windowRect);
flag = NIL;
while (flag == NIL) {
x11 = RandomMod(xSize);
y11 = RandomMod(ySize);
x12 = RandomMod(xSize);
y12 = RandomMod(ySize);
x21 = RandomMod(xSize);
y21 = RandomMod(ySize);
x22 = RandomMod(xSize);
y22 = RandomMod(ySize);
if ((range(x11, x12, x21, x22) >= minXRange) &&
(range(y11, y12, y21, y22) >= minYRange)) {
flag = TRUE;
}
}
delay = 30; /* reset delay for next clear screen */
DrawSaddle();
}
else
delay = delay - 1; /* pause between drawings */
}
else
DrawSaddle();
}
int RandomMod(wrap)
int wrap;
{ int temp1;
temp1 = Random();
if (temp1 == -32768) {
temp1 = -32767;
}
temp1 = abs(temp1);
temp1 = temp1 - (wrap * (temp1 / wrap));
return(temp1);
}
DrawSaddle()
{
if (i == 0) {
/* calculate drawing increments */
deltaX1 = (x12 - x11) / n;
deltaY1 = (y12 - y11) / n;
deltaX2 = (x22 - x21) / n;
deltaY2 = (y22 - y21) / n;
/* initialize Saddle line endpoints */
x1 = x11;
y1 = y11;
x2 = x21;
y2 = y21;
}
/* draw one line of Saddle itself */
MoveTo(x1, y1);
LineTo(x2, y2);
x1 = x1 + deltaX1;
y1 = y1 + deltaY1;
x2 = x2 + deltaX2;
y2 = y2 + deltaY2;
i = i + 1;
if (i > n) {
i = 0;
}
}
int min (i1, i2, i3, i4)
int i1, i2, i3, i4;
{ int t;
t = i1;
if (i2 < t) {
t = i2;
}
if (i3 < t) {
t = i3;
}
if (i4 < t) {
t = i4;
}
return(t);
}
int max (i1, i2, i3, i4)
int i1, i2, i3, i4;
{ int t;
t = i1;
if (i2 > t) {
t = i2;
}
if (i3 > t) {
t = i3;
}
if (i4 > t) {
t = i4;
}
return(t);
}
int range (i1, i2, i3, i4)
int i1, i2, i3, i4;
{
return(max(i1, i2, i3, i4) - min(i1, i2, i3, i4));
}