Index: trunk/Ohana/src/kapa2/include/prototypes.h
===================================================================
--- trunk/Ohana/src/kapa2/include/prototypes.h	(revision 39652)
+++ trunk/Ohana/src/kapa2/include/prototypes.h	(revision 39926)
@@ -32,11 +32,11 @@
 void          DrawLabelsRaw       PROTO((Graphic *graphic, KapaGraphWidget *graph, int color));
 void	      DrawTextlines	  PROTO((KapaGraphWidget *graph));
-void          DrawConnect         PROTO((KapaGraphWidget *graph, Gobjects *objects));
-void          DrawHistogram       PROTO((KapaGraphWidget *graph, Gobjects *objects));
-int           DrawObjectN         PROTO((KapaGraphWidget *graph, Gobjects *objects));
-void          DrawPoints          PROTO((KapaGraphWidget *graph, Gobjects *objects));
-void          ClipLine            PROTO((double x0, double y0, double x1, double y1, double X0, double Y0, double X1, double Y1));
-void          DrawXErrors         PROTO((KapaGraphWidget *graph, Gobjects *objects));
-void          DrawYErrors         PROTO((KapaGraphWidget *graph, Gobjects *objects));
+void          DrawConnect         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+void          DrawHistogram       PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+int           DrawObjectN         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+void          DrawPoints          PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+void          ClipLine            PROTO((Graphic *graphic, double x0, double y0, double x1, double y1, double X0, double Y0, double X1, double Y1));
+void          DrawXErrors         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+void          DrawYErrors         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
 void	      DrawTick		  PROTO((Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis));
 void	      AxisTickScale	  PROTO((Axis *axis, double *range, double *major, double *minor, int *nsignif));
@@ -115,4 +115,5 @@
 void          PSLabels            PROTO((KapaGraphWidget *graph, FILE *f));
 void	      PSTextlines	  PROTO((KapaGraphWidget *graph, FILE *f));
+int           PSObjectsN          PROTO((KapaGraphWidget *graph, Gobjects *objects, FILE *f));
 void          PSConnect           PROTO((KapaGraphWidget *graph, Gobjects *objects, FILE *f));
 void          PSHistogram         PROTO((KapaGraphWidget *graph, Gobjects *objects, FILE *f));
@@ -135,4 +136,5 @@
 void	      bDrawLabels	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph));
 void	      bDrawTextlines	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph));
+int	      bDrawObjectsN	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
 void	      bDrawConnect	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
 void	      bDrawHistogram	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
Index: trunk/Ohana/src/kapa2/src/DrawFrame.c
===================================================================
--- trunk/Ohana/src/kapa2/src/DrawFrame.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/DrawFrame.c	(revision 39926)
@@ -12,4 +12,6 @@
 
   graphic = GetGraphic();
+
+  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
 
   /* each axis is drawn independently, but ticks and labels are placed according to perpendicular distance. */
@@ -30,6 +32,6 @@
     dfy = graph[0].axis[i].dfy + 2*dy;
 
-    P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
-    P *= (1 + 0.25*lweight);
+    // P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
+    // P *= (1 + 0.25*lweight);
 
     XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CapNotLast, JoinMiter);
Index: trunk/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 39926)
@@ -8,8 +8,4 @@
 # define FillCircle(X,Y,R) (XFillArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R+1), abs(2*R+1), 0, 23040))
 
-# define CONNECT 0
-# define HISTOGRAM 1
-# define POINTS 2
-
 # define XCENTER 0.0
 # define YCENTER 0.0
@@ -17,5 +13,6 @@
 # define JOINSTYLE JoinMiter
 
-static Graphic *graphic;
+// XXX this is not thread safe, but that is OK
+// static Graphic *graphic;
 
 /* draw all objects for this Graph */
@@ -24,14 +21,20 @@
   int i;
   
+  // the functions below use this global value
+  Graphic *graphic = GetGraphic();
+  
+  // this function calls all of the supporting Draw... functions below
   for (i = 0; i < graph[0].Nobjects; i++) {
     if (DEBUG) fprintf (stderr, "object: %d\n", i);
     if (DEBUG) fprintf (stderr, "Npts: %d\n", graph[0].objects[i].Npts);
-    DrawObjectN (graph, &graph[0].objects[i]);
+    DrawObjectN (graphic, graph, &graph[0].objects[i]);
   }    
+  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
+  XSetForeground (graphic->display, graphic->gc, graphic->fore);
   return (TRUE);
 }
 
 /* Draw a specific object in the graph */
