home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d573
/
plasma.lha
/
Plasma
/
Plasma_32.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-22
|
17KB
|
625 lines
/*************************************************
/*
/* This code © 1991 by W. Roger uzun
/* This code is for Lattice 5.10x
/* First assemble FastPix.asm by using Lattice asm
/* compile using :
/* lc -v -cf -Lit+FastPix.o -rr -m0 -O -tr -w Plasma_32 (for 68000 version)
/* lc -v -cf -Lit+FastPix.o -rr -m2 -O -tr -dCPU020 Plasma_32 (for 68020 version)
/*
/*************************************************/
#define VIEW_MODES (LACE)
#define NUM_COLORS 32
/* #define CPU020 1 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <proto/exec.h>
#ifdef CPU020
#include <exec/execbase.h>
#endif
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <time.h>
#include <proto/dos.h>
#define HEIGHT 400L
#define DEPTH 5
#define WIDTH 320L
#define rowoffset (WIDTH/8)
#define MODULUS (0x20000L)
#define C 13849
#define A 25173
#define randu2(x) (((seed = seed*A+C))%(x))
#define unmap(x) (randu2(6)+rev_array[(x)])
#ifdef LATTICE
#define PROTOTYPES 1
#endif
#ifndef LATTICE
#define __regargs
#endif
#ifdef DEBUG
int temparray[64];
#endif
#define WINDOWSIGNAL (1L<<(wG->UserPort->mp_SigBit))
#define PaletteColorCount 32
short __aligned nplanes = DEPTH;
UBYTE __aligned *bp[DEPTH];
short __aligned ytable[HEIGHT];
struct TextFont __aligned *myTextFont;
struct RastPort __aligned *rpG;
struct TextAttr TOPAZ80 = {
(STRPTR)"topaz.font",
TOPAZ_EIGHTY,0,0
};
struct NewScreen NewScreenStructure = {
0,0, /* screen XY origin relative to View */
320,HEIGHT, /* screen width and height */
DEPTH, /* screen depth (number of bitplanes) */
0,1, /* detail and block pens */
VIEW_MODES, /* display modes for this screen */
CUSTOMSCREEN, /* screen type */
&TOPAZ80, /* pointer to default screen font */
"Plasma", /* screen title */
NULL, /* first in list of custom screen gadgets */
NULL /* pointer to custom BitMap structure */
};
#define NEWSCREENSTRUCTURE NewScreenStructure
USHORT __aligned Palette[] = {
0x000, /* color #0 */
0x0a5, /* color #6 */
0x0b4, /* color #7 */
0x0c3, /* color #8 */
0x0e1, /* color #9 */
0x0f0, /* color #10 */
0x01f0, /* color #11 */
0x03d0, /* color #12 */
0x05b0, /* color #13 */
0x0790, /* color #14 */
0x0970, /* color #15 */
0x0a50, /* color #16 */
0x0B40, /* color #17 */
0x0c30, /* color #18 */
0x0e10, /* color #19 */
0x0f00, /* color #20 */
0x0f01, /* color #21 */
0x0d03, /* color #22 */
0x0b05, /* color #23 */
0x0907, /* color #24 */
0x0709, /* color #25 */
0x050a, /* color #26 */
0x040b, /* color #27 */
0x030c, /* color #28 */
0x020d, /* color #29 */
0x010e, /* color #30 */
0x000f, /* color #31 */
0x01f, /* color #1 */
0x03d, /* color #2 */
0x05b, /* color #3 */
0x079, /* color #4 */
0x097 /* color #5 */
};
#define PALETTE Palette
struct IntuiText IText1 = {
3,1,JAM1, /* front and back text pens, drawmode and fill byte */
0,0, /* XY origin relative to container TopLeft */
&TOPAZ80, /* font pointer or NULL for default */
"Quit", /* pointer to text */
NULL /* next IntuiText structure */
};
struct MenuItem MenuItem2 = {
NULL, /* next MenuItem structure */
0,8, /* XY of Item hitbox relative to TopLeft of parent hitbox */
80,8, /* hit box width and height */
ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */
0, /* each bit mutually-excludes a same-level Item */
(APTR)&IText1, /* Item render (IntuiText or Image or NULL) */
NULL, /* Select render */
'Q', /* alternate command-key */
NULL, /* SubItem list */
MENUNULL /* filled in by Intuition for drag selections */
};
struct IntuiText IText2 = {
3,1,JAM1, /* front and back text pens, drawmode and fill byte */
0,0, /* XY origin relative to container TopLeft */
&TOPAZ80, /* font pointer or NULL for default */
"About", /* pointer to text */
NULL /* next IntuiText structure */
};
struct MenuItem MenuItem1 = {
&MenuItem2, /* next MenuItem structure */
0,0, /* XY of Item hitbox relative to TopLeft of parent hitbox */
80,8, /* hit box width and height */
ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */
0, /* each bit mutually-excludes a same-level Item */
(APTR)&IText2, /* Item render (IntuiText or Image or NULL) */
NULL, /* Select render */
'A', /* alternate command-key */
NULL, /* SubItem list */
MENUNULL /* filled in by Intuition for drag selections */
};
struct Menu Menu1 = {
NULL, /* next Menu structure */
0,0, /* XY origin of Menu hit box relative to screen TopLeft */
63,0, /* Menu hit box width and height */
MENUENABLED, /* Menu flags */
"Project", /* text of Menu name */
&MenuItem1 /* MenuItem linked list pointer */
};
#define MenuList1 Menu1
struct NewWindow NewWindowStructure1 = {
0,0, /* window XY origin relative to TopLeft of screen */
320,HEIGHT, /* window width and height */
4,8, /* detail and block pens */
VANILLAKEY|MENUPICK, /* IDCMP flags */
SMART_REFRESH+BACKDROP+BORDERLESS+ACTIVATE, /* other window flags */
NULL, /* first gadget in gadget list */
NULL, /* custom CHECKMARK imagery */
" ", /* window title */
NULL, /* custom screen pointer */
NULL, /* custom bitmap */
5,5, /* minimum width and height */
-1,-1, /* maximum width and height */
CUSTOMSCREEN /* destination screen type */
};
SHORT BorderVectors1[] = {
0,0,
51,0,
51,41,
0,41,
0,0
};
struct Border Border1 = {
-1,-1, /* XY origin relative to container TopLeft */
3,0,JAM1, /* front pen, back pen and drawmode */
5, /* number of XY vectors */
BorderVectors1, /* pointer to XY vectors */
NULL /* next border in list */
};
struct IntuiText IText3 = {
3,0,JAM2, /* front and back text pens, drawmode and fill byte */
15,17, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"OK", /* pointer to text */
NULL /* next IntuiText structure */
};
struct Gadget Gadget1 = {
NULL, /* next gadget */
65,217, /* origin XY of hit box relative to window TopLeft */
50,40, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY, /* activation flags */
BOOLGADGET, /* gadget type flags */
(APTR)&Border1, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&IText3, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
NULL, /* SpecialInfo structure */
NULL, /* user-definable data */
NULL /* pointer to user-definable data */
};
#define GadgetList2 Gadget1
struct IntuiText IText5 = {
3,0,JAM2, /* front and back text pens, drawmode and fill byte */
40,114, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"By Roger Uzun", /* pointer to text */
NULL /* next IntuiText structure */
};
struct IntuiText IText4a = {
3,0,JAM2, /* front and back text pens, drawmode and fill byte */
16,61, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Press 'C' to Cycle", /* pointer to text */
&IText5 /* next IntuiText structure */
};
#ifndef CPU020
struct IntuiText IText4 = {
3,0,JAM2, /* front and back text pens, drawmode and fill byte */
6,21, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Plasma_32 Version 1.G", /* pointer to text */
&IText4a /* next IntuiText structure */
};
#else
struct IntuiText IText4c = {
3,0,JAM2, /* front and back text pens, drawmode and fill byte */
35,41, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"68020 Edition", /* pointer to text */
&IText4a /* next IntuiText structure */
};
struct IntuiText IText4 = {
3,0,JAM2, /* front and back text pens, drawmode and fill byte */
6,21, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Plasma_32 Version 1.G", /* pointer to text */
&IText4c /* next IntuiText structure */
};
#endif
struct NewWindow NewWindowStructure3 = {
70,30, /* window XY origin relative to TopLeft of screen */
180,280, /* window width and height */
0,1, /* detail and block pens */
GADGETUP, /* IDCMP flags */
SIMPLE_REFRESH+ACTIVATE+NOCAREREFRESH, /* other window flags */
&Gadget1, /* first gadget in gadget list */
NULL, /* custom CHECKMARK imagery */
" ", /* window title */
NULL, /* custom screen pointer */
NULL, /* custom bitmap */
5,5, /* minimum width and height */
-1,-1, /* maximum width and height */
CUSTOMSCREEN /* destination screen type */
};
struct Screen __aligned *sC;
struct Window __aligned *wG;
UWORD __aligned done=0;
long __aligned maparray[256]={5,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,/* 26 */
7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,/* 43 */
33,33,33,33,33,34,34,34,34,34,35,35,35,35,/* 57 */
36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,/* 73 */
40,40,40,40,41,41,41,41,42,42,42,42, /* 85 */
11,11,11,11,11,12,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,/* 26 */
17,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,/* 43 */
43,43,43,43,43,44,44,44,44,44,45,45,45,45,/* 57 */
46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,/* 73 */
50,50,50,50,51,51,51,51,52,52,52,52, /* 85 */
21,21,21,21,21,22,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,/* 26 */
27,27,27,27,27,28,28,28,28,29,29,29,30,30,30,31,31,/* 43 */
53,53,53,53,53,54,54,54,54,54,55,55,55,55,/* 57 */
56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,/* 73 */
60,60,60,61,61,61,62,62,62,63,63,63 /* 85 */};
long __aligned rev_array[64]={ 0,
1,5,9,13,17,21,25,29,33,38,
86,90,94,98,102,106,110,114,118,123,
171,175,179,183,187,191,195,199,203,206,
208,32,
44,48,52,56,60,64,68,72,76,83,
129,133,137,141,145,149,153,157,161,165,
214,218,222,226,230,234,238,242,246,250,
250};
unsigned short __aligned seed = 7;
#ifdef PROTOTYPES
int __regargs ReadPix(long,long);
void __regargs FastPix(long,long,long);
void CycleColors(void);
void __regargs HandleEvent(APTR);
void DoAbout(void);
void DoQuit(void);
void __regargs SubDivide(long,long,long,long);
void __regargs adjust(long,long,long,long,long,long);
#endif
void CycleColors()
{
long __aligned code;
ULONG __aligned class;
UWORD __aligned d=0,i,temp;
USHORT __aligned tpal[PaletteColorCount];
struct IntuiMessage __aligned *message;
for(i=0;i<PaletteColorCount;i++)
tpal[i] = Palette[i];
while (!d)
{
temp = tpal[1];
for(i=2;i<PaletteColorCount;i++)
{
tpal[i-1] = tpal[i];
}
tpal[(PaletteColorCount-1)] = temp;
LoadRGB4(&(sC->ViewPort),tpal,PaletteColorCount);
Delay(6L);
if ( (message = (struct IntuiMessage *)
GetMsg(wG->UserPort) ))
{
class = message->Class;
code = message->Code;
ReplyMsg((struct Message *)message);
if (class = VANILLAKEY)
d = 1;
}
}
if (code == ' ')
LoadRGB4(&(sC->ViewPort),Palette,PaletteColorCount);
}
void __regargs adjust(xa,ya,x,y,xb,yb)
long xa,ya,x,y,xb,yb;
{
long __aligned t1,t2;
int __aligned pa,pb,pc,pd;
register long __aligned globalcolor;
if (ReadPix(x,y))
return;
pa = xa;
pb =xb;
pc = ya;
pd = yb;
globalcolor = randu2(3) * (abs(pa-pb)+abs(pc-pd));
t1 = unmap(ReadPix(xa,ya));
t2 = unmap(ReadPix(xb,yb));
if (!randu2(2))
{
globalcolor = -globalcolor;
}
globalcolor = ((t1+t2)>>1)+globalcolor;
globalcolor &= 0xffL;
globalcolor = maparray[globalcolor];
FastPix(x,y,globalcolor);
#ifdef DEBUG
temparray[globalcolor]++;
#endif
}
void __regargs SubDivide(x1,y1,x2,y2)
long x1,y1,x2,y2;
{
long __aligned t1,t2,t3,t4;
ULONG __aligned signals,v;
struct IntuiMessage __aligned *message;
long __aligned x,y,class,code;
APTR __aligned object;
UWORD __aligned d;
if (((x2-x1)<2L) && ((y2-y1)<2L))
return;
if ( (message = (struct IntuiMessage *)
GetMsg(wG->UserPort) ))
{
class = message->Class;
code = message->Code;
object = message->IAddress; /* Gadget */
ReplyMsg((struct Message *)message);
if ( class == MENUPICK ) /* MenuItems */
HandleEvent((APTR)ItemAddress(&MenuList1,code));
else if (class = VANILLAKEY)
{
if ((code == 'c')||(code == 'C'))
{
CycleColors();
}
else
{
d = 0;
while(!d)
{
signals = Wait(WINDOWSIGNAL);
if (signals & WINDOWSIGNAL)
while ((message = (struct IntuiMessage *)
GetMsg(wG->UserPort)))
{
class = message->Class;
ReplyMsg((struct Message *)message);
if (class == VANILLAKEY)
d = 1;
}
}
}
}
}
if (done)
return;
x = (x1+x2)>>1;
y = (y1+y2)>>1;
if (!ReadPix(x,y))
{
t1 = unmap(ReadPix(x1,y1));
t2 = unmap(ReadPix(x2,y1));
t3 = unmap(ReadPix(x2,y2));
t4 = unmap(ReadPix(x1,y2));
v = ((t1+t2+t3+t4)>>2);
v = maparray[v];
FastPix(x,y,v);
}
adjust(x1,y1,x,y1,x2,y1);
adjust(x2,y1,x2,y,x2,y2);
adjust(x1,y2,x,y2,x2,y2);
adjust(x1,y1,x1,y,x1,y2);
SubDivide(x1,y1,x,y);
SubDivide(x,y1,x2,y);
SubDivide(x,y,x2,y2);
SubDivide(x1,y,x,y2);
}
void DoAbout()
{
struct IntuiMessage __aligned *message;
struct Window __aligned *wG3;
if (!(wG3 = OpenWindow(&NewWindowStructure3)))
{
DisplayBeep(0L);
return;
}
PrintIText(wG3->RPort,&IText4,0L,0L);
WaitPort(wG3->UserPort);
while(message = (struct IntuiMessage *)GetMsg(wG3->UserPort))
ReplyMsg((struct Message *)message);
CloseWindow(wG3);
}
void __regargs HandleEvent(object)
APTR object;
{
if (object == (APTR)&MenuItem1) { DoAbout(); return; }
if (object == (APTR)&MenuItem2) { DoQuit(); return; }
}
#define HANDLEEVENT HandleEvent
/* end of PowerWindows source generation */
void DoQuit()
{
done = TRUE;
}
/* end of PowerWindows source generation */
void main(void);
void main()
{
int __aligned i;
#ifdef DEBUG
int __aligned d;
#endif
ULONG __aligned code;
ULONG __aligned class;
APTR __aligned object;
ULONG __aligned signals;
struct IntuiMessage __aligned *message; /* the message the IDCMP sends us */
#ifdef CPU020
struct ExecBase **execbaseptr=(struct ExecBase **)4L;
UWORD cpuid;
struct ExecBase *execbase;
execbase = *execbaseptr;
cpuid = execbase->AttnFlags;
if (!(cpuid & AFF_68020))
{
exit(0);
}
#endif
for(i=8;i<256;i++)
maparray[i] = i / 8;
for(i=0;i<8;i++)
maparray[i] = 1;
for(i=0;i<64;i++)
rev_array[i] = i*8;
nplanes = DEPTH - 1;
#ifdef DEBUG
for(d=0;d<64;d++)temparray[d] = 0;
#endif
if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 33L)))
{
exit(0);
}
if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 33L)))
{
CloseLibrary((struct Library *)IntuitionBase);
exit(0);
}
if (!(myTextFont = OpenFont(&TOPAZ80)))
{
CloseLibrary((struct Library *)GfxBase);
CloseLibrary((struct Library *)IntuitionBase);
exit(0);
}
if (!(sC = OpenScreen(&NewScreenStructure)))
{
CloseFont(myTextFont);
CloseLibrary((struct Library *)GfxBase);
CloseLibrary((struct Library *)IntuitionBase);
exit(0);
}
LoadRGB4(&(sC->ViewPort),Palette,PaletteColorCount);
NewWindowStructure3.Screen = NewWindowStructure1.Screen = sC;
wG = OpenWindow(&NewWindowStructure1); /* open the window */
if ( wG == NULL )
{
CloseScreen(sC);
CloseFont(myTextFont);
CloseLibrary((struct Library *)GfxBase);
CloseLibrary((struct Library *)IntuitionBase);
exit(0);
}
rpG = wG->RPort; /* get a rastport pointer for the window */
SetFont(rpG,myTextFont);
SetMenuStrip(wG,&MenuList1); /* attach any Menu */
SetDrMd(rpG,JAM1);
for(i=0;i<DEPTH;i++)
bp[i] = wG->RPort->BitMap->Planes[i];
ytable[0] = 0;
for(i=1;i<HEIGHT;i++)
ytable[i] = ytable[i-1] + rowoffset;
seed = time(0L);
signals = (randu2((NUM_COLORS-1))) + 1L;
FastPix(0L,11L,signals);
signals = (randu2((NUM_COLORS-1))) + 1L;
FastPix(319L,11L,signals);
signals = (randu2((NUM_COLORS-1))) + 1L;
FastPix(319L,HEIGHT-1L,signals);
signals = (randu2((NUM_COLORS-1))) + 1L;
FastPix(0L,HEIGHT-1L,signals);
SubDivide(0L,11L,319L,HEIGHT-1L);
DisplayBeep(0L);
while(!done)
{
signals = Wait(WINDOWSIGNAL);
if (signals & WINDOWSIGNAL)
while( (message = (struct IntuiMessage *)
GetMsg(wG->UserPort) ) != NULL)
{
class = message->Class;
code = message->Code;
object = message->IAddress; /* Gadget */
ReplyMsg((struct Message *)message);
if ( class == MENUPICK ) /* MenuItems */
HandleEvent((APTR)ItemAddress(&MenuList1,code));
else if (class = VANILLAKEY)
{
if ((code == 'c')||(code == 'C'))
{
CycleColors();
}
}
}
}
CloseWindow(wG);
CloseFont(myTextFont);
CloseScreen(sC);
CloseLibrary((struct Library *)GfxBase);
CloseLibrary((struct Library *)IntuitionBase);
#ifdef DEBUG
for(d=0;d<64;d++)printf("temp[%d] = %d\n",d,temparray[d]);
#endif
}