Index: trunk/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 31665)
@@ -5,4 +5,5 @@
 # define FillRectangle(X1,Y1,X2,Y2) (XFillRectangle (graphic->display, graphic->window, graphic->gc, (int)(X1), (int)(Y1), (int)(X2), (int)(Y2)))
 # define DrawCircle(X,Y,R) (XDrawArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R), abs(2*R), 0, 23040))
+# 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
@@ -70,5 +71,8 @@
   }
 
-  XSetForeground (graphic->display, graphic->gc, graphic->color[object[0].color]);
+  // negative color values mean "scale color with object.z"
+  if (object[0].color >= 0) {
+    XSetForeground (graphic->display, graphic->gc, graphic->color[object[0].color]);
+  }
 
   switch (object[0].style) {
@@ -371,5 +375,5 @@
   float *x, *y, *z;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
-  int sx, sy, sx1, sy1, sx2, sy2, d, D;
+  int sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
   
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -386,343 +390,226 @@
   by = byi + byj;
   
+  Graphic *graphic = GetGraphic();
+
   /**** points are scaled by object.z ***/
-  if (object[0].size < 0) {
-    d = 0.5 * (graphic->dx + graphic->dy) * 0.01;
-    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))
-	{
-	  D = d*z[i];
-	  FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
-	}
-      }
-    }
-    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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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))
-	{
-	  D = d*z[i];
-	  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 == 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);
-      }
-    }
-  } 
-  /**** points are not scaled by object.z ***/
-  /** some rules on how the points are drawn:
-      1) the smallest point is always a dot (single pixel)
-      2) the point shape should be invarient on position
-      3) center of point is always center of a pixel
-   **/
-  else {
-    d = (int)(object[0].size * hypot((float)graphic->dx, (float)graphic->dy) * 0.003);
-    x = object[0].x; y = object[0].y;
-
-    if (object[0].ptype == 0) {	/* filled box : OK */
-      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))
-	{
-	  FillRectangle (sx - d, sy - d, 2*d + 1, 2*d + 1);
-	}
-      }
-    }
-    if (object[0].ptype == 1) { /* open box : OK*/
-      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))
-	{
-	  DrawRectangle (sx - d, sy - d, 2*d, 2*d);
-	}
-      }
-    }
-    if (object[0].ptype == 2) { /* cross : OK*/
-      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))
-	{
- 	  DrawLine (sx - d, sy, sx + d + 1, sy); // DrawLine does NOT draw the end pixel
-	  DrawLine (sx, sy - d, sx, sy + d + 1);
-	}
-      }
-    }
-    if (object[0].ptype == 3) { /* x : OK */
-      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))
-	{
-	  /* XDrawLine is a little funny, this is needed to fix endpost errors */
-	  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))
-	{
-	  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))
-	{
-	  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))
-	{
-	  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))
-	{
-	  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))
-	{
-	  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) {	/* 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))
-	{
-	  DrawLine (sx - 1.00*d, sy + 0.00*d, 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 + 1.00*d, sy + 0.00*d);
-	  DrawLine (sx + 1.00*d, sy + 0.00*d, 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 - 1.00*d, sy + 0.00*d);
-	}
-      }
-    }
-    if (object[0].ptype == 100) {	
-      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;
-	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);
-      }
+  int scaleSize = (object[0].size < 0);
+  int scaleColor = (object[0].color < 0);
+
+  ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
+  dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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 == 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);
     }
   }
Index: trunk/Ohana/src/kapa2/src/LoadObject.c
===================================================================
--- trunk/Ohana/src/kapa2/src/LoadObject.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/LoadObject.c	(revision 31665)
@@ -38,7 +38,11 @@
 		      graph[0].objects[N].lweight, graph[0].objects[N].size);
   
-  /* force valid ranges */
-  if ((graph[0].objects[N].color > KapaColormapSize()) || (graph[0].objects[N].color < 0))
-    graph[0].objects[N].color = 0;
+  // limit color ranges (negative is allowed for ptype == 2 --> color scaled by z
+  if (graph[0].objects[N].color >= KapaColormapSize()) {
+      graph[0].objects[N].color = KapaColormapSize() - 1;
+  }
+  if ((graph[0].objects[N].style != 2) && (graph[0].objects[N].color < 0)) {
+      graph[0].objects[N].color = 0;
+  }
 
   KiiScanMessage (sock, "%lf %lf %lf %lf",
@@ -64,5 +68,5 @@
     REALLOCATE (graph[0].objects, Gobjects, MAX (1, graph[0].Nobjects));
   }
-  if (graph[0].objects[N].size < 0.0) {
+  if ((graph[0].objects[N].size < 0.0) || (graph[0].objects[N].color < 0.0)) {
     if (!LoadVectorData (sock, graph, N, "z")) {
       FreeObjectData (&graph[0].objects[N]);
Index: trunk/Ohana/src/kapa2/src/PNGit.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PNGit.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/PNGit.c	(revision 31665)
@@ -1,9 +1,3 @@
 # include "Ximage.h"
-
-/* I almost have PNG images + plots working.  I need to do a few more things:
-   1) decide on the dimensions of the output image/plot file -- like the jpeg covering the pixels? adjust the box to include the full plot box?
-   2) update bDraw to either write palette values (as now) or RGB values into the buffer
-   3) decision on output based on the existence of images or not
-*/
 
 int PNGcommand (int sock) {
@@ -22,9 +16,8 @@
   png_structp png_ptr;
   png_infop info_ptr;
-  int i, status, Npalette, Nsection;
+  int status, Npalette;
   bDrawBuffer *buffer = NULL;
   Graphic *graphic = NULL;
   png_color *palette = NULL;
-  Section *section;
 
   graphic = GetGraphic();
@@ -68,15 +61,24 @@
   palette = KapaPNGPalette (&Npalette);
 
+  /* before we allowed colormap-scaled points, we had the option of writing an image using a
+     limited palette.  we could get smart and check all objects to see if any of them use
+     scaled colors and choose a limited palette if not. but maybe that is not worth the effort.
+  */
+
+# if (0)
   // do we have an image in any of the sections?
-  Nsection = GetNumberOfSections ();
+  int Nsection = GetNumberOfSections ();
   int haveImage = FALSE;
+  int i;
   for (i = 0; !haveImage && (i < Nsection); i++) {
-    section = GetSectionByNumber (i);
+    Section *section = GetSectionByNumber (i);
     haveImage = (section->image != NULL);
   }
+# else 
+  int haveImage = TRUE;
+# endif
 
   /* see docs for write-row-callback to provide progress info */
   if (haveImage) {
-    // png_set_IHDR (png_ptr, info_ptr, graphic->dx, graphic->dy, 16, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
     png_set_IHDR (png_ptr, info_ptr, graphic->dx, graphic->dy, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
     png_set_sRGB (png_ptr, info_ptr, PNG_sRGB_INTENT_ABSOLUTE);
@@ -95,5 +97,4 @@
   if (haveImage) {
     buffer = bDrawIt (palette, Npalette, 3);
-    // bDrawImage (buffer, graphic);
   } else {
     buffer = bDrawIt (palette, Npalette, 1);
Index: trunk/Ohana/src/kapa2/src/PSObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PSObjects.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/PSObjects.c	(revision 31665)
@@ -2,7 +2,8 @@
 
 # define DrawLine(X1,Y1,X2,Y2) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f L\n", X1, graphic->dy - Y1, X2, graphic->dy - Y2))
-# define DrawCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f C\n", (X1), (graphic->dy - Y1), (R)))
 # define DrawRectangle(X,Y,dX,dY) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f B\n", (dX), (dY), (X-0.5*dX), (graphic->dy-Y-0.5*dY)))
 # define FillRectangle(X,Y,dX,dY) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f F\n", (dX), (dY), (X-0.5*dX), (graphic->dy-Y-0.5*dY)))
+# define DrawCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f C\n", (X1), (graphic->dy - Y1), (R)))
+# 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
@@ -37,5 +38,8 @@
     lweight = MAX (0, MIN (10, graph[0].objects[i].lweight));
     fprintf (f, "%.1f setlinewidth\n", lweight);
-    fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(graph[0].objects[i].color));
+
+    if (graph[0].objects[i].color >= 0) {
+	fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(graph[0].objects[i].color));
+    }
 
     switch (graph[0].objects[i].style) {
@@ -270,5 +274,6 @@
   float *x, *y, *z;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
-  double sx, sy, d, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1;
+  double sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
+  float *pixel1, *pixel2, *pixel3;
 
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -285,324 +290,255 @@
   by = byi + byj;
   
-  /* below here, code is identical with DrawObjects */
+  Graphic *graphic = GetGraphic();
+
+  ALLOCATE (pixel1, float, graphic[0].Npixels);
+  ALLOCATE (pixel2, float, graphic[0].Npixels);
+  ALLOCATE (pixel3, float, graphic[0].Npixels);
+
+  /** cmap[i].pixel must be defined even if X is not used **/
+  for (i = 0; i < graphic[0].Npixels; i++) { /* set up pixel array */
+    pixel1[i] = graphic[0].cmap[i].red / (float) 0xffff;
+    pixel2[i] = graphic[0].cmap[i].green / (float) 0xffff;
+    pixel3[i] = graphic[0].cmap[i].blue / (float) 0xffff;
+  }
+
+  // black, I think
+  // fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
+
   /**** points are scaled by object.z ***/
-  if (object[0].size < 0) {
-    d = 0.5 * (graphic->dx + graphic->dy) * 0.01;
-    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))
-	  {
-	    FillRectangle (sx, sy, 2*d*z[i], 2*d*z[i]);
-	  }
-      }
-    }
-    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))
-	  {
-	    DrawRectangle (sx, sy, 2*d*z[i], 2*d*z[i]);
-	  }
-      }
-    }
-    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))
-	  {
-	    DrawLine (sx - d*z[i], sy, sx + d*z[i], sy);
-	    DrawLine (sx, sy - d*z[i], sx, sy + d*z[i]);
-	  }
-      }
-    }
-    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))
-	  {
-	    DrawLine (sx + d*z[i], sy - d*z[i], sx - d*z[i], sy + d*z[i]);
-	    DrawLine (sx - d*z[i], sy - d*z[i], sx + d*z[i], sy + d*z[i]);
-	  }
-      }
-    }
-    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))
-	  {
-	    FillTriangle (sx - d*z[i], sy - 0.58*d*z[i], sx + d*z[i], sy - 0.58*d*z[i], sx, sy + 1.15*d*z[i]);
-	    /*
-	    DrawLine (sx - d*z[i], sy + 0.58*d*z[i], sx + d*z[i], sy + 0.58*d*z[i]);
-	    DrawLine (sx + d*z[i], sy + 0.58*d*z[i], sx,          sy - 1.15*d*z[i]);
-	    DrawLine (sx,          sy - 1.15*d*z[i], sx - d*z[i], sy + 0.58*d*z[i]);
-	    */
-	  }
-      }
-    }
-    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))
-	  {
-	    DrawLine (sx - d*z[i], sy - 0.58*d*z[i], sx + d*z[i], sy - 0.58*d*z[i]);
-	    DrawLine (sx + d*z[i], sy - 0.58*d*z[i], sx,          sy + 1.15*d*z[i]);
-	    DrawLine (sx,          sy + 1.15*d*z[i], sx - d*z[i], sy - 0.58*d*z[i]);
-	  }
-      }
-    }
-    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))
-	  {
-	    DrawLine (sx, sy, sx - d*z[i], sy + 0.58*d*z[i]);
-	    DrawLine (sx, sy, sx + d*z[i], sy + 0.58*d*z[i]);
-	    DrawLine (sx, sy, sx,          sy - 1.15*d*z[i]);
-	  }
-      }
-    }
-    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))
-	  {
-	    DrawCircle (sx, sy, d*z[i]);
-	  }
-      }
-    }
-    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))
-	{
-	  DrawLine (sx + 0.00*d*z[i], sy + 1.00*d*z[i], sx + 0.95*d*z[i], sy + 0.31*d*z[i]);
-	  DrawLine (sx + 0.95*d*z[i], sy + 0.31*d*z[i], sx + 0.58*d*z[i], sy - 0.81*d*z[i]);
-	  DrawLine (sx + 0.58*d*z[i], sy - 0.81*d*z[i], sx - 0.58*d*z[i], sy - 0.81*d*z[i]);
-	  DrawLine (sx - 0.58*d*z[i], sy - 0.81*d*z[i], sx - 0.95*d*z[i], sy + 0.31*d*z[i]);
-	  DrawLine (sx - 0.95*d*z[i], sy + 0.31*d*z[i], sx + 0.00*d*z[i], sy + 1.00*d*z[i]);
-	}
-      }
-    }
-    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))
-	{
-	  DrawLine (sx -      d*z[i], sy,               sx - 0.50*d*z[i], sy + 0.87*d*z[i]);
-	  DrawLine (sx - 0.50*d*z[i], sy + 0.87*d*z[i], sx + 0.50*d*z[i], sy + 0.87*d*z[i]);
-	  DrawLine (sx + 0.50*d*z[i], sy + 0.87*d*z[i], sx +      d*z[i], sy);
-
-	  DrawLine (sx +      d*z[i], sy,               sx + 0.50*d*z[i], sy - 0.87*d*z[i]);
-	  DrawLine (sx + 0.50*d*z[i], sy - 0.87*d*z[i], sx - 0.50*d*z[i], sy - 0.87*d*z[i]);
-	  DrawLine (sx - 0.50*d*z[i], sy - 0.87*d*z[i], sx -      d*z[i], sy);
-	}
-      }
-    }
-    if (object[0].ptype == 100) {	/* connect a pair of points */
-	X0 = graph[0].axis[0].fx;
-	X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
-	Y0 = graph[0].axis[1].fy;
-	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);
-      }
-    }
-  } else {
-    d = object[0].size * 0.5 * (graphic->dx + graphic->dy) * 0.003;
-    x = object[0].x; y = object[0].y;
-    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))
-	  {
-	    FillRectangle (sx, sy, 2*d, 2*d);
-	  }
-      }
-    }
-    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))
-	  {
-	    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))
-	  {
-	    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))
-	  {
-	    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))
-	  {
-	    /*
-	    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);
-	    */
-	    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))
-	  {
-	    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))
-	  {
-	    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))
-	  {
-	    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))
-	{
-	  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) {	/* 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))
-	{
-	  DrawLine (sx - 1.00*d, sy + 0.00*d, 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 + 1.00*d, sy + 0.00*d);
-	  DrawLine (sx + 1.00*d, sy + 0.00*d, 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 - 1.00*d, sy + 0.00*d);
-	}
-      }
-    }
-    if (object[0].ptype == 100) {	
-	X0 = graph[0].axis[0].fx;
-	X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
-	Y0 = graph[0].axis[1].fy;
-	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);
-      }
-    }
-  }
+  int scaleSize = (object[0].size < 0);
+  int scaleColor = (object[0].color < 0);
+
+  ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
+  dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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);
+	/*
+	  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 == 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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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) {
+	  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);
+    }
+  }
+
+  free (pixel1);
+  free (pixel2);
+  free (pixel3);
 }
     
Index: trunk/Ohana/src/kapa2/src/PSit.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PSit.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/PSit.c	(revision 31665)
@@ -76,4 +76,6 @@
   fprintf (f, " 0 exch rlineto -1 mul 0 rlineto closepath fill stroke } def\n");
   fprintf (f, "/C {0 360 arc stroke} def\n");
+  fprintf (f, "/FC {0 360 arc fill stroke} def\n");
+  fprintf (f, "/RGB {setrgbcolor} def\n");
   fprintf (f, "/L {newpath moveto lineto stroke} def\n\n");
   fprintf (f, "/TF {newpath moveto lineto lineto fill stroke} def\n\n");
Index: trunk/Ohana/src/kapa2/src/SetChannel.c
===================================================================
--- trunk/Ohana/src/kapa2/src/SetChannel.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/SetChannel.c	(revision 31665)
@@ -39,25 +39,25 @@
   Graphic *graphic;
   Section *section;
-  KapaImageWidget *image;
   char colormap[256];
   int status;
 
+  KiiScanMessage (sock, "%s", colormap);
+  status = SetColormap (colormap);
+  if (!status) { 
+      fprintf (stderr, "unknown colormap %s\n", colormap);
+      return (TRUE);
+  }
+
   graphic = GetGraphic ();
   section = GetActiveSection();
-  if (section->image == NULL) {
-    section->image = InitImageWidget ();
-    SetSectionSizes (section);
+  if (section->image) {
+    // section->image = InitImageWidget ();
+    // SetSectionSizes (section);
+    // image = section->image;
+    SetColorScale (graphic, section->image);
+    if (!USE_XWINDOW) return (TRUE);
+    Remap (graphic, section->image);
   }
-  image = section->image;
 
-  KiiScanMessage (sock, "%s", colormap);
-
-  status = SetColormap (colormap);
-  if (!status) fprintf (stderr, "unknown colormap %s\n", colormap);
-
-  SetColorScale (graphic, image);
-  if (!USE_XWINDOW) return (TRUE);
-
-  Remap (graphic, image);
   Refresh ();
   XFlush (graphic[0].display);
Index: trunk/Ohana/src/kapa2/src/bDrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/bDrawObjects.c	(revision 31664)
+++ trunk/Ohana/src/kapa2/src/bDrawObjects.c	(revision 31665)
@@ -2,7 +2,8 @@
 
 # define DrawLine(BUF,X1,Y1,X2,Y2) (bDrawLine (BUF, (X1), (Y1), (X2), (Y2)))
-# define DrawCircle(BUF,X1,Y1,R) (bDrawCircle (BUF, (X1), (Y1), (R)))
 # define DrawRectangle(BUF,X,Y,dX,dY) (bDrawRectOpen (BUF, (X-0.5*dX), (Y-0.5*dY), (X+0.5*dX), (Y+0.5*dY)))
 # define FillRectangle(BUF,X,Y,dX,dY) (bDrawRectFill (BUF, (X-0.5*dX), (Y-0.5*dY), (X+0.5*dX+1), (Y+0.5*dY+1)))
+# define DrawCircle(BUF,X1,Y1,R) (bDrawCircle (BUF, (X1), (Y1), (R)))
+# define FillCircle(BUF,X1,Y1,R) (bDrawCircleFill (BUF, (X1), (Y1), (R)))
 # define FillTriangle(BUF,X1,Y1,dX,dY) (bDrawTriFill (BUF, (X1), (Y1), (dX), (dY)))
 # define OpenTriangle(BUF,X1,Y1,X2,Y2,X3,Y3) (bDrawTriOpen (BUF, (X1), (Y1), (X2), (Y2), (X3), (Y3)))
@@ -260,5 +261,6 @@
   float *x, *y, *z;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
-  int sx, sy, sx1, sy1, sx2, sy2, d, D;
+  int sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
+  unsigned char *pixel1, *pixel2, *pixel3;
 
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -275,323 +277,268 @@
   by = byi + byj;
   
-  /* below here, code is identical with DrawObjects */
+  Graphic *graphic = GetGraphic();
+
+  ALLOCATE (pixel1, unsigned char, graphic[0].Npixels);
+  ALLOCATE (pixel2, unsigned char, graphic[0].Npixels);
+  ALLOCATE (pixel3, unsigned char, graphic[0].Npixels);
+
+  /** cmap[i].pixel must be defined even if X is not used **/
+  for (i = 0; i < graphic[0].Npixels; i++) { /* set up pixel array */
+    pixel1[i] = graphic[0].cmap[i].red >> 8;
+    pixel2[i] = graphic[0].cmap[i].green >> 8;
+    pixel3[i] = graphic[0].cmap[i].blue >> 8;
+  }
+
   /**** points are scaled by object.z ***/
-  if (object[0].size < 0) {
-    d = 0.5 * (graphic->dx + graphic->dy) * 0.01;
-    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))
-	{
-	  D = d*z[i];
-	  FillRectangle (buffer, sx, sy, 2*D, 2*D);
-	}
-      }
-    }
-    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))
-	{
-	  D = d*z[i];
-	  DrawRectangle (buffer, 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))
-	{
-	  D = d*z[i];
-	  DrawLine (buffer, sx - D, sy, sx + D, sy);
-	  DrawLine (buffer, 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))
-	{
-	  D = d*z[i];
-	  DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
-	  DrawLine (buffer, 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))
-	{
-	  D = d*z[i];
-	  // 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);
-	}
-      }
-    }
-    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))
-	{
-	  D = d*z[i];
-	  OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*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))
-	{
-	  D = d*z[i];
-	  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);
-	}
-      }
-    }
-    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))
-	{
-	  D = d*z[i];
-	  DrawCircle (buffer, 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))
-	{
-	  D = d*z[i];
-	  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);
-	}
-      }
-    }
-    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))
-	{
-	  D = d*z[i];
-	  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);
-	}
-      }
-    }
-    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);
-      }
-    }
-  } else {
-    d = (int)(object[0].size * hypot((float)graphic->dx, (float)graphic->dy) * 0.003);
-    x = object[0].x; y = object[0].y;
-
-    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))
-	{
-	  FillRectangle (buffer, sx, sy, 2*d, 2*d);
-	}
-      }
-    }
-    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))
-	{
-	  DrawRectangle (buffer, sx, sy, 2*d, 2*d);
-	}
-      }
-    }
-    if (object[0].ptype == 2) { /* cross : OK */
-      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))
-	{
-	  DrawLine (buffer, sx - d, sy, sx + d, sy);
-	  DrawLine (buffer, 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))
-	{
-	  DrawLine (buffer, sx + d, sy - d, sx - d, sy + d);
-	  DrawLine (buffer, 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))
-	{
-	  FillTriangle (buffer, sx, sy + 0.58*d, d, -1.73*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))
-	{
-	  OpenTriangle (buffer, sx - d, sy + 0.58*d, sx + d, sy + 0.58*d, sx, sy - 1.15*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))
-	{
-	  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);
-	}
-      }
-    }
-    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))
-	{
-	  DrawCircle (buffer, 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))
-	{
-	  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);
-	}
-      }
-    }
-    if (object[0].ptype == 9) {	/* 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))
-	{
-	  DrawLine (buffer, sx - 1.00*d, sy + 0.00*d, 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 + 1.00*d, sy + 0.00*d);
-	  DrawLine (buffer, sx + 1.00*d, sy + 0.00*d, 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 - 1.00*d, sy + 0.00*d);
-	}
-      }
-    }
-    if (object[0].ptype == 100) {	
-
-      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);
-      }
-    }
-  }
+  int scaleSize = (object[0].size < 0);
+  int scaleColor = (object[0].color < 0);
+
+  ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
+  dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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) {
+	  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);
+      }
+    }
+  }
+  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);
+    }
+  }
+
+  free (pixel1);
+  free (pixel2);
+  free (pixel3);
 }
     
Index: trunk/Ohana/src/kapa2/test/zcplot.sh
===================================================================
--- trunk/Ohana/src/kapa2/test/zcplot.sh	(revision 31665)
+++ trunk/Ohana/src/kapa2/test/zcplot.sh	(revision 31665)
@@ -0,0 +1,12 @@
+
+macro test.zcplot
+  create x 0 10
+  lim x x; clear; box; 
+  for i 0 11
+    zcplot x {x + 0.25*$i} x 0 10 -pt $i -sz 3
+  end
+  tvcolors rainbow
+
+  png -name test.png  
+  ps -name test.ps
+end
