toc@batcomputer.tn.cornell.edu (Timothy F. O'Connor) (09/30/89)
Well, looks like I got too many mail responses so here's the
stuff. This is part 1 of 2 and simply describes how to decode
part 2. Enjoy.
to'c
-cold-beer-cold-beer-cold-beer-cold-beer-cold-beer-cold-beer-cold-beer-cold-beer
------------------------------------------------------------------------------
"Illumination and Color in Computer Generated Imagery"
Source for code given in the Appendices
(c)Roy Hall - 1988,1989
------------------------------------------------------------------------------
This code was developed to test and demonstrate concepts
discussed in "Illumination and Color for Computer Generated
Imagery" (1989 from Springer-Verlag). While the code was
used in the generation of the diagrams and images presented
in the text, it may still contain bugs. The user is cautioned
to independently verify that the code is suitable to his/her
needs. This code is distributed on an "as is" basis with
all faults and without any implied or expressed warranties
or support from either the author, Roy Hall, or from
Springer-Verlag Publishers.
I am making this code available to the user community. You
are free to use it as you wish. In return I request two
things. First, that this README file always stays with any
copy of the source, more specifically, that proper credit is
given to the original author. Second, that any corrections,
improvements, etc. are passed back to the author for inclusion
in subsequent distribution and editions of the book.
Please note that the code was written for clarity of presentation,
not for performance. You will find that optimizations can be
easily made. Please do not report these as I will not incorporate
them into future releases. Note also that this code relects
current work I am involved in and may differ slightly from
that presented in the text.
Roy Hall
Program of Computer Graphics
120 Rand Hall
Cornell University
Ithaca, NY 14853
roy@wisdom.graphics.cornell.edu
Contents:
README
geo.h
geo.c
F.h
F.c
D.h
D.c
G.h
G.c
clr.h
clr.c
clr_clip.c
clr_sample.c
illum_mod.h
illum_mod.c
------------------------------------------------------------------------------
This mail message is a precursor to the message containing
the code described above.
Write the next message into a file called 'tmp' and
strip the mail header. The first line in the file should
then be:
xbtoa Begin
Run this file through atob (source at the end of the message):
atob <tmp >code.tar.Z
Uncompress this file:
uncompress code.tar.Z
The untar it:
tar -xvf code.tar
Source for atob
---------------------------- cut here ------------------------------
/* atob: version 4.0
* stream filter to change printable ascii from "btoa" back into 8 bit bytes
* if bad chars, or Csums do not match: exit(1) [and NO output]
*
* Paul Rutter Joe Orost
* philabs!per petsd!joe
*/
#include <stdio.h>
#define reg register
#define streq(s0, s1) strcmp(s0, s1) == 0
#define times85(x) ((((((x<<2)+x)<<2)+x)<<2)+x)
long int Ceor = 0;
long int Csum = 0;
long int Crot = 0;
long int word = 0;
long int bcount = 0;
fatal() {
fprintf(stderr, "bad format or Csum to atob\n");
exit(1);
}
#define DE(c) ((c) - '!')
decode(c)
reg c;
{
if (c == 'z') {
if (bcount != 0) {
fatal();
} else {
byteout(0);
byteout(0);
byteout(0);
byteout(0);
}
} else if ((c >= '!') && (c < ('!' + 85))) {
if (bcount == 0) {
word = DE(c);
++bcount;
} else if (bcount < 4) {
word = times85(word);
word += DE(c);
++bcount;
} else {
word = times85(word) + DE(c);
byteout((int)((word >> 24) & 255));
byteout((int)((word >> 16) & 255));
byteout((int)((word >> 8) & 255));
byteout((int)(word & 255));
word = 0;
bcount = 0;
}
} else {
fatal();
}
}
FILE *output;
byteout(c)
reg c;
{
Ceor ^= c;
Csum += c;
Csum += 1;
if ((Crot & 0x80000000)) {
Crot <<= 1;
Crot += 1;
} else {
Crot <<= 1;
}
Crot += c;
putc(c, output);
}
main(argc, argv)
char **argv;
{
reg c;
reg long int i;
char buf[100];
long int n1, n2, oeor, osum, orot;
int start = 1;
if (argc != 1) {
fprintf(stderr,"bad args to %s\n", argv[0]);
exit(2);
}
output = stdout;
for (;;) {
Ceor = 0;
Csum = 0;
Crot = 0;
word = 0;
bcount = 0;
/*search for header line*/
for (;;) {
if (fgets(buf, sizeof buf, stdin) == NULL) {
if (start)
fatal();
goto done;
}
if (streq(buf, "xbtoa Begin\n")) {
break;
}
}
start = 0;
while ((c = getchar()) != EOF) {
if (c == '\n') {
continue;
} else if (c == 'x') {
break;
} else {
decode(c);
}
}
if(scanf("btoa End N %ld %lx E %lx S %lx R %lx\n",
&n1, &n2, &oeor, &osum, &orot) != 5) {
fatal();
}
if ((n1 != n2) || (oeor != Ceor) || (osum != Csum) || (orot != Crot)) {
fatal();
}
}
done:
exit(0);
}