[comp.graphics] Raytracer => Sun Rasterfile

tom@tnosoes.UUCP (Tom Vijlbrief) (09/16/88)

These are two programs to generate rasterfiles from output generated
by the raytracer written by Mark VandeWettering.

The first posting contained a bug. (Only for SunOS < 3.5).

I also added dithering and a better colormap.

#---cut here---cut here---cut here---cut here---cut here---
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files.
# This archive created: Fri Sep 16 09:47:18 MET DST 1988
# Archived by: tnosoes!tom@mcvax.cwi.nl
export PATH; PATH=/bin:$PATH
echo shar: extracting "'Makefile'" '(277 characters)'
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
sed 's/^X//' << \SHAR_EOF > 'Makefile'
XCFLAGS= -O -s
X
Xcray2sun: cray2sun.o
X	cc $(CFLAGS) -o $@ $?
X
Xgray2sun: gray2sun.o
X	cc $(CFLAGS) -o $@ $?
X
X#
X#bwray2sun: bwray2sun.o
X#	cc $(CFLAGS) -o $@ $?
X
Xclean:
X	/bin/rm -f *.o ray2sun cray2sun
X
Xshar:
X	/bin/rm -f shar.out
X	shar ray2sun.c Makefile
X
Xlint:
X	lint -hap ray2sun.c
SHAR_EOF
if test 277 -ne "`wc -c < 'Makefile'`"
then
	echo shar: error transmitting "'Makefile'" '(should have been 277 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'README'" '(1046 characters)'
if test -f 'README'
then
	echo shar: will not over-write existing file "'README'"
else
sed 's/^X//' << \SHAR_EOF > 'README'
XThese two programs convert output from the raytracer written
Xby Mark VanDeWettering to Sun rasterfiles.
X
Xgray2sun [file]		This filter generates a rasterfile with grey scales.
X
Xcray2sun [-d] [file]	This filter generates a color rasterfile.
X
XThe '-d' option disables dithering. This results in sharper pictures,
X(less dithering noise),
Xbut also results in hard color boundaries, where the original picture
Xhas soft color changes. (Like the 'balls' example).
X
XCray2sun uses a 6 * 7 * 6 colormap. 6 Intensities for Red, 7 for Green
Xand 6 for Blue.
X
XThe dithering algorithm is simple minded. Errors are propagated to the
Xright neighbour pixel.
X
X
X
XSend suggestions, bugs, etc, to the address below.
X
XTom
X===============================================================================
XTom Vijlbrief
XTNO Institute for Perception
XP.O. Box 23				Phone: +31 34 63 62 77
X3769 DE  Soesterberg			E-mail: tnosoes!tom@mcvax.cwi.nl
XThe Netherlands				    or:	uunet!mcvax!tnosoes!tom
X===============================================================================
SHAR_EOF
if test 1046 -ne "`wc -c < 'README'`"
then
	echo shar: error transmitting "'README'" '(should have been 1046 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'cray2sun.c'" '(2417 characters)'
if test -f 'cray2sun.c'
then
	echo shar: will not over-write existing file "'cray2sun.c'"
else
sed 's/^X//' << \SHAR_EOF > 'cray2sun.c'
X/*
X * This filter converts ray tracing files to Sun rasterfiles.
X *
X * Tom Vijlbrief,  Sep 1988 (tnosoes!tom@mcvax.cwi.nl or uunet!mcvax!tnosoes!tom)
X */
X
X#include	<stdio.h>
X#include	<rasterfile.h>
X
Xstruct rasterfile	header;
X
Xtypedef unsigned char	byte;
X
Xchar			*malloc();
XFILE			*fopen();
X
X#define			BUFSIZE		6
X
Xchar	*malloc();
Xlong	random();
X
Xbyte	colmap[256];
Xbyte	buf[BUFSIZE];
X
X
Xint	dflag= 0;
X
Xmain(argc, argv)
X
Xint	argc;
Xchar	*argv[];
X{
X  FILE	*f;
X  register int	i;
X  register int	r=0,g=0,b=0,rnew,gnew,bnew;
X  int	c;
X  int	done;
X  int	x, y;
X  char	*progname= argv[0];
X
X  for (argc--,argv++; argc > 0 && argv[0][0] == '-'; argv++, argc--) {
X	switch (argv[0][1]) {
X		case 'd': dflag= 1; break;
X	}
X  }
X  if (argc == 0)
X	f= stdin;
X  else if (argc == 1) {
X	if ((f= fopen(argv[0], "r")) == NULL) {
X		perror(argv[0]);
X		exit(1);
X	}
X  } else {
X	fprintf(stderr, "Usage: %s -d [file]\n", progname);
X	exit(1);
X  }
X
X  if (fscanf(f, "%d%d\n", &x, &y) != 2) {
X	fprintf(stderr, "%s: Ill formatted input file\n", progname);
X	exit(1);
X  }
X
X  header.ras_magic= 0x59a66a95;
X  header.ras_width= x;
X  header.ras_height= y;
X  header.ras_depth= 8;
X  header.ras_length= x * y;
X  header.ras_type= RT_STANDARD;
X  header.ras_maptype= RMT_EQUAL_RGB;
X  header.ras_maplength= 3*256;
X
X  if (fwrite(&header, sizeof(header), 1, stdout) == 0) {
X	perror(progname);
X	exit(1);
X  }
X
X  colmap[255]= 255;
X  for (i= 0; i < 252; i++)
X	colmap[i]= (i / 42) * 51;
X  if (fwrite(colmap, sizeof(colmap), 1, stdout) == 0) {
X	perror(progname);
X	exit(1);
X  }
X  for (i= 0; i < 252; i++)
X	colmap[i]= ((i % 42) / 6) * 42;
X  if (fwrite(colmap, sizeof(colmap), 1, stdout) == 0) {
X	perror(progname);
X	exit(1);
X  }
X  for (i= 0; i < 252; i++)
X	colmap[i]= (i % 6) * 51;
X  if (fwrite(colmap, sizeof(colmap), 1, stdout) == 0) {
X	perror(progname);
X	exit(1);
X  }
X  
X  for (i= 0;; i++) {
X	if (!fread(buf, 3, 1, f))
X		break;;
X	
X	if (!dflag) {
X		rnew= (buf[0]+r+25) % 51 - 25;
X		gnew= (buf[1]+g+21) % 42 - 21;
X		bnew= (buf[2]+b+25) % 51 - 25;
X	}
X	buf[0]= ((buf[0]+r+25) / 51) * 42 + ((buf[1]+g+21) / 42) * 6 + ((buf[2]+b+25) / 51);
X	if (!dflag) {
X		if ((i + 1) % y) {
X			r= rnew; g= gnew; b= bnew;
X		} else {
X			r= random() % 51 - 25;
X			g= random() % 42 - 21;
X			b= random() % 51 - 25;
X		}
X	}
X
X	if (!fwrite(buf, 1, 1, stdout)) {
X		perror(progname);
X		exit(1);
X	}
X  }
X  if (i != x * y) {
X	fprintf(stderr, "%s: Ill formatted input file\n", progname);
X	exit(1);
X  }
X  exit(0);
X}
SHAR_EOF
if test 2417 -ne "`wc -c < 'cray2sun.c'`"
then
	echo shar: error transmitting "'cray2sun.c'" '(should have been 2417 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'gray2sun.c'" '(1588 characters)'
