home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
274.lha
/
SimGen_Src
/
STENCIL.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-26
|
3KB
|
154 lines
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <functions.h>
#include "pdefines.h"
#include "globals.h"
#define CHEAT 1
struct Picture *CreateStencilPic (rp, stencilcolor)
struct RastPort *rp;
UBYTE stencilcolor;
{
struct RastPort *mrp;
struct Picture *newpic;
WORD height, width;
WORD left, top;
WORD depth;
int i;
UBYTE oldmask;
if (( newpic = (struct Picture *)AllocMem (sizeof (struct Picture), MEMF_CLEAR)) == NULL) {
SYSMESS ("Couldn't allocate an Picture");
return (NULL);
}
InitRastPort (&newpic->RastPort);
newpic->RastPort.BitMap = &newpic->BitMap;
if (rp->Layer) {
left = rp->Layer->bounds.MinX;
top = rp->Layer->bounds.MinY;
width = rp->Layer->bounds.MaxX - left + 1;
height = rp->Layer->bounds.MaxY - top + 1;
} else {
left = 0;
top = 0;
width = rp->BitMap->BytesPerRow * 8;
height = rp->BitMap->Rows;
}
depth = rp->BitMap->Depth;
newpic->ilbmframe.bmHdr.nPlanes = depth;
newpic->ilbmframe.bmHdr.w = width;
newpic->ilbmframe.bmHdr.h = height;
InitBitMap (&newpic->BitMap, rp->BitMap->Depth, width, height);
if (!(newpic->BitMap.Planes[0] = AllocRaster(width, height))) {
DeleteStencilPic (newpic);
SYSMESS ("Couldn't allocate stencil mem");
return NULL;
}
for (i=1; i<depth; i++) {
newpic->BitMap.Planes[i] = newpic->BitMap.Planes[0];
}
mrp = &newpic->RastPort;
oldmask = mrp->Mask;
mrp->Mask = 0x01;
ClipCopy (rp, left, top,
newpic, 0, 0, width, height, 0xFF, USECLIPBLIT);
mrp->Mask = stencilcolor;
ClipCopy (rp, left, top,
newpic, 0, 0, width, height, 0x80, USECLIPBLIT);
mrp->Mask = 0xFF^stencilcolor;
ClipCopy (rp, left, top,
newpic, 0, 0, width, height, 0x20, USECLIPBLIT);
mrp->Mask = oldmask;
return (newpic);
}
DeleteStencilPic (pic)
struct Picture *pic;
{
if (pic) {
if (pic->BitMap.Planes[0]) {
FreeMem (pic->BitMap.Planes[0],
pic->BitMap.BytesPerRow *
pic->BitMap.Rows);
}
FreeMem (pic, sizeof (struct Picture));
}
}
struct Shape *CreateStencil (rp, color)
struct RastPort *rp;
UBYTE color;
{
struct Shape *newshape;
struct Picture *newpic;
struct BitMap *bm;
int depth, width, height;
int i;
UBYTE tcolor;
if (( newshape = (struct Shape *)AllocMem (sizeof (struct Shape), MEMF_CLEAR)) == NULL) {
SYSMESS ("Couldn't allocate a Shape");
return (NULL);
}
if (!( newpic = CreateStencilPic (rp, color))) {
DeleteStencil (newshape);
return (NULL);
}
newshape->Pic = newpic;
depth = newpic->ilbmframe.bmHdr.nPlanes;
width = newpic->ilbmframe.bmHdr.w;
height = newpic->ilbmframe.bmHdr.h;
tcolor = newpic->ilbmframe.bmHdr.transparentColor;
/*** Create a bitmap for mask ***/
bm = &newshape->MaskBm;
InitBitMap (bm, depth, width, height);
bm->Planes[0] = newpic->BitMap.Planes[0];
for (i = 1; i < depth; i++) {
bm->Planes[i] = bm->Planes[0];
}
#if NOT CHEAT
/*** the mask is inverted so fix it ***/
/*** Now the mask will have ones were the shapes are ***/
/*** and zeros everywhere else ***/
BltBitMap (bm, 0, 0,
bm, 0, 0,
width, height,
0x30, 0x01, NULL);
#endif
/*** Finally Create a RastPort for the mask ***/
InitRastPort (&newshape->MaskRp);
newshape->MaskRp.BitMap = bm;
return (newshape);
}
DeleteStencil (shape)
struct Shape *shape;
{
if (shape) {
DeleteStencilPic (shape->Pic);
FreeMem (shape, sizeof (struct Shape));
}
}