home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
223.lha
/
IffToPostScript
/
ifftops.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-04-02
|
21KB
|
752 lines
/* IFFTOPS - ILBM IFF format file to PostScript translator. */
/* Version 3.0 - LeRoy Fundingsland - 12/12/88 - SRC */
/* */
/* This code has been compiled and tested under both Sun */
/* UNIX (V3.5) and Commodore AmigaDOS (V1.2). On the */
/* Amiga the Lattice 4.0 compiler was used ("lc -Lm"). */
/* CLAZ.c v2.0 */
/* by Steve Ludtke */
/* Created : 05/31/87 */
/* Re-written Oct-Dec 1988 by LeRoy Fundingsland */
/* Supercomputing Research Center */
/* Lanham, MD */
/* funding@metropolis.super.org */
/* */
/* Changes: */
/* - code re-structured for readability and maintain- */
/* ability (my opinion (mostly:-)) */
/* - comments added for readability (but mostly just so I */
/* could understand the code) */
/* - code extended, with IFDEFs, to be compilable on SUN */
/* systems (or nearly any 4.2BSD derived system, */
/* I expect) */
/* - extended to generate color postscript output (as of */
/* the above date, color postscript output */
/* devices may be pretty rare but we have one and */
/* I think they will be be increasingly common in */
/* the future) */
/* - code extended, again with IFDEFs, to contain a rough */
/* attempt at reducing the grainyness of the */
/* output image (ref. "SMOOTH_INCLUDE") */
/* - added the function for the image to be arbitrarily */
/* rotated */
/* */
/* TODO: */
/* - place all of the initialization of default */
/* values to happen at compile time */
/* - make sure that every value in the "cmap" array is */
/* non-negative */
/* - QUESTION: when an Amiga process exits is the */
/* programmer guaranteed that all system resources */
/* are released? (specifically MALLOCed memory)? */
/* the following DEFINE is for /* 1 */
/* IFDEFing code which is specific to /* 1 */
/* the QMS ColorScript-100 laser /* 1 */
/* printer. /* 1 */
#define QMS /* 1 */
#define SMOOTH_INCLUDE /* 1 */
/* The code in this file has been /* 1 */
/* constructed so that one, and only /* 1 */
/* one, of the following "environment" /* 1 */
/* "define"s should be included in the /* 1 */
/* active code at any time. /* 1 */
/* /# 1 #/
#define AMIGA /* 1 */
#define SUN /* 1 */
#include<stdio.h>
#include<math.h>
#ifdef AMIGA /* 1 */
#undef NULL /* 1 */
#include<exec/types.h>
#endif AMIGA /* 1 */
#ifdef SUN /* 1 */
#define BYTE char /* 1 */
#define UBYTE unsigned char /* 1 */
#define WORD short /* 1 */
#define UWORD unsigned short /* 1 */
#define LONG int /* 1 */
#endif SUN /* 1 */
/* define IFF structures */
struct CMAP {
UBYTE r,g,b;
};
struct BMHD {
UWORD w,h;
WORD x,y;
UBYTE npl;
UBYTE masking,compression,pad1;
UWORD tcolor;
UBYTE xas,yas;
WORD pWid,pHig;
};
char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', /* 1 */
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /* 1 */
/* 1 */
#ifdef SUN /* 1 */
#define TRUE 1 /* 1 */
#define FALSE 0 /* 1 */
#endif SUN /* 1 */
int blacknwhite = TRUE; /* 1 */
/* 1 */
char *filename_err1 = /* 1 */
"ERROR: Too many file names on the command line\n"; /* 1 */
char *filename_data1 = /* 1 */
"\t(input=\"%s\", output=\"%s\", error string=\"%s\")\n\n"; /* 1 */
/* smoothing related declarations /* 1 */
int smooth = 0; /* 1 */
int width, height; /* 1 */
/* pointers to storage where pixel /* 1 */
/* values are held during smoothing /* 1 */
char *pixelrow, *smoothrow; /* 1 */
char *malloc();
void putval1(); /* 1 */
void putval2(); /* 1 */
void /* 1 */
main(argc, argv)
int argc; char *argv[];{
struct BMHD mhd;
long len1, len2, cnt, m, h, i, j, k, lr, lb, lg,
x1, x2, y1, y2, showpage;
int fl1, b;
int rotate = 0; /* 1 */
BYTE t;
UBYTE cmap[100];
char *raster=NULL, *rp, *infile=NULL, inspace[80], /* 1 */
*outfile=NULL, c, *misc=NULL; /* 1 */
LONG msc1[3], msc2[2]; /* 1 */
FILE *fin, *fout;
if(argc == 1){ /* 1 */
usage: /* 1 */
printf("Usage is: ifftops "); /* 1 */
printf("[-c] [-h]"); /* 1 */
#ifdef SMOOTH_INCLUDE /* 1 */
printf(" [-s]"); /* 1 */
#endif SMOOTH_INCLUDE /* 1 */
printf(" [-r <degrees>]\n"); /* 1 */
printf("\t\t[-p <x-start>,<y-start>,"); /* 1 */
printf("<x-scale>,<y-scale>]\n"); /* 1 */
printf("\t\t<input file> [<output-file>]\n"); /* 1 */
if(raster != NULL) /* 1 */
free(raster); /* 1 */
if(misc != NULL) /* 1 */
free(misc); /* 1 */
exit(); /* 1 */
} /* 1 */
showpage=1; x1=10; y1=10; x2=550; y2=480; /* 1 */
#ifdef QMS /* 1 */
y1 = (14*72)/16; /* mechanical paper handlng */ /* 1 */
#endif QMS /* 1 */
/* Get enough memory, figure out filespecs */
raster = malloc(200000);
if (raster == NULL)
{ printf("Not enough memory. (1)\n"); exit(0); }/* 1 */
misc = malloc(2000);
if(misc == NULL) /* 1 */
{ printf("Not enough memory. (2)\n"); exit(0); }/* 1 */
/* parse command line arguments */
for(argc--,argv++; argc > 0; argc--, argv++){ /* 1 */
if(argv[0][0] == '-'){ /* 1 */
switch(argv[0][1]){ /* 1 */
case 'c': /* "color" output */ /* 1 */
blacknwhite = FALSE; /* 1 */
break; /* 1 */
case 'h': /* "hold" printout */ /* 1 */
showpage = FALSE; /* 1 */
break; /* 1 */
case 'p': /* "position" image */ /* 1 */
if(argv[0][2] != 0) /* 1 */
goto bad_p_flag; /* 1 */
argc--; argv++; /* 1 */
if(argc < 1) /* 1 */
goto bad_p_flag; /* 1 */
i = /* 1 */
sscanf(argv[0],"%ld,%ld,%ld,%ld",/* 1 */
&x1, &y1, &x2, &y2); /* 1 */
if(i != 4){ /* 1 */
bad_p_flag: printf("Bad format "); /* 1 */
printf("for 'p' flag\n");/* 1 */
goto usage; /* 1 */
} /* 1 */
break; /* 1 */
case 'r': /* "rotate" image */ /* 1 */
if(argv[0][2] != 0) /* 1 */
goto bad_r_flag; /* 1 */
argc--; argv++; /* 1 */
if(argc < 1) /* 1 */
goto bad_r_flag; /* 1 */
i = /* 1 */
sscanf(argv[0],"%ld",&rotate); /* 1 */
if(i != 1){ /* 1 */
bad_r_flag: printf("Bad format "); /* 1 */
printf("for 'r' flag\n");/* 1 */
goto usage; /* 1 */
} /* 1 */
if(rotate >= 360 || /* 1 */
rotate <= -360) /* 1 */
goto bad_r_flag; /* 1 */
break; /* 1 */
#ifdef SMOOTH_INCLUDE /* 1 */
case 's': /* "smooth" image */ /* 1 */
/*
if(argv[0][2] == 0){ /* 1 */
smooth = 1; /* 1 */
/*
break; /* 1 */
/*
} /* 1 */
#ifdef NEVERDEF
sscanf(&argv[0][2], "%d", &smooth);
if(smooth == 0) /* 1 */
goto usage; /* 1 */
if(smooth < 1 || smooth > 3){ /* 1 */
printf("Invalid \"smooth\" ");
printf("value.\n"); /* 1 */
exit(1); /* 1 */
} /* 1 */
#endif NEVERDEF
break; /* 1 */
#endif SMOOTH_INCLUDE /* 1 */
default: /* 1 */
printf("Unknown flag '%c'\n", /* 1 */
*argv[1]); /* 1 */
exit(1); /* 1 */
} /* 1 */
} /* 1 */
else { /* file designator */ /* 1 */
/* maximum of two files allowed /* 1 */
/* the first one is the input /* 1 */
/* file, the second, if it /* 1 */
/* exists is the output file /* 1 */
if(infile == NULL) /* 1 */
infile = *argv; /* 1 */
else if(outfile == NULL) /* 1 */
outfile = *argv; /* 1 */
else{ /* 1 */
printf(filename_err1); /* 1 */
printf(filename_data1, infile, /* 1 */
outfile, *argv); /* 1 */
goto usage; /* 1 */
} /* 1 */
} /* 1 */
} /* end of argument parsing FOR loop */ /* 1 */
if(infile == NULL){ /* 1 */
printf("ERROR: input file name required.\n\n"); /* 1 */
goto usage; /* 1 */
} /* 1 */
printf("\n\n IFFTOPS - IFF to POSTSCRIPT");
printf(" converter V3.0\n");
printf(" By LeRoy Fundingsland\n");
printf(" (via Steve Ludtke)\n");
printf(" N\251 - No Copyright 1988\n");
printf("\n");
printf("File in : ");
if(infile != NULL) /* 1 */
printf("%s\n", infile);
else{ /* no input file supplied */
infile = inspace; /* 1 */
scanf("%s", infile);
}
if(outfile == NULL) /* 1 */
outfile = "out.ps";
fin = fopen(infile, "r");
if(fin == NULL)
{ printf("Sorry, can't open input file.\n"); exit(0); }
if ((fread((char *)msc1,12,1,fin)) == 0) /* 1 */
{ printf("Sorry, input file problem #1\n"); exit (0); }
/* /# 1 #/
len1 = (long *)&msc1[4];
*/ /* 1 */
len1 = msc1[1]; /* 1 */
printf("main : %d,%4s\n", len1, (char *)&msc1[0]); /* 1 */
cnt = 14;
/* len1=# bytes in file according to IFF */
/* msc2=the name of the current chunk */
/* len2=# bytes in current chunk */
/* by the way, UNID is symply any chunk the program */
/* doesn't deal with */
/* Reads in the IFF file : */
while(cnt < len1){
fl1 = 0;
if ((fread((char *)msc2,8,1,fin)) == 0) /* 1 */
{printf("Sorry, bad input file. \n"); exit(0);}
/* /# 1 #/
len2 = (long *)&msc2[4];
*/ /* 1 */
len2 = msc2[1]; /* 1 */
if (strncmp((char *)msc2,"CMAP",4) == 0) { /* 1 */
if ((fread(cmap,len2,1,fin)) == 0)
{ printf("Sorry, bad CMAP. \n"); exit(0); }
printf("CMAP\n");
fl1 = 1;
}
if (strncmp((char *)msc2,"BMHD",4) == 0) { /* 1 */
if ((fread((char *)&mhd,len2,1,fin)) == 0)
{ printf("Sorry, bad BMHD. \n"); exit(0); }
printf("BMHD\n");
fl1 = 1;
}
if (strncmp((char *)msc2,"BODY",4) == 0) { /* 1 */
printf("BODY\n");
#ifdef DEBUG /* 1 */
printf("\t\tlength of BODY chunk (from file) = %d\n", len2); /*999*/
#endif DEBUG /* 1 */
fl1 = 1;
m = 0; rp = raster;
if (mhd.compression == 1) {
while (m <= len2) {
t = getc(fin); m++;
if (t >= 0) {
t++;
fread(rp,(long) t,1,fin);
rp += t;
m += t;
}
if (t<0) {
t=(-t)+1;
c=getc(fin);
m++;
for (i=0; i<t; i++) {
*rp=c; rp++;
}
}
}
}
if (mhd.compression == 0) {
if((fread(rp,len2,1,fin)) == 0){
printf("Sorry, bad BODY. \n");
exit(0);
}
printf("No Compression\n");
}
if (mhd.compression > 1) {
printf("Sorry, unknown compression type.\n");
exit(0);
}
} /* end of "BODY" IF statement */
if (fl1 == 0) {
if (len2 > 2000) {
printf("Sorry, UNID too long.\n");
exit(0);
}
if ((fread(misc,len2,1,fin)) == 0) {
printf("Sorry, UNID bad. \n");
exit(0);
}
printf("UNID\n");
}
cnt += len2;
cnt += 8;
} /* end of IFF-file-reading WHILE loop */
#ifdef DEBUG /* 1 */
printf("Total bytes read into \"raster\" = %d\n", rp-raster); /*999*/
#endif DEBUG /* 1 */
fclose(fin);
/* inform user if file already exists /* 1 */
/* and is being appended to /* 1 */
if((fout=fopen(outfile,"r")) != NULL){ /* 1 */
printf("Output file, \"%s\", already exists.\n",/* 1 */
outfile); /* 1 */
printf("Output is being appended to this file.\n");
fclose(fout); /* 1 */
} /* 1 */
if ((fout=fopen(outfile,"a")) == NULL) {
printf("Sorry, cannot open output file.\n");
exit(0);
}
/* Standard POSTSCRIPT program, the only part following the data is */
/* the showpage command. */
if(smooth){ /* 1 */
width = mhd.w * 2; /* 1 */
height = mhd.h * 2; /* 1 */
/* the "pixelrow" array is sized at one /* 1 */
/* byte for each pixel because it will /* 1 */
/* hold the ASCII-HEX (see "hex" array) /* 1 */
/* value for each pixel. /* 1 */
/* (3 bytes for each pixel if color) /* 1 */
if(blacknwhite == TRUE) /* 1 */
pixelrow = malloc(width); /* 1 */
else /* color */ /* 1 */
pixelrow = malloc(width * 3); /* 1 */
if(pixelrow == NULL) /* 1 */
{ printf("Not enough memory. (3)\n"); exit(0); }/* 1 */
/* the same for the "smoothrow" array /* 1 */
if(blacknwhite == TRUE) /* 1 */
smoothrow = malloc(width); /* 1 */
else /* color */ /* 1 */
smoothrow = malloc(width * 3); /* 1 */
if(smoothrow == NULL) /* 1 */
{ printf("Not enough memory. (4)\n"); exit(0); }/* 1 */
} /* 1 */
else{ /* 1 */
width = mhd.w; /* 1 */
height = mhd.h; /* 1 */
} /* 1 */
/* 1 */
fprintf(fout, "%%!\r"); /* 1 */
fprintf(fout,"[0 0 0 0 0 0] defaultmatrix setmatrix\r");/* 1 */
/* the length of the postscript /* 1 */
/* "picture string" (picstr) must equal /* 1 */
/* the width of the picture in pixels /* 1 */
/* (mhd.w) times the number of bytes of /* 1 */
/* data supplyed per pixel (0.5 for /* 1 */
/* B&W, 1.5 for color). This is so that /* 1 */
/* every time the "image" command /* 1 */
/* invokes the reading procedure, all /* 1 */
/* N bytes representing one scan line /* 1 */
/* are read. /* 1 */
fprintf(fout,"/picstr %d string def\r",
(int)(width * (blacknwhite ? 0.5 : 1.5))); /* 1 */
fprintf(fout,"%ld %ld translate\r",x1,y1);
if(rotate) /* 1 */
fprintf(fout, "%d rotate\r", rotate); /* 1 */
fprintf(fout,"%ld %ld scale\r",x2,y2);
fprintf(fout, "%d %d 4 [%d 0 0 -%d 0 %d]\r",
width, height, width, height, height); /* 1 */
fprintf(fout,"{currentfile picstr readhexstring pop}");
#ifdef QMS /* 1 */
if(blacknwhite == FALSE) /* 1 */
fprintf(fout, " false 3 colorimage\r"); /* 1 */
else /* color! */ /* 1 */
#endif QMS /* 1 */
fprintf(fout, " image\r");
/* calculate and output file */
lb = lr = lg = 0;
printf("rast size : %d #planes : %d\n",
mhd.w*mhd.h/8, mhd.npl); /* 1 */
/* what does this do? */
for (h=0; h<96; h++)
cmap[h] = cmap[h]/16;
for (h=0; h<mhd.h; h++) {
for (i=0; i<mhd.w/8; i++) {
for(k=7;k>=0;k--) {
b=0;
for(j=0; j<mhd.npl; j++) {
c = (raster[h*(mhd.w/8)*mhd.npl+i+((mhd.npl-j-1)*mhd.w/8)]);
c = c>>k;
c &= 1;
b |= c;
b <<= 1;
}
b >>= 1;
/* this is for HAM pictures */
if (mhd.npl == 6) {
c = (b&48) >> 4;
b &= 15;
if (c == 0) {
b *= 3;
lr = cmap[b];
lb = cmap[b+1];
lg = cmap[b+2];
}
if (c == 1) lb = b;
if (c == 2) lr = b;
if (c == 3) lg = b;
}
if (mhd.npl != 6) {
b &= 31;
b *= 3;
lr = cmap[b];
lb = cmap[b+1];
lg = cmap[b+2];
}
if(blacknwhite){ /* 1 */
m = lr+lb+lg; m = m/3;
if (m < 0) m = 0;
if (m > 14) m = 14;
#ifdef SMOOTH_INCLUDE /* 1 */
putval1(m, fout, h, /* 1 */
(i*8) + (7-k)); /* 1 */
#else SMOOTH_INCLUDE /* 1 */
putc(hex[m], fout);
#endif SMOOTH_INCLUDE /* 1 */
} /* 1 */
else{ /* color! */ /* 1 */
#ifdef SMOOTH_INCLUDE /* 1 */
putval2(lr,lg,lb,fout, /* 1 */
h,(i*8)+(7-k)); /* 1 */
#else SMOOTH_INCLUDE /* 1 */
putc(hex[lr], fout);
putc(hex[lg], fout);
putc(hex[lb], fout);
#endif SMOOTH_INCLUDE /* 1 */
} /* 1 */
}
}
} /* end of map-header-count FOR loop */
fprintf(fout,"\r");
if(showpage) /* 1 */
fprintf(fout,"showpage\r");
fclose(fout);
printf("Done !!!\n");
free(misc);
free(raster);
#ifdef DEBUG /* 1 */
printf("\n\tmhd.w = %d mhd.h = %d\n", mhd.w, mhd.h); /*999*/
printf("\twidth = %d height = %d\n", width, height); /*999*/
#endif DEBUG /* 1 */
}
#ifdef SMOOTH_INCLUDE /* 1 */
void /* 1 */
putval1(pixelval, fout, rownum, pixelnum) /* 1 */
char pixelval; /* the binary value */ /* 1 */
int rownum, pixelnum;
FILE *fout;{
int i;
char tempval;
/* NOTE: the raw values are placed in */
/* the odd numbered elements of the */
/* arrays and the averaged values are */
/* placed in the even numbered elements.*/
/* The exception to this is the zeroth */
/* pixels and row. Since these values */
/* cannot be produced (because there is */
/* no previous value to average with) */
/* they are initialized with the value */
/* of the zeroth pixel (which also */
/* exists in array element numbered "1")*/
if(smooth){
if(rownum == 0){
if(pixelnum == 0){
smoothrow[0] = pixelval;
smoothrow[1] = pixelval;
pixelrow[0] = pixelval;
pixelrow[1] = pixelval;
}
else{
smoothrow[(2*pixelnum)+1] =
pixelval;
pixelrow[(2*pixelnum)+1] =
pixelval;
tempval =
(pixelrow[(2*pixelnum)-1] +
pixelval) / 2;
smoothrow[2*pixelnum] = tempval;
pixelrow[2*pixelnum] = tempval;
}
}
else{ /* rownum != 0 */
if(pixelnum == 0){
smoothrow[1] =
(pixelrow[1] + pixelval) / 2;
pixelrow[1] = pixelval;
smoothrow[0] = smoothrow[1];
pixelrow[0] = pixelval;
}
else{
smoothrow[(2*pixelnum)+1] =
(pixelrow[(2*pixelnum)+1] +
pixelval) / 2;
pixelrow[(2*pixelnum)+1] =
pixelval;
tempval =
(pixelrow[(2*pixelnum)-1] +
pixelval) / 2;
smoothrow[2*pixelnum] =
(pixelrow[2*pixelnum] +
tempval) / 2;
pixelrow[2*pixelnum] = tempval;
}
}
/* if the last pixel in the row has */
/* been processed then write the two */
/* rows to the output file. */
if(pixelnum == ((width/2) - 1)){
for(i=0; i < width; i++)
putc(hex[smoothrow[i]], fout);
for(i=0; i < width; i++)
putc(hex[pixelrow[i]], fout);
}
}
else /* no smoothing */
putc(hex[pixelval], fout);
}
#define SETPIXELS(array,index,r,g,b) /* 1 */\
array[(3*index)+0] = r; /* 1 */\
array[(3*index)+1] = g; /* 1 */\
array[(3*index)+2] = b; /* 1 */
#define AVE0PIX(array,index,val) /* 1 */\
((array[(3*index)+0]+val)/2)
#define AVE1PIX(array,index,val) /* 1 */\
((array[(3*index)+1]+val)/2)
#define AVE2PIX(array,index,val) /* 1 */\
((array[(3*index)+2]+val)/2)
void /* 1 */
putval2(redval, greenval, blueval, fout, rownum, pixelnum) /* 1 */
char redval, greenval, blueval; /* the binary value */ /* 1 */
int rownum, pixelnum;
FILE *fout;{
int i;
char tempred, tempgreen, tempblue;
/* NOTE: the raw values are placed in */
/* the odd numbered elements of the */
/* arrays and the averaged values are */
/* placed in the even numbered elements.*/
/* The exception to this is the zeroth */
/* pixels and row. Since these values */
/* cannot be produced (because there is */
/* no previous value to average with) */
/* they are initialized with the value */
/* of the zeroth pixel (which also */
/* exists in array element numbered "1")*/
if(smooth){
if(rownum == 0){
if(pixelnum == 0){
SETPIXELS(smoothrow,0,redval,
greenval,blueval)
SETPIXELS(smoothrow,1,redval,
greenval,blueval)
SETPIXELS(pixelrow,0,redval,
greenval,blueval)
SETPIXELS(pixelrow,1,redval,
greenval,blueval)
}
else{
/* store raw values */
SETPIXELS(smoothrow,((2*pixelnum)+1),
redval,greenval,blueval)
SETPIXELS(pixelrow,((2*pixelnum)+1),
redval,greenval,blueval)
/* calculate and store */
/* averaged values */
tempred =
(pixelrow[(3*((2*pixelnum)-1))+0] +
redval) / 2;
tempgreen =
(pixelrow[(3*((2*pixelnum)-1))+1] +
greenval) / 2;
tempblue =
(pixelrow[(3*((2*pixelnum)-1))+2] +
blueval) / 2;
SETPIXELS(smoothrow,(2*pixelnum),
tempred,tempgreen,tempblue)
SETPIXELS(pixelrow,(2*pixelnum),
tempred,tempgreen,tempblue)
}
}
else{ /* rownum != 0 */
if(pixelnum == 0){
SETPIXELS(smoothrow,1,
AVE0PIX(pixelrow,1,redval),
AVE1PIX(pixelrow,1,greenval),
AVE2PIX(pixelrow,1,blueval))
SETPIXELS(pixelrow,1,redval,
greenval,blueval)
SETPIXELS(smoothrow,0,smoothrow[3],
smoothrow[4],smoothrow[5])
SETPIXELS(pixelrow,0,redval,
greenval,blueval)
}
else{
SETPIXELS(smoothrow,((2*pixelnum)+1),
AVE0PIX(pixelrow,((2*pixelnum)+1),redval),
AVE1PIX(pixelrow,((2*pixelnum)+1),greenval),
AVE2PIX(pixelrow,((2*pixelnum)+1),blueval))
/*
smoothrow[(2*pixelnum)+1] =
(pixelrow[(2*pixelnum)+1] +
pixelval) / 2;
*/
SETPIXELS(pixelrow,((2*pixelnum)+1),
redval,greenval,blueval)
/* calculate and store */
/* averaged values */
tempred =
(pixelrow[(3*((2*pixelnum)-1))+0] +
redval) / 2;
tempgreen =
(pixelrow[(3*((2*pixelnum)-1))+1] +
greenval) / 2;
tempblue =
(pixelrow[(3*((2*pixelnum)-1))+2] +
blueval) / 2;
SETPIXELS(smoothrow,(2*pixelnum),
AVE0PIX(pixelrow,(2*pixelnum),tempred),
AVE1PIX(pixelrow,(2*pixelnum),tempgreen),
AVE2PIX(pixelrow,(2*pixelnum),tempblue))
/*
smoothrow[2*pixelnum] =
(pixelrow[2*pixelnum] +
tempval) / 2;
*/
SETPIXELS(pixelrow,(2*pixelnum),
tempred,tempgreen,tempblue)
}
}
/* if the last pixel in the row has */
/* been processed then write the two */
/* rows to the output file. */
if(pixelnum == ((width/2) - 1)){
for(i=0; i < width; i++){
putc(hex[smoothrow[(3*i)+0]], fout);
putc(hex[smoothrow[(3*i)+1]], fout);
putc(hex[smoothrow[(3*i)+2]], fout);
}
for(i=0; i < width; i++){
putc(hex[pixelrow[(3*i)+0]], fout);
putc(hex[pixelrow[(3*i)+1]], fout);
putc(hex[pixelrow[(3*i)+2]], fout);
}
}
}
else{ /* no smoothing */
putc(hex[redval], fout);
putc(hex[greenval], fout);
putc(hex[blueval], fout);
}
}
#endif SMOOTH_INCLUDE /* 1 */