Index: /branches/eam_branches/ohana.20190329/src/kapa2/include/prototypes.h
===================================================================
--- /branches/eam_branches/ohana.20190329/src/kapa2/include/prototypes.h	(revision 40926)
+++ /branches/eam_branches/ohana.20190329/src/kapa2/include/prototypes.h	(revision 40927)
@@ -39,4 +39,6 @@
 void	      DrawTextlines	  PROTO((KapaGraphWidget *graph));
 void          DrawConnect         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+void          DrawPolygon         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
+void          DrawPolyfill        PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
 void          DrawHistogram       PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
 int           DrawObjectN         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
@@ -150,4 +152,6 @@
 void          bDrawBars           PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object, int mode));
 void	      bDrawPoints	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
+void	      bDrawPolygons	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
+void	      bDrawFillPolygons	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
 void	      bDrawXErrors	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
 void	      bDrawYErrors	  PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
Index: /branches/eam_branches/ohana.20190329/src/kapa2/include/structures.h
===================================================================
--- /branches/eam_branches/ohana.20190329/src/kapa2/include/structures.h	(revision 40926)
+++ /branches/eam_branches/ohana.20190329/src/kapa2/include/structures.h	(revision 40927)
@@ -133,9 +133,23 @@
 } Overlay;
   
-typedef struct {
-  float *x, *y, *z, *dxp, *dxm, *dyp, *dym;
-  int Npts;
-  int style, ptype, ltype, color, etype, ebar;
-  double lweight, size;
+// a set of objects all have the same basic properties
+typedef struct {
+  float *x; // x-coordinates of the points
+  float *y; // y-coordinates of the points
+  float *z; // size/colorscale for points
+  float *dxp; // lower-errorbar in x
+  float *dxm; // upper-errorbar in x
+  float *dyp; // lower-errorbar in y
+  float *dym; // upper-errorbar in y
+  int Npts;   // number of points in this set
+  int style;  // how are the object draw: CONNECT, HISTOGRAM,
+  int ptype;  // shape of object at each point
+  // ptype is overloaded for NPOLYGON to be the number of points / polygon
+  int ltype;  // style of line (solid, dot, dash, etc)
+  int color;  // color for point (if not colorscaled)
+  int etype;  // errorbars to draw (0x01 = y, 0x02 = x)
+  int ebar;   // draw a cap on the error bar
+  double lweight; // line thickness
+  double size; // size of the object
   double x0, x1, y0, y1;  /* limits for this object */
   double alpha;
Index: /branches/eam_branches/ohana.20190329/src/kapa2/src/DrawObjects.c
===================================================================
--- /branches/eam_branches/ohana.20190329/src/kapa2/src/DrawObjects.c	(revision 40926)
+++ /branches/eam_branches/ohana.20190329/src/kapa2/src/DrawObjects.c	(revision 40927)
@@ -97,26 +97,26 @@
   switch (object[0].style) {
     case KAPA_PLOT_CONNECT: 
-      // fprintf (stderr, "plot KAPA_PLOT_CONNECT: \n");
       DrawConnect (graphic, graph, object);
       break;
+    case KAPA_PLOT_POLYGON: 
+      DrawPolygon (graphic, graph, object);
+      break;
+    case KAPA_PLOT_POLYFILL: 
+      DrawPolyfill (graphic, graph, object);
+      break;
     case KAPA_PLOT_HISTOGRAM:
-      // fprintf (stderr, "plot KAPA_PLOT_HISTOGRAM:\n");
       DrawHistogram (graphic, graph, object);
       break;
     case KAPA_PLOT_BARS_SOLID:
-      // fprintf (stderr, "plot KAPA_PLOT_BARS_SOLID:\n");
       DrawBars (graphic, graph, object, KAPA_PLOT_BARS_SOLID);
       break;
     case KAPA_PLOT_BARS_OUTLINE:
-      // fprintf (stderr, "plot KAPA_PLOT_BARS_OUTLINE:\n");
       DrawBars (graphic, graph, object, KAPA_PLOT_BARS_OUTLINE);
       break;
     case KAPA_PLOT_BARS_OUTFILL:
-      // fprintf (stderr, "plot KAPA_PLOT_BARS_OUTFILL:\n");
       DrawBars (graphic, graph, object, KAPA_PLOT_BARS_OUTFILL);
       break;
     case KAPA_PLOT_POINTS:
     default:
-      // fprintf (stderr, "plot KAPA_PLOT_POINTS:\n");
       DrawPoints (graphic, graph, object);
       break;
@@ -172,5 +172,137 @@
     sx0 = sx1; sy0 = sy1;
   }
-  
+}
+
+/******/
+void DrawPolygon (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
+
+  float *x, *y;
+  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
+  double sx0, sy0, sx1, sy1;
+  double X0, X1, Y0, Y1;
+
+  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
+  mxj = graph[0].axis[1].dfx / (object[0].y1 - object[0].y0);
+  myi = graph[0].axis[0].dfy / (object[0].x1 - object[0].x0);
+  myj = graph[0].axis[1].dfy / (object[0].y1 - object[0].y0);
+  
+  bxi  =  graph[0].axis[0].fx - object[0].x0*graph[0].axis[0].dfx/(object[0].x1 - object[0].x0);
+  bxj  =  -object[0].y0*graph[0].axis[1].dfx/(object[0].y1 - object[0].y0);
+  byi  =  -object[0].x0*graph[0].axis[0].dfy/(object[0].x1 - object[0].x0);
+  byj  =  graph[0].axis[1].fy - object[0].y0*graph[0].axis[1].dfy/(object[0].y1 - object[0].y0);
+  
+  bx = bxi + bxj;
+  by = byi + byj;
+  
+  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;
+
+  x = object[0].x; y = object[0].y;
+
+  // ptype must > 2
+  // Npts % ptype must be 0
+  // who must validate that?
+
+  // each polygon is made of (N = ptype) points
+  // we connect each point and the last one back
+  for (int i = 0; i < object[0].Npts; i += object[0].ptype) {
+    // first check for any invalid values for this polygon
+    int skipObject = FALSE;
+    for (int j = 0; (j < object[0].ptype) && !skipObject; j++) {
+      int k = i + j;
+      if (!(finite(x[k]) && finite(y[k]))) skipObject = TRUE;
+    }
+    if (skipObject) continue;
+
+    for (int j = 0; (j < object[0].ptype); j++) {
+      int k = i + j;
+      sx0 = x[k]*mxi + y[k]*mxj + bx + XCENTER;
+      sy0 = x[k]*myi + y[k]*myj + by + YCENTER;
+
+      // last point connects to first
+      if (j == object[0].ptype - 1) {
+	sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
+	sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
+      } else {
+	sx1 = x[k+1]*mxi + y[k+1]*mxj + bx + XCENTER;
+	sy1 = x[k+1]*myi + y[k+1]*myj + by + YCENTER;
+      }
+      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+    }
+  }
+}
+
+/******/
+void DrawPolyfill (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
+
+  float *x, *y, *z;
+  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
+  double sx0, sy0;
+  // double X0, X1, Y0, Y1;
+
+  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
+  mxj = graph[0].axis[1].dfx / (object[0].y1 - object[0].y0);
+  myi = graph[0].axis[0].dfy / (object[0].x1 - object[0].x0);
+  myj = graph[0].axis[1].dfy / (object[0].y1 - object[0].y0);
+  
+  bxi  =  graph[0].axis[0].fx - object[0].x0*graph[0].axis[0].dfx/(object[0].x1 - object[0].x0);
+  bxj  =  -object[0].y0*graph[0].axis[1].dfx/(object[0].y1 - object[0].y0);
+  byi  =  -object[0].x0*graph[0].axis[0].dfy/(object[0].x1 - object[0].x0);
+  byj  =  graph[0].axis[1].fy - object[0].y0*graph[0].axis[1].dfy/(object[0].y1 - object[0].y0);
+  
+  bx = bxi + bxj;
+  by = byi + byj;
+  
+  /*
+    window boundary so we can clip objects
+  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;
+  */
+
+  x = object[0].x; y = object[0].y; z = object[0].z;
+
+  // ptype must > 2
+  // Npts % ptype must be 0
+  // who must validate that?
+
+  ALLOCATE_PTR (points, XPoint, object[0].ptype);
+
+  // NOTE that LoadObject.c:45 limits the allow
+  // object styles which may have negative (scaled) colors
+  int scaleColor = (object[0].color < 0);
+
+  // each polygon is made of (N = ptype) points
+  // we connect each point and the last one back
+  for (int i = 0; i < object[0].Npts; i += object[0].ptype) {
+    // first check for any invalid values for this polygon
+    int skipObject = FALSE;
+    for (int j = 0; (j < object[0].ptype) && !skipObject; j++) {
+      int k = i + j;
+      if (!(finite(x[k]) && finite(y[k]))) skipObject = TRUE;
+    }
+    if (skipObject) continue;
+
+    for (int j = 0; (j < object[0].ptype); j++) {
+      int k = i + j;
+      sx0 = x[k]*mxi + y[k]*mxj + bx + XCENTER;
+      sy0 = x[k]*myi + y[k]*myj + by + YCENTER;
+
+      points[j].x = sx0;
+      points[j].y = sy0;
+    }
+
+    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);
+    }
+    XFillPolygon (graphic->display, graphic->window, graphic->gc, points, object[0].ptype, Convex, CoordModeOrigin);
+  }
+
+  free (points);
 }
 