-int DrawObjectN (KapaGraphWidget *graph, Gobjects *object) {
+int DrawObjectN (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
   
   static char dot[2] = {2,3};
@@ -41,7 +44,4 @@
   int lweight;
   
-  // this function calls all of the supporting Draw... functions below
-  graphic = GetGraphic();
-  
   lweight = MAX (1, MIN (10, object[0].lweight));
 
@@ -58,23 +58,21 @@
   /* set line type */
   switch (object[0].ltype) {
-    case 0:
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CAPSTYLE, JOINSTYLE);
-      break;
-    case 1:
+    case KAPA_LINE_DOT:
       XSetDashes (graphic->display, graphic->gc, 1, dot, 2);
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
-      break;
-    case 2:
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
+      break;
+    case KAPA_LINE_DASH_SHORT:
       XSetDashes (graphic->display, graphic->gc, 1, short_dash, 2);
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
-      break;
-    case 3:
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
+      break;
+    case KAPA_LINE_DASH_LONG:
       XSetDashes (graphic->display, graphic->gc, 1, long_dash, 2);
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
-      break;
-    case 4:
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
+      break;
+    case KAPA_LINE_DOT_DASH:
       XSetDashes (graphic->display, graphic->gc, 1, dot_dash, 4);
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
-      break;
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
+      break;
+    case KAPA_LINE_SOLID:
     default:
       XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CAPSTYLE, JOINSTYLE);
@@ -88,29 +86,27 @@
 
   switch (object[0].style) {
-    case CONNECT: 
-      DrawConnect (graph, object);
-      break;
-    case HISTOGRAM:
-      DrawHistogram (graph, object);
-      break;
-    case POINTS:
-      DrawPoints (graph, object);
+    case KAPA_PLOT_CONNECT: 
+      DrawConnect (graphic, graph, object);
+      break;
+    case KAPA_PLOT_HISTOGRAM:
+      DrawHistogram (graphic, graph, object);
+      break;
+    case KAPA_PLOT_POINTS:
+    default:
+      DrawPoints (graphic, graph, object);
       break;
   }
     
   if (object[0].etype & 0x01) {
-    DrawYErrors (graph, object);
+    DrawYErrors (graphic, graph, object);
   }
   if (object[0].etype & 0x02) {
-    DrawXErrors (graph, object);
-  }
-
-  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
-  XSetForeground (graphic->display, graphic->gc, graphic->fore);
+    DrawXErrors (graphic, graph, object);
+  }
   return (TRUE);
 }
 
 /******/
-void DrawConnect (KapaGraphWidget *graph, Gobjects *object) {
+void DrawConnect (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
   
   int i;
@@ -149,5 +145,5 @@
     sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     
-    ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+    ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
     /* DrawLine (sx0, sy0, sx1, sy1); */
     sx0 = sx1; sy0 = sy1;
@@ -156,5 +152,5 @@
 }
 
-void ClipLine (double x0, double y0, double x1, double y1, double X0, double Y1, double X1, double Y0) {
+void ClipLine (Graphic *graphic, double x0, double y0, double x1, double y1, double X0, double Y1, double X1, double Y0) {
 
   /* skip line segement if both points are beyond box */
@@ -212,5 +208,5 @@
 /* simplify the code abit by finding triplets, watch out for a histogram of 2 points */
 # if (1)
-void DrawHistogram (KapaGraphWidget *graph, Gobjects *object) {
+void DrawHistogram (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
 
   int i;
@@ -298,5 +294,5 @@
 # else 
 
-void DrawHistogram (KapaGraphWidget *graph, Gobjects *object) {
+void DrawHistogram (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
 
   int i;
@@ -407,5 +403,5 @@
 
 /******/
-void DrawPoints (KapaGraphWidget *graph, Gobjects *object) {
+void DrawPoints (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
 
   int i;
@@ -427,7 +423,5 @@
   by = byi + byj;
   
-  Graphic *graphic = GetGraphic();
-
-  /**** points are scaled by object.z ***/
+  /**** point sizes are scaled by object.size, colors by object.color ***/
   int scaleSize = (object[0].size < 0);
   int scaleColor = (object[0].color < 0);
@@ -437,315 +431,299 @@
   x = object[0].x; y = object[0].y; z = object[0].z;
 
-  if (object[0].ptype == 0) {	/* filled box */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
-      }
+  switch (object[0].ptype) {
+    case KAPA_POINT_BOX_OPEN:	/* open box */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawRectangle (sx - D, sy - D, 2*D, 2*D);
+	}
+      }
+      break;
+    case KAPA_POINT_CROSS: /* cross */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy, sx + D + 1, sy);
+	  DrawLine (sx, sy - D, sx, sy + D + 1);
+	}
+      }
+      break;
+    case KAPA_POINT_X:	/* x */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
+	  DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_SOLID:	/* filled triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+
+	  XPoint points[4];
+	  points[0].x = sx - D;  points[0].y = sy + 0.58*D;  
+	  points[1].x = sx + D;  points[1].y = sy + 0.58*D;  
+	  points[2].x = sx;      points[2].y = sy - 1.15*D;  
+	  points[3].x = sx - D;  points[3].y = sy + 0.58*D;  
+	  XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_SOLID_DOWN: /* filled triangle (down) */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+
+	  XPoint points[4];
+	  points[0].x = sx - D;  points[0].y = sy - 0.58*D;  
+	  points[1].x = sx + D;  points[1].y = sy - 0.58*D;  
+	  points[2].x = sx;      points[2].y = sy + 1.15*D;  
+	  points[3].x = sx - D;  points[3].y = sy - 0.58*D;  
+	  XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_OPEN:	/* open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
+	  DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
+	  DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_OPEN_DOWN:	/* upside-down open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
+	  DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
+	  DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
+	}
+      }
+      break;
+    case KAPA_POINT_Y:	/* Y */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx, sy, sx - D, sy - 0.58*D);
+	  DrawLine (sx, sy, sx + D, sy - 0.58*D);
+	  DrawLine (sx, sy, sx,     sy + 1.15*D);
+	}
+      }
+      break;
+    case KAPA_POINT_Y_DOWN:	/* upside-down Y */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx, sy, sx - D, sy + 0.58*D);
+	  DrawLine (sx, sy, sx + D, sy + 0.58*D);
+	  DrawLine (sx, sy, sx,     sy - 1.15*D);
+	}
+      }
+      break;
+    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawCircle (sx, sy, D);
+	}
+      }
+      break;
+    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillCircle (sx, sy, D);
+	  DrawCircle (sx, sy, D);
+	}
+      }
+      break;
+    case KAPA_POINT_PENTAGON:	/* pentagon */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
+	  DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
+	  DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
+	  DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
+	  DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
+	}
+      }
+      break;
+    case KAPA_POINT_HEXAGON:	/* hexagon */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
+	  DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
+	  DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
+
+	  DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
+	  DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
+	  DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
+	}
+      }
+      break;
+    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
+      double X0 = graph[0].axis[0].fx;
+      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
+      double Y0 = graph[0].axis[1].fy;
+      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
+
+      for (i = 0; i + 1 < object[0].Npts; i+=2) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
+	if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
+	sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
+	sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
+	ClipLine (graphic, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
+      }
+      break;
     }
