home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff258.lzh
/
DMouse
/
dlineart.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-18
|
14KB
|
695 lines
/*
* DLineArt.c
*
* DMouse screen blanker for use with DMouse V1.20
*
* read the docs file for installation procedures.
*
* Is your computer BORED? If so, then you need...
*
* DLineArt, by Steve -Raz- Berry with help
* from Matt Dillon.
*
* Compile +L w/ sup32.lib. libs:dres.library no longer required
*/
#include <local/typedefs.h>
#include <local/ipc.h>
#include <local/xmisc.h>
typedef struct IORequest IORequest;
#define MAXELLIPSE 75
/* Be carefule if modifiying the following defines... */
int MAXX, MAXY;
#define MINBOUND 20
#define BOUNDX MAXX-MINBOUND
#define BOUNDY MAXY-MINBOUND
#define TEXTSTR 0x10
#define SPLINES 0x8
#define LINES 0x4
#define BOXES 0x2
#define ELLIPSES 0x1
/* Maximun # of lines,boxes,ellipses to draw (watch your stack!) */
#define MAXLINES 500
UWORD coltbl[2] = {
0x000, /* background color */
0x500
};
extern int Enable_Abort;
RP *rp;
VP *vp;
static SCR *Scr;
static WIN *Win;
static TA Ta = { (ubyte *)"topaz.font", 11 };
static NS Ns = { 0, 0, 0, 0, 1, -1, -1, HIRES|LACE, CUSTOMSCREEN|SCREENQUIET, &Ta };
static NW Nw = { 0, 0, 0, 0, 2, 1, NULL, BORDERLESS|NOCAREREFRESH|BACKDROP,
NULL, NULL,NULL,NULL,NULL,0,0,8000,8000,CUSTOMSCREEN};
static long offset, scale1, scale2, flags;
static long count, trails, nice, all;
static long input, maxlines, ctemp;
static long point1[MAXLINES+1][2], point2[MAXLINES+1][2], direction[2][2];
static char *TStr = "BOING!";
static long TLen = 6;
void
InitScrStructures()
{
SCR scr;
if (GetScreenData(&scr, sizeof(scr), WBENCHSCREEN, NULL)) {
if (scr.ViewPort.Modes & HIRES)
MAXX = scr.Width;
else
MAXX = scr.Width * 2;
if (scr.ViewPort.Modes & LACE)
MAXY = scr.Height;
else
MAXY = scr.Height * 2;
} else {
MAXX = 640;
MAXY = 200;
}
Ns.Width = MAXX;
Nw.Width = MAXX;
Ns.Height = MAXY;
Nw.Height = MAXY;
}
main(argc,argv)
int argc;
char *argv[];
{
int var;
IORequest AddReq; /* for dmouse ipc */
IORequest RemReq;
PORT *dmport;
PORT *ipport;
char foo; /* dummy variable, address used as id */
short notdone = 1;
input = 3; /* Some defaults for switches */
trails = 1;
maxlines = 20;
nice = FALSE;
all = FALSE;
flags = LINES;
Enable_Abort = 0;
while(--argc >= 1) {
switch (argv[argc][0]) {
case '-':
switch (argv[argc][1]) {
case 'T':
flags = TEXTSTR;
TStr = &argv[argc][2];
if (TStr[0] != \0)
TLen = strlen(TStr);
break;
case 's':
flags = SPLINES;
break;
case 't':
trails = 0;
break;
case 'n':
nice = TRUE;
break;
case 'l':
maxlines = atoi(&argv[argc][2]);
maxlines = (maxlines > MAXLINES) ? MAXLINES : (maxlines < 1) ? 1 : maxlines;
break;
case 'c':
ctemp = atoi(&argv[argc][2]);
coltbl[1] = (ctemp > 4096) ? 4096 : (ctemp < 1) ? 1 : ctemp;
break;
case 'b':
flags = BOXES;
break;
case 'e':
flags = ELLIPSES;
break;
case 'a':
all = TRUE;
break;
default:
exit(20);
}
break;
default:
input = atoi(argv[argc]);
break;
}
}
input = (input > 9) ? 9 : (input < 0) ? 1 : input;
count = 0;
scale1 = 2;
scale2 = 2;
offset = 0;
ipport = CreatePort(NULL, 0); /* ipc port */
if (openlibs(INTUITION_LIB|GRAPHICS_LIB) == 0)
goto fail;
InitScrStructures();
for(var = 0; var < VBeamPos(); ++var)
get_rand_point();
point1[0][0] = get_rand_point(); /* Initial start x,y (one endpoint) */
point1[0][1] = get_rand_point();
point2[0][0] = get_rand_point();
point2[0][1] = get_rand_point();
for(var = 0; var < 2; ++var){
direction[var][0] = get_rand_dir();
direction[var][1] = get_rand_dir();
}
AddReq.io_Message.mn_ReplyPort = ipport;
AddReq.io_Command = 0x84;
AddReq.io_Unit = (struct Unit *)&foo;
AddReq.io_Flags = 0x0C; /* %1100 (screen blanker, no mouse blanker) */
RemReq.io_Message.mn_ReplyPort = ipport;
RemReq.io_Command = 0x85;
RemReq.io_Unit = (struct Unit *)&foo;
Forbid();
if (dmport = FindPort("DMouse.ipc"))
PutMsg(dmport, &AddReq.io_Message);
Permit();
if (dmport == NULL) {
puts("DMouse not running or <V1.20");
goto fail;
}
while (notdone) {
long mask = SIGBREAKF_CTRL_C | (1 << ipport->mp_SigBit);
if (Scr)
mask = SetSignal(0L, mask);
else
mask = Wait(mask);
if (mask & SIGBREAKF_CTRL_C)
notdone = 0;
if (mask & (1 << ipport->mp_SigBit)) {
IORequest *ior;
while (ior = (IORequest *)GetMsg(ipport)) {
if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
notdone = 0;
continue;
}
switch(ior->io_Command) {
case 0x82:
screenon();
break;
case 0x83:
screenoff();
break;
case 0x86:
notdone = 0;
break;
}
ReplyMsg(&ior->io_Message);
}
}
if (Win)
LineArt();
}
screenon();
PutMsg(dmport, &RemReq.io_Message);
{
register IORequest *ior = NULL;
while (ior != &AddReq) {
WaitPort(ipport);
ior = (IORequest *)GetMsg(ipport);
if (ior->io_Message.mn_Node.ln_Type == NT_MESSAGE)
ReplyMsg(&ior->io_Message);
}
}
fail:
DeletePort(ipport);
closelibs(-1);
}
screenoff()
{
if (Scr)
ScreenToFront(Scr);
else if (Scr = OpenScreen(&Ns)) {
Nw.Screen = Scr;
if (Win = OpenWindow(&Nw)){
vp = &Scr->ViewPort;
rp = Win->RPort;
LoadRGB4(vp,coltbl,2L);
}
ShowTitle(Scr, FALSE);
}
}
screenon()
{
if (Win)
CloseWindow(Win);
if (Scr)
CloseScreen(Scr);
Win = NULL;
Scr = NULL;
vp = NULL;
rp = NULL;
}
LineArt()
{
register int newoffset, tempx, tempy;
SetAPen(rp, 1L);
if (nice)
WaitTOF();
switch (flags) {
case LINES:
Move(rp, point1[offset][0], point1[offset][1]);
Draw(rp, point2[offset][0], point2[offset][1]);
break;
case ELLIPSES:
doellipse(offset);
break;
case BOXES:
dobox(offset);
break;
case SPLINES:
dospline(offset);
break;
case TEXTSTR:
doteresa(offset);
break;
}
if (checkbounce1(offset)) {
tempx = direction[0][0];
tempy = direction[0][1];
direction[0][0] = (point1[offset][0] <= MINBOUND) ? 1 :
(point1[offset][0] >= BOUNDX) ? -1 :
get_rand_dir();
direction[0][1] = (point1[offset][1] <= MINBOUND) ? 1 :
(point1[offset][1] >= BOUNDY) ? -1 :
get_rand_dir();
scale1 = get_rand_scale();
}
if (checkbounce2(offset)) {
tempx = direction[1][0];
tempy = direction[1][1];
direction[1][0] = (point2[offset][0] <= MINBOUND) ? 1 :
(point2[offset][0] >= BOUNDX) ? -1 :
get_rand_dir();
direction[1][1] = (point2[offset][1] <= MINBOUND) ? 1 :
(point2[offset][1] >= BOUNDY) ? -1 :
get_rand_dir();
scale2 = get_rand_scale();
}
if ((++count > 60000) | (count > 2500 && (flags == ELLIPSES))) {
count = maxlines;
if (trails == 0 | all) {
count = 0;
offset = 0;
Move(rp, 0, 0);
ClearScreen(rp);
}
if (all) {
flags = flags << 1;
if (flags > TEXTSTR)
flags = ELLIPSES;
}
}
if (++offset > maxlines){
coltbl[1]++;
LoadRGB4(vp,coltbl,2L);
if ((coltbl[1] && 0x00f) > 0xb) {
coltbl[1] = coltbl[1] & 0xff0;
coltbl[1] += 0x010;
}
if ((coltbl[1] && 0x0f0) > 0xb0) {
coltbl[1] = coltbl[1] & 0xf0f;
coltbl[1] += 0x100;
}
if ((coltbl[1] && 0xf00) > 0xb00) {
coltbl[1] = ctemp;
}
}
if (offset > maxlines)
offset = 0;
/* Erase the oldest line... (or ellipse) */
if (count > maxlines-1) {
newoffset = (offset == maxlines) ? 0 : offset + trails;
SetAPen(rp, 0L);
switch (flags) {
case LINES:
Move(rp, point1[newoffset][0], point1[newoffset][1]);
Draw(rp, point2[newoffset][0], point2[newoffset][1]);
break;
case ELLIPSES:
doellipse(newoffset);
break;
case BOXES:
dobox(newoffset);
break;
case SPLINES:
dospline(newoffset);
break;
case TEXTSTR:
doteresa(newoffset);
break;
}
SetAPen(rp, 1L);
}
/* Calculate the next point */
newoffset = (offset > 0) ? offset-1 : maxlines;
point1[offset][0] = (scale1 * direction[0][0]) + point1[newoffset][0];
point1[offset][1] = (scale1 * direction[0][1]) + point1[newoffset][1];
if (flags != TEXTSTR){
point2[offset][0] = (scale2 * direction[1][0]) + point2[newoffset][0];
point2[offset][1] = (scale2 * direction[1][1]) + point2[newoffset][1];
} else {
point2[offset][0] = point1[offset][0] + TextLength(rp, TStr, TLen);
point2[offset][1] = point1[offset][1];
}
}
doteresa(offset)
int offset;
{
register short x,y;
x = (Scr->Width - TextLength(rp, TStr, TLen) - 20);
y = (Scr->Height- Scr->RastPort.TxHeight - Scr->RastPort.TxBaseline - 8);
if (x < 0 || y < 0)
return;
x = (x < point1[offset][0]) ? x : point1[offset][0];
y = (y < point1[offset][1]) ? y : point1[offset][1];
Move(rp, x, y);
Text(rp, TStr, TLen);
}
doellipse(newoffset)
register int newoffset;
{
register int tempx,tempy;
tempx = (point2[newoffset][0] > point1[newoffset][0]) ?
point2[newoffset][0] - point1[newoffset][0] :
point1[newoffset][0] - point2[newoffset][0];
tempy = (point2[newoffset][1] > point1[newoffset][1]) ?
point2[newoffset][1] - point1[newoffset][1] :
point1[newoffset][1] - point2[newoffset][1];
tempx = (tempx > point1[newoffset][0]) ? point1[newoffset][0] :
((tempx + point1[newoffset][0]) > BOUNDX) ? BOUNDX - point1[newoffset][0] :
tempx;
tempy = (tempy > point1[newoffset][1]) ? point1[newoffset][1] :
((tempy + point1[newoffset][1]) > BOUNDY) ? BOUNDY - point1[newoffset][1] :
tempy;
tempx = (tempx > MAXELLIPSE) ? MAXELLIPSE : tempx;
tempy = (tempy > MAXELLIPSE) ? MAXELLIPSE : tempy;
if (tempx > 0 && tempy > 0)
DrawEllipse(rp, point1[newoffset][0], point1[newoffset][1], tempx, tempy);
}
dobox(offset)
register int offset;
{
register int tempx, tempy;
Move(rp, point1[offset][0], point1[offset][1]);
Draw(rp, point2[offset][0], point2[offset][1]);
tempx = MAXX - point1[offset][0];
tempy = MAXY - point1[offset][1];
if (tempx >= 0 && tempy >= 0)
Draw(rp, tempx, tempy);
tempx = MAXX - point2[offset][0];
tempy = MAXY - point2[offset][1];
if (tempx >= 0 || tempy >= 0)
Draw(rp, tempx, tempy);
Draw(rp, point1[offset][0], point1[offset][1]);
}
long checkbounce1(index)
register int index;
{
return (point1[index][0] >= BOUNDX) | (point1[index][1] >= BOUNDY) |
(point1[index][0] <= MINBOUND) | (point1[index][1] <= MINBOUND);
}
long checkbounce2(index)
register int index;
{
return (point2[index][0] >= BOUNDX) | (point2[index][1] >= BOUNDY) |
(point2[index][0] <= MINBOUND) | (point2[index][1] <= MINBOUND);
}
int get_rand_point()
{
register short temp;
temp = ran();
if (temp < 0)
temp = temp * -1;
temp = temp/319+19;
return (temp > MAXY) ? MAXY : temp ;
}
int get_rand_dir()
{
register short num;
num = ran((short)3);
return (num < -5000) ? -1 : (num > 5000) ? 1 : 0;
}
int get_rand_scale()
{
register short temp;
temp = ran();
if (temp < 0)
temp = temp * -1;
temp = temp/6560 + (short)input;
return (temp > 17) ? 17 : temp;
}
#define MAXPOINTS 5
#define FIX(x) (((long)(x)) << 7)
/*
* Draws a spline! Expects all arguments in registers.
*/
#asm
public _Draw
cseg
rspline
move.l a0,d0
sub.l d6,d0
move.l d0,d3
bpl save1
neg.l d0
save1
move.l a1,d1
sub.l d7,d1
move.l d1,d4
bpl save2
neg.l d1
save2
move.l d0,d2
cmp.l d0,d1
bmi save3
lsr.l #3,d2
bra save9
save3
lsr.l #3,d1
save9
add.l d1,d2
asr.l #3,d2
asr.l #5,d3
asr.l #5,d4
move.l a2,d0
sub.l a0,d0
move.l a3,d1
sub.l a1,d1
asr.l #5,d0
asr.l #5,d1
muls.w d4,d0
muls.w d3,d1
sub.l d1,d0
bpl save4
neg.l d0
save4
cmp.l d0,d2
bmi pushem
move.l a5,d0
sub.l a0,d0
move.l a6,d1
sub.l a1,d1
asr.l #5,d0
asr.l #5,d1
muls.w d4,d0
muls.w d3,d1
sub.l d1,d0
bpl save5
neg.l d0
save5
cmp.l d0,d2
bmi pushem
makeline
lsr.l #7,d7
move.l d7,-(sp)
lsr.l #7,d6
move.l d6,-(sp)
move.l _rp,-(sp)
jsr _Draw
add.w #12,a7
rts
pushem
movem.l d6/d7,-(sp)
move.l a5,d0
add.l d6,d0
asr.l #1,d0
move.l a6,d1
add.l d7,d1
asr.l #1,d1
movem.l d0/d1,-(sp)
move.l a2,d2
add.l a5,d2
asr.l #1,d2
move.l a3,d3
add.l a6,d3
asr.l #1,d3
move.l d0,d4
add.l d2,d4
asr.l #1,d4
move.l d1,d5
add.l d3,d5
asr.l #1,d5
movem.l d4/d5,-(sp)
move.l a0,d6
add.l a2,d6
asr.l #1,d6
move.l a1,d7
add.l a3,d7
asr.l #1,d7
move.l d2,d0
add.l d6,d0
asr.l #1,d0
move.l d3,d1
add.l d7,d1
asr.l #1,d1
move.l d6,a2
move.l d7,a3
move.l d0,d6
add.l d4,d6
asr.l #1,d6
move.l d1,d7
add.l d5,d7
asr.l #1,d7
movem.l d6/d7,-(sp)
move.l d0,a5
move.l d1,a6
jsr rspline
movem.l (sp)+,a0/a1
movem.l (sp)+,a2/a3/a5/a6
movem.l (sp)+,d6/d7
bra rspline
#endasm
/*
* Now our linkage to the spline routine. Parameters are in 8(a5)...
*/
int drawspline(x1, y1, x2, y2, x3, y3, x4, y4)
long x1, y1, x2, y2, x3, y3, x4, y4 ;
{
#asm
movem.l saver,-(sp)
move.l 8(a5),a0
move.l 12(a5),a1
move.l 16(a5),a2
move.l 20(a5),a3
move.l 28(a5),a6
move.l 32(a5),d6
move.l 36(a5),d7
move.l 24(a5),a5
jsr rspline
movem.l (sp)+,saver
saver reg d0-d7/a0-a6
#endasm
}
/*
* Here we draw splines! Magic, you know.
*/
dospline(index)
register int index;
{
int index1;
if (index == 0)
index1 = maxlines;
else
index1 = index - 1;
Move(rp, (long)(point1[index][0]), (long)(point1[index][1])) ;
drawspline(FIX(point1[index][0]), FIX(point1[index][1]),
FIX(point2[index][1]), FIX(point2[index][1]),
FIX(point1[index1][0]), FIX(point1[index1][1]),
FIX(point2[index1][0]), FIX(point2[index1][1])) ;
}