Index: trunk/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 37807)
+++ trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 38062)
@@ -630,4 +630,64 @@
     }
   }
+  if (object[0].ptype == 14) {	/* upside-down filled triangle */
+    XPoint points[4];
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+      sy = x[i]*myi + y[i]*myj + by + YCENTER;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	points[0].x = sx - D;  points[0].y = sy - 0.58*D;  
+	points[1].x = sx + D;  points[1].y = sy - 0.58*D;  
+	points[2].x = sx;      points[2].y = sy + 1.15*D;  
+	points[3].x = sx - D;  points[3].y = sy - 0.58*D;  
+	XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
+      }
+    }
+  }
+  if (object[0].ptype == 15) {	/* upside-down open triangle */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+      sy = x[i]*myi + y[i]*myj + by + YCENTER;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
+	DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
+	DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
+      }
+    }
+  }
+  if (object[0].ptype == 16) {	/* upside-down Y */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+      sy = x[i]*myi + y[i]*myj + by + YCENTER;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	DrawLine (sx, sy, sx - D, sy + 0.58*D);
+	DrawLine (sx, sy, sx + D, sy + 0.58*D);
+	DrawLine (sx, sy, sx,     sy - 1.15*D);
+      }
+    }
+  }
   if (object[0].ptype == 100) {	/* connect a pair of points */
 
@@ -652,8 +712,10 @@
 void DrawXErrors (KapaGraphWidget *graph, Gobjects *object) {
   
-  int i, bar;
-  float *x, *y, *dxm, *dxp;
+  int i, bar, dz, ds, D;
+  float *x, *y, *z, *dxm, *dxp;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
   double sx0, sy0, sx1, sy1, sz, sx10, sx11, X0, X1, Y0, Y1;
+
+  int scaleSize = (object[0].size < 0);
 
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -670,5 +732,8 @@
   by = byi + byj;
   
-  x = object[0].x; y = object[0].y; dxp = object[0].dxp; dxm = object[0].dxm; 
+  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; dxp = object[0].dxp; dxm = object[0].dxm; z = object[0].z;
   bar = object[0].ebar; sz = object[0].size*graph[0].axis[1].dfy*0.03;
   
@@ -678,10 +743,19 @@
   Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
 
+  /// XXX NOTE : D should be modified by (mxi,myi) for tilted axes dx = D*(mxi/mx), dy = D*(myi/mx)
+
   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 + XCENTER;
+    // for open circles, only go to the outer radius
+    D = 0;
+    if (object[0].ptype ==  7) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  1) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  5) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (!(finite(x[i]) && finite(y[i]) && finite(dxp[i]))) goto skip_dxp;
+    if (D > fabs(dxp[i]*mxi)) goto skip_dxp;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER + D;
     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;
+    sx1 = sx0 + dxp[i]*mxi - D;
+    sy1 = sy0 + dxp[i]*myi;
     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)) ||
@@ -696,9 +770,11 @@
       }
     }
+  skip_dxp:
     if (!(finite(x[i]) && finite(y[i]) && finite(dxm[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+    if (D > fabs(dxm[i]*mxi)) continue;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER - D;
     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;
+    sx1 = sx0 - dxm[i]*mxi + D;
+    sy1 = sy0 - dxm[i]*myi;
     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)) ||
@@ -719,8 +795,10 @@
 void DrawYErrors (KapaGraphWidget *graph, Gobjects *object) {
 
-  int i, bar;
-  float *x, *y, *dym, *dyp;
+  int i, bar, dz, ds, D;
+  float *x, *y, *z, *dym, *dyp;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
   double sx0, sy0, sx1, sy1, sz, sx10, sx11, X0, X1, Y0, Y1;
+
+  int scaleSize = (object[0].size < 0);
 
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -737,5 +815,8 @@
   by = byi + byj;
   
-  x = object[0].x; y = object[0].y; dyp = object[0].dyp; dym = object[0].dym; 
+  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; dyp = object[0].dyp; dym = object[0].dym; z = object[0].z;
   bar = object[0].ebar; sz = object[0].size*graph[0].axis[0].dfx*0.03;
   
@@ -745,10 +826,19 @@
   Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
 
+  /// XXX NOTE : D should be modified by (mxi,myi) for tilted axes dx = D*(mxi/mx), dy = D*(myi/mx)
+
   for (i = 0; i < object[0].Npts; i++) {
-    if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) continue;
+    // for open circles, only go to the outer radius
+    D = 0;
+    if (object[0].ptype ==  7) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  1) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  5) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) goto skip_dyp;
+    if (D > fabs(dyp[i]*myj)) goto skip_dyp;
     sx0 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
