Index: /branches/eam_branches/ipp-20110505/Ohana/Makefile.in
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/Makefile.in	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/Makefile.in	(revision 31615)
@@ -76,39 +76,39 @@
 	mkdir -p $(DESTLIB)
 	mkdir -p $(DESTBIN)
-	for i in $(LIBS); do make $$i.install || exit 1; done
+	for i in $(LIBS); do $(MAKE) $$i.install || exit 1; done
 	chmod +x ohana-config
 	cp -f ohana-config $(DESTBIN)/
 
 bins: 
-	for i in $(PROGRAM); do make $$i; done
+	for i in $(PROGRAM); do $(MAKE) $$i; done
 
 all:
-	make libs || exit 1
-	for i in $(PROGRAM); do make $$i || exit 1; done
+	$(MAKE) libs || exit 1
+	for i in $(PROGRAM); do $(MAKE) $$i || exit 1; done
 
 extras:
-	for i in $(EXTRAS); do make $$i || exit 1; done
+	for i in $(EXTRAS); do $(MAKE) $$i || exit 1; done
 
 pantasks:
-	make libs || exit 1
-	cd src/opihi; make pclient.install && exit 1
-	cd src/opihi; make pcontrol.install && exit 1
-	cd src/opihi; make pantasks.install && exit 1
+	$(MAKE) libs || exit 1
+	cd src/opihi; $(MAKE) pclient.install && exit 1
+	cd src/opihi; $(MAKE) pcontrol.install && exit 1
+	cd src/opihi; $(MAKE) pantasks.install && exit 1
 
 mana:
-	make libs
-	make kapa2.install
-	cd src/opihi; make mana.install && exit 1
+	$(MAKE) libs
+	$(MAKE) kapa2.install
+	cd src/opihi; $(MAKE) mana.install && exit 1
 
 dvoshell:
-	make libs
-	make kapa2.install
-	cd src/opihi; make dvo.install && exit 1
+	$(MAKE) libs
+	$(MAKE) kapa2.install
+	cd src/opihi; $(MAKE) dvo.install && exit 1
 
 clean:
 	@if [ "$(ARCH)" = "" ]; then echo ""; echo " *** please define ARCH ***"; echo; exit 1; fi
-	for i in $(LIBS); do make $$i.clean || exit 1; done
-	for i in $(PROGRAM); do make $$i.clean || exit 1; done
-	for i in $(EXTRAS); do make $$i.clean || exit 1; done
+	for i in $(LIBS); do $(MAKE) $$i.clean || exit 1; done
+	for i in $(PROGRAM); do $(MAKE) $$i.clean || exit 1; done
+	for i in $(EXTRAS); do $(MAKE) $$i.clean || exit 1; done
 	@rm -f `find . -name .mana`
 	@rm -f `find . -name .dvo`
@@ -117,16 +117,16 @@
 dist:
 	@if [ "$(ARCH)" = "" ]; then echo ""; echo " *** please define ARCH ***"; echo; exit 1; fi
-	for i in $(LIBS); do make $$i.dist || exit 1; done
-	for i in $(PROGRAM); do make $$i.dist || exit 1; done
+	for i in $(LIBS); do $(MAKE) $$i.dist || exit 1; done
+	for i in $(PROGRAM); do $(MAKE) $$i.dist || exit 1; done
 	@echo -n -e "\0033]0; *** Ohana: done $@ *** \0007" \
 
 install:
 	@if [ "$(ARCH)" = "" ]; then echo ""; echo " *** please define ARCH ***"; echo; exit 1; fi
-	for i in $(LIBS); do make $$i.install || exit 1; done
-	for i in $(PROGRAM); do make $$i.install || exit 1; done
+	for i in $(LIBS); do $(MAKE) $$i.install || exit 1; done
+	for i in $(PROGRAM); do $(MAKE) $$i.install || exit 1; done
 	@echo -n -e "\0033]0; *** Ohana: done $@ *** \0007" \
 
 install.extras:
-	for i in $(EXTRAS); do make $$i.install || exit 1; done
+	for i in $(EXTRAS); do $(MAKE) $$i.install || exit 1; done
 	@echo -n -e "\0033]0; *** Ohana: done $@ *** \0007" \
 
