Index: /branches/czw_branch/20160809/Ohana/src/kapa2/include/prototypes.h
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/kapa2/include/prototypes.h	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/kapa2/include/prototypes.h	(revision 39729)
@@ -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: /branches/czw_branch/20160809/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/kapa2/src/DrawObjects.c	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/kapa2/src/DrawObjects.c	(revision 39729)
@@ -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,4 +13,5 @@
 # define JOINSTYLE JoinMiter
 
+// XXX this is not thread safe, but that is OK
 static Graphic *graphic;
 
@@ -24,4 +21,8 @@
   int i;
   
+  // 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++) {
     if (DEBUG) fprintf (stderr, "object: %d\n", i);
@@ -29,4 +30,6 @@
     DrawObjectN (graph, &graph[0].objects[i]);
   }    
+  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
+  XSetForeground (graphic->display, graphic->gc, graphic->fore);
   return (TRUE);
 }
@@ -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,11 +86,12 @@
 
   switch (object[0].style) {
-    case CONNECT: 
+    case KAPA_PLOT_CONNECT: 
       DrawConnect (graph, object);
       break;
-    case HISTOGRAM:
+    case KAPA_PLOT_HISTOGRAM:
       DrawHistogram (graph, object);
       break;
-    case POINTS:
+    case KAPA_PLOT_POINTS:
+    default:
       DrawPoints (graph, object);
       break;
@@ -105,7 +104,4 @@
     DrawXErrors (graph, object);
   }
-
-  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
-  XSetForeground (graphic->display, graphic->gc, graphic->fore);
   return (TRUE);
 }
@@ -429,5 +425,5 @@
   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,310 +433,294 @@
   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 (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;
   }
 }
Index: /branches/czw_branch/20160809/Ohana/src/kapa2/src/PSObjects.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/kapa2/src/PSObjects.c	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/kapa2/src/PSObjects.c	(revision 39729)
@@ -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: /branches/czw_branch/20160809/Ohana/src/kapa2/src/bDrawObjects.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/kapa2/src/bDrawObjects.c	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/kapa2/src/bDrawObjects.c	(revision 39729)
@@ -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);
Index: /branches/czw_branch/20160809/Ohana/src/libkapa/Makefile
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/libkapa/Makefile	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/libkapa/Makefile	(revision 39729)
@@ -34,4 +34,5 @@
 $(SRC)/KapaWindow.$(ARCH).o \
 $(SRC)/KapaColors.$(ARCH).o \
+$(SRC)/KapaStyles.$(ARCH).o \
 $(SRC)/KapaOpen.$(ARCH).o
 
Index: /branches/czw_branch/20160809/Ohana/src/libkapa/include/kapa.h
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/libkapa/include/kapa.h	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/libkapa/include/kapa.h	(revision 39729)
@@ -25,29 +25,45 @@
 typedef struct sockaddr_in KapaSockAddress;
 
-typedef struct {
-  float *data1d;
-  float **data2d;
-  int Nx;
-  int Ny;
-} KiiImage;
-
-typedef struct {
-  float x;
-  float y;
-  float dx;
-  float dy;
-  float angle;
-  int type;
-} KiiOverlayBase;
-
-typedef struct {
-  float x;
-  float y;
-  float dx;
-  float dy;
-  float angle;
-  int type;
-  char *text;
-} KiiOverlay;
+// retain historical numerical definitions:
+typedef enum {
+  KAPA_LINE_INVALID_MIN = -1,
+  KAPA_LINE_SOLID       = 0,
+  KAPA_LINE_DOT         = 1,
+  KAPA_LINE_DASH_SHORT  = 2,
+  KAPA_LINE_DASH_LONG   = 3,
+  KAPA_LINE_DOT_DASH    = 4,
+  KAPA_LINE_INVALID_MAX = 5,
+} KapaLineType;
+
+// retain historical numerical definitions:
+typedef enum {
+  KAPA_PLOT_INVALID_MIN = -1,
+  KAPA_PLOT_CONNECT     =  0,
+  KAPA_PLOT_HISTOGRAM   =  1,
+  KAPA_PLOT_POINTS      =  2,
+  KAPA_PLOT_INVALID_MAX =  3,
+} KapaPlotStyle;
+
+typedef enum {
+  KAPA_POINT_INVALID_MIN         = -1,
+  KAPA_POINT_BOX_SOLID           =  0,
+  KAPA_POINT_BOX_OPEN            =  1,
+  KAPA_POINT_CROSS               =  2, // OR PLUS
+  KAPA_POINT_X                   =  3, 
+  KAPA_POINT_Y                   =  4, 
+  KAPA_POINT_TRIANGLE_SOLID      =  5, 
+  KAPA_POINT_TRIANGLE_OPEN       =  6, 
+  KAPA_POINT_CIRCLE_OPEN         =  7, 
+  KAPA_POINT_PENTAGON            =  8, 
+  KAPA_POINT_HEXAGON             =  9, 
+  KAPA_POINT_CIRCLE_SOLID        = 10, 
+  KAPA_POINT_TRIANGLE_SOLID_DOWN = 11, 
+  KAPA_POINT_TRIANGLE_OPEN_DOWN  = 12, 
+  KAPA_POINT_Y_DOWN              = 13, 
+  KAPA_POINT_INVALID_MAX         = 14,
+  KAPA_POINT_PAIR_CONNECT        = 100, // change to a plot style?
+} KapaPointStyle;
+// note that PAIR_CONNECT was historically 100
+
 
 typedef enum {
@@ -75,4 +91,30 @@
   KAPA_PS_RAWPAGE
 } KapaPSmode;