-    sy0 = x[i]*myi + y[i]*myj + by + YCENTER;
+    sy0 = x[i]*myi + y[i]*myj + by + YCENTER - D;
     sx1 = sx0 + dyp[i]*mxj;
-    sy1 = sy0 + dyp[i]*myj;
+    sy1 = sy0 + dyp[i]*myj + D;
     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)) ||
@@ -763,9 +853,13 @@
       }
     }
+  skip_dyp:
     if (!(finite(x[i]) && finite(y[i]) && finite(dym[i]))) continue;
+    if (object[0].ptype ==  5) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (D > fabs(dym[i]*myj)) continue;
     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;
+    sy0 = x[i]*myi + y[i]*myj + by + YCENTER + D;
+    sx1 = sx0 - dym[i]*mxj;
+    sy1 = sy0 - dym[i]*myj - D;
     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: trunk/Ohana/src/kapa2/src/InterpretKeys.c
===================================================================
--- trunk/Ohana/src/kapa2/src/InterpretKeys.c	(revision 37807)
+++ trunk/Ohana/src/kapa2/src/InterpretKeys.c	(revision 38062)
@@ -98,7 +98,6 @@
       Screen_to_Image (&X, &Y, (double)(event[0].x + 0.5), (double)(event[0].y + 0.5), &image[0].picture); \
       UpdateStatusBox (graphic, image, X, Y, 0.0, 1); \
+      Remap (graphic, image); \
       break;
-
-//    Remap (graphic, image); 
 
     // the number of entries here must match the value of NCHANNELS in contants.h
Index: trunk/Ohana/src/kapa2/src/PSObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PSObjects.c	(revision 37807)
+++ trunk/Ohana/src/kapa2/src/PSObjects.c	(revision 38062)
@@ -403,9 +403,22 @@
 	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 == 14) {	/* filled triangle */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx;
+      sy = x[i]*myi + y[i]*myj + by;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
+      {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	FillTriangle (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
       }
     }
@@ -426,6 +439,26 @@
 	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);
+	DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
+	DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
+      }
+    }
+  }
+  if (object[0].ptype == 15) {	/* upside-down open triangle */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx;
+      sy = x[i]*myi + y[i]*myj + by;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
+      {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
+	DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
+	DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
       }
     }
@@ -448,4 +481,24 @@
 	DrawLine (sx, sy, sx + D, sy + 0.58*D);
 	DrawLine (sx, sy, sx,          sy - 1.15*D);
+      }
+    }
+  }
+  if (object[0].ptype == 16) {	/* Y */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx;
+      sy = x[i]*myi + y[i]*myj + by;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
+      {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	DrawLine (sx, sy, sx - D, sy - 0.58*D);
+	DrawLine (sx, sy, sx + D, sy - 0.58*D);
+	DrawLine (sx, sy, sx,     sy + 1.15*D);
       }
     }
@@ -557,8 +610,10 @@
 void PSXErrors (KapaGraphWidget *graph, Gobjects *object, FILE *f) {
   
-  int i, bar;
-  float *x, *y, *dxm, *dxp;
+  int i, bar, dz, ds, D;
+  float *x, *y, *z, *dxm, *dxp;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
   double sx0, sy0, sx1, sy1, sz, sx10, sx11;
+
+  int scaleSize = (object[0].size < 0);
 
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -575,5 +630,8 @@
   by = byi + byj;
   
-  x = object[0].x; y = object[0].y; dxp = object[0].dxp; dxm = object[0].dxm; 
+  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; dxp = object[0].dxp; dxm = object[0].dxm; z = object[0].z;
   bar = object[0].ebar; sz = object[0].size*graph[0].axis[1].dfy*0.03;
    
@@ -583,10 +641,19 @@
   double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
 
+  /// XXX NOTE : D should be modified by (mxi,myi) for tilted axes dx = D*(mxi/mx), dy = D*(myi/mx)
+
   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;
+    // for open circles, only go to the outer radius
+    D = 0;
+    if (object[0].ptype ==  7) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  1) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  5) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (!(finite(x[i]) && finite(y[i]) && finite(dxp[i]))) goto skip_dxp;
+    if (D > fabs(dxp[i]*mxi)) goto skip_dxp;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + D;
     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;
+    sx1 = sx0 + dxp[i]*mxi - D;
+    sy1 = sy0 + dxp[i]*myi;
     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)) ||