if test -f 'gray2sun.c'
then
	echo shar: will not over-write existing file "'gray2sun.c'"
else
sed 's/^X//' << \SHAR_EOF > 'gray2sun.c'
X/*
X * This filter converts ray tracing files to Sun rasterfiles.
X *
X * Tom Vijlbrief,  Dec 1987 (tnosoes!tom@mcvax.cwi.nl or uunet!mcvax!tnosoes!tom)
X */
X
X#include	<stdio.h>
X#include	<rasterfile.h>
X
Xstruct rasterfile	header;
X
Xtypedef unsigned char	byte;
X
Xchar			*malloc();
XFILE			*fopen();
X
X#define			BUFSIZE		3
X
Xbyte	colmap[256];
Xbyte	buf[BUFSIZE];
X
X
Xmain(argc, argv)
X
Xint	argc;
Xchar	*argv[];
X{
X  FILE	*f;
X  register int	i,j;
X  int	x, y;
X
X  if (argc == 1)
X	f= stdin;
X  else if (argc == 2) {
X	if ((f= fopen(argv[1], "r")) == NULL) {
X		perror(argv[1]);
X		exit(1);
X	}
X  } else {
X	fprintf(stderr, "Usage: %s [file]\n", argv[0]);
X	exit(1);
X  }
X
X  if (fscanf(f, "%d%d\n", &x, &y) != 2) {
X	fprintf(stderr, "%s: Ill formatted input file\n", argv[0]);
X	exit(1);
X  }
X  header.ras_magic= 0x59a66a95;
X  header.ras_width= x;
X  header.ras_height= y;
X  header.ras_depth= 8;
X  header.ras_length= x * y;
X  header.ras_type= RT_STANDARD;
X  header.ras_maptype= RMT_EQUAL_RGB;
X  header.ras_maplength= 3*256;
X
X  if (fwrite(&header, sizeof(header), 1, stdout) == 0) {
X	perror(argv[0]);
X	exit(1);
X  }
X
X  for (i= 0; i < 256; i++)
X	colmap[i]= i;
X
X  if (fwrite(colmap, sizeof(colmap), 1, stdout) == 0
X    || fwrite(colmap, sizeof(colmap), 1, stdout) == 0
X    || fwrite(colmap, sizeof(colmap), 1, stdout) == 0) {
X	perror(argv[0]);
X	exit(1);
X  }
X  
X  for (i= 0;; i++) {
X	if (!fread(buf, 3, 1, f))
X		break;
X	buf[0]= (buf[0] + buf[1] + buf[2]) / 3;
X	if (!fwrite(buf, 1, 1, stdout)) {
X		perror(argv[0]);
X		exit(1);
X	}
X  }
X  if (i != x * y) {
X	fprintf(stderr, "%s: Ill formatted input file\n", argv[0]);
X	exit(1);
X  }
X}
SHAR_EOF
if test 1588 -ne "`wc -c < 'gray2sun.c'`"
then
	echo shar: error transmitting "'gray2sun.c'" '(should have been 1588 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0
===============================================================================
Tom Vijlbrief
TNO Institute for Perception
P.O. Box 23				Phone: +31 34 63 62 77
3769 DE  Soesterberg			E-mail: tnosoes!tom@mcvax.cwi.nl
The Netherlands				    or:	uunet!mcvax!tnosoes!tom
===============================================================================