home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
505b.lha
/
Ham_e_library
/
DrawDemo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-05
|
8KB
|
418 lines
#include <intuition/intuition.h>
#include <exec/types.h>
#include <exec/execbase.h>
#include <graphics/text.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include "hame_pragmas.h"
#include "HameStruct.h"
#include "HameProtos.h"
#include "HameRev.h"
#include <string.h>
#include <exec/memory.h>
#include <exec/tasks.h>
#include <graphics/view.h>
#include <graphics/gfx.h>
#include <graphics/rastport.h>
#include <proto/intuition.h>
struct Library *HameBase;
struct HamePort *HamePort;
struct HamePort *HamePort2;
struct HameFont *font;
extern struct Screen *OpenScreen();
extern struct Window *OpenWindow();
extern struct ExecBase *SysBase; /* These are all pointers to system */
struct IntuitionBase *IntuitionBase; /* These are all pointers to system */
struct GfxBase *GfxBase; /* data structures I need access to */
struct Screen *screen;
struct Window *window;
#define WIDTH 640
#define HEIGHT 200
#define YSIZ 196
struct NewScreen my_screen =
{
0, 0, WIDTH, HEIGHT,
4,
0, 1,
HIRES,
CUSTOMSCREEN,
(struct TextAttr *) NULL,
NULL,
NULL, NULL
};
struct NewWindow my_window =
{
0, 0, WIDTH, HEIGHT,
(UBYTE) 0, (UBYTE) 1,
MOUSEBUTTONS
| INTUITICKS,
SMART_REFRESH
| BORDERLESS
| BACKDROP
| ACTIVATE
| NOCAREREFRESH
| REPORTMOUSE,
NULL, NULL,
NULL,
NULL, NULL,
0, 0, 0, 0,
CUSTOMSCREEN
};
/*
Clean up and exit
*/
void CloseStuff()
{
struct Library *result;
if (window) CloseWindow(window);
if (screen) CloseScreen(screen);
if (HamePort) HAME_Dispose(HamePort);
if (HameBase) CloseLibrary(HameBase);
if (GfxBase) CloseLibrary(GfxBase);
if (IntuitionBase) CloseLibrary(IntuitionBase);
/* This sequence expunges the library if it is no longer in use */
Forbid();
if ( (result = (struct Library *)
FindName(&SysBase->LibList,"hame.library")) != NULL )
{
RemLibrary(result);
}
Permit();
exit(0);
}
/*
Draw a random colored, random sized ellipse at a random location
*/
void DrawOval()
{
int cc, x, y, xr, yr, c, f;
x = rand() % 320;
y = rand() % YSIZ;
xr = rand() % 140;
yr = rand() % 50;
f = rand() % 2;
while (!(c = rand() % 256));
HAME_SetAPen( HamePort, c );
HAME_Ellipse(HamePort, x, y, xr, yr, f );
if (f)
{
if ( (cc = HAME_ReadPixel(HamePort, x, y)) != c )
{
printf("EL wrote %ld read %ld at %ld,%ld\n", c, cc, x, y);
}
}
}
/*
Draw a random colored line in a random spot
*/
void DrawLine()
{
int cc, x1, y1, x2, y2, c;
if (rand() & 1) /* Vertical line */
{
x1 = rand() % 320;
x2 = rand() % 320;
y1 = rand() % YSIZ;
y2 = y1;
}
else /* Horizontal line */
{
x1 = rand() % 320;
y1 = rand() % YSIZ;
x2 = x1;
y2 = rand() % YSIZ;
}
/* any color but color 0 */
while (!(c = rand() % 256));
HAME_SetAPen( HamePort, c );
HAME_Line(HamePort, x1, y1, x2, y2 );
if ( (cc = HAME_ReadPixel(HamePort, x1, y1)) != c )
{
printf("LN wrote %ld read %ld at %ld,%ld\n", c, cc, x1, y1);
}
}
/*
Change a random color register to random colors
*/
void DoCREG()
{
int reg, r, g, b;
while (!(reg = rand() % 256));
r = rand() % 256;
g = rand() % 256;
b = rand() % 256;
HAME_SetRGB8(HamePort, reg, r, g, b );
HAME_GetRGB8(HamePort, reg );
if ( HamePort->r != r ) printf(".R1.");
if ( HamePort->g != g ) printf(".G1.");
if ( HamePort->b != b ) printf(".B1.");
}
/*
Change a random color register to random colors
*/
void DoCycle()
{
int r1, r2, t;
while(!(r1 = rand() % 256));
while(!(r2 = rand() % 240));
if ( r2 == r1 ) r2 += 8;
if (r2 < r1)
{
t = r1; r1 = r2; r2 = t;
}
if ( rand() & 1)
{
HAME_CycleLeft(HamePort, r1, r2);
}
else
{
HAME_CycleRight(HamePort, r1, r2);
}
}
/*
Draw a random colored box in a random location
*/
void DrawBox()
{
int x1, y1, x2, y2, c, f;
x1 = rand() % 320;
x2 = rand() % 320;
y1 = rand() % YSIZ;
y2 = rand() % YSIZ;
f = rand() % 2;
while (!(c = rand() % 256));
HAME_SetAPen( HamePort, c );
HAME_Box(HamePort, x1, y1, x2, y2, f );
}
/*
Decide which random object to draw
*/
void DrawThing()
{
int thing;
thing = rand() % 5;
switch(thing)
{
case 0:
DoCREG();
break;
case 1:
DrawLine();
break;
case 2:
DrawBox();
break;
case 3:
DrawOval();
break;
case 4:
DoCycle();
break;
default:
break;
}
}
/*
Draw a vertical column of pixels at the left margin to prevent hame from
turning off.
*/
void DrawLeftMargin()
{
int i;
HAME_SetAPen( HamePort, 1 );
for ( i = 0; i < YSIZ; i++ )
{
HAME_WritePixel( HamePort, 0, i);
}
}
/*
Initialize the pallette to random colors
*/
void palette1()
{
int i, r, g, b;
for ( i = 1; i < 256; i++ )
{
r = rand() & 0xff;
g = rand() & 0xff;
b = rand() & 0xff;
HAME_SetRGB8(HamePort, i, r, g, b);
}
}
extern struct View *ViewAddress();
/*
Main routine
*/
int main(argc, argv)
int argc;
char *argv[];
{
ULONG msg_class;
USHORT msg_code;
int finished=0;
struct IntuiMessage *message;
struct Gadget *gadget;
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library",33L))==NULL)
{
CloseStuff();
}
if ((GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library" , 0L))==NULL)
{
CloseStuff();
}
/* Open the hame library */
if ((HameBase = (struct Library *)
OpenLibrary("hame.library",HAMELIB_VERSION)) == NULL)
{
printf("No hame.library\n");
CloseStuff();
}
/* Get a screen to play with */
if ((screen = OpenScreen(&my_screen)) ==NULL)
{
CloseStuff();
}
my_window.Screen = screen;
/* Get a window to play with */
if ((window = OpenWindow(&my_window)) == NULL)
{
CloseStuff();
}
/* turn off the title bar */
ShowTitle(screen, 0L);
/* Tell the library where to put pixels */
if ((HamePort = HAME_Init(screen, 640, 400, 400, 0, 0, 4, YSIZ)) == NULL)
{
CloseStuff();
}
/* Set the pallette */
palette1();
/* Keep hame from turning off because of screen wide color 0 */
DrawLeftMargin();
while( !finished )
{
/*
message = (struct IntuiMessage *) WaitPort(window->UserPort);
*/
message = (struct IntuiMessage *) GetMsg(window->UserPort);
if (message)
{
msg_class = message->Class;
msg_code = message->Code;
gadget = (struct Gadget *) message->IAddress;
ReplyMsg((struct Message *)message);
switch( msg_class )
{
case MOUSEBUTTONS:
finished = 1;
break;
case MENUPICK:
break;
case GADGETUP:
break;
case INTUITICKS:
/* Draw something in HAME mode */
DrawThing();
break;
case CLOSEWINDOW:
finished = 1;
break;
default:
printf("?");
}
}
else
{
DrawThing();
}
}
while ((message = (struct IntuiMessage *)
GetMsg( window->UserPort )) != NULL)
{
ReplyMsg((struct Message *)message);
}
CloseStuff();
}