/* DISPCX.C READ & DISPLAY A *.PCX FILE ms Quick C set for EGA mode */
/* M. CLYNES 07-24-89 */
/* command line format >DISPCX photo1.pcx */
/* program set for 1/4 file size display */
#include "stdio.h"
#include "math.h"
#include "graph.h"
#define COLOR 1
#define HOROFF 10
#define TOPOFF 70
struct pcxheader{
char manufact;
char version;
char encode;
char bpp;
int xmin;
int ymin;
int xmax;
int ymax;
int hres;
int vres;
char colormap[50];
int bpline;
int paletinfo;
char blank[58];
} header;
/*=======================================================================*/
/*========================== MAIN() =====================================*/
int main( argc, argv )
int argc;
char *argv[2];
{
int data, line, status, bytesline, cnt;
char decodebuff[200];
FILE *fp;
_setvideomode(_ERESCOLOR);
_clearscreen(_GCLEARSCREEN);
if((fp = fopen(argv[1],"rb")) == NULL)
{
printf("ERROR: FILE '%s' CANNOT BE OPENED.\n",argv[2]);
exit(0);
_setvideomode(_DEFAULTMODE);
}
bytesline = readheader(fp);
cnt = 0;
line = TOPOFF;
status = 0;
/* do EXTRA READS to srink vertical */
while(status != EOF)
{
status = decodepcx(decodebuff, bytesline, fp);
status = decodepcx(decodebuff, bytesline, fp);
status = decodepcx(decodebuff, bytesline, fp);
pixeldump(decodebuff, bytesline, line);
line++;
}
printf("PRESS 'ENTER' to contimue");
getch();
_setvideomode(_DEFAULTMODE);
} /* End of main() */
/*========================================================================*/
/* read .PCX header into structure */
/*========================================================================*/
readheader(fp)
FILE *fp;
{
int count;
char *loader;
loader = (char *) &header;
for(count = 0; count < 127; count++)
{
*loader = (char)fgetc(fp);
loader++;
}
printf("Encoding type %d\n",header.encode);
printf("Window X-min = %4d, Y-min = %4d\n",header.xmin, header.ymin);
printf("Window X-max = %4d, Y-max = %4d\n",header.xmax, header.ymax);
printf("Hres = %4d, Vres = %4d\n",header.hres, header.vres);
printf("# bytes per/scan line %4d ",header.bpline);
return(header.bpline);
}
/*========================================================================*/
/* gobal decoded data char decodebuff[200]; */
/*========================================================================*/
/* Decode a line of .PCX */
/* This procedure reads one encoded line from the image file */
/* 0 = valid data stored */
/* EOF = out of data in file */
decodepcx(decodebuff, bytesline, fp)
char *decodebuff; /* where to place data */
int bytesline; /* # of bytes per line */
FILE *fp; /* image file handle */
{
int data;
int cnt;
while(bytesline > 0 )
{
cnt = 1;
if(EOF == (data = getc(fp))) return(EOF); /* retrive a data byte */
if(0xc0 == (0xc0 & data))
{
cnt = 0x3f & data; /* get repeat count */
if(EOF == (data = getc(fp))) return(EOF); /* get real data */
}
/* expand data into buffer */
while(cnt)
{
*decodebuff = data;
decodebuff++;
bytesline--;
cnt--;
}
}
return(0); /* file read status */
}
/* decodepcx() end */
/*========================================================================*/
/* pixel line dump */
/*========================================================================*/
/* DUMP A RASTER LINE TO DISPLAY */
/* pixeldump((pointer buffer), (# of BYTES), (Y line on screen to dump))*/
pixeldump(rdbuff, bytes, line)
char *rdbuff;
int bytes, line;
{
unsigned x;
unsigned char byte, loop;
bytes = (bytes * 8) + HOROFF;
for(x = HOROFF; x < bytes; rdbuff++)
{
byte = *rdbuff; /* >>= 2 srink HORZ. or >>= 1 */
for (loop = 0x80; loop > 0; loop >>= 2)
{
if (loop & byte) _setpixel(x, line);
x++;
}
}
}
/* pixeldump() End */