-  }
-  if (object[0].ptype == 1) {	/* open box */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawRectangle (sx - D, sy - D, 2*D, 2*D);
-      }
-    }
-  }
-  if (object[0].ptype == 2) { /* cross */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy, sx + D + 1, sy);
-	DrawLine (sx, sy - D, sx, sy + D + 1);
-      }
-    }
-  }
-  if (object[0].ptype == 3) {	/* x */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
-	DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
-      }
-    }
-  }
-  if (object[0].ptype == 4) {	/* filled triangle */
-    XPoint points[4];
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	points[0].x = sx - D;  points[0].y = sy + 0.58*D;  
-	points[1].x = sx + D;  points[1].y = sy + 0.58*D;  
-	points[2].x = sx;      points[2].y = sy - 1.15*D;  
-	points[3].x = sx - D;  points[3].y = sy + 0.58*D;  
-	XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
-      }
-    }
-  }
-  if (object[0].ptype == 5) {	/* open triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
-	DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
-	DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
-      }
-    }
-  }
-  if (object[0].ptype == 6) {	/* Y */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx, sy, sx - D, sy - 0.58*D);
-	DrawLine (sx, sy, sx + D, sy - 0.58*D);
-	DrawLine (sx, sy, sx,     sy + 1.15*D);
-      }
-    }
-  }
-  if (object[0].ptype == 7) {	/* 0 */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawCircle (sx, sy, D);
-      }
-    }
-  }
-  if (object[0].ptype == 8) {	/* pentagon */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
-	DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
-	DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
-	DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
-	DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
-      }
-    }
-  }
-  if (object[0].ptype == 9) {	/* hexagon */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
-	DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
-	DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
-
-	DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
-	DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
-	DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
-      }
-    }
-  }
-  if (object[0].ptype == 10) {	/* filled 0 */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillCircle (sx, sy, D);
-      }
-    }
-  }
-  if (object[0].ptype == 12) {	/* filled triangle (down) */
-    XPoint points[4];
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	points[0].x = sx - D;  points[0].y = sy - 0.58*D;  
-	points[1].x = sx + D;  points[1].y = sy - 0.58*D;  
-	points[2].x = sx;      points[2].y = sy + 1.15*D;  
-	points[3].x = sx - D;  points[3].y = sy - 0.58*D;  
-	XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
-      }
-    }
-  }
-  if (object[0].ptype == 14) {	/* upside-down filled triangle */
-    XPoint points[4];
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	points[0].x = sx - D;  points[0].y = sy - 0.58*D;  
-	points[1].x = sx + D;  points[1].y = sy - 0.58*D;  
-	points[2].x = sx;      points[2].y = sy + 1.15*D;  
-	points[3].x = sx - D;  points[3].y = sy - 0.58*D;  
-	XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
-      }
-    }
-  }
-  if (object[0].ptype == 15) {	/* upside-down open triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
-	DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
-	DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
-      }
-    }
-  }
-  if (object[0].ptype == 16) {	/* upside-down Y */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy = x[i]*myi + y[i]*myj + by + YCENTER;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx, sy, sx - D, sy + 0.58*D);
-	DrawLine (sx, sy, sx + D, sy + 0.58*D);
-	DrawLine (sx, sy, sx,     sy - 1.15*D);
-      }
-    }
-  }
-  if (object[0].ptype == 100) {	/* connect a pair of points */
-
-    double X0 = graph[0].axis[0].fx;
-    double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
-    double Y0 = graph[0].axis[1].fy;
-    double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-
-    for (i = 0; i + 1 < object[0].Npts; i+=2) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-      sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
-      if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
-      sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
-      sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
-      ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
-    }
+    case KAPA_POINT_BOX_SOLID:	/* filled box */
+    default:
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy = x[i]*myi + y[i]*myj + by + YCENTER;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
+	}
+      }
+      break;
   }
 }
     
 /******/