@@ -135,5 +135,5 @@
 	@if [ -d "src/$@" ]; then \
 	  echo -n -e "\0033]0; *** Ohana: $@ *** \0007"; \
-	  (cd src/$@ && make); \
+	  (cd src/$@ && $(MAKE)); \
 	fi
 	@echo -n -e "\0033]0; *** Ohana: done $@ *** \0007" \
@@ -142,9 +142,9 @@
 	@echo -n -e "\0033]0; *** Ohana: $@ *** \0007" \
 	mkdir -p bin/$(ARCH)
-	if [ -d "src/$*" ]; then (cd src/$* && make install); fi
+	if [ -d "src/$*" ]; then (cd src/$* && $(MAKE) install); fi
 
 %.clean:
-	if [ -d "src/$*" ]; then (cd src/$* && make clean); fi
+	if [ -d "src/$*" ]; then (cd src/$* && $(MAKE) clean); fi
 
 %.dist:
-	(cd src/$* && make dist)
+	(cd src/$* && $(MAKE) dist)
Index: /branches/eam_branches/ipp-20110505/Ohana/configure.tcsh
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/configure.tcsh	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/configure.tcsh	(revision 31615)
@@ -203,6 +203,6 @@
   set CPPFLAGS = ""
 endif  
-if ($pedantic) set CPPFLAGS = "$CPPFLAGS-Wall -Werror "
-if ($memcheck) set CPPFLAGS = "$CPPFLAGS-DOHANA_MEMORY "
+if ($pedantic) set CPPFLAGS = "$CPPFLAGS -Wall -Werror"
+if ($memcheck) set CPPFLAGS = "$CPPFLAGS -DOHANA_MEMORY"
 
 if (! $?LDFLAGS) then
@@ -540,5 +540,5 @@
   endif
   set haveflag = `echo $f | tr '[:lower:]' '[:upper:]' | tr '.' '_'`
-  set CPPFLAGS = "$CPPFLAGS-DHAVE_$haveflag "
+  set CPPFLAGS = "$CPPFLAGS -DHAVE_$haveflag"
 end
 
Index: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/DrawObjects.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/DrawObjects.c	(revision 31615)
@@ -1,12 +1,18 @@
 # include "Ximage.h"
 
-# define DrawLine(X1,Y1,X2,Y2) (XDrawLine (graphic->display, graphic->window, graphic->gc, (int)(X1+0.5), (int)(Y1+0.5), (int)(X2+0.5), (int)(Y2+0.5)))
-# define DrawRectangle(X1,Y1,X2,Y2) (XDrawRectangle (graphic->display, graphic->window, graphic->gc, (int)(X1+0.5), (int)(Y1+0.5), (int)(X2+0.5), (int)(Y2+0.5)))
-# define FillRectangle(X1,Y1,X2,Y2) (XFillRectangle (graphic->display, graphic->window, graphic->gc, (int)(X1+0.5), (int)(Y1+0.5), (int)(X2+0.5), (int)(Y2+0.5)))
-# define DrawCircle(X,Y,R) (XDrawArc (graphic->display, graphic->window, graphic->gc, (int)(X-R+0.5), (int)(Y-R+0.5), abs(2*R+0.5), abs(2*R+0.5), 0, 23040))
+# define DrawLine(X1,Y1,X2,Y2) (XDrawLine (graphic->display, graphic->window, graphic->gc, (int)(X1), (int)(Y1), (int)(X2), (int)(Y2)))
+# define DrawRectangle(X1,Y1,X2,Y2) (XDrawRectangle (graphic->display, graphic->window, graphic->gc, (int)(X1), (int)(Y1), (int)(X2), (int)(Y2)))
+# 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
 # define HISTOGRAM 1
 # define POINTS 2
+
+# define XCENTER 0.0
+# define YCENTER 0.0
+# define CAPSTYLE CapButt
+# define JOINSTYLE JoinMiter
 
 static Graphic *graphic;
@@ -34,26 +40,39 @@
   // this function calls all of the supporting Draw... functions below
   graphic = GetGraphic();
