home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d1xx
/
d157
/
animballs
/
screen.c
< prev
Wrap
C/C++ Source or Header
|
1988-10-02
|
5KB
|
212 lines
/* screen.c -- code to open a screen and then call render */
#include <exec/types.h>
#include <stdio.h>
#include <math.h>
#include <intuition/intuition.h>
#include "globals.h"
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/layers.h>
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase = NULL;
struct LayersBase *LayersBase = NULL;
#define IREV 29
#define GREV 29
char defaultfile[] = "balls.default.dat";
#define DEPTH 6
int depth = DEPTH;
struct BitMap pbitmap = { /* picture (screen) bitmap (*sbitmap) */
0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
struct BitMap tbitmap = { /* temp (exact) bitmap */
0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
struct BitMap ibitmap = { /* image bitmap */
0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
struct BitMap mbitmap = { /* mask bitmap */
0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
struct NewScreen mynewscreen = {
0, 0, WIDTH, 200, DEPTH,
0, 15,
HAM,
CUSTOMSCREEN | CUSTOMBITMAP,
NULL,
"B & W Low Res Screen",
NULL,
&pbitmap,
};
struct Screen *myscreen = NULL;
struct ViewPort *vp;
struct BitMap *sbitmap = NULL;
struct NewWindow mynewwindow = {
0, 1, WIDTH, 199,
0, 15,
MOUSEBUTTONS | MOUSEMOVE | CLOSEWINDOW,
WINDOWCLOSE | SIMPLE_REFRESH | /* BACKDROP | */ BORDERLESS |
REPORTMOUSE | ACTIVATE,
NULL,
NULL,
" Please Wait . . . ",
NULL,
NULL,
0, 0, 0, 0,
CUSTOMSCREEN,
};
struct Window *mywindow = NULL;
int bw = 0;
UWORD bwcolortable[16] = {
0x000, 0x111, 0x222, 0x333, 0x444, 0x555, 0x666, 0x777,
0x888, 0x999, 0xaaa, 0xbbb, 0xccc, 0xddd, 0xeee, 0xfff};
void
main(argc,argv)
int argc;
char *argv[];
{
int i;
void cleanup();
switch (argc) {
case 0: readballs(defaultfile);
break;
case 2: readballs(argv[1]);
break;
case 3: if (strcmp(argv[1],"-bw") == 0) {
setbw();
readballs(argv[2]);
break;
}
default:dodefault();
}
onbreak(&cleanup);
initrender();
IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library",IREV);
if (IntuitionBase == NULL) panic("Can't open intuition");
GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library",GREV);
if (GfxBase == NULL) panic("Can't open GfxBase");
InitBitMap(&pbitmap,depth,WIDTH,HEIGHT);
for (i=0; i < depth; i++) {
pbitmap.Planes[i] = (PLANEPTR)AllocRaster(WIDTH,HEIGHT);
if (pbitmap.Planes[i] == NULL)
panic("Not enough memory for screen");
BltClear(pbitmap.Planes[i],RASSIZE(WIDTH,HEIGHT),0);
}
if (!bw) {
InitBitMap(&tbitmap,depth,WIDTH,SMHEIGHT);
for (i=0; i < depth; i++) {
tbitmap.Planes[i] = (PLANEPTR)AllocRaster(WIDTH,SMHEIGHT);
if (tbitmap.Planes[i] == NULL)
panic("Not enough memory for temp bit map");
BltClear(tbitmap.Planes[i],RASSIZE(WIDTH,SMHEIGHT),0);
}
}
InitBitMap(&ibitmap,depth,maskw,maskh);
for (i=0; i < depth; i++) {
ibitmap.Planes[i] = (PLANEPTR)AllocRaster(maskw,maskh);
if (ibitmap.Planes[i] == NULL)
panic("Not enough memory for image bit map");
BltClear(ibitmap.Planes[i],RASSIZE(maskw,maskh),0);
}
InitBitMap(&mbitmap,1,maskw,maskh);
mbitmap.Planes[0] = (PLANEPTR)AllocRaster(maskw,maskh);
if (mbitmap.Planes[0] == NULL)
panic("Not enough memory for mask bit map");
BltClear(mbitmap.Planes[0],RASSIZE(maskw,maskh),0);
myscreen = (struct Screen *) OpenScreen(&mynewscreen);
if (myscreen == NULL) panic("Can't open screen");
vp = &(myscreen->ViewPort);
sbitmap = &(myscreen->BitMap);
mynewwindow.Screen = myscreen;
mywindow = (struct Window *) OpenWindow(&mynewwindow);
if (mywindow == NULL) panic("Can't open window");
if (bw) LoadRGB4(&myscreen->ViewPort,bwcolortable,16);
else LoadRGB4(&myscreen->ViewPort,colortable,16);
RethinkDisplay();
render();
cleanup();
}
void
panic(str)
char *str;
{
fprintf(stderr,"%s\n",str);
fflush(stderr);
cleanup();
}
void
cleanup()
{
int i;
if (mywindow) CloseWindow(mywindow);
if (myscreen) CloseScreen(myscreen);
if (mbitmap.Planes[0]) FreeRaster(mbitmap.Planes[0],maskw,maskh);
for (i = depth-1; i >= 0; i--) if (ibitmap.Planes[i])
FreeRaster(ibitmap.Planes[i],maskw,maskh);
for (i = depth-1; i >= 0; i--) if (tbitmap.Planes[i])
FreeRaster(tbitmap.Planes[i],WIDTH,SMHEIGHT);
for (i = depth-1; i >= 0; i--) if (pbitmap.Planes[i])
FreeRaster(pbitmap.Planes[i],WIDTH,HEIGHT);
if (GfxBase) CloseLibrary((struct Library *)GfxBase);
if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
exit(0);
}
void
setbw()
{
bw = TRUE;
mynewscreen.Depth = depth = 4;
mynewscreen.ViewModes &= ~HAM;
}
void
dodefault()
{
printf(" %c33manimballs%c31m - An animation hack by JimG\n\n",0x9b,0x9b);
printf("Usage: animballs [-bw] ballsfile\n\n");
printf(" You have invoked animballs without parameters. I will use\n");
printf("a default balls file (balls.default.dat). You should read the\n");
printf("README file to see how to run this program. As a quick intro,\n");
printf("there will be a delay and then you will see some balls appear.\n");
printf("Press and hold the left mouse button, then drag the mouse to\n");
printf("rotate the balls in 3-space. Click on the close gadget to end.\n\n");
printf("Press <Return> to continue:");
(void) getc(stdin);
readballs(defaultfile);
}