@@ -595,17 +662,17 @@
       {
 	ClipLinePS (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1, f);
-	// DrawLine (sx0, sy0, sx1, sy1);
 	if (bar) {
 	  sx10 = sy1 - sz;
 	  sx11 = sy1 + sz;
 	  ClipLinePS (sx1, sx10, sx1, sx11, X0, Y0, X1, Y1, f);
-	  // DrawLine (sx1, sx10, sx1, sx11);
-	}
-      }
+	}
+      }
+  skip_dxp:
     if (!(finite(x[i]) && finite(y[i]) && finite(dxm[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx;
+    if (D > fabs(dxm[i]*mxi)) continue;
+    sx0 = x[i]*mxi + y[i]*mxj + bx - D;
     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;
+    sx1 = sx0 - dxm[i]*mxi + D;
+    sy1 = sy0 - dxm[i]*myi;
     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)) ||
@@ -614,10 +681,8 @@
       {
 	ClipLinePS (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1, f);
-	// DrawLine (sx0, sy0, sx1, sy1);
 	if (bar) {
 	  sx10 = sy1 - sz;
 	  sx11 = sy1 + sz;
 	  ClipLinePS (sx1, sx10, sx1, sx11, X0, Y0, X1, Y1, f);
-	  // DrawLine (sx1, sx10, sx1, sx11);
 	}
       }
@@ -629,9 +694,11 @@
 void PSYErrors (KapaGraphWidget *graph, Gobjects *object, FILE *f) {
   
-  int i, bar;
-  float *x, *y, *dym, *dyp;
+  int i, bar, dz, ds, D;
+  float *x, *y, *z, *dym, *dyp;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
   double sx0, sy0, sx1, sy1, sz, sx10, sx11;
   
+  int scaleSize = (object[0].size < 0);
+
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
   mxj = graph[0].axis[1].dfx / (object[0].y1 - object[0].y0);
@@ -647,5 +714,8 @@
   by = byi + byj;
   
-  x = object[0].x; y = object[0].y; dyp = object[0].dyp; dym = object[0].dym; 
+  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; dyp = object[0].dyp; dym = object[0].dym; z = object[0].z;
   bar = object[0].ebar; sz = object[0].size*graph[0].axis[0].dfx*0.03;
   
@@ -655,10 +725,19 @@
   double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
 
+  /// XXX NOTE : D should be modified by (mxi,myi) for tilted axes dx = D*(mxi/mx), dy = D*(myi/mx)
+
   for (i = 0; i < object[0].Npts; i++) {
-    if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) continue;
+    // for open circles, only go to the outer radius
+    D = 0;
+    if (object[0].ptype ==  7) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  1) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  5) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) goto skip_dyp;
+    if (D > fabs(dyp[i]*myj)) goto skip_dyp;
     sx0 = x[i]*mxi + y[i]*mxj + bx;
-    sy0 = x[i]*myi + y[i]*myj + by;
-    sx1 = x[i]*mxi + (y[i] + dyp[i])*mxj + bx;
-    sy1 = x[i]*myi + (y[i] + dyp[i])*myj + by;
+    sy0 = x[i]*myi + y[i]*myj + by - D;
+    sx1 = sx0 + dyp[i]*mxj;
+    sy1 = sy0 + dyp[i]*myj + D;
     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)) ||
@@ -667,17 +746,19 @@
       {
 	ClipLinePS (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1, f);
-	// DrawLine (sx0, sy0, sx1, sy1);
 	if (bar) {
 	  sx10 = sx1 - sz;
 	  sx11 = sx1 + sz;
 	  ClipLinePS (sx10, sy1, sx11, sy1, X0, Y0, X1, Y1, f);
-	  // DrawLine (sx10, sy1, sx11, sy1);
-	}
-      }
+	}
+      }
+  skip_dyp:
     if (!(finite(x[i]) && finite(y[i]) && finite(dym[i]))) continue;
+    if (object[0].ptype ==  5) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (D > fabs(dym[i]*myj)) 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;
+    sy0 = x[i]*myi + y[i]*myj + by + D;
+    sx1 = sx0 - dym[i]*mxj;
+    sy1 = sy0 - dym[i]*myj - D;
     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)) ||
@@ -686,10 +767,8 @@
       {
 	ClipLinePS (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1, f);
-	// DrawLine (sx0, sy0, sx1, sy1);
 	if (bar) {
 	  sx10 = sx1 - sz;
 	  sx11 = sx1 + sz;
 	  ClipLinePS (sx10, sy1, sx11, sy1, X0, Y0, X1, Y1, f);
-	  // DrawLine (sx10, sy1, sx11, sy1);
 	}
       }