-
-  lweight = MAX (0, MIN (10, object[0].lweight));
+  
+  lweight = MAX (1, MIN (10, object[0].lweight));
+
+  /** some notes on drawing lines in X:
+
+      "In general, drawing a thin line will be faster than drawing a wide line of width
+      one. However, because of their different drawing algorithms, thin lines may not mix
+      well aesthetically with wide lines. If it is desirable to obtain precise and uniform
+      results across all displays, a client should always use a line-width of one rather
+      than a line-width of zero."  -- http://www.hpc.unimelb.edu.au/nec/g1ae02e/chap7.html
+
+  */
 
   /* set line type */
   switch (object[0].ltype) {
     case 0:
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CapNotLast, JoinMiter);
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CAPSTYLE, JOINSTYLE);
       break;
     case 1:
       XSetDashes (graphic->display, graphic->gc, 100, dash, 2);
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CapNotLast, JoinMiter);
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
       break;
     case 2:
       XSetDashes (graphic->display, graphic->gc, 10, dot, 2);
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CapNotLast, JoinMiter);
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
       break;
     default:
-      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CapNotLast, JoinMiter);
+      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CAPSTYLE, JOINSTYLE);
       break;
   }
 
-  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) {
@@ -76,5 +95,5 @@
   }
 
-  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CapNotLast, JoinMiter);
+  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
   XSetForeground (graphic->display, graphic->gc, graphic->fore);
   return (TRUE);
@@ -111,11 +130,11 @@
   for (i = 0; (i < object[0].Npts) && !(finite(x[i]) && finite(y[i])); i++);
   if (i >= object[0].Npts) return;
-  sx0 = x[i]*mxi + y[i]*mxj + bx;
-  sy0 = x[i]*myi + y[i]*myj + by;
+  sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+  sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
 
   for (i++; i < object[0].Npts; i++) {
     if (!(finite(x[i]) && finite(y[i]))) continue;
-    sx1 = x[i]*mxi + y[i]*mxj + bx;
-    sy1 = x[i]*myi + y[i]*myj + by;
+    sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     
     ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
@@ -213,6 +232,6 @@
 
   /* first valid data point */
-  sx0 = x[i]*mxi + y[i]*mxj + bx;
-  sy0 = x[i]*myi + y[i]*myj + by;
+  sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+  sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
   sx0 = MIN (MAX (sx0, X0), X1);
   sy0 = MAX (MIN (sy0, Y0), Y1);
@@ -223,6 +242,6 @@
 
   /* second valid data point */
-  sx1 = x[i]*mxi + y[i]*mxj + bx;
-  sy1 = x[i]*myi + y[i]*myj + by;
+  sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+  sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
   sx1 = MIN (MAX (sx1, X0), X1);
   sy1 = MAX (MIN (sy1, Y0), Y1);
@@ -246,6 +265,6 @@
   for (i++; i < object[0].Npts; i++) {
     if (!(finite(x[i]) && finite(y[i]))) continue;
-    sx1 = x[i]*mxi + y[i]*mxj + bx;
-    sy1 = x[i]*myi + y[i]*myj + by;
+    sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     sx1 = MIN (MAX (sx1, X0), X1);
     sy1 = MAX (MIN (sy1, Y0), Y1);
@@ -298,6 +317,6 @@
 
   /* first valid data point */
-  sx0 = x[i]*mxi + y[i]*mxj + bx;
-  sy0 = x[i]*myi + y[i]*myj + by;
+  sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+  sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
   sx0 = MIN (MAX (sx0, X0), X1);
   sy0 = MAX (MIN (sy0, Y0), Y1);
@@ -308,6 +327,6 @@
 
   /* second valid data point */
-  sx1 = x[i]*mxi + y[i]*mxj + bx;
-  sy1 = x[i]*myi + y[i]*myj + by;
+  sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+  sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
   sx1 = MIN (MAX (sx1, X0), X1);
   sy1 = MAX (MIN (sy1, Y0), Y1);
@@ -330,6 +349,6 @@
   for (i++; i < object[0].Npts; i++) {
     if (!(finite(x[i]) && finite(y[i]))) continue;
-    sx1 = x[i]*mxi + y[i]*mxj + bx;
-    sy1 = x[i]*myi + y[i]*myj + by;
+    sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     sx1 = MIN (MAX (sx1, X0), X1);
     sy1 = MAX (MIN (sy1, Y0), Y1);
@@ -356,5 +375,5 @@
   float *x, *y, *z;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
-  double sx, sy, d, sx1, sy1, sx2, sy2;
+  int sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
   
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -371,326 +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;
-	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 - d*z[i], sy - d*z[i], 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 - d*z[i], sy - d*z[i], 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] + 1, sy);
-	  DrawLine (sx, sy - d*z[i], sx, sy + d*z[i] + 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;
-	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] + 1, sy - d*z[i] - 1, sx - d*z[i], sy + d*z[i]);
-	  DrawLine (sx - d*z[i], sy - d*z[i], sx + d*z[i] + 1, sy + d*z[i] + 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;
-	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))
-	{
-	  points[0].x = sx - d*z[i];  points[0].y = sy + 0.58*d*z[i];  
-	  points[1].x = sx + d*z[i];  points[1].y = sy + 0.58*d*z[i];  
-	  points[2].x = sx;           points[2].y = sy - 1.15*d*z[i];  
-	  points[3].x = sx - d*z[i];  points[3].y = sy + 0.58*d*z[i];  
-	  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;
-	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 */
-
-      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;
-	if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
-	sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
-	sy2 = x[i+1]*myi + y[i+1]*myj + by;
-	ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
-      }
-    }
-  } 
-  /**** points are not scaled by object.z ***/
-  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 - d, sy - d, 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 - 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;
-	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 + 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;
-	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))
-	{
-	  /* XDrawLine is a little funny, this is needed to fix endpost errors */
-	  DrawLine (sx + d + 1, sy - d - 1, sx - d, sy + d);
-	  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;
-	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))
-	{
-	  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;
-	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) {	
-      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;
-	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);
     }
   }