@@ -580,4 +712,7 @@
   int scaleColor = (object[0].color < 0);
 
+  // NOTE that LoadObject.c:45 limits the allow
+  // object styles which may have negative (scaled) colors
+
   ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
   dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
@@ -916,8 +1051,8 @@
     // 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 (object[0].ptype == KAPA_POINT_CIRCLE_OPEN  	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_BOX_OPEN     	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN	) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN_DOWN) { 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;
@@ -999,8 +1134,8 @@
     // 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 (object[0].ptype == KAPA_POINT_CIRCLE_OPEN  	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_BOX_OPEN     	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN	) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN_DOWN) { 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;
@@ -1023,6 +1158,6 @@
   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 (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN	) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN_DOWN) { 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;
Index: /branches/eam_branches/ohana.20190329/src/kapa2/src/LoadObject.c
===================================================================
--- /branches/eam_branches/ohana.20190329/src/kapa2/src/LoadObject.c	(revision 40926)
+++ /branches/eam_branches/ohana.20190329/src/kapa2/src/LoadObject.c	(revision 40927)
@@ -42,5 +42,11 @@
       graph[0].objects[N].color = KapaColormapSize() - 1;
   }
-  if ((graph[0].objects[N].style != KAPA_PLOT_POINTS) && (graph[0].objects[N].color < 0)) {
+
+  // XXX watch out for this restriction in DrawObjects / bDrawObjects
+  int canScaleColor = FALSE;
+  canScaleColor |= (graph[0].objects[N].style == KAPA_PLOT_POINTS);
+  canScaleColor |= (graph[0].objects[N].style == KAPA_PLOT_POLYFILL);
+
+  if (!canScaleColor && (graph[0].objects[N].color < 0)) {
       graph[0].objects[N].color = 0;
   }
Index: /branches/eam_branches/ohana.20190329/src/kapa2/src/Refresh.c
===================================================================
--- /branches/eam_branches/ohana.20190329/src/kapa2/src/Refresh.c	(revision 40926)
+++ /branches/eam_branches/ohana.20190329/src/kapa2/src/Refresh.c	(revision 40927)
@@ -1,3 +1,5 @@
 # include "Ximage.h"
+
+# define USE_BUFFERED_DRAW 0
 
 void bDrawXimage (bDrawBuffer *buffer);
@@ -6,5 +8,9 @@
 
 void Refresh (void) {
-  Refresh_Buffered();
+  if (USE_BUFFERED_DRAW) {
+    Refresh_Buffered();
+  } else {
+    Refresh_Unbuffered();
+  }
 }
 
Index: /branches/eam_branches/ohana.20190329/src/kapa2/src/bDrawObjects.c
===================================================================
--- /branches/eam_branches/ohana.20190329/src/kapa2/src/bDrawObjects.c	(revision 40926)
+++ /branches/eam_branches/ohana.20190329/src/kapa2/src/bDrawObjects.c	(revision 40927)
@@ -38,4 +38,10 @@
       bDrawConnect (buffer, graph, object);
       break;
+    case KAPA_PLOT_POLYGON: 
+      bDrawPolygons (buffer, graph, object);
+      break;
+    case KAPA_PLOT_POLYFILL: 
+      bDrawFillPolygons (buffer, graph, object);
+      break;
     case KAPA_PLOT_HISTOGRAM:
       bDrawHistogram (buffer, graph, object);
@@ -105,4 +111,153 @@
     sx0 = sx1; sy0 = sy1;
   }