-void DrawXErrors (KapaGraphWidget *graph, Gobjects *object) {
+void DrawXErrors (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
   
   int i, bar, dz, ds, D;
@@ -800,9 +778,9 @@
 	 (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy))) 
     {
-      ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
       if (bar) {
 	sx10 = sy1 - sz;
 	sx11 = sy1 + sz;
-	ClipLine (sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
+	ClipLine (graphic, sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
       }
     }
@@ -819,9 +797,9 @@
 	 (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
     {
-      ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
       if (bar) {
 	sx10 = sy1 - sz;
 	sx11 = sy1 + sz;
-	ClipLine (sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
+	ClipLine (graphic, sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
       }
     }
@@ -830,5 +808,5 @@
     
 /******/
-void DrawYErrors (KapaGraphWidget *graph, Gobjects *object) {
+void DrawYErrors (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
 
   int i, bar, dz, ds, D;
@@ -883,9 +861,9 @@
 	 (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
     {
-      ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
       if (bar) {
 	sx10 = sx1 - sz;
 	sx11 = sx1 + sz;
-	ClipLine (sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
+	ClipLine (graphic, sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
       }
     }
@@ -904,9 +882,9 @@
 	 (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
     {
-      ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
       if (bar) {
 	sx10 = sx1 - sz;
 	sx11 = sx1 + sz;
-	ClipLine (sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
+	ClipLine (graphic, sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
       }
     }
Index: trunk/Ohana/src/kapa2/src/LoadObject.c
===================================================================
--- trunk/Ohana/src/kapa2/src/LoadObject.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/LoadObject.c	(revision 39926)
@@ -102,5 +102,8 @@
   if (DEBUG) fprintf (stderr, "loaded %d objects, using object %d\n", graph[0].objects[N].Npts, N);
 
-  if (USE_XWINDOW) DrawObjectN (graph, &graph[0].objects[graph[0].Nobjects-1]);
+  if (USE_XWINDOW) {
+    Graphic *graphic = GetGraphic();
+    DrawObjectN (graphic, graph, &graph[0].objects[graph[0].Nobjects-1]);
+  }
   FlushDisplay ();
 
Index: trunk/Ohana/src/kapa2/src/PSFrame.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PSFrame.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/PSFrame.c	(revision 39926)
@@ -11,4 +11,6 @@
 
   graphic = GetGraphic();
+
+  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
 
   /* each axis is drawn independently */
@@ -30,6 +32,6 @@
     dfy = -graph[0].axis[i].dfy + 2*dy;
 
-    P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
-    P *= (1 + 0.25*lweight);
+    // P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
+    // P *= (1 + 0.25*lweight);
 
     fprintf (f, "%.1f setlinewidth\n", lweight);
Index: trunk/Ohana/src/kapa2/src/PSObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PSObjects.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/PSObjects.c	(revision 39926)
@@ -7,8 +7,9 @@
 # define FillCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f FC\n", (X1), (graphic->dy - Y1), (R)))
 # define FillTriangle(X1,Y1,X2,Y2, X3, Y3) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f TF\n", (X1), (graphic->dy-Y1), (X2), (graphic->dy-Y2), (X3), (graphic->dy-Y3)))
-# define CONNECT 0
-# define HISTOGRAM 1
-# define POINTS 2
-
+
+# define CAPSTYLE 1 /* CapButt */
+# define JOINSTYLE 0 /* JoinMiter */
+
+// XXX this is not thread safe, but that is OK
 static Graphic *graphic;
 
@@ -16,51 +17,70 @@
   
   int i;
-  double lweight;
-  static char dash[] = "5";
-  static char dot[] = "3";
-  
+  
+  // the functions below use this global value
   graphic = GetGraphic();
 
+  // this function calls all of the supporting Draw... functions below
   for (i = 0; i < graph[0].Nobjects; i++) {
-    switch (graph[0].objects[i].ltype) {
-    case 0:
-      break;
-    case 1:
-      fprintf (f, "[%s] 0 setdash\n", dash);
-      break;
-    case 2:
+    PSObjectsN (graph, &graph[0].objects[i], f);
+  }
+  // reset to default color and style
+  fprintf (f, "[] 0 setdash\n");
+  fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
+
+  return (TRUE);
+}
+
+int PSObjectsN (KapaGraphWidget *graph, Gobjects *object, FILE *f) {
+  
+  static char short_dash[] = "4 4";
+  static char long_dash[] = "8 8";
+  static char dot_dash[] = "2 4 4 4";
+  static char dot[] = "2 3";
+  
+  double lweight = MAX (0, MIN (10, object->lweight));
+  fprintf (f, "%.1f setlinewidth\n", lweight);
+  fprintf (f, "%d setlinecap %d setlinejoin\n", CAPSTYLE, JOINSTYLE);
+
+  switch (object->ltype) {
+    case KAPA_LINE_DOT:
       fprintf (f, "[%s] 0 setdash\n", dot);
       break;
+    case KAPA_LINE_DASH_SHORT:
+      fprintf (f, "[%s] 0 setdash\n", short_dash);
+      break;
+    case KAPA_LINE_DASH_LONG: 
+      fprintf (f, "[%s] 0 setdash\n", long_dash);
+      break;
+    case KAPA_LINE_DOT_DASH:
+      fprintf (f, "[%s] 0 setdash\n", dot_dash);
+      break;
+    case KAPA_LINE_SOLID: // no need to call 'setdash' as solid is the default
     default:
       break;
-    }
+  }
     
-    lweight = MAX (0, MIN (10, graph[0].objects[i].lweight));
-    fprintf (f, "%.1f setlinewidth\n", lweight);
-
-    if (graph[0].objects[i].color >= 0) {
-	fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(graph[0].objects[i].color));
-    }
-
-    switch (graph[0].objects[i].style) {
-    case CONNECT: 
-      PSConnect (graph, &graph[0].objects[i], f);
-      break;
-    case HISTOGRAM:
-      PSHistogram (graph, &graph[0].objects[i], f);
-      break;
-    case POINTS:
-      PSPoints (graph, &graph[0].objects[i], f);
-      break;
-    }
-
-    if (graph[0].objects[i].etype & 0x01) {
-      PSYErrors (graph, &graph[0].objects[i], f);
-    }
-    if (graph[0].objects[i].etype & 0x02) {
-      PSXErrors (graph, &graph[0].objects[i], f);
-    }
-    fprintf (f, "[] 0 setdash\n");
-    fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
+  if (object->color >= 0) {
+    fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(object->color));
+  }
+
+  switch (object->style) {
+    case KAPA_PLOT_CONNECT: 
+      PSConnect (graph, object, f);
+      break;
+    case KAPA_PLOT_HISTOGRAM: 
+      PSHistogram (graph, object, f);
+      break;
+    case KAPA_PLOT_POINTS: 
+    default:
+      PSPoints (graph, object, f);
+      break;
+  }
+
+  if (object->etype & 0x01) {
+    PSYErrors (graph, object, f);
+  }
+  if (object->etype & 0x02) {
+    PSXErrors (graph, object, f);
   }
   return (TRUE);
@@ -303,8 +323,7 @@
   }
 
-  // black, I think
   // fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
 
-  /**** points are scaled by object.z ***/
+  /**** point sizes are scaled by object.size, colors by object.color ***/
   int scaleSize = (object[0].size < 0);
   int scaleColor = (object[0].color < 0);
@@ -314,292 +333,281 @@
   x = object[0].x; y = object[0].y; z = object[0].z;
 
-  if (object[0].ptype == 0) {	/* filled box */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillRectangle (sx, sy, 2*D, 2*D);
-      }
+  switch (object[0].ptype) {
+    case KAPA_POINT_BOX_OPEN:	/* open box */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawRectangle (sx, sy, 2*D, 2*D);
+	}
+      }
+      break;
+    case KAPA_POINT_CROSS: /* cross */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy, sx + D, sy);
+	  DrawLine (sx, sy - D, sx, sy + D);
+	}
+      }
+      break;
+    case KAPA_POINT_X:	/* x */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx + D, sy - D, sx - D, sy + D);
+	  DrawLine (sx - D, sy - D, sx + D, sy + D);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_SOLID:	/* filled triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillTriangle (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_SOLID_DOWN:	/* open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillTriangle (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_OPEN:	/* open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
+	  DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
+	  DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_OPEN_DOWN:	/* upside-down open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
+	  DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
+	  DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
+	}
+      }
+      break;
+    case KAPA_POINT_Y:	/* Y */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx, sy, sx - D, sy + 0.58*D);
+	  DrawLine (sx, sy, sx + D, sy + 0.58*D);
+	  DrawLine (sx, sy, sx,          sy - 1.15*D);
+	}
+      }
+      break;
+    case KAPA_POINT_Y_DOWN:	/* upside-down Y */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx, sy, sx - D, sy - 0.58*D);
+	  DrawLine (sx, sy, sx + D, sy - 0.58*D);
+	  DrawLine (sx, sy, sx,     sy + 1.15*D);
+	}
+      }
+      break;
+    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawCircle (sx, sy, D);
+	}
+      }
+      break;
+    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillCircle (sx, sy, D);
+	}
+      }
+      break;
+    case KAPA_POINT_PENTAGON:	/* pentagon */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx + 0.00*D, sy + 1.00*D, sx + 0.95*D, sy + 0.31*D);
+	  DrawLine (sx + 0.95*D, sy + 0.31*D, sx + 0.58*D, sy - 0.81*D);
+	  DrawLine (sx + 0.58*D, sy - 0.81*D, sx - 0.58*D, sy - 0.81*D);
+	  DrawLine (sx - 0.58*D, sy - 0.81*D, sx - 0.95*D, sy + 0.31*D);
+	  DrawLine (sx - 0.95*D, sy + 0.31*D, sx + 0.00*D, sy + 1.00*D);
+	}
+      }
+      break;
+    case KAPA_POINT_HEXAGON:	/* hexagon */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (sx -      D, sy,               sx - 0.50*D, sy + 0.87*D);
+	  DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
+	  DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
+
+	  DrawLine (sx +      D, sy,               sx + 0.50*D, sy - 0.87*D);
+	  DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
+	  DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
+	}
+      }
+      break;
+    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
+      double X0 = graph[0].axis[0].fx;
+      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
+      double Y0 = graph[0].axis[1].fy;
+      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
+
+      for (i = 0; i + 1 < object[0].Npts; i+=2) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx1 = x[i]*mxi + y[i]*mxj + bx;
+	sy1 = x[i]*myi + y[i]*myj + by;
+	sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
+	sy2 = x[i+1]*myi + y[i+1]*myj + by;
+	ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
+      }
+      break;
     }