+
+typedef struct {
+  float *data1d;
+  float **data2d;
+  int Nx;
+  int Ny;
+} KiiImage;
+
+typedef struct {
+  float x;
+  float y;
+  float dx;
+  float dy;
+  float angle;
+  int type;
+} KiiOverlayBase;
+
+typedef struct {
+  float x;
+  float y;
+  float dx;
+  float dy;
+  float angle;
+  int type;
+  char *text;
+} KiiOverlay;
 
 typedef struct {
@@ -219,4 +261,9 @@
 unsigned long *KapaX11colors (Display *display, Colormap colormap, unsigned long default_color, int *Ncolors);
 
+/* KapaStyles.c */
+KapaLineType KapaLineTypeFromString (char *string);
+KapaPlotStyle KapaPlotStyleFromString (char *string);
+KapaPointStyle KapaPointStyleFromString (char *string);
+
 /* RotFont.c */
 void InitRotFonts PROTO((void));
Index: /branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaStyles.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaStyles.c	(revision 39729)
+++ /branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaStyles.c	(revision 39729)
@@ -0,0 +1,140 @@
+# include <kapa_internal.h>
+
+KapaLineType KapaLineTypeFromString (char *string) {
+
+  char *endptr;
+
+  int iValue = strtol (string, &endptr, 10);
+  if (*endptr == 0) {
+    if ((iValue > KAPA_LINE_INVALID_MIN) && 
+	(iValue < KAPA_LINE_INVALID_MAX)) {
+      return iValue;
+    }
+    // silently return a valid value?
+    return KAPA_LINE_SOLID;
+  }
+
+  if (!strcasecmp (string,  "solid"))     return KAPA_LINE_SOLID;
+  if (!strcasecmp (string,  "dot"))       return KAPA_LINE_DOT;
+  if (!strcasecmp (string,  "longdash"))  return KAPA_LINE_DASH_LONG;
+  if (!strcasecmp (string,  "shortdash")) return KAPA_LINE_DASH_SHORT;
+  if (!strcasecmp (string,  "dotdash"))   return KAPA_LINE_DOT_DASH;
+
+  if (!strcasecmp (string,  "dash"))      return KAPA_LINE_DASH_LONG;
+  if (!strcasecmp (string,  "dashdot"))   return KAPA_LINE_DOT_DASH;
+
+  return KAPA_LINE_SOLID;
+}
+
+KapaPlotStyle KapaPlotStyleFromString (char *string) {
+
+  char *endptr;
+
+  int iValue = strtol (string, &endptr, 10);
+  if (*endptr == 0) {
+    if ((iValue > KAPA_PLOT_INVALID_MIN) && 
+	(iValue < KAPA_PLOT_INVALID_MAX)) {
+      return iValue;
+    }
+    // silently return a valid value?
+    return KAPA_PLOT_POINTS;
+  }
+
+  if (!strcasecmp (string,  "points"))    return KAPA_PLOT_POINTS;
+  if (!strcasecmp (string,  "pts"))       return KAPA_PLOT_POINTS;
+  if (!strcasecmp (string,  "connect"))   return KAPA_PLOT_CONNECT;
+  if (!strcasecmp (string,  "line"))      return KAPA_PLOT_CONNECT;
+  if (!strcasecmp (string,  "histogram")) return KAPA_PLOT_HISTOGRAM;
+
+  if (strlen(string) > 2) {
+    if (!strncasecmp (string, "histogram", strlen(string))) return KAPA_PLOT_HISTOGRAM;
+    if (!strncasecmp (string, "connect",   strlen(string))) return KAPA_PLOT_CONNECT;
+    if (!strncasecmp (string, "points",    strlen(string))) return KAPA_PLOT_POINTS;
+  }
+  // silently return a valid value?
+  return KAPA_PLOT_POINTS;
+}
+
+KapaPointStyle KapaPointStyleFromString (char *string) {
+
+  char *endptr;
+
+  int iValue = strtol (string, &endptr, 10);
+  if (*endptr == 0) {
+    // note that PAIR_CONNECT was historically 100 [outside MIN - MAX]
+    if (iValue == KAPA_POINT_PAIR_CONNECT) return iValue;
+    if ((iValue > KAPA_POINT_INVALID_MIN) && 
+	(iValue < KAPA_POINT_INVALID_MAX)) {
+      return iValue;
+    }
+    // silently return a valid value?
+    return KAPA_POINT_BOX_SOLID;
+  }
+
+  if (!strcasecmp (string,  "box"))              return KAPA_POINT_BOX_SOLID;
+  if (!strcasecmp (string,  "circle"))           return KAPA_POINT_CIRCLE_SOLID        ;
+  if (!strcasecmp (string,  "cross"))            return KAPA_POINT_CROSS               ;
+  if (!strcasecmp (string,  "fbox"))             return KAPA_POINT_BOX_SOLID;
+  if (!strcasecmp (string,  "fcircle"))          return KAPA_POINT_CIRCLE_SOLID        ;
+  if (!strcasecmp (string,  "fhexagon"))         return KAPA_POINT_HEXAGON             ;
+  if (!strcasecmp (string,  "fpentagon"))        return KAPA_POINT_PENTAGON            ;
+  if (!strcasecmp (string,  "ftriangle"))        return KAPA_POINT_TRIANGLE_SOLID      ;
+  if (!strcasecmp (string,  "ftriangledown"))    return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+  if (!strcasecmp (string,  "ftridown"))         return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+  if (!strcasecmp (string,  "hexagon"))          return KAPA_POINT_HEXAGON             ;
+  if (!strcasecmp (string,  "obox"))             return KAPA_POINT_BOX_OPEN;
+  if (!strcasecmp (string,  "ocircle"))          return KAPA_POINT_CIRCLE_OPEN         ;
+  if (!strcasecmp (string,  "openbox"))          return KAPA_POINT_BOX_OPEN            ;
+  if (!strcasecmp (string,  "opencircle"))       return KAPA_POINT_CIRCLE_OPEN         ;
+  if (!strcasecmp (string,  "opentriangle"))     return KAPA_POINT_TRIANGLE_OPEN       ;
+  if (!strcasecmp (string,  "opentriangledown")) return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+  if (!strcasecmp (string,  "otriangle"))        return KAPA_POINT_TRIANGLE_OPEN       ;
+  if (!strcasecmp (string,  "otriangledown"))    return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+  if (!strcasecmp (string,  "otridown"))         return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+  if (!strcasecmp (string,  "pairs"))            return KAPA_POINT_PAIR_CONNECT;
+  if (!strcasecmp (string,  "pentagon"))         return KAPA_POINT_PENTAGON            ;
+  if (!strcasecmp (string,  "plus"))             return KAPA_POINT_CROSS               ;
+  if (!strcasecmp (string,  "solidtriangle"))    return KAPA_POINT_TRIANGLE_SOLID      ;
+  if (!strcasecmp (string,  "triangle"))         return KAPA_POINT_TRIANGLE_SOLID      ;
+  if (!strcasecmp (string,  "triangledown"))     return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+  if (!strcasecmp (string,  "tridown"))          return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+  if (!strcasecmp (string,  "x"))                return KAPA_POINT_X                   ;
+  if (!strcasecmp (string,  "y"))                return KAPA_POINT_Y                   ;
+  if (!strcasecmp (string,  "ydown"))            return KAPA_POINT_Y_DOWN              ;
+
+  int Nchar = strlen(string);
+  if (Nchar > 2) {
+    if (!strncasecmp (string,  "box", Nchar))              return KAPA_POINT_BOX_SOLID           ;
+    if (!strncasecmp (string,  "circle", Nchar))           return KAPA_POINT_CIRCLE_SOLID        ;
+    if (!strncasecmp (string,  "cross", Nchar))            return KAPA_POINT_CROSS               ;
+    if (!strncasecmp (string,  "fbox", Nchar))             return KAPA_POINT_BOX_SOLID;
+    if (!strncasecmp (string,  "fcircle", Nchar))          return KAPA_POINT_CIRCLE_SOLID        ;
+    if (!strncasecmp (string,  "fhexagon", Nchar))         return KAPA_POINT_HEXAGON             ;
+    if (!strncasecmp (string,  "fpentagon", Nchar))        return KAPA_POINT_PENTAGON            ;
+    if (!strncasecmp (string,  "ftriangle", Nchar))        return KAPA_POINT_TRIANGLE_SOLID      ;
+    if (!strncasecmp (string,  "ftriangledown", Nchar))    return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+    if (!strncasecmp (string,  "ftridown", Nchar))         return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+    if (!strncasecmp (string,  "hexagon", Nchar))          return KAPA_POINT_HEXAGON             ;
+    if (!strncasecmp (string,  "obox", Nchar))             return KAPA_POINT_BOX_OPEN;
+    if (!strncasecmp (string,  "ocircle", Nchar))          return KAPA_POINT_CIRCLE_OPEN         ;
+    if (!strncasecmp (string,  "openbox", Nchar))          return KAPA_POINT_BOX_OPEN            ;
+    if (!strncasecmp (string,  "opencircle", Nchar))       return KAPA_POINT_CIRCLE_OPEN         ;
+    if (!strncasecmp (string,  "opentriangle", Nchar))     return KAPA_POINT_TRIANGLE_OPEN       ;
+    if (!strncasecmp (string,  "opentriangledown", Nchar)) return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+    if (!strncasecmp (string,  "opentridown", Nchar))      return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+    if (!strncasecmp (string,  "otriangle", Nchar))        return KAPA_POINT_TRIANGLE_OPEN       ;
+    if (!strncasecmp (string,  "otriangledown", Nchar))    return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+    if (!strncasecmp (string,  "otridown", Nchar))         return KAPA_POINT_TRIANGLE_OPEN_DOWN  ;
+    if (!strncasecmp (string,  "pairs", Nchar))            return KAPA_POINT_PAIR_CONNECT;
+    if (!strncasecmp (string,  "pentagon", Nchar))         return KAPA_POINT_PENTAGON            ;
+    if (!strncasecmp (string,  "plus", Nchar))             return KAPA_POINT_CROSS               ;
+    if (!strncasecmp (string,  "solidtriangle", Nchar))    return KAPA_POINT_TRIANGLE_SOLID      ;
+    if (!strncasecmp (string,  "triangle", Nchar))         return KAPA_POINT_TRIANGLE_SOLID      ;
+    if (!strncasecmp (string,  "triangledown", Nchar))     return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+    if (!strncasecmp (string,  "tridown", Nchar))          return KAPA_POINT_TRIANGLE_SOLID_DOWN ;
+    if (!strncasecmp (string,  "ydown", Nchar))            return KAPA_POINT_Y_DOWN              ;
+  }
+
+  return KAPA_POINT_BOX_SOLID;
+}
+
Index: /branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaWindow.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaWindow.c	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaWindow.c	(revision 39729)
@@ -449,2 +449,3 @@
   return (TRUE);
 }