+}
+
+void bDrawPolygons (bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object) {
+
+  float *x, *y;
+  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
+  double sx0, sy0, sx1, sy1;
+  double X0, X1, Y0, Y1;
+
+  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
+  mxj = graph[0].axis[1].dfx / (object[0].y1 - object[0].y0);
+  myi = graph[0].axis[0].dfy / (object[0].x1 - object[0].x0);
+  myj = graph[0].axis[1].dfy / (object[0].y1 - object[0].y0);
+  
+  bxi  =  graph[0].axis[0].fx - object[0].x0*graph[0].axis[0].dfx/(object[0].x1 - object[0].x0);
+  bxj  =  -object[0].y0*graph[0].axis[1].dfx/(object[0].y1 - object[0].y0);
+  byi  =  -object[0].x0*graph[0].axis[0].dfy/(object[0].x1 - object[0].x0);
+  byj  =  graph[0].axis[1].fy - object[0].y0*graph[0].axis[1].dfy/(object[0].y1 - object[0].y0);
+  
+  bx = bxi + bxj;
+  by = byi + byj;
+  
+  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;
+
+  x = object[0].x; y = object[0].y;
+
+  // ptype must > 2
+  // Npts % ptype must be 0
+  // who must validate that?
+
+  // each polygon is made of (N = ptype) points
+  // we connect each point and the last one back
+  for (int i = 0; i < object[0].Npts; i += object[0].ptype) {
+    // first check for any invalid values for this polygon
+    int skipObject = FALSE;
+    for (int j = 0; (j < object[0].ptype) && !skipObject; j++) {
+      int k = i + j;
+      if (!(finite(x[k]) && finite(y[k]))) skipObject = TRUE;
+    }
+    if (skipObject) continue;
+
+    for (int j = 0; (j < object[0].ptype); j++) {
+      int k = i + j;
+      sx0 = x[k]*mxi + y[k]*mxj + bx;
+      sy0 = x[k]*myi + y[k]*myj + by;
+
+      // last point connects to first
+      if (j == object[0].ptype - 1) {
+	sx1 = x[i]*mxi + y[i]*mxj + bx;
+	sy1 = x[i]*myi + y[i]*myj + by;
+      } else {
+	sx1 = x[k+1]*mxi + y[k+1]*mxj + bx;
+	sy1 = x[k+1]*myi + y[k+1]*myj + by;
+      }
+      bDrawClipLine (buffer, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
+    }
+  }
+}
+
+void bDrawFillPolygons (bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object) {
+
+  float *x, *y;
+  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
+  double sx0, sy0;
+  // double X0, X1, Y0, Y1;
+
+  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
+  mxj = graph[0].axis[1].dfx / (object[0].y1 - object[0].y0);
+  myi = graph[0].axis[0].dfy / (object[0].x1 - object[0].x0);
+  myj = graph[0].axis[1].dfy / (object[0].y1 - object[0].y0);
+  
+  bxi  =  graph[0].axis[0].fx - object[0].x0*graph[0].axis[0].dfx/(object[0].x1 - object[0].x0);
+  bxj  =  -object[0].y0*graph[0].axis[1].dfx/(object[0].y1 - object[0].y0);
+  byi  =  -object[0].x0*graph[0].axis[0].dfy/(object[0].x1 - object[0].x0);
+  byj  =  graph[0].axis[1].fy - object[0].y0*graph[0].axis[1].dfy/(object[0].y1 - object[0].y0);
+  
+  bx = bxi + bxj;
+  by = byi + byj;
+  
+  /*
+    window boundary so we can clip objects
+  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;
+  */
+
+  x = object[0].x; y = object[0].y;
+
+  // ptype must > 2
+  // Npts % ptype must be 0
+  // who must validate that?
+
+  ALLOCATE_PTR (xpts, double, object[0].ptype);
+  ALLOCATE_PTR (ypts, double, object[0].ptype);
+
+  int scaleColor = (object[0].color < 0);
+  unsigned char *pixel1, *pixel2, *pixel3;
+  float *z = object[0].z;
+
+  if (scaleColor) {
+    // scaled colors use the colormap defined for the graphic
+    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 (int 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;
+    }
+
+  }
+
+  // each polygon is made of (N = ptype) points
+  // we connect each point and the last one back
+  for (int i = 0; i < object[0].Npts; i += object[0].ptype) {
+    // first check for any invalid values for this polygon
+    int skipObject = FALSE;
+    for (int j = 0; (j < object[0].ptype) && !skipObject; j++) {
+      int k = i + j;
+      if (!(finite(x[k]) && finite(y[k]))) skipObject = TRUE;
+    }
+    if (skipObject) continue;
+
+    for (int j = 0; (j < object[0].ptype); j++) {
+      int k = i + j;
+      sx0 = x[k]*mxi + y[k]*mxj + bx;
+      sy0 = x[k]*myi + y[k]*myj + by;
+
+      xpts[j] = sx0;
+      ypts[j] = sy0;
+    }
+    
+    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];
+    }
+    bDrawPolyFill (buffer, xpts, ypts, object[0].ptype);
+  }
+  free (xpts);
+  free (ypts);
 }
 
@@ -888,8 +1043,8 @@
     // 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 (object[0].ptype == KAPA_POINT_CIRCLE_OPEN  	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_BOX_OPEN     	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN	) { D = scaleSize ? 0.66*dz*z[i] : 0.66*ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN_DOWN) { 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;
@@ -971,8 +1126,8 @@
     // 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 (object[0].ptype == KAPA_POINT_CIRCLE_OPEN  	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_BOX_OPEN     	) { D = scaleSize ? dz*z[i] : ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN	) { D = scaleSize ? 1.15*dz*z[i] : 1.15*ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN_DOWN) { 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;
@@ -995,6 +1150,6 @@
   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 (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN	) { D = scaleSize ? 0.58*dz*z[i] : 0.58*ds; }
+    if (object[0].ptype == KAPA_POINT_TRIANGLE_OPEN_DOWN) { 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;