-  }
-  if (object[0].ptype == 1) {	/* open box */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawRectangle (sx, sy, 2*D, 2*D);
-      }
-    }
-  }
-  if (object[0].ptype == 2) { /* cross */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy, sx + D, sy);
-	DrawLine (sx, sy - D, sx, sy + D);
-      }
-    }
-  }
-  if (object[0].ptype == 3) {	/* x */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx + D, sy - D, sx - D, sy + D);
-	DrawLine (sx - D, sy - D, sx + D, sy + D);
-      }
-    }
-  }
-  if (object[0].ptype == 4) {	/* filled triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillTriangle (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
-      }
-    }
-  }
-  if (object[0].ptype == 14) {	/* filled triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillTriangle (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
-      }
-    }
-  }
-  if (object[0].ptype == 5) {	/* open triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
-	DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
-	DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
-      }
-    }
-  }
-  if (object[0].ptype == 15) {	/* upside-down open triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
-	DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
-	DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
-      }
-    }
-  }
-  if (object[0].ptype == 6) {	/* Y */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx, sy, sx - D, sy + 0.58*D);
-	DrawLine (sx, sy, sx + D, sy + 0.58*D);
-	DrawLine (sx, sy, sx,          sy - 1.15*D);
-      }
-    }
-  }
-  if (object[0].ptype == 16) {	/* Y */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx, sy, sx - D, sy - 0.58*D);
-	DrawLine (sx, sy, sx + D, sy - 0.58*D);
-	DrawLine (sx, sy, sx,     sy + 1.15*D);
-      }
-    }
-  }
-  if (object[0].ptype == 7) {	/* 0 */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawCircle (sx, sy, D);
-      }
-    }
-  }
-  if (object[0].ptype == 8) {	/* pentagon */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx + 0.00*D, sy + 1.00*D, sx + 0.95*D, sy + 0.31*D);
-	DrawLine (sx + 0.95*D, sy + 0.31*D, sx + 0.58*D, sy - 0.81*D);
-	DrawLine (sx + 0.58*D, sy - 0.81*D, sx - 0.58*D, sy - 0.81*D);
-	DrawLine (sx - 0.58*D, sy - 0.81*D, sx - 0.95*D, sy + 0.31*D);
-	DrawLine (sx - 0.95*D, sy + 0.31*D, sx + 0.00*D, sy + 1.00*D);
-      }
-    }
-  }
-  if (object[0].ptype == 9) {	/* hexagon */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (sx -      D, sy,               sx - 0.50*D, sy + 0.87*D);
-	DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
-	DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
-
-	DrawLine (sx +      D, sy,               sx + 0.50*D, sy - 0.87*D);
-	DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
-	DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
-      }
-    }
-  }
-  if (object[0].ptype == 10) {	/* 0 */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillCircle (sx, sy, D);
-      }
-    }
-  }
-  if (object[0].ptype == 100) {	/* connect a pair of points */
-    double X0 = graph[0].axis[0].fx;
-    double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
-    double Y0 = graph[0].axis[1].fy;
-    double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-
-    for (i = 0; i + 1 < object[0].Npts; i+=2) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx1 = x[i]*mxi + y[i]*mxj + bx;
-      sy1 = x[i]*myi + y[i]*myj + by;
-      sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
-      sy2 = x[i+1]*myi + y[i+1]*myj + by;
-      ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
-    }
-  }
-
+    case KAPA_POINT_BOX_SOLID:	/* filled box */
+    default:
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillRectangle (sx, sy, 2*D, 2*D);
+	}
+      }
+      break;
+  }
   free (pixel1);
   free (pixel2);
