Index: /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/DrawObjects.c	(revision 37943)
+++ /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/DrawObjects.c	(revision 37944)
@@ -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 */
 
Index: /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/PSObjects.c
===================================================================
--- /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/PSObjects.c	(revision 37943)
+++ /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/PSObjects.c	(revision 37944)
@@ -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);
       }
     }
Index: /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/bDrawObjects.c
===================================================================
--- /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/bDrawObjects.c	(revision 37943)
+++ /branches/eam_branches/ipp-20150112/Ohana/src/kapa2/src/bDrawObjects.c	(revision 37944)
@@ -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
       }
