IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 6, 2017, 11:30:10 AM (10 years ago)
Author:
eugene
Message:

merging changes from czw dev branch (compare with r39924)

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/Ohana

  • trunk/Ohana/src/kapa2/include/prototypes.h

    r39457 r39926  
    3232void          DrawLabelsRaw       PROTO((Graphic *graphic, KapaGraphWidget *graph, int color));
    3333void          DrawTextlines       PROTO((KapaGraphWidget *graph));
    34 void          DrawConnect         PROTO((KapaGraphWidget *graph, Gobjects *objects));
    35 void          DrawHistogram       PROTO((KapaGraphWidget *graph, Gobjects *objects));
    36 int           DrawObjectN         PROTO((KapaGraphWidget *graph, Gobjects *objects));
    37 void          DrawPoints          PROTO((KapaGraphWidget *graph, Gobjects *objects));
    38 void          ClipLine            PROTO((double x0, double y0, double x1, double y1, double X0, double Y0, double X1, double Y1));
    39 void          DrawXErrors         PROTO((KapaGraphWidget *graph, Gobjects *objects));
    40 void          DrawYErrors         PROTO((KapaGraphWidget *graph, Gobjects *objects));
     34void          DrawConnect         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
     35void          DrawHistogram       PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
     36int           DrawObjectN         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
     37void          DrawPoints          PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
     38void          ClipLine            PROTO((Graphic *graphic, double x0, double y0, double x1, double y1, double X0, double Y0, double X1, double Y1));
     39void          DrawXErrors         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
     40void          DrawYErrors         PROTO((Graphic *graphic, KapaGraphWidget *graph, Gobjects *objects));
    4141void          DrawTick            PROTO((Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis));
    4242void          AxisTickScale       PROTO((Axis *axis, double *range, double *major, double *minor, int *nsignif));
     
    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));
  • trunk/Ohana/src/kapa2/src/DrawFrame.c

    r39594 r39926  
    1212
    1313  graphic = GetGraphic();
     14
     15  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
    1416
    1517  /* each axis is drawn independently, but ticks and labels are placed according to perpendicular distance. */
     
    3032    dfy = graph[0].axis[i].dfy + 2*dy;
    3133
    32     P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
    33     P *= (1 + 0.25*lweight);
     34    // P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
     35    // P *= (1 + 0.25*lweight);
    3436
    3537    XSetLineAttributes (graphic->display, graphic->gc, lweight, LineSolid, CapNotLast, JoinMiter);
  • trunk/Ohana/src/kapa2/src/DrawObjects.c

    r39594 r39926  
    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
    19 static Graphic *graphic;
     15// XXX this is not thread safe, but that is OK
     16// static Graphic *graphic;
    2017
    2118/* draw all objects for this Graph */
     
    2421  int i;
    2522 
     23  // the functions below use this global value
     24  Graphic *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);
    2829    if (DEBUG) fprintf (stderr, "Npts: %d\n", graph[0].objects[i].Npts);
    29     DrawObjectN (graph, &graph[0].objects[i]);
     30    DrawObjectN (graphic, 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}
    3336
    3437/* Draw a specific object in the graph */
    35 int DrawObjectN (KapaGraphWidget *graph, Gobjects *object) {
     38int DrawObjectN (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    3639 
    3740  static char dot[2] = {2,3};
     
    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:
    91       DrawConnect (graph, object);
    92       break;
    93     case HISTOGRAM:
    94       DrawHistogram (graph, object);
    95       break;
    96     case POINTS:
    97       DrawPoints (graph, object);
     88    case KAPA_PLOT_CONNECT:
     89      DrawConnect (graphic, graph, object);
     90      break;
     91    case KAPA_PLOT_HISTOGRAM:
     92      DrawHistogram (graphic, graph, object);
     93      break;
     94    case KAPA_PLOT_POINTS:
     95    default:
     96      DrawPoints (graphic, graph, object);
    9897      break;
    9998  }
    10099   
    101100  if (object[0].etype & 0x01) {
    102     DrawYErrors (graph, object);
     101    DrawYErrors (graphic, graph, object);
    103102  }
    104103  if (object[0].etype & 0x02) {
    105     DrawXErrors (graph, object);
    106   }
    107 
    108   XSetLineAttributes (graphic->display, graphic->gc, 0, LineSolid, CAPSTYLE, JOINSTYLE);
    109   XSetForeground (graphic->display, graphic->gc, graphic->fore);
     104    DrawXErrors (graphic, graph, object);
     105  }
    110106  return (TRUE);
    111107}
    112108
    113109/******/
    114 void DrawConnect (KapaGraphWidget *graph, Gobjects *object) {
     110void DrawConnect (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    115111 
    116112  int i;
     
    149145    sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
    150146   
    151     ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
     147    ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
    152148    /* DrawLine (sx0, sy0, sx1, sy1); */
    153149    sx0 = sx1; sy0 = sy1;
     
    156152}
    157153
    158 void ClipLine (double x0, double y0, double x1, double y1, double X0, double Y1, double X1, double Y0) {
     154void ClipLine (Graphic *graphic, double x0, double y0, double x1, double y1, double X0, double Y1, double X1, double Y0) {
    159155
    160156  /* skip line segement if both points are beyond box */
     
    212208/* simplify the code abit by finding triplets, watch out for a histogram of 2 points */
    213209# if (1)
    214 void DrawHistogram (KapaGraphWidget *graph, Gobjects *object) {
     210void DrawHistogram (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    215211
    216212  int i;
     
    298294# else
    299295
    300 void DrawHistogram (KapaGraphWidget *graph, Gobjects *object) {
     296void DrawHistogram (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    301297
    302298  int i;
     
    407403
    408404/******/
    409 void DrawPoints (KapaGraphWidget *graph, Gobjects *object) {
     405void DrawPoints (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    410406
    411407  int i;
     
    427423  by = byi + byj;
    428424 
    429   Graphic *graphic = GetGraphic();
    430 
    431   /**** points are scaled by object.z ***/
     425  /**** point sizes are scaled by object.size, colors by object.color ***/
    432426  int scaleSize = (object[0].size < 0);
    433427  int scaleColor = (object[0].color < 0);
     
    437431  x = object[0].x; y = object[0].y; z = object[0].z;
    438432
    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       }
     433  switch (object[0].ptype) {
     434    case KAPA_POINT_BOX_OPEN:   /* open box */
     435      for (i = 0; i < object[0].Npts; i++) {
     436        if (!(finite(x[i]) && finite(y[i]))) continue;
     437        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     438        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     439        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     440            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     441          if (scaleColor) {
     442            if (!finite(z[i])) continue;
     443            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     444            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     445          }
     446          D = scaleSize ? dz*z[i] : ds;
     447          DrawRectangle (sx - D, sy - D, 2*D, 2*D);
     448        }
     449      }
     450      break;
     451    case KAPA_POINT_CROSS: /* cross */
     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 + XCENTER;
     455        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     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          if (scaleColor) {
     459            if (!finite(z[i])) continue;
     460            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     461            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     462          }
     463          D = scaleSize ? dz*z[i] : ds;
     464          DrawLine (sx - D, sy, sx + D + 1, sy);
     465          DrawLine (sx, sy - D, sx, sy + D + 1);
     466        }
     467      }
     468      break;
     469    case KAPA_POINT_X:  /* x */
     470      for (i = 0; i < object[0].Npts; i++) {
     471        if (!(finite(x[i]) && finite(y[i]))) continue;
     472        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     473        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     474        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     475            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     476          if (scaleColor) {
     477            if (!finite(z[i])) continue;
     478            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     479            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     480          }
     481          D = scaleSize ? dz*z[i] : ds;
     482          DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
     483          DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
     484        }
     485      }
     486      break;
     487    case KAPA_POINT_TRIANGLE_SOLID:     /* filled triangle */
     488      for (i = 0; i < object[0].Npts; i++) {
     489        if (!(finite(x[i]) && finite(y[i]))) continue;
     490        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     491        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     492        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     493            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     494          if (scaleColor) {
     495            if (!finite(z[i])) continue;
     496            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     497            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     498          }
     499          D = scaleSize ? dz*z[i] : ds;
     500
     501          XPoint points[4];
     502          points[0].x = sx - D;  points[0].y = sy + 0.58*D; 
     503          points[1].x = sx + D;  points[1].y = sy + 0.58*D; 
     504          points[2].x = sx;      points[2].y = sy - 1.15*D; 
     505          points[3].x = sx - D;  points[3].y = sy + 0.58*D; 
     506          XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
     507        }
     508      }
     509      break;
     510    case KAPA_POINT_TRIANGLE_SOLID_DOWN: /* filled triangle (down) */
     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
     524          XPoint points[4];
     525          points[0].x = sx - D;  points[0].y = sy - 0.58*D; 
     526          points[1].x = sx + D;  points[1].y = sy - 0.58*D; 
     527          points[2].x = sx;      points[2].y = sy + 1.15*D; 
     528          points[3].x = sx - D;  points[3].y = sy - 0.58*D; 
     529          XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
     530        }
     531      }
     532      break;
     533    case KAPA_POINT_TRIANGLE_OPEN:      /* open triangle */
     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 + XCENTER;
     537        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     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            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     544          }
     545          D = scaleSize ? dz*z[i] : ds;
     546          DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
     547          DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
     548          DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
     549        }
     550      }
     551      break;
     552    case KAPA_POINT_TRIANGLE_OPEN_DOWN: /* upside-down open triangle */
     553      for (i = 0; i < object[0].Npts; i++) {
     554        if (!(finite(x[i]) && finite(y[i]))) continue;
     555        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     556        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     557        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     558            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     559          if (scaleColor) {
     560            if (!finite(z[i])) continue;
     561            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     562            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     563          }
     564          D = scaleSize ? dz*z[i] : ds;
     565          DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
     566          DrawLine (sx + D, sy - 0.58*D, sx,     sy + 1.15*D);
     567          DrawLine (sx,     sy + 1.15*D, sx - D, sy - 0.58*D);
     568        }
     569      }
     570      break;
     571    case KAPA_POINT_Y:  /* Y */
     572      for (i = 0; i < object[0].Npts; i++) {
     573        if (!(finite(x[i]) && finite(y[i]))) continue;
     574        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     575        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     576        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     577            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     578          if (scaleColor) {
     579            if (!finite(z[i])) continue;
     580            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     581            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     582          }
     583          D = scaleSize ? dz*z[i] : ds;
     584          DrawLine (sx, sy, sx - D, sy - 0.58*D);
     585          DrawLine (sx, sy, sx + D, sy - 0.58*D);
     586          DrawLine (sx, sy, sx,     sy + 1.15*D);
     587        }
     588      }
     589      break;
     590    case KAPA_POINT_Y_DOWN:     /* upside-down Y */
     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 + XCENTER;
     594        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     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          if (scaleColor) {
     598            if (!finite(z[i])) continue;
     599            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     600            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     601          }
     602          D = scaleSize ? dz*z[i] : ds;
     603          DrawLine (sx, sy, sx - D, sy + 0.58*D);
     604          DrawLine (sx, sy, sx + D, sy + 0.58*D);
     605          DrawLine (sx, sy, sx,     sy - 1.15*D);
     606        }
     607      }
     608      break;
     609    case KAPA_POINT_CIRCLE_OPEN: /* 0 */
     610      for (i = 0; i < object[0].Npts; i++) {
     611        if (!(finite(x[i]) && finite(y[i]))) continue;
     612        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     613        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     614        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     615            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     616          if (scaleColor) {
     617            if (!finite(z[i])) continue;
     618            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     619            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     620          }
     621          D = scaleSize ? dz*z[i] : ds;
     622          DrawCircle (sx, sy, D);
     623        }
     624      }
     625      break;
     626    case KAPA_POINT_CIRCLE_SOLID: /* filled 0 */
     627      for (i = 0; i < object[0].Npts; i++) {
     628        if (!(finite(x[i]) && finite(y[i]))) continue;
     629        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     630        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     631        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     632            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     633          if (scaleColor) {
     634            if (!finite(z[i])) continue;
     635            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     636            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     637          }
     638          D = scaleSize ? dz*z[i] : ds;
     639          FillCircle (sx, sy, D);
     640          DrawCircle (sx, sy, D);
     641        }
     642      }
     643      break;
     644    case KAPA_POINT_PENTAGON:   /* pentagon */
     645      for (i = 0; i < object[0].Npts; i++) {
     646        if (!(finite(x[i]) && finite(y[i]))) continue;
     647        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     648        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     649        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     650            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     651          if (scaleColor) {
     652            if (!finite(z[i])) continue;
     653            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     654            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     655          }
     656          D = scaleSize ? dz*z[i] : ds;
     657          DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
     658          DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
     659          DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
     660          DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
     661          DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
     662        }
     663      }
     664      break;
     665    case KAPA_POINT_HEXAGON:    /* hexagon */
     666      for (i = 0; i < object[0].Npts; i++) {
     667        if (!(finite(x[i]) && finite(y[i]))) continue;
     668        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     669        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     670        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     671            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     672          if (scaleColor) {
     673            if (!finite(z[i])) continue;
     674            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     675            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     676          }
     677          D = scaleSize ? dz*z[i] : ds;
     678          DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
     679          DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     680          DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     681
     682          DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
     683          DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     684          DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     685        }
     686      }
     687      break;
     688    case KAPA_POINT_PAIR_CONNECT: { /* connect pairs of points */
     689      double X0 = graph[0].axis[0].fx;
     690      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     691      double Y0 = graph[0].axis[1].fy;
     692      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     693
     694      for (i = 0; i + 1 < object[0].Npts; i+=2) {
     695        if (!(finite(x[i]) && finite(y[i]))) continue;
     696        sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     697        sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     698        if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
     699        sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
     700        sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
     701        ClipLine (graphic, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
     702      }
     703      break;
    454704    }
    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     }
     705    case KAPA_POINT_BOX_SOLID:  /* filled box */
     706    default:
     707      for (i = 0; i < object[0].Npts; i++) {
     708        if (!(finite(x[i]) && finite(y[i]))) continue;
     709        sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     710        sy = x[i]*myi + y[i]*myj + by + YCENTER;
     711        if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     712            (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     713          if (scaleColor) {
     714            if (!finite(z[i])) continue;
     715            int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     716            XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     717          }
     718          D = scaleSize ? dz*z[i] : ds;
     719          FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
     720        }
     721      }
     722      break;
    745723  }
    746724}
    747725   
    748726/******/
    749 void DrawXErrors (KapaGraphWidget *graph, Gobjects *object) {
     727void DrawXErrors (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    750728 
    751729  int i, bar, dz, ds, D;
     
    800778         (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
    801779    {
    802       ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
     780      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
    803781      if (bar) {
    804782        sx10 = sy1 - sz;
    805783        sx11 = sy1 + sz;
    806         ClipLine (sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
     784        ClipLine (graphic, sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
    807785      }
    808786    }
     
    819797         (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
    820798    {
    821       ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
     799      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
    822800      if (bar) {
    823801        sx10 = sy1 - sz;
    824802        sx11 = sy1 + sz;
    825         ClipLine (sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
     803        ClipLine (graphic, sx1, sx10, sx1, sx11, X0, Y0, X1, Y1);
    826804      }
    827805    }
     
    830808   
    831809/******/
    832 void DrawYErrors (KapaGraphWidget *graph, Gobjects *object) {
     810void DrawYErrors (Graphic *graphic, KapaGraphWidget *graph, Gobjects *object) {
    833811
    834812  int i, bar, dz, ds, D;
     
    883861         (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
    884862    {
    885       ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
     863      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
    886864      if (bar) {
    887865        sx10 = sx1 - sz;
    888866        sx11 = sx1 + sz;
    889         ClipLine (sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
     867        ClipLine (graphic, sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
    890868      }
    891869    }
     
    904882         (sy1 < graph[0].axis[1].fy) && (sy1 > graph[0].axis[1].fy + graph[0].axis[1].dfy)))
    905883    {
    906       ClipLine (sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
     884      ClipLine (graphic, sx0, sy0, sx1, sy1, X0, Y0, X1, Y1);
    907885      if (bar) {
    908886        sx10 = sx1 - sz;
    909887        sx11 = sx1 + sz;
    910         ClipLine (sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
     888        ClipLine (graphic, sx10, sy1, sx11, sy1, X0, Y0, X1, Y1);
    911889      }
    912890    }
  • trunk/Ohana/src/kapa2/src/LoadObject.c

    r31665 r39926  
    102102  if (DEBUG) fprintf (stderr, "loaded %d objects, using object %d\n", graph[0].objects[N].Npts, N);
    103103
    104   if (USE_XWINDOW) DrawObjectN (graph, &graph[0].objects[graph[0].Nobjects-1]);
     104  if (USE_XWINDOW) {
     105    Graphic *graphic = GetGraphic();
     106    DrawObjectN (graphic, graph, &graph[0].objects[graph[0].Nobjects-1]);
     107  }
    105108  FlushDisplay ();
    106109
  • trunk/Ohana/src/kapa2/src/PSFrame.c

    r38986 r39926  
    1111
    1212  graphic = GetGraphic();
     13
     14  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
    1315
    1416  /* each axis is drawn independently */
     
    3032    dfy = -graph[0].axis[i].dfy + 2*dy;
    3133
    32     P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
    33     P *= (1 + 0.25*lweight);
     34    // P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
     35    // P *= (1 + 0.25*lweight);
    3436
    3537    fprintf (f, "%.1f setlinewidth\n", lweight);
  • trunk/Ohana/src/kapa2/src/PSObjects.c

    r38153 r39926  
    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);
  • trunk/Ohana/src/kapa2/src/bDrawFrame.c

    r38986 r39926  
    1111
    1212  // don't need graphic, unlink DrawFrame
     13
     14  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
    1315
    1416  /* each axis is drawn independently */
     
    2830    dfx = graph[0].axis[i].dfx + 2*dx;
    2931    dfy = graph[0].axis[i].dfy + 2*dy;
    30     P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
    31     P *= (1 + 0.25*lweight);
     32
     33    // P = hypot (graph[0].axis[(i+1)%2].dfx, graph[0].axis[(i+1)%2].dfy);
     34    // P *= (1 + 0.25*lweight);
    3235
    3336    bDrawSetStyle (buffer, color, lweight, 0);
  • trunk/Ohana/src/kapa2/src/bDrawObjects.c

    r38153 r39926  
    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);
Note: See TracChangeset for help on using the changeset viewer.