Index: trunk/Ohana/src/kapa2/src/bDrawFrame.c
===================================================================
--- trunk/Ohana/src/kapa2/src/bDrawFrame.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/bDrawFrame.c	(revision 39926)
@@ -11,4 +11,6 @@
 
   // don't need graphic, unlink DrawFrame
+
+  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
 
   /* each axis is drawn independently */
@@ -28,6 +30,7 @@
     dfx = graph[0].axis[i].dfx + 2*dx;
     dfy = graph[0].axis[i].dfy + 2*dy;
-    P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
-    P *= (1 + 0.25*lweight);
+
+    // P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
+    // P *= (1 + 0.25*lweight);
 
     bDrawSetStyle (buffer, color, lweight, 0);
Index: trunk/Ohana/src/kapa2/src/bDrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/bDrawObjects.c	(revision 39652)
+++ trunk/Ohana/src/kapa2/src/bDrawObjects.c	(revision 39926)
@@ -18,39 +18,42 @@
   
   int i;
-  int type;
-  int weight;
-  bDrawColor color;
-  bDrawColor black;
-  
+  
+  // the functions below use this global value
   graphic = GetGraphic();
 
-  black = KapaColorByName ("black");
+  // this function calls all of the supporting bDraw... functions below
   for (i = 0; i < graph[0].Nobjects; i++) {
-
-    weight = MAX (0, MIN (10, graph[0].objects[i].lweight));
-    type = graph[0].objects[i].ltype;    
-    color = graph[0].objects[i].color;
-    bDrawSetStyle (buffer, color, weight, type);
-
-    switch (graph[0].objects[i].style) {
-      case CONNECT: 
-	bDrawConnect (buffer, graph, &graph[0].objects[i]);
-	break;
-      case HISTOGRAM:
-	bDrawHistogram (buffer, graph, &graph[0].objects[i]);
-	break;
-      case POINTS:
-	bDrawPoints (buffer, graph, &graph[0].objects[i]);
-	break;
-    }
-
-    if (graph[0].objects[i].etype & 0x01) {
-      bDrawYErrors (buffer, graph, &graph[0].objects[i]);
-    }
-    if (graph[0].objects[i].etype & 0x02) {
-      bDrawXErrors (buffer, graph, &graph[0].objects[i]);
-    }
-  }
+    bDrawObjectsN (buffer, graph, &graph[0].objects[i]);
+  }
+  bDrawColor black = KapaColorByName ("black");
   bDrawSetStyle (buffer, black, 0, 0);
