home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
gondwana.ecr.mu.oz.au/pub/
/
Graphics.tar
/
Graphics
/
ppmtovort.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-25
|
4KB
|
215 lines
/*
* ppm2vort.c - read a portable pixmap and produce a VORT file
*
* Compile with: (In the tools directory)
*
* cc -o ppmtovort ppmtovort.c -I../lib ../lib/libvort.a
*/
#include <stdio.h>
#include "vort.h"
#define ASCII 111
#define RAW 222
main(argc, argv)
int argc;
char *argv[];
{
FILE *fp;
unsigned char *r;
unsigned char *g;
unsigned char *b;
image *im;
int i, type, w, h, maxval;
/*
* Read from file or stdin...
*/
if (argc == 1)
fp = stdin;
else if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Couldn't open %s for reading.\n", argv[1]);
exit(1);
}
type = readppmheader(fp, &w, &h, &maxval);
if ((r = (unsigned char *)malloc((unsigned)w)) == NULL) {
fprintf(stderr, "Out of mem.\n");
exit(1);
}
if ((g = (unsigned char *)malloc((unsigned)w)) == NULL) {
fprintf(stderr, "Out of mem.\n");
exit(1);
}
if ((b = (unsigned char *)malloc((unsigned)w)) == NULL) {
fprintf(stderr, "Out of mem.\n");
exit(1);
}
/*
* Write to stdout....
*/
if ((im = openimage("-", "w")) == (image *)NULL) {
fprintf(stderr, "Can't open '-' for output!\n");
exit(1);
}
imageheight(im) = h;
imagewidth(im) = w;
imagetitle(im) = "";
titlelength(im) = 0;
imagedate(im) = time(0L);
/*
* We are going to write a 24bit VORT file anyway....
*/
imagetype(im) = PIX_RLE;
imagedepth(im) = 24;
writeheader(im);
fprintf(stderr, "Writing 24 bit PIX_RLE VORT file....\n");
for (i = 0; i < h; i++) {
readppmline(fp, type, w, r, g, b);
writergbline(im, r, g, b);
}
closeimage(im);
fclose(fp);
exit(0);
}
/*
* Skips blanks and comments etc etc
*/
skipblanks(fp)
FILE *fp;
{
int c;
while((c = fgetc(fp)) == ' ' || c == '\t' || c == '\n')
/* NOTHING */;
if (c == EOF) {
fprintf(stderr, "EOF found in ppmfile!\n");
exit(1);
}
if (c == '#') {
while((c = fgetc(fp)) != '\n')
/* NOTHING */;
} else {
ungetc(c, fp);
}
}
int
readppmheader(fp, w, h, maxval)
FILE *fp;
int *w, *h, *maxval;
{
int type, c;
skipblanks(fp);
if ((c = fgetc(fp)) == 'P')
c = fgetc(fp);
else {
fprintf(stderr, "Bad header in ppm file.\n");
exit(1);
}
if (c == '3')
type = ASCII;
else if (c == '6')
type = RAW;
else {
fprintf(stderr, "Unknown ppm type 'P%c'.\n", c);
exit(1);
}
skipblanks(fp);
if (fscanf(fp, "%d", w) != 1) {
fprintf(stderr, "Error reading width.\n");
exit(1);
}
skipblanks(fp);
if (fscanf(fp, "%d", h) != 1) {
fprintf(stderr, "Error reading height.\n");
exit(1);
}
skipblanks(fp);
if (fscanf(fp, "%d", maxval) != 1) {
fprintf(stderr, "Error reading maxval.\n");
exit(1);
}
if (*maxval > 255) {
fprintf(stderr, "can't handle maxval > 255.\n");
exit(1);
}
skipblanks(fp);
return(type);
}
/*
* Read the ppm data into r, g and b arrays for one line.
*/
readppmline(fp, type, w, r, g, b)
FILE *fp;
int type;
int w;
unsigned char *r, *g, *b;
{
int c, i, rdata, gdata, bdata;
switch(type) {
case ASCII:
for (i = 0; i < w; i++) {
if (fscanf(fp, "%d %d %d", &rdata, &gdata, &bdata) != 3) {
fprintf(stderr, "Error reading ASCII integer data from ppm file.\n");
exit(1);
}
r[i] = (unsigned char)rdata;
g[i] = (unsigned char)gdata;
b[i] = (unsigned char)bdata;
}
break;
case RAW:
for (i = 0; i < w; i++) {
if ((c = fgetc(fp)) == EOF) {
fprintf(stderr, "EOF read in raw ppm file.\n");
exit(1);
}
r[i] = (unsigned char)c;
if ((c = fgetc(fp)) == EOF) {
fprintf(stderr, "EOF read in raw ppm file.\n");
exit(1);
}
g[i] = (unsigned char)c;
if ((c = fgetc(fp)) == EOF) {
fprintf(stderr, "EOF read in raw ppm file.\n");
exit(1);
}
b[i] = (unsigned char)c;
}
}
}