summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--input_patches.c48
-rw-r--r--teacup.dat279
-rw-r--r--teapot.dat340
-rw-r--r--teapot.tek1
-rw-r--r--teapot.uue168
-rw-r--r--teaspoon.dat274
-rw-r--r--tek4014-1.c119
-rw-r--r--tek4014-2.c324
-rw-r--r--tekpot.c284
10 files changed, 1843 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..72e4e8a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,6 @@
+# $Id$
+
+PROG= tekpot
+NOMAN=
+
+.include <bsd.prog.mk>
diff --git a/input_patches.c b/input_patches.c
new file mode 100644
index 0000000..e6bc401
--- /dev/null
+++ b/input_patches.c
@@ -0,0 +1,48 @@
+/*
+ * The file input.c -- Juhana Kouhia, jk87377@cs.tut.fi, Oct. 25, 1991
+ *
+ * Load_patch(filename, patches, verticies);
+ * char *filename; int *patches, *verticies;
+ * A sample program to read Bezier patches in.
+ * Returns count of patches and verticies.
+ * User defined subroutines:
+ * B_patch(ii, a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+ * int ii, a, b, ..., p;
+ * Defines one Bezier patch with index number ii,
+ * indexes to points are in a, b, c, ..., p.
+ * B_point(ii, x, y, z);
+ * int ii; double x, y, z;
+ * Defines one point with index number ii.
+ */
+
+#include <stdio.h>
+
+void Load_patch(filename, patches, verticies)
+char *filename;
+int *patches, *verticies;
+{
+ int ii;
+ float x,y,z;
+ int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;
+
+ FILE *fp;
+
+ if (!(fp = fopen(filename,"r"))) {
+ fprintf(stderr,"Load_patch: Can't open %s\n",filename);
+ exit(1);
+ }
+
+ (void)fscanf(fp,"%i\n",patches);
+ for (ii = 0; ii < *patches; ii++) {
+ (void)fscanf(fp,"%i, %i, %i, %i,",&a,&b,&c,&d);
+ (void)fscanf(fp,"%i, %i, %i, %i,",&e,&f,&g,&h);
+ (void)fscanf(fp,"%i, %i, %i, %i,",&i,&j,&k,&l);
+ (void)fscanf(fp,"%i, %i, %i, %i\n",&m,&n,&o,&p);
+ B_patch(ii, a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+ }
+ (void)fscanf(fp,"%i\n",verticies);
+ for (ii = 1; ii <= *verticies; ii++) {
+ (void)fscanf(fp,"%f, %f, %f\n",&x,&y,&z);
+ B_point(ii, (double)x,(double)y,(double)z);
+ }
+}
diff --git a/teacup.dat b/teacup.dat
new file mode 100644
index 0000000..6a65b6c
--- /dev/null
+++ b/teacup.dat
@@ -0,0 +1,279 @@
+26
+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
+4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28
+19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40
+31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13
+13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60
+16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69
+28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78
+40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57
+193,194,195,196,197,198,199,200,201,202,203,204,1,2,3,4
+196,205,206,207,200,208,209,210,204,211,212,213,4,17,18,19
+207,214,215,216,210,217,218,219,213,220,221,222,19,29,30,31
+216,223,224,193,219,225,226,197,222,227,228,201,31,41,42,1
+229,230,231,28,232,233,234,235,236,237,238,239,240,241,242,243
+28,244,245,229,235,246,247,232,239,248,249,236,243,250,251,240
+57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96
+60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105
+69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114
+78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93
+93,94,95,96,121,122,123,124,125,126,127,128,129,130,131,132
+96,103,104,105,124,133,134,135,128,136,137,138,132,139,140,141
+105,112,113,114,135,142,143,144,138,145,146,147,141,148,149,150
+114,119,120,93,144,151,152,121,147,153,154,125,150,155,156,129
+129,130,131,132,157,158,159,160,161,162,163,164,165,166,167,168
+132,139,140,141,160,169,170,171,164,172,173,174,168,175,176,177
+141,148,149,150,171,178,179,180,174,181,182,183,177,184,185,186
+150,155,156,129,180,187,188,157,183,189,190,161,186,191,192,165
+251
+0.409091,0.772727,0.0
+0.409091,0.772727,-0.229091
+0.229091,0.772727,-0.409091
+0.0,0.772727,-0.409091
+0.409091,0.886364,0.0
+0.409091,0.886364,-0.229091
+0.229091,0.886364,-0.409091
+0.0,0.886364,-0.409091
+0.454545,0.886364,0.0
+0.454545,0.886364,-0.254545
+0.254545,0.886364,-0.454545
+0.0,0.886364,-0.454545
+0.454545,0.772727,0.0
+0.454545,0.772727,-0.254545
+0.254545,0.772727,-0.454545
+0.0,0.772727,-0.454545
+-0.229091,0.772727,-0.409091
+-0.409091,0.772727,-0.229091
+-0.409091,0.772727,0.0
+-0.229091,0.886364,-0.409091
+-0.409091,0.886364,-0.229091
+-0.409091,0.886364,0.0
+-0.254545,0.886364,-0.454545
+-0.454545,0.886364,-0.254545
+-0.454545,0.886364,0.0
+-0.254545,0.772727,-0.454545
+-0.454545,0.772727,-0.254545
+-0.454545,0.772727,0.0
+-0.409091,0.772727,0.229091
+-0.229091,0.772727,0.409091
+0.0,0.772727,0.409091
+-0.409091,0.886364,0.229091
+-0.229091,0.886364,0.409091
+0.0,0.886364,0.409091
+-0.454545,0.886364,0.254545
+-0.254545,0.886364,0.454545
+0.0,0.886364,0.454545
+-0.454545,0.772727,0.254545
+-0.254545,0.772727,0.454545
+0.0,0.772727,0.454545
+0.229091,0.772727,0.409091
+0.409091,0.772727,0.229091
+0.229091,0.886364,0.409091
+0.409091,0.886364,0.229091
+0.254545,0.886364,0.454545
+0.454545,0.886364,0.254545
+0.254545,0.772727,0.454545
+0.454545,0.772727,0.254545
+0.454545,0.545455,0.0
+0.454545,0.545455,-0.254545
+0.254545,0.545455,-0.454545
+0.0,0.545455,-0.454545
+0.454545,0.272727,0.0
+0.454545,0.272727,-0.254545
+0.254545,0.272727,-0.454545
+0.0,0.272727,-0.454545
+0.318182,0.0454545,0.0
+0.318182,0.0454545,-0.178182
+0.178182,0.0454545,-0.318182
+0.0,0.0454545,-0.318182
+-0.254545,0.545455,-0.454545
+-0.454545,0.545455,-0.254545
+-0.454545,0.545455,0.0
+-0.254545,0.272727,-0.454545
+-0.454545,0.272727,-0.254545
+-0.454545,0.272727,0.0
+-0.178182,0.0454545,-0.318182
+-0.318182,0.0454545,-0.178182
+-0.318182,0.0454545,0.0
+-0.454545,0.545455,0.254545
+-0.254545,0.545455,0.454545
+0.0,0.545455,0.454545
+-0.454545,0.272727,0.254545
+-0.254545,0.272727,0.454545
+0.0,0.272727,0.454545
+-0.318182,0.0454545,0.178182
+-0.178182,0.0454545,0.318182
+0.0,0.0454545,0.318182
+0.254545,0.545455,0.454545
+0.454545,0.545455,0.254545
+0.254545,0.272727,0.454545
+0.454545,0.272727,0.254545
+0.178182,0.0454545,0.318182
+0.318182,0.0454545,0.178182
+0.545455,0.0454545,0.0
+0.545455,0.0454545,-0.305455
+0.305455,0.0454545,-0.545455
+0.0,0.0454545,-0.545455
+0.727273,0.136364,0.0
+0.727273,0.136364,-0.407273
+0.407273,0.136364,-0.727273
+0.0,0.136364,-0.727273
+0.909091,0.136364,0.0
+0.909091,0.136364,-0.509091
+0.509091,0.136364,-0.909091
+0.0,0.136364,-0.909091
+-0.305455,0.0454545,-0.545455
+-0.545455,0.0454545,-0.305455
+-0.545455,0.0454545,0.0
+-0.407273,0.136364,-0.727273
+-0.727273,0.136364,-0.407273
+-0.727273,0.136364,0.0
+-0.509091,0.136364,-0.909091
+-0.909091,0.136364,-0.509091
+-0.909091,0.136364,0.0
+-0.545455,0.0454545,0.305455
+-0.305455,0.0454545,0.545455
+0.0,0.0454545,0.545455
+-0.727273,0.136364,0.407273
+-0.407273,0.136364,0.727273
+0.0,0.136364,0.727273
+-0.909091,0.136364,0.509091
+-0.509091,0.136364,0.909091
+0.0,0.136364,0.909091
+0.305455,0.0454545,0.545455
+0.545455,0.0454545,0.305455
+0.407273,0.136364,0.727273
+0.727273,0.136364,0.407273
+0.509091,0.136364,0.909091
+0.909091,0.136364,0.509091
+1.0,0.136364,0.0
+1.0,0.136364,-0.56
+0.56,0.136364,-1.0
+0.0,0.136364,-1.0
+1.0,0.0909091,0.0
+1.0,0.0909091,-0.56
+0.56,0.0909091,-1.0
+0.0,0.0909091,-1.0
+0.909091,0.0909091,0.0
+0.909091,0.0909091,-0.509091
+0.509091,0.0909091,-0.909091
+0.0,0.0909091,-0.909091
+-0.56,0.136364,-1.0
+-1.0,0.136364,-0.56
+-1.0,0.136364,0.0
+-0.56,0.0909091,-1.0
+-1.0,0.0909091,-0.56
+-1.0,0.0909091,0.0
+-0.509091,0.0909091,-0.909091
+-0.909091,0.0909091,-0.509091
+-0.909091,0.0909091,0.0
+-1.0,0.136364,0.56
+-0.56,0.136364,1.0
+0.0,0.136364,1.0
+-1.0,0.0909091,0.56
+-0.56,0.0909091,1.0
+0.0,0.0909091,1.0
+-0.909091,0.0909091,0.509091
+-0.509091,0.0909091,0.909091
+0.0,0.0909091,0.909091
+0.56,0.136364,1.0
+1.0,0.136364,0.56
+0.56,0.0909091,1.0
+1.0,0.0909091,0.56
+0.509091,0.0909091,0.909091
+0.909091,0.0909091,0.509091
+0.727273,0.0909091,0.0
+0.727273,0.0909091,-0.407273
+0.407273,0.0909091,-0.727273
+0.0,0.0909091,-0.727273
+0.545455,0.0,0.0
+0.545455,0.0,-0.305455
+0.305455,0.0,-0.545455
+0.0,0.0,-0.545455
+0.318182,0.0,0.0
+0.318182,0.0,-0.178182
+0.178182,0.0,-0.318182
+0.0,0.0,-0.318182
+-0.407273,0.0909091,-0.727273
+-0.727273,0.0909091,-0.407273
+-0.727273,0.0909091,0.0
+-0.305455,0.0,-0.545455
+-0.545455,0.0,-0.305455
+-0.545455,0.0,0.0
+-0.178182,0.0,-0.318182
+-0.318182,0.0,-0.178182
+-0.318182,0.0,0.0
+-0.727273,0.0909091,0.407273
+-0.407273,0.0909091,0.727273
+0.0,0.0909091,0.727273
+-0.545455,0.0,0.305455
+-0.305455,0.0,0.545455
+0.0,0.0,0.545455
+-0.318182,0.0,0.178182
+-0.178182,0.0,0.318182
+0.0,0.0,0.318182
+0.407273,0.0909091,0.727273
+0.727273,0.0909091,0.407273
+0.305455,0.0,0.545455
+0.545455,0.0,0.305455
+0.178182,0.0,0.318182
+0.318182,0.0,0.178182
+0.272727,0.0454545,0.0
+0.272727,0.0454545,-0.152727
+0.152727,0.0454545,-0.272727
+0.0,0.0454545,-0.272727
+0.409091,0.272727,0.0
+0.409091,0.272727,-0.229091
+0.229091,0.272727,-0.409091
+0.0,0.272727,-0.409091
+0.409091,0.545455,0.0
+0.409091,0.545455,-0.229091
+0.229091,0.545455,-0.409091
+0.0,0.545455,-0.409091
+-0.152727,0.0454545,-0.272727
+-0.272727,0.0454545,-0.152727
+-0.272727,0.0454545,0.0
+-0.229091,0.272727,-0.409091
+-0.409091,0.272727,-0.229091
+-0.409091,0.272727,0.0
+-0.229091,0.545455,-0.409091
+-0.409091,0.545455,-0.229091
+-0.409091,0.545455,0.0
+-0.272727,0.0454545,0.152727
+-0.152727,0.0454545,0.272727
+0.0,0.0454545,0.272727
+-0.409091,0.272727,0.229091
+-0.229091,0.272727,0.409091
+0.0,0.272727,0.409091
+-0.409091,0.545455,0.229091
+-0.229091,0.545455,0.409091
+0.0,0.545455,0.409091
+0.152727,0.0454545,0.272727
+0.272727,0.0454545,0.152727
+0.229091,0.272727,0.409091
+0.409091,0.272727,0.229091
+0.229091,0.545455,0.409091
+0.409091,0.545455,0.229091
+-0.454545,0.704545,0.0
+-0.454545,0.704545,-0.0454545
+-0.454545,0.772727,-0.0454545
+-0.772727,0.863636,0.0
+-0.772727,0.863636,-0.0454545
+-0.818182,0.954545,-0.0454545
+-0.818182,0.954545,0.0
+-0.772727,0.522727,0.0
+-0.772727,0.522727,-0.0454545
+-0.909091,0.477273,-0.0454545
+-0.909091,0.477273,0.0
+-0.409091,0.363636,0.0
+-0.409091,0.363636,-0.0454545
+-0.409091,0.295455,-0.0454545
+-0.409091,0.295455,0.0
+-0.454545,0.772727,0.0454545
+-0.454545,0.704545,0.0454545
+-0.818182,0.954545,0.0454545
+-0.772727,0.863636,0.0454545
+-0.909091,0.477273,0.0454545
+-0.772727,0.522727,0.0454545
+-0.409091,0.295455,0.0454545
+-0.409091,0.363636,0.0454545
diff --git a/teapot.dat b/teapot.dat
new file mode 100644
index 0000000..a064523
--- /dev/null
+++ b/teapot.dat
@@ -0,0 +1,340 @@
+32
+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
+4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28
+19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40
+31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13
+13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60
+16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69
+28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78
+40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57
+57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96
+60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105
+69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114
+78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93
+121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136
+124,137,138,121,128,139,140,125,132,141,142,129,136,143,144,133
+133,134,135,136,145,146,147,148,149,150,151,152,69,153,154,155
+136,143,144,133,148,156,157,145,152,158,159,149,155,160,161,69
+162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177
+165,178,179,162,169,180,181,166,173,182,183,170,177,184,185,174
+174,175,176,177,186,187,188,189,190,191,192,193,194,195,196,197
+177,184,185,174,189,198,199,186,193,200,201,190,197,202,203,194
+204,204,204,204,207,208,209,210,211,211,211,211,212,213,214,215
+204,204,204,204,210,217,218,219,211,211,211,211,215,220,221,222
+204,204,204,204,219,224,225,226,211,211,211,211,222,227,228,229
+204,204,204,204,226,230,231,207,211,211,211,211,229,232,233,212
+212,213,214,215,234,235,236,237,238,239,240,241,242,243,244,245
+215,220,221,222,237,246,247,248,241,249,250,251,245,252,253,254
+222,227,228,229,248,255,256,257,251,258,259,260,254,261,262,263
+229,232,233,212,257,264,265,234,260,266,267,238,263,268,269,242
+270,270,270,270,279,280,281,282,275,276,277,278,271,272,273,274
+270,270,270,270,282,289,290,291,278,286,287,288,274,283,284,285
+270,270,270,270,291,298,299,300,288,295,296,297,285,292,293,294
+270,270,270,270,300,305,306,279,297,303,304,275,294,301,302,271
+306
+1.4,0.0,2.4
+1.4,-0.784,2.4
+0.784,-1.4,2.4
+0.0,-1.4,2.4
+1.3375,0.0,2.53125
+1.3375,-0.749,2.53125
+0.749,-1.3375,2.53125
+0.0,-1.3375,2.53125
+1.4375,0.0,2.53125
+1.4375,-0.805,2.53125
+0.805,-1.4375,2.53125
+0.0,-1.4375,2.53125
+1.5,0.0,2.4
+1.5,-0.84,2.4
+0.84,-1.5,2.4
+0.0,-1.5,2.4
+-0.784,-1.4,2.4
+-1.4,-0.784,2.4
+-1.4,0.0,2.4
+-0.749,-1.3375,2.53125
+-1.3375,-0.749,2.53125
+-1.3375,0.0,2.53125
+-0.805,-1.4375,2.53125
+-1.4375,-0.805,2.53125
+-1.4375,0.0,2.53125
+-0.84,-1.5,2.4
+-1.5,-0.84,2.4
+-1.5,0.0,2.4
+-1.4,0.784,2.4
+-0.784,1.4,2.4
+0.0,1.4,2.4
+-1.3375,0.749,2.53125
+-0.749,1.3375,2.53125
+0.0,1.3375,2.53125
+-1.4375,0.805,2.53125
+-0.805,1.4375,2.53125
+0.0,1.4375,2.53125
+-1.5,0.84,2.4
+-0.84,1.5,2.4
+0.0,1.5,2.4
+0.784,1.4,2.4
+1.4,0.784,2.4
+0.749,1.3375,2.53125
+1.3375,0.749,2.53125
+0.805,1.4375,2.53125
+1.4375,0.805,2.53125
+0.84,1.5,2.4
+1.5,0.84,2.4
+1.75,0.0,1.875
+1.75,-0.98,1.875
+0.98,-1.75,1.875
+0.0,-1.75,1.875
+2.0,0.0,1.35
+2.0,-1.12,1.35
+1.12,-2.0,1.35
+0.0,-2.0,1.35
+2.0,0.0,0.9
+2.0,-1.12,0.9
+1.12,-2.0,0.9
+0.0,-2.0,0.9
+-0.98,-1.75,1.875
+-1.75,-0.98,1.875
+-1.75,0.0,1.875
+-1.12,-2.0,1.35
+-2.0,-1.12,1.35
+-2.0,0.0,1.35
+-1.12,-2.0,0.9
+-2.0,-1.12,0.9
+-2.0,0.0,0.9
+-1.75,0.98,1.875
+-0.98,1.75,1.875
+0.0,1.75,1.875
+-2.0,1.12,1.35
+-1.12,2.0,1.35
+0.0,2.0,1.35
+-2.0,1.12,0.9
+-1.12,2.0,0.9
+0.0,2.0,0.9
+0.98,1.75,1.875
+1.75,0.98,1.875
+1.12,2.0,1.35
+2.0,1.12,1.35
+1.12,2.0,0.9
+2.0,1.12,0.9
+2.0,0.0,0.45
+2.0,-1.12,0.45
+1.12,-2.0,0.45
+0.0,-2.0,0.45
+1.5,0.0,0.225
+1.5,-0.84,0.225
+0.84,-1.5,0.225
+0.0,-1.5,0.225
+1.5,0.0,0.15
+1.5,-0.84,0.15
+0.84,-1.5,0.15
+0.0,-1.5,0.15
+-1.12,-2.0,0.45
+-2.0,-1.12,0.45
+-2.0,0.0,0.45
+-0.84,-1.5,0.225
+-1.5,-0.84,0.225
+-1.5,0.0,0.225
+-0.84,-1.5,0.15
+-1.5,-0.84,0.15
+-1.5,0.0,0.15
+-2.0,1.12,0.45
+-1.12,2.0,0.45
+0.0,2.0,0.45
+-1.5,0.84,0.225
+-0.84,1.5,0.225
+0.0,1.5,0.225
+-1.5,0.84,0.15
+-0.84,1.5,0.15
+0.0,1.5,0.15
+1.12,2.0,0.45
+2.0,1.12,0.45
+0.84,1.5,0.225
+1.5,0.84,0.225
+0.84,1.5,0.15
+1.5,0.84,0.15
+-1.6,0.0,2.025
+-1.6,-0.3,2.025
+-1.5,-0.3,2.25
+-1.5,0.0,2.25
+-2.3,0.0,2.025
+-2.3,-0.3,2.025
+-2.5,-0.3,2.25
+-2.5,0.0,2.25
+-2.7,0.0,2.025
+-2.7,-0.3,2.025
+-3.0,-0.3,2.25
+-3.0,0.0,2.25
+-2.7,0.0,1.8
+-2.7,-0.3,1.8
+-3.0,-0.3,1.8
+-3.0,0.0,1.8
+-1.5,0.3,2.25
+-1.6,0.3,2.025
+-2.5,0.3,2.25
+-2.3,0.3,2.025
+-3.0,0.3,2.25
+-2.7,0.3,2.025
+-3.0,0.3,1.8
+-2.7,0.3,1.8
+-2.7,0.0,1.575
+-2.7,-0.3,1.575
+-3.0,-0.3,1.35
+-3.0,0.0,1.35
+-2.5,0.0,1.125
+-2.5,-0.3,1.125
+-2.65,-0.3,0.9375
+-2.65,0.0,0.9375
+-2.0,-0.3,0.9
+-1.9,-0.3,0.6
+-1.9,0.0,0.6
+-3.0,0.3,1.35
+-2.7,0.3,1.575
+-2.65,0.3,0.9375
+-2.5,0.3,1.125
+-1.9,0.3,0.6
+-2.0,0.3,0.9
+1.7,0.0,1.425
+1.7,-0.66,1.425
+1.7,-0.66,0.6
+1.7,0.0,0.6
+2.6,0.0,1.425
+2.6,-0.66,1.425
+3.1,-0.66,0.825
+3.1,0.0,0.825
+2.3,0.0,2.1
+2.3,-0.25,2.1
+2.4,-0.25,2.025
+2.4,0.0,2.025
+2.7,0.0,2.4
+2.7,-0.25,2.4
+3.3,-0.25,2.4
+3.3,0.0,2.4
+1.7,0.66,0.6
+1.7,0.66,1.425
+3.1,0.66,0.825
+2.6,0.66,1.425
+2.4,0.25,2.025
+2.3,0.25,2.1
+3.3,0.25,2.4
+2.7,0.25,2.4
+2.8,0.0,2.475
+2.8,-0.25,2.475
+3.525,-0.25,2.49375
+3.525,0.0,2.49375
+2.9,0.0,2.475
+2.9,-0.15,2.475
+3.45,-0.15,2.5125
+3.45,0.0,2.5125
+2.8,0.0,2.4
+2.8,-0.15,2.4
+3.2,-0.15,2.4
+3.2,0.0,2.4
+3.525,0.25,2.49375
+2.8,0.25,2.475
+3.45,0.15,2.5125
+2.9,0.15,2.475
+3.2,0.15,2.4
+2.8,0.15,2.4
+0.0,0.0,3.15
+0.0,-0.002,3.15
+0.002,0.0,3.15
+0.8,0.0,3.15
+0.8,-0.45,3.15
+0.45,-0.8,3.15
+0.0,-0.8,3.15
+0.0,0.0,2.85
+0.2,0.0,2.7
+0.2,-0.112,2.7
+0.112,-0.2,2.7
+0.0,-0.2,2.7
+-0.002,0.0,3.15
+-0.45,-0.8,3.15
+-0.8,-0.45,3.15
+-0.8,0.0,3.15
+-0.112,-0.2,2.7
+-0.2,-0.112,2.7
+-0.2,0.0,2.7
+0.0,0.002,3.15
+-0.8,0.45,3.15
+-0.45,0.8,3.15
+0.0,0.8,3.15
+-0.2,0.112,2.7
+-0.112,0.2,2.7
+0.0,0.2,2.7
+0.45,0.8,3.15
+0.8,0.45,3.15
+0.112,0.2,2.7
+0.2,0.112,2.7
+0.4,0.0,2.55
+0.4,-0.224,2.55
+0.224,-0.4,2.55
+0.0,-0.4,2.55
+1.3,0.0,2.55
+1.3,-0.728,2.55
+0.728,-1.3,2.55
+0.0,-1.3,2.55
+1.3,0.0,2.4
+1.3,-0.728,2.4
+0.728,-1.3,2.4
+0.0,-1.3,2.4
+-0.224,-0.4,2.55
+-0.4,-0.224,2.55
+-0.4,0.0,2.55
+-0.728,-1.3,2.55
+-1.3,-0.728,2.55
+-1.3,0.0,2.55
+-0.728,-1.3,2.4
+-1.3,-0.728,2.4
+-1.3,0.0,2.4
+-0.4,0.224,2.55
+-0.224,0.4,2.55
+0.0,0.4,2.55
+-1.3,0.728,2.55
+-0.728,1.3,2.55
+0.0,1.3,2.55
+-1.3,0.728,2.4
+-0.728,1.3,2.4
+0.0,1.3,2.4
+0.224,0.4,2.55
+0.4,0.224,2.55
+0.728,1.3,2.55
+1.3,0.728,2.55
+0.728,1.3,2.4
+1.3,0.728,2.4
+0.0,0.0,0.0
+1.5,0.0,0.15
+1.5,0.84,0.15
+0.84,1.5,0.15
+0.0,1.5,0.15
+1.5,0.0,0.075
+1.5,0.84,0.075
+0.84,1.5,0.075
+0.0,1.5,0.075
+1.425,0.0,0.0
+1.425,0.798,0.0
+0.798,1.425,0.0
+0.0,1.425,0.0
+-0.84,1.5,0.15
+-1.5,0.84,0.15
+-1.5,0.0,0.15
+-0.84,1.5,0.075
+-1.5,0.84,0.075
+-1.5,0.0,0.075
+-0.798,1.425,0.0
+-1.425,0.798,0.0
+-1.425,0.0,0.0
+-1.5,-0.84,0.15
+-0.84,-1.5,0.15
+0.0,-1.5,0.15
+-1.5,-0.84,0.075
+-0.84,-1.5,0.075
+0.0,-1.5,0.075
+-1.425,-0.798,0.0
+-0.798,-1.425,0.0
+0.0,-1.425,0.0
+0.84,-1.5,0.15
+1.5,-0.84,0.15
+0.84,-1.5,0.075
+1.5,-0.84,0.075
+0.798,-1.425,0.0
+1.425,-0.798,0.0
diff --git a/teapot.tek b/teapot.tek
new file mode 100644
index 0000000..2908882
--- /dev/null
+++ b/teapot.tek
@@ -0,0 +1 @@
+[?38h [?38h0kc5N/d|NkuKboHmhDdc4_.f~Y`zTevNbsHipCjn3^`mZlVkkRdkPkkM`lLnlJkmIinIhoIlpImqIorImsJotJiuKkvKawLnwLdxMixMayMfyMjyMnyMoyMczMMgzMMMhzNNizNjzNhzOizOkzOizPjzPhzQfzQczQmyRjyRgyR`yShxSexSmwSewSmvSivS`vShuS`uSmtSftSctSlsTjsTesUlrVhrWdrXarYjqZbq[gp\ko]in^gm^cl^ej^dh]f[mcXbaT-f~O{IbxBlt2ZiqPjnEnk1YjiLmg0^jfOdl@nl/QomCjo.VmqJet-_`wUzLa}D.b`,]obWieSchOijMlKenJooIgqIdrJgsJctKotLguMluO`vPdvQkvQnvRawSgwShwTmwTaxTexTixTlxT`yTgySfySiySmyS`zSczRRRbzRRnyRRjyReyRayRlxRkxQfxQaxQlwQnwPiwPgwOawOovNivNgvMevM`vMkuLfuLntLjtLosLgsLirMnqMlpNnoNonNmmOjlOkOijOfiNkhMmgLfgJdgHEbhAai+]jjXmlSkoMorGbwAn{*[/baUagPjmKktGn{E0icQljRmqTfxWd~\1`d+AbiFimLlqRfuWgx\oz,Am|Fh~JnM2m`PjaRmaTfbUVhbWWWkbVjbVhbVjbUlbUnbT`cTfcSicS`dSgdRkdRbeRfeRneRbfRffRjfRnfRagRegRdgRkgQjgQmgQogPngPlgPngOahOchNahNdhNghMfhMihMhhMMMlhMMhhMMdhM`hMlgMkgLbgLhfLneKgeJhdJlcI`cHdbGoaEbaDn`Cj`Bk`Aj`AbaAlaBmbCedE`fHchKfjPbmVoo]mr-FkuOxZg{.Fk}Sg/A3j`P2hz0@fzNay\iw1IfuUor2@gpJkmSoj[bh3BleHjcLhaPc`R1n~T}U`}Vl|Vk|Ul|Ua}Te}S`~Rh~QdP2``Ol`NiaMgbLacLhcLcdKjdKbeKjeKoeK`fLdfLifLnfLcgLggLdgMhgMmgMahMehMihMjhMnhMbiMgiMkiMhiNmiNniN`jOajOcjOmiPoiPiiQjiQdiRnhRkhRdhSahSmgSegSagSlfSofRifRkfQjfQhfQkfPjfPPkfPifQRbfSjeUodWcZib^n`4B1i~Gb|LmxRauXip^nk5DefJg`O0nyTlrXfkZic[/n{ZitXjmTlfPk`J.`{Emu4_bqYhlTkhNaeJmaF-`Cf|@ny3^iw]fu\bs\cq\bo]nl^oj_ih4AkfBedDoaE,iGc}HhzJaxKiuLmrMdpNkmNakOghOmePccPi`Q+c~Qi{RcyRivS`tToqTfoUmlVhjW`hXoeXgcYn`Z*e~[l{\ky\aw]kt]`r^io^bm^jj^bh^ne^ic^da^)`^c}]oz]cy]`w^eu^ks^ar_ep5@mnAamBjkCliEahFbfGocHjaI(cIg|IyHavGfrDkn@fj4[`fUhaM'b}Cix3XatKcp2\glLai1[jfHce0T-`f@jf/PogAji.SnkFbn-ZnpOdsFju,]iwVdyPhzK`{Gd{Dc{Aez@y+_kw^ju^fs^op^`n_fk_gh_`e,@b@,@c|+_ay_gv^hs^mp]an\ik[aiZmfYedX`bW+lVd}Ua{TmxSfvRctQiqQboPhlPbjOhgObeNgbM*mMg}LlzLexKnuJjsIgqHcoGolFljFhEfDaeCbcBgaA)eAh}Ak{@oy@lwAiuAgsAbqBinC`lDkiDagEddFmaF(aFo|EkzDixC`wAmu*^fuZduVnuPfwJoyCa})\)baTefLlDfs(\e{U*adOemJawG0kc*DfkElrHjyK1a`PneUak[ho+AcsFavLxQhyVgzYhz]cz_by,AlwCbvCgtCbrCooBgmAnj@hh+_bf]lc\jaZ0dYf}Wi{VhyUlwT`vSitRnrQdqQmoPdnPjlO`kOjiNlgNbfMddMibLn`K/o~J`}Ja{IeyHjwGuFosE`rEepDjnCllCfkBmiBdhBofAceAkcA`bBh`B.aBf}Bj{BnyBwBuBhsBfqA`oAml@dj*_`h^oe\ic[daZ-kXo}Wk|Vj{VozVnzWa{Yc|[k}_+D.abKeSdh]mk,HhoUbs-CjvShy.Ec|Wj}/K3l`0@j`O2e^i}1La{Yfx2EauPlqZfn3BckIkgOgdTcaX1~[`{^kx_cv4@msAiqAmoAlmAcl@jj@`i@dg@oe3_dd4@mb@fa@0lAg~Aj|BnzCbyDfwEjuFnsGcrHpIgnJflKjjLmhMlfNbeNecOkaO/mPc~Pi|QlzRbyRdwSkuSnsTarUdpVhnWllXojXhYfZce[bc\aa].o~]m|^oz^`y_w_gu^fs^hq^ap]jn\cm[hk[ejZohYjgYffY`eZhc[bb\f`^-~5Aa|EgyI`vOirUdn\ji6CedK,~Sfw[ap7CngJ+cPjuUokXhaZ*cwXgmUocP)c{JnrCgk6[kdS(j~KcyCet5\bpUjlOhiJnfEkdAhb4_o`\'e[m}Zk|Yg{Y`zZmxZhw[fv[au\ks\er]np]fo]nm]dl]nj\gi[lg[kfYbeXadWobUlaTn`R``Q&eOk~Ma~Lk}Jb}Il|Hh|Gg|Eb|DCn{Bo{Ak{@d{@{3_a{^b{]oz\kz[dz[ezZczYlyYnyXhyXkyWjyWiyWWjyWhyXnyXmyYlyZoyZ[\gy]by^dx_jw_ev_cu^es]iq[foXolTcjOggIbdB`a2Z%b~P{Efx1YnuLat0^nrO'hd@ae/Kjf.WciDal-SioCcs,TovGfz+\l}S(h`KbcDae*_jf[kgXahWmgVegVffVaeWjcXkaY'h[j}\g{]`y_lv+@ot@nrA`qBfoBnmBglBckBjBiBghBkgBlfCefCbfCheDfeDmdEidFedGncHkcIdcKnbLhbNbbOhaQfaRl`Tj`Uc`V&mXeYbZj~[f~\b~]n}^i}_e},@`}Ao|Ag|Bc|Cj{Db{EjzFbzGfyHjxImwJvKcvKeuLtLhsLbsKirJgrHjrForCjs@nt+\kvWoxRm{MeG'cAah*[imUhsPazK(caGihE+ha(FmkGjuJaO,jgUgo\fv)Dk|L-aTne\`i*DgkJllQimVkmZbm^nk+AfjCehE`fFncFgaF,n~F`|FiyEcwDltDjrChpCknBlBojBeiCogCffDndEjcFcbGm`I+fJa~Lk|Ma{OhyQbxRhvTntUgsVhqXmoYbnZjl[oj\bi]jg^bf_id,@acAhaBg`B*bCm}Dl|Ek{EjzFiyGkxGiwHnvHouHtHsHbsHarHcqGdpGeoFinEanDemCbmBolAllAcm@hmAfnAkoBcqDorGntKfwPnyVo|]l-F+kbOjeZfh.FkjSgl/AjmP.`~0@j}Ta|1Hhy[fv2Ljr\hn3KcjWhe4CcaL-k|Tex[t5@pDolFjiHfIncIeaI,m~H|G`{FcyDiwCluBgt@or4_dq_mo^gn]il]lj]`i]dg]he]c]la]+]o}\n{\my\ow[av[btZrYfpXinWllVckTiiSchQifPceNmcMgbKaaJ*lIk~Gf}Fe|Ea{DzCyBxAbw@gv3_u^ht^ls]es\mr[erZarYmqXiqWVjqUkqTlqToqSbrScrSbrTnqUhqWaqY`p\nn_fm4C`kHhhMgeRnaX)f}^kx5DbsJ`mPjfT(iXcxZ.a{)XmxXbwX`vYnuYouY`vZhvZgwYdxYayX`zWmzUj{Sd|Qb}Nj}Kn}Hd~Ej~Ak~(]l~ZVo~Qk~MIf~EAb~']Yn}Uo}Ql}Nn}Jh}Gk}Ci}@}&]l}Zm}WTn}Qo}Nm}Lo}Im}Go}Dn}Bm}@h}%^k}[g}Yf}Wb}Un|So|Qh|Pd|Nb|Lo{Ji{Ic{GmzFdzEczCkyBcyAgx@lw@bw$_cv^fu^dt^gs]cr]np]fo]nm]fl]kj]ci]gg]je]c]ab]g`\-i~\b}[n{ZzYmyXcyVlxUmxSayQjyOnzM`|Lb~J.c`I/gs*DnuDewDgxClxCBgx@mw)_bw]ev[guXitVsSlrParLjqHcqDkp@fp(\apXloTnoOmoKloGC`p'_[dpWepSkpOipLhpIopEBp&_\lpZmpWkpThpRjpOhpMfpJepHgpEbpC`pAcp%^no\ZioXVeoTaoRnnPknNdnMbnKhmJbmHelGlkF`kEdjDiCehBfgAgf@`e@nc$_hb_ea^c`].m~]d}]b|\lz\ky[ex[dw[gvZuZtZksZlr[er[kq[bq\np]fp^lo%@foAlnCcnDgmFflHbkJhiLjgMfeNobNb`N-n}M`|LizJfyHxFgwDlvCevAou$_fu^nt]ft\os[es[krZoqZbqZpZcoZnZll[ek[bj[hh\ag\je\oc\ab]j`],o~]a}^f{^dy_iw_ou_at%@gr@ipAlnBcmBfkCiiDmgEafFedGmbHbaI+gJh}La|MgzNixPcwQeuSosTerVhpXcoYim[dl]lj_ki&@chBnfDkeFgdHdcKabMcaO*lRo~Tj}Wi|Zd{]z'@`yCmwFivIfuLosOgrRlpV`oYdm\kk^ni(A`hDafFfdHibJl`L)fMc~N`}Pk|Pj|Qd}Rn~R.mb$IgeIjgJdiLojMnkOjlQmlSllUglVmkXnjYoiZfh[mf\ge\ic]na]b`]-c~]g|]jz]nx]fw]iu]at]ir]aq]no]fn]`m^mk^kj^ei_ch_bg%@meAddB`cClaDd`E,`Fh}Ga|HezInxJgwKhuMmsNfrOhpQmnRcmSikUoiVahXkfYnd[dc]oa^c`&@+j~Bb}Dk{FczHhxKbwMhuPbtRhrUcqWfoZnm]el'@mjCeiFahIifLeeOadR`cUcbWeaZk`\``_*l(AoB+b`Dg`Eo`FjaGdbHecHadHeHkeGneGleGbeFmcF,ez6TjsTlTbeT+o}TlvUfpUjjVfeWl`Y*c}Zdz]nw_fv7BcuEjtIetMjtQduVbvZw_ax8DfyIjzNn{Sb}Xj~]n9B+aaGkbKlcPdeTlfXfh[oi^jk:AimDjoFiqH`tJivKayLc|L`M,bMkeLbiLklKgpJctIbxHm{GoE-mcDlgCjkAho@fs9^aw]iz\`~[.iaZndY`hYbkXanXnpXgsXmuYgxYozZ`}\a]/`a_cc:@eBmfEjhGejJmkMemPnnS`pWfqZir^s;BjtFguJdvObwSiwXdx]by<AmyFkzJh{Ol|Sb~VjY0fa[*ba6TjgTnnTbvTk}T+idUakVbqWhvYe{[d^,lb7AoeDchHniMakRblWll]fm8BimHlmNomSanYcn^dn9DknHboMooQkpUjqYkr\ns_du:B`wDnxEozF|GbH-gaHocHffHmhHjkGgnFcqEosDkvCfyBe|A`@.oa9^kd]gg\cj[olZdoZnqYdtYovXbyXk{Xl}YnY/bbZd[cf\mg^li:@hkBemDboFmpIhrL`tOluRewUayXjz[f|^o};AfD0l`GfbIncKdeMifNlgO`iObjNnjMhkLokIalGDok@ek:]gjYbiVkgSoeQicQdaR/kSb~Vl|Zo{]b{;AizEdzIfzLgzOjzRlzUe{Wi{Yc|Zh|\`}]k}]a~^k~^a_j_0``<@e`@n`@`aAfaAlaBbbBdbCkbCnbDacEdcFgcFjcGncHadIgdIjdJldKceK`eLfeLkeLleMafMbfMffMjfMMnfMMagMM`gMdgMggLfgLLegLdgLggKfgKagK`gKbgJmfJjfIhfIefHbfGneFfeEbeDidCedBlcAgc;_ob^gb]oa\ga[m`[g`Z/oZd[b[m~\j~]d~_g~<@d~Ci~EbGkI0d`LgaMebOhc\me[jgYciVjjSkkOelLnlHemEimBom;_cn]`n\cnZdnZgnYYinZknZon[co\go]ho_mo<@bpAfpBjpCbqDfqEiqFoqFarGgrGhrHmrHasHesHHisHHHHlsHHhsHHHHisHesHHbsHHHnrHHjrHfrHerH`rHoqGjqGdqGcqFmpFkpEepEbpDhoDfoConBinBcnAmmAgm@am@kl;_el_`l_nk^hk^ek]ck\lj\ij[hjZdjYfjW`jVajTmiRliPkiMeiKnhHdhFngCagAbf:_md^2ht0@@@@it@jt@htAktABdtDftEatGmsIfsK`sNkrPbrSfqVjpYno\n_mm1BhlEkkGdjJmhLhgNcfOldQdcRoaRd`S1aSh}Sf|Rc{QoyPkxOewNgvLduKhtIlsG`sEgrBoq@fq0^np\ipZepXapVbpTooRloQnoOloNooLnoKJIooHmoHooGioGhoGdoG`oGlnGenGbnGhmHbmHhlInkI`kJgjJiiKlhLogLmfM`fNbeN`dOacOoaO`O0lPcOb~Oa}Og|Nd{NhzM`zLgyJmxIgxG`xFlwDhwB2t@@@@@dt@`t@os/_gs_jr_mq_cq^ap^nn]km\gl[ojZfiYlgXefVndTfcRnaPi`N1dLc~Ia}Gc|Da{Bdz@ny.]ey[mxYixWfxUcxSbxRaxQPcxOexOhxOixOnxOlxPcyP`yRaySbyTayV`yXoxYkx[gx]`x/@lwBewDmvFevHmuJeuLitNlsPbsQdrSiqTnpUooVboWnX`mYblY`kZjZaiZhZlfZoeYmdYocXmbXbbWcaVd`V0hU`Th~S`~Ro}Pk}Oj}Nn}Ma~Le~Km~JjI1f`H`aHbbGacG2ht0@@@@kt/_jt_ht_mt^]lt\buZguXkuVnuT`vRivOfwLnwIjxFfyCbz@c{.]`|[b}X`~VcS3d`ReaPdbOcNadMldMkeL`fMjfMmfNagObgPofQjfSafUdeWdYc[ab]m`_2f/Aj}Co{EczGxIbvKatMlqOnoPhmRikSjiTfgUeVicWkaW1mXc~Xd|YlzYdyY`xYovXjuXhtXjsWhrWnqVlpVepUkoT`oTinScnRlmRjmQdmQcmPmlPPllPamPbmPgmPimQlmRdnShnTaoUgoVmoX`pZdp\^2ht0@@@@lt@@`u@iu@av@jv@gw@exAgyAfzBi{Cm|De~EnF3daHobIbdKjeMnfOchQ`iTajVojXek[ok]`l1@flBblDokFgkHjjJliLnhMkgNcfOidPccPdaQ2kPj}Ph{PyOwNkuLfsKgqIdoHemFkDiBhg@le0^cd[gbYo`W1gUc~So|Qh{PjzNhyMkxKnwJawIfvHjuG`uGjtF`tFhsFcsEkrEdrFmqFkqFaqGopGfpHapIhoJdoKlnLdnMlmNemOmlPflQjkRckSgjTkiUnhVgW`gXbfXceX`dYccXbbX`aXb`W0gVi~Vn}U`}Uf|Ti{TlzTgzShyTlxTfxThwUnvUavVduWktWosXrYcrZq[dp]eo^jn_km1@hlBmkCojDajFciGbhIegKdfMeOhdQicSjbUkaWm`Z/o\i~_h}2Bj|De{GgzIayLowNevQbuSksUgrWopYfo[lm]fl^oj_ki3@chAjfBdeCbdClbDiaDk`D.hEi~En}E`}Ff|Fh{Gc{GjzHazIhyJ`yKdxLowLnvM`vNmtNisNcrMfpLknJelH`jEkg@nd2[abU-dNk|Eaz1\kwQjuFat0ZbsM0hw@w/^lw\`xZexXkxVmxU`yTcyRQ`yQmxPjxO`xOjwN`wNgvMfuMhtMksLirLdqLfpK`oKbnJllJikIkjHdiH`hGagFmeEidDcCebBaaA/l@k~.^f}]l{\kzZeyYnwWdvVauTisRarPipNeoLlmJklGekEoiBmh@jg-]hf[ieXkdUhcSnbP`bNjaKm`Id`G.lE`Cj~A`~@h},_`}^e|]j{\mz\az\dy\ex\w\fv\cu\t\bs\`r\fq[ipZ`pYloWnoTfpQ`qNirJgtEhvAky+[b}V/aaQieLnjGjpCv@m|*^1`d/GaeGbfG`gHngHihIciIniJ`jKjjKkjKljLijLhjLdjLbjKliKfiJciIhhIahHmgGegFmfEifDdfCcfAoe@ie._he^ke\ie[keYieXneVcfTdfShfQlfOggLngJehHciEiiCgj@ak-^bl[llYmmVonSmoQcqNbrLesJtHiuFnvD`xCbyAez@{,_|^b}]`~]j~\d\o[2b`[e`[g`Zf`Z``Z1kYdYj~Xc~Wd}Wh|V`|Ue{TmzSgzRdzRczQdzRnzRj{Si|Uo}Wi[2ea_jc-DoeJdhRnjZdm.DioNjqYcs/EbtR1hp0@dpBD`pFkoGeoIonJhnLanMimN`mOolOflP`lQjkQdkRakRnjRhjSejScjS`jTniTliUniUliVoiVmiWliX`jYgjYkjZoj[ck\kk]cl^ll1@emAbnB`oDmoEopFnqH`sJctKguMfvOkwQoxSlyVa{Xc|Ze}]g~_a2BlE2j`GeaJlaMfbOhbRnbTobV`cYlb[ob\jb^gb_`b3AlaBkaBeaCbaCo`Ck`Cg`Cb`Ca`C1mCiCjCgCn~Dj~El}G`}Ia|KmzNcyQwUitZlq_hn4DmjIjfNkaS0i|Xnv\p_fj5A(``0@@@a`@b`@``Ac`Ad`Cg`Dh`Go`I`aMjaPcbTmbYlc^md1CneHdgNnhSgjXal^bn2CpHarMgtQhvVcyYf{]j}3@)a`CgbEhdHofImhKckLolMnNfpOarPksPmtQcvQawRbxR`ySnyShzTe{Tc|Ti|Ug}Ul}Vf~Vo~VeWmW*j`WcaWkaWcbWjbWfcWmcW`dWkdVbeVfeVieVmeVbfVffVdfWffWdfXgfXYffZjf[nf\bg]ig^`h_ai_`j_jk^am]o[eqXjsTfvOyI|Bd2Z+ibPjeEbh1YijLel0^jmO(``@@@@d`@h`@ca/_ka_jb_hc_nd^kf]dh]gj[ilZcoXjqVetTcwQoyNj|KdH)maDed@lf.\ciWekSgmN`oJjpE`rAjs-\htXuTkvOdwLbxHixEdyBmy,_gz\jzZb{Xk{V`|Uk|Sn|Rf}Qo}Pd~Pm~OgNmN*g`Mm`MgaLiaLcbKebKnbJ`cJfcIicIkcHncH`dHddHkdGodG`eHeeHneHdfInfIigJchJnhKliLjjLgkLclLnlLkmKnmJ`nIcnFhmDnl@jk+\liXhgSmdMfaG)b}Aex*[bsU`mPjfK(kGaxE``0@@@c`/_b`_``_a`^'l]m[hYeV`Sj~Oa~Kg}Fd|Bg{.\fzWlxRjwLluGctAfr-\pWcnRalNliJhgFfeBbc,_n`\&l~Zh|XzVnxTawSduRlsQerPgqO`pOboNdnNomMamMolLflL`lLblKlkKnkJmkJokImkIlkIclHblHalHHHHelHflHHklHhlImlIamIfmInmIfnImnIdoInoHkpG`qGmqFerEmrDesCmsBnsAlsAjs@cs@arAcqBkoDnmGikKeiPifVnc]l`-F%n}OzZfx.FnuSct/AnrP(``0@@@@'l@h@a@i~@j}@h|Af{AiyBlwCmuDksEaqGjnIokKaiNefQjcT`aX&g~[o{_hy1DewHguLfsQhqVbpZmn_km2ChlHmkLakPhjTcjWli[hi^ki3@fiCgiEGfiIdiKfiLMNjiOiiPkiPjiQliRniRliSbjSdjTjjTljUbkUdkVjkV`lWflWolW`mXimXanXenXinXlnXboWdoWfoVdoVeoUgoTaoTonSnnSjnSknSjnTUaoWjoYep\jq_fs4CeuHaxMc{Ro~X'cc^h5DkmJhsPczT(aaXkhZ \ No newline at end of file
diff --git a/teapot.uue b/teapot.uue
new file mode 100644
index 0000000..a95fdc0
--- /dev/null
+++ b/teapot.uue
@@ -0,0 +1,168 @@
+begin 644 teapot.tek.gz
+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
+&UEHX)@``
+`
+end
diff --git a/teaspoon.dat b/teaspoon.dat
new file mode 100644
index 0000000..fb2f730
--- /dev/null
+++ b/teaspoon.dat
@@ -0,0 +1,274 @@
+16
+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
+17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
+33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
+49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
+65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
+81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96
+97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112
+113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128
+129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144
+145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176
+177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192
+193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208
+209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224
+225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240
+241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
+256
+-0.000107143,0.205357,0.0
+0.0,0.196429,-0.0178571
+0.0,0.196429,-0.0178571
+0.000107143,0.205357,0.0
+-0.0535714,0.205357,0.0
+-0.0222714,0.178571,-0.0534286
+0.0222714,0.178571,-0.0534286
+0.0535714,0.205357,0.0
+-0.107143,0.0952429,-0.0178571
+-0.0446429,0.0952429,-0.0892857
+0.0446429,0.0952429,-0.0892857
+0.107143,0.0952429,-0.0178571
+-0.107143,0.0,-0.0178571
+-0.0446429,0.0,-0.0892857
+0.0446429,0.0,-0.0892857
+0.107143,0.0,-0.0178571
+0.000107143,0.205357,0.0
+0.000135714,0.207589,0.00446429
+0.000157143,0.216518,0.00446429
+0.000125,0.214286,0.0
+0.0535714,0.205357,0.0
+0.0613964,0.212054,0.0133571
+0.0714286,0.220982,0.015625
+0.0625,0.214286,0.0
+0.107143,0.0952429,-0.0178571
+0.122768,0.0952429,0.0
+0.142857,0.0952429,0.00446429
+0.125,0.0952429,-0.0178571
+0.107143,0.0,-0.0178571
+0.122768,0.0,0.0
+0.142857,0.0,0.00446429
+0.125,0.0,-0.0178571
+0.000125,0.214286,0.0
+0.0,0.205357,-0.0178571
+0.0,0.205357,-0.0178571
+-0.000125,0.214286,0.0
+0.0625,0.214286,0.0
+0.0267857,0.1875,-0.0625
+-0.0267857,0.1875,-0.0625
+-0.0625,0.214286,0.0
+0.125,0.0952429,-0.0178571
+0.0535714,0.0952429,-0.107143
+-0.0535714,0.0952429,-0.107143
+-0.125,0.0952429,-0.0178571
+0.125,0.0,-0.0178571
+0.0535714,0.0,-0.107143
+-0.0535714,0.0,-0.107143
+-0.125,0.0,-0.0178571
+-0.000125,0.214286,0.0
+-0.000157143,0.216518,0.00446429
+-0.000135714,0.207589,0.00446429
+-0.000107143,0.205357,0.0
+-0.0625,0.214286,0.0
+-0.0714286,0.220982,0.015625
+-0.0613964,0.212054,0.0133571
+-0.0535714,0.205357,0.0
+-0.125,0.0952429,-0.0178571
+-0.142857,0.0952429,0.00446429
+-0.122768,0.0952429,0.0
+-0.107143,0.0952429,-0.0178571
+-0.125,0.0,-0.0178571
+-0.142857,0.0,0.00446429
+-0.122768,0.0,0.0
+-0.107143,0.0,-0.0178571
+-0.107143,0.0,-0.0178571
+-0.0446429,0.0,-0.0892857
+0.0446429,0.0,-0.0892857
+0.107143,0.0,-0.0178571
+-0.107143,-0.142857,-0.0178571
+-0.0446429,-0.142857,-0.0892857
+0.0446429,-0.142857,-0.0892857
+0.107143,-0.142857,-0.0178571
+-0.0133929,-0.160714,0.0386893
+-0.00557857,-0.160714,0.0386893
+0.00557857,-0.160714,0.0386893
+0.0133929,-0.160714,0.0386893
+-0.0133929,-0.25,0.0535714
+-0.00557857,-0.25,0.0535714
+0.00557857,-0.25,0.0535714
+0.0133929,-0.25,0.0535714
+0.107143,0.0,-0.0178571
+0.122768,0.0,0.0
+0.142857,0.0,0.00446429
+0.125,0.0,-0.0178571
+0.107143,-0.142857,-0.0178571
+0.122768,-0.142857,0.0
+0.142857,-0.142857,0.00446429
+0.125,-0.142857,-0.0178571
+0.0133929,-0.160714,0.0386893
+0.0153464,-0.160714,0.0386893
+0.0178571,-0.160714,0.0314357
+0.015625,-0.160714,0.0297607
+0.0133929,-0.25,0.0535714
+0.0153464,-0.25,0.0535714
+0.0178571,-0.25,0.0463179
+0.015625,-0.25,0.0446429
+0.125,0.0,-0.0178571
+0.0535714,0.0,-0.107143
+-0.0535714,0.0,-0.107143
+-0.125,0.0,-0.0178571
+0.125,-0.142857,-0.0178571
+0.0535714,-0.142857,-0.107143
+-0.0535714,-0.142857,-0.107143
+-0.125,-0.142857,-0.0178571
+0.015625,-0.160714,0.0297607
+0.00669643,-0.160714,0.0230643
+-0.00781071,-0.160714,0.0208321
+-0.015625,-0.160714,0.0297607
+0.015625,-0.25,0.0446429
+0.00669643,-0.25,0.0379464
+-0.00781071,-0.25,0.0357143
+-0.015625,-0.25,0.0446429
+-0.125,0.0,-0.0178571
+-0.142857,0.0,0.00446429
+-0.122768,0.0,0.0
+-0.107143,0.0,-0.0178571
+-0.125,-0.142857,-0.0178571
+-0.142857,-0.142857,0.00446429
+-0.122768,-0.142857,0.0
+-0.107143,-0.142857,-0.0178571
+-0.015625,-0.160714,0.0297607
+-0.0175786,-0.160714,0.0319929
+-0.0153464,-0.160714,0.0386893
+-0.0133929,-0.160714,0.0386893
+-0.015625,-0.25,0.0446429
+-0.0175786,-0.25,0.046875
+-0.0153464,-0.25,0.0535714
+-0.0133929,-0.25,0.0535714
+-0.0133929,-0.25,0.0535714
+-0.00557857,-0.25,0.0535714
+0.00557857,-0.25,0.0535714
+0.0133929,-0.25,0.0535714
+-0.0133929,-0.46425,0.0892857
+-0.00557857,-0.46425,0.0892857
+0.00557857,-0.46425,0.0892857
+0.0133929,-0.46425,0.0892857
+-0.0446429,-0.678571,0.0535714
+-0.00892857,-0.678571,0.0625
+0.00892857,-0.678571,0.0625
+0.0446429,-0.678571,0.0535714
+-0.0446429,-0.857143,0.0357143
+-0.00892857,-0.857143,0.0446429
+0.00892857,-0.857143,0.0446429
+0.0446429,-0.857143,0.0357143
+0.0133929,-0.25,0.0535714
+0.0153464,-0.25,0.0535714
+0.0178571,-0.25,0.0463179
+0.015625,-0.25,0.0446429
+0.0133929,-0.46425,0.0892857
+0.0153464,-0.464286,0.0892857
+0.0178571,-0.46425,0.0820321
+0.015625,-0.46425,0.0803571
+0.0446429,-0.678571,0.0535714
+0.0535714,-0.678571,0.0513393
+0.0535714,-0.678571,0.0334821
+0.0446429,-0.678571,0.0357143
+0.0446429,-0.857143,0.0357143
+0.0535714,-0.857143,0.0334821
+0.0535714,-0.857143,0.015625
+0.0446429,-0.857143,0.0178571
+0.015625,-0.25,0.0446429
+0.00669643,-0.25,0.0379464
+-0.00781071,-0.25,0.0357143
+-0.015625,-0.25,0.0446429
+0.015625,-0.46425,0.0803571
+0.00669643,-0.464286,0.0736607
+-0.00781071,-0.46425,0.0714286
+-0.015625,-0.46425,0.0803571
+0.0446429,-0.678571,0.0357143
+0.00892857,-0.678571,0.0446429
+-0.00892857,-0.678571,0.0446429
+-0.0446429,-0.678571,0.0357143
+0.0446429,-0.857143,0.0178571
+0.00892857,-0.857143,0.0267857
+-0.00892857,-0.857143,0.0267857
+-0.0446429,-0.857143,0.0178571
+-0.015625,-0.25,0.0446429
+-0.0175786,-0.25,0.046875
+-0.0153464,-0.25,0.0535714
+-0.0133929,-0.25,0.0535714
+-0.015625,-0.46425,0.0803571
+-0.0175786,-0.464286,0.0825893
+-0.0153464,-0.464286,0.0892857
+-0.0133929,-0.46425,0.0892857
+-0.0446429,-0.678571,0.0357143
+-0.0535714,-0.678571,0.0334821
+-0.0535714,-0.678571,0.0513393
+-0.0446429,-0.678571,0.0535714
+-0.0446429,-0.857143,0.0178571
+-0.0535714,-0.857143,0.015625
+-0.0535714,-0.857143,0.0334821
+-0.0446429,-0.857143,0.0357143
+-0.0446429,-0.857143,0.0357143
+-0.00892857,-0.857143,0.0446429
+0.00892857,-0.857143,0.0446429
+0.0446429,-0.857143,0.0357143
+-0.0446429,-0.928571,0.0285714
+-0.00892857,-0.928571,0.0375
+0.00892857,-0.928571,0.0375
+0.0446429,-0.928571,0.0285714
+-0.0539286,-0.999643,0.0178571
+0.000357143,-0.999643,0.0178571
+0.0,-0.999643,0.0178571
+0.0535714,-0.999643,0.0178571
+-0.000357143,-1,0.0178571
+0.000357143,-1,0.0178571
+0.0,-1,0.0178571
+0.0,-1,0.0178571
+0.0446429,-0.857143,0.0357143
+0.0535714,-0.857143,0.0334821
+0.0535714,-0.857143,0.015625
+0.0446429,-0.857143,0.0178571
+0.0446429,-0.928571,0.0285714
+0.0535714,-0.928571,0.0263393
+0.0535714,-0.928571,0.00848214
+0.0446429,-0.928571,0.0107143
+0.0535714,-0.999643,0.0178571
+0.0669643,-0.999643,0.0178571
+0.0673214,-0.999643,0.0
+0.0539286,-0.999643,0.0
+0.0,-1,0.0178571
+0.0,-1,0.0178571
+0.000357143,-1,0.0
+0.000357143,-1,0.0
+0.0446429,-0.857143,0.0178571
+0.00892857,-0.857143,0.0267857
+-0.00892857,-0.857143,0.0267857
+-0.0446429,-0.857143,0.0178571
+0.0446429,-0.928571,0.0107143
+0.00892857,-0.928571,0.0196429
+-0.00892857,-0.928571,0.0196429
+-0.0446429,-0.928571,0.0107143
+0.0539286,-0.999643,0.0
+0.000357143,-0.999643,0.0
+-0.000357143,-0.999643,0.0
+-0.0539286,-0.999643,0.0
+0.000357143,-1,0.0
+0.000357143,-1,0.0
+-0.000357143,-1,0.0
+-0.000357143,-1,0.0
+-0.0446429,-0.857143,0.0178571
+-0.0535714,-0.857143,0.015625
+-0.0535714,-0.857143,0.0334821
+-0.0446429,-0.857143,0.0357143
+-0.0446429,-0.928571,0.0107143
+-0.0535714,-0.928571,0.00848214
+-0.0535714,-0.928571,0.0263393
+-0.0446429,-0.928571,0.0285714
+-0.0539286,-0.999643,0.0
+-0.0673214,-0.999643,0.0
+-0.0675,-0.999643,0.0178571
+-0.0539286,-0.999643,0.0178571
+-0.000357143,-1,0.0
+-0.000357143,-1,0.0
+-0.000535714,-1,0.0178571
+-0.000357143,-1,0.0178571
diff --git a/tek4014-1.c b/tek4014-1.c
new file mode 100644
index 0000000..7e1a6cb
--- /dev/null
+++ b/tek4014-1.c
@@ -0,0 +1,119 @@
+/*-
+ * Copyright (c) 2008 Poul-Henning Kamp
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include "aduc.h"
+
+#include "loran0.h"
+
+/**********************************************************************
+ * TEK4014 plotting functions
+ */
+
+#define SC(x) ser_char(x)
+#define SS(x) ser_str(x)
+
+void
+tek4014_start(void)
+{
+ SC(0x9d); SS("15;green"); SC(0x9c); /* TEK fg col */
+ SC(0x9d); SS("16;black"); SC(0x9c); /* TEK bg col */
+ SC(0x9b); SS("?38h"); /* TEK mode */
+ SC(0x0d);
+ SC(27); SC(12); /* TEK PAGE */
+
+ /* Draw an outline */
+ tek4014_pen();
+ tek4014_coord( 0, 0);
+ tek4014_coord(4095 - 0, 0);
+ tek4014_coord(4095 - 0, 3071 - 0);
+ tek4014_coord( 0, 3071 - 0);
+ tek4014_coord( 0, 0);
+}
+
+void
+tek4014_end(void)
+{
+ SC(31); /* Text mode */
+ SC(27); SC(3); /* VT PAGE */
+}
+
+void
+tek4014_coord(unsigned x, unsigned y)
+{
+ unsigned char lox, loy, hix, hiy, eb;
+ static unsigned char lloy = -1, lhix = -1, lhiy = -1, leb = -1;
+
+ if (y > 3071)
+ y = 3071;
+ if (x > 4095)
+ x = 4095;
+ hiy = (y >> 7) & 0x1f;
+ loy = (y >> 2) & 0x1f;
+ hix = (x >> 7) & 0x1f;
+ lox = (x >> 2) & 0x1f;
+ eb = (x & 3) | ((y & 3) << 2);
+
+ if (hiy != lhiy)
+ SC(hiy | 0x20);
+ if (eb != leb)
+ SC( eb | 0x60);
+ if (eb != leb || loy != lloy || hix != lhix)
+ SC(loy | 0x60);
+ if (hix != lhix)
+ SC(hix | 0x20);
+ SC(lox | 0x40);
+ lhiy = hiy;
+ lhix = hix;
+ lloy = loy;
+ leb = eb;
+}
+
+void
+tek4014_pen(void)
+{
+ SC(29);
+}
+
+void
+tek4014_text(void)
+{
+ SC(31);
+}
+
+void
+tek4014_curve(unsigned x, unsigned y, int *p, unsigned len, int scalex, int scaley)
+{
+ int i;
+
+ tek4014_pen();
+ tek4014_coord(0, y);
+ tek4014_coord(50, y);
+ tek4014_pen();
+ for (i = 0; i < len; i++)
+ tek4014_coord(i * scalex + x, y + p[i] / scaley);
+}
diff --git a/tek4014-2.c b/tek4014-2.c
new file mode 100644
index 0000000..d836c5f
--- /dev/null
+++ b/tek4014-2.c
@@ -0,0 +1,324 @@
+/* $Id$ */
+
+#include <vttest.h>
+#include <esc.h>
+#include <ttymodes.h>
+
+#define TEKHEIGHT 3072
+#define TEKWIDTH 4096
+
+#define FIVEBITS 037
+#define HIBITS (FIVEBITS << SHIFTHI)
+#define LOBITS (FIVEBITS << SHIFTLO)
+#define SHIFTHI 7
+#define SHIFTLO 2
+#define TWOBITS 03
+
+#undef GS
+#undef RS
+#undef US
+
+#define GS 0x001D
+#define RS 0x001E
+#define US 0x001F
+
+/*
+ * Switch to/from tek4014/vt100 mode.
+ */
+static void
+tek_enable(int flag)
+{
+ if (flag)
+ do_csi("?38h");
+ else
+ esc("\003");
+}
+
+/*
+ * Switch to GIN (graphics-in) mode.
+ */
+static void
+tek_GIN(void)
+{
+ esc("\032");
+}
+
+/*
+ * Switch back to alpha (text) mode.
+ */
+static void
+tek_ALP(void)
+{
+ printf("%c", US);
+}
+
+/*
+ * Select a font
+ */
+static void
+tek_font(int code)
+{
+ switch (code) {
+ case 1:
+ esc("8"); /* large */
+ break;
+ case 2:
+ esc("9"); /* #2 */
+ break;
+ case 3:
+ esc(":"); /* #3 */
+ break;
+ default:
+ esc(";"); /* small */
+ break;
+ }
+}
+
+/*
+ * Decode 2 bytes from a mouse report as a coordinate value.
+ */
+static int
+tek_coord(char *report, int offset)
+{
+ int hi = FIVEBITS & CharOf(report[offset]);
+ int lo = FIVEBITS & CharOf(report[offset + 1]);
+ return (hi << 5) + lo;
+}
+
+/*
+ * Send coordinates for a single point. xterm reads this info in getpoint().
+ * There are several possibilities for encoding the coordinates.
+ */
+static void
+tek_point(int pen, int y, int x)
+{
+ char temp[20];
+
+ if (pen) {
+ sprintf(temp, "%c\007", GS);
+ } else {
+ sprintf(temp, "%c", GS);
+ }
+ sprintf(temp + strlen(temp), "%c%c%c%c%c",
+ 0x20 | (((y & HIBITS) >> SHIFTHI) & FIVEBITS),
+ 0x60 | (((y & TWOBITS) << SHIFTLO) | (x & TWOBITS)), /* tests/sets lo_y */
+ 0x60 | (((y & LOBITS) >> SHIFTLO) & FIVEBITS), /* sets lo_y */
+ 0x20 | (((x & HIBITS) >> SHIFTHI) & FIVEBITS),
+ 0x40 | (((x & LOBITS) >> SHIFTLO) & FIVEBITS)); /* must be last */
+ fprintf(stdout, "%s", temp);
+ if (LOG_ENABLED) {
+ fprintf(log_fp, "*Set point (%d,%d)\n", y, x);
+ fputs("Send: ", log_fp);
+ put_string(log_fp, temp);
+ fputs("\n", log_fp);
+ }
+}
+
+static void
+tek_linestyle(int style)
+{
+ char temp[10];
+ sprintf(temp, "%c", 0x60 + style);
+ esc(temp);
+}
+
+static void
+log_mouse_click(char *report)
+{
+ if (LOG_ENABLED) {
+ int new_x = tek_coord(report, 1);
+ int new_y = tek_coord(report, 3);
+ fprintf(log_fp, "Report: ");
+ if ((report[0] & 0x80) != 0
+ && strchr("lmrLMR", report[0] & 0x7f) != 0) {
+ fprintf(log_fp, "mouse %c", report[0] & 0x7f);
+ } else {
+ fprintf(log_fp, "key %d", CharOf(report[0]));
+ }
+ fprintf(log_fp, " (%d,%d)\n", new_y, new_x);
+ fflush(log_fp);
+ }
+}
+
+/*
+ * Clear the display
+ */
+static int
+tek_clear(MENU_ARGS)
+{
+ tek_enable(1);
+ esc("\014");
+ tek_enable(0);
+ return FALSE;
+}
+
+static int
+tek_hello(MENU_ARGS)
+{
+ int n;
+
+ tek_clear(PASS_ARGS);
+
+ tek_enable(1);
+ for (n = 0; n < 4; ++n) {
+ tek_font(n);
+ println("Hello world!\r");
+ }
+ tek_enable(0);
+ return FALSE;
+}
+
+/*
+ * Wait for a mouse click, printing its coordinates. While in GIN mode, we
+ * may also see keys pressed. Exit the test when we see the same event twice
+ * in a row.
+ */
+static int
+tek_mouse_coords(MENU_ARGS)
+{
+ char *report;
+ char status[6];
+ int new_x = -1;
+ int new_y = -1;
+
+ tek_clear(PASS_ARGS);
+
+ tek_enable(1);
+ set_tty_raw(TRUE);
+ set_tty_echo(FALSE);
+
+ report = "";
+ println("Any key or mouse click twice to exit...");
+ do {
+ strncpy(status, report, 5)[5] = 0;
+ /*
+ * The graphics-in mode is reset each time users send a mouse click. So we
+ * set it in the loop.
+ */
+ tek_GIN();
+ log_mouse_click(report = instr());
+ new_x = tek_coord(report, 1);
+ new_y = tek_coord(report, 3);
+ /*
+ * If we do not start a new line after reading the mouse, we will see no
+ * text. So we do it before the rest of the report rather than after.
+ */
+ printf("\r\n");
+ if ((report[0] & 0x80) != 0
+ && strchr("lmrLMR", report[0] & 0x7f) != 0) {
+ printf("mouse %c:", report[0] & 0x7f);
+ } else {
+ printf("key: %d", CharOf(report[0]));
+ }
+ printf(" (%d,%d)", new_y, new_x);
+ fflush(stdout);
+ } while (strcmp(report, status));
+
+ tek_ALP();
+ restore_ttymodes();
+ tek_enable(0);
+ return FALSE;
+}
+
+/*
+ * Wait for a mouse click, drawing a line point-to-point from each click.
+ * Ignore keys pressed. Exit the test when we see the same event twice
+ * in a row.
+ *
+ * xterm pretends the screen is 4096 by 3072 (height by width). So the lines
+ * appear in the lower-right of the screen. Since we cannot ask xterm how
+ * large the screen actually is, we do not try to (cannot) scale the lines.
+ */
+static int
+tek_mouse_lines(MENU_ARGS)
+{
+ char *report;
+ char status[6];
+ int old_x = -1;
+ int old_y = -1;
+ int new_x = -1;
+ int new_y = -1;
+
+ tek_clear(PASS_ARGS);
+
+ tek_enable(1);
+ set_tty_raw(TRUE);
+ set_tty_echo(FALSE);
+
+ report = "";
+ println("Any mouse click twice to exit...");
+ do {
+ strncpy(status, report, 5)[5] = 0;
+ if (old_x >= 0 && old_y >= 0) {
+ tek_point(0, old_y, old_x);
+ tek_point(1, new_y, new_x);
+ fflush(stdout);
+ }
+ old_x = new_x;
+ old_y = new_y;
+ tek_GIN();
+ log_mouse_click(report = instr());
+ new_x = tek_coord(report, 1);
+ new_y = tek_coord(report, 3);
+ } while (strcmp(report, status));
+
+ restore_ttymodes();
+ tek_enable(0);
+ return FALSE;
+}
+
+/*
+ * Draw a grid using a different line-type for each line, if possible.
+ */
+static int
+tek_grid_demo(MENU_ARGS)
+{
+ int y, x;
+ int style = 0;
+
+ tek_clear(PASS_ARGS);
+ tek_enable(1);
+ for (y = 0; y <= TEKHEIGHT; y += TEKHEIGHT / 16) {
+ tek_linestyle(style++ % 4);
+ tek_point(0, y, 0);
+ tek_point(1, y, TEKWIDTH - 1);
+ }
+ for (x = 0; x <= TEKWIDTH; x += TEKWIDTH / 16) {
+ tek_linestyle(style++ % 4);
+ tek_point(0, 0, x);
+ tek_point(1, TEKHEIGHT - 1, x);
+ }
+ tek_ALP(); /* flush the plot */
+ tek_enable(0);
+ return FALSE;
+}
+
+/*
+ * The common versions of xterm (X11R5, X11R6, XFree86) provide a Tektronix
+ * 4014 emulation. It can be configured out of XFree86 xterm, but that fact is
+ * ignored by the cretins who quote rxvt's misleading manpage. (The emulation
+ * if unused accounts for 30kb of shared memory use).
+ *
+ * Other than its association with xterm, these tests do not really belong
+ * in vttest, since the Tektronix is not even an ANSI terminal.
+ */
+int
+tst_tek4014(MENU_ARGS)
+{
+ static MENU my_menu[] = {
+ { "Exit", 0 },
+ { "Clear screen", tek_clear },
+ { "'Hello World!' in each font", tek_hello },
+ { "Get mouse-clicks, showing coordinates", tek_mouse_coords },
+ { "Get mouse-clicks, drawing lines between", tek_mouse_lines },
+ { "Draw a grid", tek_grid_demo },
+ { "", 0 }
+ };
+
+ do {
+ vt_clear(2);
+ title(0); println("XTERM/tek4014 features");
+ title(2); println("Choose test type:");
+ } while (menu(my_menu));
+ return MENU_NOHOLD;
+}
diff --git a/tekpot.c b/tekpot.c
new file mode 100644
index 0000000..81c5fd1
--- /dev/null
+++ b/tekpot.c
@@ -0,0 +1,284 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2009 Dimitri Sokolyuk <sokolyuk@gmail.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct point Point;
+typedef struct patch Patch;
+
+struct point {
+ float x, y, z;
+} *point, *ppoint, max;
+
+struct patch {
+ int p[16];
+} *patch, *ppatch;
+
+int tekheight = 3072;
+int tekwidth = 4096;
+int npoints = 100;
+
+void
+sc(char c)
+{
+ putchar(c);
+}
+
+void
+ss(char *s)
+{
+ while (*s)
+ putchar(*s++);
+}
+
+void
+tekenable(int flag)
+{
+ if (flag) {
+ sc(27); ss("[?38h");
+ } else {
+ sc(27); sc(003);
+ }
+}
+
+void
+tekclear()
+{
+ tekenable(1);
+ sc(27); sc(014);
+ tekenable(0);
+}
+
+void
+tekpen(int flag)
+{
+ if (flag) {
+ sc(29); sc(007);
+ } else {
+ sc(29);
+ }
+}
+
+void
+tekcoord(unsigned int x, unsigned int y)
+{
+ unsigned char lox, loy, hix, hiy, eb;
+ static unsigned char lloy = -1, lhix = -1, lhiy = -1, leb = -1;
+
+ if (y >= tekheight)
+ y = tekheight - 1;
+ if (x >= tekwidth)
+ x = tekwidth - 1;
+ hiy = (y >> 7) & 0x1f;
+ loy = (y >> 2) & 0x1f;
+ hix = (x >> 7) & 0x1f;
+ lox = (x >> 2) & 0x1f;
+ eb = (x & 3) | ((y & 3) << 2);
+
+ if (hiy != lhiy)
+ sc(hiy | 0x20);
+ if (eb != leb)
+ sc(eb | 0x60);
+ if (eb != leb || loy != lloy || hix != lhix)
+ sc(loy | 0x60);
+ if (hix != lhix)
+ sc(hix | 0x20);
+ sc(lox | 0x40);
+ lhiy = hiy;
+ lhix = hix;
+ lloy = loy;
+ leb = eb;
+}
+
+void
+loadpatch(char *filename, int *patches, int *verticles)
+{
+ int ii, jj;
+ float x, y, z;
+ int a, b, c, d;
+ FILE *fd;
+
+ fd = fopen(filename, "r");
+ if (!fd)
+ err(1, "can't open %s", filename);
+
+ fscanf(fd, "%i\n", patches);
+
+ patch = calloc(*patches, sizeof(Patch));
+ if (!patch)
+ err(1, "can't allocate memory");
+ ppatch = patch;
+
+ for (ii = 0; ii < *patches; ii++) {
+ jj = 0;
+ a = 0;
+ b = 0;
+ c = 0;
+ d = 0;
+ fscanf(fd, "%i, %i, %i, %i,", &a, &b, &c, &d);
+ ppatch->p[jj++] = --a;
+ ppatch->p[jj++] = --b;
+ ppatch->p[jj++] = --c;
+ ppatch->p[jj++] = --d;
+ fscanf(fd, "%i, %i, %i, %i,", &a, &b, &c, &d);
+ ppatch->p[jj++] = --a;
+ ppatch->p[jj++] = --b;
+ ppatch->p[jj++] = --c;
+ ppatch->p[jj++] = --d;
+ fscanf(fd, "%i, %i, %i, %i,", &a, &b, &c, &d);
+ ppatch->p[jj++] = --a;
+ ppatch->p[jj++] = --b;
+ ppatch->p[jj++] = --c;
+ ppatch->p[jj++] = --d;
+ fscanf(fd, "%i, %i, %i, %i\n", &a, &b, &c, &d);
+ ppatch->p[jj++] = --a;
+ ppatch->p[jj++] = --b;
+ ppatch->p[jj++] = --c;
+ ppatch->p[jj++] = --d;
+ ++ppatch;
+ }
+
+ fscanf(fd, "%i\n", verticles);
+
+ point = calloc(*verticles, sizeof(Point));
+ if (!point)
+ err(1, "can't allocate memory");
+ ppoint = point;
+
+ max.x = 0;
+ max.y = 0;
+ max.z = 0;
+
+ for (ii = 0; ii < *verticles; ii++) {
+ fscanf(fd, "%f, %f, %f\n", &x, &y, &z);
+ ppoint->x = x;
+ if (abs(x) > max.x)
+ max.x = abs(x);
+ ppoint->y = y;
+ if (abs(y) > max.y)
+ max.y = abs(y);
+ ppoint->z = z;
+ if (abs(z) > max.z)
+ max.z = abs(z);
+ ++ppoint;
+ }
+
+ fclose(fd);
+}
+
+int
+rnd(float f)
+{
+ if (f > 0)
+ f += 0.5;
+ else
+ f -= 0.5;
+
+ return (int)f;
+}
+
+void
+rotx(Point *p)
+{
+ p->y = 0.5 * p->y + 0.866 * p->z;
+ p->z = -0.866 * p->y + 0.5 * p->z;
+}
+
+void
+project(Point *p)
+{
+ float d = 100 * max.z;
+ float zoom = 1000;
+
+ rotx(p);
+
+ p->x *= d/(2*d - p->z);
+ p->y *= d/(2*d - p->z);
+
+ p->x *= zoom;
+ p->y *= zoom;
+
+ p->x += tekwidth/2;
+ p->y += tekheight/3;
+
+ tekcoord(rnd(p->x), rnd(p->y));
+}
+
+void
+vec(Point *a, Point *b, float lambda)
+{
+ a->x += lambda*(b->x - a->x);
+ a->y += lambda*(b->y - a->y);
+ a->z += lambda*(b->z - a->z);
+}
+
+void
+bezier(Patch *pp, int step, int steps)
+{
+ Point p[16];
+ int i, j, k;
+ float s = (float)step/(float)steps;
+
+ for (i = 0; i < 16; i++) {
+ k = pp->p[i];
+ p[i].x = point[k].x;
+ p[i].y = point[k].y;
+ p[i].z = point[k].z;
+ }
+
+ for (i = 15; i > 0; i--)
+ for (j = 0; j < i; j++)
+ vec(&p[j], &p[j + 1], s);
+
+ project(p);
+}
+
+void
+usage()
+{
+ extern char *__progname;
+
+ fprintf(stderr, "usage: %s datafile\n", __progname);
+
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ int patches, verticles;
+ int i, j;
+
+ if (argc != 2)
+ usage();
+
+ loadpatch(*++argv, &patches, &verticles);
+
+ tekclear();
+ tekenable(1);
+ for (i = 0; i < patches; i++) {
+ tekpen(0);
+ for (j = 0; j < npoints; j++)
+ bezier(&patch[i], j, npoints);
+ tekpen(1);
+ }
+ tekenable(0);
+
+ return 0;
+}