@@ -723,8 +642,8 @@
   for (i = 0; i < object[0].Npts; i++) {
     if (!(finite(x[i]) && finite(y[i]) && finite(dxp[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx;
-    sy0 = x[i]*myi + y[i]*myj + by;
-    sx1 = (x[i] + dxp[i])*mxi + y[i]*mxj + bx;
-    sy1 = (x[i] + dxp[i])*myi + y[i]*myj + by;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
+    sx1 = (x[i] + dxp[i])*mxi + y[i]*mxj + bx + XCENTER;
+    sy1 = (x[i] + dxp[i])*myi + y[i]*myj + by + YCENTER;
     if (((sx0 > graph[0].axis[0].fx) && (sx0 < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
 	 (sy0 < graph[0].axis[1].fy) && (sy0 > graph[0].axis[1].fy + graph[0].axis[1].dfy)) ||
@@ -740,8 +659,8 @@
     }
     if (!(finite(x[i]) && finite(y[i]) && finite(dxm[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx;
-    sy0 = x[i]*myi + y[i]*myj + by;
-    sx1 = (x[i] - dxm[i])*mxi + y[i]*mxj + bx;
-    sy1 = (x[i] - dxm[i])*myi + y[i]*myj + by;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
+    sx1 = (x[i] - dxm[i])*mxi + y[i]*mxj + bx + XCENTER;
+    sy1 = (x[i] - dxm[i])*myi + y[i]*myj + by + YCENTER;
     if (((sx0 > graph[0].axis[0].fx) && (sx0 < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
 	 (sy0 < graph[0].axis[1].fy) && (sy0 > graph[0].axis[1].fy + graph[0].axis[1].dfy)) ||
@@ -785,6 +704,6 @@
   for (i = 0; i < object[0].Npts; i++) {
     if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx;
-    sy0 = x[i]*myi + y[i]*myj + by;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
     sx1 = sx0 + dyp[i]*mxj;
     sy1 = sy0 + dyp[i]*myj;
@@ -802,8 +721,8 @@
     }
     if (!(finite(x[i]) && finite(y[i]) && finite(dym[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx;
-    sy0 = x[i]*myi + y[i]*myj + by;
-    sx1 = x[i]*mxi + (y[i] - dym[i])*mxj + bx;
-    sy1 = x[i]*myi + (y[i] - dym[i])*myj + by;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
+    sx1 = x[i]*mxi + (y[i] - dym[i])*mxj + bx + XCENTER;
+    sy1 = x[i]*myi + (y[i] - dym[i])*myj + by + YCENTER;
     if (((sx0 > graph[0].axis[0].fx) && (sx0 < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
 	 (sy0 < graph[0].axis[1].fy) && (sy0 > graph[0].axis[1].fy + graph[0].axis[1].dfy)) ||
Index: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/LoadObject.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/LoadObject.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/LoadObject.c	(revision 31615)
@@ -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: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PNGit.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PNGit.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PNGit.c	(revision 31615)
@@ -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: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PSObjects.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PSObjects.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PSObjects.c	(revision 31615)
@@ -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: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PSit.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PSit.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/PSit.c	(revision 31615)
@@ -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: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/SetChannel.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/SetChannel.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/SetChannel.c	(revision 31615)
@@ -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: /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/bDrawObjects.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/bDrawObjects.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/kapa2/src/bDrawObjects.c	(revision 31615)
@@ -2,8 +2,9 @@
 
 # define DrawLine(BUF,X1,Y1,X2,Y2) (bDrawLine (BUF, (X1), (Y1), (X2), (Y2)))
+# 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 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), (Y+0.5*dY)))
-# define FillTriangle(BUF,X1,Y1,X2,Y2,X3,Y3) (bDrawTriFill (BUF, (X1), (Y1), (X2), (Y2), (X3), (Y3)))
+# 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;
-  double sx, sy, d, sx1, sy1, sx2, sy2;
+  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,312 +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))
-	{
-	  FillRectangle (buffer, 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 (buffer, 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 (buffer, sx - d*z[i], sy, sx + d*z[i], sy);
-	  DrawLine (buffer, 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 (buffer, sx + d*z[i], sy - d*z[i], sx - d*z[i], sy + d*z[i]);
-	  DrawLine (buffer, 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 (buffer, 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]);
-	}
-      }
-    }
-    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*z[i], sy + 0.58*d*z[i], 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 (buffer, sx, sy, sx - d*z[i], sy + 0.58*d*z[i]);
-	  DrawLine (buffer, sx, sy, sx + d*z[i], sy + 0.58*d*z[i]);
-	  DrawLine (buffer, 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 (buffer, 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 (buffer, 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 (buffer, 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 (buffer, 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 (buffer, 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 (buffer, 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 (buffer, sx -      d*z[i], sy,               sx - 0.50*d*z[i], sy + 0.87*d*z[i]);
-	  DrawLine (buffer, 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 (buffer, sx + 0.50*d*z[i], sy + 0.87*d*z[i], sx +      d*z[i], sy);
-
-	  DrawLine (buffer, sx +      d*z[i], sy,               sx + 0.50*d*z[i], sy - 0.87*d*z[i]);
-	  DrawLine (buffer, 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 (buffer, 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 */
-
-      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 = 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 (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 */
-      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 - 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))
-	{
-	  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: /branches/eam_branches/ipp-20110505/Ohana/src/libkapa/include/kapa.h
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/libkapa/include/kapa.h	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/libkapa/include/kapa.h	(revision 31615)
@@ -255,5 +255,5 @@
 void bDrawRectFill (bDrawBuffer *buffer, double x1, double y1, double x2, double y2);
 void bDrawTriOpen  (bDrawBuffer *buffer, double x1, double y1, double x2, double y2, double x3, double y3);
-void bDrawTriFill  (bDrawBuffer *buffer, double x1, double y1, double x2, double y2, double x3, double y3);
+void bDrawTriFill  (bDrawBuffer *buffer, double x1, double y1, double dx, double dy);
 
 /* bDrawRotFont.c */
Index: /branches/eam_branches/ipp-20110505/Ohana/src/libkapa/src/bDrawFuncs.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/libkapa/src/bDrawFuncs.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/libkapa/src/bDrawFuncs.c	(revision 31615)
@@ -78,8 +78,10 @@
 
 void bDrawSetStyle (bDrawBuffer *buffer, bDrawColor color, int lw, int lt) {
-  buffer->bColor = color;
-  buffer->bColor_R = buffer->palette[color].red;
-  buffer->bColor_G = buffer->palette[color].green;
-  buffer->bColor_B = buffer->palette[color].blue;
+  if (color >= 0) {
+    buffer->bColor = color;
+    buffer->bColor_R = buffer->palette[color].red;
+    buffer->bColor_G = buffer->palette[color].green;
+    buffer->bColor_B = buffer->palette[color].blue;
+  }
   buffer->bWeight = lw;
   buffer->bType = lt;
@@ -134,6 +136,6 @@
   Y2 = MIN (MAX (ROUND (y2), 1), buffer[0].Ny - 1);
 
-  bDrawLineHorizontal (buffer, X1, X2, Y1);
-  bDrawLineHorizontal (buffer, X1, X2, Y2);
+  bDrawLineHorizontal (buffer, X1, X2 + 1, Y1);
+  bDrawLineHorizontal (buffer, X1, X2 + 1, Y2);
   bDrawLineVertical   (buffer, X1, Y1, Y2);
   bDrawLineVertical   (buffer, X2, Y1, Y2);
@@ -275,7 +277,53 @@
 }
 
-void bDrawTriFill (bDrawBuffer *buffer, double x1, double y1, double x2, double y2, double x3, double y3) {
-
-  bDrawTriOpen (buffer, x1, y1, x2, y2, x3, y3);
+// upright triangle with base of width 2 dX + 1, height of dY, center of base at x1, y1
+void bDrawTriFill (bDrawBuffer *buffer, double x1, double y1, double dx, double dy) {
+
+  int xs, xe, x, y;
+  float e, m;
+
+  double dX = fabs(dx);
+  
+  xs = x1 - dX;
+  xe = x1 + dX + 1;
+  e = 0;
+  m = dX / dy;
+
+  if (dy > 0.0) {
+    for (y = y1; y < y1 + dy + 1; y++) {
+      for (x = xs; x < xe; x++) {
+	bDrawPoint (buffer, x, y);
+      }
+      e += m;
+      if (e > 0.5) {
+	xs ++;
+	xe --;
+	e -= 1.0;
+      }
+      if (e < -0.5) {
+	xs ++;
+	xe --;
+	e += 1.0;
+      }
+    }    
+  } else {
+    for (y = y1; y > y1 + dy - 1; y--) {
+      for (x = xs; x < xe; x++) {
+	bDrawPoint (buffer, x, y);
+      }
+      e += m;
+      if (e > 0.5) {
+	xs ++;
+	xe --;
+	e -= 1.0;
+      }
+      if (e < -0.5) {
+	xs ++;
+	xe --;
+	e += 1.0;
+      }
+    }    
+  }
+ 
   return;
 }
Index: /branches/eam_branches/ipp-20110505/Ohana/src/libohana/src/string.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/libohana/src/string.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/libohana/src/string.c	(revision 31615)
@@ -193,4 +193,5 @@
     word = _parse_nextword_csv (word);
   
+  if (word[0] == '"') word[0] = ' ';
   if (word[0] == ',') {
       *X = NAN;
Index: /branches/eam_branches/ipp-20110505/Ohana/src/opihi/Makefile
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/opihi/Makefile	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/opihi/Makefile	(revision 31615)
@@ -23,30 +23,30 @@
 
 all:
-	for i in $(PROGRAM) $(SPECIAL); do make $$i || exit; done
-	make pantasks_client
-	make pantasks_server
+	for i in $(PROGRAM) $(SPECIAL); do $(MAKE) $$i || exit; done
+	$(MAKE) pantasks_client
+	$(MAKE) pantasks_server
 
 libs:
-	for i in $(LIBS); do make $$i || exit; done
+	for i in $(LIBS); do $(MAKE) $$i || exit; done
 
 extras:
-	for i in $(EXTRAS); do make $$i || exit; done
+	for i in $(EXTRAS); do $(MAKE) $$i || exit; done
 
 install:
-	for i in $(PROGRAM) $(SPECIAL); do make $$i.install || exit; done
-	make pantasks_client.install
-	make pantasks_server.install
+	for i in $(PROGRAM) $(SPECIAL); do $(MAKE) $$i.install || exit; done
+	$(MAKE) pantasks_client.install
+	$(MAKE) pantasks_server.install
 
 extras-install:
-	for i in $(EXTRAS); do make $$i.install || exit; done
+	for i in $(EXTRAS); do $(MAKE) $$i.install || exit; done
 
 clean:
-	for i in $(PROGRAM) $(SPECIAL) $(EXTRAS) $(LIBS); do make $$i.clean || exit; done
+	for i in $(PROGRAM) $(SPECIAL) $(EXTRAS) $(LIBS); do $(MAKE) $$i.clean || exit; done
 
 libs-uninstall:
-	for i in $(LIBS); do make $$i.uninstall || exit; done
+	for i in $(LIBS); do $(MAKE) $$i.uninstall || exit; done
 
 dist: clean
-	for i in $(PROGRAM) $(SPECIAL) $(EXTRAS) $(LIBS); do make $$i.dist || exit; done
+	for i in $(PROGRAM) $(SPECIAL) $(EXTRAS) $(LIBS); do $(MAKE) $$i.dist || exit; done
 	rm -rf bin
 	rm -rf lib
@@ -55,27 +55,27 @@
 
 pantasks_client pantasks_server:
-	if [ -d pantasks ]; then (cd pantasks && make $@); fi
+	if [ -d pantasks ]; then (cd pantasks && $(MAKE) $@); fi
 
 pantasks_client.install: pantasks_client
-	if [ -d pantasks ]; then (cd pantasks && make $@); fi
+	if [ -d pantasks ]; then (cd pantasks && $(MAKE) $@); fi
 
 pantasks_server.install: pantasks_server
-	if [ -d pantasks ]; then (cd pantasks && make $@); fi
+	if [ -d pantasks ]; then (cd pantasks && $(MAKE) $@); fi
 
 $(PROGRAM) $(LIBS) $(EXTRAS):
-	if [ -d "$@" ]; then (cd $@ && make); fi
+	if [ -d "$@" ]; then (cd $@ && $(MAKE)); fi
 
 %.install:
-	if [ -d "$*" ]; then make $*; fi
-	if [ -d "$*" ]; then (cd $* && make install); fi
+	if [ -d "$*" ]; then $(MAKE) $*; fi
+	if [ -d "$*" ]; then (cd $* && $(MAKE) install); fi
 
 %.clean:
-	if [ -d "$*" ]; then (cd $* && make clean); fi
+	if [ -d "$*" ]; then (cd $* && $(MAKE) clean); fi
 
 %.dist:
-	if [ -d "$*" ]; then (cd $* && make dist); fi
+	if [ -d "$*" ]; then (cd $* && $(MAKE) dist); fi
 
 %.uninstall:
-	if [ -d "$*" ]; then (cd $* && make uninstall); fi
+	if [ -d "$*" ]; then (cd $* && $(MAKE) uninstall); fi
 
 .PHONY: $(PROGRAM) $(LIBS) pantasks_server pantasks_client
Index: /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/init.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/init.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/init.c	(revision 31615)
@@ -137,4 +137,5 @@
 int zap              PROTO((int, char **));
 int zplot            PROTO((int, char **));
+int zcplot            PROTO((int, char **));
 
 static Command cmds[] = {  
@@ -284,4 +285,5 @@
   {1, "zap",          zap,              "assign values to pixel regions"},
   {1, "zplot",        zplot,            "plot x y with size scaled by z"},
+  {1, "zcplot",       zcplot,           "plot x y with color scaled by z"},
 }; 
 
Index: /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 31615)
@@ -2,5 +2,5 @@
 
 FILE *f = (FILE *) NULL;
-char filename[1024];
+char filename[2048];
 
 int datafile (int argc, char **argv) {
@@ -84,12 +84,28 @@
     colstr = argv[2*i+2];
     for (j = 0; j < strlen (colstr); j++) {
-      if (!isdigit(colstr[j])) {
-	gprint (GP_ERR, "USAGE: read name N name N ...\n");
-	free (vec);
-	free (col);
-	return (FALSE);    
-      }
-    }
-    col[i] = atof (colstr);
+      if (isdigit(colstr[j])) {
+	col[i] = atof (colstr);
+	continue;
+      }
+      // allow 'excel' columns names of the form A-Z, AA-AZ, BA-BZ, .. ZA-ZZ
+      if (strlen(colstr) >= 3) goto bad_colname;
+      if (colstr[0] < 'A') goto bad_colname;
+      if (colstr[0] > 'Z') goto bad_colname;
+      if (colstr[1] && colstr[1] < 'A') goto bad_colname;
+      if (colstr[1] && colstr[1] > 'Z') goto bad_colname;
+
+      col[i] = colstr[0] - 'A' + 1;
+      if (colstr[1]) {
+	col[i] *= 26;
+	col[i] += colstr[1] - 'A' + 1;
+      }
+      continue;
+
+    bad_colname:
+      gprint (GP_ERR, "USAGE: read name N name N ...\n");
+      free (vec);
+      free (col);
+      return (FALSE);    
+    }
   }
 
@@ -105,4 +121,7 @@
     scan_line (f, buffer);
   }
+
+  int Nfield = 0;
+  int Nline = 0;
 
   Nstart = 0;
@@ -139,8 +158,16 @@
 	  }
 	  vec[i][0].elements.Flt[N] = value;
+	  if (status) {
+	      Nfield ++;
+	  }
 	  if (!status) vec[i][0].elements.Flt[N] = NAN;
 	}
 	if (status) N++;
       }
+      Nline ++;
+      if (c1) {
+	  // fprintf (stderr, "line %d, chars %ld, fields %d\n", Nline, (c1 - c0), Nfield);
+      }
+      Nfield = 0;
       c0 = c1 + 1;
       if (N == NELEM) {
Index: /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/tvcolors.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/tvcolors.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/tvcolors.c	(revision 31615)
@@ -5,5 +5,5 @@
   int N, kapa;
   char *name;
-  KapaImageData data;
+  // KapaImageData data;
 
   name = NULL;
@@ -13,5 +13,5 @@
     remove_argument (N, &argc, argv);
   }
-  if (!GetImage (&data, &kapa, name)) return (FALSE);
+  if (!GetGraph (NULL, &kapa, name)) return (FALSE);
   FREE (name);
 
Index: /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/zplot.c
===================================================================
--- /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/zplot.c	(revision 31614)
+++ /branches/eam_branches/ipp-20110505/Ohana/src/opihi/cmd.data/zplot.c	(revision 31615)
@@ -58,3 +58,60 @@
 }
 
+int zcplot (int argc, char **argv) {
+  
+  int i, kapa;
+  opihi_flt *out;
+  double min, range;
+  Graphdata graphmode;
+  Vector *xvec, *yvec, *zvec, Zvec;
 
+  if (!style_args (&graphmode, &argc, argv, &kapa)) return (FALSE);
+
+  if (argc != 6) {
+    gprint (GP_ERR, "USAGE: zplot <x> <y> <z> min max\n");
+    return (FALSE);
+  }
+
+  min = atof(argv[4]);
+  range = atof(argv[5]) - min;
+
+  /* find vectors */
+  if ((xvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((yvec = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((zvec = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if (xvec[0].Nelements != yvec[0].Nelements) {
+    gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[2]);
+    return (FALSE);
+  }
+  if (xvec[0].Nelements != zvec[0].Nelements) {
+    gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[3]);
+    return (FALSE);
+  }
+  SetVector (&Zvec, OPIHI_FLT, zvec[0].Nelements);
+  out = Zvec.elements.Flt;
+ 
+  if (zvec[0].type == OPIHI_FLT) {
+    opihi_flt *in = zvec[0].elements.Flt;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
+  } else {
+    opihi_int *in = zvec[0].elements.Int;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
+  }
+
+  /* point size determined by Zvec */
+  graphmode.style = 2; /* plot points */
+  graphmode.color = -1; /* point color determined by Zvec */
+  graphmode.etype = 0; /* no errorbars */
+  PlotVectorTriplet (kapa, xvec, yvec, &Zvec, &graphmode);
+
+  free (Zvec.elements.Ptr);
+
+  return (TRUE);
+
+}
+
+
