/*------------------------------------------------------------------------
*
* Copyright (c) 1997-1998 by Cornell University.
*
* See the file "license.txt" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*------------------------------------------------------------------------
*/
#include <dvmbasic.h>
#include <dvmpnm.h>
#include <sys/stat.h>
int fsize (char *name)
{
#ifdef __WIN32__
struct _stat s;
#else
struct stat s;
#endif
int result;
result = stat(name, &s);
return s.st_size;
}
void WritePPM(hdr, r, g, b, filename)
PnmHdr *hdr;
ByteImage *r;
ByteImage *g;
ByteImage *b;
char *filename;
{
int w = ByteGetWidth(r);
int h = ByteGetHeight(r);
BitParser *bp = BitParserNew();
BitStream *bs = BitStreamNew(20 + 3*w*h);
FILE *f = fopen(filename, "wb");
BitParserWrap(bp, bs);
if (f == NULL) {
fprintf(stderr, "unable to open file %s for writing.\n", filename);
exit(1);
}
PnmHdrSetWidth(hdr, w);
PnmHdrSetHeight(hdr, h);
PnmHdrSetType(hdr, PPM_BIN);
PnmHdrSetMaxVal(hdr, 255);
PnmHdrEncode(hdr, bp);
PpmEncode(r, g, b, bp);
BitStreamFileWrite(bs, f, 0);
fclose(f);
BitParserFree(bp);
BitStreamFree(bs);
}
void ReadPPM (filename, hdr, r, g, b)
char *filename;
PnmHdr **hdr;
ByteImage **r;
ByteImage **g;
ByteImage **b;
{
FILE *f;
BitStream *inbs;
BitParser *inbp;
int w, h;
f = fopen(filename, "rb");
if (f == NULL) {
fprintf(stderr, "unable to open file %s for reading\n", filename);
exit(1);
}
*hdr = PnmHdrNew();
inbs = BitStreamNew(fsize(filename));
inbp = BitParserNew();
BitParserWrap(inbp, inbs);
BitStreamFileRead(inbs, f, 0);
PnmHdrParse(inbp, *hdr);
w = PnmHdrGetWidth(*hdr);
h = PnmHdrGetHeight(*hdr);
*r = ByteNew(w, h);
*g = ByteNew(w, h);
*b = ByteNew(w, h);
PpmParse(inbp, *r, *g, *b);
fclose(f);
BitParserFree(inbp);
BitStreamFree(inbs);
}
void WritePGM(hdr, r, filename)
PnmHdr *hdr;
ByteImage *r;
char *filename;
{
int w = ByteGetWidth(r);
int h = ByteGetHeight(r);
BitParser *bp = BitParserNew();
BitStream *bs = BitStreamNew(20 + w*h);
FILE *f = fopen(filename, "wb");
BitParserWrap(bp, bs);
if (f == NULL) {
fprintf(stderr, "unable to open file %s for writing.\n", filename);
exit(1);
}
PnmHdrSetWidth(hdr, w);
PnmHdrSetHeight(hdr, h);
PnmHdrSetType(hdr, PGM_BIN);
PnmHdrSetMaxVal(hdr, 255);
PnmHdrEncode(hdr, bp);
PgmEncode(r, bp);
BitStreamFileWrite(bs, f, 0);
fclose(f);
BitParserFree(bp);
BitStreamFree(bs);
}
void ReadPGM (filename, hdr, r)
char *filename;
PnmHdr **hdr;
ByteImage **r;
{
FILE *f;
BitStream *inbs;
BitParser *inbp;
int w, h;
f = fopen(filename, "r");
if (f == NULL) {
fprintf(stderr, "unable to open file %s for reading\n", filename);
exit(1);
}
*hdr = PnmHdrNew();
inbs = BitStreamNew(fsize(filename));
inbp = BitParserNew();
BitParserWrap(inbp, inbs);
BitStreamFileRead(inbs, f, 0);
PnmHdrParse(inbp, *hdr);
w = PnmHdrGetWidth(*hdr);
h = PnmHdrGetHeight(*hdr);
*r = ByteNew(w, h);
PgmParse(inbp, *r);
fclose(f);
BitParserFree(inbp);
BitStreamFree(inbs);
}
void WritePBM8(hdr, r, filename)
PnmHdr *hdr;
BitImage *r;
char *filename;
{
int w = BitGetWidth(r);
int h = BitGetHeight(r);
BitParser *bp = BitParserNew();
BitStream *bs = BitStreamNew(20 + w*h/8);
FILE *f = fopen(filename, "w");
BitParserWrap(bp, bs);
if (f == NULL) {
fprintf(stderr, "unable to open file %s for writing.\n", filename);
exit(1);
}
PnmHdrSetWidth(hdr, w);
PnmHdrSetHeight(hdr, h);
PnmHdrSetType(hdr, PBM_BIN);
PnmHdrEncode(hdr, bp);
PbmEncode8(r, bp);
BitStreamFileWrite(bs, f, 0);
fclose(f);
BitParserFree(bp);
BitStreamFree(bs);
}
void ReadPBM8 (filename, hdr, r)
char *filename;
PnmHdr **hdr;
BitImage **r;
{
FILE *f;
BitStream *inbs;
BitParser *inbp;
int w, h;
f = fopen(filename, "r");
if (f == NULL) {
fprintf(stderr, "unable to open file %s for reading\n", filename);
exit(1);
}
*hdr = PnmHdrNew();
inbs = BitStreamNew(fsize(filename));
inbp = BitParserNew();
BitParserWrap(inbp, inbs);
BitStreamFileRead(inbs, f, 0);
PnmHdrParse(inbp, *hdr);
w = PnmHdrGetWidth(*hdr);
h = PnmHdrGetHeight(*hdr);
*r = BitNew(w, h);
PbmParse8(inbp, *r);
fclose(f);
BitParserFree(inbp);
BitStreamFree(inbs);
}