+
Index: /branches/czw_branch/20160809/Ohana/src/libkapa/src/bDrawFuncs.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/libkapa/src/bDrawFuncs.c	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/libkapa/src/bDrawFuncs.c	(revision 39729)
@@ -222,6 +222,16 @@
   e = 0;
   for (X = X1, N = 0; X <= X2; X++, N++) {
-    if (buffer->bType == 1) { DashOn = (N % 10) < 5; }
-    if (buffer->bType == 2) { DashOn = (N % 6) < 3; }
+    if (buffer->bType == KAPA_LINE_DOT) {
+      DashOn = (N % 5) == 0 || (N % 5) == 1;
+    }
+    if (buffer->bType == KAPA_LINE_DASH_SHORT) {
+      DashOn = (N % 8) < 4;
+    }
+    if (buffer->bType == KAPA_LINE_DASH_LONG) {
+      DashOn = (N % 16) < 8;
+    }
+    if (buffer->bType == KAPA_LINE_DOT_DASH) {
+      DashOn = ((N % 12) < 2) || ((N % 12 >= 6) && (N % 12 < 10)) ;
+    }
     if (swapcoords) {
       if (DashOn) bDrawPoint (buffer, Y,X);
Index: /branches/czw_branch/20160809/Ohana/src/opihi/lib.data/style_args.c
===================================================================
--- /branches/czw_branch/20160809/Ohana/src/opihi/lib.data/style_args.c	(revision 39728)
+++ /branches/czw_branch/20160809/Ohana/src/opihi/lib.data/style_args.c	(revision 39729)
@@ -29,5 +29,5 @@
   if ((N = get_argument (*argc, argv, "-lt"))) {
     remove_argument (N, argc, argv);
-    graphmode[0].ltype = atof(argv[N]);
+    graphmode[0].ltype = KapaLineTypeFromString(argv[N]);
     remove_argument (N, argc, argv);
   }
@@ -39,5 +39,5 @@
   if ((N = get_argument (*argc, argv, "-pt"))) {
     remove_argument (N, argc, argv);
-    graphmode[0].ptype = atof(argv[N]);
+    graphmode[0].ptype = KapaPointStyleFromString(argv[N]);
     remove_argument (N, argc, argv);
   }
@@ -63,5 +63,5 @@
   if ((N = get_argument (*argc, argv, "-x"))) {
     remove_argument (N, argc, argv);
-    graphmode[0].style = atof(argv[N]);
+    graphmode[0].style = KapaPlotStyleFromString(argv[N]);
     remove_argument (N, argc, argv);
   }