Index: trunk/Ohana/src/kapa2/src/bDrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/bDrawObjects.c	(revision 37807)
+++ trunk/Ohana/src/kapa2/src/bDrawObjects.c	(revision 38062)
@@ -406,4 +406,26 @@
     }
   }
+  if (object[0].ptype == 14) {	/* filled triangle */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx;
+      sy = x[i]*myi + y[i]*myj + by;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
+      {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  buffer->bColor_R = pixel1[pixel];
+	  buffer->bColor_G = pixel2[pixel];
+	  buffer->bColor_B = pixel3[pixel];
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	// FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
+	FillTriangle (buffer, sx, sy - 0.58*D, D, +1.73*D);
+	// out-of-range points skipped by bDrawPoint
+      }
+    }
+  }
   if (object[0].ptype == 5) {	/* open triangle */
     for (i = 0; i < object[0].Npts; i++) {
@@ -423,4 +445,25 @@
 	D = scaleSize ? dz*z[i] : ds;
 	OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
+	// out-of-range points skipped by bDrawPoint
+      }
+    }
+  }
+  if (object[0].ptype == 15) {	/* open triangle */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx;
+      sy = x[i]*myi + y[i]*myj + by;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
+      {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  buffer->bColor_R = pixel1[pixel];
+	  buffer->bColor_G = pixel2[pixel];
+	  buffer->bColor_B = pixel3[pixel];
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	OpenTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
 	// out-of-range points skipped by bDrawPoint
       }
@@ -446,4 +489,27 @@
 	DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
 	DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
+	// out-of-range points skipped by bDrawPoint
+      }
+    }
+  }
+  if (object[0].ptype == 16) {	/* Y */
+    for (i = 0; i < object[0].Npts; i++) {
+      if (!(finite(x[i]) && finite(y[i]))) continue;
+      sx = x[i]*mxi + y[i]*mxj + bx;
+      sy = x[i]*myi + y[i]*myj + by;
+      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
+	  (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
+      {
+	if (scaleColor) {
+	  if (!finite(z[i])) continue;
+	  int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
+	  buffer->bColor_R = pixel1[pixel];
+	  buffer->bColor_G = pixel2[pixel];
+	  buffer->bColor_B = pixel3[pixel];
+	}
+	D = scaleSize ? dz*z[i] : ds;
+	DrawLine (buffer, sx, sy, sx - D, sy + 0.58*D);
+	DrawLine (buffer, sx, sy, sx + D, sy + 0.58*D);
+	DrawLine (buffer, sx, sy, sx,     sy - 1.15*D);
 	// out-of-range points skipped by bDrawPoint
       }
@@ -590,8 +656,10 @@
 void bDrawXErrors (bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object) {
   
-  int i, bar;
-  float *x, *y, *dxm, *dxp;
+  int i, bar, dz, ds, D;
+  float *x, *y, *z, *dxm, *dxp;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
   double sx0, sy0, sx1, sy1, sz, sx10, sx11;
+
+  int scaleSize = (object[0].size < 0);
 
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
@@ -608,5 +676,8 @@
   by = byi + byj;
   
-  x = object[0].x; y = object[0].y; dxp = object[0].dxp; dxm = object[0].dxm; 
+  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; dxp = object[0].dxp; dxm = object[0].dxm; z = object[0].z;
   bar = object[0].ebar; sz = object[0].size*graph[0].axis[1].dfy*0.03;
    
@@ -616,10 +687,19 @@
   double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
 
+  /// XXX NOTE : D should be modified by (mxi,myi) for tilted axes dx = D*(mxi/mx), dy = D*(myi/mx)
+
   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;
+    // for open circles, only go to the outer radius
+    D = 0;
+    if (object[0].ptype ==  7) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  1) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  5) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (!(finite(x[i]) && finite(y[i]) && finite(dxp[i]))) goto skip_dxp;
+    if (D > fabs(dxp[i]*mxi)) goto skip_dxp;
+    sx0 = x[i]*mxi + y[i]*mxj + bx + D;
     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;
+    sx1 = sx0 + dxp[i]*mxi - D;
+    sy1 = sy0 + dxp[i]*myi;
     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)) ||