+  return (TRUE);
+}
+
+int bDrawObjectsN (bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object) {
+  
+  int weight = MAX (0, MIN (10, object->lweight));
+  bDrawSetStyle (buffer, object->color, weight, object->ltype);
+  
+  switch (object->style) {
+    case KAPA_PLOT_CONNECT: 
+      bDrawConnect (buffer, graph, object);
+      break;
+    case KAPA_PLOT_HISTOGRAM:
+      bDrawHistogram (buffer, graph, object);
+      break;
+    case KAPA_PLOT_POINTS:
+    default:
+      bDrawPoints (buffer, graph, object);
+      break;
+  }
+
+  if (object->etype & 0x01) {
+    bDrawYErrors (buffer, graph, object);
+  }
+  if (object->etype & 0x02) {
+    bDrawXErrors (buffer, graph, object);
+  }
+
   return (TRUE);
 }
@@ -298,354 +301,320 @@
   x = object[0].x; y = object[0].y; z = object[0].z;
 
-  if (object[0].ptype == 0) {	/* filled box */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillRectangle (buffer, sx, sy, 2*D, 2*D);
-	// plot range saturated by bDrawRectFill
-      }
+  switch (object[0].ptype) {
+    case KAPA_POINT_BOX_OPEN:	/* open box */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawRectangle (buffer, sx, sy, 2*D, 2*D);
+	  // plot range saturated by bDrawRectOpen
+	}
+      }
+      break;
+    case KAPA_POINT_CROSS: /* cross */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (buffer, sx - D, sy, sx + D, sy);
+	  DrawLine (buffer, sx, sy - D, sx, sy + D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_X:	/* x */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
+	  DrawLine (buffer, sx - D, sy - D, sx + D, sy + D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_SOLID:	/* filled triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
+	  FillTriangle (buffer, sx, sy + 0.58*D, D, -1.73*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_SOLID_DOWN:	/* open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
+	  FillTriangle (buffer, sx, sy - 0.58*D, D, +1.73*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_OPEN:	/* open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_TRIANGLE_OPEN_DOWN:	/* upside-down open triangle */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  OpenTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_Y:	/* Y */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (buffer, sx, sy, sx - D, sy - 0.58*D);
+	  DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
+	  DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_Y_DOWN:	/* upside-down Y */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (buffer, sx, sy, sx - D, sy + 0.58*D);
+	  DrawLine (buffer, sx, sy, sx + D, sy + 0.58*D);
+	  DrawLine (buffer, sx, sy, sx,     sy - 1.15*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawCircle (buffer, sx, sy, D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillCircle (buffer, sx, sy, D);
+	  // out-of-range points skipped by bDrawLineHorizontal
+	}
+      }
+      break;
+    case KAPA_POINT_PENTAGON:	/* pentagon */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (buffer, sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
+	  DrawLine (buffer, sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
+	  DrawLine (buffer, sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
+	  DrawLine (buffer, sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
+	  DrawLine (buffer, sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_HEXAGON:	/* hexagon */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  DrawLine (buffer, sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
+	  DrawLine (buffer, sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
+	  DrawLine (buffer, sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
+	  DrawLine (buffer, sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
+	  DrawLine (buffer, sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
+	  DrawLine (buffer, sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
+	  // out-of-range points skipped by bDrawPoint
+	}
+      }
+      break;
+    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
+
+      double X0 = graph[0].axis[0].fx;
+      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
+      double Y0 = graph[0].axis[1].fy;
+      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
+
+      for (i = 0; i + 1 < object[0].Npts; i+=2) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx1 = x[i]*mxi + y[i]*mxj + bx;
+	sy1 = x[i]*myi + y[i]*myj + by;
+	sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
+	sy2 = x[i+1]*myi + y[i+1]*myj + by;
+	bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
+      }
+      break;
     }
-  }
-  if (object[0].ptype == 1) {	/* open box */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawRectangle (buffer, sx, sy, 2*D, 2*D);
-	// plot range saturated by bDrawRectOpen
-      }
-    }
-  }
-  if (object[0].ptype == 2) { /* cross */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (buffer, sx - D, sy, sx + D, sy);
-	DrawLine (buffer, sx, sy - D, sx, sy + D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 3) {	/* x */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
-	DrawLine (buffer, sx - D, sy - D, sx + D, sy + D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 4) {	/* filled triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	// FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
-	FillTriangle (buffer, sx, sy + 0.58*D, D, -1.73*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 14) {	/* filled triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	// FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
-	FillTriangle (buffer, sx, sy - 0.58*D, D, +1.73*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 5) {	/* open triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 15) {	/* open triangle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	OpenTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 6) {	/* Y */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (buffer, sx, sy, sx - D, sy - 0.58*D);
-	DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
-	DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 16) {	/* Y */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (buffer, sx, sy, sx - D, sy + 0.58*D);
-	DrawLine (buffer, sx, sy, sx + D, sy + 0.58*D);
-	DrawLine (buffer, sx, sy, sx,     sy - 1.15*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 7) {	/* 0 */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawCircle (buffer, sx, sy, D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 8) {	/* pentagon */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (buffer, sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
-	DrawLine (buffer, sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
-	DrawLine (buffer, sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
-	DrawLine (buffer, sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
-	DrawLine (buffer, sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 9) {	/* hexagon */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	DrawLine (buffer, sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
-	DrawLine (buffer, sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
-	DrawLine (buffer, sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
-	DrawLine (buffer, sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
-	DrawLine (buffer, sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
-	DrawLine (buffer, sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 10) {	/* filled circle */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	FillCircle (buffer, sx, sy, D);
-	// out-of-range points skipped by bDrawLineHorizontal
-      }
-    }
-  }
-  if (object[0].ptype == 12) {	/* filled triangle (down) */
-    for (i = 0; i < object[0].Npts; i++) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx = x[i]*mxi + y[i]*mxj + bx;
-      sy = x[i]*myi + y[i]*myj + by;
-      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
-	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
-      {
-	if (scaleColor) {
-	  if (!finite(z[i])) continue;
-	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
-	  buffer->bColor_R = pixel1[pixel];
-	  buffer->bColor_G = pixel2[pixel];
-	  buffer->bColor_B = pixel3[pixel];
-	}
-	D = scaleSize ? dz*z[i] : ds;
-	// FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
-	FillTriangle (buffer, sx, sy + 0.58*D, D, 1.73*D);
-	// out-of-range points skipped by bDrawPoint
-      }
-    }
-  }
-  if (object[0].ptype == 100) {	/* connect a pair of points */
-
-    double X0 = graph[0].axis[0].fx;
-    double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
-    double Y0 = graph[0].axis[1].fy;
-    double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-
-    for (i = 0; i + 1 < object[0].Npts; i+=2) {
-      if (!(finite(x[i]) && finite(y[i]))) continue;
-      sx1 = x[i]*mxi + y[i]*mxj + bx;
-      sy1 = x[i]*myi + y[i]*myj + by;
-      sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
-      sy2 = x[i+1]*myi + y[i+1]*myj + by;
-      bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
-    }
-  }
-
+    case KAPA_POINT_BOX_SOLID:	/* filled box */
+      for (i = 0; i < object[0].Npts; i++) {
+	if (!(finite(x[i]) && finite(y[i]))) continue;
+	sx = x[i]*mxi + y[i]*mxj + bx;
+	sy = x[i]*myi + y[i]*myj + by;
+	if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	    (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	  if (scaleColor) {
+	    if (!finite(z[i])) continue;
+	    int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	    buffer->bColor_R = pixel1[pixel];
+	    buffer->bColor_G = pixel2[pixel];
+	    buffer->bColor_B = pixel3[pixel];
+	  }
+	  D = scaleSize ? dz*z[i] : ds;
+	  FillRectangle (buffer, sx, sy, 2*D, 2*D);
+	  // plot range saturated by bDrawRectFill
+	}
+      }
+      break;
+  }
   free (pixel1);
   free (pixel2);
