IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 39729


Ignore:
Timestamp:
Oct 6, 2016, 9:27:41 AM (10 years ago)
Author:
eugene
Message:

allow string-based plot styles (point type, line type, plot type); use abstract enums for plot styles internally

Location:
branches/czw_branch/20160809/Ohana/src
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • branches/czw_branch/20160809/Ohana/src/kapa2/include/prototypes.h

    r39457 r39729  
    115115void          PSLabels            PROTO((KapaGraphWidget *graph, FILE *f));
    116116void          PSTextlines         PROTO((KapaGraphWidget *graph, FILE *f));
     117int           PSObjectsN          PROTO((KapaGraphWidget *graph, Gobjects *objects, FILE *f));
    117118void          PSConnect           PROTO((KapaGraphWidget *graph, Gobjects *objects, FILE *f));
    118119void          PSHistogram         PROTO((KapaGraphWidget *graph, Gobjects *objects, FILE *f));
     
    135136void          bDrawLabels         PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph));
    136137void          bDrawTextlines      PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph));
     138int           bDrawObjectsN       PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
    137139void          bDrawConnect        PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
    138140void          bDrawHistogram      PROTO((bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object));
  • branches/czw_branch/20160809/Ohana/src/kapa2/src/DrawObjects.c

    r39594 r39729  
    88# 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))
    99
    10 # define CONNECT 0
    11 # define HISTOGRAM 1
    12 # define POINTS 2
    13 
    1410# define XCENTER 0.0
    1511# define YCENTER 0.0
     
    1713# define JOINSTYLE JoinMiter
    1814
     15// XXX this is not thread safe, but that is OK
    1916static Graphic *graphic;
    2017
     
    2421  int i;
    2522 
     23  // the functions below use this global value
     24  graphic = GetGraphic();
     25 
     26  // this function calls all of the supporting Draw... functions below
    2627  for (i = 0; i < graph[0].Nobjects; i++) {
    2728    if (DEBUG) fprintf (stderr, "object: %d\n", i);
     
    2930    DrawObjectN (graph, &graph[0].objects[i]);
    3031  }   
     32  XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
     33  XSetForeground (graphic->display, graphic->gc, graphic->fore);
    3134  return (TRUE);
    3235}
     
    4144  int lweight;
    4245 
    43   // this function calls all of the supporting Draw... functions below
    44   graphic = GetGraphic();
    45  
    4646  lweight = MAX (1, MIN (10, object[0].lweight));
    4747
     
    5858  /* set line type */
    5959  switch (object[0].ltype) {
    60     case 0:
    61       XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CAPSTYLE, JOINSTYLE);
    62       break;
    63     case 1:
     60    case KAPA_LINE_DOT:
    6461      XSetDashes (graphic->display, graphic->gc, 1, dot, 2);
    65       XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
    66       break;
    67     case 2:
     62      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
     63      break;
     64    case KAPA_LINE_DASH_SHORT:
    6865      XSetDashes (graphic->display, graphic->gc, 1, short_dash, 2);
    69       XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
    70       break;
    71     case 3:
     66      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
     67      break;
     68    case KAPA_LINE_DASH_LONG:
    7269      XSetDashes (graphic->display, graphic->gc, 1, long_dash, 2);
    73       XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
    74       break;
    75     case 4:
     70      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
     71      break;
     72    case KAPA_LINE_DOT_DASH:
    7673      XSetDashes (graphic->display, graphic->gc, 1, dot_dash, 4);
    77       XSetLineAttributes (graphic->display, graphic->gc, lweight, LineOnOffDash, CAPSTYLE, JOINSTYLE);
    78       break;
     74      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineDoubleDash, CAPSTYLE, JOINSTYLE);
     75      break;
     76    case KAPA_LINE_SOLID:
    7977    default:
    8078      XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CAPSTYLE, JOINSTYLE);
     
    8886
    8987  switch (object[0].style) {
    90     case CONNECT:
     88    case KAPA_PLOT_CONNECT:
    9189      DrawConnect (graph, object);
    9290      break;
    93     case HISTOGRAM:
     91    case KAPA_PLOT_HISTOGRAM:
    9492      DrawHistogram (graph, object);
    9593      break;
    96     case POINTS:
     94    case KAPA_PLOT_POINTS:
     95    default:
    9796      DrawPoints (graph, object);
    9897      break;
     
    105104    DrawXErrors (graph, object);
    106105  }
    107 
    108   XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
    109   XSetForeground (graphic->display, graphic->gc, graphic->fore);
    110106  return (TRUE);
    111107}
     
    429425  Graphic *graphic = GetGraphic();
    430426
    431   /**** points are scaled by object.z ***/
     427  /**** point sizes are scaled by object.size, colors by object.color ***/
    432428  int scaleSize = (object[0].size < 0);
    433429  int scaleColor = (object[0].color < 0);
     
    437433  x = object[0].x; y = object[0].y; z = object[0].z;
    438434
    439   if (object[0].ptype == 0) {   /* filled box */
    440     for (i = 0; i < object[0].Npts; i++) {
    441       if (!(finite(x[i]) && finite(y[i]))) continue;
    442       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    443       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    444       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    445           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    446         if (scaleColor) {
    447           if (!finite(z[i])) continue;
    448           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    449           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    450         }
    451         D = scaleSize ? dz*z[i] : ds;
    452         FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
    453       }
     435  switch (object[0].ptype) {
     436    case KAPA_POINT_BOX_OPEN:   /* open box */
     437      for (i = 0; i < object[0].Npts; i++) {
     438        if (!(finite(x[i]) && finite(y[i]))) continue;
     439        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     440        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     441        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     442            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     443          if (scaleColor) {
     444            if (!finite(z[i])) continue;
     445            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     446            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     447          }
     448          D = scaleSize ? dz*z[i] : ds;
     449          DrawRectangle (sx - D, sy - D, 2*D, 2*D);
     450        }
     451      }
     452      break;
     453    case KAPA_POINT_CROSS: /* cross */
     454      for (i = 0; i < object[0].Npts; i++) {
     455        if (!(finite(x[i]) && finite(y[i]))) continue;
     456        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     457        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     458        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     459            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     460          if (scaleColor) {
     461            if (!finite(z[i])) continue;
     462            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     463            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     464          }
     465          D = scaleSize ? dz*z[i] : ds;
     466          DrawLine (sx - D, sy, sx + D + 1, sy);
     467          DrawLine (sx, sy - D, sx, sy + D + 1);
     468        }
     469      }
     470      break;
     471    case KAPA_POINT_X:  /* x */
     472      for (i = 0; i < object[0].Npts; i++) {
     473        if (!(finite(x[i]) && finite(y[i]))) continue;
     474        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     475        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     476        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     477            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     478          if (scaleColor) {
     479            if (!finite(z[i])) continue;
     480            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     481            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     482          }
     483          D = scaleSize ? dz*z[i] : ds;
     484          DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
     485          DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
     486        }
     487      }
     488      break;
     489    case KAPA_POINT_TRIANGLE_SOLID:     /* filled triangle */
     490      for (i = 0; i < object[0].Npts; i++) {
     491        if (!(finite(x[i]) && finite(y[i]))) continue;
     492        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     493        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     494        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     495            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     496          if (scaleColor) {
     497            if (!finite(z[i])) continue;
     498            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     499            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     500          }
     501          D = scaleSize ? dz*z[i] : ds;
     502
     503          XPoint points[4];
     504          points[0].x = sx - D;  points[0].y = sy + 0.58*D; 
     505          points[1].x = sx + D;  points[1].y = sy + 0.58*D; 
     506          points[2].x = sx;      points[2].y = sy - 1.15*D; 
     507          points[3].x = sx - D;  points[3].y = sy + 0.58*D; 
     508          XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
     509        }
     510      }
     511      break;
     512    case KAPA_POINT_TRIANGLE_SOLID_DOWN: /* filled triangle (down) */
     513      for (i = 0; i < object[0].Npts; i++) {
     514        if (!(finite(x[i]) && finite(y[i]))) continue;
     515        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     516        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     517        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     518            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     519          if (scaleColor) {
     520            if (!finite(z[i])) continue;
     521            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     522            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     523          }
     524          D = scaleSize ? dz*z[i] : ds;
     525
     526          XPoint points[4];
     527          points[0].x = sx - D;  points[0].y = sy - 0.58*D; 
     528          points[1].x = sx + D;  points[1].y = sy - 0.58*D; 
     529          points[2].x = sx;      points[2].y = sy + 1.15*D; 
     530          points[3].x = sx - D;  points[3].y = sy - 0.58*D; 
     531          XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
     532        }
     533      }
     534      break;
     535    case KAPA_POINT_TRIANGLE_OPEN:      /* open triangle */
     536      for (i = 0; i < object[0].Npts; i++) {
     537        if (!(finite(x[i]) && finite(y[i]))) continue;
     538        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     539        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     540        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     541            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     542          if (scaleColor) {
     543            if (!finite(z[i])) continue;
     544            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     545            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     546          }
     547          D = scaleSize ? dz*z[i] : ds;
     548          DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
     549          DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
     550          DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
     551        }
     552      }
     553      break;
     554    case KAPA_POINT_TRIANGLE_OPEN_DOWN: /* upside-down open triangle */
     555      for (i = 0; i < object[0].Npts; i++) {
     556        if (!(finite(x[i]) && finite(y[i]))) continue;
     557        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     558        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     559        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     560            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     561          if (scaleColor) {
     562            if (!finite(z[i])) continue;
     563            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     564            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     565          }
     566          D = scaleSize ? dz*z[i] : ds;
     567          DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
     568          DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
     569          DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
     570        }
     571      }
     572      break;
     573    case KAPA_POINT_Y:  /* Y */
     574      for (i = 0; i < object[0].Npts; i++) {
     575        if (!(finite(x[i]) && finite(y[i]))) continue;
     576        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     577        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     578        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     579            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     580          if (scaleColor) {
     581            if (!finite(z[i])) continue;
     582            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     583            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     584          }
     585          D = scaleSize ? dz*z[i] : ds;
     586          DrawLine (sx, sy, sx - D, sy - 0.58*D);
     587          DrawLine (sx, sy, sx + D, sy - 0.58*D);
     588          DrawLine (sx, sy, sx,     sy + 1.15*D);
     589        }
     590      }
     591      break;
     592    case KAPA_POINT_Y_DOWN:     /* upside-down Y */
     593      for (i = 0; i < object[0].Npts; i++) {
     594        if (!(finite(x[i]) && finite(y[i]))) continue;
     595        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     596        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     597        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     598            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     599          if (scaleColor) {
     600            if (!finite(z[i])) continue;
     601            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     602            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     603          }
     604          D = scaleSize ? dz*z[i] : ds;
     605          DrawLine (sx, sy, sx - D, sy + 0.58*D);
     606          DrawLine (sx, sy, sx + D, sy + 0.58*D);
     607          DrawLine (sx, sy, sx,     sy - 1.15*D);
     608        }
     609      }
     610      break;
     611    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
     612      for (i = 0; i < object[0].Npts; i++) {
     613        if (!(finite(x[i]) && finite(y[i]))) continue;
     614        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     615        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     616        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     617            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     618          if (scaleColor) {
     619            if (!finite(z[i])) continue;
     620            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     621            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     622          }
     623          D = scaleSize ? dz*z[i] : ds;
     624          DrawCircle (sx, sy, D);
     625        }
     626      }
     627      break;
     628    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
     629      for (i = 0; i < object[0].Npts; i++) {
     630        if (!(finite(x[i]) && finite(y[i]))) continue;
     631        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     632        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     633        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     634            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     635          if (scaleColor) {
     636            if (!finite(z[i])) continue;
     637            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     638            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     639          }
     640          D = scaleSize ? dz*z[i] : ds;
     641          FillCircle (sx, sy, D);
     642          DrawCircle (sx, sy, D);
     643        }
     644      }
     645      break;
     646    case KAPA_POINT_PENTAGON:   /* pentagon */
     647      for (i = 0; i < object[0].Npts; i++) {
     648        if (!(finite(x[i]) && finite(y[i]))) continue;
     649        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     650        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     651        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     652            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     653          if (scaleColor) {
     654            if (!finite(z[i])) continue;
     655            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     656            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     657          }
     658          D = scaleSize ? dz*z[i] : ds;
     659          DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
     660          DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
     661          DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
     662          DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
     663          DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
     664        }
     665      }
     666      break;
     667    case KAPA_POINT_HEXAGON:    /* hexagon */
     668      for (i = 0; i < object[0].Npts; i++) {
     669        if (!(finite(x[i]) && finite(y[i]))) continue;
     670        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     671        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     672        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     673            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     674          if (scaleColor) {
     675            if (!finite(z[i])) continue;
     676            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     677            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     678          }
     679          D = scaleSize ? dz*z[i] : ds;
     680          DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
     681          DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     682          DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     683
     684          DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
     685          DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     686          DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     687        }
     688      }
     689      break;
     690    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
     691      double X0 = graph[0].axis[0].fx;
     692      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     693      double Y0 = graph[0].axis[1].fy;
     694      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     695
     696      for (i = 0; i + 1 < object[0].Npts; i+=2) {
     697        if (!(finite(x[i]) && finite(y[i]))) continue;
     698        sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     699        sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     700        if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
     701        sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
     702        sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
     703        ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
     704      }
     705      break;
    454706    }
    455   }
    456   if (object[0].ptype == 1) {   /* open box */
    457     for (i = 0; i < object[0].Npts; i++) {
    458       if (!(finite(x[i]) && finite(y[i]))) continue;
    459       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    460       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    461       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    462           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    463         if (scaleColor) {
    464           if (!finite(z[i])) continue;
    465           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    466           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    467         }
    468         D = scaleSize ? dz*z[i] : ds;
    469         DrawRectangle (sx - D, sy - D, 2*D, 2*D);
    470       }
    471     }
    472   }
    473   if (object[0].ptype == 2) { /* cross */
    474     for (i = 0; i < object[0].Npts; i++) {
    475       if (!(finite(x[i]) && finite(y[i]))) continue;
    476       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    477       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    478       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    479           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    480         if (scaleColor) {
    481           if (!finite(z[i])) continue;
    482           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    483           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    484         }
    485         D = scaleSize ? dz*z[i] : ds;
    486         DrawLine (sx - D, sy, sx + D + 1, sy);
    487         DrawLine (sx, sy - D, sx, sy + D + 1);
    488       }
    489     }
    490   }
    491   if (object[0].ptype == 3) {   /* x */
    492     for (i = 0; i < object[0].Npts; i++) {
    493       if (!(finite(x[i]) && finite(y[i]))) continue;
    494       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    495       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    496       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    497           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    498         if (scaleColor) {
    499           if (!finite(z[i])) continue;
    500           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    501           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    502         }
    503         D = scaleSize ? dz*z[i] : ds;
    504         DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
    505         DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
    506       }
    507     }
    508   }
    509   if (object[0].ptype == 4) {   /* filled triangle */
    510     XPoint points[4];
    511     for (i = 0; i < object[0].Npts; i++) {
    512       if (!(finite(x[i]) && finite(y[i]))) continue;
    513       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    514       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    515       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    516           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    517         if (scaleColor) {
    518           if (!finite(z[i])) continue;
    519           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    520           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    521         }
    522         D = scaleSize ? dz*z[i] : ds;
    523         points[0].x = sx - D;  points[0].y = sy + 0.58*D; 
    524         points[1].x = sx + D;  points[1].y = sy + 0.58*D; 
    525         points[2].x = sx;      points[2].y = sy - 1.15*D; 
    526         points[3].x = sx - D;  points[3].y = sy + 0.58*D; 
    527         XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
    528       }
    529     }
    530   }
    531   if (object[0].ptype == 5) {   /* open triangle */
    532     for (i = 0; i < object[0].Npts; i++) {
    533       if (!(finite(x[i]) && finite(y[i]))) continue;
    534       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    535       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    536       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    537           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    538         if (scaleColor) {
    539           if (!finite(z[i])) continue;
    540           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    541           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    542         }
    543         D = scaleSize ? dz*z[i] : ds;
    544         DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
    545         DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
    546         DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
    547       }
    548     }
    549   }
    550   if (object[0].ptype == 6) {   /* Y */
    551     for (i = 0; i < object[0].Npts; i++) {
    552       if (!(finite(x[i]) && finite(y[i]))) continue;
    553       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    554       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    555       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    556           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    557         if (scaleColor) {
    558           if (!finite(z[i])) continue;
    559           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    560           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    561         }
    562         D = scaleSize ? dz*z[i] : ds;
    563         DrawLine (sx, sy, sx - D, sy - 0.58*D);
    564         DrawLine (sx, sy, sx + D, sy - 0.58*D);
    565         DrawLine (sx, sy, sx,     sy + 1.15*D);
    566       }
    567     }
    568   }
    569   if (object[0].ptype == 7) {   /* 0 */
    570     for (i = 0; i < object[0].Npts; i++) {
    571       if (!(finite(x[i]) && finite(y[i]))) continue;
    572       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    573       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    574       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    575           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    576         if (scaleColor) {
    577           if (!finite(z[i])) continue;
    578           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    579           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    580         }
    581         D = scaleSize ? dz*z[i] : ds;
    582         DrawCircle (sx, sy, D);
    583       }
    584     }
    585   }
    586   if (object[0].ptype == 8) {   /* pentagon */
    587     for (i = 0; i < object[0].Npts; i++) {
    588       if (!(finite(x[i]) && finite(y[i]))) continue;
    589       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    590       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    591       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    592           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    593         if (scaleColor) {
    594           if (!finite(z[i])) continue;
    595           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    596           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    597         }
    598         D = scaleSize ? dz*z[i] : ds;
    599         DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
    600         DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
    601         DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
    602         DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
    603         DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
    604       }
    605     }
    606   }
    607   if (object[0].ptype == 9) {   /* hexagon */
    608     for (i = 0; i < object[0].Npts; i++) {
    609       if (!(finite(x[i]) && finite(y[i]))) continue;
    610       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    611       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    612       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    613           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    614         if (scaleColor) {
    615           if (!finite(z[i])) continue;
    616           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    617           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    618         }
    619         D = scaleSize ? dz*z[i] : ds;
    620         DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
    621         DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
    622         DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
    623 
    624         DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
    625         DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
    626         DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
    627       }
    628     }
    629   }
    630   if (object[0].ptype == 10) {  /* filled 0 */
    631     for (i = 0; i < object[0].Npts; i++) {
    632       if (!(finite(x[i]) && finite(y[i]))) continue;
    633       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    634       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    635       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    636           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    637         if (scaleColor) {
    638           if (!finite(z[i])) continue;
    639           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    640           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    641         }
    642         D = scaleSize ? dz*z[i] : ds;
    643         FillCircle (sx, sy, D);
    644       }
    645     }
    646   }
    647   if (object[0].ptype == 12) {  /* filled triangle (down) */
    648     XPoint points[4];
    649     for (i = 0; i < object[0].Npts; i++) {
    650       if (!(finite(x[i]) && finite(y[i]))) continue;
    651       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    652       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    653       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    654           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    655         if (scaleColor) {
    656           if (!finite(z[i])) continue;
    657           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    658           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    659         }
    660         D = scaleSize ? dz*z[i] : ds;
    661         points[0].x = sx - D;  points[0].y = sy - 0.58*D; 
    662         points[1].x = sx + D;  points[1].y = sy - 0.58*D; 
    663         points[2].x = sx;      points[2].y = sy + 1.15*D; 
    664         points[3].x = sx - D;  points[3].y = sy - 0.58*D; 
    665         XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
    666       }
    667     }
    668   }
    669   if (object[0].ptype == 14) {  /* upside-down filled triangle */
    670     XPoint points[4];
    671     for (i = 0; i < object[0].Npts; i++) {
    672       if (!(finite(x[i]) && finite(y[i]))) continue;
    673       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    674       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    675       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    676           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    677         if (scaleColor) {
    678           if (!finite(z[i])) continue;
    679           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    680           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    681         }
    682         D = scaleSize ? dz*z[i] : ds;
    683         points[0].x = sx - D;  points[0].y = sy - 0.58*D; 
    684         points[1].x = sx + D;  points[1].y = sy - 0.58*D; 
    685         points[2].x = sx;      points[2].y = sy + 1.15*D; 
    686         points[3].x = sx - D;  points[3].y = sy - 0.58*D; 
    687         XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
    688       }
    689     }
    690   }
    691   if (object[0].ptype == 15) {  /* upside-down open triangle */
    692     for (i = 0; i < object[0].Npts; i++) {
    693       if (!(finite(x[i]) && finite(y[i]))) continue;
    694       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    695       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    696       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    697           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    698         if (scaleColor) {
    699           if (!finite(z[i])) continue;
    700           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    701           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    702         }
    703         D = scaleSize ? dz*z[i] : ds;
    704         DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
    705         DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
    706         DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
    707       }
    708     }
    709   }
    710   if (object[0].ptype == 16) {  /* upside-down Y */
    711     for (i = 0; i < object[0].Npts; i++) {
    712       if (!(finite(x[i]) && finite(y[i]))) continue;
    713       sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    714       sy = x[i]*myi + y[i]*myj + by + YCENTER;
    715       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    716           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
    717         if (scaleColor) {
    718           if (!finite(z[i])) continue;
    719           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    720           XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
    721         }
    722         D = scaleSize ? dz*z[i] : ds;
    723         DrawLine (sx, sy, sx - D, sy + 0.58*D);
    724         DrawLine (sx, sy, sx + D, sy + 0.58*D);
    725         DrawLine (sx, sy, sx,     sy - 1.15*D);
    726       }
    727     }
    728   }
    729   if (object[0].ptype == 100) { /* connect a pair of points */
    730 
    731     double X0 = graph[0].axis[0].fx;
    732     double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    733     double Y0 = graph[0].axis[1].fy;
    734     double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    735 
    736     for (i = 0; i + 1 < object[0].Npts; i+=2) {
    737       if (!(finite(x[i]) && finite(y[i]))) continue;
    738       sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    739       sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
    740       if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
    741       sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
    742       sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
    743       ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    744     }
     707    case KAPA_POINT_BOX_SOLID:  /* filled box */
     708    default:
     709      for (i = 0; i < object[0].Npts; i++) {
     710        if (!(finite(x[i]) && finite(y[i]))) continue;
     711        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     712        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     713        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     714            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     715          if (scaleColor) {
     716            if (!finite(z[i])) continue;
     717            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     718            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     719          }
     720          D = scaleSize ? dz*z[i] : ds;
     721          FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
     722        }
     723      }
     724      break;
    745725  }
    746726}
  • branches/czw_branch/20160809/Ohana/src/kapa2/src/PSObjects.c

    r38153 r39729  
    77# define FillCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f FC\n", (X1), (graphic->dy - Y1), (R)))
    88# 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)))
    9 # define CONNECT 0
    10 # define HISTOGRAM 1
    11 # define POINTS 2
    12 
     9
     10# define CAPSTYLE 1 /* CapButt */
     11# define JOINSTYLE 0 /* JoinMiter */
     12
     13// XXX this is not thread safe, but that is OK
    1314static Graphic *graphic;
    1415
     
    1617 
    1718  int i;
    18   double lweight;
    19   static char dash[] = "5";
    20   static char dot[] = "3";
    21  
     19 
     20  // the functions below use this global value
    2221  graphic = GetGraphic();
    2322
     23  // this function calls all of the supporting Draw... functions below
    2424  for (i = 0; i < graph[0].Nobjects; i++) {
    25     switch (graph[0].objects[i].ltype) {
    26     case 0:
    27       break;
    28     case 1:
    29       fprintf (f, "[%s] 0 setdash\n", dash);
    30       break;
    31     case 2:
     25    PSObjectsN (graph, &graph[0].objects[i], f);
     26  }
     27  // reset to default color and style
     28  fprintf (f, "[] 0 setdash\n");
     29  fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
     30
     31  return (TRUE);
     32}
     33
     34int PSObjectsN (KapaGraphWidget *graph, Gobjects *object, FILE *f) {
     35 
     36  static char short_dash[] = "4 4";
     37  static char long_dash[] = "8 8";
     38  static char dot_dash[] = "2 4 4 4";
     39  static char dot[] = "2 3";
     40 
     41  double lweight = MAX (0, MIN (10, object->lweight));
     42  fprintf (f, "%.1f setlinewidth\n", lweight);
     43  fprintf (f, "%d setlinecap %d setlinejoin\n", CAPSTYLE, JOINSTYLE);
     44
     45  switch (object->ltype) {
     46    case KAPA_LINE_DOT:
    3247      fprintf (f, "[%s] 0 setdash\n", dot);
    3348      break;
     49    case KAPA_LINE_DASH_SHORT:
     50      fprintf (f, "[%s] 0 setdash\n", short_dash);
     51      break;
     52    case KAPA_LINE_DASH_LONG:
     53      fprintf (f, "[%s] 0 setdash\n", long_dash);
     54      break;
     55    case KAPA_LINE_DOT_DASH:
     56      fprintf (f, "[%s] 0 setdash\n", dot_dash);
     57      break;
     58    case KAPA_LINE_SOLID: // no need to call 'setdash' as solid is the default
    3459    default:
    3560      break;
    36     }
     61  }
    3762   
    38     lweight = MAX (0, MIN (10, graph[0].objects[i].lweight));
    39     fprintf (f, "%.1f setlinewidth\n", lweight);
    40 
    41     if (graph[0].objects[i].color >= 0) {
    42         fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(graph[0].objects[i].color));
    43     }
    44 
    45     switch (graph[0].objects[i].style) {
    46     case CONNECT:
    47       PSConnect (graph, &graph[0].objects[i], f);
    48       break;
    49     case HISTOGRAM:
    50       PSHistogram (graph, &graph[0].objects[i], f);
    51       break;
    52     case POINTS:
    53       PSPoints (graph, &graph[0].objects[i], f);
    54       break;
    55     }
    56 
    57     if (graph[0].objects[i].etype & 0x01) {
    58       PSYErrors (graph, &graph[0].objects[i], f);
    59     }
    60     if (graph[0].objects[i].etype & 0x02) {
    61       PSXErrors (graph, &graph[0].objects[i], f);
    62     }
    63     fprintf (f, "[] 0 setdash\n");
    64     fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
     63  if (object->color >= 0) {
     64    fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(object->color));
     65  }
     66
     67  switch (object->style) {
     68    case KAPA_PLOT_CONNECT:
     69      PSConnect (graph, object, f);
     70      break;
     71    case KAPA_PLOT_HISTOGRAM:
     72      PSHistogram (graph, object, f);
     73      break;
     74    case KAPA_PLOT_POINTS:
     75    default:
     76      PSPoints (graph, object, f);
     77      break;
     78  }
     79
     80  if (object->etype & 0x01) {
     81    PSYErrors (graph, object, f);
     82  }
     83  if (object->etype & 0x02) {
     84    PSXErrors (graph, object, f);
    6585  }
    6686  return (TRUE);
     
    303323  }
    304324
    305   // black, I think
    306325  // fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
    307326
    308   /**** points are scaled by object.z ***/
     327  /**** point sizes are scaled by object.size, colors by object.color ***/
    309328  int scaleSize = (object[0].size < 0);
    310329  int scaleColor = (object[0].color < 0);
     
    314333  x = object[0].x; y = object[0].y; z = object[0].z;
    315334
    316   if (object[0].ptype == 0) {   /* filled box */
    317     for (i = 0; i < object[0].Npts; i++) {
    318       if (!(finite(x[i]) && finite(y[i]))) continue;
    319       sx = x[i]*mxi + y[i]*mxj + bx;
    320       sy = x[i]*myi + y[i]*myj + by;
    321       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    322           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    323       {
    324         if (scaleColor) {
    325           if (!finite(z[i])) continue;
    326           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    327           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    328         }
    329         D = scaleSize ? dz*z[i] : ds;
    330         FillRectangle (sx, sy, 2*D, 2*D);
    331       }
     335  switch (object[0].ptype) {
     336    case KAPA_POINT_BOX_OPEN:   /* open box */
     337      for (i = 0; i < object[0].Npts; i++) {
     338        if (!(finite(x[i]) && finite(y[i]))) continue;
     339        sx = x[i]*mxi + y[i]*mxj + bx;
     340        sy = x[i]*myi + y[i]*myj + by;
     341        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     342            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     343          if (scaleColor) {
     344            if (!finite(z[i])) continue;
     345            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     346            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     347          }
     348          D = scaleSize ? dz*z[i] : ds;
     349          DrawRectangle (sx, sy, 2*D, 2*D);
     350        }
     351      }
     352      break;
     353    case KAPA_POINT_CROSS: /* cross */
     354      for (i = 0; i < object[0].Npts; i++) {
     355        if (!(finite(x[i]) && finite(y[i]))) continue;
     356        sx = x[i]*mxi + y[i]*mxj + bx;
     357        sy = x[i]*myi + y[i]*myj + by;
     358        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     359            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     360          if (scaleColor) {
     361            if (!finite(z[i])) continue;
     362            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     363            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     364          }
     365          D = scaleSize ? dz*z[i] : ds;
     366          DrawLine (sx - D, sy, sx + D, sy);
     367          DrawLine (sx, sy - D, sx, sy + D);
     368        }
     369      }
     370      break;
     371    case KAPA_POINT_X:  /* x */
     372      for (i = 0; i < object[0].Npts; i++) {
     373        if (!(finite(x[i]) && finite(y[i]))) continue;
     374        sx = x[i]*mxi + y[i]*mxj + bx;
     375        sy = x[i]*myi + y[i]*myj + by;
     376        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     377            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     378          if (scaleColor) {
     379            if (!finite(z[i])) continue;
     380            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     381            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     382          }
     383          D = scaleSize ? dz*z[i] : ds;
     384          DrawLine (sx + D, sy - D, sx - D, sy + D);
     385          DrawLine (sx - D, sy - D, sx + D, sy + D);
     386        }
     387      }
     388      break;
     389    case KAPA_POINT_TRIANGLE_SOLID:     /* filled triangle */
     390      for (i = 0; i < object[0].Npts; i++) {
     391        if (!(finite(x[i]) && finite(y[i]))) continue;
     392        sx = x[i]*mxi + y[i]*mxj + bx;
     393        sy = x[i]*myi + y[i]*myj + by;
     394        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     395            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     396          if (scaleColor) {
     397            if (!finite(z[i])) continue;
     398            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     399            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     400          }
     401          D = scaleSize ? dz*z[i] : ds;
     402          FillTriangle (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
     403        }
     404      }
     405      break;
     406    case KAPA_POINT_TRIANGLE_SOLID_DOWN:        /* open triangle */
     407      for (i = 0; i < object[0].Npts; i++) {
     408        if (!(finite(x[i]) && finite(y[i]))) continue;
     409        sx = x[i]*mxi + y[i]*mxj + bx;
     410        sy = x[i]*myi + y[i]*myj + by;
     411        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     412            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     413          if (scaleColor) {
     414            if (!finite(z[i])) continue;
     415            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     416            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     417          }
     418          D = scaleSize ? dz*z[i] : ds;
     419          FillTriangle (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
     420        }
     421      }
     422      break;
     423    case KAPA_POINT_TRIANGLE_OPEN:      /* open triangle */
     424      for (i = 0; i < object[0].Npts; i++) {
     425        if (!(finite(x[i]) && finite(y[i]))) continue;
     426        sx = x[i]*mxi + y[i]*mxj + bx;
     427        sy = x[i]*myi + y[i]*myj + by;
     428        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     429            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     430          if (scaleColor) {
     431            if (!finite(z[i])) continue;
     432            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     433            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     434          }
     435          D = scaleSize ? dz*z[i] : ds;
     436          DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
     437          DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
     438          DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
     439        }
     440      }
     441      break;
     442    case KAPA_POINT_TRIANGLE_OPEN_DOWN: /* upside-down open triangle */
     443      for (i = 0; i < object[0].Npts; i++) {
     444        if (!(finite(x[i]) && finite(y[i]))) continue;
     445        sx = x[i]*mxi + y[i]*mxj + bx;
     446        sy = x[i]*myi + y[i]*myj + by;
     447        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     448            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     449          if (scaleColor) {
     450            if (!finite(z[i])) continue;
     451            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     452            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     453          }
     454          D = scaleSize ? dz*z[i] : ds;
     455          DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
     456          DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
     457          DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
     458        }
     459      }
     460      break;
     461    case KAPA_POINT_Y:  /* Y */
     462      for (i = 0; i < object[0].Npts; i++) {
     463        if (!(finite(x[i]) && finite(y[i]))) continue;
     464        sx = x[i]*mxi + y[i]*mxj + bx;
     465        sy = x[i]*myi + y[i]*myj + by;
     466        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     467            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     468          if (scaleColor) {
     469            if (!finite(z[i])) continue;
     470            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     471            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     472          }
     473          D = scaleSize ? dz*z[i] : ds;
     474          DrawLine (sx, sy, sx - D, sy + 0.58*D);
     475          DrawLine (sx, sy, sx + D, sy + 0.58*D);
     476          DrawLine (sx, sy, sx,          sy - 1.15*D);
     477        }
     478      }
     479      break;
     480    case KAPA_POINT_Y_DOWN:     /* upside-down Y */
     481      for (i = 0; i < object[0].Npts; i++) {
     482        if (!(finite(x[i]) && finite(y[i]))) continue;
     483        sx = x[i]*mxi + y[i]*mxj + bx;
     484        sy = x[i]*myi + y[i]*myj + by;
     485        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     486            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     487          if (scaleColor) {
     488            if (!finite(z[i])) continue;
     489            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     490            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     491          }
     492          D = scaleSize ? dz*z[i] : ds;
     493          DrawLine (sx, sy, sx - D, sy - 0.58*D);
     494          DrawLine (sx, sy, sx + D, sy - 0.58*D);
     495          DrawLine (sx, sy, sx,     sy + 1.15*D);
     496        }
     497      }
     498      break;
     499    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
     500      for (i = 0; i < object[0].Npts; i++) {
     501        if (!(finite(x[i]) && finite(y[i]))) continue;
     502        sx = x[i]*mxi + y[i]*mxj + bx;
     503        sy = x[i]*myi + y[i]*myj + by;
     504        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     505            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     506          if (scaleColor) {
     507            if (!finite(z[i])) continue;
     508            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     509            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     510          }
     511          D = scaleSize ? dz*z[i] : ds;
     512          DrawCircle (sx, sy, D);
     513        }
     514      }
     515      break;
     516    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
     517      for (i = 0; i < object[0].Npts; i++) {
     518        if (!(finite(x[i]) && finite(y[i]))) continue;
     519        sx = x[i]*mxi + y[i]*mxj + bx;
     520        sy = x[i]*myi + y[i]*myj + by;
     521        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     522            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     523          if (scaleColor) {
     524            if (!finite(z[i])) continue;
     525            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     526            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     527          }
     528          D = scaleSize ? dz*z[i] : ds;
     529          FillCircle (sx, sy, D);
     530        }
     531      }
     532      break;
     533    case KAPA_POINT_PENTAGON:   /* pentagon */
     534      for (i = 0; i < object[0].Npts; i++) {
     535        if (!(finite(x[i]) && finite(y[i]))) continue;
     536        sx = x[i]*mxi + y[i]*mxj + bx;
     537        sy = x[i]*myi + y[i]*myj + by;
     538        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     539            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     540          if (scaleColor) {
     541            if (!finite(z[i])) continue;
     542            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     543            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     544          }
     545          D = scaleSize ? dz*z[i] : ds;
     546          DrawLine (sx + 0.00*D, sy + 1.00*D, sx + 0.95*D, sy + 0.31*D);
     547          DrawLine (sx + 0.95*D, sy + 0.31*D, sx + 0.58*D, sy - 0.81*D);
     548          DrawLine (sx + 0.58*D, sy - 0.81*D, sx - 0.58*D, sy - 0.81*D);
     549          DrawLine (sx - 0.58*D, sy - 0.81*D, sx - 0.95*D, sy + 0.31*D);
     550          DrawLine (sx - 0.95*D, sy + 0.31*D, sx + 0.00*D, sy + 1.00*D);
     551        }
     552      }
     553      break;
     554    case KAPA_POINT_HEXAGON:    /* hexagon */
     555      for (i = 0; i < object[0].Npts; i++) {
     556        if (!(finite(x[i]) && finite(y[i]))) continue;
     557        sx = x[i]*mxi + y[i]*mxj + bx;
     558        sy = x[i]*myi + y[i]*myj + by;
     559        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     560            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     561          if (scaleColor) {
     562            if (!finite(z[i])) continue;
     563            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     564            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     565          }
     566          D = scaleSize ? dz*z[i] : ds;
     567          DrawLine (sx -      D, sy,               sx - 0.50*D, sy + 0.87*D);
     568          DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     569          DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     570
     571          DrawLine (sx +      D, sy,               sx + 0.50*D, sy - 0.87*D);
     572          DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     573          DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     574        }
     575      }
     576      break;
     577    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
     578      double X0 = graph[0].axis[0].fx;
     579      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     580      double Y0 = graph[0].axis[1].fy;
     581      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     582
     583      for (i = 0; i + 1 < object[0].Npts; i+=2) {
     584        if (!(finite(x[i]) && finite(y[i]))) continue;
     585        sx1 = x[i]*mxi + y[i]*mxj + bx;
     586        sy1 = x[i]*myi + y[i]*myj + by;
     587        sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
     588        sy2 = x[i+1]*myi + y[i+1]*myj + by;
     589        ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
     590      }
     591      break;
    332592    }
    333   }
    334   if (object[0].ptype == 1) {   /* open box */
    335     for (i = 0; i < object[0].Npts; i++) {
    336       if (!(finite(x[i]) && finite(y[i]))) continue;
    337       sx = x[i]*mxi + y[i]*mxj + bx;
    338       sy = x[i]*myi + y[i]*myj + by;
    339       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    340           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    341       {
    342         if (scaleColor) {
    343           if (!finite(z[i])) continue;
    344           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    345           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    346         }
    347         D = scaleSize ? dz*z[i] : ds;
    348         DrawRectangle (sx, sy, 2*D, 2*D);
    349       }
    350     }
    351   }
    352   if (object[0].ptype == 2) { /* cross */
    353     for (i = 0; i < object[0].Npts; i++) {
    354       if (!(finite(x[i]) && finite(y[i]))) continue;
    355       sx = x[i]*mxi + y[i]*mxj + bx;
    356       sy = x[i]*myi + y[i]*myj + by;
    357       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    358           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    359       {
    360         if (scaleColor) {
    361           if (!finite(z[i])) continue;
    362           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    363           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    364         }
    365         D = scaleSize ? dz*z[i] : ds;
    366         DrawLine (sx - D, sy, sx + D, sy);
    367         DrawLine (sx, sy - D, sx, sy + D);
    368       }
    369     }
    370   }
    371   if (object[0].ptype == 3) {   /* x */
    372     for (i = 0; i < object[0].Npts; i++) {
    373       if (!(finite(x[i]) && finite(y[i]))) continue;
    374       sx = x[i]*mxi + y[i]*mxj + bx;
    375       sy = x[i]*myi + y[i]*myj + by;
    376       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    377           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    378       {
    379         if (scaleColor) {
    380           if (!finite(z[i])) continue;
    381           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    382           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    383         }
    384         D = scaleSize ? dz*z[i] : ds;
    385         DrawLine (sx + D, sy - D, sx - D, sy + D);
    386         DrawLine (sx - D, sy - D, sx + D, sy + D);
    387       }
    388     }
    389   }
    390   if (object[0].ptype == 4) {   /* filled triangle */
    391     for (i = 0; i < object[0].Npts; i++) {
    392       if (!(finite(x[i]) && finite(y[i]))) continue;
    393       sx = x[i]*mxi + y[i]*mxj + bx;
    394       sy = x[i]*myi + y[i]*myj + by;
    395       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    396           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    397       {
    398         if (scaleColor) {
    399           if (!finite(z[i])) continue;
    400           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    401           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    402         }
    403         D = scaleSize ? dz*z[i] : ds;
    404         FillTriangle (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
    405       }
    406     }
    407   }
    408   if (object[0].ptype == 14) {  /* filled triangle */
    409     for (i = 0; i < object[0].Npts; i++) {
    410       if (!(finite(x[i]) && finite(y[i]))) continue;
    411       sx = x[i]*mxi + y[i]*mxj + bx;
    412       sy = x[i]*myi + y[i]*myj + by;
    413       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    414           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    415       {
    416         if (scaleColor) {
    417           if (!finite(z[i])) continue;
    418           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    419           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    420         }
    421         D = scaleSize ? dz*z[i] : ds;
    422         FillTriangle (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
    423       }
    424     }
    425   }
    426   if (object[0].ptype == 5) {   /* open triangle */
    427     for (i = 0; i < object[0].Npts; i++) {
    428       if (!(finite(x[i]) && finite(y[i]))) continue;
    429       sx = x[i]*mxi + y[i]*mxj + bx;
    430       sy = x[i]*myi + y[i]*myj + by;
    431       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    432           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    433       {
    434         if (scaleColor) {
    435           if (!finite(z[i])) continue;
    436           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    437           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    438         }
    439         D = scaleSize ? dz*z[i] : ds;
    440         DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
    441         DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
    442         DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
    443       }
    444     }
    445   }
    446   if (object[0].ptype == 15) {  /* upside-down open triangle */
    447     for (i = 0; i < object[0].Npts; i++) {
    448       if (!(finite(x[i]) && finite(y[i]))) continue;
    449       sx = x[i]*mxi + y[i]*mxj + bx;
    450       sy = x[i]*myi + y[i]*myj + by;
    451       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    452           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    453       {
    454         if (scaleColor) {
    455           if (!finite(z[i])) continue;
    456           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    457           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    458         }
    459         D = scaleSize ? dz*z[i] : ds;
    460         DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
    461         DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
    462         DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
    463       }
    464     }
    465   }
    466   if (object[0].ptype == 6) {   /* Y */
    467     for (i = 0; i < object[0].Npts; i++) {
    468       if (!(finite(x[i]) && finite(y[i]))) continue;
    469       sx = x[i]*mxi + y[i]*mxj + bx;
    470       sy = x[i]*myi + y[i]*myj + by;
    471       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    472           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    473       {
    474         if (scaleColor) {
    475           if (!finite(z[i])) continue;
    476           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    477           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    478         }
    479         D = scaleSize ? dz*z[i] : ds;
    480         DrawLine (sx, sy, sx - D, sy + 0.58*D);
    481         DrawLine (sx, sy, sx + D, sy + 0.58*D);
    482         DrawLine (sx, sy, sx,          sy - 1.15*D);
    483       }
    484     }
    485   }
    486   if (object[0].ptype == 16) {  /* Y */
    487     for (i = 0; i < object[0].Npts; i++) {
    488       if (!(finite(x[i]) && finite(y[i]))) continue;
    489       sx = x[i]*mxi + y[i]*mxj + bx;
    490       sy = x[i]*myi + y[i]*myj + by;
    491       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    492           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    493       {
    494         if (scaleColor) {
    495           if (!finite(z[i])) continue;
    496           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    497           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    498         }
    499         D = scaleSize ? dz*z[i] : ds;
    500         DrawLine (sx, sy, sx - D, sy - 0.58*D);
    501         DrawLine (sx, sy, sx + D, sy - 0.58*D);
    502         DrawLine (sx, sy, sx,     sy + 1.15*D);
    503       }
    504     }
    505   }
    506   if (object[0].ptype == 7) {   /* 0 */
    507     for (i = 0; i < object[0].Npts; i++) {
    508       if (!(finite(x[i]) && finite(y[i]))) continue;
    509       sx = x[i]*mxi + y[i]*mxj + bx;
    510       sy = x[i]*myi + y[i]*myj + by;
    511       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    512           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    513       {
    514         if (scaleColor) {
    515           if (!finite(z[i])) continue;
    516           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    517           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    518         }
    519         D = scaleSize ? dz*z[i] : ds;
    520         DrawCircle (sx, sy, D);
    521       }
    522     }
    523   }
    524   if (object[0].ptype == 8) {   /* pentagon */
    525     for (i = 0; i < object[0].Npts; i++) {
    526       if (!(finite(x[i]) && finite(y[i]))) continue;
    527       sx = x[i]*mxi + y[i]*mxj + bx;
    528       sy = x[i]*myi + y[i]*myj + by;
    529       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    530           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    531       {
    532         if (scaleColor) {
    533           if (!finite(z[i])) continue;
    534           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    535           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    536         }
    537         D = scaleSize ? dz*z[i] : ds;
    538         DrawLine (sx + 0.00*D, sy + 1.00*D, sx + 0.95*D, sy + 0.31*D);
    539         DrawLine (sx + 0.95*D, sy + 0.31*D, sx + 0.58*D, sy - 0.81*D);
    540         DrawLine (sx + 0.58*D, sy - 0.81*D, sx - 0.58*D, sy - 0.81*D);
    541         DrawLine (sx - 0.58*D, sy - 0.81*D, sx - 0.95*D, sy + 0.31*D);
    542         DrawLine (sx - 0.95*D, sy + 0.31*D, sx + 0.00*D, sy + 1.00*D);
    543       }
    544     }
    545   }
    546   if (object[0].ptype == 9) {   /* hexagon */
    547     for (i = 0; i < object[0].Npts; i++) {
    548       if (!(finite(x[i]) && finite(y[i]))) continue;
    549       sx = x[i]*mxi + y[i]*mxj + bx;
    550       sy = x[i]*myi + y[i]*myj + by;
    551       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    552           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    553       {
    554         if (scaleColor) {
    555           if (!finite(z[i])) continue;
    556           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    557           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    558         }
    559         D = scaleSize ? dz*z[i] : ds;
    560         DrawLine (sx -      D, sy,               sx - 0.50*D, sy + 0.87*D);
    561         DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
    562         DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
    563 
    564         DrawLine (sx +      D, sy,               sx + 0.50*D, sy - 0.87*D);
    565         DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
    566         DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
    567       }
    568     }
    569   }
    570   if (object[0].ptype == 10) {  /* 0 */
    571     for (i = 0; i < object[0].Npts; i++) {
    572       if (!(finite(x[i]) && finite(y[i]))) continue;
    573       sx = x[i]*mxi + y[i]*mxj + bx;
    574       sy = x[i]*myi + y[i]*myj + by;
    575       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    576           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    577       {
    578         if (scaleColor) {
    579           if (!finite(z[i])) continue;
    580           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    581           fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
    582         }
    583         D = scaleSize ? dz*z[i] : ds;
    584         FillCircle (sx, sy, D);
    585       }
    586     }
    587   }
    588   if (object[0].ptype == 100) { /* connect a pair of points */
    589     double X0 = graph[0].axis[0].fx;
    590     double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    591     double Y0 = graph[0].axis[1].fy;
    592     double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    593 
    594     for (i = 0; i + 1 < object[0].Npts; i+=2) {
    595       if (!(finite(x[i]) && finite(y[i]))) continue;
    596       sx1 = x[i]*mxi + y[i]*mxj + bx;
    597       sy1 = x[i]*myi + y[i]*myj + by;
    598       sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
    599       sy2 = x[i+1]*myi + y[i+1]*myj + by;
    600       ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
    601     }
    602   }
    603 
     593    case KAPA_POINT_BOX_SOLID:  /* filled box */
     594    default:
     595      for (i = 0; i < object[0].Npts; i++) {
     596        if (!(finite(x[i]) && finite(y[i]))) continue;
     597        sx = x[i]*mxi + y[i]*mxj + bx;
     598        sy = x[i]*myi + y[i]*myj + by;
     599        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     600            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     601          if (scaleColor) {
     602            if (!finite(z[i])) continue;
     603            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     604            fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     605          }
     606          D = scaleSize ? dz*z[i] : ds;
     607          FillRectangle (sx, sy, 2*D, 2*D);
     608        }
     609      }
     610      break;
     611  }
    604612  free (pixel1);
    605613  free (pixel2);
  • branches/czw_branch/20160809/Ohana/src/kapa2/src/bDrawObjects.c

    r38153 r39729  
    1818 
    1919  int i;
    20   int type;
    21   int weight;
    22   bDrawColor color;
    23   bDrawColor black;
    24  
     20 
     21  // the functions below use this global value
    2522  graphic = GetGraphic();
    2623
    27   black = KapaColorByName ("black");
     24  // this function calls all of the supporting bDraw... functions below
    2825  for (i = 0; i < graph[0].Nobjects; i++) {
    29 
    30     weight = MAX (0, MIN (10, graph[0].objects[i].lweight));
    31     type = graph[0].objects[i].ltype;   
    32     color = graph[0].objects[i].color;
    33     bDrawSetStyle (buffer, color, weight, type);
    34 
    35     switch (graph[0].objects[i].style) {
    36       case CONNECT:
    37         bDrawConnect (buffer, graph, &graph[0].objects[i]);
    38         break;
    39       case HISTOGRAM:
    40         bDrawHistogram (buffer, graph, &graph[0].objects[i]);
    41         break;
    42       case POINTS:
    43         bDrawPoints (buffer, graph, &graph[0].objects[i]);
    44         break;
    45     }
    46 
    47     if (graph[0].objects[i].etype & 0x01) {
    48       bDrawYErrors (buffer, graph, &graph[0].objects[i]);
    49     }
    50     if (graph[0].objects[i].etype & 0x02) {
    51       bDrawXErrors (buffer, graph, &graph[0].objects[i]);
    52     }
    53   }
     26    bDrawObjectsN (buffer, graph, &graph[0].objects[i]);
     27  }
     28  bDrawColor black = KapaColorByName ("black");
    5429  bDrawSetStyle (buffer, black, 0, 0);
     30  return (TRUE);
     31}
     32
     33int bDrawObjectsN (bDrawBuffer *buffer, KapaGraphWidget *graph, Gobjects *object) {
     34 
     35  int weight = MAX (0, MIN (10, object->lweight));
     36  bDrawSetStyle (buffer, object->color, weight, object->ltype);
     37 
     38  switch (object->style) {
     39    case KAPA_PLOT_CONNECT:
     40      bDrawConnect (buffer, graph, object);
     41      break;
     42    case KAPA_PLOT_HISTOGRAM:
     43      bDrawHistogram (buffer, graph, object);
     44      break;
     45    case KAPA_PLOT_POINTS:
     46    default:
     47      bDrawPoints (buffer, graph, object);
     48      break;
     49  }
     50
     51  if (object->etype & 0x01) {
     52    bDrawYErrors (buffer, graph, object);
     53  }
     54  if (object->etype & 0x02) {
     55    bDrawXErrors (buffer, graph, object);
     56  }
     57
    5558  return (TRUE);
    5659}
     
    298301  x = object[0].x; y = object[0].y; z = object[0].z;
    299302
    300   if (object[0].ptype == 0) {   /* filled box */
    301     for (i = 0; i < object[0].Npts; i++) {
    302       if (!(finite(x[i]) && finite(y[i]))) continue;
    303       sx = x[i]*mxi + y[i]*mxj + bx;
    304       sy = x[i]*myi + y[i]*myj + by;
    305       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    306           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    307       {
    308         if (scaleColor) {
    309           if (!finite(z[i])) continue;
    310           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    311           buffer->bColor_R = pixel1[pixel];
    312           buffer->bColor_G = pixel2[pixel];
    313           buffer->bColor_B = pixel3[pixel];
    314         }
    315         D = scaleSize ? dz*z[i] : ds;
    316         FillRectangle (buffer, sx, sy, 2*D, 2*D);
    317         // plot range saturated by bDrawRectFill
    318       }
     303  switch (object[0].ptype) {
     304    case KAPA_POINT_BOX_OPEN:   /* open box */
     305      for (i = 0; i < object[0].Npts; i++) {
     306        if (!(finite(x[i]) && finite(y[i]))) continue;
     307        sx = x[i]*mxi + y[i]*mxj + bx;
     308        sy = x[i]*myi + y[i]*myj + by;
     309        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     310            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     311          if (scaleColor) {
     312            if (!finite(z[i])) continue;
     313            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     314            buffer->bColor_R = pixel1[pixel];
     315            buffer->bColor_G = pixel2[pixel];
     316            buffer->bColor_B = pixel3[pixel];
     317          }
     318          D = scaleSize ? dz*z[i] : ds;
     319          DrawRectangle (buffer, sx, sy, 2*D, 2*D);
     320          // plot range saturated by bDrawRectOpen
     321        }
     322      }
     323      break;
     324    case KAPA_POINT_CROSS: /* cross */
     325      for (i = 0; i < object[0].Npts; i++) {
     326        if (!(finite(x[i]) && finite(y[i]))) continue;
     327        sx = x[i]*mxi + y[i]*mxj + bx;
     328        sy = x[i]*myi + y[i]*myj + by;
     329        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     330            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     331          if (scaleColor) {
     332            if (!finite(z[i])) continue;
     333            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     334            buffer->bColor_R = pixel1[pixel];
     335            buffer->bColor_G = pixel2[pixel];
     336            buffer->bColor_B = pixel3[pixel];
     337          }
     338          D = scaleSize ? dz*z[i] : ds;
     339          DrawLine (buffer, sx - D, sy, sx + D, sy);
     340          DrawLine (buffer, sx, sy - D, sx, sy + D);
     341          // out-of-range points skipped by bDrawPoint
     342        }
     343      }
     344      break;
     345    case KAPA_POINT_X:  /* x */
     346      for (i = 0; i < object[0].Npts; i++) {
     347        if (!(finite(x[i]) && finite(y[i]))) continue;
     348        sx = x[i]*mxi + y[i]*mxj + bx;
     349        sy = x[i]*myi + y[i]*myj + by;
     350        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     351            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     352          if (scaleColor) {
     353            if (!finite(z[i])) continue;
     354            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     355            buffer->bColor_R = pixel1[pixel];
     356            buffer->bColor_G = pixel2[pixel];
     357            buffer->bColor_B = pixel3[pixel];
     358          }
     359          D = scaleSize ? dz*z[i] : ds;
     360          DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
     361          DrawLine (buffer, sx - D, sy - D, sx + D, sy + D);
     362          // out-of-range points skipped by bDrawPoint
     363        }
     364      }
     365      break;
     366    case KAPA_POINT_TRIANGLE_SOLID:     /* filled triangle */
     367      for (i = 0; i < object[0].Npts; i++) {
     368        if (!(finite(x[i]) && finite(y[i]))) continue;
     369        sx = x[i]*mxi + y[i]*mxj + bx;
     370        sy = x[i]*myi + y[i]*myj + by;
     371        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     372            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     373          if (scaleColor) {
     374            if (!finite(z[i])) continue;
     375            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     376            buffer->bColor_R = pixel1[pixel];
     377            buffer->bColor_G = pixel2[pixel];
     378            buffer->bColor_B = pixel3[pixel];
     379          }
     380          D = scaleSize ? dz*z[i] : ds;
     381          // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
     382          FillTriangle (buffer, sx, sy + 0.58*D, D, -1.73*D);
     383          // out-of-range points skipped by bDrawPoint
     384        }
     385      }
     386      break;
     387    case KAPA_POINT_TRIANGLE_SOLID_DOWN:        /* open triangle */
     388      for (i = 0; i < object[0].Npts; i++) {
     389        if (!(finite(x[i]) && finite(y[i]))) continue;
     390        sx = x[i]*mxi + y[i]*mxj + bx;
     391        sy = x[i]*myi + y[i]*myj + by;
     392        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     393            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     394          if (scaleColor) {
     395            if (!finite(z[i])) continue;
     396            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     397            buffer->bColor_R = pixel1[pixel];
     398            buffer->bColor_G = pixel2[pixel];
     399            buffer->bColor_B = pixel3[pixel];
     400          }
     401          D = scaleSize ? dz*z[i] : ds;
     402          // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
     403          FillTriangle (buffer, sx, sy - 0.58*D, D, +1.73*D);
     404          // out-of-range points skipped by bDrawPoint
     405        }
     406      }
     407      break;
     408    case KAPA_POINT_TRIANGLE_OPEN:      /* open triangle */
     409      for (i = 0; i < object[0].Npts; i++) {
     410        if (!(finite(x[i]) && finite(y[i]))) continue;
     411        sx = x[i]*mxi + y[i]*mxj + bx;
     412        sy = x[i]*myi + y[i]*myj + by;
     413        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     414            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     415          if (scaleColor) {
     416            if (!finite(z[i])) continue;
     417            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     418            buffer->bColor_R = pixel1[pixel];
     419            buffer->bColor_G = pixel2[pixel];
     420            buffer->bColor_B = pixel3[pixel];
     421          }
     422          D = scaleSize ? dz*z[i] : ds;
     423          OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
     424          // out-of-range points skipped by bDrawPoint
     425        }
     426      }
     427      break;
     428    case KAPA_POINT_TRIANGLE_OPEN_DOWN: /* upside-down open triangle */
     429      for (i = 0; i < object[0].Npts; i++) {
     430        if (!(finite(x[i]) && finite(y[i]))) continue;
     431        sx = x[i]*mxi + y[i]*mxj + bx;
     432        sy = x[i]*myi + y[i]*myj + by;
     433        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     434            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     435          if (scaleColor) {
     436            if (!finite(z[i])) continue;
     437            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     438            buffer->bColor_R = pixel1[pixel];
     439            buffer->bColor_G = pixel2[pixel];
     440            buffer->bColor_B = pixel3[pixel];
     441          }
     442          D = scaleSize ? dz*z[i] : ds;
     443          OpenTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
     444          // out-of-range points skipped by bDrawPoint
     445        }
     446      }
     447      break;
     448    case KAPA_POINT_Y:  /* Y */
     449      for (i = 0; i < object[0].Npts; i++) {
     450        if (!(finite(x[i]) && finite(y[i]))) continue;
     451        sx = x[i]*mxi + y[i]*mxj + bx;
     452        sy = x[i]*myi + y[i]*myj + by;
     453        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     454            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     455          if (scaleColor) {
     456            if (!finite(z[i])) continue;
     457            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     458            buffer->bColor_R = pixel1[pixel];
     459            buffer->bColor_G = pixel2[pixel];
     460            buffer->bColor_B = pixel3[pixel];
     461          }
     462          D = scaleSize ? dz*z[i] : ds;
     463          DrawLine (buffer, sx, sy, sx - D, sy - 0.58*D);
     464          DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
     465          DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
     466          // out-of-range points skipped by bDrawPoint
     467        }
     468      }
     469      break;
     470    case KAPA_POINT_Y_DOWN:     /* upside-down Y */
     471      for (i = 0; i < object[0].Npts; i++) {
     472        if (!(finite(x[i]) && finite(y[i]))) continue;
     473        sx = x[i]*mxi + y[i]*mxj + bx;
     474        sy = x[i]*myi + y[i]*myj + by;
     475        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     476            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     477          if (scaleColor) {
     478            if (!finite(z[i])) continue;
     479            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     480            buffer->bColor_R = pixel1[pixel];
     481            buffer->bColor_G = pixel2[pixel];
     482            buffer->bColor_B = pixel3[pixel];
     483          }
     484          D = scaleSize ? dz*z[i] : ds;
     485          DrawLine (buffer, sx, sy, sx - D, sy + 0.58*D);
     486          DrawLine (buffer, sx, sy, sx + D, sy + 0.58*D);
     487          DrawLine (buffer, sx, sy, sx,     sy - 1.15*D);
     488          // out-of-range points skipped by bDrawPoint
     489        }
     490      }
     491      break;
     492    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
     493      for (i = 0; i < object[0].Npts; i++) {
     494        if (!(finite(x[i]) && finite(y[i]))) continue;
     495        sx = x[i]*mxi + y[i]*mxj + bx;
     496        sy = x[i]*myi + y[i]*myj + by;
     497        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     498            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     499          if (scaleColor) {
     500            if (!finite(z[i])) continue;
     501            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     502            buffer->bColor_R = pixel1[pixel];
     503            buffer->bColor_G = pixel2[pixel];
     504            buffer->bColor_B = pixel3[pixel];
     505          }
     506          D = scaleSize ? dz*z[i] : ds;
     507          DrawCircle (buffer, sx, sy, D);
     508          // out-of-range points skipped by bDrawPoint
     509        }
     510      }
     511      break;
     512    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
     513      for (i = 0; i < object[0].Npts; i++) {
     514        if (!(finite(x[i]) && finite(y[i]))) continue;
     515        sx = x[i]*mxi + y[i]*mxj + bx;
     516        sy = x[i]*myi + y[i]*myj + by;
     517        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     518            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     519          if (scaleColor) {
     520            if (!finite(z[i])) continue;
     521            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     522            buffer->bColor_R = pixel1[pixel];
     523            buffer->bColor_G = pixel2[pixel];
     524            buffer->bColor_B = pixel3[pixel];
     525          }
     526          D = scaleSize ? dz*z[i] : ds;
     527          FillCircle (buffer, sx, sy, D);
     528          // out-of-range points skipped by bDrawLineHorizontal
     529        }
     530      }
     531      break;
     532    case KAPA_POINT_PENTAGON:   /* pentagon */
     533      for (i = 0; i < object[0].Npts; i++) {
     534        if (!(finite(x[i]) && finite(y[i]))) continue;
     535        sx = x[i]*mxi + y[i]*mxj + bx;
     536        sy = x[i]*myi + y[i]*myj + by;
     537        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     538            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     539          if (scaleColor) {
     540            if (!finite(z[i])) continue;
     541            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     542            buffer->bColor_R = pixel1[pixel];
     543            buffer->bColor_G = pixel2[pixel];
     544            buffer->bColor_B = pixel3[pixel];
     545          }
     546          D = scaleSize ? dz*z[i] : ds;
     547          DrawLine (buffer, sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
     548          DrawLine (buffer, sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
     549          DrawLine (buffer, sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
     550          DrawLine (buffer, sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
     551          DrawLine (buffer, sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
     552          // out-of-range points skipped by bDrawPoint
     553        }
     554      }
     555      break;
     556    case KAPA_POINT_HEXAGON:    /* hexagon */
     557      for (i = 0; i < object[0].Npts; i++) {
     558        if (!(finite(x[i]) && finite(y[i]))) continue;
     559        sx = x[i]*mxi + y[i]*mxj + bx;
     560        sy = x[i]*myi + y[i]*myj + by;
     561        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     562            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     563          if (scaleColor) {
     564            if (!finite(z[i])) continue;
     565            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     566            buffer->bColor_R = pixel1[pixel];
     567            buffer->bColor_G = pixel2[pixel];
     568            buffer->bColor_B = pixel3[pixel];
     569          }
     570          D = scaleSize ? dz*z[i] : ds;
     571          DrawLine (buffer, sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
     572          DrawLine (buffer, sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     573          DrawLine (buffer, sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     574          DrawLine (buffer, sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
     575          DrawLine (buffer, sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     576          DrawLine (buffer, sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     577          // out-of-range points skipped by bDrawPoint
     578        }
     579      }
     580      break;
     581    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
     582
     583      double X0 = graph[0].axis[0].fx;
     584      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     585      double Y0 = graph[0].axis[1].fy;
     586      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     587
     588      for (i = 0; i + 1 < object[0].Npts; i+=2) {
     589        if (!(finite(x[i]) && finite(y[i]))) continue;
     590        sx1 = x[i]*mxi + y[i]*mxj + bx;
     591        sy1 = x[i]*myi + y[i]*myj + by;
     592        sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
     593        sy2 = x[i+1]*myi + y[i+1]*myj + by;
     594        bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
     595      }
     596      break;
    319597    }
    320   }
    321   if (object[0].ptype == 1) {   /* open box */
    322     for (i = 0; i < object[0].Npts; i++) {
    323       if (!(finite(x[i]) && finite(y[i]))) continue;
    324       sx = x[i]*mxi + y[i]*mxj + bx;
    325       sy = x[i]*myi + y[i]*myj + by;
    326       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    327           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    328       {
    329         if (scaleColor) {
    330           if (!finite(z[i])) continue;
    331           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    332           buffer->bColor_R = pixel1[pixel];
    333           buffer->bColor_G = pixel2[pixel];
    334           buffer->bColor_B = pixel3[pixel];
    335         }
    336         D = scaleSize ? dz*z[i] : ds;
    337         DrawRectangle (buffer, sx, sy, 2*D, 2*D);
    338         // plot range saturated by bDrawRectOpen
    339       }
    340     }
    341   }
    342   if (object[0].ptype == 2) { /* cross */
    343     for (i = 0; i < object[0].Npts; i++) {
    344       if (!(finite(x[i]) && finite(y[i]))) continue;
    345       sx = x[i]*mxi + y[i]*mxj + bx;
    346       sy = x[i]*myi + y[i]*myj + by;
    347       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    348           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    349       {
    350         if (scaleColor) {
    351           if (!finite(z[i])) continue;
    352           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    353           buffer->bColor_R = pixel1[pixel];
    354           buffer->bColor_G = pixel2[pixel];
    355           buffer->bColor_B = pixel3[pixel];
    356         }
    357         D = scaleSize ? dz*z[i] : ds;
    358         DrawLine (buffer, sx - D, sy, sx + D, sy);
    359         DrawLine (buffer, sx, sy - D, sx, sy + D);
    360         // out-of-range points skipped by bDrawPoint
    361       }
    362     }
    363   }
    364   if (object[0].ptype == 3) {   /* x */
    365     for (i = 0; i < object[0].Npts; i++) {
    366       if (!(finite(x[i]) && finite(y[i]))) continue;
    367       sx = x[i]*mxi + y[i]*mxj + bx;
    368       sy = x[i]*myi + y[i]*myj + by;
    369       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    370           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    371       {
    372         if (scaleColor) {
    373           if (!finite(z[i])) continue;
    374           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    375           buffer->bColor_R = pixel1[pixel];
    376           buffer->bColor_G = pixel2[pixel];
    377           buffer->bColor_B = pixel3[pixel];
    378         }
    379         D = scaleSize ? dz*z[i] : ds;
    380         DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
    381         DrawLine (buffer, sx - D, sy - D, sx + D, sy + D);
    382         // out-of-range points skipped by bDrawPoint
    383       }
    384     }
    385   }
    386   if (object[0].ptype == 4) {   /* filled triangle */
    387     for (i = 0; i < object[0].Npts; i++) {
    388       if (!(finite(x[i]) && finite(y[i]))) continue;
    389       sx = x[i]*mxi + y[i]*mxj + bx;
    390       sy = x[i]*myi + y[i]*myj + by;
    391       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    392           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    393       {
    394         if (scaleColor) {
    395           if (!finite(z[i])) continue;
    396           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    397           buffer->bColor_R = pixel1[pixel];
    398           buffer->bColor_G = pixel2[pixel];
    399           buffer->bColor_B = pixel3[pixel];
    400         }
    401         D = scaleSize ? dz*z[i] : ds;
    402         // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
    403         FillTriangle (buffer, sx, sy + 0.58*D, D, -1.73*D);
    404         // out-of-range points skipped by bDrawPoint
    405       }
    406     }
    407   }
    408   if (object[0].ptype == 14) {  /* filled triangle */
    409     for (i = 0; i < object[0].Npts; i++) {
    410       if (!(finite(x[i]) && finite(y[i]))) continue;
    411       sx = x[i]*mxi + y[i]*mxj + bx;
    412       sy = x[i]*myi + y[i]*myj + by;
    413       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    414           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    415       {
    416         if (scaleColor) {
    417           if (!finite(z[i])) continue;
    418           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    419           buffer->bColor_R = pixel1[pixel];
    420           buffer->bColor_G = pixel2[pixel];
    421           buffer->bColor_B = pixel3[pixel];
    422         }
    423         D = scaleSize ? dz*z[i] : ds;
    424         // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
    425         FillTriangle (buffer, sx, sy - 0.58*D, D, +1.73*D);
    426         // out-of-range points skipped by bDrawPoint
    427       }
    428     }
    429   }
    430   if (object[0].ptype == 5) {   /* open triangle */
    431     for (i = 0; i < object[0].Npts; i++) {
    432       if (!(finite(x[i]) && finite(y[i]))) continue;
    433       sx = x[i]*mxi + y[i]*mxj + bx;
    434       sy = x[i]*myi + y[i]*myj + by;
    435       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    436           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    437       {
    438         if (scaleColor) {
    439           if (!finite(z[i])) continue;
    440           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    441           buffer->bColor_R = pixel1[pixel];
    442           buffer->bColor_G = pixel2[pixel];
    443           buffer->bColor_B = pixel3[pixel];
    444         }
    445         D = scaleSize ? dz*z[i] : ds;
    446         OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
    447         // out-of-range points skipped by bDrawPoint
    448       }
    449     }
    450   }
    451   if (object[0].ptype == 15) {  /* open triangle */
    452     for (i = 0; i < object[0].Npts; i++) {
    453       if (!(finite(x[i]) && finite(y[i]))) continue;
    454       sx = x[i]*mxi + y[i]*mxj + bx;
    455       sy = x[i]*myi + y[i]*myj + by;
    456       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    457           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    458       {
    459         if (scaleColor) {
    460           if (!finite(z[i])) continue;
    461           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    462           buffer->bColor_R = pixel1[pixel];
    463           buffer->bColor_G = pixel2[pixel];
    464           buffer->bColor_B = pixel3[pixel];
    465         }
    466         D = scaleSize ? dz*z[i] : ds;
    467         OpenTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
    468         // out-of-range points skipped by bDrawPoint
    469       }
    470     }
    471   }
    472   if (object[0].ptype == 6) {   /* Y */
    473     for (i = 0; i < object[0].Npts; i++) {
    474       if (!(finite(x[i]) && finite(y[i]))) continue;
    475       sx = x[i]*mxi + y[i]*mxj + bx;
    476       sy = x[i]*myi + y[i]*myj + by;
    477       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    478           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    479       {
    480         if (scaleColor) {
    481           if (!finite(z[i])) continue;
    482           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    483           buffer->bColor_R = pixel1[pixel];
    484           buffer->bColor_G = pixel2[pixel];
    485           buffer->bColor_B = pixel3[pixel];
    486         }
    487         D = scaleSize ? dz*z[i] : ds;
    488         DrawLine (buffer, sx, sy, sx - D, sy - 0.58*D);
    489         DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
    490         DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
    491         // out-of-range points skipped by bDrawPoint
    492       }
    493     }
    494   }
    495   if (object[0].ptype == 16) {  /* Y */
    496     for (i = 0; i < object[0].Npts; i++) {
    497       if (!(finite(x[i]) && finite(y[i]))) continue;
    498       sx = x[i]*mxi + y[i]*mxj + bx;
    499       sy = x[i]*myi + y[i]*myj + by;
    500       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    501           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    502       {
    503         if (scaleColor) {
    504           if (!finite(z[i])) continue;
    505           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    506           buffer->bColor_R = pixel1[pixel];
    507           buffer->bColor_G = pixel2[pixel];
    508           buffer->bColor_B = pixel3[pixel];
    509         }
    510         D = scaleSize ? dz*z[i] : ds;
    511         DrawLine (buffer, sx, sy, sx - D, sy + 0.58*D);
    512         DrawLine (buffer, sx, sy, sx + D, sy + 0.58*D);
    513         DrawLine (buffer, sx, sy, sx,     sy - 1.15*D);
    514         // out-of-range points skipped by bDrawPoint
    515       }
    516     }
    517   }
    518   if (object[0].ptype == 7) {   /* 0 */
    519     for (i = 0; i < object[0].Npts; i++) {
    520       if (!(finite(x[i]) && finite(y[i]))) continue;
    521       sx = x[i]*mxi + y[i]*mxj + bx;
    522       sy = x[i]*myi + y[i]*myj + by;
    523       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    524           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    525       {
    526         if (scaleColor) {
    527           if (!finite(z[i])) continue;
    528           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    529           buffer->bColor_R = pixel1[pixel];
    530           buffer->bColor_G = pixel2[pixel];
    531           buffer->bColor_B = pixel3[pixel];
    532         }
    533         D = scaleSize ? dz*z[i] : ds;
    534         DrawCircle (buffer, sx, sy, D);
    535         // out-of-range points skipped by bDrawPoint
    536       }
    537     }
    538   }
    539   if (object[0].ptype == 8) {   /* pentagon */
    540     for (i = 0; i < object[0].Npts; i++) {
    541       if (!(finite(x[i]) && finite(y[i]))) continue;
    542       sx = x[i]*mxi + y[i]*mxj + bx;
    543       sy = x[i]*myi + y[i]*myj + by;
    544       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    545           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    546       {
    547         if (scaleColor) {
    548           if (!finite(z[i])) continue;
    549           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    550           buffer->bColor_R = pixel1[pixel];
    551           buffer->bColor_G = pixel2[pixel];
    552           buffer->bColor_B = pixel3[pixel];
    553         }
    554         D = scaleSize ? dz*z[i] : ds;
    555         DrawLine (buffer, sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
    556         DrawLine (buffer, sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
    557         DrawLine (buffer, sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
    558         DrawLine (buffer, sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
    559         DrawLine (buffer, sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
    560         // out-of-range points skipped by bDrawPoint
    561       }
    562     }
    563   }
    564   if (object[0].ptype == 9) {   /* hexagon */
    565     for (i = 0; i < object[0].Npts; i++) {
    566       if (!(finite(x[i]) && finite(y[i]))) continue;
    567       sx = x[i]*mxi + y[i]*mxj + bx;
    568       sy = x[i]*myi + y[i]*myj + by;
    569       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    570           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    571       {
    572         if (scaleColor) {
    573           if (!finite(z[i])) continue;
    574           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    575           buffer->bColor_R = pixel1[pixel];
    576           buffer->bColor_G = pixel2[pixel];
    577           buffer->bColor_B = pixel3[pixel];
    578         }
    579         D = scaleSize ? dz*z[i] : ds;
    580         DrawLine (buffer, sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
    581         DrawLine (buffer, sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
    582         DrawLine (buffer, sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
    583         DrawLine (buffer, sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
    584         DrawLine (buffer, sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
    585         DrawLine (buffer, sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
    586         // out-of-range points skipped by bDrawPoint
    587       }
    588     }
    589   }
    590   if (object[0].ptype == 10) {  /* filled circle */
    591     for (i = 0; i < object[0].Npts; i++) {
    592       if (!(finite(x[i]) && finite(y[i]))) continue;
    593       sx = x[i]*mxi + y[i]*mxj + bx;
    594       sy = x[i]*myi + y[i]*myj + by;
    595       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    596           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    597       {
    598         if (scaleColor) {
    599           if (!finite(z[i])) continue;
    600           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    601           buffer->bColor_R = pixel1[pixel];
    602           buffer->bColor_G = pixel2[pixel];
    603           buffer->bColor_B = pixel3[pixel];
    604         }
    605         D = scaleSize ? dz*z[i] : ds;
    606         FillCircle (buffer, sx, sy, D);
    607         // out-of-range points skipped by bDrawLineHorizontal
    608       }
    609     }
    610   }
    611   if (object[0].ptype == 12) {  /* filled triangle (down) */
    612     for (i = 0; i < object[0].Npts; i++) {
    613       if (!(finite(x[i]) && finite(y[i]))) continue;
    614       sx = x[i]*mxi + y[i]*mxj + bx;
    615       sy = x[i]*myi + y[i]*myj + by;
    616       if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    617           (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    618       {
    619         if (scaleColor) {
    620           if (!finite(z[i])) continue;
    621           int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
    622           buffer->bColor_R = pixel1[pixel];
    623           buffer->bColor_G = pixel2[pixel];
    624           buffer->bColor_B = pixel3[pixel];
    625         }
    626         D = scaleSize ? dz*z[i] : ds;
    627         // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
    628         FillTriangle (buffer, sx, sy + 0.58*D, D, 1.73*D);
    629         // out-of-range points skipped by bDrawPoint
    630       }
    631     }
    632   }
    633   if (object[0].ptype == 100) { /* connect a pair of points */
    634 
    635     double X0 = graph[0].axis[0].fx;
    636     double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    637     double Y0 = graph[0].axis[1].fy;
    638     double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    639 
    640     for (i = 0; i + 1 < object[0].Npts; i+=2) {
    641       if (!(finite(x[i]) && finite(y[i]))) continue;
    642       sx1 = x[i]*mxi + y[i]*mxj + bx;
    643       sy1 = x[i]*myi + y[i]*myj + by;
    644       sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
    645       sy2 = x[i+1]*myi + y[i+1]*myj + by;
    646       bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    647     }
    648   }
    649 
     598    case KAPA_POINT_BOX_SOLID:  /* filled box */
     599      for (i = 0; i < object[0].Npts; i++) {
     600        if (!(finite(x[i]) && finite(y[i]))) continue;
     601        sx = x[i]*mxi + y[i]*mxj + bx;
     602        sy = x[i]*myi + y[i]*myj + by;
     603        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     604            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     605          if (scaleColor) {
     606            if (!finite(z[i])) continue;
     607            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     608            buffer->bColor_R = pixel1[pixel];
     609            buffer->bColor_G = pixel2[pixel];
     610            buffer->bColor_B = pixel3[pixel];
     611          }
     612          D = scaleSize ? dz*z[i] : ds;
     613          FillRectangle (buffer, sx, sy, 2*D, 2*D);
     614          // plot range saturated by bDrawRectFill
     615        }
     616      }
     617      break;
     618  }
    650619  free (pixel1);
    651620  free (pixel2);
  • branches/czw_branch/20160809/Ohana/src/libkapa/Makefile

    r39590 r39729  
    3434$(SRC)/KapaWindow.$(ARCH).o \
    3535$(SRC)/KapaColors.$(ARCH).o \
     36$(SRC)/KapaStyles.$(ARCH).o \
    3637$(SRC)/KapaOpen.$(ARCH).o
    3738
  • branches/czw_branch/20160809/Ohana/src/libkapa/include/kapa.h

    r38986 r39729  
    2525typedef struct sockaddr_in KapaSockAddress;
    2626
    27 typedef struct {
    28   float *data1d;
    29   float **data2d;
    30   int Nx;
    31   int Ny;
    32 } KiiImage;
    33 
    34 typedef struct {
    35   float x;
    36   float y;
    37   float dx;
    38   float dy;
    39   float angle;
    40   int type;
    41 } KiiOverlayBase;
    42 
    43 typedef struct {
    44   float x;
    45   float y;
    46   float dx;
    47   float dy;
    48   float angle;
    49   int type;
    50   char *text;
    51 } KiiOverlay;
     27// retain historical numerical definitions:
     28typedef enum {
     29  KAPA_LINE_INVALID_MIN = -1,
     30  KAPA_LINE_SOLID       = 0,
     31  KAPA_LINE_DOT         = 1,
     32  KAPA_LINE_DASH_SHORT  = 2,
     33  KAPA_LINE_DASH_LONG   = 3,
     34  KAPA_LINE_DOT_DASH    = 4,
     35  KAPA_LINE_INVALID_MAX = 5,
     36} KapaLineType;
     37
     38// retain historical numerical definitions:
     39typedef enum {
     40  KAPA_PLOT_INVALID_MIN = -1,
     41  KAPA_PLOT_CONNECT     =  0,
     42  KAPA_PLOT_HISTOGRAM   =  1,
     43  KAPA_PLOT_POINTS      =  2,
     44  KAPA_PLOT_INVALID_MAX =  3,
     45} KapaPlotStyle;
     46
     47typedef enum {
     48  KAPA_POINT_INVALID_MIN         = -1,
     49  KAPA_POINT_BOX_SOLID           =  0,
     50  KAPA_POINT_BOX_OPEN            =  1,
     51  KAPA_POINT_CROSS               =  2, // OR PLUS
     52  KAPA_POINT_X                   =  3,
     53  KAPA_POINT_Y                   =  4,
     54  KAPA_POINT_TRIANGLE_SOLID      =  5,
     55  KAPA_POINT_TRIANGLE_OPEN       =  6,
     56  KAPA_POINT_CIRCLE_OPEN         =  7,
     57  KAPA_POINT_PENTAGON            =  8,
     58  KAPA_POINT_HEXAGON             =  9,
     59  KAPA_POINT_CIRCLE_SOLID        = 10,
     60  KAPA_POINT_TRIANGLE_SOLID_DOWN = 11,
     61  KAPA_POINT_TRIANGLE_OPEN_DOWN  = 12,
     62  KAPA_POINT_Y_DOWN              = 13,
     63  KAPA_POINT_INVALID_MAX         = 14,
     64  KAPA_POINT_PAIR_CONNECT        = 100, // change to a plot style?
     65} KapaPointStyle;
     66// note that PAIR_CONNECT was historically 100
     67
    5268
    5369typedef enum {
     
    7591  KAPA_PS_RAWPAGE
    7692} KapaPSmode;
     93
     94typedef struct {
     95  float *data1d;
     96  float **data2d;
     97  int Nx;
     98  int Ny;
     99} KiiImage;
     100
     101typedef struct {
     102  float x;
     103  float y;
     104  float dx;
     105  float dy;
     106  float angle;
     107  int type;
     108} KiiOverlayBase;
     109
     110typedef struct {
     111  float x;
     112  float y;
     113  float dx;
     114  float dy;
     115  float angle;
     116  int type;
     117  char *text;
     118} KiiOverlay;
    77119
    78120typedef struct {
     
    219261unsigned long *KapaX11colors (Display *display, Colormap colormap, unsigned long default_color, int *Ncolors);
    220262
     263/* KapaStyles.c */
     264KapaLineType KapaLineTypeFromString (char *string);
     265KapaPlotStyle KapaPlotStyleFromString (char *string);
     266KapaPointStyle KapaPointStyleFromString (char *string);
     267
    221268/* RotFont.c */
    222269void InitRotFonts PROTO((void));
  • branches/czw_branch/20160809/Ohana/src/libkapa/src/KapaWindow.c

    r39719 r39729  
    449449  return (TRUE);
    450450}
     451
  • branches/czw_branch/20160809/Ohana/src/libkapa/src/bDrawFuncs.c

    r36488 r39729  
    222222  e = 0;
    223223  for (X = X1, N = 0; X <= X2; X++, N++) {
    224     if (buffer->bType == 1) { DashOn = (N % 10) < 5; }
    225     if (buffer->bType == 2) { DashOn = (N % 6) < 3; }
     224    if (buffer->bType == KAPA_LINE_DOT) {
     225      DashOn = (N % 5) == 0 || (N % 5) == 1;
     226    }
     227    if (buffer->bType == KAPA_LINE_DASH_SHORT) {
     228      DashOn = (N % 8) < 4;
     229    }
     230    if (buffer->bType == KAPA_LINE_DASH_LONG) {
     231      DashOn = (N % 16) < 8;
     232    }
     233    if (buffer->bType == KAPA_LINE_DOT_DASH) {
     234      DashOn = ((N % 12) < 2) || ((N % 12 >= 6) && (N % 12 < 10)) ;
     235    }
    226236    if (swapcoords) {
    227237      if (DashOn) bDrawPoint (buffer, Y,X);
  • branches/czw_branch/20160809/Ohana/src/opihi/lib.data/style_args.c

    r13479 r39729  
    2929  if ((N = get_argument (*argc, argv, "-lt"))) {
    3030    remove_argument (N, argc, argv);
    31     graphmode[0].ltype = atof(argv[N]);
     31    graphmode[0].ltype = KapaLineTypeFromString(argv[N]);
    3232    remove_argument (N, argc, argv);
    3333  }
     
    3939  if ((N = get_argument (*argc, argv, "-pt"))) {
    4040    remove_argument (N, argc, argv);
    41     graphmode[0].ptype = atof(argv[N]);
     41    graphmode[0].ptype = KapaPointStyleFromString(argv[N]);
    4242    remove_argument (N, argc, argv);
    4343  }
     
    6363  if ((N = get_argument (*argc, argv, "-x"))) {
    6464    remove_argument (N, argc, argv);
    65     graphmode[0].style = atof(argv[N]);
     65    graphmode[0].style = KapaPlotStyleFromString(argv[N]);
    6666    remove_argument (N, argc, argv);
    6767  }
Note: See TracChangeset for help on using the changeset viewer.