@@ -628,17 +708,17 @@
     {
       bDrawClipLine (buffer, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
-      //   DrawLine (buffer, sx0, sy0, sx1, sy1);
       if (bar) {
 	sx10 = sy1 - sz;
 	sx11 = sy1 + sz;
 	bDrawClipLine (buffer, sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
-	//   DrawLine (buffer, sx1, sx10, sx1, sx11);
-      }
-    }
+      }
+    }
+  skip_dxp:
     if (!(finite(x[i]) && finite(y[i]) && finite(dxm[i]))) continue;
-    sx0 = x[i]*mxi + y[i]*mxj + bx;
+    if (D > fabs(dxm[i]*mxi)) continue;
+    sx0 = x[i]*mxi + y[i]*mxj + bx - D;
     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;
+    sx1 = sx0 - dxm[i]*mxi + D;
+    sy1 = sy0 - dxm[i]*myi;
     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)) ||
@@ -647,10 +727,8 @@
     {
       bDrawClipLine (buffer, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
-      //   DrawLine (buffer, sx0, sy0, sx1, sy1);
       if (bar) {
 	sx10 = sy1 - sz;
 	sx11 = sy1 + sz;
 	bDrawClipLine (buffer, sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
-	//   DrawLine (buffer, sx1, sx10, sx1, sx11);
       }
     }
@@ -661,9 +739,11 @@
 void bDrawYErrors (bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object) {
   
-  int i, bar;
-  float *x, *y, *dym, *dyp;
+  int i, bar, dz, ds, D;
+  float *x, *y, *z, *dym, *dyp;
   double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
   double sx0, sy0, sx1, sy1, sz, sx10, sx11;
   
+  int scaleSize = (object[0].size < 0);
+
   mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
   mxj = graph[0].axis[1].dfx / (object[0].y1 - object[0].y0);
@@ -679,5 +759,8 @@
   by = byi + byj;
   
-  x = object[0].x; y = object[0].y; dyp = object[0].dyp; dym = object[0].dym; 
+  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; dyp = object[0].dyp; dym = object[0].dym; z = object[0].z;
   bar = object[0].ebar; sz = object[0].size*graph[0].axis[0].dfx*0.03;
   
@@ -687,10 +770,19 @@
   double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
 
+  /// XXX NOTE : D should be modified by (mxi,myi) for tilted axes dx = D*(mxi/mx), dy = D*(myi/mx)
+
   for (i = 0; i < object[0].Npts; i++) {
-    if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) continue;
+    // for open circles, only go to the outer radius
+    D = 0;
+    if (object[0].ptype ==  7) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  1) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype ==  5) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (!(finite(x[i]) && finite(y[i]) && finite(dyp[i]))) goto skip_dyp;
+    if (D > fabs(dyp[i]*myj)) goto skip_dyp;
     sx0 = x[i]*mxi + y[i]*mxj + bx;
-    sy0 = x[i]*myi + y[i]*myj + by;
-    sx1 = x[i]*mxi + (y[i] + dyp[i])*mxj + bx;
-    sy1 = x[i]*myi + (y[i] + dyp[i])*myj + by;
+    sy0 = x[i]*myi + y[i]*myj + by - D;
+    sx1 = sx0 + dyp[i]*mxj;
+    sy1 = sy0 + dyp[i]*myj + D;
     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)) ||
@@ -699,17 +791,19 @@
     {
       bDrawClipLine (buffer, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
-      //   DrawLine (buffer, sx0, sy0, sx1, sy1);
       if (bar) {
 	sx10 = sx1 - sz;
 	sx11 = sx1 + sz;
 	bDrawClipLine (buffer, sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
-	//   DrawLine (buffer, sx10, sy1, sx11, sy1);
-      }
-    }
+      }
+    }
+  skip_dyp:
     if (!(finite(x[i]) && finite(y[i]) && finite(dym[i]))) continue;
+    if (object[0].ptype ==  5) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (object[0].ptype == 15) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (D > fabs(dym[i]*myj)) 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;
+    sy0 = x[i]*myi + y[i]*myj + by + D;
+    sx1 = sx0 - dym[i]*mxj;
+    sy1 = sy0 - dym[i]*myj - D;
     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)) ||
@@ -718,10 +812,8 @@
     {
       bDrawClipLine (buffer, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
-      //   DrawLine (buffer, sx0, sy0, sx1, sy1);
       if (bar) {
 	sx10 = sx1 - sz;
 	sx11 = sx1 + sz;
 	bDrawClipLine (buffer, sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
-	//   DrawLine (buffer, sx10, sy1, sx11, sy1);
       }
     }
