home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
174.lha
/
BezSurf
/
mapimgpix.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-28
|
3KB
|
129 lines
#include "mytypes.h"
#include "readilbm.h"
#define DefRes 2
int MapImageV = DefRes*DefRepV,
MapImageH= DefRes*DefRepH; /* virtual screen size */
static int PixV=DefRes,
PixH=DefRes; /* true ilbm size in pixels */
short MapRepV = DefRepV,
MapRepH = DefRepH;
static short BytesPerLine;
static unsigned char *Raster= null;
static long MaxShade;
static bool AxisFlipped = DefXYFlip;
/*
* Update the MapImageH and MapImageV variables
*/
void PrepImgPix()
{
MapImageV = PixV * MapRepV;
MapImageH = PixH * MapRepH;
if( AxisFlipped ) {
int temp;
temp = MapImageV;
MapImageV = MapImageH;
MapImageH = temp;
}
}
/*
* free up any memory holding mapping image
*/
void CloseImgPix()
{
if( Raster) free(Raster);
Raster = null;
PixV = 0xff; PixH = 0xff;
PrepImgPix();
}
/*
* cause x and y axises to be reversed
*/
void FlipImgPix( flip )
bool flip;
{
AxisFlipped = flip;
PrepImgPix();
}
/*
* 4 bits per pixel means 2 pixels per byte
*/
bool OpenImgPix(sizex, sizey, maxshade)
int sizex, sizey;
short maxshade;
{
CloseImgPix();
if( maxshade == 0 ) {
OutErr("OpenImgPix: got max shade = 0\n");
maxshade = 1;
}
MaxShade = maxshade;
BytesPerLine = (sizex +1)/2;
Raster = (unsigned char *) malloc( BytesPerLine * sizey);
if( !Raster ) {
printf("OpenImgPix: not enough memory\n");
return(false); /* no memory err */
}
PixV = sizey;
PixH = sizex;
PrepImgPix();
return(true);
}
#define CalcByte(cbx,cby) (Raster + ( BytesPerLine * cby ) + (cbx >> 1))
void SetImgPix(x, y, val)
int x, y; /* location */
int val;
{
unsigned char *bite;
unsigned char shade;
if( x > PixH || x < 0 || y > PixV || y < 0 ) {
OutErr("SetImgPix(%d,%d,%d) out of range\n",x,y,val);
return;
}
if( !Raster) return;
shade = ( (val<< 4)-val)/MaxShade;
bite = CalcByte(x,y);
if( x & 1) {
*bite = (*bite & 0xf) | ( shade <<4 );
}
else {
*bite = (*bite & 0xf0) | shade;
}
}
short GetImgPix(x,y)
int x, y;
{
unsigned char *bite;
short shade;
if( AxisFlipped ) {
int temp;
temp = x; x = y; y = temp;
}
x %= PixH;
y %= PixV;
if( !Raster ) {
return( ((x ^ y)& 0x10) ? 0xff: 0);
}
bite = CalcByte(x,y);
if( x & 1) {
return( *bite & 0xf0);
}
else {
return( (*bite & 0x0f) <<4);
}
}